@openziti/ziti-console-lib 0.3.1 → 0.4.1
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.
- package/assets/html/index.htm +21 -3
- package/assets/images/Icon_Minus.png +0 -0
- package/assets/languages/en-us.json +3 -1
- package/assets/styles/global.scss +25 -1
- package/assets/styles/tables.css +28 -3
- package/assets/styles/ziti.css +29 -2
- package/assets/svgs/v8visualizer.svg +60 -0
- package/esm2022/lib/features/card/card.component.mjs +9 -3
- package/esm2022/lib/features/card-list/card-list.component.mjs +16 -13
- package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +1 -1
- package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +33 -0
- package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +31 -0
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +12 -8
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +68 -34
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +258 -0
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +177 -0
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +8 -5
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +10 -6
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +69 -37
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +112 -8
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +44 -30
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +2 -1
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +21 -17
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +44 -7
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +3 -3
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +1508 -0
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +578 -0
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +695 -0
- package/esm2022/lib/features/visualizer/visualizer-service.class.mjs +33 -0
- package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +6 -1
- package/esm2022/lib/models/edge-router-policy.mjs +10 -0
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +7 -6
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +7 -7
- package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +9 -11
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +18 -14
- package/esm2022/lib/pages/identities/identities-page.component.mjs +11 -12
- package/esm2022/lib/pages/identities/identities-page.service.mjs +25 -43
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +7 -6
- package/esm2022/lib/pages/services/services-page.component.mjs +10 -16
- package/esm2022/lib/pages/services/services-page.service.mjs +24 -14
- package/esm2022/lib/shared/list-page-component.class.mjs +1 -1
- package/esm2022/lib/shared/list-page-service.class.mjs +30 -6
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/lib/ziti-console-lib.module.mjs +19 -3
- package/esm2022/public-api.mjs +8 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +7215 -3703
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/card/card.component.d.ts +3 -1
- package/lib/features/card/card.component.d.ts.map +1 -1
- package/lib/features/card-list/card-list.component.d.ts +5 -2
- package/lib/features/card-list/card-list.component.d.ts.map +1 -1
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +19 -0
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +1 -0
- package/lib/features/multi-action-button/multi-action-button.component.d.ts +13 -0
- package/lib/features/multi-action-button/multi-action-button.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +3 -4
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +10 -5
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +53 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +32 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +3 -2
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +9 -3
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +31 -4
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts +10 -5
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +5 -2
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +4 -4
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +129 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +1 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +131 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +1 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +31 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +1 -0
- package/lib/features/visualizer/visualizer-service.class.d.ts +10 -0
- package/lib/features/visualizer/visualizer-service.class.d.ts.map +1 -0
- package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -1
- package/lib/models/edge-router-policy.d.ts +7 -0
- package/lib/models/edge-router-policy.d.ts.map +1 -0
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +1 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -1
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts +1 -1
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts +3 -1
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -1
- package/lib/pages/identities/identities-page.component.d.ts.map +1 -1
- package/lib/pages/identities/identities-page.service.d.ts +4 -2
- package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
- package/lib/pages/services/services-page.component.d.ts.map +1 -1
- package/lib/pages/services/services-page.service.d.ts +5 -1
- package/lib/pages/services/services-page.service.d.ts.map +1 -1
- package/lib/shared/list-page-component.class.d.ts.map +1 -1
- package/lib/shared/list-page-service.class.d.ts +7 -1
- package/lib/shared/list-page-service.class.d.ts.map +1 -1
- package/lib/ziti-console-lib.module.d.ts +34 -30
- package/lib/ziti-console-lib.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +7 -0
- package/public-api.d.ts.map +1 -1
package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs
ADDED
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as d3 from 'd3';
|
|
3
|
+
import { ServicePolicy, Attribute, Children, Identity, ERouter, ERPolicy, Group, Service } from './network-visualizer.helper';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
class TreeNodeProcessor {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.uniqId = 0;
|
|
8
|
+
}
|
|
9
|
+
getPagingObject(pagesize) {
|
|
10
|
+
const paging = {
|
|
11
|
+
searchOn: 'name',
|
|
12
|
+
noSearch: false,
|
|
13
|
+
filter: '',
|
|
14
|
+
total: pagesize,
|
|
15
|
+
page: 1,
|
|
16
|
+
sort: 'name',
|
|
17
|
+
order: 'asc',
|
|
18
|
+
};
|
|
19
|
+
return paging;
|
|
20
|
+
}
|
|
21
|
+
async processIdentitiesForNodeClick(identityNode, networkGraph, rawEndpoints, uniqId, zitiService, configs) {
|
|
22
|
+
const myPromise = await new Promise(async (resolve, reject) => {
|
|
23
|
+
const wait_promises = [];
|
|
24
|
+
this.uniqId = uniqId;
|
|
25
|
+
const rawEp = this.findRawEndpoint(identityNode.data.name, rawEndpoints);
|
|
26
|
+
let rawEpAttributes = [];
|
|
27
|
+
if (rawEp.roleAttributes) {
|
|
28
|
+
rawEpAttributes = rawEp.roleAttributes;
|
|
29
|
+
}
|
|
30
|
+
;
|
|
31
|
+
rawEpAttributes.push('@' + rawEp.name);
|
|
32
|
+
for (let i = 0; i < rawEpAttributes.length; i++) {
|
|
33
|
+
const attribute = new Attribute();
|
|
34
|
+
attribute.id = this.createId();
|
|
35
|
+
attribute.name = rawEpAttributes[i];
|
|
36
|
+
attribute.type = 'Identity Attribute';
|
|
37
|
+
identityNode.data.children.push(attribute);
|
|
38
|
+
}
|
|
39
|
+
const bindServices = new Children();
|
|
40
|
+
const dialServices = new Children();
|
|
41
|
+
bindServices.id = this.createId();
|
|
42
|
+
dialServices.id = this.createId();
|
|
43
|
+
let identityServicePolicies = [];
|
|
44
|
+
const services_url = this.getLinkForResource(rawEp, 'service-policies').replace('./', '');
|
|
45
|
+
const pagesize = 500;
|
|
46
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
47
|
+
const firstPromise = await zitiService
|
|
48
|
+
.get(services_url, services_paging, [])
|
|
49
|
+
.then(async (result) => {
|
|
50
|
+
identityServicePolicies = result.data;
|
|
51
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
52
|
+
const promises = [];
|
|
53
|
+
for (let page = 2; page <= pages; page++) {
|
|
54
|
+
services_paging.page = page;
|
|
55
|
+
const tmp_promise = await zitiService
|
|
56
|
+
.get(services_url, services_paging, [])
|
|
57
|
+
.then((pageResult) => {
|
|
58
|
+
pageResult.data.forEach((serv) => {
|
|
59
|
+
identityServicePolicies.push(serv);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
promises.push(tmp_promise);
|
|
63
|
+
wait_promises.push(tmp_promise);
|
|
64
|
+
}
|
|
65
|
+
Promise.all(promises).then(() => {
|
|
66
|
+
const sub_promises = [];
|
|
67
|
+
identityServicePolicies.find(async (isp) => {
|
|
68
|
+
const pagingOb = this.getPagingObject(pagesize);
|
|
69
|
+
const ser_url = this.getLinkForResource(isp, 'services').replace('./', '');
|
|
70
|
+
const tmpPromise = await zitiService
|
|
71
|
+
.get(ser_url, pagingOb, [])
|
|
72
|
+
.then((result) => {
|
|
73
|
+
const tmp_services = [];
|
|
74
|
+
result.data.find((re) => {
|
|
75
|
+
const serv = new Service();
|
|
76
|
+
serv.id = this.createId();
|
|
77
|
+
serv.name = re.name;
|
|
78
|
+
serv.type = 'Service';
|
|
79
|
+
// tmp_services.push(serv);
|
|
80
|
+
if (isp.type === 'Dial') {
|
|
81
|
+
dialServices.children.push(serv);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
bindServices.children.push(serv);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
sub_promises.push(tmpPromise);
|
|
89
|
+
wait_promises.push(tmpPromise);
|
|
90
|
+
}); // loop
|
|
91
|
+
Promise.all(sub_promises).then(() => {
|
|
92
|
+
if (bindServices.children.length > 0) {
|
|
93
|
+
bindServices.name = 'Bind-Services(' + bindServices.children.length + ')';
|
|
94
|
+
identityNode.data.children.push(bindServices);
|
|
95
|
+
}
|
|
96
|
+
if (dialServices.children.length > 0) {
|
|
97
|
+
dialServices.name = 'Dial-Services(' + dialServices.children.length + ')';
|
|
98
|
+
identityNode.data.children.push(dialServices);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
wait_promises.push(firstPromise);
|
|
104
|
+
Promise.all(wait_promises).then(() => {
|
|
105
|
+
resolve('this is a promise');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
109
|
+
return nd.children;
|
|
110
|
+
});
|
|
111
|
+
return [networkGraph, this.uniqId];
|
|
112
|
+
} // end of function
|
|
113
|
+
createId() {
|
|
114
|
+
++this.uniqId;
|
|
115
|
+
return this.uniqId;
|
|
116
|
+
}
|
|
117
|
+
createServiceNode(sr) {
|
|
118
|
+
const serviceOb = new Service();
|
|
119
|
+
serviceOb.id = this.createId();
|
|
120
|
+
serviceOb.uuid = sr.id;
|
|
121
|
+
serviceOb.name = sr.name;
|
|
122
|
+
serviceOb.type = 'Service';
|
|
123
|
+
return serviceOb;
|
|
124
|
+
}
|
|
125
|
+
addItemToArray(bindIdnetities, ob) {
|
|
126
|
+
if (!bindIdnetities.find((item) => item.uuid === ob.id)) {
|
|
127
|
+
const epOb = new Identity();
|
|
128
|
+
epOb.id = this.createId();
|
|
129
|
+
epOb.uuid = ob.id;
|
|
130
|
+
epOb.name = ob.name;
|
|
131
|
+
epOb.online = ob.hasApiSession === true ? 'Yes' : 'No';
|
|
132
|
+
epOb.type = 'Identity';
|
|
133
|
+
epOb.status = ob.os !== null ? 'Registered' : 'Not Registered';
|
|
134
|
+
epOb.os = ob.os;
|
|
135
|
+
bindIdnetities.push(epOb);
|
|
136
|
+
}
|
|
137
|
+
return bindIdnetities;
|
|
138
|
+
}
|
|
139
|
+
getLinkForResource(ob, resource) {
|
|
140
|
+
return ob['_links'][resource]['href'];
|
|
141
|
+
}
|
|
142
|
+
//Bind Dial Services
|
|
143
|
+
findServicesHostedOnEndpoint(rawEp, services, servicePolicies, zitiService) {
|
|
144
|
+
const servicesArr = [];
|
|
145
|
+
const childrenNoGroups = [];
|
|
146
|
+
const endpointAttr = rawEp.roleAttributes ? rawEp.roleAttributes : [];
|
|
147
|
+
endpointAttr.push('@' + rawEp.id);
|
|
148
|
+
let dialServiceAttrs = [];
|
|
149
|
+
let bindServiceAttrs = [];
|
|
150
|
+
const bindPolicies = new Children();
|
|
151
|
+
bindPolicies.name = 'Bind-Policies';
|
|
152
|
+
const dialPolicies = new Children();
|
|
153
|
+
dialPolicies.name = 'Dial-Policies';
|
|
154
|
+
bindPolicies.id = this.createId();
|
|
155
|
+
dialPolicies.id = this.createId();
|
|
156
|
+
servicePolicies.find((sp) => {
|
|
157
|
+
sp.identityRoles.find((attr) => {
|
|
158
|
+
if (endpointAttr.includes(attr)) {
|
|
159
|
+
if (sp.type === 'Bind') {
|
|
160
|
+
const sPolicy = new ServicePolicy();
|
|
161
|
+
sPolicy.id = this.createId();
|
|
162
|
+
sPolicy.name = sp.name;
|
|
163
|
+
sPolicy.type = sp.type;
|
|
164
|
+
sPolicy.children = this.getServicesForPolicy(services, sp);
|
|
165
|
+
bindPolicies.children.push(sp);
|
|
166
|
+
bindServiceAttrs = fillArray(bindServiceAttrs, sp.serviceRoles);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const sPolicy = new ServicePolicy();
|
|
170
|
+
sPolicy.id = this.createId();
|
|
171
|
+
sPolicy.name = sp.name;
|
|
172
|
+
sPolicy.type = sp.type;
|
|
173
|
+
sPolicy.children = this.getServicesForPolicy(services, sp);
|
|
174
|
+
dialPolicies.children.push(sPolicy);
|
|
175
|
+
dialServiceAttrs = fillArray(dialServiceAttrs, sp.serviceRoles);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
function fillArray(arr1, arr2) {
|
|
181
|
+
arr2.forEach((item) => {
|
|
182
|
+
arr1.push(item);
|
|
183
|
+
});
|
|
184
|
+
return arr1;
|
|
185
|
+
}
|
|
186
|
+
const bindServices = [];
|
|
187
|
+
const dialServices = [];
|
|
188
|
+
services && services.forEach((sr) => {
|
|
189
|
+
sr.roleAttributes && sr.roleAttributes.forEach((attr) => {
|
|
190
|
+
if (dialServiceAttrs.includes(attr)) {
|
|
191
|
+
dialServices.push(this.createServiceNode(sr));
|
|
192
|
+
}
|
|
193
|
+
if (bindServiceAttrs.includes(attr)) {
|
|
194
|
+
bindServices.push(this.createServiceNode(sr));
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
if (dialServices.length > 0) {
|
|
199
|
+
const dialGroup = new Children();
|
|
200
|
+
dialGroup.id = this.createId();
|
|
201
|
+
dialGroup.name = 'Services-Dial';
|
|
202
|
+
dialGroup.children = dialServices;
|
|
203
|
+
servicesArr.push(dialGroup);
|
|
204
|
+
}
|
|
205
|
+
if (bindServices.length > 0) {
|
|
206
|
+
const bindGroup = new Children();
|
|
207
|
+
bindGroup.id = this.createId();
|
|
208
|
+
bindGroup.name = 'Services-Bind';
|
|
209
|
+
bindGroup.children = bindServices;
|
|
210
|
+
servicesArr.push(bindGroup);
|
|
211
|
+
}
|
|
212
|
+
return servicesArr;
|
|
213
|
+
} // end of find servicesHostedOnEndpoint
|
|
214
|
+
getServicesForPolicy(services, spOb) {
|
|
215
|
+
const servicesFotPolicy = [];
|
|
216
|
+
services && services.forEach((sr) => {
|
|
217
|
+
const attrs = sr.roleAttributes ? sr.roleAttributes : [];
|
|
218
|
+
attrs.push('@' + spOb.id);
|
|
219
|
+
attrs.find((atr) => {
|
|
220
|
+
if (spOb.serviceRoles.includes(atr)) {
|
|
221
|
+
const serviceNode = new Service();
|
|
222
|
+
serviceNode.id = this.createId();
|
|
223
|
+
serviceNode.name = sr.name;
|
|
224
|
+
serviceNode.type = 'Service';
|
|
225
|
+
servicesFotPolicy.push(serviceNode);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
return servicesFotPolicy;
|
|
230
|
+
}
|
|
231
|
+
findRawEndpoint(epName, endpoints) {
|
|
232
|
+
return endpoints.find((ep) => ep.name === epName);
|
|
233
|
+
}
|
|
234
|
+
async processServicesForNodeClick(serviceNode, networkGraph, services, uniqId, zitiService) {
|
|
235
|
+
const myPromise = await new Promise(async (resolve, reject) => {
|
|
236
|
+
const wait_promises = [];
|
|
237
|
+
this.uniqId = uniqId;
|
|
238
|
+
const rawServiceObj = services.find((s) => s.name === serviceNode.data.name);
|
|
239
|
+
const attributeswithName = [];
|
|
240
|
+
attributeswithName.push('@' + rawServiceObj.name);
|
|
241
|
+
rawServiceObj.roleAttributes && rawServiceObj.roleAttributes.find((srattr) => {
|
|
242
|
+
attributeswithName.push(srattr);
|
|
243
|
+
});
|
|
244
|
+
const serviceAttributes = new Children();
|
|
245
|
+
serviceAttributes.type = 'ServiceAttributes';
|
|
246
|
+
serviceAttributes.id = this.createId();
|
|
247
|
+
for (let k = 0; k < attributeswithName.length; k++) {
|
|
248
|
+
const attrOb = new Attribute();
|
|
249
|
+
attrOb.id = this.createId();
|
|
250
|
+
attrOb.name = attributeswithName[k];
|
|
251
|
+
attrOb.type = 'Service Attribute';
|
|
252
|
+
serviceAttributes.children.push(attrOb);
|
|
253
|
+
} // end inner for loop
|
|
254
|
+
if (serviceAttributes.children.length > 0) {
|
|
255
|
+
serviceAttributes.name = 'Service Attributes(' + serviceAttributes.children.length + ')';
|
|
256
|
+
serviceNode.data.children.push(serviceAttributes);
|
|
257
|
+
}
|
|
258
|
+
let service_configs = [];
|
|
259
|
+
const configs_url = this.getLinkForResource(rawServiceObj, 'configs');
|
|
260
|
+
const pagesize = 500;
|
|
261
|
+
const pagingOb = this.getPagingObject(pagesize);
|
|
262
|
+
const configPromise = await zitiService
|
|
263
|
+
.get(configs_url, pagingOb, [])
|
|
264
|
+
.then((configs) => {
|
|
265
|
+
service_configs = configs && configs.data ? configs.data : [];
|
|
266
|
+
});
|
|
267
|
+
wait_promises.push(configPromise);
|
|
268
|
+
const service_edge_router_policies_url = this.getLinkForResource(rawServiceObj, 'service-edge-router-policies');
|
|
269
|
+
const service_policies_url = this.getLinkForResource(rawServiceObj, 'service-policies').replace('./', ''); // dial, Bind info
|
|
270
|
+
let bindPolicies = [];
|
|
271
|
+
let bindIdnetities = [];
|
|
272
|
+
const promise2 = await zitiService
|
|
273
|
+
.get(service_policies_url, pagingOb, [])
|
|
274
|
+
.then((policies) => {
|
|
275
|
+
const identityPromises = [];
|
|
276
|
+
policies.data.forEach(async (policy) => {
|
|
277
|
+
if (policy.type === 'Bind') {
|
|
278
|
+
const bindIdentitiesUrl = this.getLinkForResource(policy, 'identities');
|
|
279
|
+
const promse = await zitiService
|
|
280
|
+
.get(bindIdentitiesUrl.replace('./', ''), pagingOb, [])
|
|
281
|
+
.then((res) => {
|
|
282
|
+
if (res && res.data.length > 0) {
|
|
283
|
+
res.data.forEach((rs) => {
|
|
284
|
+
this.addItemToArray(bindIdnetities, rs);
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
this.addItemToArray(bindIdnetities, res.data);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
identityPromises.push(promse);
|
|
292
|
+
wait_promises.push(promse);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
Promise.all(identityPromises).then(() => {
|
|
296
|
+
const tmp = new Children();
|
|
297
|
+
tmp.name = "Bind Identities(" + bindIdnetities.length + ')';
|
|
298
|
+
tmp.type = "Identities";
|
|
299
|
+
tmp.children = bindIdnetities;
|
|
300
|
+
tmp.id = this.createId();
|
|
301
|
+
serviceNode.data.children.push(tmp);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
wait_promises.push(promise2);
|
|
305
|
+
Promise.all(wait_promises).then(() => {
|
|
306
|
+
resolve('this is a promise');
|
|
307
|
+
});
|
|
308
|
+
}); // end of mypromise
|
|
309
|
+
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
310
|
+
return nd.children;
|
|
311
|
+
});
|
|
312
|
+
return [networkGraph, this.uniqId];
|
|
313
|
+
} // end of processServicesForNodeClick
|
|
314
|
+
async processServicePoliciesForNodeClick(policyNode, networkGraph, servicePolicies, uniqId, zitiService) {
|
|
315
|
+
const myPromise = await new Promise(async (resolve, reject) => {
|
|
316
|
+
const wait_promises = [];
|
|
317
|
+
this.uniqId = uniqId;
|
|
318
|
+
const rawSPolicy = servicePolicies.find((s) => s.name === policyNode.data.name);
|
|
319
|
+
const pagesize = 500;
|
|
320
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
321
|
+
const bindIdentitiesUrl = this.getLinkForResource(rawSPolicy, 'identities');
|
|
322
|
+
const sp_promise = await zitiService.get(bindIdentitiesUrl, services_paging, [])
|
|
323
|
+
.then((ids) => {
|
|
324
|
+
const childs = new Children();
|
|
325
|
+
childs.name = rawSPolicy.type + 'Identities';
|
|
326
|
+
childs.id = this.createId();
|
|
327
|
+
ids.data.forEach((idOb) => {
|
|
328
|
+
const ep = new Identity();
|
|
329
|
+
ep.id = idOb.id;
|
|
330
|
+
ep.name = idOb.name;
|
|
331
|
+
ep.type = 'Identity';
|
|
332
|
+
childs.children.push(ep);
|
|
333
|
+
});
|
|
334
|
+
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
335
|
+
policyNode.data.children.push(childs);
|
|
336
|
+
});
|
|
337
|
+
wait_promises.push(sp_promise);
|
|
338
|
+
Promise.all(wait_promises).then(() => {
|
|
339
|
+
resolve('resolve.');
|
|
340
|
+
});
|
|
341
|
+
}); // end mypromise
|
|
342
|
+
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
343
|
+
return nd.children;
|
|
344
|
+
});
|
|
345
|
+
return [networkGraph, this.uniqId];
|
|
346
|
+
}
|
|
347
|
+
async processEdgeroutersForNodeClick(edgerouterNode, networkGraph, edgerouters, uniqId, zitiService) {
|
|
348
|
+
const mainPromise = await new Promise(async (resolve, reject) => {
|
|
349
|
+
const wait_promises = [];
|
|
350
|
+
this.uniqId = uniqId;
|
|
351
|
+
const er = edgerouters.find((s) => s.name === edgerouterNode.data.name);
|
|
352
|
+
const erAttributes = er.roleAttributes ? er.roleAttributes : [];
|
|
353
|
+
erAttributes.find((attr) => {
|
|
354
|
+
const att = new Attribute();
|
|
355
|
+
att.id = this.createId();
|
|
356
|
+
att.name = attr;
|
|
357
|
+
att.type = 'Edge Router Attribute';
|
|
358
|
+
edgerouterNode.data.children.push(att);
|
|
359
|
+
});
|
|
360
|
+
const pagesize = 500;
|
|
361
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
362
|
+
const erpoliciesUrl = this.getLinkForResource(er, 'edge-router-policies');
|
|
363
|
+
let erpoliciesForER = [];
|
|
364
|
+
const erpoliciespromise = await zitiService.get(erpoliciesUrl, services_paging, [])
|
|
365
|
+
.then(async (result) => {
|
|
366
|
+
erpoliciesForER = result.data;
|
|
367
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
368
|
+
const promises = [];
|
|
369
|
+
for (let page = 2; page <= pages; page++) {
|
|
370
|
+
services_paging.page = page;
|
|
371
|
+
const tmp_promise = await zitiService.get(erpoliciesUrl, services_paging, []).then((pageResult) => {
|
|
372
|
+
pageResult.data.forEach((serv) => {
|
|
373
|
+
erpoliciesForER.push(serv);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
promises.push(tmp_promise);
|
|
377
|
+
wait_promises.push(tmp_promise);
|
|
378
|
+
} // end for loop
|
|
379
|
+
Promise.all(promises).then(() => {
|
|
380
|
+
const erpolChilds = new Children();
|
|
381
|
+
erpolChilds.id = this.createId();
|
|
382
|
+
erpoliciesForER.forEach((pol) => {
|
|
383
|
+
const policy = new ERPolicy();
|
|
384
|
+
policy.id = this.createId();
|
|
385
|
+
policy.uuid = pol.id;
|
|
386
|
+
policy.name = pol.name;
|
|
387
|
+
policy.type = 'Router Policy';
|
|
388
|
+
erpolChilds.children.push(policy);
|
|
389
|
+
});
|
|
390
|
+
erpolChilds.name = "Edge Router Policies(" + erpolChilds.children.length + ')';
|
|
391
|
+
edgerouterNode.data.children.push(erpolChilds);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
wait_promises.push(erpoliciespromise);
|
|
395
|
+
Promise.all(wait_promises).then(() => {
|
|
396
|
+
resolve('this is a promise');
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
400
|
+
return nd.children;
|
|
401
|
+
});
|
|
402
|
+
return [networkGraph, this.uniqId];
|
|
403
|
+
}
|
|
404
|
+
serviceGrouping(servicesChildren, servicestree) {
|
|
405
|
+
const protocolRDPGrp = new Group(this.createId(), 'Services [protocol-RDP]', 'Services created for RDP protocol');
|
|
406
|
+
const protocolHTTPSGrp = new Group(this.createId(), 'Services [protocol-HTTPS]', 'Service created for HTTPS protocol');
|
|
407
|
+
const protocolHTTPGrp = new Group(this.createId(), 'Services [protocol-HTTP]', 'Service created for HTTP protocol');
|
|
408
|
+
const protocolFTPGrp = new Group(this.createId(), 'Services [protocol-FTP]', 'Service created for FTP protocol');
|
|
409
|
+
const abcdGrp = new Group(this.createId(), 'Services [A-D]', 'Service name starts with A to D');
|
|
410
|
+
const efghGrp = new Group(this.createId(), 'Services [E-H]', 'Service name starts with E to H');
|
|
411
|
+
const ijklGrp = new Group(this.createId(), 'Services [I-L]', 'Service name starts with I to L');
|
|
412
|
+
const mnopGrp = new Group(this.createId(), 'Services [M-P]', 'Service name starts with M to P');
|
|
413
|
+
const qrstGrp = new Group(this.createId(), 'Services [G-T]', 'Service name starts with Q to T');
|
|
414
|
+
const uvwxGrp = new Group(this.createId(), 'Services [U-X]', 'Service name starts with U to X');
|
|
415
|
+
const yzGrp = new Group(this.createId(), 'Services [Y-Z]', 'Service name starts with Y and Z');
|
|
416
|
+
const oneTo9Grp = new Group(this.createId(), 'Services [1-9]', 'Service name starts with 0 to 9');
|
|
417
|
+
for (let i = 0; i < servicestree.length; i++) {
|
|
418
|
+
const serviceobj = servicestree[i];
|
|
419
|
+
const cha = serviceobj.name.charAt(0).toLowerCase();
|
|
420
|
+
if (serviceobj.protocol === 'rdp') {
|
|
421
|
+
protocolRDPGrp.children.push(serviceobj);
|
|
422
|
+
}
|
|
423
|
+
else if (serviceobj.protocol === 'https') {
|
|
424
|
+
protocolHTTPSGrp.children.push(serviceobj);
|
|
425
|
+
}
|
|
426
|
+
else if (serviceobj.protocol === 'http') {
|
|
427
|
+
protocolHTTPGrp.children.push(serviceobj);
|
|
428
|
+
}
|
|
429
|
+
else if (serviceobj.protocol === 'ftp') {
|
|
430
|
+
protocolFTPGrp.children.push(serviceobj);
|
|
431
|
+
}
|
|
432
|
+
else if (cha === 'a' || cha === 'b' || cha === 'c' || cha === 'd') {
|
|
433
|
+
abcdGrp.children.push(serviceobj);
|
|
434
|
+
}
|
|
435
|
+
else if (cha === 'e' || cha === 'f' || cha === 'g' || cha === 'h') {
|
|
436
|
+
efghGrp.children.push(serviceobj);
|
|
437
|
+
}
|
|
438
|
+
else if (cha === 'i' || cha === 'j' || cha === 'k' || cha === 'l') {
|
|
439
|
+
ijklGrp.children.push(serviceobj);
|
|
440
|
+
}
|
|
441
|
+
else if (cha === 'm' || cha === 'n' || cha === 'o' || cha === 'p') {
|
|
442
|
+
mnopGrp.children.push(serviceobj);
|
|
443
|
+
}
|
|
444
|
+
else if (cha === 'q' || cha === 'r' || cha === 's' || cha === 't') {
|
|
445
|
+
qrstGrp.children.push(serviceobj);
|
|
446
|
+
}
|
|
447
|
+
else if (cha === 'u' || cha === 'v' || cha === 'w' || cha === 'x') {
|
|
448
|
+
uvwxGrp.children.push(serviceobj);
|
|
449
|
+
}
|
|
450
|
+
else if (cha === 'y' || cha === 'z') {
|
|
451
|
+
yzGrp.children.push(serviceobj);
|
|
452
|
+
}
|
|
453
|
+
else if (cha === '0' ||
|
|
454
|
+
cha === '1' ||
|
|
455
|
+
cha === '2' ||
|
|
456
|
+
cha === '3' ||
|
|
457
|
+
cha === '4' ||
|
|
458
|
+
cha === '5' ||
|
|
459
|
+
cha === '6' ||
|
|
460
|
+
cha === '7' ||
|
|
461
|
+
cha === '8' ||
|
|
462
|
+
cha === '9') {
|
|
463
|
+
oneTo9Grp.children.push(serviceobj);
|
|
464
|
+
}
|
|
465
|
+
} // end main for loop
|
|
466
|
+
if (protocolRDPGrp.children.length > 0) {
|
|
467
|
+
protocolRDPGrp.children.sort(function (a, b) {
|
|
468
|
+
return a.name.localeCompare(b.name);
|
|
469
|
+
});
|
|
470
|
+
protocolRDPGrp.name = protocolRDPGrp.name + '(' + protocolRDPGrp.children.length + ')';
|
|
471
|
+
servicesChildren.children.push(protocolRDPGrp);
|
|
472
|
+
}
|
|
473
|
+
if (protocolHTTPSGrp.children.length > 0) {
|
|
474
|
+
protocolHTTPSGrp.children.sort(function (a, b) {
|
|
475
|
+
return a.name.localeCompare(b.name);
|
|
476
|
+
});
|
|
477
|
+
protocolHTTPSGrp.name = protocolHTTPSGrp.name + '(' + protocolHTTPSGrp.children.length + ')';
|
|
478
|
+
servicesChildren.children.push(protocolHTTPSGrp);
|
|
479
|
+
}
|
|
480
|
+
if (protocolHTTPGrp.children.length > 0) {
|
|
481
|
+
protocolHTTPGrp.children.sort(function (a, b) {
|
|
482
|
+
return a.name.localeCompare(b.name);
|
|
483
|
+
});
|
|
484
|
+
protocolHTTPGrp.name = protocolHTTPGrp.name + '(' + protocolHTTPGrp.children.length + ')';
|
|
485
|
+
servicesChildren.children.push(protocolHTTPGrp);
|
|
486
|
+
}
|
|
487
|
+
if (protocolFTPGrp.children.length > 0) {
|
|
488
|
+
protocolFTPGrp.children.sort(function (a, b) {
|
|
489
|
+
return a.name.localeCompare(b.name);
|
|
490
|
+
});
|
|
491
|
+
protocolFTPGrp.name = protocolFTPGrp.name + '(' + protocolFTPGrp.children.length + ')';
|
|
492
|
+
servicesChildren.children.push(protocolFTPGrp);
|
|
493
|
+
}
|
|
494
|
+
if (abcdGrp.children.length > 0) {
|
|
495
|
+
abcdGrp.children.sort(function (a, b) {
|
|
496
|
+
return a.name.localeCompare(b.name);
|
|
497
|
+
});
|
|
498
|
+
abcdGrp.name = abcdGrp.name + '(' + abcdGrp.children.length + ')';
|
|
499
|
+
servicesChildren.children.push(abcdGrp);
|
|
500
|
+
}
|
|
501
|
+
if (efghGrp.children.length > 0) {
|
|
502
|
+
efghGrp.children.sort(function (a, b) {
|
|
503
|
+
return a.name.localeCompare(b.name);
|
|
504
|
+
});
|
|
505
|
+
efghGrp.name = efghGrp.name + '(' + efghGrp.children.length + ')';
|
|
506
|
+
servicesChildren.children.push(efghGrp);
|
|
507
|
+
}
|
|
508
|
+
if (ijklGrp.children.length > 0) {
|
|
509
|
+
ijklGrp.children.sort(function (a, b) {
|
|
510
|
+
return a.name.localeCompare(b.name);
|
|
511
|
+
});
|
|
512
|
+
ijklGrp.name = ijklGrp.name + '(' + ijklGrp.children.length + ')';
|
|
513
|
+
servicesChildren.children.push(ijklGrp);
|
|
514
|
+
}
|
|
515
|
+
if (mnopGrp.children.length > 0) {
|
|
516
|
+
mnopGrp.children.sort(function (a, b) {
|
|
517
|
+
return a.name.localeCompare(b.name);
|
|
518
|
+
});
|
|
519
|
+
mnopGrp.name = mnopGrp.name + '(' + mnopGrp.children.length + ')';
|
|
520
|
+
servicesChildren.children.push(mnopGrp);
|
|
521
|
+
}
|
|
522
|
+
if (qrstGrp.children.length > 0) {
|
|
523
|
+
qrstGrp.children.sort(function (a, b) {
|
|
524
|
+
return a.name.localeCompare(b.name);
|
|
525
|
+
});
|
|
526
|
+
qrstGrp.name = qrstGrp.name + '(' + qrstGrp.children.length + ')';
|
|
527
|
+
servicesChildren.children.push(qrstGrp);
|
|
528
|
+
}
|
|
529
|
+
if (uvwxGrp.children.length > 0) {
|
|
530
|
+
uvwxGrp.children.sort(function (a, b) {
|
|
531
|
+
return a.name.localeCompare(b.name);
|
|
532
|
+
});
|
|
533
|
+
uvwxGrp.name = uvwxGrp.name + '(' + uvwxGrp.children.length + ')';
|
|
534
|
+
servicesChildren.children.push(uvwxGrp);
|
|
535
|
+
}
|
|
536
|
+
if (yzGrp.children.length > 0) {
|
|
537
|
+
yzGrp.children.sort(function (a, b) {
|
|
538
|
+
return a.name.localeCompare(b.name);
|
|
539
|
+
});
|
|
540
|
+
yzGrp.name = yzGrp.name + '(' + yzGrp.children.length + ')';
|
|
541
|
+
servicesChildren.children.push(yzGrp);
|
|
542
|
+
}
|
|
543
|
+
if (oneTo9Grp.children.length > 0) {
|
|
544
|
+
oneTo9Grp.children.sort(function (a, b) {
|
|
545
|
+
return a.name.localeCompare(b.name);
|
|
546
|
+
});
|
|
547
|
+
oneTo9Grp.name = oneTo9Grp.name + '(' + oneTo9Grp.children.length + ')';
|
|
548
|
+
servicesChildren.children.push(oneTo9Grp);
|
|
549
|
+
}
|
|
550
|
+
servicesChildren.name = servicesChildren.name + '(' + servicestree.length + ')';
|
|
551
|
+
return servicesChildren;
|
|
552
|
+
}
|
|
553
|
+
async processEdgeRouterPoliciesForNodeClick(erPolicyNode, networkGraph, edgeRouterPolicies, uniqId, zitiService) {
|
|
554
|
+
const myPromise = await new Promise((resolve, reject) => {
|
|
555
|
+
const wait_promises = [];
|
|
556
|
+
this.uniqId = uniqId;
|
|
557
|
+
const rawERPolicy = edgeRouterPolicies.find((s) => s.name === erPolicyNode.data.name);
|
|
558
|
+
const pagesize = 500;
|
|
559
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
560
|
+
const url = this.getLinkForResource(rawERPolicy, 'identities');
|
|
561
|
+
let ids = [];
|
|
562
|
+
const idpromise = zitiService.get(url, services_paging, [])
|
|
563
|
+
.then((result) => {
|
|
564
|
+
ids = result.data;
|
|
565
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
566
|
+
const promises = [];
|
|
567
|
+
for (let page = 2; page <= pages; page++) {
|
|
568
|
+
services_paging.page = page;
|
|
569
|
+
const tmp_promise = zitiService.get(url, services_paging, []).then((pageResult) => {
|
|
570
|
+
pageResult.data.forEach((serv) => {
|
|
571
|
+
ids.push(serv);
|
|
572
|
+
});
|
|
573
|
+
});
|
|
574
|
+
promises.push(tmp_promise);
|
|
575
|
+
wait_promises.push(tmp_promise);
|
|
576
|
+
} // end for loop
|
|
577
|
+
Promise.all(promises).then(() => {
|
|
578
|
+
const idChilds = new Children();
|
|
579
|
+
idChilds.id = this.createId();
|
|
580
|
+
ids.forEach((er) => {
|
|
581
|
+
const idOb = new Identity();
|
|
582
|
+
idOb.id = this.createId();
|
|
583
|
+
idOb.uuid = er.id;
|
|
584
|
+
idOb.name = er.name;
|
|
585
|
+
idOb.type = 'Identity';
|
|
586
|
+
idChilds.children.push(idOb);
|
|
587
|
+
});
|
|
588
|
+
idChilds.name = "Accessible Identities(" + idChilds.children.length + ')';
|
|
589
|
+
erPolicyNode.data.children.push(idChilds);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
wait_promises.push(idpromise);
|
|
593
|
+
Promise.all(wait_promises).then(() => {
|
|
594
|
+
resolve('this is a promise');
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
598
|
+
return nd.children;
|
|
599
|
+
});
|
|
600
|
+
return [networkGraph, this.uniqId];
|
|
601
|
+
} // end
|
|
602
|
+
async processServiceEdgeRouterPoliciesForNodeClick(serviceErPolicyNode, networkGraph, serviceEdgeRouterPolicies, uniqId, zitiService) {
|
|
603
|
+
const myPromise = await new Promise((resolve, reject) => {
|
|
604
|
+
this.uniqId = uniqId;
|
|
605
|
+
const wait_promises = [];
|
|
606
|
+
const rawServiceERPolicy = serviceEdgeRouterPolicies.find((s) => s.name === serviceErPolicyNode.data.name);
|
|
607
|
+
const pagesize = 500;
|
|
608
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
609
|
+
const url = this.getLinkForResource(rawServiceERPolicy, 'edge-routers');
|
|
610
|
+
let routers = [];
|
|
611
|
+
const erpromise = zitiService.get(url, services_paging, [])
|
|
612
|
+
.then((result) => {
|
|
613
|
+
routers = result.data;
|
|
614
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
615
|
+
const promises = [];
|
|
616
|
+
for (let page = 2; page <= pages; page++) {
|
|
617
|
+
services_paging.page = page;
|
|
618
|
+
const tmp_promise = zitiService.get(url, services_paging, []).then((pageResult) => {
|
|
619
|
+
pageResult.data.forEach((serv) => {
|
|
620
|
+
routers.push(serv);
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
promises.push(tmp_promise);
|
|
624
|
+
wait_promises.push(tmp_promise);
|
|
625
|
+
} // end for loop
|
|
626
|
+
Promise.all(promises).then(() => {
|
|
627
|
+
const erChilds = new Children();
|
|
628
|
+
erChilds.id = this.createId();
|
|
629
|
+
routers.forEach((er) => {
|
|
630
|
+
const idOb = new ERouter();
|
|
631
|
+
idOb.id = this.createId();
|
|
632
|
+
idOb.uuid = er.id;
|
|
633
|
+
idOb.name = er.name;
|
|
634
|
+
idOb.type = 'Edge Router';
|
|
635
|
+
erChilds.children.push(idOb);
|
|
636
|
+
});
|
|
637
|
+
erChilds.name = "EdgeRouters(" + erChilds.children.length + ')';
|
|
638
|
+
serviceErPolicyNode.data.children.push(erChilds);
|
|
639
|
+
});
|
|
640
|
+
});
|
|
641
|
+
wait_promises.push(erpromise);
|
|
642
|
+
const services_pagingB = this.getPagingObject(pagesize);
|
|
643
|
+
const urlB = this.getLinkForResource(rawServiceERPolicy, 'services');
|
|
644
|
+
let serArray = [];
|
|
645
|
+
const serpromise = zitiService.get(urlB, services_pagingB, [])
|
|
646
|
+
.then((result) => {
|
|
647
|
+
serArray = result.data;
|
|
648
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
649
|
+
const promisesB = [];
|
|
650
|
+
for (let page = 2; page <= pages; page++) {
|
|
651
|
+
services_pagingB.page = page;
|
|
652
|
+
const tmp_promiseB = zitiService.get(urlB, services_pagingB, []).then((pageResult) => {
|
|
653
|
+
pageResult.data.forEach((serv) => {
|
|
654
|
+
serArray.push(serv);
|
|
655
|
+
});
|
|
656
|
+
});
|
|
657
|
+
promisesB.push(tmp_promiseB);
|
|
658
|
+
wait_promises.push(tmp_promiseB);
|
|
659
|
+
} // end for loop
|
|
660
|
+
Promise.all(promisesB).then(() => {
|
|
661
|
+
const srChilds = new Children();
|
|
662
|
+
srChilds.id = this.createId();
|
|
663
|
+
serArray.forEach((sr) => {
|
|
664
|
+
const srOb = new Service();
|
|
665
|
+
srOb.id = this.createId();
|
|
666
|
+
srOb.uuid = sr.id;
|
|
667
|
+
srOb.name = sr.name;
|
|
668
|
+
srOb.type = 'Service';
|
|
669
|
+
srChilds.children.push(srOb);
|
|
670
|
+
});
|
|
671
|
+
srChilds.name = "Services(" + srChilds.children.length + ')';
|
|
672
|
+
serviceErPolicyNode.data.children.push(srChilds);
|
|
673
|
+
});
|
|
674
|
+
});
|
|
675
|
+
wait_promises.push(serpromise);
|
|
676
|
+
Promise.all(wait_promises).then(() => {
|
|
677
|
+
resolve('this is a promise');
|
|
678
|
+
});
|
|
679
|
+
});
|
|
680
|
+
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
681
|
+
return nd.children;
|
|
682
|
+
});
|
|
683
|
+
return [networkGraph, this.uniqId];
|
|
684
|
+
} // end
|
|
685
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeNodeProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
686
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeNodeProcessor, providedIn: 'root' }); }
|
|
687
|
+
} // end of class
|
|
688
|
+
export { TreeNodeProcessor };
|
|
689
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeNodeProcessor, decorators: [{
|
|
690
|
+
type: Injectable,
|
|
691
|
+
args: [{
|
|
692
|
+
providedIn: 'root',
|
|
693
|
+
}]
|
|
694
|
+
}] });
|
|
695
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLnRyZWVub2RlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci50cmVlbm9kZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBRTlILE1BR2EsaUJBQWlCO0lBSDlCO1FBSUksV0FBTSxHQUFHLENBQUMsQ0FBQztLQXd4QmQ7SUF2eEJHLGVBQWUsQ0FBQyxRQUFRO1FBQ3RCLE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxRQUFRO1lBQ2YsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztRQUNGLE9BQVEsTUFBTSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsNkJBQTZCLENBQy9CLFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsT0FBTztRQUVYLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxNQUFNLGFBQWEsR0FBRyxF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QyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxFQUFFO2dCQUNuQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUUsQ0FBQztRQUVOLENBQUMsQ0FBQyxDQUFDO1FBRUYsWUFBWSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdkQsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLE1BQU07K0dBeHhCQyxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07RUEyeEJwQixlQUFlO1NBenhCSixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VydmljZVBvbGljeSwgQXR0cmlidXRlLCBDaGlsZHJlbiwgSWRlbnRpdHksIEVSb3V0ZXIsIEVSUG9saWN5LCBHcm91cCwgU2VydmljZSB9IGZyb20gJy4vbmV0d29yay12aXN1YWxpemVyLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVOb2RlUHJvY2Vzc29yIHtcbiAgICB1bmlxSWQgPSAwO1xuICAgIGdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSkge1xuICAgICAgY29uc3QgcGFnaW5nID0ge1xuICAgICAgICBzZWFyY2hPbjogJ25hbWUnLFxuICAgICAgICBub1NlYXJjaDogZmFsc2UsXG4gICAgICAgIGZpbHRlcjogJycsXG4gICAgICAgIHRvdGFsOiBwYWdlc2l6ZSxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgc29ydDogJ25hbWUnLFxuICAgICAgICBvcmRlcjogJ2FzYycsXG4gICAgICB9O1xuICAgICAgcmV0dXJuICBwYWdpbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0lkZW50aXRpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIGlkZW50aXR5Tm9kZSxcbiAgICAgICAgbmV0d29ya0dyYXBoLFxuICAgICAgICByYXdFbmRwb2ludHMsXG4gICAgICAgIHVuaXFJZCxcbiAgICAgICAgeml0aVNlcnZpY2UsXG4gICAgICAgIGNvbmZpZ3NcbiAgICApIHtcbiAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgIGNvbnN0IHJhd0VwID0gdGhpcy5maW5kUmF3RW5kcG9pbnQoaWRlbnRpdHlOb2RlLmRhdGEubmFtZSwgcmF3RW5kcG9pbnRzKTtcbiAgICAgICAgbGV0IHJhd0VwQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAocmF3RXAucm9sZUF0dHJpYnV0ZXMpIHtyYXdFcEF0dHJpYnV0ZXMgPSByYXdFcC5yb2xlQXR0cmlidXRlc307XG4gICAgICAgIHJhd0VwQXR0cmlidXRlcy5wdXNoKCdAJyArIHJhd0VwLm5hbWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0VwQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLm5hbWUgPSByYXdFcEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS50eXBlID0gJ0lkZW50aXR5IEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgIGNvbnN0IGJpbmRTZXJ2aWNlcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgY29uc3QgZGlhbFNlcnZpY2VzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICBiaW5kU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBkaWFsU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBsZXQgaWRlbnRpdHlTZXJ2aWNlUG9saWNpZXMgPSBbXTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd0VwLCAnc2VydmljZS1wb2xpY2llcycpLnJlcGxhY2UoJy4vJywgJycpO1xuXG4gICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcblxuICAgICAgIGNvbnN0IGZpcnN0UHJvbWlzZSA9ICBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VzX3VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAgICAgLnRoZW4oIGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZGVudGl0eVNlcnZpY2VQb2xpY2llcyA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3VybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eVNlcnZpY2VQb2xpY2llcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX3Byb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5U2VydmljZVBvbGljaWVzLmZpbmQoIGFzeW5jIChpc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmdPYiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJfdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoaXNwLCAnc2VydmljZXMnKS5yZXBsYWNlKCcuLycsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG1wUHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHNlcl91cmwsIHBhZ2luZ09iLCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bXBfc2VydmljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmZpbmQoIChyZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnYgPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnYubmFtZSA9IHJlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdG1wX3NlcnZpY2VzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3AudHlwZSA9PT0gJ0RpYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsU2VydmljZXMuY2hpbGRyZW4ucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kU2VydmljZXMuY2hpbGRyZW4ucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9wcm9taXNlcy5wdXNoKHRtcFByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaCh0bXBQcm9taXNlKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTsgLy8gbG9vcFxuICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHN1Yl9wcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihiaW5kU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoPjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRTZXJ2aWNlcy5uYW1lID0gJ0JpbmQtU2VydmljZXMoJytiaW5kU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoKycpJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYmluZFNlcnZpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRpYWxTZXJ2aWNlcy5jaGlsZHJlbi5sZW5ndGg+MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbFNlcnZpY2VzLm5hbWUgPSAnRGlhbC1TZXJ2aWNlcygnK2RpYWxTZXJ2aWNlcy5jaGlsZHJlbi5sZW5ndGgrJyknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHlOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChkaWFsU2VydmljZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKGZpcnN0UHJvbWlzZSk7XG4gICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICB9KTtcbiAgICAgICAgIHJldHVybiBbbmV0d29ya0dyYXBoLCB0aGlzLnVuaXFJZF07XG4gICAgfSAvLyBlbmQgb2YgZnVuY3Rpb25cblxuICAgIGNyZWF0ZUlkKCkge1xuICAgICAgICArK3RoaXMudW5pcUlkO1xuICAgICAgICByZXR1cm4gdGhpcy51bmlxSWQ7XG4gICAgfVxuXG4gICBjcmVhdGVTZXJ2aWNlTm9kZSggc3IpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZU9iID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgIHNlcnZpY2VPYi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgIHNlcnZpY2VPYi51dWlkID0gc3IuaWQ7XG4gICAgICAgICBzZXJ2aWNlT2IubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICBzZXJ2aWNlT2IudHlwZSA9ICdTZXJ2aWNlJztcbiAgICAgICByZXR1cm4gc2VydmljZU9iO1xuICAgfVxuXG4gIGFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCBvYikge1xuICAgIGlmICghYmluZElkbmV0aXRpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS51dWlkID09PSBvYi5pZCkpIHtcbiAgICAgICBjb25zdCBlcE9iID0gbmV3IElkZW50aXR5KCk7XG4gICAgICAgIGVwT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgIGVwT2IudXVpZCA9IG9iLmlkO1xuICAgICAgICBlcE9iLm5hbWUgPSBvYi5uYW1lO1xuICAgICAgICBlcE9iLm9ubGluZSA9IG9iLmhhc0FwaVNlc3Npb24gPT09IHRydWUgPyAnWWVzJyA6ICdObyc7XG4gICAgICAgIGVwT2IudHlwZSA9ICdJZGVudGl0eSc7XG4gICAgICAgIGVwT2Iuc3RhdHVzID0gb2Iub3MgIT09IG51bGwgPyAnUmVnaXN0ZXJlZCcgOiAnTm90IFJlZ2lzdGVyZWQnO1xuICAgICAgICBlcE9iLm9zID0gb2Iub3M7XG5cbiAgICAgIGJpbmRJZG5ldGl0aWVzLnB1c2goZXBPYik7XG4gICAgfVxuICAgIHJldHVybiBiaW5kSWRuZXRpdGllcztcbiAgfVxuXG4gIGdldExpbmtGb3JSZXNvdXJjZShvYiwgcmVzb3VyY2UpIHtcbiAgICByZXR1cm4gb2JbJ19saW5rcyddW3Jlc291cmNlXVsnaHJlZiddO1xuICB9XG5cbiAgIC8vQmluZCBEaWFsIFNlcnZpY2VzXG4gICAgZmluZFNlcnZpY2VzSG9zdGVkT25FbmRwb2ludChyYXdFcCwgc2VydmljZXMsIHNlcnZpY2VQb2xpY2llcywgeml0aVNlcnZpY2UpIHtcbiAgICAgICBjb25zdCBzZXJ2aWNlc0FyciA9IFtdO1xuICAgICAgICBjb25zdCBjaGlsZHJlbk5vR3JvdXBzID0gW107XG4gICAgICAgIGNvbnN0IGVuZHBvaW50QXR0ciA9IHJhd0VwLnJvbGVBdHRyaWJ1dGVzPyByYXdFcC5yb2xlQXR0cmlidXRlczogW107XG4gICAgICAgIGVuZHBvaW50QXR0ci5wdXNoKCdAJytyYXdFcC5pZCk7XG5cbiAgICAgICAgbGV0IGRpYWxTZXJ2aWNlQXR0cnMgPSBbXTtcbiAgICAgICAgbGV0IGJpbmRTZXJ2aWNlQXR0cnMgPSBbXTtcblxuICAgICAgICBjb25zdCBiaW5kUG9saWNpZXMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgYmluZFBvbGljaWVzLm5hbWUgPSAnQmluZC1Qb2xpY2llcyc7XG4gICAgICAgIGNvbnN0IGRpYWxQb2xpY2llcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgZGlhbFBvbGljaWVzLm5hbWUgPSAnRGlhbC1Qb2xpY2llcyc7XG5cbiAgICAgICAgYmluZFBvbGljaWVzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICBkaWFsUG9saWNpZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG5cbiAgICAgICAgc2VydmljZVBvbGljaWVzLmZpbmQoIChzcCkgPT4ge1xuICAgICAgICAgIHNwLmlkZW50aXR5Um9sZXMuZmluZCggKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVuZHBvaW50QXR0ci5pbmNsdWRlcyhhdHRyKSApIHtcbiAgICAgICAgICAgICAgIGlmIChzcC50eXBlID09PSAnQmluZCcpIHtcbiAgICAgICAgICAgICAgICAgICBjb25zdCBzUG9saWN5ID0gbmV3IFNlcnZpY2VQb2xpY3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzUG9saWN5LmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kubmFtZSA9IHNwLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS50eXBlID0gc3AudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzUG9saWN5LmNoaWxkcmVuID0gdGhpcy5nZXRTZXJ2aWNlc0ZvclBvbGljeShzZXJ2aWNlcywgc3ApO1xuICAgICAgICAgICAgICAgICAgIGJpbmRQb2xpY2llcy5jaGlsZHJlbi5wdXNoKHNwKTtcbiAgICAgICAgICAgICAgICAgICBiaW5kU2VydmljZUF0dHJzID0gZmlsbEFycmF5KGJpbmRTZXJ2aWNlQXR0cnMsIHNwLnNlcnZpY2VSb2xlcyk7XG4gICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICBjb25zdCBzUG9saWN5ID0gbmV3IFNlcnZpY2VQb2xpY3koKTtcbiAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgICBzUG9saWN5Lm5hbWUgPSBzcC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS50eXBlID0gc3AudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuY2hpbGRyZW4gPSB0aGlzLmdldFNlcnZpY2VzRm9yUG9saWN5KHNlcnZpY2VzLCBzcCkgO1xuICAgICAgICAgICAgICAgICBkaWFsUG9saWNpZXMuY2hpbGRyZW4ucHVzaChzUG9saWN5KTtcbiAgICAgICAgICAgICAgICBkaWFsU2VydmljZUF0dHJzID0gZmlsbEFycmF5KGRpYWxTZXJ2aWNlQXR0cnMsIHNwLnNlcnZpY2VSb2xlcyk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSApO1xuXG4gICAgICAgIGZ1bmN0aW9uIGZpbGxBcnJheShhcnIxLCBhcnIyKSB7XG4gICAgICAgICAgYXJyMi5mb3JFYWNoKCAoaXRlbSkgPT4ge1xuICAgICAgICAgICBhcnIxLnB1c2goaXRlbSk7XG4gICAgICAgICAgfSApO1xuICAgICAgICAgIHJldHVybiBhcnIxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmluZFNlcnZpY2VzID0gW107XG4gICAgICAgIGNvbnN0IGRpYWxTZXJ2aWNlcyA9IFtdO1xuXG4gICAgICAgIHNlcnZpY2VzICYmIHNlcnZpY2VzLmZvckVhY2goIChzcikgPT4ge1xuICAgICAgICAgIHNyLnJvbGVBdHRyaWJ1dGVzICYmIHNyLnJvbGVBdHRyaWJ1dGVzLmZvckVhY2goIChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgaWYgKGRpYWxTZXJ2aWNlQXR0cnMuaW5jbHVkZXMoYXR0cikgKSB7XG4gICAgICAgICAgICAgICBkaWFsU2VydmljZXMucHVzaCh0aGlzLmNyZWF0ZVNlcnZpY2VOb2RlKHNyKSApO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBpZiAoYmluZFNlcnZpY2VBdHRycy5pbmNsdWRlcyhhdHRyKSApIHtcbiAgICAgICAgICAgICAgICBiaW5kU2VydmljZXMucHVzaCggdGhpcy5jcmVhdGVTZXJ2aWNlTm9kZShzcikgKTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgfSApO1xuICAgICAgICB9KTtcbiAgICAgICBpZiAoZGlhbFNlcnZpY2VzLmxlbmd0aCA+MCApIHtcbiAgICAgICAgICBjb25zdCBkaWFsR3JvdXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICBkaWFsR3JvdXAuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgZGlhbEdyb3VwLm5hbWUgPSAnU2VydmljZXMtRGlhbCc7XG4gICAgICAgICAgZGlhbEdyb3VwLmNoaWxkcmVuID0gZGlhbFNlcnZpY2VzO1xuICAgICAgICAgIHNlcnZpY2VzQXJyLnB1c2goZGlhbEdyb3VwKTtcbiAgICAgICB9XG4gICAgICAgaWYgKGJpbmRTZXJ2aWNlcy5sZW5ndGggPjAgKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kR3JvdXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgIGJpbmRHcm91cC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGJpbmRHcm91cC5uYW1lID0gJ1NlcnZpY2VzLUJpbmQnO1xuICAgICAgICAgICAgYmluZEdyb3VwLmNoaWxkcmVuID0gYmluZFNlcnZpY2VzO1xuICAgICAgICAgICAgc2VydmljZXNBcnIucHVzaChiaW5kR3JvdXApO1xuICAgICAgIH1cbiAgICAgcmV0dXJuIHNlcnZpY2VzQXJyO1xuXG5cbiAgICB9IC8vIGVuZCBvZiBmaW5kIHNlcnZpY2VzSG9zdGVkT25FbmRwb2ludFxuXG4gICBnZXRTZXJ2aWNlc0ZvclBvbGljeShzZXJ2aWNlcywgc3BPYikge1xuICAgICBjb25zdCBzZXJ2aWNlc0ZvdFBvbGljeSA9IFtdO1xuICAgICBzZXJ2aWNlcyAmJiBzZXJ2aWNlcy5mb3JFYWNoKCAoc3IpID0+IHtcbiAgICAgICAgIGNvbnN0IGF0dHJzID0gc3Iucm9sZUF0dHJpYnV0ZXMgPyBzci5yb2xlQXR0cmlidXRlczogW107XG4gICAgICAgICBhdHRycy5wdXNoKCdAJytzcE9iLmlkKTtcbiAgICAgICAgIGF0dHJzLmZpbmQoIChhdHIpID0+IHtcbiAgICAgICAgICAgIGlmKHNwT2Iuc2VydmljZVJvbGVzLmluY2x1ZGVzKGF0cikgKXtcbiAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOb2RlID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgICAgICAgIHNlcnZpY2VOb2RlLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgc2VydmljZU5vZGUubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICAgICAgICBzZXJ2aWNlTm9kZS50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgIHNlcnZpY2VzRm90UG9saWN5LnB1c2goc2VydmljZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgIH0pO1xuICAgIHJldHVybiBzZXJ2aWNlc0ZvdFBvbGljeTtcbiAgIH1cblxuICAgIGZpbmRSYXdFbmRwb2ludChlcE5hbWUsIGVuZHBvaW50cykge1xuICAgICAgIHJldHVybiBlbmRwb2ludHMuZmluZCgoZXApID0+IGVwLm5hbWUgPT09IGVwTmFtZSk7XG4gICAgfVxuXG4gIGFzeW5jIHByb2Nlc3NTZXJ2aWNlc0Zvck5vZGVDbGljayhzZXJ2aWNlTm9kZSwgbmV0d29ya0dyYXBoLCBzZXJ2aWNlcywgdW5pcUlkLCB6aXRpU2VydmljZSkge1xuICAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcUlkID0gdW5pcUlkO1xuICAgICAgICBjb25zdCByYXdTZXJ2aWNlT2JqID0gc2VydmljZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBzZXJ2aWNlTm9kZS5kYXRhLm5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXN3aXRoTmFtZSA9IFtdO1xuICAgICAgICBhdHRyaWJ1dGVzd2l0aE5hbWUucHVzaCgnQCcgKyByYXdTZXJ2aWNlT2JqLm5hbWUpO1xuICAgICAgICByYXdTZXJ2aWNlT2JqLnJvbGVBdHRyaWJ1dGVzICYmIHJhd1NlcnZpY2VPYmoucm9sZUF0dHJpYnV0ZXMuZmluZCgoc3JhdHRyKSA9PiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzd2l0aE5hbWUucHVzaChzcmF0dHIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VydmljZUF0dHJpYnV0ZXMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgc2VydmljZUF0dHJpYnV0ZXMudHlwZSA9ICdTZXJ2aWNlQXR0cmlidXRlcyc7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGF0dHJpYnV0ZXN3aXRoTmFtZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgYXR0ck9iID0gbmV3IEF0dHJpYnV0ZSgpO1xuICAgICAgICAgICAgYXR0ck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgYXR0ck9iLm5hbWUgPSBhdHRyaWJ1dGVzd2l0aE5hbWVba107XG4gICAgICAgICAgICBhdHRyT2IudHlwZSA9ICdTZXJ2aWNlIEF0dHJpYnV0ZSc7XG5cbiAgICAgICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLmNoaWxkcmVuLnB1c2goYXR0ck9iKTtcbiAgICAgICAgfSAvLyBlbmQgaW5uZXIgZm9yIGxvb3BcbiAgICAgICAgaWYgKHNlcnZpY2VBdHRyaWJ1dGVzLmNoaWxkcmVuLmxlbmd0aCA+MCApIHtcbiAgICAgICAgICAgc2VydmljZUF0dHJpYnV0ZXMubmFtZSA9ICdTZXJ2aWNlIEF0dHJpYnV0ZXMoJysgc2VydmljZUF0dHJpYnV0ZXMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goc2VydmljZUF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlcnZpY2VfY29uZmlncyA9IFtdO1xuICAgICAgICBjb25zdCBjb25maWdzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd1NlcnZpY2VPYmosICdjb25maWdzJyk7XG4gICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgICAgICBjb25zdCBwYWdpbmdPYiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgY29uc3QgY29uZmlnUHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAuZ2V0KGNvbmZpZ3NfdXJsLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAudGhlbigoY29uZmlncykgPT4ge1xuICAgICAgICAgICBzZXJ2aWNlX2NvbmZpZ3MgPSBjb25maWdzICYmIGNvbmZpZ3MuZGF0YSA/IGNvbmZpZ3MuZGF0YSA6IFtdO1xuICAgICAgICB9KTtcbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goY29uZmlnUHJvbWlzZSk7XG4gICAgICAgY29uc3Qgc2VydmljZV9lZGdlX3JvdXRlcl9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgIHJhd1NlcnZpY2VPYmosXG4gICAgICAgICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJ1xuICAgICAgICk7XG4gICAgICAgY29uc3Qgc2VydmljZV9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgcmF3U2VydmljZU9iaixcbiAgICAgICAgJ3NlcnZpY2UtcG9saWNpZXMnXG4gICAgICAgKS5yZXBsYWNlKCcuLycsICcnKTsgLy8gZGlhbCwgQmluZCBpbmZvXG5cbiAgICAgICBsZXQgYmluZFBvbGljaWVzID0gW107XG4gICAgICAgbGV0IGJpbmRJZG5ldGl0aWVzID0gW107XG4gICAgICAgY29uc3QgcHJvbWlzZTIgPSBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgIC5nZXQoc2VydmljZV9wb2xpY2llc191cmwsIHBhZ2luZ09iLCBbXSlcbiAgICAgICAudGhlbigocG9saWNpZXMpID0+IHtcbiAgICAgICAgIGNvbnN0IGlkZW50aXR5UHJvbWlzZXMgPSBbXTtcbiAgICAgICAgIHBvbGljaWVzLmRhdGEuZm9yRWFjaCggYXN5bmMgKHBvbGljeSkgPT4ge1xuICAgICAgICAgIGlmIChwb2xpY3kudHlwZSA9PT0gJ0JpbmQnKSAge1xuICAgICAgICAgICAgY29uc3QgYmluZElkZW50aXRpZXNVcmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgICAgICAgcG9saWN5LFxuICAgICAgICAgICAgICAnaWRlbnRpdGllcydcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICBjb25zdCBwcm9tc2UgPSBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KGJpbmRJZGVudGl0aWVzVXJsLnJlcGxhY2UoJy4vJywgJycpLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbVRvQXJyYXkoYmluZElkbmV0aXRpZXMsIHJzKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCByZXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWRlbnRpdHlQcm9taXNlcy5wdXNoKHByb21zZSk7XG4gICAgICAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChwcm9tc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5hbGwoaWRlbnRpdHlQcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0bXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICB0bXAubmFtZSA9IFwiQmluZCBJZGVudGl0aWVzKFwiICsgYmluZElkbmV0aXRpZXMubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgdG1wLnR5cGUgPSBcIklkZW50aXRpZXNcIjtcbiAgICAgICAgICAgICB0bXAuY2hpbGRyZW4gPSBiaW5kSWRuZXRpdGllcztcbiAgICAgICAgICAgICB0bXAuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgc2VydmljZU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKHRtcCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2gocHJvbWlzZTIpO1xuICAgICAgIFByb21pc2UuYWxsKHdhaXRfcHJvbWlzZXMpLnRoZW4oICgpID0+IHtcbiAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgfSk7XG4gICAgfSk7IC8vIGVuZCBvZiBteXByb21pc2VcblxuICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgIH0pO1xuICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgfSAvLyBlbmQgb2YgcHJvY2Vzc1NlcnZpY2VzRm9yTm9kZUNsaWNrXG5cblxuICBhc3luYyBwcm9jZXNzU2VydmljZVBvbGljaWVzRm9yTm9kZUNsaWNrKHBvbGljeU5vZGUsIG5ldHdvcmtHcmFwaCwgIHNlcnZpY2VQb2xpY2llcywgdW5pcUlkLCB6aXRpU2VydmljZSkge1xuXG4gICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKCBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgIGNvbnN0IHJhd1NQb2xpY3kgPSBzZXJ2aWNlUG9saWNpZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBwb2xpY3lOb2RlLmRhdGEubmFtZSk7XG4gICAgICAgICAgY29uc3QgcGFnZXNpemUgPSA1MDA7XG4gICAgICAgICAgY29uc3Qgc2VydmljZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgIGNvbnN0IGJpbmRJZGVudGl0aWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoIHJhd1NQb2xpY3ksICdpZGVudGl0aWVzJyApO1xuICAgICAgIGNvbnN0IHNwX3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoYmluZElkZW50aXRpZXNVcmwsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAgLnRoZW4oKGlkcykgPT4ge1xuICAgICAgICAgY29uc3QgY2hpbGRzID1uZXcgQ2hpbGRyZW4oKVxuICAgICAgICAgICAgIGNoaWxkcy5uYW1lID0gcmF3U1BvbGljeS50eXBlKyAnSWRlbnRpdGllcyc7XG4gICAgICAgICBjaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICBpZHMuZGF0YS5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICBjb25zdCBlcCA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgZXAuaWQgPSBpZE9iLmlkO1xuICAgICAgICAgICAgZXAubmFtZSA9IGlkT2IubmFtZTtcbiAgICAgICAgICAgIGVwLnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgICAgICAgY2hpbGRzLmNoaWxkcmVuLnB1c2goZXApO1xuICAgICAgICAgfSk7XG4gICAgICAgICBjaGlsZHMubmFtZSA9IGNoaWxkcy5uYW1lICsgJygnICsgY2hpbGRzLmNoaWxkcmVuLmxlbmd0aCsnKSc7XG4gICAgICAgICBwb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChjaGlsZHMpO1xuICAgICAgIH0pO1xuICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChzcF9wcm9taXNlKTtcbiAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICByZXNvbHZlKCdyZXNvbHZlLicpO1xuICAgICAgICB9KTtcblxuICAgICB9KTsgLy8gZW5kIG15cHJvbWlzZVxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH1cblxuICAgYXN5bmMgcHJvY2Vzc0VkZ2Vyb3V0ZXJzRm9yTm9kZUNsaWNrKFxuICAgICAgICBlZGdlcm91dGVyTm9kZSxcbiAgICAgICAgbmV0d29ya0dyYXBoLFxuICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgIClcbiAgICB7XG4gICAgIGNvbnN0IG1haW5Qcm9taXNlID0gYXdhaXQgbmV3IFByb21pc2UoIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd2FpdF9wcm9taXNlcyA9IFtdO1xuICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgY29uc3QgZXIgPSBlZGdlcm91dGVycy5maW5kKChzKSA9PiBzLm5hbWUgPT09IGVkZ2Vyb3V0ZXJOb2RlLmRhdGEubmFtZSk7XG4gICAgICAgIGNvbnN0IGVyQXR0cmlidXRlcyA9IGVyLnJvbGVBdHRyaWJ1dGVzPyBlci5yb2xlQXR0cmlidXRlczogW107XG5cbiAgICAgICAgIGVyQXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHQgPSBuZXcgQXR0cmlidXRlKCk7XG4gICAgICAgICAgICBhdHQuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICBhdHQubmFtZSA9IGF0dHI7XG4gICAgICAgICAgICBhdHQudHlwZSA9ICdFZGdlIFJvdXRlciBBdHRyaWJ1dGUnO1xuICAgICAgICAgICAgZWRnZXJvdXRlck5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGF0dCk7XG4gICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgY29uc3QgZXJwb2xpY2llc1VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKGVyLCAnZWRnZS1yb3V0ZXItcG9saWNpZXMnKTtcbiAgICAgICBsZXQgZXJwb2xpY2llc0ZvckVSID0gW107XG4gICAgICAgY29uc3QgZXJwb2xpY2llc3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoZXJwb2xpY2llc1VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAudGhlbiggYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGVycG9saWNpZXNGb3JFUiA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJwb2xpY2llc1VybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICApIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnBvbGljaWVzRm9yRVIucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgfSAvLyBlbmQgZm9yIGxvb3BcbiAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgIGNvbnN0IGVycG9sQ2hpbGRzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgICAgICAgZXJwb2xDaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgZXJwb2xpY2llc0ZvckVSLmZvckVhY2goIChwb2wpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2xpY3kgPSBuZXcgRVJQb2xpY3koKTtcbiAgICAgICAgICAgICAgICBwb2xpY3kuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgcG9saWN5LnV1aWQgPSBwb2wuaWQ7XG4gICAgICAgICAgICAgICAgcG9saWN5Lm5hbWUgPSBwb2wubmFtZTtcbiAgICAgICAgICAgICAgICBwb2xpY3kudHlwZSA9ICdSb3V0ZXIgUG9saWN5JztcbiAgICAgICAgICAgICAgICBlcnBvbENoaWxkcy5jaGlsZHJlbi5wdXNoKHBvbGljeSk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlcnBvbENoaWxkcy5uYW1lID0gXCJFZGdlIFJvdXRlciBQb2xpY2llcyhcIisgZXJwb2xDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlZGdlcm91dGVyTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goZXJwb2xDaGlsZHMpO1xuICAgICAgICAgICB9KTtcbiAgICAgICB9KTtcbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goZXJwb2xpY2llc3Byb21pc2UpO1xuXG4gICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgfSk7XG4gICAgIH0pO1xuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgIH1cblxuICAgIHNlcnZpY2VHcm91cGluZyhzZXJ2aWNlc0NoaWxkcmVuLCBzZXJ2aWNlc3RyZWUpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xSRFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLVJEUF0nLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIGNyZWF0ZWQgZm9yIFJEUCBwcm90b2NvbCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xIVFRQU0dycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtSFRUUFNdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFBTIHByb3RvY29sJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBwcm90b2NvbEhUVFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLUhUVFBdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFAgcHJvdG9jb2wnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByb3RvY29sRlRQR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJZCgpLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIFtwcm90b2NvbC1GVFBdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEZUUCBwcm90b2NvbCdcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBhYmNkR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtBLURdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBBIHRvIEQnKTtcbiAgICAgICAgY29uc3QgZWZnaEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbRS1IXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggRSB0byBIJyk7XG4gICAgICAgIGNvbnN0IGlqa2xHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW0ktTF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIEkgdG8gTCcpO1xuICAgICAgICBjb25zdCBtbm9wR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtNLVBdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBNIHRvIFAnKTtcbiAgICAgICAgY29uc3QgcXJzdEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbRy1UXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggUSB0byBUJyk7XG4gICAgICAgIGNvbnN0IHV2d3hHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW1UtWF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIFUgdG8gWCcpO1xuICAgICAgICBjb25zdCB5ekdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbWS1aXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggWSBhbmQgWicpO1xuICAgICAgICBjb25zdCBvbmVUbzlHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgWzEtOV0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIDAgdG8gOScpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VydmljZXN0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlb2JqID0gc2VydmljZXN0cmVlW2ldO1xuICAgICAgICAgICAgY29uc3QgY2hhID0gc2VydmljZW9iai5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoc2VydmljZW9iai5wcm90b2NvbCA9PT0gJ3JkcCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQU0dycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZW9iai5wcm90b2NvbCA9PT0gJ2Z0cCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAnZScgfHwgY2hhID09PSAnZicgfHwgY2hhID09PSAnZycgfHwgY2hhID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ2knIHx8IGNoYSA9PT0gJ2onIHx8IGNoYSA9PT0gJ2snIHx8IGNoYSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIG1ub3BHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAncScgfHwgY2hhID09PSAncicgfHwgY2hhID09PSAncycgfHwgY2hhID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ3UnIHx8IGNoYSA9PT0gJ3YnIHx8IGNoYSA9PT0gJ3cnIHx8IGNoYSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgIHl6R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzAnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnMScgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzMnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNCcgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc1JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzYnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNycgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc4JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzknXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBlbmQgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgIGlmIChwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLm5hbWUgPSBwcm90b2NvbFJEUEdycC5uYW1lICsgJygnICsgcHJvdG9jb2xSRFBHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sUkRQR3JwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm90b2NvbEhUVFBTR3JwLm5hbWUgPSBwcm90b2NvbEhUVFBTR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChwcm90b2NvbEhUVFBTR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdG9jb2xIVFRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5uYW1lID0gcHJvdG9jb2xIVFRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvdG9jb2xGVFBHcnAubmFtZSA9IHByb3RvY29sRlRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocHJvdG9jb2xGVFBHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhYmNkR3JwLm5hbWUgPSBhYmNkR3JwLm5hbWUgKyAnKCcgKyBhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChhYmNkR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZnaEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWZnaEdycC5uYW1lID0gZWZnaEdycC5uYW1lICsgJygnICsgZWZnaEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goZWZnaEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlqa2xHcnAubmFtZSA9IGlqa2xHcnAubmFtZSArICcoJyArIGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGlqa2xHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1ub3BHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtbm9wR3JwLm5hbWUgPSBtbm9wR3JwLm5hbWUgKyAnKCcgKyBtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChtbm9wR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXJzdEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcXJzdEdycC5uYW1lID0gcXJzdEdycC5uYW1lICsgJygnICsgcXJzdEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocXJzdEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHV2d3hHcnAubmFtZSA9IHV2d3hHcnAubmFtZSArICcoJyArIHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHV2d3hHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ekdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHl6R3JwLm5hbWUgPSB5ekdycC5uYW1lICsgJygnICsgeXpHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHl6R3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uZVRvOUdycC5uYW1lID0gb25lVG85R3JwLm5hbWUgKyAnKCcgKyBvbmVUbzlHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG9uZVRvOUdycCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VydmljZXNDaGlsZHJlbi5uYW1lID0gc2VydmljZXNDaGlsZHJlbi5uYW1lICsgJygnICsgc2VydmljZXN0cmVlLmxlbmd0aCArICcpJztcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzQ2hpbGRyZW47XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0Zvck5vZGVDbGljayhcbiAgICAgICAgZXJQb2xpY3lOb2RlLFxuICAgICAgICBuZXR3b3JrR3JhcGgsXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgICAgY29uc3QgcmF3RVJQb2xpY3kgPSBlZGdlUm91dGVyUG9saWNpZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBlclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3RVJQb2xpY3ksICdpZGVudGl0aWVzJyk7XG4gICAgICAgICAgbGV0IGlkcyA9IFtdO1xuICAgICAgICAgIGNvbnN0IGlkcHJvbWlzZSA9IHppdGlTZXJ2aWNlLmdldCh1cmwsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWRzID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0geml0aVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICApIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgaWRDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBpZENoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBpZHMuZm9yRWFjaCggKGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRPYiA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgICAgIGlkT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgaWRPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWRPYi5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICBpZE9iLnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgICAgICAgICAgIGlkQ2hpbGRzLmNoaWxkcmVuLnB1c2goaWRPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlkQ2hpbGRzLm5hbWUgPSBcIkFjY2Vzc2libGUgSWRlbnRpdGllcyhcIisgaWRDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGlkQ2hpbGRzKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChpZHByb21pc2UpO1xuICAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH0gLy8gZW5kXG5cbiAgYXN5bmMgcHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIHNlcnZpY2VFclBvbGljeU5vZGUsXG4gICAgICAgIG5ldHdvcmtHcmFwaCxcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgY29uc3QgcmF3U2VydmljZUVSUG9saWN5ID0gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHNlcnZpY2VFclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3U2VydmljZUVSUG9saWN5LCAnZWRnZS1yb3V0ZXJzJyk7XG4gICAgICAgICAgbGV0IHJvdXRlcnMgPSBbXTtcbiAgICAgICAgICBjb25zdCBlcnByb21pc2UgPSB6aXRpU2VydmljZS5nZXQodXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJvdXRlcnMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlcnMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgZXJDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBlckNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICByb3V0ZXJzLmZvckVhY2goIChlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkT2IgPSBuZXcgRVJvdXRlcigpO1xuICAgICAgICAgICAgICAgIGlkT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgaWRPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWRPYi5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICBpZE9iLnR5cGUgPSAnRWRnZSBSb3V0ZXInO1xuICAgICAgICAgICAgICAgIGVyQ2hpbGRzLmNoaWxkcmVuLnB1c2goaWRPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlckNoaWxkcy5uYW1lID0gXCJFZGdlUm91dGVycyhcIisgZXJDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBzZXJ2aWNlRXJQb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChlckNoaWxkcyk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goZXJwcm9taXNlKTtcblxuICAgICAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZ0IgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG5cbiAgICAgICAgICBjb25zdCB1cmxCID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3U2VydmljZUVSUG9saWN5LCAnc2VydmljZXMnKTtcbiAgICAgICAgICBsZXQgc2VyQXJyYXkgPSBbXTtcbiAgICAgICAgICBjb25zdCBzZXJwcm9taXNlID0geml0aVNlcnZpY2UuZ2V0KHVybEIsIHNlcnZpY2VzX3BhZ2luZ0IsIFtdKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHNlckFycmF5ID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlc0IgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nQi5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2VCID0geml0aVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nQixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlckFycmF5LnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcHJvbWlzZXNCLnB1c2godG1wX3Byb21pc2VCKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlQik7XG4gICAgICAgICAgICB9IC8vIGVuZCBmb3IgbG9vcFxuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXNCKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICBjb25zdCBzckNoaWxkcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIHNyQ2hpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgIHNlckFycmF5LmZvckVhY2goIChzcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyT2IgPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgIHNyT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgc3JPYi51dWlkID0gc3IuaWQ7XG4gICAgICAgICAgICAgICAgc3JPYi5uYW1lID0gc3IubmFtZTtcbiAgICAgICAgICAgICAgICBzck9iLnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICAgICAgc3JDaGlsZHMuY2hpbGRyZW4ucHVzaChzck9iKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgc3JDaGlsZHMubmFtZSA9IFwiU2VydmljZXMoXCIrIHNyQ2hpbGRzLmNoaWxkcmVuLmxlbmd0aCArJyknO1xuICAgICAgICAgICAgICBzZXJ2aWNlRXJQb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChzckNoaWxkcyk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goc2VycHJvbWlzZSk7XG5cbiAgICAgICAgIFByb21pc2UuYWxsKHdhaXRfcHJvbWlzZXMpLnRoZW4oICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgICB9IC8vIGVuZFxufSAvLyBlbmQgb2YgY2xhc3NcbiJdfQ==
|