@openziti/ziti-console-lib 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +68 -11
  2. package/assets/banners/ZAC.jpg +0 -0
  3. package/assets/html/index.htm +21 -3
  4. package/assets/images/Icon_Minus.png +0 -0
  5. package/assets/languages/en-us.json +3 -1
  6. package/assets/styles/global.scss +17 -0
  7. package/assets/styles/tables.css +28 -3
  8. package/assets/styles/ziti.css +29 -2
  9. package/assets/svgs/v8visualizer.svg +60 -0
  10. package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +1 -1
  11. package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +31 -0
  12. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +1 -1
  13. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +1 -1
  14. package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +260 -0
  15. package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +177 -0
  16. package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +8 -5
  17. package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +10 -6
  18. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +1 -1
  19. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +23 -1
  20. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +3 -3
  21. package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +1 -1
  22. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +37 -3
  23. package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +3 -3
  24. package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +1508 -0
  25. package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +578 -0
  26. package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +695 -0
  27. package/esm2022/lib/features/visualizer/visualizer-service.class.mjs +33 -0
  28. package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +6 -1
  29. package/esm2022/lib/models/edge-router-policy.mjs +10 -0
  30. package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +132 -0
  31. package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +418 -0
  32. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +3 -3
  33. package/esm2022/lib/pages/identities/identities-page.service.mjs +2 -2
  34. package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +7 -6
  35. package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +3 -3
  36. package/esm2022/lib/pages/services/services-page.service.mjs +3 -3
  37. package/esm2022/lib/services/node-data.service.mjs +56 -29
  38. package/esm2022/lib/shared/list-page-service.class.mjs +12 -5
  39. package/esm2022/lib/version.mjs +2 -2
  40. package/esm2022/lib/ziti-console-lib.module.mjs +23 -5
  41. package/esm2022/public-api.mjs +8 -1
  42. package/fesm2022/openziti-ziti-console-lib.mjs +4098 -246
  43. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  44. package/lib/features/multi-action-button/multi-action-button.component.d.ts +13 -0
  45. package/lib/features/multi-action-button/multi-action-button.component.d.ts.map +1 -0
  46. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +56 -0
  47. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -0
  48. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +32 -0
  49. package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +1 -0
  50. package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +3 -2
  51. package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -1
  52. package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -1
  53. package/lib/features/projectable-forms/projectable-form.class.d.ts +6 -0
  54. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
  55. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +3 -0
  56. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
  57. package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +129 -0
  58. package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +1 -0
  59. package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +131 -0
  60. package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +1 -0
  61. package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +31 -0
  62. package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +1 -0
  63. package/lib/features/visualizer/visualizer-service.class.d.ts +10 -0
  64. package/lib/features/visualizer/visualizer-service.class.d.ts.map +1 -0
  65. package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -1
  66. package/lib/models/edge-router-policy.d.ts +7 -0
  67. package/lib/models/edge-router-policy.d.ts.map +1 -0
  68. package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts +35 -0
  69. package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts.map +1 -0
  70. package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +63 -0
  71. package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -0
  72. package/lib/services/node-data.service.d.ts +1 -0
  73. package/lib/services/node-data.service.d.ts.map +1 -1
  74. package/lib/shared/list-page-service.class.d.ts.map +1 -1
  75. package/lib/ziti-console-lib.module.d.ts +33 -29
  76. package/lib/ziti-console-lib.module.d.ts.map +1 -1
  77. package/package.json +1 -1
  78. package/public-api.d.ts +7 -0
  79. package/public-api.d.ts.map +1 -1
@@ -0,0 +1,578 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class Identity {
4
+ constructor() {
5
+ this.rootNode = 'No';
6
+ this.children = [];
7
+ this.contextMenu = 'Yes';
8
+ }
9
+ }
10
+ export class Service {
11
+ constructor() {
12
+ this.rootNode = 'No';
13
+ this.children = [];
14
+ this.contextMenu = 'Yes';
15
+ }
16
+ }
17
+ export class Group {
18
+ constructor(idv, s, g) {
19
+ this.id = idv;
20
+ this.name = s;
21
+ this.group = g;
22
+ this.type = 'Group';
23
+ this.children = [];
24
+ }
25
+ }
26
+ export class ServicePolicy {
27
+ constructor() {
28
+ this.rootNode = 'No';
29
+ this.children = [];
30
+ this.contextMenu = 'Yes';
31
+ }
32
+ }
33
+ export class Attribute {
34
+ constructor() {
35
+ this.children = [];
36
+ }
37
+ }
38
+ export class ERPolicy {
39
+ constructor() {
40
+ this.rootNode = 'No';
41
+ this.children = [];
42
+ this.contextMenu = 'Yes';
43
+ }
44
+ }
45
+ export class ServiceERPolicy {
46
+ constructor() {
47
+ this.rootNode = 'No';
48
+ this.children = [];
49
+ this.contextMenu = 'Yes';
50
+ }
51
+ }
52
+ export class ERouter {
53
+ constructor() {
54
+ this.rootNode = 'No';
55
+ this.children = [];
56
+ this.contextMenu = 'Yes';
57
+ }
58
+ }
59
+ export class Children {
60
+ constructor() {
61
+ this.type = 'Children';
62
+ this.children = [];
63
+ }
64
+ }
65
+ class NetworkVisualizerHelper {
66
+ getResourceTreeObj(networkName, networkStatus, services, endpoints, appwans, edgerouters, edgeRouterPolicies, serviceEdgeRouterPolicies,
67
+ // networkProductVersion,
68
+ uniqId, logger) {
69
+ function createId() {
70
+ ++uniqId;
71
+ return uniqId;
72
+ }
73
+ class RootJson {
74
+ constructor() {
75
+ this.id = createId();
76
+ this.lastId = 0;
77
+ this.children = [];
78
+ this.contextMenu = 'Yes';
79
+ this.type = 'Network';
80
+ }
81
+ }
82
+ const rootJson = new RootJson();
83
+ rootJson.name = 'Network';
84
+ rootJson.status = 'Provisioned';
85
+ function processIdentitiesForTree(identitiesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
86
+ identitiesChildren.name = identitiesChildren.name + ' (' + ny + ')';
87
+ const unregisteredGrp = new Group(createId(), 'Identities[Unregistered]', 'Identities that are not registered');
88
+ const abcdGrp = new Group(createId(), 'Identities [A-D]', 'Identity name starts with A to D');
89
+ const efghGrp = new Group(createId(), 'Identities [E-H]', 'Identity name starts with E to H');
90
+ const ijklGrp = new Group(createId(), 'Identities [I-L]', 'Identity name starts with I to L');
91
+ const mnopGrp = new Group(createId(), 'Identities [M-P]', 'Identity name starts with M to P');
92
+ const qrstGrp = new Group(createId(), 'Identities [Q-T]', 'Identity name starts with Q to T');
93
+ const uvwxGrp = new Group(createId(), 'Identities [U-X]', 'Identity name starts with U to X');
94
+ const yzGrp = new Group(createId(), 'Identities [Y-Z]', 'Identity name starts with Y and Z');
95
+ const oneTo9Grp = new Group(createId(), 'Identities [1-9]', 'Identity name starts with 0 to 9');
96
+ const specialCharGrp = new Group(createId(), 'Identities [others]', 'Identity name starts with special characters');
97
+ for (let j = nx; j < ny; j++) {
98
+ const endpoint = new Identity();
99
+ endpoint.rootNode = 'Yes';
100
+ endpoint.id = createId();
101
+ endpoint.uuid = endpoints[j].id;
102
+ endpoint.name = endpoints[j].name;
103
+ endpoint.online = endpoints[j].hasApiSession === true ? 'Yes' : 'No';
104
+ endpoint.type = 'Identity';
105
+ endpoint.status = endpoints[j].osRelease !== null ? 'Registered' : 'Not Registered';
106
+ if (endpoints[j].osRelease === null && endpoints[j].type && endpoints[j].type.includes('browzer')) {
107
+ endpoint.status = 'Registered';
108
+ // endpoint.type = 'Browzer Endpoint';
109
+ }
110
+ endpoint.os = endpoints[j].os;
111
+ const cha = endpoint.name.charAt(0).toLowerCase();
112
+ if (endpoint.status === 'Not Registered') {
113
+ unregisteredGrp.children.push(endpoint);
114
+ }
115
+ else if (cha === 'a' || cha === 'b' || cha === 'c' || cha === 'd') {
116
+ abcdGrp.children.push(endpoint);
117
+ }
118
+ else if (cha === 'e' || cha === 'f' || cha === 'g' || cha === 'h') {
119
+ efghGrp.children.push(endpoint);
120
+ }
121
+ else if (cha === 'i' || cha === 'j' || cha === 'k' || cha === 'l') {
122
+ ijklGrp.children.push(endpoint);
123
+ }
124
+ else if (cha === 'm' || cha === 'n' || cha === 'o' || cha === 'p') {
125
+ mnopGrp.children.push(endpoint);
126
+ }
127
+ else if (cha === 'q' || cha === 'r' || cha === 's' || cha === 't') {
128
+ qrstGrp.children.push(endpoint);
129
+ }
130
+ else if (cha === 'u' || cha === 'v' || cha === 'w' || cha === 'x') {
131
+ uvwxGrp.children.push(endpoint);
132
+ }
133
+ else if (cha === 'y' || cha === 'z') {
134
+ yzGrp.children.push(endpoint);
135
+ }
136
+ else if (cha === '0' ||
137
+ cha === '1' ||
138
+ cha === '2' ||
139
+ cha === '3' ||
140
+ cha === '4' ||
141
+ cha === '5' ||
142
+ cha === '6' ||
143
+ cha === '7' ||
144
+ cha === '8' ||
145
+ cha === '9') {
146
+ oneTo9Grp.children.push(endpoint);
147
+ }
148
+ else {
149
+ specialCharGrp.children.push(endpoint);
150
+ }
151
+ } // end of main for loop
152
+ if (unregisteredGrp.children.length > 0) {
153
+ unregisteredGrp.children.sort(function (a, b) {
154
+ return a.name.localeCompare(b.name);
155
+ });
156
+ unregisteredGrp.name = unregisteredGrp.name + '(' + unregisteredGrp.children.length + ')';
157
+ identitiesChildren.children.push(unregisteredGrp);
158
+ }
159
+ if (abcdGrp.children.length > 0) {
160
+ abcdGrp.children.sort(function (a, b) {
161
+ return a.name.localeCompare(b.name);
162
+ });
163
+ abcdGrp.name = abcdGrp.name + ' (' + abcdGrp.children.length + ')';
164
+ identitiesChildren.children.push(abcdGrp);
165
+ }
166
+ if (efghGrp.children.length > 0) {
167
+ efghGrp.children.sort(function (a, b) {
168
+ return a.name.localeCompare(b.name);
169
+ });
170
+ efghGrp.name = efghGrp.name + ' (' + efghGrp.children.length + ')';
171
+ identitiesChildren.children.push(efghGrp);
172
+ }
173
+ if (ijklGrp.children.length > 0) {
174
+ ijklGrp.children.sort(function (a, b) {
175
+ return a.name.localeCompare(b.name);
176
+ });
177
+ ijklGrp.name = ijklGrp.name + ' (' + ijklGrp.children.length + ')';
178
+ identitiesChildren.children.push(ijklGrp);
179
+ }
180
+ if (mnopGrp.children.length > 0) {
181
+ mnopGrp.children.sort(function (a, b) {
182
+ return a.name.localeCompare(b.name);
183
+ });
184
+ mnopGrp.name = mnopGrp.name + ' (' + mnopGrp.children.length + ')';
185
+ identitiesChildren.children.push(mnopGrp);
186
+ }
187
+ if (qrstGrp.children.length > 0) {
188
+ qrstGrp.children.sort(function (a, b) {
189
+ return a.name.localeCompare(b.name);
190
+ });
191
+ qrstGrp.name = qrstGrp.name + ' (' + qrstGrp.children.length + ')';
192
+ identitiesChildren.children.push(qrstGrp);
193
+ }
194
+ if (uvwxGrp.children.length > 0) {
195
+ uvwxGrp.children.sort(function (a, b) {
196
+ return a.name.localeCompare(b.name);
197
+ });
198
+ uvwxGrp.name = uvwxGrp.name + ' (' + uvwxGrp.children.length + ')';
199
+ identitiesChildren.children.push(uvwxGrp);
200
+ }
201
+ if (yzGrp.children.length > 0) {
202
+ yzGrp.children.sort(function (a, b) {
203
+ return a.name.localeCompare(b.name);
204
+ });
205
+ yzGrp.name = yzGrp.name + ' (' + yzGrp.children.length + ')';
206
+ identitiesChildren.children.push(yzGrp);
207
+ }
208
+ if (specialCharGrp.children.length > 0) {
209
+ specialCharGrp.name = specialCharGrp.name + ' (' + specialCharGrp.children.length + ')';
210
+ identitiesChildren.children.push(specialCharGrp);
211
+ }
212
+ if (oneTo9Grp.children.length > 0 && oneTo9Grp.children.length <= 100) {
213
+ oneTo9Grp.children.sort(function (a, b) {
214
+ return a.name.localeCompare(b.name);
215
+ });
216
+ oneTo9Grp.name = oneTo9Grp.name + ' (' + oneTo9Grp.children.length + ')';
217
+ identitiesChildren.children.push(oneTo9Grp);
218
+ }
219
+ else if (oneTo9Grp.children.length > 100) {
220
+ oneTo9Grp.children.sort(function (a, b) {
221
+ return a.name.localeCompare(b.name);
222
+ });
223
+ for (let i = 0; i < oneTo9Grp.children.length; i++) {
224
+ const lastElement = i + 80 < oneTo9Grp.children.length ? i + 80 : oneTo9Grp.children.length - 1;
225
+ const nameS = 'Identities [' +
226
+ oneTo9Grp.children[i].name.substring(0, 4) +
227
+ '-' +
228
+ oneTo9Grp.children[lastElement].name.substring(0, 4) +
229
+ ']';
230
+ const chld = new Group(createId(), nameS, 'Identity name starts with ' +
231
+ oneTo9Grp.children[i].name.substring(0, 4) +
232
+ ' To ' +
233
+ oneTo9Grp.children[lastElement].name.substring(0, 4));
234
+ for (let j = i; j < lastElement; j++) {
235
+ chld.children.push(oneTo9Grp.children[j]);
236
+ }
237
+ chld.name = chld.name + ' (' + chld.children.length + ')';
238
+ identitiesChildren.children.push(chld);
239
+ i = i + 80;
240
+ }
241
+ }
242
+ return identitiesChildren;
243
+ }
244
+ function processServicePoliciesForTree(servicePolicyChildren, edgerouters, identities, servicePolicies, services, edgeRouterPolicies, nx, ny) {
245
+ const bindGrp = new Group(createId(), 'BindPolicies', 'Bind Service Policy');
246
+ const dialGrp = new Group(createId(), 'DialPolicies', 'Dial Service Policy');
247
+ servicePolicies.forEach((sp) => {
248
+ const spolicy = new ServicePolicy();
249
+ spolicy.id = createId();
250
+ spolicy.uuid = sp.id;
251
+ spolicy.name = sp.name;
252
+ spolicy.type = 'ServicePolicy';
253
+ spolicy.rootNode = 'Yes';
254
+ if (sp.type === 'Bind') {
255
+ bindGrp.children.push(spolicy);
256
+ }
257
+ else {
258
+ dialGrp.children.push(spolicy);
259
+ }
260
+ });
261
+ bindGrp.name = bindGrp.name + '(' + bindGrp.children.length + ')';
262
+ servicePolicyChildren.children.push(bindGrp);
263
+ dialGrp.name = dialGrp.name + '(' + dialGrp.children.length + ')';
264
+ servicePolicyChildren.children.push(dialGrp);
265
+ servicePolicyChildren.name = servicePolicyChildren.name + ' (' + (bindGrp.children.length + dialGrp.children.length) + ')';
266
+ return servicePolicyChildren;
267
+ }
268
+ function serviceGrouping(servicesChildren, servicestree) {
269
+ const protocolRDPGrp = new Group(createId(), 'Services [protocol-RDP]', 'Services created for RDP protocol');
270
+ const protocolHTTPSGrp = new Group(createId(), 'Services [protocol-HTTPS]', 'Service created for HTTPS protocol');
271
+ const protocolHTTPGrp = new Group(createId(), 'Services [protocol-HTTP]', 'Service created for HTTP protocol');
272
+ const protocolFTPGrp = new Group(createId(), 'Services [protocol-FTP]', 'Service created for FTP protocol');
273
+ const abcdGrp = new Group(createId(), 'Services [A-D]', 'Service name starts with A to D');
274
+ const efghGrp = new Group(createId(), 'Services [E-H]', 'Service name starts with E to H');
275
+ const ijklGrp = new Group(createId(), 'Services [I-L]', 'Service name starts with I to L');
276
+ const mnopGrp = new Group(createId(), 'Services [M-P]', 'Service name starts with M to P');
277
+ const qrstGrp = new Group(createId(), 'Services [Q-T]', 'Service name starts with Q to T');
278
+ const uvwxGrp = new Group(createId(), 'Services [U-X]', 'Service name starts with U to X');
279
+ const yzGrp = new Group(createId(), 'Services [Y-Z]', 'Service name starts with Y and Z');
280
+ const oneTo9Grp = new Group(createId(), 'Services [1-9]', 'Service name starts with 0 to 9');
281
+ const specialCharGrp = new Group(createId(), 'Services [others]', 'Service name starts with special characters');
282
+ for (let i = 0; i < servicestree.length; i++) {
283
+ const serviceobj = servicestree[i];
284
+ const cha = serviceobj.name.charAt(0).toLowerCase();
285
+ if (serviceobj.protocol === 'rdp') {
286
+ protocolRDPGrp.children.push(serviceobj);
287
+ }
288
+ else if (serviceobj.protocol === 'https') {
289
+ protocolHTTPSGrp.children.push(serviceobj);
290
+ }
291
+ else if (serviceobj.protocol === 'http') {
292
+ protocolHTTPGrp.children.push(serviceobj);
293
+ }
294
+ else if (serviceobj.protocol === 'ftp') {
295
+ protocolFTPGrp.children.push(serviceobj);
296
+ }
297
+ else if (cha === 'a' || cha === 'b' || cha === 'c' || cha === 'd') {
298
+ abcdGrp.children.push(serviceobj);
299
+ }
300
+ else if (cha === 'e' || cha === 'f' || cha === 'g' || cha === 'h') {
301
+ efghGrp.children.push(serviceobj);
302
+ }
303
+ else if (cha === 'i' || cha === 'j' || cha === 'k' || cha === 'l') {
304
+ ijklGrp.children.push(serviceobj);
305
+ }
306
+ else if (cha === 'm' || cha === 'n' || cha === 'o' || cha === 'p') {
307
+ mnopGrp.children.push(serviceobj);
308
+ }
309
+ else if (cha === 'q' || cha === 'r' || cha === 's' || cha === 't') {
310
+ qrstGrp.children.push(serviceobj);
311
+ }
312
+ else if (cha === 'u' || cha === 'v' || cha === 'w' || cha === 'x') {
313
+ uvwxGrp.children.push(serviceobj);
314
+ }
315
+ else if (cha === 'y' || cha === 'z') {
316
+ yzGrp.children.push(serviceobj);
317
+ }
318
+ else if (cha === '0' ||
319
+ cha === '1' ||
320
+ cha === '2' ||
321
+ cha === '3' ||
322
+ cha === '4' ||
323
+ cha === '5' ||
324
+ cha === '6' ||
325
+ cha === '7' ||
326
+ cha === '8' ||
327
+ cha === '9') {
328
+ oneTo9Grp.children.push(serviceobj);
329
+ }
330
+ else {
331
+ specialCharGrp.children.push(serviceobj);
332
+ }
333
+ } // end main for loop
334
+ if (protocolRDPGrp.children.length > 0) {
335
+ protocolRDPGrp.children.sort(function (a, b) {
336
+ return a.name.localeCompare(b.name);
337
+ });
338
+ protocolRDPGrp.name = protocolRDPGrp.name + '(' + protocolRDPGrp.children.length + ')';
339
+ servicesChildren.children.push(protocolRDPGrp);
340
+ }
341
+ if (specialCharGrp.children.length > 0) {
342
+ specialCharGrp.name = specialCharGrp.name + '(' + specialCharGrp.children.length + ')';
343
+ servicesChildren.children.push(specialCharGrp);
344
+ }
345
+ if (protocolHTTPSGrp.children.length > 0) {
346
+ protocolHTTPSGrp.children.sort(function (a, b) {
347
+ return a.name.localeCompare(b.name);
348
+ });
349
+ protocolHTTPSGrp.name = protocolHTTPSGrp.name + '(' + protocolHTTPSGrp.children.length + ')';
350
+ servicesChildren.children.push(protocolHTTPSGrp);
351
+ }
352
+ if (protocolHTTPGrp.children.length > 0) {
353
+ protocolHTTPGrp.children.sort(function (a, b) {
354
+ return a.name.localeCompare(b.name);
355
+ });
356
+ protocolHTTPGrp.name = protocolHTTPGrp.name + '(' + protocolHTTPGrp.children.length + ')';
357
+ servicesChildren.children.push(protocolHTTPGrp);
358
+ }
359
+ if (protocolFTPGrp.children.length > 0) {
360
+ protocolFTPGrp.children.sort(function (a, b) {
361
+ return a.name.localeCompare(b.name);
362
+ });
363
+ protocolFTPGrp.name = protocolFTPGrp.name + '(' + protocolFTPGrp.children.length + ')';
364
+ servicesChildren.children.push(protocolFTPGrp);
365
+ }
366
+ if (abcdGrp.children.length > 0) {
367
+ abcdGrp.children.sort(function (a, b) {
368
+ return a.name.localeCompare(b.name);
369
+ });
370
+ abcdGrp.name = abcdGrp.name + '(' + abcdGrp.children.length + ')';
371
+ servicesChildren.children.push(abcdGrp);
372
+ }
373
+ if (efghGrp.children.length > 0) {
374
+ efghGrp.children.sort(function (a, b) {
375
+ return a.name.localeCompare(b.name);
376
+ });
377
+ efghGrp.name = efghGrp.name + '(' + efghGrp.children.length + ')';
378
+ servicesChildren.children.push(efghGrp);
379
+ }
380
+ if (ijklGrp.children.length > 0) {
381
+ ijklGrp.children.sort(function (a, b) {
382
+ return a.name.localeCompare(b.name);
383
+ });
384
+ ijklGrp.name = ijklGrp.name + '(' + ijklGrp.children.length + ')';
385
+ servicesChildren.children.push(ijklGrp);
386
+ }
387
+ if (mnopGrp.children.length > 0) {
388
+ mnopGrp.children.sort(function (a, b) {
389
+ return a.name.localeCompare(b.name);
390
+ });
391
+ mnopGrp.name = mnopGrp.name + '(' + mnopGrp.children.length + ')';
392
+ servicesChildren.children.push(mnopGrp);
393
+ }
394
+ if (qrstGrp.children.length > 0) {
395
+ qrstGrp.children.sort(function (a, b) {
396
+ return a.name.localeCompare(b.name);
397
+ });
398
+ qrstGrp.name = qrstGrp.name + '(' + qrstGrp.children.length + ')';
399
+ servicesChildren.children.push(qrstGrp);
400
+ }
401
+ if (uvwxGrp.children.length > 0) {
402
+ uvwxGrp.children.sort(function (a, b) {
403
+ return a.name.localeCompare(b.name);
404
+ });
405
+ uvwxGrp.name = uvwxGrp.name + '(' + uvwxGrp.children.length + ')';
406
+ servicesChildren.children.push(uvwxGrp);
407
+ }
408
+ if (yzGrp.children.length > 0) {
409
+ yzGrp.children.sort(function (a, b) {
410
+ return a.name.localeCompare(b.name);
411
+ });
412
+ yzGrp.name = yzGrp.name + '(' + yzGrp.children.length + ')';
413
+ servicesChildren.children.push(yzGrp);
414
+ }
415
+ if (oneTo9Grp.children.length > 0) {
416
+ oneTo9Grp.children.sort(function (a, b) {
417
+ return a.name.localeCompare(b.name);
418
+ });
419
+ oneTo9Grp.name = oneTo9Grp.name + '(' + oneTo9Grp.children.length + ')';
420
+ servicesChildren.children.push(oneTo9Grp);
421
+ }
422
+ servicesChildren.name = servicesChildren.name + '(' + servicestree.length + ')';
423
+ return servicesChildren;
424
+ }
425
+ function processServicesForTree(servicesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
426
+ const servicestree = [];
427
+ for (let i = nx; i < ny; i++) {
428
+ const serviceobj = new Service();
429
+ serviceobj.id = createId();
430
+ serviceobj.name = services[i].name;
431
+ serviceobj.uuid = services[i].id;
432
+ serviceobj.type = 'Service';
433
+ serviceobj.rootNode = 'Yes';
434
+ const attributeswithName = [];
435
+ attributeswithName.push('@' + services[i].name);
436
+ services[i] && services[i].roleAttributes && services[i].roleAttributes.find((srattr) => {
437
+ attributeswithName.push(srattr);
438
+ });
439
+ let isItRDPProtocolAttr = false;
440
+ let isItHTTPProtocolAttr = false;
441
+ let isItHTTPSProtocolAttr = false;
442
+ let isItFTPProtocolAttr = false;
443
+ for (let k = 0; k < attributeswithName.length; k++) {
444
+ const attrOb = new Attribute();
445
+ attrOb.id = createId();
446
+ attrOb.name = attributeswithName[k];
447
+ attrOb.type = 'Service Attribute';
448
+ const attName = attributeswithName[k].toLowerCase();
449
+ if (isItRDPProtocolAttr === false && attName.includes('rdp')) {
450
+ serviceobj.protocol = 'rdp';
451
+ isItRDPProtocolAttr = true;
452
+ }
453
+ if (isItHTTPSProtocolAttr === false && attName.includes('https')) {
454
+ serviceobj.protocol = 'https';
455
+ isItHTTPSProtocolAttr = true;
456
+ }
457
+ if (isItHTTPSProtocolAttr === false && isItHTTPProtocolAttr === false && attName.includes('http')) {
458
+ serviceobj.protocol = 'http';
459
+ isItHTTPProtocolAttr = true;
460
+ }
461
+ if (isItFTPProtocolAttr === false && attName.includes('ftp')) {
462
+ serviceobj.protocol = 'ftp';
463
+ isItFTPProtocolAttr = true;
464
+ }
465
+ } // end inner for loop
466
+ servicestree.push(serviceobj);
467
+ } // end for loop
468
+ return serviceGrouping(servicesChildren, servicestree);
469
+ } // end of processServicesForTree
470
+ function processEdgeRouterPoliciesForTree(edgeRouterPoliciesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
471
+ for (let i = nx; i < ny; i++) {
472
+ const erpolicy = new ERPolicy();
473
+ erpolicy.id = createId();
474
+ erpolicy.uuid = edgeRouterPolicies[i].id;
475
+ erpolicy.name = edgeRouterPolicies[i].name;
476
+ erpolicy.type = 'Router Policy';
477
+ erpolicy.rootNode = 'Yes';
478
+ edgeRouterPoliciesChildren.children.push(erpolicy);
479
+ } // end of main for loop
480
+ return edgeRouterPoliciesChildren;
481
+ } // end
482
+ function processServiceEdgeRouterPoliciesForTree(serviceEdgeRouterPoliciesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, serviceEdgeRouterPolicies, nx, ny) {
483
+ for (let i = nx; i < ny; i++) {
484
+ const serviceerpolicy = new ServiceERPolicy();
485
+ serviceerpolicy.id = createId();
486
+ serviceerpolicy.uuid = serviceEdgeRouterPolicies[i].id;
487
+ serviceerpolicy.name = serviceEdgeRouterPolicies[i].name;
488
+ serviceerpolicy.type = 'Service Router Policy';
489
+ serviceerpolicy.rootNode = 'Yes';
490
+ serviceEdgeRouterPoliciesChildren.children.push(serviceerpolicy);
491
+ } // end of main for loop
492
+ return serviceEdgeRouterPoliciesChildren;
493
+ } // end
494
+ function processEdgeroutersForTree(edgerouterChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
495
+ for (let i = nx; i < ny; i++) {
496
+ const erOb = new ERouter();
497
+ erOb.id = createId();
498
+ const er = edgerouters[i];
499
+ if (er) {
500
+ erOb.uuid = er.id;
501
+ erOb.name = er.name;
502
+ erOb.verified = er.isVerified ? 'Yes' : 'No';
503
+ //erOb.version = er.productVersion;
504
+ erOb.online = er.isOnline ? 'Yes' : 'No';
505
+ erOb.disabled = er.disabled ? 'Yes' : 'No';
506
+ erOb.type = 'Edge Router';
507
+ erOb.rootNode = 'Yes';
508
+ if (er.hostId !== null) {
509
+ // erOb.provider = findProviderNameForHostId(er.hostId);
510
+ }
511
+ else if (er.status === 'ERROR') {
512
+ erOb.provider = 'N/A';
513
+ }
514
+ else {
515
+ erOb.provider = 'Private DC';
516
+ }
517
+ edgerouterChildren.children.push(erOb);
518
+ }
519
+ } // end main for loop
520
+ return edgerouterChildren;
521
+ }
522
+ // createId() generates node Id 1,2,3,4,5 for the following five nodes. this id is used to search capability.
523
+ let appwansChildren = new Children();
524
+ appwansChildren.id = createId();
525
+ appwansChildren.name = 'Service Policies';
526
+ let servicesChildren = new Children();
527
+ servicesChildren.id = createId();
528
+ servicesChildren.name = 'Services';
529
+ let endpointsChildren = new Children();
530
+ endpointsChildren.id = createId();
531
+ endpointsChildren.name = 'Identities';
532
+ let edgerouterChildren = new Children();
533
+ edgerouterChildren.id = createId();
534
+ edgerouterChildren.name = 'Edge Routers';
535
+ let edgeRouterPoliciesChildren = new Children();
536
+ edgeRouterPoliciesChildren.id = createId();
537
+ edgeRouterPoliciesChildren.name = 'Edge Router Policies';
538
+ let serviceEdgeRouterPolicesChildren = new Children();
539
+ serviceEdgeRouterPolicesChildren.id = createId();
540
+ serviceEdgeRouterPolicesChildren.name = 'Service Edge Router Policies';
541
+ servicesChildren = processServicesForTree(servicesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, services.length);
542
+ edgerouterChildren = processEdgeroutersForTree(edgerouterChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, edgerouters.length);
543
+ if (edgerouterChildren) {
544
+ edgerouterChildren.name = edgerouterChildren.name + ' (' + edgerouterChildren.children.length + ')';
545
+ }
546
+ appwansChildren = processServicePoliciesForTree(appwansChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, appwans.length);
547
+ edgeRouterPoliciesChildren = processEdgeRouterPoliciesForTree(edgeRouterPoliciesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, edgeRouterPolicies.length);
548
+ if (edgeRouterPoliciesChildren) {
549
+ edgeRouterPoliciesChildren.name =
550
+ 'Edge Router Policies (' + edgeRouterPoliciesChildren.children.length + ')';
551
+ }
552
+ endpointsChildren = processIdentitiesForTree(endpointsChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, endpoints.length);
553
+ //serviceEdgeRouterPolicies
554
+ serviceEdgeRouterPolicesChildren = processServiceEdgeRouterPoliciesForTree(serviceEdgeRouterPolicesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, serviceEdgeRouterPolicies, 0, serviceEdgeRouterPolicies.length);
555
+ if (edgeRouterPoliciesChildren) {
556
+ serviceEdgeRouterPolicesChildren.name =
557
+ 'Service Edge Router Policies (' + serviceEdgeRouterPolicesChildren.children.length + ')';
558
+ }
559
+ rootJson.children.push(appwansChildren);
560
+ rootJson.children.push(servicesChildren);
561
+ rootJson.children.push(endpointsChildren);
562
+ rootJson.children.push(edgerouterChildren);
563
+ rootJson.children.push(edgeRouterPoliciesChildren);
564
+ rootJson.children.push(serviceEdgeRouterPolicesChildren);
565
+ rootJson.lastId = uniqId;
566
+ return rootJson;
567
+ }
568
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerHelper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
569
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerHelper, providedIn: 'root' }); }
570
+ }
571
+ export { NetworkVisualizerHelper };
572
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerHelper, decorators: [{
573
+ type: Injectable,
574
+ args: [{
575
+ providedIn: 'root',
576
+ }]
577
+ }] });
578
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy92aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci9uZXR3b3JrLXZpc3VhbGl6ZXIuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDLE1BQU0sT0FBTyxRQUFRO0lBa0JqQjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxPQUFPO0lBa0JoQjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxLQUFLO0lBT2QsWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFTdEI7UUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxH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R0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO29CQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDakM7cUJBQU0sSUFDSCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRyxFQUNiO29CQUNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEs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RyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO29CQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDbkM7cUJBQU0sSUFDSCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRyxFQUNiO29CQUNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FB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LE1BQU0sR0FBRyxHQUFHLENBQUM7U0FDakc7UUFFRCxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25ELFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFekIsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzsrR0F2cUJRLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRnBCLE1BQU07O1NBRVQsdUJBQXVCOzRGQUF2Qix1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIElkZW50aXR5IHtcbiAgICBpZDtcbiAgICB1dWlkO1xuICAgIG5hbWU7XG4gICAgc3RhdHVzO1xuICAgIHR5cGU7XG4gICAgcm9vdE5vZGU7XG4gICAgc2VydmVyRWdyZXNzUHJvdG9jb2w7XG4gICAgc2VydmVyRWdyZXNzSG9zdDtcbiAgICBzZXJ2ZXJFZ3Jlc3NQb3J0O1xuICAgIHBvc3R1cmVDaGVja3M7XG4gICAgZXZlbnRzO1xuICAgIG9zO1xuICAgIHV0aWxpemF0aW9uO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuICAgIG9ubGluZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VydmljZSB7XG4gICAgaWQ7XG4gICAgdXVpZDtcbiAgICBuYW1lO1xuICAgIGludGVyY2VwdF9ob3N0O1xuICAgIGludGVyY2VwdF9wb3J0O1xuICAgIGVuY3J5cHRlZDtcbiAgICByb290Tm9kZTtcbiAgICBzZXJ2ZXJFZ3Jlc3NIb3N0O1xuICAgIHNlcnZlckVncmVzc1BvcnQ7XG4gICAgc3RhdHVzO1xuICAgIHByb3RvY29sO1xuICAgIHR5cGU7XG4gICAgY2hpbGRyZW47XG4gICAgYXR0cmlidXRlcztcbiAgICB1dGlsaXphdGlvbjtcbiAgICBjb250ZXh0TWVudTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR3JvdXAge1xuICAgIGlkO1xuICAgIG5hbWU7XG4gICAgdHlwZTtcbiAgICBncm91cDtcbiAgICBjaGlsZHJlbjtcblxuICAgIGNvbnN0cnVjdG9yKGlkdiwgcywgZykge1xuICAgICAgICB0aGlzLmlkID0gaWR2O1xuICAgICAgICB0aGlzLm5hbWUgPSBzO1xuICAgICAgICB0aGlzLmdyb3VwID0gZztcbiAgICAgICAgdGhpcy50eXBlID0gJ0dyb3VwJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZpY2VQb2xpY3kge1xuICAgIGlkO1xuICAgIHV1aWQ7XG4gICAgbmFtZTtcbiAgICB0eXBlO1xuICAgIHJvb3ROb2RlO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUgPSAnWWVzJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGUge1xuICAgIGlkO1xuICAgIG5hbWU7XG4gICAgdHlwZTtcbiAgICBjaGlsZHJlbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRVJQb2xpY3kge1xuICAgIGlkO1xuICAgIHV1aWQ7XG4gICAgbmFtZTtcbiAgICBzdGF0dXM7XG4gICAgc2l6ZTtcbiAgICB0eXBlO1xuICAgIHJvb3ROb2RlO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUgPSAnWWVzJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlRVJQb2xpY3kge1xuICAgIGlkO1xuICAgIHV1aWQ7XG4gICAgbmFtZTtcbiAgICBzdGF0dXM7XG4gICAgc2l6ZTtcbiAgICB0eXBlO1xuICAgIHJvb3ROb2RlO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUgPSAnWWVzJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFUm91dGVyIHtcbiAgICBpZDtcbiAgICB1dWlkO1xuICAgIG5hbWU7XG4gICAgdmVyaWZpZWQ7XG4gICAgc2l6ZTtcbiAgICB0eXBlO1xuICAgIHByb3ZpZGVyO1xuICAgIHJvb3ROb2RlO1xuICAgIHNlcnZlckVncmVzc1Byb3RvY29sO1xuICAgIHNlcnZlckVncmVzc0hvc3Q7XG4gICAgc2VydmVyRWdyZXNzUG9ydDtcbiAgICBjaGlsZHJlbjtcbiAgICB1dGlsaXphdGlvbjtcbiAgICBjb250ZXh0TWVudTtcbiAgICBvbmxpbmU7XG4gICAgZGlzYWJsZWQ7XG4gICAgdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hpbGRyZW4ge1xuICAgIGlkO1xuICAgIG5hbWU7XG4gICAgc3RhdHVzO1xuICAgIHNpemU7XG4gICAgdHlwZTtcbiAgICBjaGlsZHJlbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnR5cGUgPSAnQ2hpbGRyZW4nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOZXR3b3JrVmlzdWFsaXplckhlbHBlciB7XG5cbiAgICBwdWJsaWMgZ2V0UmVzb3VyY2VUcmVlT2JqKFxuICAgICAgICBuZXR3b3JrTmFtZSxcbiAgICAgICAgbmV0d29ya1N0YXR1cyxcbiAgICAgICAgc2VydmljZXMsXG4gICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgYXBwd2FucyxcbiAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgLy8gbmV0d29ya1Byb2R1Y3RWZXJzaW9uLFxuICAgICAgICB1bmlxSWQsXG4gICAgICAgIGxvZ2dlclxuICAgICkge1xuICAgICAgICBmdW5jdGlvbiBjcmVhdGVJZCgpIHtcbiAgICAgICAgICAgICsrdW5pcUlkO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXFJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsYXNzIFJvb3RKc29uIHtcbiAgICAgICAgICAgIGlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIG5hbWU7XG4gICAgICAgICAgICBsYXN0SWQgPSAwO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgICAgICAgICB0eXBlID0gJ05ldHdvcmsnO1xuICAgICAgICAgICAvLyB2ZXJzaW9uID0gbmV0d29ya1Byb2R1Y3RWZXJzaW9uO1xuICAgICAgICAgICAgc3RhdHVzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9vdEpzb24gPSBuZXcgUm9vdEpzb24oKTtcbiAgICAgICAgcm9vdEpzb24ubmFtZSA9ICdOZXR3b3JrJztcbiAgICAgICAgcm9vdEpzb24uc3RhdHVzID0gJ1Byb3Zpc2lvbmVkJztcblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSWRlbnRpdGllc0ZvclRyZWUoXG4gICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIG54LFxuICAgICAgICAgICAgbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4ubmFtZSA9IGlkZW50aXRpZXNDaGlsZHJlbi5uYW1lICsgJyAoJyArIG55ICsgJyknO1xuICAgICAgICAgICAgY29uc3QgdW5yZWdpc3RlcmVkR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAgICAgJ0lkZW50aXRpZXNbVW5yZWdpc3RlcmVkXScsXG4gICAgICAgICAgICAgICAgJ0lkZW50aXRpZXMgdGhhdCBhcmUgbm90IHJlZ2lzdGVyZWQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgYWJjZEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbQS1EXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIEEgdG8gRCcpO1xuICAgICAgICAgICAgY29uc3QgZWZnaEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbRS1IXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIEUgdG8gSCcpO1xuICAgICAgICAgICAgY29uc3QgaWprbEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbSS1MXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIEkgdG8gTCcpO1xuICAgICAgICAgICAgY29uc3QgbW5vcEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbTS1QXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIE0gdG8gUCcpO1xuICAgICAgICAgICAgY29uc3QgcXJzdEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbUS1UXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIFEgdG8gVCcpO1xuICAgICAgICAgICAgY29uc3QgdXZ3eEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbVS1YXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIFUgdG8gWCcpO1xuICAgICAgICAgICAgY29uc3QgeXpHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ0lkZW50aXRpZXMgW1ktWl0nLCAnSWRlbnRpdHkgbmFtZSBzdGFydHMgd2l0aCBZIGFuZCBaJyk7XG4gICAgICAgICAgICBjb25zdCBvbmVUbzlHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ0lkZW50aXRpZXMgWzEtOV0nLCAnSWRlbnRpdHkgbmFtZSBzdGFydHMgd2l0aCAwIHRvIDknKTtcbiAgICAgICAgICAgIGNvbnN0IHNwZWNpYWxDaGFyR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAgICAgJ0lkZW50aXRpZXMgW290aGVyc10nLFxuICAgICAgICAgICAgICAgICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycydcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSBueDsgaiA8IG55OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnJvb3ROb2RlID0gJ1llcyc7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQuaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnV1aWQgPSBlbmRwb2ludHNbal0uaWQ7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQubmFtZSA9IGVuZHBvaW50c1tqXS5uYW1lO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50Lm9ubGluZSA9IGVuZHBvaW50c1tqXS5oYXNBcGlTZXNzaW9uID09PSB0cnVlID8gJ1llcycgOiAnTm8nO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnN0YXR1cyA9IGVuZHBvaW50c1tqXS5vc1JlbGVhc2UgIT09IG51bGwgPyAnUmVnaXN0ZXJlZCcgOiAnTm90IFJlZ2lzdGVyZWQnO1xuICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludHNbal0ub3NSZWxlYXNlID09PSBudWxsICYmIGVuZHBvaW50c1tqXS50eXBlICYmIGVuZHBvaW50c1tqXS50eXBlLmluY2x1ZGVzKCdicm93emVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuc3RhdHVzID0gJ1JlZ2lzdGVyZWQnO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludC50eXBlID0gJ0Jyb3d6ZXIgRW5kcG9pbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbmRwb2ludC5vcyA9IGVuZHBvaW50c1tqXS5vcztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYSA9IGVuZHBvaW50Lm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50LnN0YXR1cyA9PT0gJ05vdCBSZWdpc3RlcmVkJykge1xuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgICAgICBhYmNkR3JwLmNoaWxkcmVuLnB1c2goZW5kcG9pbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAnZScgfHwgY2hhID09PSAnZicgfHwgY2hhID09PSAnZycgfHwgY2hhID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZWZnaEdycC5jaGlsZHJlbi5wdXNoKGVuZHBvaW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ2knIHx8IGNoYSA9PT0gJ2onIHx8IGNoYSA9PT0gJ2snIHx8IGNoYSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlqa2xHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICBtbm9wR3JwLmNoaWxkcmVuLnB1c2goZW5kcG9pbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAncScgfHwgY2hhID09PSAncicgfHwgY2hhID09PSAncycgfHwgY2hhID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcXJzdEdycC5jaGlsZHJlbi5wdXNoKGVuZHBvaW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ3UnIHx8IGNoYSA9PT0gJ3YnIHx8IGNoYSA9PT0gJ3cnIHx8IGNoYSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgICAgIHV2d3hHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5wdXNoKGVuZHBvaW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICcwJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICczJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc0JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc1JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc2JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc3JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc4JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc5J1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3BlY2lhbENoYXJHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBlbmQgb2YgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgICAgICBpZiAodW5yZWdpc3RlcmVkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRHcnAubmFtZSA9IHVucmVnaXN0ZXJlZEdycC5uYW1lICsgJygnICsgdW5yZWdpc3RlcmVkR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaCh1bnJlZ2lzdGVyZWRHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFiY2RHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhYmNkR3JwLm5hbWUgPSBhYmNkR3JwLm5hbWUgKyAnICgnICsgYWJjZEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goYWJjZEdycCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlZmdoR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWZnaEdycC5uYW1lID0gZWZnaEdycC5uYW1lICsgJyAoJyArIGVmZ2hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGVmZ2hHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlqa2xHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpamtsR3JwLm5hbWUgPSBpamtsR3JwLm5hbWUgKyAnICgnICsgaWprbEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goaWprbEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW5vcEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbW5vcEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1ub3BHcnAubmFtZSA9IG1ub3BHcnAubmFtZSArICcgKCcgKyBtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChtbm9wR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChxcnN0R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcXJzdEdycC5uYW1lID0gcXJzdEdycC5uYW1lICsgJyAoJyArIHFyc3RHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHFyc3RHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHV2d3hHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB1dnd4R3JwLm5hbWUgPSB1dnd4R3JwLm5hbWUgKyAnICgnICsgdXZ3eEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2godXZ3eEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeXpHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHl6R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgeXpHcnAubmFtZSA9IHl6R3JwLm5hbWUgKyAnICgnICsgeXpHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHl6R3JwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNwZWNpYWxDaGFyR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsQ2hhckdycC5uYW1lID0gc3BlY2lhbENoYXJHcnAubmFtZSArICcgKCcgKyBzcGVjaWFsQ2hhckdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goc3BlY2lhbENoYXJHcnApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgb25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA8PSAxMDApIHtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAubmFtZSA9IG9uZVRvOUdycC5uYW1lICsgJyAoJyArIG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gob25lVG85R3JwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gaSArIDgwIDwgb25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA/IGkgKyA4MCA6IG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lUyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAnSWRlbnRpdGllcyBbJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW5baV0ubmFtZS5zdWJzdHJpbmcoMCwgNCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbltsYXN0RWxlbWVudF0ubmFtZS5zdWJzdHJpbmcoMCwgNCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ10nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGxkID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lkZW50aXR5IG5hbWUgc3RhcnRzIHdpdGggJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lVG85R3JwLmNoaWxkcmVuW2ldLm5hbWUuc3Vic3RyaW5nKDAsIDQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIFRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbltsYXN0RWxlbWVudF0ubmFtZS5zdWJzdHJpbmcoMCwgNClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBsYXN0RWxlbWVudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGxkLmNoaWxkcmVuLnB1c2gob25lVG85R3JwLmNoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGxkLm5hbWUgPSBjaGxkLm5hbWUgKyAnICgnICsgY2hsZC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGNobGQpO1xuICAgICAgICAgICAgICAgICAgICBpID0gaSArIDgwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGlkZW50aXRpZXNDaGlsZHJlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NTZXJ2aWNlUG9saWNpZXNGb3JUcmVlKFxuICAgICAgICAgICAgc2VydmljZVBvbGljeUNoaWxkcmVuLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICBpZGVudGl0aWVzLFxuICAgICAgICAgICAgc2VydmljZVBvbGljaWVzLFxuICAgICAgICAgICAgc2VydmljZXMsXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICBueCxcbiAgICAgICAgICAgIG55XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGJpbmRHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ0JpbmRQb2xpY2llcycsICdCaW5kIFNlcnZpY2UgUG9saWN5Jyk7XG4gICAgICAgICAgY29uc3QgZGlhbEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnRGlhbFBvbGljaWVzJywgJ0RpYWwgU2VydmljZSBQb2xpY3knKTtcblxuICAgICAgICAgIHNlcnZpY2VQb2xpY2llcy5mb3JFYWNoKCAoc3ApID0+IHtcblxuICAgICAgICAgICAgY29uc3Qgc3BvbGljeSA9IG5ldyBTZXJ2aWNlUG9saWN5KCk7XG4gICAgICAgICAgICAgICAgc3BvbGljeS5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgc3BvbGljeS51dWlkID0gc3AuaWQ7XG4gICAgICAgICAgICAgICAgc3BvbGljeS5uYW1lID0gc3AubmFtZTtcbiAgICAgICAgICAgICAgICBzcG9saWN5LnR5cGUgPSAnU2VydmljZVBvbGljeSc7XG4gICAgICAgICAgICAgICAgc3BvbGljeS5yb290Tm9kZSA9ICdZZXMnO1xuICAgICAgICAgICAgICAgIGlmKHNwLnR5cGU9PT0nQmluZCcpIHtcbiAgICAgICAgICAgICAgICAgIGJpbmRHcnAuY2hpbGRyZW4ucHVzaChzcG9saWN5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGlhbEdycC5jaGlsZHJlbi5wdXNoKHNwb2xpY3kpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gKTtcblxuICAgICAgICAgIGJpbmRHcnAubmFtZSA9IGJpbmRHcnAubmFtZSArICcoJysgYmluZEdycC5jaGlsZHJlbi5sZW5ndGggKycpJztcbiAgICAgICAgICBzZXJ2aWNlUG9saWN5Q2hpbGRyZW4uY2hpbGRyZW4ucHVzaChiaW5kR3JwKTtcbiAgICAgICAgICBkaWFsR3JwLm5hbWUgPSBkaWFsR3JwLm5hbWUgKyAnKCcrIGRpYWxHcnAuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgc2VydmljZVBvbGljeUNoaWxkcmVuLmNoaWxkcmVuLnB1c2goZGlhbEdycCk7XG4gICAgICAgICAgICBzZXJ2aWNlUG9saWN5Q2hpbGRyZW4ubmFtZSA9IHNlcnZpY2VQb2xpY3lDaGlsZHJlbi5uYW1lICsgJyAoJyArIChiaW5kR3JwLmNoaWxkcmVuLmxlbmd0aCArIGRpYWxHcnAuY2hpbGRyZW4ubGVuZ3RoKSArICcpJztcbiAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUG9saWN5Q2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzZXJ2aWNlR3JvdXBpbmcoc2VydmljZXNDaGlsZHJlbiwgc2VydmljZXN0cmVlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFJEUEdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgICAgICBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtUkRQXScsXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2VzIGNyZWF0ZWQgZm9yIFJEUCBwcm90b2NvbCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbEhUVFBTR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2VzIFtwcm90b2NvbC1IVFRQU10nLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFBTIHByb3RvY29sJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sSFRUUEdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgICAgICBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtSFRUUF0nLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFAgcHJvdG9jb2wnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2xGVFBHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtwcm90b2NvbC1GVFBdJywgJ1NlcnZpY2UgY3JlYXRlZCBmb3IgRlRQIHByb3RvY29sJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFiY2RHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtBLURdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBBIHRvIEQnKTtcbiAgICAgICAgICAgIGNvbnN0IGVmZ2hHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtFLUhdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBFIHRvIEgnKTtcbiAgICAgICAgICAgIGNvbnN0IGlqa2xHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtJLUxdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBJIHRvIEwnKTtcbiAgICAgICAgICAgIGNvbnN0IG1ub3BHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtNLVBdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBNIHRvIFAnKTtcbiAgICAgICAgICAgIGNvbnN0IHFyc3RHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtRLVRdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBRIHRvIFQnKTtcbiAgICAgICAgICAgIGNvbnN0IHV2d3hHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtVLVhdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBVIHRvIFgnKTtcbiAgICAgICAgICAgIGNvbnN0IHl6R3JwID0gbmV3IEdyb3VwKGNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbWS1aXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggWSBhbmQgWicpO1xuICAgICAgICAgICAgY29uc3Qgb25lVG85R3JwID0gbmV3IEdyb3VwKGNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbMS05XScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggMCB0byA5Jyk7XG4gICAgICAgICAgICBjb25zdCBzcGVjaWFsQ2hhckdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgICAgICBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlcyBbb3RoZXJzXScsXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcnZpY2VzdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VvYmogPSBzZXJ2aWNlc3RyZWVbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhID0gc2VydmljZW9iai5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdyZHAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdodHRwJykge1xuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdmdHAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgICAgICBhYmNkR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdlJyB8fCBjaGEgPT09ICdmJyB8fCBjaGEgPT09ICdnJyB8fCBjaGEgPT09ICdoJykge1xuICAgICAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdpJyB8fCBjaGEgPT09ICdqJyB8fCBjaGEgPT09ICdrJyB8fCBjaGEgPT09ICdsJykge1xuICAgICAgICAgICAgICAgICAgICBpamtsR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICBtbm9wR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdxJyB8fCBjaGEgPT09ICdyJyB8fCBjaGEgPT09ICdzJyB8fCBjaGEgPT09ICd0Jykge1xuICAgICAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd1JyB8fCBjaGEgPT09ICd2JyB8fCBjaGEgPT09ICd3JyB8fCBjaGEgPT09ICd4Jykge1xuICAgICAgICAgICAgICAgICAgICB1dnd4R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzAnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzEnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzInIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzMnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzQnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzYnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzcnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzgnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzknXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwZWNpYWxDaGFyR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBlbmQgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgICAgICBpZiAocHJvdG9jb2xSRFBHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xSRFBHcnAubmFtZSA9IHByb3RvY29sUkRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sUkRQR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcGVjaWFsQ2hhckdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbENoYXJHcnAubmFtZSA9IHNwZWNpYWxDaGFyR3JwLm5hbWUgKyAnKCcgKyBzcGVjaWFsQ2hhckdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHNwZWNpYWxDaGFyR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQU0dycC5uYW1lID0gcHJvdG9jb2xIVFRQU0dycC5uYW1lICsgJygnICsgcHJvdG9jb2xIVFRQU0dycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUFNHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQR3JwLm5hbWUgPSBwcm90b2NvbEhUVFBHcnAubmFtZSArICcoJyArIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvdG9jb2xGVFBHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xGVFBHcnAubmFtZSA9IHByb3RvY29sRlRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sRlRQR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhYmNkR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWJjZEdycC5uYW1lID0gYWJjZEdycC5uYW1lICsgJygnICsgYWJjZEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGFiY2RHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVmZ2hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGVmZ2hHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLm5hbWUgPSBlZmdoR3JwLm5hbWUgKyAnKCcgKyBlZmdoR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goZWZnaEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWprbEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlqa2xHcnAubmFtZSA9IGlqa2xHcnAubmFtZSArICcoJyArIGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChpamtsR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtbm9wR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW5vcEdycC5uYW1lID0gbW5vcEdycC5uYW1lICsgJygnICsgbW5vcEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG1ub3BHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHFyc3RHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHFyc3RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLm5hbWUgPSBxcnN0R3JwLm5hbWUgKyAnKCcgKyBxcnN0R3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocXJzdEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXZ3eEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHV2d3hHcnAubmFtZSA9IHV2d3hHcnAubmFtZSArICcoJyArIHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaCh1dnd4R3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5ekdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgeXpHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB5ekdycC5uYW1lID0geXpHcnAubmFtZSArICcoJyArIHl6R3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goeXpHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgb25lVG85R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb25lVG85R3JwLm5hbWUgPSBvbmVUbzlHcnAubmFtZSArICcoJyArIG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG9uZVRvOUdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLm5hbWUgPSBzZXJ2aWNlc0NoaWxkcmVuLm5hbWUgKyAnKCcgKyBzZXJ2aWNlc3RyZWUubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VzQ2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzU2VydmljZXNGb3JUcmVlKFxuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbixcbiAgICAgICAgICAgIGVkZ2Vyb3V0ZXJzLFxuICAgICAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICAgICAgYXBwd2FucyxcbiAgICAgICAgICAgIHNlcnZpY2VzLFxuICAgICAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzLFxuICAgICAgICAgICAgbngsXG4gICAgICAgICAgICBueVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VzdHJlZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG54OyBpIDwgbnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VvYmogPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VvYmouaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoubmFtZSA9IHNlcnZpY2VzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgc2VydmljZW9iai51dWlkID0gc2VydmljZXNbaV0uaWQ7XG4gICAgICAgICAgICAgICAgc2VydmljZW9iai50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoucm9vdE5vZGUgPSAnWWVzJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXN3aXRoTmFtZSA9IFtdO1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXN3aXRoTmFtZS5wdXNoKCdAJyArIHNlcnZpY2VzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzW2ldICYmIHNlcnZpY2VzW2ldLnJvbGVBdHRyaWJ1dGVzICYmIHNlcnZpY2VzW2ldLnJvbGVBdHRyaWJ1dGVzLmZpbmQoKHNyYXR0cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzd2l0aE5hbWUucHVzaChzcmF0dHIpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzSXRSRFBQcm90b2NvbEF0dHIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgaXNJdEhUVFBQcm90b2NvbEF0dHIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgaXNJdEhUVFBTUHJvdG9jb2xBdHRyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IGlzSXRGVFBQcm90b2NvbEF0dHIgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgYXR0cmlidXRlc3dpdGhOYW1lLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJPYiA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck9iLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck9iLm5hbWUgPSBhdHRyaWJ1dGVzd2l0aE5hbWVba107XG4gICAgICAgICAgICAgICAgICAgIGF0dHJPYi50eXBlID0gJ1NlcnZpY2UgQXR0cmlidXRlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0TmFtZSA9IGF0dHJpYnV0ZXN3aXRoTmFtZVtrXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJdFJEUFByb3RvY29sQXR0ciA9PT0gZmFsc2UgJiYgYXR0TmFtZS5pbmNsdWRlcygncmRwJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoucHJvdG9jb2wgPSAncmRwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSXRSRFBQcm90b2NvbEF0dHIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0l0SFRUUFNQcm90b2NvbEF0dHIgPT09IGZhbHNlICYmIGF0dE5hbWUuaW5jbHVkZXMoJ2h0dHBzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoucHJvdG9jb2wgPSAnaHR0cHMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNJdEhUVFBTUHJvdG9jb2xBdHRyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJdEhUVFBTUHJvdG9jb2xBdHRyID09PSBmYWxzZSAmJiBpc0l0SFRUUFByb3RvY29sQXR0ciA9PT0gZmFsc2UgJiYgYXR0TmFtZS5pbmNsdWRlcygnaHR0cCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlb2JqLnByb3RvY29sID0gJ2h0dHAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNJdEhUVFBQcm90b2NvbEF0dHIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0l0RlRQUHJvdG9jb2xBdHRyID09PSBmYWxzZSAmJiBhdHROYW1lLmluY2x1ZGVzKCdmdHAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZW9iai5wcm90b2NvbCA9ICdmdHAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNJdEZUUFByb3RvY29sQXR0ciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIGVuZCBpbm5lciBmb3IgbG9vcFxuXG4gICAgICAgICAgICAgICAgc2VydmljZXN0cmVlLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IC8vIGVuZCBmb3IgbG9vcFxuXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwaW5nKHNlcnZpY2VzQ2hpbGRyZW4sIHNlcnZpY2VzdHJlZSk7XG4gICAgICAgIH0gLy8gZW5kIG9mIHByb2Nlc3NTZXJ2aWNlc0ZvclRyZWVcblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzRWRnZVJvdXRlclBvbGljaWVzRm9yVHJlZShcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICBlbmRwb2ludHMsXG4gICAgICAgICAgICBhcHB3YW5zLFxuICAgICAgICAgICAgc2VydmljZXMsXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICBueCxcbiAgICAgICAgICAgIG55XG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG54OyBpIDwgbnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycG9saWN5ID0gbmV3IEVSUG9saWN5KCk7XG4gICAgICAgICAgICAgICAgZXJwb2xpY3kuaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIGVycG9saWN5LnV1aWQgPSBlZGdlUm91dGVyUG9saWNpZXNbaV0uaWQ7XG4gICAgICAgICAgICAgICAgZXJwb2xpY3kubmFtZSA9IGVkZ2VSb3V0ZXJQb2xpY2llc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGVycG9saWN5LnR5cGUgPSAnUm91dGVyIFBvbGljeSc7XG4gICAgICAgICAgICAgICAgZXJwb2xpY3kucm9vdE5vZGUgPSAnWWVzJztcbiAgICAgICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGVycG9saWN5KTtcbiAgICAgICAgICAgIH0gLy8gZW5kIG9mIG1haW4gZm9yIGxvb3BcbiAgICAgICAgICAgIHJldHVybiBlZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbjtcbiAgICAgICAgfSAvLyBlbmRcblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzU2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llc0ZvclRyZWUoXG4gICAgICAgICAgICBzZXJ2aWNlRWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICBueCxcbiAgICAgICAgICAgIG55XG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG54OyBpIDwgbnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VlcnBvbGljeSA9IG5ldyBTZXJ2aWNlRVJQb2xpY3koKTtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlZXJwb2xpY3kuaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VlcnBvbGljeS51dWlkID0gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llc1tpXS5pZDtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlZXJwb2xpY3kubmFtZSA9IHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlZXJwb2xpY3kudHlwZSA9ICdTZXJ2aWNlIFJvdXRlciBQb2xpY3knO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VlcnBvbGljeS5yb290Tm9kZSA9ICdZZXMnO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHNlcnZpY2VlcnBvbGljeSk7XG4gICAgICAgICAgICB9IC8vIGVuZCBvZiBtYWluIGZvciBsb29wXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuO1xuICAgICAgICB9IC8vIGVuZFxuXG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NFZGdlcm91dGVyc0ZvclRyZWUoXG4gICAgICAgICAgICBlZGdlcm91dGVyQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIG54LFxuICAgICAgICAgICAgbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbng7IGkgPCBueTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJPYiA9IG5ldyBFUm91dGVyKCk7XG4gICAgICAgICAgICAgICAgZXJPYi5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXIgPSBlZGdlcm91dGVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IubmFtZSA9IGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IudmVyaWZpZWQgPSBlci5pc1ZlcmlmaWVkPyAnWWVzJzogJ05vJztcbiAgICAgICAgICAgICAgICAgICAgLy9lck9iLnZlcnNpb24gPSBlci5wcm9kdWN0VmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgZXJPYi5vbmxpbmUgPSBlci5pc09ubGluZT8gJ1llcyc6ICdObyc7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IuZGlzYWJsZWQgPSBlci5kaXNhYmxlZD8gJ1llcyc6ICdObyc7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IudHlwZSA9ICdFZGdlIFJvdXRlcic7XG4gICAgICAgICAgICAgICAgICAgIGVyT2Iucm9vdE5vZGUgPSAnWWVzJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyLmhvc3RJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAvLyBlck9iLnByb3ZpZGVyID0gZmluZFByb3ZpZGVyTmFtZUZvckhvc3RJZChlci5ob3N0SWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyLnN0YXR1cyA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJPYi5wcm92aWRlciA9ICdOL0EnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJPYi5wcm92aWRlciA9ICdQcml2YXRlIERDJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVkZ2Vyb3V0ZXJDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGVyT2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gZW5kIG1haW4gZm9yIGxvb3BcbiAgICAgICAgICAgIHJldHVybiBlZGdlcm91dGVyQ2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGVJZCgpIGdlbmVyYXRlcyBub2RlIElkIDEsMiwzLDQsNSBmb3IgdGhlIGZvbGxvd2luZyBmaXZlIG5vZGVzLiB0aGlzIGlkIGlzIHVzZWQgdG8gc2VhcmNoIGNhcGFiaWxpdHkuXG4gICAgICAgIGxldCBhcHB3YW5zQ2hpbGRyZW4gPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgYXBwd2Fuc0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgYXBwd2Fuc0NoaWxkcmVuLm5hbWUgPSAnU2VydmljZSBQb2xpY2llcyc7XG5cbiAgICAgICAgbGV0IHNlcnZpY2VzQ2hpbGRyZW4gPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgc2VydmljZXNDaGlsZHJlbi5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4ubmFtZSA9ICdTZXJ2aWNlcyc7XG5cbiAgICAgICAgbGV0IGVuZHBvaW50c0NoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVuZHBvaW50c0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgZW5kcG9pbnRzQ2hpbGRyZW4ubmFtZSA9ICdJZGVudGl0aWVzJztcblxuICAgICAgICBsZXQgZWRnZXJvdXRlckNoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVkZ2Vyb3V0ZXJDaGlsZHJlbi5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgIGVkZ2Vyb3V0ZXJDaGlsZHJlbi5uYW1lID0gJ0VkZ2UgUm91dGVycyc7XG5cbiAgICAgICAgbGV0IGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4ubmFtZSA9ICdFZGdlIFJvdXRlciBQb2xpY2llcyc7XG5cbiAgICAgICAgbGV0IHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2VzQ2hpbGRyZW4ubmFtZSA9ICdTZXJ2aWNlIEVkZ2UgUm91dGVyIFBvbGljaWVzJztcblxuICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuID0gcHJvY2Vzc1NlcnZpY2VzRm9yVHJlZShcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBzZXJ2aWNlcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBlZGdlcm91dGVyQ2hpbGRyZW4gPSBwcm9jZXNzRWRnZXJvdXRlcnNGb3JUcmVlKFxuICAgICAgICAgICAgZWRnZXJvdXRlckNoaWxkcmVuLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICBlbmRwb2ludHMsXG4gICAgICAgICAgICBhcHB3YW5zLFxuICAgICAgICAgICAgc2VydmljZXMsXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGVkZ2Vyb3V0ZXJDaGlsZHJlbikge1xuICAgICAgICAgICAgZWRnZXJvdXRlckNoaWxkcmVuLm5hbWUgPSBlZGdlcm91dGVyQ2hpbGRyZW4ubmFtZSArICcgKCcgKyBlZGdlcm91dGVyQ2hpbGRyZW4uY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwd2Fuc0NoaWxkcmVuID0gcHJvY2Vzc1NlcnZpY2VQb2xpY2llc0ZvclRyZWUoXG4gICAgICAgICAgICBhcHB3YW5zQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBhcHB3YW5zLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuID0gcHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0ZvclRyZWUoXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbixcbiAgICAgICAgICAgIGVkZ2Vyb3V0ZXJzLFxuICAgICAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICAgICAgYXBwd2FucyxcbiAgICAgICAgICAgIHNlcnZpY2VzLFxuICAgICAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLm5hbWUgPVxuICAgICAgICAgICAgICAgICdFZGdlIFJvdXRlciBQb2xpY2llcyAoJyArIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVuZHBvaW50c0NoaWxkcmVuID0gcHJvY2Vzc0lkZW50aXRpZXNGb3JUcmVlKFxuICAgICAgICAgICAgZW5kcG9pbnRzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBlbmRwb2ludHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9zZXJ2aWNlRWRnZVJvdXRlclBvbGljaWVzXG4gICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuID0gcHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JUcmVlKFxuICAgICAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2VzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuLm5hbWUgPVxuICAgICAgICAgICAgICAgICdTZXJ2aWNlIEVkZ2UgUm91dGVyIFBvbGljaWVzICgnICsgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgcm9vdEpzb24uY2hpbGRyZW4ucHVzaChhcHB3YW5zQ2hpbGRyZW4pO1xuICAgICAgICByb290SnNvbi5jaGlsZHJlbi5wdXNoKHNlcnZpY2VzQ2hpbGRyZW4pO1xuICAgICAgICByb290SnNvbi5jaGlsZHJlbi5wdXNoKGVuZHBvaW50c0NoaWxkcmVuKTtcbiAgICAgICAgcm9vdEpzb24uY2hpbGRyZW4ucHVzaChlZGdlcm91dGVyQ2hpbGRyZW4pO1xuICAgICAgICByb290SnNvbi5jaGlsZHJlbi5wdXNoKGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuKTtcbiAgICAgICAgcm9vdEpzb24uY2hpbGRyZW4ucHVzaChzZXJ2aWNlRWRnZVJvdXRlclBvbGljZXNDaGlsZHJlbik7XG4gICAgICAgIHJvb3RKc29uLmxhc3RJZCA9IHVuaXFJZDtcblxuICAgICAgICByZXR1cm4gcm9vdEpzb247XG4gICAgfVxuXG59XG4iXX0=