@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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLnRyZWVub2RlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci50cmVlbm9kZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBRTlILE1BR2EsaUJBQWlCO0lBSDlCO1FBSUksV0FBTSxHQUFHLENBQUMsQ0FBQztLQXd4QmQ7SUF2eEJHLGVBQWUsQ0FBQyxRQUFRO1FBQ3RCLE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxRQUFRO1lBQ2YsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztRQUNGLE9BQVEsTUFBTSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsNkJBQTZCLENBQy9CLFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsT0FBTztRQUVYLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN6RSxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFO2dCQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFBO2FBQUM7WUFBQSxDQUFDO1lBQ25FLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsU0FBUyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQy9CLFNBQVMsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxTQUFTLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO2dCQUN0QyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDOUM7WUFFWCxNQUFNLFlBQVksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDcEMsWUFBWSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsWUFBWSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7WUFDakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFMUYsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdEQsTUFBTSxZQUFZLEdBQUksTUFBTSxXQUFXO2lCQUMvQixHQUFHLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUM7aUJBQ3RDLElBQUksQ0FBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3RCLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ3hDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUM1QixNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVc7eUJBQ2xDLEdBQUcsQ0FDRixZQUFZLEVBQ1osZUFBZSxFQUNmLEVBQUUsQ0FDSDt5QkFDQSxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFDbkIsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTs0QkFDL0IsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNyQyxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMzQixhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNqQztnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBRSxHQUFHLEVBQUU7b0JBQy9CLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFDeEIsdUJBQXVCLENBQUMsSUFBSSxDQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3QkFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUMxRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFdBQVc7NkJBQy9CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQzs2QkFDMUIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7NEJBQ2IsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDOzRCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO2dDQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dDQUN6QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO2dDQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztnQ0FDdEIsNEJBQTRCO2dDQUM3QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO29DQUNyQixZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQ0FDbkM7cUNBQU07b0NBQ0osWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUNBQ3BDOzRCQUVOLENBQUMsQ0FBRSxDQUFDO3dCQUVWLENBQUMsQ0FBQyxDQUFDO3dCQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzlCLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBRXBDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ2xDLElBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFOzRCQUNoQyxZQUFZLENBQUMsSUFBSSxHQUFHLGdCQUFnQixHQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFDLEdBQUcsQ0FBQzs0QkFDdEUsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUNoRDt3QkFDRCxJQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRTs0QkFDaEMsWUFBWSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsR0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBQyxHQUFHLENBQUM7NEJBQ3RFLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzt5QkFDaEQ7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztZQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxFQUFFO2dCQUNwQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztRQUVMLENBQUMsQ0FBQyxDQUFDO1FBRUYsWUFBWSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdEQsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0MsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLGtCQUFrQjtJQUVwQixRQUFRO1FBQ0osRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRixpQkFBaUIsQ0FBRSxFQUFFO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDL0IsU0FBUyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0IsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUN6QixTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUM3QixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUYsY0FBYyxDQUFDLGNBQWMsRUFBRSxFQUFFO1FBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvRCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFbEIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsUUFBUTtRQUM3QixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUEsb0JBQW9CO0lBQ25CLDRCQUE0QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFdBQVc7UUFDdkUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFaEMsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFMUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNqQyxZQUFZLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLFlBQVksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO1FBRXhDLFlBQVksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLFlBQVksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWxDLGVBQWUsQ0FBQyxJQUFJLENBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMzQixFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM1QixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUc7b0JBQ2pDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7d0JBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7d0JBQzlCLE9BQU8sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUM3QixPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDdkIsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDL0IsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDbkU7eUJBQU07d0JBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQzt3QkFDaEMsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzdCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDdkIsT0FBTyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUN2QixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUU7d0JBQ2hFLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNoRTtpQkFDRDtZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFFLENBQUM7UUFFSixTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSTtZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFFLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBRXhCLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDbkMsRUFBRSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN0RCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRztvQkFDcEMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQztpQkFDaEQ7Z0JBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUc7b0JBQ25DLFlBQVksQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7aUJBQ2xEO1lBQ0osQ0FBQyxDQUFFLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRSxDQUFDLEVBQUc7WUFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNqQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixTQUFTLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztZQUNqQyxTQUFTLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztZQUNsQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFFLENBQUMsRUFBRztZQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO1lBQ2xDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDaEM7UUFDSCxPQUFPLFdBQVcsQ0FBQztJQUdwQixDQUFDLENBQUMsdUNBQXVDO0lBRTFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxJQUFJO1FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDakMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixLQUFLLENBQUMsSUFBSSxDQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLE1BQU0sV0FBVyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ2xDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNqQyxXQUFXLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO29CQUMvQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3BDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNKLE9BQU8saUJBQWlCLENBQUM7SUFDMUIsQ0FBQztJQUVBLGVBQWUsQ0FBQyxNQUFNLEVBQUUsU0FBUztRQUM5QixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVILEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVztRQUN2RixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksT0FBTyxDQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3RSxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUM5QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxhQUFhLENBQUMsY0FBYyxJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ3pFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN6QyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7WUFDN0MsaUJBQWlCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztnQkFFbEMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzQyxDQUFDLHFCQUFxQjtZQUN2QixJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUUsQ0FBQyxFQUFHO2dCQUN4QyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcscUJBQXFCLEdBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7Z0JBQ3hGLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3BEO1lBRUQsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxXQUFXO2lCQUNyQyxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7aUJBQzlCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNoQixlQUFlLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztZQUNKLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzlELGFBQWEsRUFDZCw4QkFBOEIsQ0FDOUIsQ0FBQztZQUNGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNuRCxhQUFhLEVBQ2Isa0JBQWtCLENBQ2xCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtZQUV2QyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVztpQkFDakMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7aUJBQ3ZDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNqQixNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztnQkFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUN2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFHO3dCQUMzQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDL0MsTUFBTSxFQUNOLFlBQVksQ0FDYixDQUFDO3dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVzs2QkFDOUIsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQzs2QkFDdEQsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7NEJBQ1osSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dDQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO29DQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQ0FDMUMsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7aUNBQU07Z0NBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUMvQzt3QkFFRixDQUFDLENBQUMsQ0FBQzt3QkFDSixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzlCLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzVCO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUMxQixHQUFHLENBQUMsSUFBSSxHQUFHLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxNQUFNLEdBQUUsR0FBRyxDQUFDO29CQUMzRCxHQUFHLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztvQkFDeEIsR0FBRyxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7b0JBQzlCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFRixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFFLEdBQUcsRUFBRTtnQkFDcEMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUV0QixZQUFZLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUN4RCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDRixPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMscUNBQXFDO0lBR3ZDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFHLGVBQWUsRUFBRSxNQUFNLEVBQUUsV0FBVztRQUVyRyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksT0FBTyxDQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RSxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBRSxVQUFVLEVBQUUsWUFBWSxDQUFFLENBQUM7WUFDOUUsTUFBTSxVQUFVLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUM7aUJBQy9FLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLE1BQU0sTUFBTSxHQUFFLElBQUksUUFBUSxFQUFFLENBQUE7Z0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRSxZQUFZLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUN6QixNQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUN6QixFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2hCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDcEIsRUFBRSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7b0JBQ3JCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QixDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFDLEdBQUcsQ0FBQztnQkFDN0QsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBRSxHQUFHLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUVOLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ2pCLFlBQVksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3ZELE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRixLQUFLLENBQUMsOEJBQThCLENBQy9CLGNBQWMsRUFDZCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixXQUFXO1FBR2QsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzlELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEUsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRTdELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNoQixHQUFHLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDO2dCQUNuQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDMUUsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDO2lCQUNsRixJQUFJLENBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQixlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDdkMsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQzVCLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FDeEIsYUFBYSxFQUNiLGVBQWUsRUFDZixFQUFFLENBQ2hCLENBQUUsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQ3JCLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7NEJBQy9CLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdCLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO29CQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzNCLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2xDLENBQUMsZUFBZTtnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNuQyxXQUFXLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDakMsZUFBZSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUM5QixNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDNUIsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ3ZCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO3dCQUM5QixXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDckMsQ0FBQyxDQUFDLENBQUM7b0JBQ0QsV0FBVyxDQUFDLElBQUksR0FBRyx1QkFBdUIsR0FBRSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRSxHQUFHLENBQUM7b0JBQzdFLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztZQUNILGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUV0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBRSxHQUFHLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDQSxZQUFZLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUN2RCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUEsZUFBZSxDQUFDLGdCQUFnQixFQUFFLFlBQVk7UUFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZix5QkFBeUIsRUFDekIsbUNBQW1DLENBQ3RDLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFHLElBQUksS0FBSyxDQUM5QixJQUFJLENBQUMsUUFBUSxFQUFFLEVBQ2YsMkJBQTJCLEVBQzNCLG9DQUFvQyxDQUN2QyxDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsSUFBSSxLQUFLLENBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZiwwQkFBMEIsRUFDMUIsbUNBQW1DLENBQ3RDLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssQ0FDNUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLHlCQUF5QixFQUN6QixrQ0FBa0MsQ0FDckMsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBRWxHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVwRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFO2dCQUMvQixjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM1QztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO2dCQUN4QyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzlDO2lCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsS0FBSyxNQUFNLEVBQUU7Z0JBQ3ZDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzdDO2lCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7Z0JBQ3RDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVDO2lCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtnQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO2dCQUNqRSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNyQztpQkFBTSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUU7Z0JBQ2pFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtnQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO2dCQUNqRSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNyQztpQkFBTSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUU7Z0JBQ2pFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO2dCQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNuQztpQkFBTSxJQUNILEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHO2dCQUNYLEdBQUcsS0FBSyxHQUFHLEVBQ2I7Z0JBQ0UsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDdkM7U0FDSixDQUFDLG9CQUFvQjtRQUV0QixJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILGNBQWMsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ3ZGLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUM3RixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILGVBQWUsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQzFGLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILGNBQWMsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ3ZGLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQzVELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ3hFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDN0M7UUFDRCxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNoRixPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMscUNBQXFDLENBQ3ZDLFlBQVksRUFDWixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixXQUFXO1FBRVosTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyRCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEYsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMvRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDO2lCQUMxRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDZixHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDeEMsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQzVCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQ2xCLEdBQUcsRUFDSCxlQUFlLEVBQ2YsRUFBRSxDQUNoQixDQUFFLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUNyQixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFOzRCQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNqQixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMzQixhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNqQyxDQUFDLGVBQWU7Z0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDaEMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzlCLEdBQUcsQ0FBQyxPQUFPLENBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTt3QkFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzt3QkFDdkIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxDQUFDO29CQUNGLFFBQVEsQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLEdBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUUsR0FBRyxDQUFDO29CQUN2RSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7WUFDSixhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFFLEdBQUcsRUFBRTtnQkFDbEMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFFLENBQUM7UUFFTixDQUFDLENBQUMsQ0FBQztRQUVGLFlBQVksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3ZELE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxNQUFNO0lBRVYsS0FBSyxDQUFDLDRDQUE0QyxDQUM1QyxtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixNQUFNLEVBQ04sV0FBVztRQUVaLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sa0JBQWtCLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzRyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDeEUsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUM7aUJBQzFELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNmLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDdEUsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO29CQUN4QyxlQUFlLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDNUIsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDbEIsR0FBRyxFQUNILGVBQWUsRUFDZixFQUFFLENBQ2hCLENBQUUsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQ3JCLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7NEJBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3JCLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO29CQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzNCLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2pDLENBQUMsZUFBZTtnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNoQyxRQUFRLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDOUIsT0FBTyxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO3dCQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO3dCQUMxQixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLENBQUM7b0JBQ0QsUUFBUSxDQUFDLElBQUksR0FBRyxjQUFjLEdBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUUsR0FBRyxDQUFDO29CQUM5RCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztZQUNKLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFN0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXhELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDbEIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO2lCQUM3RCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDZixRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDckIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDeEMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDN0IsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixFQUFFLENBQ2hCLENBQUUsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQ3JCLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7NEJBQy9CLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3RCLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO29CQUNMLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ2xDLENBQUMsZUFBZTtnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNoQyxRQUFRLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO3dCQUN0QixNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO3dCQUN0QixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLENBQUM7b0JBQ0YsUUFBUSxDQUFDLElBQUksR0FBRyxXQUFXLEdBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUUsR0FBRyxDQUFDO29CQUMzRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEQsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztZQUNKLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxFQUFFO2dCQUNuQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUUsQ0FBQztRQUVOLENBQUMsQ0FBQyxDQUFDO1FBRUYsWUFBWSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdkQsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLE1BQU07K0dBeHhCQyxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07RUEyeEJwQixlQUFlO1NBenhCSixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VydmljZVBvbGljeSwgQXR0cmlidXRlLCBDaGlsZHJlbiwgSWRlbnRpdHksIEVSb3V0ZXIsIEVSUG9saWN5LCBHcm91cCwgU2VydmljZSB9IGZyb20gJy4vbmV0d29yay12aXN1YWxpemVyLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVOb2RlUHJvY2Vzc29yIHtcbiAgICB1bmlxSWQgPSAwO1xuICAgIGdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSkge1xuICAgICAgY29uc3QgcGFnaW5nID0ge1xuICAgICAgICBzZWFyY2hPbjogJ25hbWUnLFxuICAgICAgICBub1NlYXJjaDogZmFsc2UsXG4gICAgICAgIGZpbHRlcjogJycsXG4gICAgICAgIHRvdGFsOiBwYWdlc2l6ZSxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgc29ydDogJ25hbWUnLFxuICAgICAgICBvcmRlcjogJ2FzYycsXG4gICAgICB9O1xuICAgICAgcmV0dXJuICBwYWdpbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0lkZW50aXRpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIGlkZW50aXR5Tm9kZSxcbiAgICAgICAgbmV0d29ya0dyYXBoLFxuICAgICAgICByYXdFbmRwb2ludHMsXG4gICAgICAgIHVuaXFJZCxcbiAgICAgICAgeml0aVNlcnZpY2UsXG4gICAgICAgIGNvbmZpZ3NcbiAgICApIHtcbiAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgIGNvbnN0IHJhd0VwID0gdGhpcy5maW5kUmF3RW5kcG9pbnQoaWRlbnRpdHlOb2RlLmRhdGEubmFtZSwgcmF3RW5kcG9pbnRzKTtcbiAgICAgICAgbGV0IHJhd0VwQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAocmF3RXAucm9sZUF0dHJpYnV0ZXMpIHtyYXdFcEF0dHJpYnV0ZXMgPSByYXdFcC5yb2xlQXR0cmlidXRlc307XG4gICAgICAgIHJhd0VwQXR0cmlidXRlcy5wdXNoKCdAJyArIHJhd0VwLm5hbWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0VwQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLm5hbWUgPSByYXdFcEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS50eXBlID0gJ0lkZW50aXR5IEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgIGNvbnN0IGJpbmRTZXJ2aWNlcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgY29uc3QgZGlhbFNlcnZpY2VzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICBiaW5kU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBkaWFsU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBsZXQgaWRlbnRpdHlTZXJ2aWNlUG9saWNpZXMgPSBbXTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd0VwLCAnc2VydmljZS1wb2xpY2llcycpLnJlcGxhY2UoJy4vJywgJycpO1xuXG4gICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcblxuICAgICAgIGNvbnN0IGZpcnN0UHJvbWlzZSA9ICBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VzX3VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAgICAgLnRoZW4oIGFzeW5jIChyZXN1bHQpID0+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==