@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,529 @@
1
+ import { Component, Input, ViewChild, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
2
+ import 'jquery.fancytree';
3
+ import * as _ from 'lodash-es';
4
+ import { Subject } from 'rxjs';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services/tree/tree.service";
8
+ import * as i2 from "../../services/editor/editor.service";
9
+ import * as i3 from "../../services/telemetry/telemetry.service";
10
+ import * as i4 from "../../services/helper/helper.service";
11
+ import * as i5 from "../../services/toaster/toaster.service";
12
+ import * as i6 from "../../services/config/config.service";
13
+ import * as i7 from "../../services/dialcode/dialcode.service";
14
+ import * as i8 from "@angular/common";
15
+ import * as i9 from "../../directives/telemetry-interact/telemetry-interact.directive";
16
+ export class FancyTreeComponent {
17
+ constructor(treeService, editorService, telemetryService, helperService, toasterService, cdr, configService, dialcodeService) {
18
+ this.treeService = treeService;
19
+ this.editorService = editorService;
20
+ this.telemetryService = telemetryService;
21
+ this.helperService = helperService;
22
+ this.toasterService = toasterService;
23
+ this.cdr = cdr;
24
+ this.configService = configService;
25
+ this.dialcodeService = dialcodeService;
26
+ this.treeEventEmitter = new EventEmitter();
27
+ this.showLibraryButton = false;
28
+ this.rootMenuTemplate = `<span class="ui dropdown sb-dotted-dropdown" autoclose="itemClick" suidropdown="" tabindex="0">
29
+ <span id="contextMenu" class="p-0 w-auto"><i class="icon ellipsis vertical sb-color-black"></i></span>
30
+ <span id= "contextMenuDropDown" class="menu transition hidden" suidropdownmenu="" style="">
31
+ <div id="addchild" class="item">Add Child</div>
32
+ </span>
33
+ </span>`;
34
+ this.folderMenuTemplate = `<span id= "removeNodeIcon"> <i class="fa fa-trash-o" type="button"></i> </span><span class="ui dropdown sb-dotted-dropdown" autoclose="itemClick" suidropdown="" tabindex="0">
35
+ <span id="contextMenu" class="p-0 w-auto"><i class="icon ellipsis vertical sb-color-black"></i></span>
36
+ <span id= "contextMenuDropDown" class="menu transition hidden" suidropdownmenu="" style="">
37
+ <div id="addsibling" class="item">Add Sibling</div>
38
+ <div id="addchild" class="item">Add Child</div>
39
+ <div id="delete" class="item">Delete</div>
40
+ </span>
41
+ </span>`;
42
+ // tslint:disable-next-line:max-line-length
43
+ this.contentMenuTemplate = `<span id="contextMenu"><span id= "removeNodeIcon" type="content" > <i class="fa fa-trash-o" type="button"></i> </span></span>`;
44
+ this.onComponentDestroy$ = new Subject();
45
+ }
46
+ ngOnInit() {
47
+ this.config = _.cloneDeep(this.editorService.editorConfig.config);
48
+ this.config.mode = _.get(this.config, 'mode').toLowerCase();
49
+ if (!_.has(this.config, 'maxDepth')) { // TODO:: rethink this
50
+ this.config.maxDepth = 4;
51
+ }
52
+ this.initialize();
53
+ this.editorService.bulkUploadStatus$.subscribe(status => {
54
+ this.bulkUploadProcessingStatus = status;
55
+ });
56
+ }
57
+ ngAfterViewInit() {
58
+ this.renderTree(this.getTreeConfig());
59
+ }
60
+ initialize() {
61
+ const data = this.nodes.data;
62
+ this.nodeParentDependentMap = this.editorService.getParentDependentMap(this.nodes.data);
63
+ let treeData;
64
+ if (_.get(this.editorService, 'editorConfig.config.renderTaxonomy') === true && _.isEmpty(_.get(this.nodes, 'data.children'))) {
65
+ this.helperService.addDepthToHierarchy(this.nodes.data.children);
66
+ this.nodes.data.children = this.removeIntermediateLevelsFromFramework(this.nodes.data.children);
67
+ treeData = this.buildTreeFromFramework(this.nodes.data);
68
+ }
69
+ else {
70
+ treeData = this.buildTree(this.nodes.data);
71
+ }
72
+ this.editorService.treeData = treeData;
73
+ this.rootNode = [{
74
+ id: data.identifier || uuidv4(),
75
+ title: data.name,
76
+ tooltip: data.name,
77
+ ...(data.contentType && { contentType: data.contentType }),
78
+ primaryCategory: data.primaryCategory,
79
+ objectType: data.objectType,
80
+ metadata: _.omit(data, ['children', 'collections']),
81
+ folder: true,
82
+ children: treeData,
83
+ root: true,
84
+ icon: _.get(this.config, 'iconClass')
85
+ }];
86
+ }
87
+ buildTreeFromFramework(data, tree, level) {
88
+ tree = tree || [];
89
+ if (data.children) {
90
+ data.children = _.sortBy(data.children, ['index']);
91
+ }
92
+ _.forEach(data.children, (child) => {
93
+ const childTree = [];
94
+ tree.push({
95
+ id: uuidv4(),
96
+ title: child.name,
97
+ tooltip: child.name,
98
+ primaryCategory: child.primaryCategory,
99
+ metadata: _.omit(child, ['children', 'collections']),
100
+ folder: true,
101
+ children: childTree,
102
+ root: false,
103
+ icon: 'fa fa-folder-o'
104
+ });
105
+ if (child.children) {
106
+ this.buildTreeFromFramework(child, childTree);
107
+ }
108
+ });
109
+ return tree;
110
+ }
111
+ removeIntermediateLevelsFromFramework(data, parentData) {
112
+ const tree = [];
113
+ _.forEach(data, child => {
114
+ if (child.depth === 0 || child.depth === this.helperService.treeDepth) {
115
+ const node = {
116
+ ..._.omit(child, ['children']),
117
+ ...(child.children && { children: this.removeIntermediateLevelsFromFramework(child.children, child) })
118
+ };
119
+ tree.push(node);
120
+ }
121
+ else if ((child.depth !== 0 || child.depth !== this.helperService.treeDepth)) {
122
+ parentData.children = _.filter(parentData.children, item => (item.depth === 0 || item.depth === this.helperService.treeDepth));
123
+ if (child.children && child.children.length > 0) {
124
+ const children = this.removeIntermediateLevelsFromFramework(child.children, child);
125
+ parentData.children = _.concat(parentData.children, children);
126
+ }
127
+ else {
128
+ parentData.children = _.concat(parentData.children, child.children);
129
+ }
130
+ }
131
+ });
132
+ return !_.isEmpty(tree) ? tree : _.flatten(parentData.children);
133
+ }
134
+ buildTree(data, tree, level) {
135
+ tree = tree || [];
136
+ if (data.children) {
137
+ data.children = _.sortBy(data.children, ['index']);
138
+ }
139
+ data.level = level ? (level + 1) : 1;
140
+ _.forEach(data.children, (child) => {
141
+ const childTree = [];
142
+ tree.push({
143
+ id: child.identifier || uuidv4(),
144
+ title: child.name,
145
+ tooltip: child.name,
146
+ ...(child.contentType && { contentType: child.contentType }),
147
+ primaryCategory: child.primaryCategory,
148
+ objectType: child.objectType,
149
+ metadata: _.omit(child, ['children', 'collections']),
150
+ folder: this.isFolder(child),
151
+ children: childTree,
152
+ root: false,
153
+ icon: this.getIconClass(child, data.level)
154
+ });
155
+ if (child.visibility === 'Parent') {
156
+ this.buildTree(child, childTree, data.level);
157
+ }
158
+ });
159
+ return tree;
160
+ }
161
+ isFolder(child) {
162
+ if (this.isContent(child)) {
163
+ return false;
164
+ }
165
+ else {
166
+ return child.visibility === 'Parent' ? true : false;
167
+ }
168
+ }
169
+ getIconClass(child, level) {
170
+ if (this.isContent(child)) {
171
+ return 'fa fa-file-o';
172
+ }
173
+ else if (child.visibility === 'Parent') {
174
+ return _.get(this.config, `hierarchy.level.${level}.iconClass`) || 'fa fa-folder-o';
175
+ }
176
+ else {
177
+ return 'fa fa-file-o';
178
+ }
179
+ }
180
+ isContent(child) {
181
+ // tslint:disable-next-line:max-line-length
182
+ return (_.get(this.config, 'objectType') === 'QuestionSet' && child.objectType === 'Question');
183
+ }
184
+ renderTree(options) {
185
+ options = { ...options, ...this.options };
186
+ $(this.tree.nativeElement).fancytree(options);
187
+ this.treeService.setTreeElement(this.tree.nativeElement);
188
+ if (this.options.showConnectors) {
189
+ $('.fancytree-container').addClass('fancytree-connectors');
190
+ }
191
+ setTimeout(() => {
192
+ this.treeService.reloadTree(this.rootNode);
193
+ this.treeService.setActiveNode();
194
+ const rootNode = this.treeService.getFirstChild();
195
+ rootNode.setExpanded(true);
196
+ this.eachNodeActionButton(rootNode);
197
+ this.dialcodeService.readExistingQrCode();
198
+ });
199
+ if (_.get(this.editorService, 'editorConfig.config.renderTaxonomy') === true && _.isEmpty(_.get(this.nodes, 'data.children'))) {
200
+ _.forEach(this.rootNode[0]?.children, (child) => {
201
+ this.treeService.updateTreeNodeMetadata(child.metadata, child.id, child.primaryCategory, child.objectType);
202
+ _.forEach(child.children, (el) => {
203
+ this.treeService.updateTreeNodeMetadata(el.metadata, el.id, el.primaryCategory, el.objectType);
204
+ });
205
+ });
206
+ }
207
+ }
208
+ getTreeConfig() {
209
+ const options = {
210
+ extensions: ['glyph', 'dnd5'],
211
+ clickFolderMode: 3,
212
+ source: this.rootNode,
213
+ escapeTitles: true,
214
+ glyph: {
215
+ preset: 'awesome4',
216
+ map: {
217
+ folder: 'icon folder sb-fancyTree-icon',
218
+ folderOpen: 'icon folder outline sb-fancyTree-icon'
219
+ }
220
+ },
221
+ dnd5: {
222
+ autoExpandMS: 400,
223
+ // focusOnClick: true,
224
+ preventVoidMoves: true,
225
+ preventRecursion: true,
226
+ dragStart: (node, data) => {
227
+ /** This function MUST be defined to enable dragging for the tree.
228
+ * Return false to cancel dragging of node.
229
+ */
230
+ const draggable = _.get(this.config, 'mode') === 'edit' ? true : false;
231
+ return draggable;
232
+ },
233
+ dragEnter: (node, data) => {
234
+ /** data.otherNode may be null for non-fancytree droppables.
235
+ * Return false to disallow dropping on node. In this case
236
+ * dragOver and dragLeave are not called.
237
+ * Return 'over', 'before, or 'after' to force a hitMode.
238
+ * Return ['before', 'after'] to restrict available hitModes.
239
+ * Any other return value will calc the hitMode from the cursor position.
240
+ */
241
+ // Prevent dropping a parent below another parent (only sort
242
+ // nodes under the same parent)
243
+ /* if(node.parent !== data.otherNode.parent){
244
+ return false;
245
+ }
246
+ // Don't allow dropping *over* a node (would create a child)
247
+ return ["before", "after"];
248
+ */
249
+ return true;
250
+ },
251
+ dragDrop: (node, data) => {
252
+ /** This function MUST be defined to enable dropping of items on
253
+ * the tree.
254
+ */
255
+ // data.otherNode.moveTo(node, data.hitMode);
256
+ return this.dragDrop(node, data);
257
+ },
258
+ filter: {
259
+ autoApply: true,
260
+ autoExpand: false,
261
+ counter: true,
262
+ fuzzy: false,
263
+ hideExpandedCounter: true,
264
+ hideExpanders: false,
265
+ highlight: true,
266
+ leavesOnly: false,
267
+ nodata: true,
268
+ mode: 'dimm'
269
+ }
270
+ },
271
+ init: (event, data) => { },
272
+ click: (event, data) => {
273
+ this.tree.nativeElement.click();
274
+ this.telemetryService.interact({ edata: this.getTelemetryInteractEdata() });
275
+ return true;
276
+ },
277
+ activate: (event, data) => {
278
+ this.treeEventEmitter.emit({ type: 'nodeSelect', data: data.node });
279
+ setTimeout(() => {
280
+ this.attachContextMenu(data.node, true);
281
+ this.eachNodeActionButton(data.node);
282
+ }, 10);
283
+ },
284
+ renderNode: (event, data) => {
285
+ const node = data.node;
286
+ const $nodeSpan = $(node.span);
287
+ // check if span of node already rendered
288
+ if (!$nodeSpan.data('rendered')) {
289
+ this.attachContextMenu(node);
290
+ // span rendered
291
+ $nodeSpan.data('rendered', true);
292
+ }
293
+ }
294
+ };
295
+ return options;
296
+ }
297
+ eachNodeActionButton(node) {
298
+ this.visibility = {};
299
+ if (this.bulkUploadProcessingStatus) {
300
+ this.visibility.addChild = false;
301
+ this.visibility.addSibling = false;
302
+ this.visibility.addFromLibrary = false;
303
+ this.visibility.addQuestionFromLibrary = false;
304
+ this.visibility.createNew = false;
305
+ }
306
+ else {
307
+ const nodeLevel = node.getLevel() - 1;
308
+ this.visibility.addChild = ((node.folder === false) || (nodeLevel >= this.config.maxDepth)) ? false : true;
309
+ // tslint:disable-next-line:max-line-length
310
+ this.visibility.addSibling = ((node.folder === true) && (!node.data.root) && !((node.getLevel() - 1) > this.config.maxDepth)) ? true : false;
311
+ if (nodeLevel === 0) {
312
+ this.visibility.addFromLibrary = _.isEmpty(_.get(this.config, 'children')) || _.get(this.config, 'enableQuestionCreation') === false ? false : true;
313
+ this.visibility.createNew = _.isEmpty(_.get(this.config, 'children')) || _.get(this.config, 'enableQuestionCreation') === false ? false : true;
314
+ this.visibility.addQuestionFromLibrary = !_.isEmpty(_.get(this.config, 'children')) && _.get(this.config, 'enableAddFromLibrary') === true ? true : false;
315
+ }
316
+ else {
317
+ const hierarchylevelData = this.config.hierarchy[`level${nodeLevel}`];
318
+ // tslint:disable-next-line:max-line-length
319
+ this.visibility.addFromLibrary = ((node.folder === false) || _.isEmpty(_.get(hierarchylevelData, 'children')) || _.get(this.config, 'enableQuestionCreation') === false) ? false : true;
320
+ // tslint:disable-next-line:max-line-length
321
+ this.visibility.createNew = ((node.folder === false) || _.isEmpty(_.get(hierarchylevelData, 'children')) || _.get(this.config, 'enableQuestionCreation') === false) ? false : true;
322
+ this.visibility.addQuestionFromLibrary = ((node.folder === true) && !_.isEmpty(_.get(hierarchylevelData, 'children')) && _.get(this.config, 'enableAddFromLibrary') === true) ? true : false;
323
+ }
324
+ }
325
+ if (_.get(this.editorService, 'editorConfig.config.renderTaxonomy') === true) {
326
+ this.visibility.addChild = false;
327
+ this.visibility.addSibling = false;
328
+ }
329
+ this.cdr.detectChanges();
330
+ }
331
+ addChild() {
332
+ this.telemetryService.interact({ edata: this.getTelemetryInteractEdata('add_child') });
333
+ const tree = $(this.tree.nativeElement).fancytree('getTree');
334
+ const nodeConfig = this.config.hierarchy[tree.getActiveNode().getLevel()];
335
+ const childrenTypes = _.get(nodeConfig, 'children.Content');
336
+ if ((((tree.getActiveNode().getLevel() - 1) >= this.config.maxDepth))) {
337
+ return this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.007'));
338
+ }
339
+ this.treeService.addNode('child');
340
+ }
341
+ addSibling() {
342
+ this.telemetryService.interact({ edata: this.getTelemetryInteractEdata('add_sibling') });
343
+ const tree = $(this.tree.nativeElement).fancytree('getTree');
344
+ const node = tree.getActiveNode();
345
+ if (!node.data.root) {
346
+ this.treeService.addNode('sibling');
347
+ }
348
+ else {
349
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.007'));
350
+ }
351
+ }
352
+ getActiveNode() {
353
+ return $(this.tree.nativeElement).fancytree('getTree').getActiveNode();
354
+ }
355
+ attachContextMenu(node, activeNode) {
356
+ if (_.get(this.config, 'mode') !== 'edit' || (node.data.root === true && _.isEmpty(this.config.hierarchy))) {
357
+ return;
358
+ }
359
+ const $nodeSpan = $(node.span);
360
+ // tslint:disable-next-line:max-line-length // TODO:: (node.data.contentType === 'CourseUnit') check this condition
361
+ const menuTemplate = node.data.root === true ? this.rootMenuTemplate : (node.data.root === false && node.folder === true ? this.folderMenuTemplate : this.contentMenuTemplate);
362
+ const iconsButton = $(menuTemplate);
363
+ if ((node.getLevel() - 1) >= this.config.maxDepth) {
364
+ iconsButton.find('#addchild').remove();
365
+ }
366
+ let contextMenu = $($nodeSpan[0]).find(`#contextMenu`);
367
+ if (!contextMenu.length) {
368
+ $nodeSpan.append(iconsButton);
369
+ if (!activeNode) {
370
+ iconsButton.hide();
371
+ }
372
+ $nodeSpan[0].onmouseover = () => {
373
+ iconsButton.show();
374
+ };
375
+ $nodeSpan[0].onmouseout = () => {
376
+ iconsButton.hide();
377
+ };
378
+ contextMenu = $($nodeSpan[0]).find(`#contextMenu`);
379
+ contextMenu.on('click', (event) => {
380
+ this.treeService.closePrevOpenedDropDown();
381
+ setTimeout(() => {
382
+ const nSpan = $(this.getActiveNode().span);
383
+ const dropDownElement = $(nSpan[0]).find(`#contextMenuDropDown`);
384
+ dropDownElement.removeClass('hidden');
385
+ dropDownElement.addClass('visible');
386
+ _.forEach(_.get(_.first(dropDownElement), 'children'), item => {
387
+ item.addEventListener('click', (ev) => {
388
+ this.treeService.closePrevOpenedDropDown();
389
+ this.handleActionButtons(ev.currentTarget);
390
+ ev.stopPropagation();
391
+ });
392
+ });
393
+ }, 100);
394
+ // event.stopPropagation();
395
+ });
396
+ $($nodeSpan[0]).find(`#removeNodeIcon`).on('click', (event) => {
397
+ const isContent = event.currentTarget.getAttribute('type') && event.currentTarget.getAttribute('type') === 'content';
398
+ this.removeNode(isContent);
399
+ });
400
+ }
401
+ }
402
+ dropNode(targetNode, currentNode) {
403
+ let dropAllowed;
404
+ dropAllowed = true;
405
+ // tslint:disable-next-line:max-line-length
406
+ if (currentNode.otherNode.getLevel() === targetNode.getLevel() && currentNode.otherNode.folder === true && currentNode.hitMode !== 'over') {
407
+ dropAllowed = true;
408
+ // tslint:disable-next-line:max-line-length
409
+ }
410
+ else if (currentNode.otherNode.folder === true && (this.maxTreeDepth(currentNode.otherNode) + (targetNode.getLevel() - 1)) > _.get(this.config, 'maxDepth')) {
411
+ return this.dropNotAllowed();
412
+ }
413
+ else if (currentNode.otherNode.folder === false && !this.checkContentAddition(targetNode, currentNode)) {
414
+ dropAllowed = false;
415
+ }
416
+ if (dropAllowed) {
417
+ currentNode.otherNode.moveTo(targetNode, currentNode.hitMode);
418
+ this.treeService.nextTreeStatus('reorder');
419
+ return true;
420
+ }
421
+ else {
422
+ this.toasterService.warning(`${currentNode.otherNode.title} cannot be added to ${currentNode.node.title}`);
423
+ return false;
424
+ }
425
+ }
426
+ dragDrop(node, data) {
427
+ if ((data.hitMode === 'before' || data.hitMode === 'after' || data.hitMode === 'over') && data.node.data.root) {
428
+ return this.dropNotAllowed();
429
+ }
430
+ if (_.has(this.config, 'maxDepth')) {
431
+ return this.dropNode(node, data);
432
+ }
433
+ }
434
+ dropNotAllowed() {
435
+ this.toasterService.warning(_.get(this.configService, 'labelConfig.messages.error.007'));
436
+ return false;
437
+ }
438
+ maxTreeDepth(root) {
439
+ const buffer = [{ node: root, depth: 1 }];
440
+ let current = buffer.pop();
441
+ let max = 0;
442
+ while (current && current.node) {
443
+ // Find all children of this node.
444
+ _.forEach(current.node.children, (child) => {
445
+ buffer.push({ node: child, depth: current.depth + 1 });
446
+ });
447
+ if (current.depth > max) {
448
+ max = current.depth;
449
+ }
450
+ current = buffer.pop();
451
+ }
452
+ return max;
453
+ }
454
+ checkContentAddition(targetNode, contentNode) {
455
+ if (targetNode.folder === false && (contentNode.hitMode === 'before' || contentNode.hitMode === 'after')) {
456
+ return true;
457
+ }
458
+ if (targetNode.folder === false && contentNode.hitMode === 'over') {
459
+ return false;
460
+ }
461
+ const nodeConfig = this.config.hierarchy[`level${targetNode.getLevel() - 1}`];
462
+ const contentPrimaryCategories = _.flatMap(_.get(nodeConfig, 'children'));
463
+ if (!_.isEmpty(contentPrimaryCategories)) {
464
+ return _.includes(contentPrimaryCategories, _.get(contentNode, 'otherNode.data.metadata.primaryCategory')) ? true : false;
465
+ }
466
+ return false;
467
+ }
468
+ removeNode(isContent) {
469
+ this.treeEventEmitter.emit({ type: 'deleteNode', isContent });
470
+ this.telemetryService.interact({ edata: this.getTelemetryInteractEdata('delete') });
471
+ }
472
+ handleActionButtons(el) {
473
+ console.log('action buttons -------->', el.id);
474
+ switch (el.id) {
475
+ case 'edit':
476
+ break;
477
+ case 'delete':
478
+ this.removeNode();
479
+ break;
480
+ case 'addsibling':
481
+ this.addSibling();
482
+ break;
483
+ case 'addchild':
484
+ this.addChild();
485
+ break;
486
+ case 'addresource':
487
+ break;
488
+ }
489
+ }
490
+ addFromLibrary() {
491
+ this.editorService.emitshowLibraryPageEvent('showLibraryPage');
492
+ }
493
+ getTelemetryInteractEdata(id) {
494
+ return {
495
+ id: id || 'collection-toc',
496
+ type: 'click',
497
+ subtype: 'launch',
498
+ pageid: this.telemetryService.telemetryPageId,
499
+ extra: {
500
+ values: [_.get(this.getActiveNode(), 'data')]
501
+ }
502
+ };
503
+ }
504
+ createNewContent() {
505
+ this.treeEventEmitter.emit({ type: 'createNewContent' });
506
+ }
507
+ ngOnDestroy() {
508
+ this.onComponentDestroy$.next();
509
+ this.onComponentDestroy$.complete();
510
+ }
511
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FancyTreeComponent, deps: [{ token: i1.TreeService }, { token: i2.EditorService }, { token: i3.EditorTelemetryService }, { token: i4.HelperService }, { token: i5.ToasterService }, { token: i0.ChangeDetectorRef }, { token: i6.ConfigService }, { token: i7.DialcodeService }], target: i0.ɵɵFactoryTarget.Component }); }
512
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FancyTreeComponent, selector: "lib-fancy-tree", inputs: { nodes: "nodes", options: "options", buttonLoaders: "buttonLoaders" }, outputs: { treeEventEmitter: "treeEventEmitter" }, viewQueries: [{ propertyName: "tree", first: true, predicate: ["fancyTree"], descendants: true }], ngImport: i0, template: "<div #fancyTree></div>\n<div class=\"sb-fixed-with-whitebg pr-20 d-flex flex-jc-space-between\" *ngIf=\"config && config.mode === 'edit'\">\n <div class=\"d-flex w-25\">\n <div class=\"sb-btn-cover\">\n <button [ngClass]=\"visibility?.addSibling ? '' : 'sb-disabled'\" (click)=\"addSibling();\"\n class=\"sb-btn sb-btn-outline-primary sb-btn-normal sb-btn-radius p-0 b-none\"><i aria-hidden=\"true\" class=\"icon plus\"></i>\n {{configService.labelConfig?.button_labels?.add_sibling_btn_label}} </button>\n </div>\n <div class=\"sb-btn-cover\">\n <button [ngClass]=\"visibility?.addChild ? '' : 'sb-disabled'\" (click)=\"addChild();\"\n class=\"sb-btn sb-btn-outline-primary sb-btn-normal sb-btn-radius b-none p-0\"><i class=\"icon plus\"></i>\n {{configService.labelConfig?.button_labels?.add_child_btn_label}} </button>\n </div>\n </div>\n <button *ngIf=\"config.objectType !== 'QuestionSet'\" (click)=\"addFromLibrary();\"\n [disabled]=\"!visibility?.addFromLibrary\"\n [ngClass]=\"[!visibility?.addFromLibrary ? 'sb-btn-outline-disabled' : '', (visibility?.addFromLibrary && buttonLoaders?.addFromLibraryButtonLoader) ? 'sb-btn-loading-spinner sb-btn-outline-disabled': '']\"\n class=\"sb-btn sb-btn-outline-primary sb-btn-normal mt-10 mr-30\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_from_library','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon plus\" aria-hidden=\"true\" *ngIf=\"!buttonLoaders?.addFromLibraryButtonLoader\"></i>\n <div class=\"sb-loading-spinner\" *ngIf=\"buttonLoaders?.addFromLibraryButtonLoader\" role=\"status\" aria-hidden=\"true\">\n </div>\n {{configService.labelConfig?.button_labels?.add_from_library_btn_label}}\n </button>\n <button *ngIf=\"config.objectType === 'QuestionSet'\" [disabled]=\"!visibility?.createNew\"\n [ngClass]=\"[!visibility?.createNew ? 'sb-btn-outline-disabled' : '', (visibility?.createNew && buttonLoaders?.addFromLibraryButtonLoader) ? 'sb-btn-loading-spinner sb-btn-outline-disabled': '']\"\n type=\"button\" class=\"sb-btn sb-btn-normal sb-btn-primary mt-10 mr-30\" (click)=\"createNewContent()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('create_new','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon plus\" *ngIf=\"!buttonLoaders?.addFromLibraryButtonLoader\"></i>\n <div class=\"sb-loading-spinner\" *ngIf=\"buttonLoaders?.addFromLibraryButtonLoader\" role=\"status\" aria-hidden=\"true\">\n </div>\n {{configService.labelConfig?.button_labels?.create_new_btn_label}}\n </button>\n</div>", styles: [".sb-collectionTree-fancyTreelist ul{padding:0!important}.sb-collectionTree-fancyTreelist .ui-fancytree{margin-bottom:1rem!important}.sb-collectionTree-fancyTreelist .ui-fancytree:before{background:none!important}.sb-collectionTree-fancyTreelist .ui-fancytree ul:before{background:none!important}.sb-collectionTree-fancyTreelist .ui-fancytree .fancytree-folder .fancytree-title{color:var(--primary-color)!important;font-size:.9286rem!important;font-weight:700!important;padding-left:5px;width:inherit!important}.sb-collectionTree-fancyTreelist .ui-fancytree .fancytree-folder .highlightNode{color:red!important}.sb-collectionTree-fancyTreelist .ui-fancytree .fancytree-folder .highlightNode:before{color:red!important}.sb-collectionTree-fancyTreelist .ui-fancytree li{padding:0;margin:0 0 1px}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-ico-c{padding-left:5px!important}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-expanded{padding:15px 33px;border:1px solid transparent;background-color:#fff}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-active{border:1px solid #d0e0f3;background-color:var(--primary-0);padding:15px 33px;border-top:none}.sb-collectionTree-fancyTreelist .ui-fancytree li:last-child:after{display:none}.sb-collectionTree-fancyTreelist .ui-fancytree li ul{padding-top:1px}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li{list-style-type:none}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-custom-icon:before{color:var(--primary-color)!important;margin-top:2px;float:left;margin-left:6px;font-size:16px}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-custom-icon:last-child:after{display:none}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node{padding:6px 6px 8px 5px;margin-left:45px;border:1px solid transparent}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node.fancytree-active,.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node.fancytree-focused,.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node:hover{border:1px solid #d0e0f3;background-color:var(--primary-0);border-right:0}.sb-collectionTree-fancyTreelist .ui-fancytree li:before{background:none!important}.sb-collectionTree-fancyTreelist .ui-fancytree li .sb-fancyTree-icon{color:var(--gray-300)!important}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-custom-icon:before{color:var(--primary-color)!important;margin-left:5px}.sb-collectionTree-fancyTreelist .ui-fancytree .fa-caret-down{margin-top:6px;display:block;width:10px;padding-left:2px}.sb-collectionTree-fancyTreelist .ui-fancytree .fa-caret-right{margin-top:6px;display:block;width:10px;padding-left:6px}.sb-collectionTree-fancyTreelist .ui-fancytree{padding-right:.785rem;margin:0;padding:0;list-style-type:none}.sb-fixed-with-whitebg{position:fixed;width:100%;border-top:1px solid #ddd;left:0;right:0;bottom:0;background-color:#fff;z-index:99999;padding:0!important}.sb-fixed-with-whitebg .sb-btn-cover{padding:.5rem;border-right:solid 1px #ccc;width:50%;text-align:center}.sb-fixed-with-whitebg .sb-btn-cover .sb-btn:hover{background:none!important;color:var(--primary-400)}.sb-dotted-dropdown{position:absolute!important;right:6px;padding-left:33px}.sb-dotted-dropdown .menu{right:0!important;left:inherit!important}.sb-dotted-dropdown .menu .item{font-size:.785rem!important}.eight.bg-white{border-left:solid 1px var(--gray-100);padding-bottom:4.5rem!important}.b-none{border:none!important}.w-25{width:25.1%;max-width:25.1%}#removeNodeIcon{padding-right:24px}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }], encapsulation: i0.ViewEncapsulation.None }); }
513
+ }
514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FancyTreeComponent, decorators: [{
515
+ type: Component,
516
+ args: [{ selector: 'lib-fancy-tree', encapsulation: ViewEncapsulation.None, template: "<div #fancyTree></div>\n<div class=\"sb-fixed-with-whitebg pr-20 d-flex flex-jc-space-between\" *ngIf=\"config && config.mode === 'edit'\">\n <div class=\"d-flex w-25\">\n <div class=\"sb-btn-cover\">\n <button [ngClass]=\"visibility?.addSibling ? '' : 'sb-disabled'\" (click)=\"addSibling();\"\n class=\"sb-btn sb-btn-outline-primary sb-btn-normal sb-btn-radius p-0 b-none\"><i aria-hidden=\"true\" class=\"icon plus\"></i>\n {{configService.labelConfig?.button_labels?.add_sibling_btn_label}} </button>\n </div>\n <div class=\"sb-btn-cover\">\n <button [ngClass]=\"visibility?.addChild ? '' : 'sb-disabled'\" (click)=\"addChild();\"\n class=\"sb-btn sb-btn-outline-primary sb-btn-normal sb-btn-radius b-none p-0\"><i class=\"icon plus\"></i>\n {{configService.labelConfig?.button_labels?.add_child_btn_label}} </button>\n </div>\n </div>\n <button *ngIf=\"config.objectType !== 'QuestionSet'\" (click)=\"addFromLibrary();\"\n [disabled]=\"!visibility?.addFromLibrary\"\n [ngClass]=\"[!visibility?.addFromLibrary ? 'sb-btn-outline-disabled' : '', (visibility?.addFromLibrary && buttonLoaders?.addFromLibraryButtonLoader) ? 'sb-btn-loading-spinner sb-btn-outline-disabled': '']\"\n class=\"sb-btn sb-btn-outline-primary sb-btn-normal mt-10 mr-30\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_from_library','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon plus\" aria-hidden=\"true\" *ngIf=\"!buttonLoaders?.addFromLibraryButtonLoader\"></i>\n <div class=\"sb-loading-spinner\" *ngIf=\"buttonLoaders?.addFromLibraryButtonLoader\" role=\"status\" aria-hidden=\"true\">\n </div>\n {{configService.labelConfig?.button_labels?.add_from_library_btn_label}}\n </button>\n <button *ngIf=\"config.objectType === 'QuestionSet'\" [disabled]=\"!visibility?.createNew\"\n [ngClass]=\"[!visibility?.createNew ? 'sb-btn-outline-disabled' : '', (visibility?.createNew && buttonLoaders?.addFromLibraryButtonLoader) ? 'sb-btn-loading-spinner sb-btn-outline-disabled': '']\"\n type=\"button\" class=\"sb-btn sb-btn-normal sb-btn-primary mt-10 mr-30\" (click)=\"createNewContent()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('create_new','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon plus\" *ngIf=\"!buttonLoaders?.addFromLibraryButtonLoader\"></i>\n <div class=\"sb-loading-spinner\" *ngIf=\"buttonLoaders?.addFromLibraryButtonLoader\" role=\"status\" aria-hidden=\"true\">\n </div>\n {{configService.labelConfig?.button_labels?.create_new_btn_label}}\n </button>\n</div>", styles: [".sb-collectionTree-fancyTreelist ul{padding:0!important}.sb-collectionTree-fancyTreelist .ui-fancytree{margin-bottom:1rem!important}.sb-collectionTree-fancyTreelist .ui-fancytree:before{background:none!important}.sb-collectionTree-fancyTreelist .ui-fancytree ul:before{background:none!important}.sb-collectionTree-fancyTreelist .ui-fancytree .fancytree-folder .fancytree-title{color:var(--primary-color)!important;font-size:.9286rem!important;font-weight:700!important;padding-left:5px;width:inherit!important}.sb-collectionTree-fancyTreelist .ui-fancytree .fancytree-folder .highlightNode{color:red!important}.sb-collectionTree-fancyTreelist .ui-fancytree .fancytree-folder .highlightNode:before{color:red!important}.sb-collectionTree-fancyTreelist .ui-fancytree li{padding:0;margin:0 0 1px}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-ico-c{padding-left:5px!important}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-expanded{padding:15px 33px;border:1px solid transparent;background-color:#fff}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-active{border:1px solid #d0e0f3;background-color:var(--primary-0);padding:15px 33px;border-top:none}.sb-collectionTree-fancyTreelist .ui-fancytree li:last-child:after{display:none}.sb-collectionTree-fancyTreelist .ui-fancytree li ul{padding-top:1px}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li{list-style-type:none}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-custom-icon:before{color:var(--primary-color)!important;margin-top:2px;float:left;margin-left:6px;font-size:16px}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-custom-icon:last-child:after{display:none}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node{padding:6px 6px 8px 5px;margin-left:45px;border:1px solid transparent}.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node.fancytree-active,.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node.fancytree-focused,.sb-collectionTree-fancyTreelist .ui-fancytree li ul li .fancytree-node:hover{border:1px solid #d0e0f3;background-color:var(--primary-0);border-right:0}.sb-collectionTree-fancyTreelist .ui-fancytree li:before{background:none!important}.sb-collectionTree-fancyTreelist .ui-fancytree li .sb-fancyTree-icon{color:var(--gray-300)!important}.sb-collectionTree-fancyTreelist .ui-fancytree li .fancytree-custom-icon:before{color:var(--primary-color)!important;margin-left:5px}.sb-collectionTree-fancyTreelist .ui-fancytree .fa-caret-down{margin-top:6px;display:block;width:10px;padding-left:2px}.sb-collectionTree-fancyTreelist .ui-fancytree .fa-caret-right{margin-top:6px;display:block;width:10px;padding-left:6px}.sb-collectionTree-fancyTreelist .ui-fancytree{padding-right:.785rem;margin:0;padding:0;list-style-type:none}.sb-fixed-with-whitebg{position:fixed;width:100%;border-top:1px solid #ddd;left:0;right:0;bottom:0;background-color:#fff;z-index:99999;padding:0!important}.sb-fixed-with-whitebg .sb-btn-cover{padding:.5rem;border-right:solid 1px #ccc;width:50%;text-align:center}.sb-fixed-with-whitebg .sb-btn-cover .sb-btn:hover{background:none!important;color:var(--primary-400)}.sb-dotted-dropdown{position:absolute!important;right:6px;padding-left:33px}.sb-dotted-dropdown .menu{right:0!important;left:inherit!important}.sb-dotted-dropdown .menu .item{font-size:.785rem!important}.eight.bg-white{border-left:solid 1px var(--gray-100);padding-bottom:4.5rem!important}.b-none{border:none!important}.w-25{width:25.1%;max-width:25.1%}#removeNodeIcon{padding-right:24px}\n"] }]
517
+ }], ctorParameters: function () { return [{ type: i1.TreeService }, { type: i2.EditorService }, { type: i3.EditorTelemetryService }, { type: i4.HelperService }, { type: i5.ToasterService }, { type: i0.ChangeDetectorRef }, { type: i6.ConfigService }, { type: i7.DialcodeService }]; }, propDecorators: { tree: [{
518
+ type: ViewChild,
519
+ args: ['fancyTree']
520
+ }], nodes: [{
521
+ type: Input
522
+ }], options: [{
523
+ type: Input
524
+ }], buttonLoaders: [{
525
+ type: Input
526
+ }], treeEventEmitter: [{
527
+ type: Output
528
+ }] } });
529
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFuY3ktdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy9mYW5jeS10cmVlL2ZhbmN5LXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvZmFuY3ktdHJlZS9mYW5jeS10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQWlCLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLFlBQVksRUFDekQsaUJBQWlCLEVBQ3JDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFVL0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFVcEMsTUFBTSxPQUFPLGtCQUFrQjtJQStCN0IsWUFBbUIsV0FBd0IsRUFBVSxhQUE0QixFQUM5RCxnQkFBd0MsRUFBVSxhQUE0QixFQUM3RSxjQUE4QixFQUFVLEdBQXNCLEVBQy9ELGFBQTRCLEVBQVUsZUFBZ0M7UUFIdEUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM5RCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXdCO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDN0UsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDL0Qsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxvQkFBZSxH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TCxFQUFFLEVBQUUsRUFBRSxJQUFJLGdCQUFnQjtZQUMxQixJQUFJLEVBQUUsT0FBTztZQUNiLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZTtZQUM3QyxLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDOUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxDQUFDOytHQWhoQlUsa0JBQWtCO21HQUFsQixrQkFBa0IsNFJDMUIvQiw0cEZBa0NNOzs0RkRSTyxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUk7c1RBR04sSUFBSTtzQkFBbEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNOLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixLQUFLO2dCQUNXLGdCQUFnQjtzQkFBaEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgQWZ0ZXJWaWV3SW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsXG4gIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgJ2pxdWVyeS5mYW5jeXRyZWUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgVHJlZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmVlL3RyZWUuc2VydmljZSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWRpdG9yL2VkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9oZWxwZXIvaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RlbGVtZXRyeS90ZWxlbWV0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RvYXN0ZXIvdG9hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgIERpYWxjb2RlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxjb2RlL2RpYWxjb2RlLnNlcnZpY2UnO1xuXG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1mYW5jeS10cmVlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZhbmN5LXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mYW5jeS10cmVlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEZhbmN5VHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZmFuY3lUcmVlJykgcHVibGljIHRyZWU6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIHB1YmxpYyBub2RlczogYW55O1xuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogYW55O1xuICBASW5wdXQoICkgYnV0dG9uTG9hZGVyczogYW55O1xuICBAT3V0cHV0KCkgcHVibGljIHRyZWVFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgY29uZmlnOiBhbnk7XG4gIHB1YmxpYyBzaG93VHJlZTogYm9vbGVhbjtcbiAgcHVibGljIHZpc2liaWxpdHk6IGFueTtcbiAgcHVibGljIHNob3dBZGRDaGlsZEJ1dHRvbjogYm9vbGVhbjtcbiAgcHVibGljIHNob3dBZGRTaWJsaW5nQnV0dG9uOiBib29sZWFuO1xuICBwdWJsaWMgcm9vdE5vZGU6IGFueTtcbiAgcHVibGljIHNob3dMaWJyYXJ5QnV0dG9uID0gZmFsc2U7XG4gIHB1YmxpYyByb290TWVudVRlbXBsYXRlID0gYDxzcGFuIGNsYXNzPVwidWkgZHJvcGRvd24gc2ItZG90dGVkLWRyb3Bkb3duXCIgYXV0b2Nsb3NlPVwiaXRlbUNsaWNrXCIgc3VpZHJvcGRvd249XCJcIiB0YWJpbmRleD1cIjBcIj5cbiAgPHNwYW4gaWQ9XCJjb250ZXh0TWVudVwiIGNsYXNzPVwicC0wIHctYXV0b1wiPjxpIGNsYXNzPVwiaWNvbiBlbGxpcHNpcyB2ZXJ0aWNhbCBzYi1jb2xvci1ibGFja1wiPjwvaT48L3NwYW4+XG4gIDxzcGFuIGlkPSBcImNvbnRleHRNZW51RHJvcERvd25cIiBjbGFzcz1cIm1lbnUgdHJhbnNpdGlvbiBoaWRkZW5cIiBzdWlkcm9wZG93bm1lbnU9XCJcIiBzdHlsZT1cIlwiPlxuICAgIDxkaXYgaWQ9XCJhZGRjaGlsZFwiIGNsYXNzPVwiaXRlbVwiPkFkZCBDaGlsZDwvZGl2PlxuICA8L3NwYW4+XG4gIDwvc3Bhbj5gO1xuICBwdWJsaWMgZm9sZGVyTWVudVRlbXBsYXRlID0gYDxzcGFuIGlkPSBcInJlbW92ZU5vZGVJY29uXCI+IDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIHR5cGU9XCJidXR0b25cIj48L2k+IDwvc3Bhbj48c3BhbiBjbGFzcz1cInVpIGRyb3Bkb3duIHNiLWRvdHRlZC1kcm9wZG93blwiIGF1dG9jbG9zZT1cIml0ZW1DbGlja1wiIHN1aWRyb3Bkb3duPVwiXCIgdGFiaW5kZXg9XCIwXCI+XG4gIDxzcGFuIGlkPVwiY29udGV4dE1lbnVcIiBjbGFzcz1cInAtMCB3LWF1dG9cIj48aSBjbGFzcz1cImljb24gZWxsaXBzaXMgdmVydGljYWwgc2ItY29sb3ItYmxhY2tcIj48L2k+PC9zcGFuPlxuICA8c3BhbiBpZD0gXCJjb250ZXh0TWVudURyb3BEb3duXCIgY2xhc3M9XCJtZW51IHRyYW5zaXRpb24gaGlkZGVuXCIgc3VpZHJvcGRvd25tZW51PVwiXCIgc3R5bGU9XCJcIj5cbiAgICA8ZGl2IGlkPVwiYWRkc2libGluZ1wiIGNsYXNzPVwiaXRlbVwiPkFkZCBTaWJsaW5nPC9kaXY+XG4gICAgPGRpdiBpZD1cImFkZGNoaWxkXCIgY2xhc3M9XCJpdGVtXCI+QWRkIENoaWxkPC9kaXY+XG4gICAgPGRpdiBpZD1cImRlbGV0ZVwiIGNsYXNzPVwiaXRlbVwiPkRlbGV0ZTwvZGl2PlxuICA8L3NwYW4+XG4gIDwvc3Bhbj5gO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyBjb250ZW50TWVudVRlbXBsYXRlID0gYDxzcGFuIGlkPVwiY29udGV4dE1lbnVcIj48c3BhbiBpZD0gXCJyZW1vdmVOb2RlSWNvblwiIHR5cGU9XCJjb250ZW50XCIgPiA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiB0eXBlPVwiYnV0dG9uXCI+PC9pPiA8L3NwYW4+PC9zcGFuPmA7XG4gIHB1YmxpYyBub2RlUGFyZW50RGVwZW5kZW50TWFwOiBhbnk7XG4gIHB1YmxpYyBidWxrVXBsb2FkUHJvY2Vzc2luZ1N0YXR1czogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlLCBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZWxlbWV0cnlTZXJ2aWNlOiBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlLCBwcml2YXRlIGhlbHBlclNlcnZpY2U6IEhlbHBlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgIHB1YmxpYyBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLCBwcml2YXRlIGRpYWxjb2RlU2VydmljZTogRGlhbGNvZGVTZXJ2aWNlKSB7IH1cbiAgcHJpdmF0ZSBvbkNvbXBvbmVudERlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29uZmlnID0gXy5jbG9uZURlZXAodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZy5jb25maWcpO1xuICAgIHRoaXMuY29uZmlnLm1vZGUgPSAgXy5nZXQodGhpcy5jb25maWcsICdtb2RlJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIV8uaGFzKHRoaXMuY29uZmlnLCAnbWF4RGVwdGgnKSkgeyAvLyBUT0RPOjogcmV0aGluayB0aGlzXG4gICAgICB0aGlzLmNvbmZpZy5tYXhEZXB0aCA9IDQ7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5idWxrVXBsb2FkU3RhdHVzJC5zdWJzY3JpYmUoc3RhdHVzID0+IHtcbiAgICAgIHRoaXMuYnVsa1VwbG9hZFByb2Nlc3NpbmdTdGF0dXMgPSBzdGF0dXM7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJUcmVlKHRoaXMuZ2V0VHJlZUNvbmZpZygpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ub2Rlcy5kYXRhO1xuICAgIHRoaXMubm9kZVBhcmVudERlcGVuZGVudE1hcCA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRQYXJlbnREZXBlbmRlbnRNYXAodGhpcy5ub2Rlcy5kYXRhKTtcbiAgICBsZXQgdHJlZURhdGE7XG4gICAgaWYgKF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZSwgJ2VkaXRvckNvbmZpZy5jb25maWcucmVuZGVyVGF4b25vbXknKSA9PT0gdHJ1ZSAmJiBfLmlzRW1wdHkoXy5nZXQodGhpcy5ub2RlcywgJ2RhdGEuY2hpbGRyZW4nKSkpIHtcbiAgICAgIHRoaXMuaGVscGVyU2VydmljZS5hZGREZXB0aFRvSGllcmFyY2h5KHRoaXMubm9kZXMuZGF0YS5jaGlsZHJlbik7XG4gICAgICB0aGlzLm5vZGVzLmRhdGEuY2hpbGRyZW4gPSAgIHRoaXMucmVtb3ZlSW50ZXJtZWRpYXRlTGV2ZWxzRnJvbUZyYW1ld29yayh0aGlzLm5vZGVzLmRhdGEuY2hpbGRyZW4pO1xuICAgICAgdHJlZURhdGEgPSB0aGlzLmJ1aWxkVHJlZUZyb21GcmFtZXdvcmsodGhpcy5ub2Rlcy5kYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZURhdGEgPSB0aGlzLmJ1aWxkVHJlZSh0aGlzLm5vZGVzLmRhdGEpO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvclNlcnZpY2UudHJlZURhdGEgPSB0cmVlRGF0YTtcbiAgICB0aGlzLnJvb3ROb2RlID0gW3tcbiAgICAgIGlkOiBkYXRhLmlkZW50aWZpZXIgfHwgdXVpZHY0KCksXG4gICAgICB0aXRsZTogZGF0YS5uYW1lLFxuICAgICAgdG9vbHRpcDogZGF0YS5uYW1lLFxuICAgICAgLi4uKGRhdGEuY29udGVudFR5cGUgJiYge2NvbnRlbnRUeXBlOiBkYXRhLmNvbnRlbnRUeXBlfSksXG4gICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGRhdGEucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgb2JqZWN0VHlwZTogZGF0YS5vYmplY3RUeXBlLFxuICAgICAgbWV0YWRhdGE6IF8ub21pdChkYXRhLCBbJ2NoaWxkcmVuJywgJ2NvbGxlY3Rpb25zJ10pLFxuICAgICAgZm9sZGVyOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IHRyZWVEYXRhLFxuICAgICAgcm9vdDogdHJ1ZSxcbiAgICAgIGljb246IF8uZ2V0KHRoaXMuY29uZmlnLCAnaWNvbkNsYXNzJylcbiAgICB9XTtcbiAgfVxuXG4gIGJ1aWxkVHJlZUZyb21GcmFtZXdvcmsoZGF0YSwgdHJlZT8sIGxldmVsPykge1xuICAgIHRyZWUgPSB0cmVlIHx8IFtdO1xuICAgIGlmIChkYXRhLmNoaWxkcmVuKSB7IGRhdGEuY2hpbGRyZW4gPSBfLnNvcnRCeShkYXRhLmNoaWxkcmVuLCBbJ2luZGV4J10pOyB9XG4gICAgXy5mb3JFYWNoKGRhdGEuY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRUcmVlID0gW107XG4gICAgICB0cmVlLnB1c2goe1xuICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgIHRpdGxlOiBjaGlsZC5uYW1lLFxuICAgICAgICB0b29sdGlwOiBjaGlsZC5uYW1lLFxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGNoaWxkLnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgbWV0YWRhdGE6IF8ub21pdChjaGlsZCwgWydjaGlsZHJlbicsICdjb2xsZWN0aW9ucyddKSxcbiAgICAgICAgZm9sZGVyOiB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRUcmVlLFxuICAgICAgICByb290OiBmYWxzZSxcbiAgICAgICAgaWNvbjogJ2ZhIGZhLWZvbGRlci1vJ1xuICAgICAgfSk7XG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5idWlsZFRyZWVGcm9tRnJhbWV3b3JrKGNoaWxkLCBjaGlsZFRyZWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0cmVlO1xuICB9XG5cbiAgcmVtb3ZlSW50ZXJtZWRpYXRlTGV2ZWxzRnJvbUZyYW1ld29yayhkYXRhLCBwYXJlbnREYXRhPykge1xuICAgIGNvbnN0IHRyZWUgPSBbXTtcbiAgICBfLmZvckVhY2goZGF0YSwgY2hpbGQgPT4ge1xuICAgICAgaWYgKGNoaWxkLmRlcHRoID09PSAwIHx8IGNoaWxkLmRlcHRoID09PSB0aGlzLmhlbHBlclNlcnZpY2UudHJlZURlcHRoKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgICAgLi4uXy5vbWl0KGNoaWxkLCBbJ2NoaWxkcmVuJ10pLFxuICAgICAgICAgIC4uLihjaGlsZC5jaGlsZHJlbiAmJiB7Y2hpbGRyZW46IHRoaXMucmVtb3ZlSW50ZXJtZWRpYXRlTGV2ZWxzRnJvbUZyYW1ld29yayhjaGlsZC5jaGlsZHJlbiwgY2hpbGQpfSlcbiAgICAgICAgfTtcbiAgICAgICAgdHJlZS5wdXNoKFxuICAgICAgICAgIG5vZGVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoKGNoaWxkLmRlcHRoICE9PSAwIHx8IGNoaWxkLmRlcHRoICE9PSB0aGlzLmhlbHBlclNlcnZpY2UudHJlZURlcHRoKSkge1xuICAgICAgICBwYXJlbnREYXRhLmNoaWxkcmVuICA9IF8uZmlsdGVyKHBhcmVudERhdGEuY2hpbGRyZW4sIGl0ZW0gPT4gKGl0ZW0uZGVwdGggPT09IDAgfHwgaXRlbS5kZXB0aCA9PT0gdGhpcy5oZWxwZXJTZXJ2aWNlLnRyZWVEZXB0aCkpO1xuICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5yZW1vdmVJbnRlcm1lZGlhdGVMZXZlbHNGcm9tRnJhbWV3b3JrKGNoaWxkLmNoaWxkcmVuLCBjaGlsZCk7XG4gICAgICAgICAgcGFyZW50RGF0YS5jaGlsZHJlbiA9IF8uY29uY2F0KHBhcmVudERhdGEuY2hpbGRyZW4sIGNoaWxkcmVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnREYXRhLmNoaWxkcmVuID0gXy5jb25jYXQocGFyZW50RGF0YS5jaGlsZHJlbiwgY2hpbGQuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuICFfLmlzRW1wdHkodHJlZSkgPyB0cmVlIDogXy5mbGF0dGVuKHBhcmVudERhdGEuY2hpbGRyZW4pO1xuICB9XG5cbiAgYnVpbGRUcmVlKGRhdGEsIHRyZWU/LCBsZXZlbD8pIHtcbiAgICB0cmVlID0gdHJlZSB8fCBbXTtcbiAgICBpZiAoZGF0YS5jaGlsZHJlbikgeyBkYXRhLmNoaWxkcmVuID0gXy5zb3J0QnkoZGF0YS5jaGlsZHJlbiwgWydpbmRleCddKTsgfVxuICAgIGRhdGEubGV2ZWwgPSBsZXZlbCA/IChsZXZlbCArIDEpIDogMTtcbiAgICBfLmZvckVhY2goZGF0YS5jaGlsZHJlbiwgKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZFRyZWUgPSBbXTtcbiAgICAgIHRyZWUucHVzaCh7XG4gICAgICAgIGlkOiBjaGlsZC5pZGVudGlmaWVyIHx8IHV1aWR2NCgpLFxuICAgICAgICB0aXRsZTogY2hpbGQubmFtZSxcbiAgICAgICAgdG9vbHRpcDogY2hpbGQubmFtZSxcbiAgICAgICAgLi4uKGNoaWxkLmNvbnRlbnRUeXBlICYmIHtjb250ZW50VHlwZTogY2hpbGQuY29udGVudFR5cGV9KSxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIG9iamVjdFR5cGU6IGNoaWxkLm9iamVjdFR5cGUsXG4gICAgICAgIG1ldGFkYXRhOiBfLm9taXQoY2hpbGQsIFsnY2hpbGRyZW4nLCAnY29sbGVjdGlvbnMnXSksXG4gICAgICAgIGZvbGRlcjogdGhpcy5pc0ZvbGRlcihjaGlsZCksXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZFRyZWUsXG4gICAgICAgIHJvb3Q6IGZhbHNlLFxuICAgICAgICBpY29uOiB0aGlzLmdldEljb25DbGFzcyhjaGlsZCwgZGF0YS5sZXZlbClcbiAgICAgIH0pO1xuICAgICAgaWYgKGNoaWxkLnZpc2liaWxpdHkgPT09ICdQYXJlbnQnKSB7XG4gICAgICAgIHRoaXMuYnVpbGRUcmVlKGNoaWxkLCBjaGlsZFRyZWUsIGRhdGEubGV2ZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0cmVlO1xuICB9XG5cbiAgaXNGb2xkZXIoY2hpbGQ6IGFueSkge1xuICAgIGlmICh0aGlzLmlzQ29udGVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNoaWxkLnZpc2liaWxpdHkgPT09ICdQYXJlbnQnID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb25DbGFzcyhjaGlsZDogYW55LCBsZXZlbDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXNDb250ZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuICdmYSBmYS1maWxlLW8nO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQudmlzaWJpbGl0eSA9PT0gJ1BhcmVudCcpIHtcbiAgICAgICAgcmV0dXJuIF8uZ2V0KHRoaXMuY29uZmlnLCBgaGllcmFyY2h5LmxldmVsLiR7bGV2ZWx9Lmljb25DbGFzc2ApIHx8ICdmYSBmYS1mb2xkZXItbyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZmEgZmEtZmlsZS1vJztcbiAgICB9XG4gIH1cblxuICBpc0NvbnRlbnQoY2hpbGQ6IGFueSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICByZXR1cm4gKF8uZ2V0KHRoaXMuY29uZmlnLCAnb2JqZWN0VHlwZScpID09PSAnUXVlc3Rpb25TZXQnICYmIGNoaWxkLm9iamVjdFR5cGUgPT09ICdRdWVzdGlvbicpO1xuICB9XG5cbiAgcmVuZGVyVHJlZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4udGhpcy5vcHRpb25zIH07XG4gICAgJCh0aGlzLnRyZWUubmF0aXZlRWxlbWVudCkuZmFuY3l0cmVlKG9wdGlvbnMpO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uuc2V0VHJlZUVsZW1lbnQodGhpcy50cmVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0Nvbm5lY3RvcnMpIHtcbiAgICAgICQoJy5mYW5jeXRyZWUtY29udGFpbmVyJykuYWRkQ2xhc3MoJ2ZhbmN5dHJlZS1jb25uZWN0b3JzJyk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5yZWxvYWRUcmVlKHRoaXMucm9vdE5vZGUpO1xuICAgICAgdGhpcy50cmVlU2VydmljZS5zZXRBY3RpdmVOb2RlKCk7XG4gICAgICBjb25zdCByb290Tm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Rmlyc3RDaGlsZCgpO1xuICAgICAgcm9vdE5vZGUuc2V0RXhwYW5kZWQodHJ1ZSk7XG4gICAgICB0aGlzLmVhY2hOb2RlQWN0aW9uQnV0dG9uKHJvb3ROb2RlKTtcbiAgICAgIHRoaXMuZGlhbGNvZGVTZXJ2aWNlLnJlYWRFeGlzdGluZ1FyQ29kZSgpO1xuICAgIH0pO1xuICAgIGlmIChfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UsICdlZGl0b3JDb25maWcuY29uZmlnLnJlbmRlclRheG9ub215JykgPT09IHRydWUgJiYgXy5pc0VtcHR5KF8uZ2V0KHRoaXMubm9kZXMsICdkYXRhLmNoaWxkcmVuJykpKSB7XG4gICAgICBfLmZvckVhY2godGhpcy5yb290Tm9kZVswXT8uY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlVHJlZU5vZGVNZXRhZGF0YShjaGlsZC5tZXRhZGF0YSwgY2hpbGQuaWQsIGNoaWxkLnByaW1hcnlDYXRlZ29yeSwgY2hpbGQub2JqZWN0VHlwZSk7XG4gICAgICAgICAgXy5mb3JFYWNoKGNoaWxkLmNoaWxkcmVuLCAoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlVHJlZU5vZGVNZXRhZGF0YShlbC5tZXRhZGF0YSwgZWwuaWQsIGVsLnByaW1hcnlDYXRlZ29yeSwgZWwub2JqZWN0VHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmVlQ29uZmlnKCkge1xuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICAgIGV4dGVuc2lvbnM6IFsnZ2x5cGgnLCAnZG5kNSddLFxuICAgICAgY2xpY2tGb2xkZXJNb2RlOiAzLFxuICAgICAgc291cmNlOiB0aGlzLnJvb3ROb2RlLFxuICAgICAgZXNjYXBlVGl0bGVzOiB0cnVlLFxuICAgICAgZ2x5cGg6IHtcbiAgICAgICAgcHJlc2V0OiAnYXdlc29tZTQnLFxuICAgICAgICBtYXA6IHtcbiAgICAgICAgICBmb2xkZXI6ICdpY29uIGZvbGRlciBzYi1mYW5jeVRyZWUtaWNvbicsXG4gICAgICAgICAgZm9sZGVyT3BlbjogJ2ljb24gZm9sZGVyIG91dGxpbmUgc2ItZmFuY3lUcmVlLWljb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkbmQ1OiB7XG4gICAgICAgIGF1dG9FeHBhbmRNUzogNDAwLFxuICAgICAgICAvLyBmb2N1c09uQ2xpY2s6IHRydWUsXG4gICAgICAgIHByZXZlbnRWb2lkTW92ZXM6IHRydWUsIC8vIFByZXZlbnQgZHJvcHBpbmcgbm9kZXMgJ2JlZm9yZSBzZWxmJywgZXRjLlxuICAgICAgICBwcmV2ZW50UmVjdXJzaW9uOiB0cnVlLCAvLyBQcmV2ZW50IGRyb3BwaW5nIG5vZGVzIG9uIG93biBkZXNjZW5kYW50c1xuICAgICAgICBkcmFnU3RhcnQ6IChub2RlLCBkYXRhKSA9PiB7XG4gICAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gTVVTVCBiZSBkZWZpbmVkIHRvIGVuYWJsZSBkcmFnZ2luZyBmb3IgdGhlIHRyZWUuXG4gICAgICAgICAgICogIFJldHVybiBmYWxzZSB0byBjYW5jZWwgZHJhZ2dpbmcgb2Ygbm9kZS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBkcmFnZ2FibGUgPSBfLmdldCh0aGlzLmNvbmZpZywgJ21vZGUnKSA9PT0gJ2VkaXQnID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBkcmFnZ2FibGU7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdFbnRlcjogKG5vZGUsIGRhdGEpID0+IHtcbiAgICAgICAgICAvKiogZGF0YS5vdGhlck5vZGUgbWF5IGJlIG51bGwgZm9yIG5vbi1mYW5jeXRyZWUgZHJvcHBhYmxlcy5cbiAgICAgICAgICAgKiAgUmV0dXJuIGZhbHNlIHRvIGRpc2FsbG93IGRyb3BwaW5nIG9uIG5vZGUuIEluIHRoaXMgY2FzZVxuICAgICAgICAgICAqICBkcmFnT3ZlciBhbmQgZHJhZ0xlYXZlIGFyZSBub3QgY2FsbGVkLlxuICAgICAgICAgICAqICBSZXR1cm4gJ292ZXInLCAnYmVmb3JlLCBvciAnYWZ0ZXInIHRvIGZvcmNlIGEgaGl0TW9kZS5cbiAgICAgICAgICAgKiAgUmV0dXJuIFsnYmVmb3JlJywgJ2FmdGVyJ10gdG8gcmVzdHJpY3QgYXZhaWxhYmxlIGhpdE1vZGVzLlxuICAgICAgICAgICAqICBBbnkgb3RoZXIgcmV0dXJuIHZhbHVlIHdpbGwgY2FsYyB0aGUgaGl0TW9kZSBmcm9tIHRoZSBjdXJzb3IgcG9zaXRpb24uXG4gICAgICAgICAgICovXG4gICAgICAgICAgLy8gUHJldmVudCBkcm9wcGluZyBhIHBhcmVudCBiZWxvdyBhbm90aGVyIHBhcmVudCAob25seSBzb3J0XG4gICAgICAgICAgLy8gbm9kZXMgdW5kZXIgdGhlIHNhbWUgcGFyZW50KVxuICAgICAgICAgIC8qICAgICAgICAgICBpZihub2RlLnBhcmVudCAhPT0gZGF0YS5vdGhlck5vZGUucGFyZW50KXtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgZHJvcHBpbmcgKm92ZXIqIGEgbm9kZSAod291bGQgY3JlYXRlIGEgY2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXCJiZWZvcmVcIiwgXCJhZnRlclwiXTtcbiAgICAgICAgICAqL1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnRHJvcDogKG5vZGUsIGRhdGEpID0+IHtcbiAgICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiBNVVNUIGJlIGRlZmluZWQgdG8gZW5hYmxlIGRyb3BwaW5nIG9mIGl0ZW1zIG9uXG4gICAgICAgICAgICogIHRoZSB0cmVlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIC8vIGRhdGEub3RoZXJOb2RlLm1vdmVUbyhub2RlLCBkYXRhLmhpdE1vZGUpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wKG5vZGUsIGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICBhdXRvQXBwbHk6IHRydWUsXG4gICAgICAgICAgYXV0b0V4cGFuZDogZmFsc2UsXG4gICAgICAgICAgY291bnRlcjogdHJ1ZSxcbiAgICAgICAgICBmdXp6eTogZmFsc2UsXG4gICAgICAgICAgaGlkZUV4cGFuZGVkQ291bnRlcjogdHJ1ZSxcbiAgICAgICAgICBoaWRlRXhwYW5kZXJzOiBmYWxzZSxcbiAgICAgICAgICBoaWdobGlnaHQ6IHRydWUsXG4gICAgICAgICAgbGVhdmVzT25seTogZmFsc2UsXG4gICAgICAgICAgbm9kYXRhOiB0cnVlLFxuICAgICAgICAgIG1vZGU6ICdkaW1tJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW5pdDogKGV2ZW50LCBkYXRhKSA9PiB7IH0sXG4gICAgICBjbGljazogKGV2ZW50LCBkYXRhKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHRoaXMudHJlZS5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIHRoaXMudGVsZW1ldHJ5U2VydmljZS5pbnRlcmFjdCh7IGVkYXRhOiB0aGlzLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoKSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgYWN0aXZhdGU6IChldmVudCwgZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLnRyZWVFdmVudEVtaXR0ZXIuZW1pdCh7IHR5cGU6ICdub2RlU2VsZWN0JywgZGF0YTogZGF0YS5ub2RlIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmF0dGFjaENvbnRleHRNZW51KGRhdGEubm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5lYWNoTm9kZUFjdGlvbkJ1dHRvbihkYXRhLm5vZGUpO1xuICAgICAgICB9LCAxMCk7XG4gICAgICB9LFxuICAgICAgcmVuZGVyTm9kZTogKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkYXRhLm5vZGU7XG4gICAgICAgIGNvbnN0ICRub2RlU3BhbiA9ICQobm9kZS5zcGFuKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBzcGFuIG9mIG5vZGUgYWxyZWFkeSByZW5kZXJlZFxuICAgICAgICBpZiAoISRub2RlU3Bhbi5kYXRhKCdyZW5kZXJlZCcpKSB7XG4gICAgICAgICAgdGhpcy5hdHRhY2hDb250ZXh0TWVudShub2RlKTtcbiAgICAgICAgICAvLyBzcGFuIHJlbmRlcmVkXG4gICAgICAgICAgJG5vZGVTcGFuLmRhdGEoJ3JlbmRlcmVkJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgZWFjaE5vZGVBY3Rpb25CdXR0b24obm9kZSkge1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IHt9O1xuICAgIGlmICh0aGlzLmJ1bGtVcGxvYWRQcm9jZXNzaW5nU3RhdHVzKSB7XG4gICAgdGhpcy52aXNpYmlsaXR5LmFkZENoaWxkID0gZmFsc2U7XG4gICAgdGhpcy52aXNpYmlsaXR5LmFkZFNpYmxpbmcgPSAgZmFsc2U7XG4gICAgdGhpcy52aXNpYmlsaXR5LmFkZEZyb21MaWJyYXJ5ID0gIGZhbHNlO1xuICAgIHRoaXMudmlzaWJpbGl0eS5hZGRRdWVzdGlvbkZyb21MaWJyYXJ5ID0gZmFsc2U7XG4gICAgdGhpcy52aXNpYmlsaXR5LmNyZWF0ZU5ldyA9ICBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9kZUxldmVsID0gbm9kZS5nZXRMZXZlbCgpIC0gMTtcbiAgICAgIHRoaXMudmlzaWJpbGl0eS5hZGRDaGlsZCA9ICgobm9kZS5mb2xkZXIgPT09IGZhbHNlKSB8fCAobm9kZUxldmVsID49IHRoaXMuY29uZmlnLm1heERlcHRoKSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICB0aGlzLnZpc2liaWxpdHkuYWRkU2libGluZyA9ICgobm9kZS5mb2xkZXIgPT09IHRydWUpICYmICghbm9kZS5kYXRhLnJvb3QpICYmICEoKG5vZGUuZ2V0TGV2ZWwoKSAtIDEpID4gdGhpcy5jb25maWcubWF4RGVwdGgpKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIGlmIChub2RlTGV2ZWwgPT09IDApIHtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5LmFkZEZyb21MaWJyYXJ5ID0gXy5pc0VtcHR5KF8uZ2V0KHRoaXMuY29uZmlnLCAnY2hpbGRyZW4nKSkgfHwgXy5nZXQodGhpcy5jb25maWcsICdlbmFibGVRdWVzdGlvbkNyZWF0aW9uJykgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLnZpc2liaWxpdHkuY3JlYXRlTmV3ID0gXy5pc0VtcHR5KF8uZ2V0KHRoaXMuY29uZmlnLCAnY2hpbGRyZW4nKSkgfHwgXy5nZXQodGhpcy5jb25maWcsICdlbmFibGVRdWVzdGlvbkNyZWF0aW9uJykgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLnZpc2liaWxpdHkuYWRkUXVlc3Rpb25Gcm9tTGlicmFyeSA9ICFfLmlzRW1wdHkoXy5nZXQodGhpcy5jb25maWcsICdjaGlsZHJlbicpKSAmJiBfLmdldCh0aGlzLmNvbmZpZywgJ2VuYWJsZUFkZEZyb21MaWJyYXJ5JykgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHlsZXZlbERhdGEgPSB0aGlzLmNvbmZpZy5oaWVyYXJjaHlbYGxldmVsJHtub2RlTGV2ZWx9YF07XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5LmFkZEZyb21MaWJyYXJ5ID0gKChub2RlLmZvbGRlciA9PT0gZmFsc2UpIHx8IF8uaXNFbXB0eShfLmdldChoaWVyYXJjaHlsZXZlbERhdGEsICdjaGlsZHJlbicpKSB8fCBfLmdldCh0aGlzLmNvbmZpZywgJ2VuYWJsZVF1ZXN0aW9uQ3JlYXRpb24nKSA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMudmlzaWJpbGl0eS5jcmVhdGVOZXcgPSAoKG5vZGUuZm9sZGVyID09PSBmYWxzZSkgfHwgXy5pc0VtcHR5KF8uZ2V0KGhpZXJhcmNoeWxldmVsRGF0YSwgJ2NoaWxkcmVuJykpIHx8IF8uZ2V0KHRoaXMuY29uZmlnLCAnZW5hYmxlUXVlc3Rpb25DcmVhdGlvbicpID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIHRoaXMudmlzaWJpbGl0eS5hZGRRdWVzdGlvbkZyb21MaWJyYXJ5ID0gKChub2RlLmZvbGRlciA9PT0gdHJ1ZSkgJiYgIV8uaXNFbXB0eShfLmdldChoaWVyYXJjaHlsZXZlbERhdGEsICdjaGlsZHJlbicpKSAmJiBfLmdldCh0aGlzLmNvbmZpZywgJ2VuYWJsZUFkZEZyb21MaWJyYXJ5JykgPT09IHRydWUpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLCAnZWRpdG9yQ29uZmlnLmNvbmZpZy5yZW5kZXJUYXhvbm9teScpID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnZpc2liaWxpdHkuYWRkQ2hpbGQgPSBmYWxzZTtcbiAgICAgIHRoaXMudmlzaWJpbGl0eS5hZGRTaWJsaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGFkZENoaWxkKCkge1xuICAgIHRoaXMudGVsZW1ldHJ5U2VydmljZS5pbnRlcmFjdCh7IGVkYXRhOiB0aGlzLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2FkZF9jaGlsZCcpIH0pO1xuICAgIGNvbnN0IHRyZWUgPSAkKHRoaXMudHJlZS5uYXRpdmVFbGVtZW50KS5mYW5jeXRyZWUoJ2dldFRyZWUnKTtcbiAgICBjb25zdCBub2RlQ29uZmlnID0gdGhpcy5jb25maWcuaGllcmFyY2h5W3RyZWUuZ2V0QWN0aXZlTm9kZSgpLmdldExldmVsKCldO1xuICAgIGNvbnN0IGNoaWxkcmVuVHlwZXMgPSBfLmdldChub2RlQ29uZmlnLCAnY2hpbGRyZW4uQ29udGVudCcpO1xuICAgIGlmICgoKCh0cmVlLmdldEFjdGl2ZU5vZGUoKS5nZXRMZXZlbCgpIC0gMSkgPj0gdGhpcy5jb25maWcubWF4RGVwdGgpKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDA3JykpO1xuICAgIH1cbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmFkZE5vZGUoJ2NoaWxkJyk7XG4gIH1cblxuICBhZGRTaWJsaW5nKCkge1xuICAgIHRoaXMudGVsZW1ldHJ5U2VydmljZS5pbnRlcmFjdCh7IGVkYXRhOiB0aGlzLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2FkZF9zaWJsaW5nJykgfSk7XG4gICAgY29uc3QgdHJlZSA9ICQodGhpcy50cmVlLm5hdGl2ZUVsZW1lbnQpLmZhbmN5dHJlZSgnZ2V0VHJlZScpO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRyZWUuZ2V0QWN0aXZlTm9kZSgpO1xuICAgIGlmICghbm9kZS5kYXRhLnJvb3QpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuYWRkTm9kZSgnc2libGluZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwNycpKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVOb2RlKCkge1xuICAgIHJldHVybiAkKHRoaXMudHJlZS5uYXRpdmVFbGVtZW50KS5mYW5jeXRyZWUoJ2dldFRyZWUnKS5nZXRBY3RpdmVOb2RlKCk7XG4gIH1cblxuICBhdHRhY2hDb250ZXh0TWVudShub2RlLCBhY3RpdmVOb2RlPykge1xuICAgIGlmIChfLmdldCh0aGlzLmNvbmZpZywgJ21vZGUnKSAhPT0gJ2VkaXQnIHx8IChub2RlLmRhdGEucm9vdCA9PT0gdHJ1ZSAmJiBfLmlzRW1wdHkodGhpcy5jb25maWcuaGllcmFyY2h5KSApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0ICRub2RlU3BhbiA9ICQobm9kZS5zcGFuKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoICAgLy8gVE9ETzo6IChub2RlLmRhdGEuY29udGVudFR5cGUgPT09ICdDb3Vyc2VVbml0JykgY2hlY2sgdGhpcyBjb25kaXRpb25cbiAgICBjb25zdCBtZW51VGVtcGxhdGUgPSBub2RlLmRhdGEucm9vdCA9PT0gdHJ1ZSA/IHRoaXMucm9vdE1lbnVUZW1wbGF0ZSA6IChub2RlLmRhdGEucm9vdCA9PT0gZmFsc2UgJiYgbm9kZS5mb2xkZXIgPT09IHRydWUgID8gdGhpcy5mb2xkZXJNZW51VGVtcGxhdGUgOiB0aGlzLmNvbnRlbnRNZW51VGVtcGxhdGUpO1xuICAgIGNvbnN0IGljb25zQnV0dG9uID0gJChtZW51VGVtcGxhdGUpO1xuICAgIGlmICgobm9kZS5nZXRMZXZlbCgpIC0gMSkgPj0gdGhpcy5jb25maWcubWF4RGVwdGgpIHtcbiAgICAgIGljb25zQnV0dG9uLmZpbmQoJyNhZGRjaGlsZCcpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIGxldCBjb250ZXh0TWVudSA9ICQoJG5vZGVTcGFuWzBdKS5maW5kKGAjY29udGV4dE1lbnVgKTtcblxuICAgIGlmICghY29udGV4dE1lbnUubGVuZ3RoKSB7XG4gICAgICAkbm9kZVNwYW4uYXBwZW5kKGljb25zQnV0dG9uKTtcblxuICAgICAgaWYgKCFhY3RpdmVOb2RlKSB7XG4gICAgICAgIGljb25zQnV0dG9uLmhpZGUoKTtcbiAgICAgIH1cblxuICAgICAgJG5vZGVTcGFuWzBdLm9ubW91c2VvdmVyID0gKCkgPT4ge1xuICAgICAgICBpY29uc0J1dHRvbi5zaG93KCk7XG4gICAgICB9O1xuXG4gICAgICAkbm9kZVNwYW5bMF0ub25tb3VzZW91dCA9ICgpID0+IHtcbiAgICAgICAgaWNvbnNCdXR0b24uaGlkZSgpO1xuICAgICAgfTtcblxuICAgICAgY29udGV4dE1lbnUgPSAkKCRub2RlU3BhblswXSkuZmluZChgI2NvbnRleHRNZW51YCk7XG5cbiAgICAgIGNvbnRleHRNZW51Lm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNsb3NlUHJldk9wZW5lZERyb3BEb3duKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5TcGFuID0gJCh0aGlzLmdldEFjdGl2ZU5vZGUoKS5zcGFuKTtcblxuICAgICAgICAgIGNvbnN0IGRyb3BEb3duRWxlbWVudCA9ICQoblNwYW5bMF0pLmZpbmQoYCNjb250ZXh0TWVudURyb3BEb3duYCk7XG4gICAgICAgICAgZHJvcERvd25FbGVtZW50LnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICBkcm9wRG93bkVsZW1lbnQuYWRkQ2xhc3MoJ3Zpc2libGUnKTtcbiAgICAgICAgICBfLmZvckVhY2goXy5nZXQoXy5maXJzdChkcm9wRG93bkVsZW1lbnQpLCAnY2hpbGRyZW4nKSwgaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UuY2xvc2VQcmV2T3BlbmVkRHJvcERvd24oKTtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb25CdXR0b25zKGV2LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0pO1xuXG4gICAgICAkKCRub2RlU3BhblswXSkuZmluZChgI3JlbW92ZU5vZGVJY29uYCkub24oJ2NsaWNrJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaXNDb250ZW50ID0gIGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCd0eXBlJykgJiYgZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ2NvbnRlbnQnO1xuICAgICAgICB0aGlzLnJlbW92ZU5vZGUoaXNDb250ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cbiAgZHJvcE5vZGUodGFyZ2V0Tm9kZSwgY3VycmVudE5vZGUpIHtcblxuICAgIGxldCBkcm9wQWxsb3dlZDtcbiAgICBkcm9wQWxsb3dlZCA9IHRydWU7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIGlmIChjdXJyZW50Tm9kZS5vdGhlck5vZGUuZ2V0TGV2ZWwoKSA9PT0gdGFyZ2V0Tm9kZS5nZXRMZXZlbCgpICYmIGN1cnJlbnROb2RlLm90aGVyTm9kZS5mb2xkZXIgPT09IHRydWUgJiYgIGN1cnJlbnROb2RlLmhpdE1vZGUgIT09ICdvdmVyJykge1xuICAgICAgZHJvcEFsbG93ZWQgPSB0cnVlO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnROb2RlLm90aGVyTm9kZS5mb2xkZXIgPT09IHRydWUgJiYgKHRoaXMubWF4VHJlZURlcHRoKGN1cnJlbnROb2RlLm90aGVyTm9kZSkgKyAodGFyZ2V0Tm9kZS5nZXRMZXZlbCgpIC0gMSkpID4gXy5nZXQodGhpcy5jb25maWcsICdtYXhEZXB0aCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wTm90QWxsb3dlZCgpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudE5vZGUub3RoZXJOb2RlLmZvbGRlciA9PT0gZmFsc2UgJiYgIXRoaXMuY2hlY2tDb250ZW50QWRkaXRpb24odGFyZ2V0Tm9kZSwgY3VycmVudE5vZGUpKSB7XG4gICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChkcm9wQWxsb3dlZCkge1xuICAgICAgICBjdXJyZW50Tm9kZS5vdGhlck5vZGUubW92ZVRvKHRhcmdldE5vZGUsIGN1cnJlbnROb2RlLmhpdE1vZGUpO1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLm5leHRUcmVlU3RhdHVzKCdyZW9yZGVyJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybmluZyhgJHtjdXJyZW50Tm9kZS5vdGhlck5vZGUudGl0bGV9IGNhbm5vdCBiZSBhZGRlZCB0byAke2N1cnJlbnROb2RlLm5vZGUudGl0bGV9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgfVxuXG4gIGRyYWdEcm9wKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoKGRhdGEuaGl0TW9kZSA9PT0gJ2JlZm9yZScgfHwgZGF0YS5oaXRNb2RlID09PSAnYWZ0ZXInIHx8IGRhdGEuaGl0TW9kZSA9PT0gJ292ZXInKSAmJiBkYXRhLm5vZGUuZGF0YS5yb290KSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wTm90QWxsb3dlZCgpO1xuICAgIH1cbiAgICBpZiAoXy5oYXModGhpcy5jb25maWcsICdtYXhEZXB0aCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wTm9kZShub2RlLCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBkcm9wTm90QWxsb3dlZCgpIHtcbiAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm5pbmcoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDA3JykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1heFRyZWVEZXB0aChyb290KSB7XG4gICAgY29uc3QgYnVmZmVyID0gW3sgbm9kZTogcm9vdCwgZGVwdGg6IDEgfV07XG4gICAgbGV0IGN1cnJlbnQgPSBidWZmZXIucG9wKCk7XG4gICAgbGV0IG1heCA9IDA7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50Lm5vZGUpIHtcbiAgICAgIC8vIEZpbmQgYWxsIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS5cbiAgICAgIF8uZm9yRWFjaChjdXJyZW50Lm5vZGUuY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xuICAgICAgICBidWZmZXIucHVzaCh7IG5vZGU6IGNoaWxkLCBkZXB0aDogY3VycmVudC5kZXB0aCArIDEgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4KSB7XG4gICAgICAgIG1heCA9IGN1cnJlbnQuZGVwdGg7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gYnVmZmVyLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gbWF4O1xuICB9XG5cbiAgY2hlY2tDb250ZW50QWRkaXRpb24odGFyZ2V0Tm9kZSwgY29udGVudE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0Tm9kZS5mb2xkZXIgPT09IGZhbHNlICYmIChjb250ZW50Tm9kZS5oaXRNb2RlID09PSAnYmVmb3JlJyB8fCBjb250ZW50Tm9kZS5oaXRNb2RlID09PSAnYWZ0ZXInKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0YXJnZXROb2RlLmZvbGRlciA9PT0gZmFsc2UgJiYgY29udGVudE5vZGUuaGl0TW9kZSA9PT0gJ292ZXInKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG5vZGVDb25maWcgPSB0aGlzLmNvbmZpZy5oaWVyYXJjaHlbYGxldmVsJHt0YXJnZXROb2RlLmdldExldmVsKCkgLSAxfWBdO1xuICAgIGNvbnN0IGNvbnRlbnRQcmltYXJ5Q2F0ZWdvcmllcyA9IF8uZmxhdE1hcChfLmdldChub2RlQ29uZmlnLCAnY2hpbGRyZW4nKSk7XG4gICAgaWYgKCFfLmlzRW1wdHkoY29udGVudFByaW1hcnlDYXRlZ29yaWVzKSkge1xuICAgICAgcmV0dXJuIF8uaW5jbHVkZXMoY29udGVudFByaW1hcnlDYXRlZ29yaWVzLCBfLmdldChjb250ZW50Tm9kZSwgJ290aGVyTm9kZS5kYXRhLm1ldGFkYXRhLnByaW1hcnlDYXRlZ29yeScpKSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVtb3ZlTm9kZShpc0NvbnRlbnQ/OiBib29sZWFuKSB7XG4gICAgdGhpcy50cmVlRXZlbnRFbWl0dGVyLmVtaXQoeyB0eXBlOiAnZGVsZXRlTm9kZScsIGlzQ29udGVudCB9KTtcbiAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UuaW50ZXJhY3QoeyBlZGF0YTogdGhpcy5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdkZWxldGUnKSB9KTtcbiAgfVxuXG4gIGhhbmRsZUFjdGlvbkJ1dHRvbnMoZWwpIHtcbiAgICBjb25zb2xlLmxvZygnYWN0aW9uIGJ1dHRvbnMgLS0tLS0tLS0+JywgZWwuaWQpO1xuICAgIHN3aXRjaCAoZWwuaWQpIHtcbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHRoaXMucmVtb3ZlTm9kZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FkZHNpYmxpbmcnOlxuICAgICAgICB0aGlzLmFkZFNpYmxpbmcoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhZGRjaGlsZCc6XG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhZGRyZXNvdXJjZSc6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGFkZEZyb21MaWJyYXJ5KCkge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5lbWl0c2hvd0xpYnJhcnlQYWdlRXZlbnQoJ3Nob3dMaWJyYXJ5UGFnZScpO1xuICB9XG4gIGdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoaWQ/KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBpZCB8fCAnY29sbGVjdGlvbi10b2MnLFxuICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgIHN1YnR5cGU6ICdsYXVuY2gnLFxuICAgICAgcGFnZWlkOiB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLFxuICAgICAgZXh0cmE6IHtcbiAgICAgICAgdmFsdWVzOiBbXy5nZXQodGhpcy5nZXRBY3RpdmVOb2RlKCksICdkYXRhJyldXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZU5ld0NvbnRlbnQoKSB7XG4gICAgdGhpcy50cmVlRXZlbnRFbWl0dGVyLmVtaXQoeyB0eXBlOiAnY3JlYXRlTmV3Q29udGVudCcgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uQ29tcG9uZW50RGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMub25Db21wb25lbnREZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59IiwiPGRpdiAjZmFuY3lUcmVlPjwvZGl2PlxuPGRpdiBjbGFzcz1cInNiLWZpeGVkLXdpdGgtd2hpdGViZyBwci0yMCBkLWZsZXggZmxleC1qYy1zcGFjZS1iZXR3ZWVuXCIgKm5nSWY9XCJjb25maWcgJiYgY29uZmlnLm1vZGUgPT09ICdlZGl0J1wiPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2ItYnRuLWNvdmVyXCI+XG4gICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cInZpc2liaWxpdHk/LmFkZFNpYmxpbmcgPyAnJyA6ICdzYi1kaXNhYmxlZCdcIiAoY2xpY2spPVwiYWRkU2libGluZygpO1wiXG4gICAgICAgIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1vdXRsaW5lLXByaW1hcnkgc2ItYnRuLW5vcm1hbCBzYi1idG4tcmFkaXVzIHAtMCBiLW5vbmVcIj48aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24gcGx1c1wiPjwvaT5cbiAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5hZGRfc2libGluZ19idG5fbGFiZWx9fSA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2ItYnRuLWNvdmVyXCI+XG4gICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cInZpc2liaWxpdHk/LmFkZENoaWxkID8gJycgOiAnc2ItZGlzYWJsZWQnXCIgKGNsaWNrKT1cImFkZENoaWxkKCk7XCJcbiAgICAgICAgY2xhc3M9XCJzYi1idG4gc2ItYnRuLW91dGxpbmUtcHJpbWFyeSBzYi1idG4tbm9ybWFsIHNiLWJ0bi1yYWRpdXMgYi1ub25lIHAtMFwiPjxpIGNsYXNzPVwiaWNvbiBwbHVzXCI+PC9pPlxuICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmFkZF9jaGlsZF9idG5fbGFiZWx9fSA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxidXR0b24gKm5nSWY9XCJjb25maWcub2JqZWN0VHlwZSAhPT0gJ1F1ZXN0aW9uU2V0J1wiIChjbGljayk9XCJhZGRGcm9tTGlicmFyeSgpO1wiXG4gICAgW2Rpc2FibGVkXT1cIiF2aXNpYmlsaXR5Py5hZGRGcm9tTGlicmFyeVwiXG4gICAgW25nQ2xhc3NdPVwiWyF2aXNpYmlsaXR5Py5hZGRGcm9tTGlicmFyeSA/ICdzYi1idG4tb3V0bGluZS1kaXNhYmxlZCcgOiAnJywgKHZpc2liaWxpdHk/LmFkZEZyb21MaWJyYXJ5ICYmIGJ1dHRvbkxvYWRlcnM/LmFkZEZyb21MaWJyYXJ5QnV0dG9uTG9hZGVyKSA/ICdzYi1idG4tbG9hZGluZy1zcGlubmVyIHNiLWJ0bi1vdXRsaW5lLWRpc2FibGVkJzogJyddXCJcbiAgICBjbGFzcz1cInNiLWJ0biBzYi1idG4tb3V0bGluZS1wcmltYXJ5IHNiLWJ0bi1ub3JtYWwgbXQtMTAgbXItMzBcIiBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnYWRkX2Zyb21fbGlicmFyeScsJ2NsaWNrJywnbGF1bmNoJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQpXCI+XG4gICAgPGkgY2xhc3M9XCJpY29uIHBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAqbmdJZj1cIiFidXR0b25Mb2FkZXJzPy5hZGRGcm9tTGlicmFyeUJ1dHRvbkxvYWRlclwiPjwvaT5cbiAgICA8ZGl2IGNsYXNzPVwic2ItbG9hZGluZy1zcGlubmVyXCIgKm5nSWY9XCJidXR0b25Mb2FkZXJzPy5hZGRGcm9tTGlicmFyeUJ1dHRvbkxvYWRlclwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8L2Rpdj5cbiAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmFkZF9mcm9tX2xpYnJhcnlfYnRuX2xhYmVsfX1cbiAgPC9idXR0b24+XG4gIDxidXR0b24gKm5nSWY9XCJjb25maWcub2JqZWN0VHlwZSA9PT0gJ1F1ZXN0aW9uU2V0J1wiIFtkaXNhYmxlZF09XCIhdmlzaWJpbGl0eT8uY3JlYXRlTmV3XCJcbiAgICBbbmdDbGFzc109XCJbIXZpc2liaWxpdHk/LmNyZWF0ZU5ldyA/ICdzYi1idG4tb3V0bGluZS1kaXNhYmxlZCcgOiAnJywgKHZpc2liaWxpdHk/LmNyZWF0ZU5ldyAmJiBidXR0b25Mb2FkZXJzPy5hZGRGcm9tTGlicmFyeUJ1dHRvbkxvYWRlcikgPyAnc2ItYnRuLWxvYWRpbmctc3Bpbm5lciBzYi1idG4tb3V0bGluZS1kaXNhYmxlZCc6ICcnXVwiXG4gICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXByaW1hcnkgbXQtMTAgbXItMzBcIiAoY2xpY2spPVwiY3JlYXRlTmV3Q29udGVudCgpXCJcbiAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnY3JlYXRlX25ldycsJ2NsaWNrJywnbGF1bmNoJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQpXCI+XG4gICAgPGkgY2xhc3M9XCJpY29uIHBsdXNcIiAqbmdJZj1cIiFidXR0b25Mb2FkZXJzPy5hZGRGcm9tTGlicmFyeUJ1dHRvbkxvYWRlclwiPjwvaT5cbiAgICA8ZGl2IGNsYXNzPVwic2ItbG9hZGluZy1zcGlubmVyXCIgKm5nSWY9XCJidXR0b25Mb2FkZXJzPy5hZGRGcm9tTGlicmFyeUJ1dHRvbkxvYWRlclwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8L2Rpdj5cbiAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmNyZWF0ZV9uZXdfYnRuX2xhYmVsfX1cbiAgPC9idXR0b24+XG48L2Rpdj4iXX0=