ezlibrary_v2 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/esm2020/ezlibrary_v2.mjs +5 -0
  2. package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
  3. package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
  4. package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
  5. package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
  6. package/esm2020/lib/auth/auth.guard.mjs +40 -0
  7. package/esm2020/lib/bi-service/bi.service.mjs +58 -0
  8. package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
  9. package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
  10. package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
  11. package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
  12. package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
  13. package/esm2020/lib/ezheader/header.component.mjs +383 -0
  14. package/esm2020/lib/ezlib.module.mjs +220 -0
  15. package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
  16. package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
  17. package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
  18. package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
  19. package/esm2020/lib/footer/footer.component.mjs +18 -0
  20. package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
  21. package/esm2020/lib/globle/globle-env.service.mjs +45 -0
  22. package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
  23. package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
  24. package/esm2020/lib/globle/shared-services.service.mjs +27 -0
  25. package/esm2020/lib/globle/upload-service.service.mjs +69 -0
  26. package/esm2020/lib/header/header.component.mjs +179 -0
  27. package/esm2020/lib/invalid/invalid.component.mjs +71 -0
  28. package/esm2020/lib/logout/logout.component.mjs +107 -0
  29. package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
  30. package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
  31. package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
  32. package/esm2020/lib/pipes/selectedCount.mjs +19 -0
  33. package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
  34. package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
  35. package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
  36. package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
  37. package/esm2020/lib/report-format/report-format.component.mjs +400 -0
  38. package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
  39. package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
  40. package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
  41. package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
  42. package/esm2020/lib/system-module/system/system.component.mjs +959 -0
  43. package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
  44. package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
  45. package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
  46. package/esm2020/lib/utility/constants.mjs +5 -0
  47. package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
  48. package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
  49. package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
  50. package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
  51. package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
  52. package/esm2020/lib/utility/tranform.directive.mjs +27 -0
  53. package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
  54. package/esm2020/public_api.mjs +57 -0
  55. package/ezlibrary_v2.d.ts +5 -0
  56. package/fesm2015/ezlibrary_v2.mjs +33543 -0
  57. package/fesm2015/ezlibrary_v2.mjs.map +1 -0
  58. package/fesm2020/ezlibrary_v2.mjs +33533 -0
  59. package/fesm2020/ezlibrary_v2.mjs.map +1 -0
  60. package/lib/admin-service/admin-service.service.d.ts +13 -0
  61. package/lib/analysis-search/analysis-search.component.d.ts +122 -0
  62. package/lib/assort-service/assort-service.service.d.ts +12 -0
  63. package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
  64. package/lib/auth/auth.guard.d.ts +16 -0
  65. package/lib/bi-service/bi.service.d.ts +20 -0
  66. package/lib/call-info/callinfo.component.d.ts +30 -0
  67. package/lib/comman-service/comman-service.service.d.ts +111 -0
  68. package/lib/comman-service/share-data-service.service.d.ts +10 -0
  69. package/lib/contact-search/contact-search.component.d.ts +115 -0
  70. package/lib/contact-service/contact-service.service.d.ts +15 -0
  71. package/lib/ezheader/header.component.d.ts +61 -0
  72. package/lib/ezlib.module.d.ts +47 -0
  73. package/lib/file-upload/fileupload.component.d.ts +131 -0
  74. package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
  75. package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
  76. package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
  77. package/lib/footer/footer.component.d.ts +9 -0
  78. package/lib/globle/common-pdf.service.d.ts +9 -0
  79. package/lib/globle/globle-env.service.d.ts +16 -0
  80. package/lib/globle/memo-report.service.d.ts +107 -0
  81. package/lib/globle/pdf-service.service.d.ts +459 -0
  82. package/lib/globle/shared-services.service.d.ts +12 -0
  83. package/lib/globle/upload-service.service.d.ts +20 -0
  84. package/lib/header/header.component.d.ts +45 -0
  85. package/lib/invalid/invalid.component.d.ts +12 -0
  86. package/lib/logout/logout.component.d.ts +21 -0
  87. package/lib/menu-right/menu-right.component.d.ts +47 -0
  88. package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
  89. package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
  90. package/lib/pipes/selectedCount.d.ts +7 -0
  91. package/lib/pipes/sum.pipe.d.ts +7 -0
  92. package/lib/pkt-data/pkt-data.component.d.ts +189 -0
  93. package/lib/pricing-service/pricing.service.d.ts +20 -0
  94. package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
  95. package/lib/report-format/report-format.component.d.ts +74 -0
  96. package/lib/sessionend/session-end.guard.d.ts +10 -0
  97. package/lib/stock-service/lazyload.service.d.ts +7 -0
  98. package/lib/stock-service/stock-service.service.d.ts +19 -0
  99. package/lib/system-module/subform/subform.component.d.ts +227 -0
  100. package/lib/system-module/system/system.component.d.ts +113 -0
  101. package/lib/system-module/system-service/system-service.service.d.ts +23 -0
  102. package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
  103. package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
  104. package/lib/utility/constants.d.ts +4 -0
  105. package/lib/utility/contact-table-search.pipe.d.ts +7 -0
  106. package/lib/utility/formate-num-field.pipe.d.ts +7 -0
  107. package/lib/utility/search-pipe.pipe.d.ts +7 -0
  108. package/lib/utility/selective-preloading-strategy.d.ts +9 -0
  109. package/lib/utility/table-search.pipe.d.ts +7 -0
  110. package/lib/utility/tranform.directive.d.ts +10 -0
  111. package/lib/websearch-history/websearch-history.component.d.ts +62 -0
  112. package/package.json +48 -0
  113. package/public_api.d.ts +52 -0
@@ -0,0 +1,1035 @@
1
+ // import { StockComponent } from './../../stock-module/stock/stock.component';
2
+ // import { element } from 'protractor';
3
+ import { Component } from '@angular/core';
4
+ import { CommanServiceService } from '../comman-service/comman-service.service';
5
+ import { Router, ActivatedRoute } from '@angular/router';
6
+ import { ToastrService } from 'ngx-toastr';
7
+ import { NgxSpinnerService } from "ngx-spinner";
8
+ import { BiService } from './../bi-service/bi.service';
9
+ import * as _ from 'lodash';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../comman-service/comman-service.service";
12
+ import * as i2 from "./../bi-service/bi.service";
13
+ import * as i3 from "ngx-spinner";
14
+ import * as i4 from "ngx-toastr";
15
+ import * as i5 from "@angular/router";
16
+ import * as i6 from "@angular/forms";
17
+ import * as i7 from "@angular/common";
18
+ import * as i8 from "ng2-charts";
19
+ export class QaAnalysisComponent {
20
+ constructor(cs, bis, _spinnerService, toastr, router, route) {
21
+ this.cs = cs;
22
+ this.bis = bis;
23
+ this._spinnerService = _spinnerService;
24
+ this.toastr = toastr;
25
+ this.router = router;
26
+ this.route = route;
27
+ this.cDt = new Date();
28
+ this.htmlArr = [];
29
+ this.head = [];
30
+ this.side = [];
31
+ this.grandTotal = new Map();
32
+ this.matrix = new Map();
33
+ this.rowTotal = new Map();
34
+ this.colTotal = new Map();
35
+ this.pktData = new Map();
36
+ this.sideData = new Map();
37
+ this.headData = new Map();
38
+ this.groups = [];
39
+ this.anaGrpStt = ['mkt', 'asrt', 'lab'];
40
+ this.ChartType = "";
41
+ this.chartOptions = {
42
+ legend: {
43
+ position: 'left',
44
+ labels: {
45
+ fontColor: 'black',
46
+ boxWidth: 10,
47
+ padding: 10,
48
+ fontSize: 10
49
+ }
50
+ }
51
+ };
52
+ // private anaAllGrpStt = ['asrt', 'lab', 'mkt', 'sold'];
53
+ this.srchHistory = {
54
+ period: '',
55
+ frmdt: '',
56
+ todt: ''
57
+ };
58
+ this.gblGrdDataColor = new Map();
59
+ // gblGridSubMap = new Map();
60
+ this.gblRowTotColorValWise = new Map();
61
+ this.legendList = [];
62
+ this.isApplied = false;
63
+ this.wt = false;
64
+ this.avg = false;
65
+ this.rap = false;
66
+ this.val = false;
67
+ this.svpd = false;
68
+ this.msd = false;
69
+ this.msdvlu = false;
70
+ this.age = false;
71
+ this.va = false;
72
+ this.scroll = () => {
73
+ this.btnVisibilityByPos();
74
+ };
75
+ this.ChatMapDtl = {};
76
+ this.isshowchart = false;
77
+ this.barChartLegend = true;
78
+ this.isbarshowchart = false;
79
+ this.barChartOptions = {
80
+ responsive: true,
81
+ scales: {
82
+ yAxes: [{
83
+ id: "y-axis-1",
84
+ position: 'left',
85
+ ticks: {
86
+ beginAtZero: true
87
+ },
88
+ scaleLabel: {
89
+ display: true,
90
+ labelString: 'Qty'
91
+ }
92
+ },
93
+ {
94
+ id: "y-axis-2",
95
+ position: 'right',
96
+ ticks: {
97
+ beginAtZero: true
98
+ },
99
+ scaleLabel: {
100
+ display: true,
101
+ labelString: 'Avg'
102
+ },
103
+ }]
104
+ },
105
+ plugins: {
106
+ labels: {
107
+ // render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
108
+ render: 'value',
109
+ showZero: false,
110
+ overlap: false,
111
+ }
112
+ }
113
+ };
114
+ this.barchartColors = [
115
+ {
116
+ backgroundColor: 'rgba(59, 89, 152,0.8)',
117
+ borderColor: 'rgba(59, 89, 152,0.8)',
118
+ borderWidth: 2,
119
+ },
120
+ {
121
+ backgroundColor: 'rgba(59, 89, 152,0.8)',
122
+ borderColor: 'rgba(59, 89, 152,0.8)',
123
+ borderWidth: 2,
124
+ },
125
+ {
126
+ backgroundColor: 'rgba(255, 102, 179,0.8)',
127
+ borderColor: 'rgba(255, 102, 179,0.8)',
128
+ borderWidth: 2,
129
+ },
130
+ {
131
+ backgroundColor: 'rgba(255, 102, 179,0.8)',
132
+ borderColor: 'rgba(255, 102, 179,0.8)',
133
+ borderWidth: 2,
134
+ }
135
+ ];
136
+ }
137
+ getSearchResult(id, period) {
138
+ this._spinnerService.show();
139
+ let reqObj = {};
140
+ reqObj['searchIdnList'] = id.split(',');
141
+ reqObj['formNme'] = this.route.snapshot.params['frmnme'];
142
+ reqObj['period'] = period;
143
+ this.bis.data(reqObj, 'search', 'marketing/search')
144
+ .subscribe(data => {
145
+ this._spinnerService.hide();
146
+ if (data.status == 'SUCCESS') {
147
+ let res = data.result;
148
+ console.log("res", res);
149
+ localStorage.setItem('BI-PKT_GROUP_BY', JSON.stringify(res.pageDefination.form_field[0].lov_qry));
150
+ localStorage.setItem('BI-gridAvg', JSON.stringify(res.pageDefination.tabs[0].lov_qry.split(',')));
151
+ this.inventoryDays = res.inventoryDays || '60';
152
+ this.gridVariance = res.gridVariance || '10';
153
+ this.arrtDtl = res.attrDtl;
154
+ this.result = res;
155
+ this.legendList = res.legendList;
156
+ localStorage.setItem('BILegends', JSON.stringify(this.legendList));
157
+ this.schDtl = res.searchResultDtl;
158
+ let grpView = localStorage.getItem('anaGrpType');
159
+ this.groups = res.attrGridFormat;
160
+ let defaultGrp;
161
+ if (grpView != undefined) {
162
+ defaultGrp = JSON.parse(localStorage.getItem('anaGrpType'));
163
+ let cindx = this.groups.indexOf(defaultGrp);
164
+ this.gridGrp = this.groups[cindx];
165
+ }
166
+ else {
167
+ this.gridGrp = this.groups[0];
168
+ }
169
+ this.generateGridGrpWise('i', defaultGrp);
170
+ }
171
+ else {
172
+ this._spinnerService.hide();
173
+ this.toastr.show(data.message);
174
+ }
175
+ }, error => {
176
+ this._spinnerService.hide();
177
+ this.toastr.show(error);
178
+ });
179
+ }
180
+ createGrid() {
181
+ let newArry = this.schDtl;
182
+ // console.log(newArry);
183
+ debugger;
184
+ let diffday = parseInt(localStorage.getItem('diff'));
185
+ let biperiod = localStorage.getItem('BIPeriod') || '';
186
+ if (biperiod == 'week')
187
+ biperiod = "7";
188
+ if (biperiod == 'month')
189
+ biperiod = "30";
190
+ if (biperiod == 'quarter')
191
+ biperiod = "90";
192
+ let period = parseInt(biperiod);
193
+ if (period == 1) {
194
+ period = diffday;
195
+ }
196
+ let dred = "rgba(255, 0, 0,0.6)";
197
+ let mred = "rgba(255, 0, 0,0.4)";
198
+ let lred = "rgba(255, 0, 0,0.2)";
199
+ let dgreen = "rgba(0 ,128, 0 ,0.6)";
200
+ let mgreen = "rgba(0 ,128, 0 ,0.4)";
201
+ let lgreen = "rgba(0 ,128, 0 ,0.2)";
202
+ let stockdays = this.inventoryDays;
203
+ let minvariation = (100 - parseInt(this.gridVariance));
204
+ let maxvariation = (100 + parseInt(this.gridVariance));
205
+ console.log("period", period);
206
+ this.schDtl.map(element => {
207
+ let header = '';
208
+ let groupKeys = '';
209
+ let sideKeys = '';
210
+ let headKeys = '';
211
+ let lIdx;
212
+ this.grpval.map(ele => {
213
+ header += element[ele] + ',';
214
+ groupKeys += element[ele] + ',';
215
+ });
216
+ lIdx = header.lastIndexOf(',');
217
+ if (lIdx == header.length - 1) {
218
+ header = header.substr(0, header.length - 1) + "#";
219
+ }
220
+ this.sideval.map(ele => {
221
+ header += element[ele] + ',';
222
+ sideKeys += element[ele] + ',';
223
+ });
224
+ lIdx = header.lastIndexOf(',');
225
+ if (lIdx == header.length - 1) {
226
+ header = header.substr(0, header.length - 1) + "#";
227
+ }
228
+ this.headval.map(ele => {
229
+ header += element[ele] + ',';
230
+ headKeys += element[ele] + ',';
231
+ });
232
+ lIdx = header.lastIndexOf(',');
233
+ if (lIdx == header.length - 1) {
234
+ header = header.substr(0, header.length - 1) + "";
235
+ }
236
+ groupKeys = (groupKeys.lastIndexOf(',') == groupKeys.length) ? groupKeys.substr(0, groupKeys.length - 1) : groupKeys;
237
+ sideKeys = (sideKeys.lastIndexOf(',') == sideKeys.length) ? sideKeys.substr(0, sideKeys.length - 1) : sideKeys;
238
+ headKeys = (headKeys.lastIndexOf(',') == headKeys.length) ? headKeys.substr(0, headKeys.length - 1) : headKeys;
239
+ let lHeader = header + '#' + element.dsp_stt;
240
+ let lSideKey = (groupKeys.length == 0) ? sideKeys : groupKeys + "#" + sideKeys + '#' + element.dsp_stt;
241
+ let lHeadKey = (groupKeys.length == 0) ? headKeys : groupKeys + "#" + headKeys + '#' + element.dsp_stt;
242
+ let wt = parseFloat(element.crtwt);
243
+ let rte = parseFloat(element.asking_rte);
244
+ let salrate = parseFloat(element.sal_rte);
245
+ let sal_rte = parseFloat(element.quot);
246
+ let benchmark_rte = parseFloat(element.benchmark_rte);
247
+ let age = parseInt(element.age);
248
+ let rteValue = rte * wt;
249
+ if ((element.grp_stt).toLowerCase() == 'sold') {
250
+ rteValue = salrate * wt;
251
+ }
252
+ let benachmarkValue = benchmark_rte * wt;
253
+ let gridWt = 0;
254
+ let gridRteValue = 0;
255
+ let gridvalue = 0;
256
+ let gridAge = 0;
257
+ let gridValueAge = 0;
258
+ let count = 0;
259
+ let grid = this.matrix.get(lHeader);
260
+ if (grid != null) {
261
+ count = parseInt(grid.get('count'));
262
+ gridWt = parseFloat(grid.get('wt'));
263
+ gridRteValue = parseFloat(grid.get('rap'));
264
+ gridvalue = parseFloat(grid.get('value'));
265
+ gridAge = parseFloat(grid.get('age'));
266
+ gridValueAge = parseFloat(grid.get('valueage'));
267
+ }
268
+ else {
269
+ grid = new Map();
270
+ }
271
+ grid.set('count', count + 1);
272
+ grid.set('wt', gridWt + wt);
273
+ grid.set('rap', gridRteValue + benachmarkValue);
274
+ grid.set('value', gridvalue + rteValue);
275
+ grid.set('age', ((gridAge * count) + age) / (count + 1));
276
+ grid.set('valueage', ((gridvalue * gridAge) + (age * rteValue)) / (gridvalue + rteValue));
277
+ this.matrix.set(lHeader, grid);
278
+ let pkts = new Set();
279
+ let sidePkts = new Set();
280
+ let headPkts = new Set();
281
+ if (this.pktData.get(header) != null)
282
+ pkts = this.pktData.get(header);
283
+ if (this.sideData.get(lSideKey) != null)
284
+ sidePkts = this.sideData.get(lSideKey);
285
+ if (this.headData.get(lHeadKey) != null)
286
+ headPkts = this.headData.get(lHeadKey);
287
+ pkts.add(element);
288
+ this.pktData.set(header, pkts);
289
+ sidePkts.add(element);
290
+ this.sideData.set(lSideKey, sidePkts);
291
+ headPkts.add(element);
292
+ this.headData.set(lHeadKey, headPkts);
293
+ });
294
+ let grps = new Set();
295
+ let rows = new Set();
296
+ let cols = new Set();
297
+ let stt = new Set();
298
+ this.matrix.forEach((value, key) => {
299
+ let lKey = key;
300
+ let count = parseFloat(value.get('count'));
301
+ let wt = parseFloat(value.get('wt'));
302
+ let rap = parseFloat(value.get('rap'));
303
+ let val = parseFloat(value.get('value'));
304
+ let age = parseFloat(value.get('age'));
305
+ let valueAge = parseFloat(value.get('valueage'));
306
+ let grpVal = lKey.split('#')[0];
307
+ let rowVal = lKey.split('#')[1];
308
+ let colVal = lKey.split('#')[2];
309
+ let status = lKey.split('#')[3];
310
+ let valCompArr = [];
311
+ let valCompObj = {};
312
+ valCompObj[status] = val;
313
+ valCompArr.push(valCompObj);
314
+ console.log();
315
+ let isSold = false;
316
+ if (this.anaGrpStt.indexOf(status) == -1)
317
+ isSold = true;
318
+ if (isSold) {
319
+ let compareWith = 'mkt';
320
+ let cmpData = this.matrix.get(grpVal + '#' + rowVal + '#' + colVal + '#' + compareWith);
321
+ let cmpCount = 0;
322
+ if (cmpData != undefined) {
323
+ cmpCount = parseFloat(cmpData.get('count'));
324
+ }
325
+ let msd = Math.round(period * cmpCount / count);
326
+ value.set('msd', msd);
327
+ let cmpValue = 0;
328
+ if (cmpData != undefined) {
329
+ cmpValue = parseFloat(cmpData.get('value'));
330
+ }
331
+ let msdvlu = Math.round(period * cmpValue / val);
332
+ value.set('msdvlu', msdvlu);
333
+ let chkcount = (stockdays * count / period);
334
+ // let mincount = (chkcount * minvariation);
335
+ // let maxcount = (chkcount * maxvariation);
336
+ debugger;
337
+ let netratio = (chkcount * 100) / cmpCount;
338
+ console.log("checkcount", rowVal, colVal, chkcount);
339
+ console.log("netratio", rowVal, colVal, netratio);
340
+ let gridcolor = '#ffff00';
341
+ if (netratio <= 30) {
342
+ gridcolor = dred;
343
+ }
344
+ else if (netratio > 30 && netratio < 60) {
345
+ gridcolor = mred;
346
+ }
347
+ else if (netratio >= 60 && netratio < minvariation) {
348
+ gridcolor = lred;
349
+ }
350
+ else if (netratio >= minvariation && netratio < maxvariation) {
351
+ gridcolor = 'rgba(255, 255, 0, 0.38)';
352
+ }
353
+ else if (netratio >= maxvariation && netratio < 200) {
354
+ gridcolor = lgreen;
355
+ }
356
+ else if (netratio >= 200 && netratio < 300) {
357
+ gridcolor = mgreen;
358
+ }
359
+ else {
360
+ gridcolor = dgreen;
361
+ }
362
+ value.set('grpcolor', gridcolor);
363
+ let svpd = Math.round(val / period);
364
+ value.set('svpd', svpd);
365
+ }
366
+ if (status == 'mkt')
367
+ value.set('grpcolor', '#dddddd');
368
+ let disc = 0;
369
+ if (rap > 1) {
370
+ disc = (((val * 100) / rap) - 100);
371
+ }
372
+ let avg = Math.round(val / wt);
373
+ value.set('disc', disc);
374
+ value.set('avg', avg);
375
+ rows.add(rowVal);
376
+ let strRowTotalKey = grpVal + '#' + rowVal + '#' + status;
377
+ let rTotal = this.rowTotal.get(strRowTotalKey) == null ? new Map() : this.rowTotal.get(strRowTotalKey);
378
+ let lCount = rTotal.get('count') == null ? 0 : rTotal.get('count');
379
+ let lWt = rTotal.get('wt') == null ? 0 : rTotal.get('wt');
380
+ let lRap = rTotal.get('rap') == null ? 0 : rTotal.get('rap');
381
+ let lVal = rTotal.get('value') == null ? 0 : rTotal.get('value');
382
+ let lAge = rTotal.get('age') == null ? 0 : rTotal.get('age');
383
+ let lValueAge = rTotal.get('valueage') == null ? 0 : rTotal.get('valueage');
384
+ rTotal.set('count', lCount + count);
385
+ rTotal.set('wt', lWt + wt);
386
+ rTotal.set('rap', lRap + rap);
387
+ rTotal.set('value', lVal + val);
388
+ rTotal.set('disc', ((((lVal + val) * 100) / (lRap + rap)) - 100));
389
+ rTotal.set('avg', (lVal + val) / (lWt + wt));
390
+ rTotal.set('age', ((lAge * lCount) + age) / (lCount + 1));
391
+ rTotal.set('valueage', ((lValueAge * lAge) + (age * val)) / (lValueAge + val));
392
+ this.rowTotal.set(strRowTotalKey, rTotal);
393
+ cols.add(colVal);
394
+ let strColTotalKey = grpVal + '#' + colVal + '#' + status;
395
+ let cTotal = this.colTotal.get(strColTotalKey) == null ? new Map() : this.colTotal.get(strColTotalKey);
396
+ let cCount = cTotal.get('count') == null ? 0 : cTotal.get('count');
397
+ let cWt = cTotal.get('wt') == null ? 0 : cTotal.get('wt');
398
+ let cRap = cTotal.get('rap') == null ? 0 : cTotal.get('rap');
399
+ let cVal = cTotal.get('value') == null ? 0 : cTotal.get('value');
400
+ let cAge = cTotal.get('age') == null ? 0 : cTotal.get('age');
401
+ let cValueAge = cTotal.get('valueage') == null ? 0 : cTotal.get('valueage');
402
+ cTotal.set('count', cCount + count);
403
+ cTotal.set('wt', cWt + wt);
404
+ cTotal.set('rap', cRap + rap);
405
+ cTotal.set('value', cVal + val);
406
+ cTotal.set('disc', ((((cVal + val) * 100) / (cRap + rap)) - 100));
407
+ cTotal.set('avg', (cVal + val) / (cWt + wt));
408
+ cTotal.set('age', ((cAge * cCount) + age) / (cCount + 1));
409
+ cTotal.set('valueage', ((cValueAge * cAge) + (age * val)) / (cValueAge + val));
410
+ this.colTotal.set(strColTotalKey, cTotal);
411
+ if (!stt.has(status))
412
+ stt.add(status);
413
+ if (!grps.has(grpVal))
414
+ grps.add(grpVal);
415
+ });
416
+ let sortedRows = Array.from(rows).sort();
417
+ let sortedCols = Array.from(cols).sort();
418
+ let sortedStt = Array.from(stt).sort();
419
+ this.sortedGrp = Array.from(grps); //.sort();
420
+ // console.log(sortedRows);
421
+ // console.log(sortedCols);
422
+ // console.log(sortedStt);
423
+ // console.log(this.sortedGrp);
424
+ // let keyValObj = {};
425
+ // let garr = [];
426
+ ////for grid data
427
+ sortedRows.forEach(row => {
428
+ sortedCols.forEach(cols => {
429
+ this.sortedGrp.forEach(grp => {
430
+ let currAvgVal = 0;
431
+ let prevAvgVal = 0;
432
+ let currCountVal = 0;
433
+ let prevCountVal = 0;
434
+ let pAVGCOLOR = '';
435
+ let pCOUNTCOLOR = '';
436
+ for (let i = 0; i < sortedStt.length || 0; i++) {
437
+ let gblGridSubMap = new Map();
438
+ if (i == 0) {
439
+ gblGridSubMap.set('AVGCOLOR', "#dddddd");
440
+ gblGridSubMap.set('COUNTCOLOR', "#dddddd");
441
+ this.gblGrdDataColor.set(grp + '#' + row + '#' + cols + '#' + sortedStt[i], gblGridSubMap);
442
+ if (this.matrix.has(grp + '#' + row + '#' + cols + '#' + sortedStt[i])) {
443
+ prevAvgVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('avg') || 0;
444
+ prevCountVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('count') || 0;
445
+ }
446
+ }
447
+ else {
448
+ if (this.matrix.has(grp + '#' + row + '#' + cols + '#' + sortedStt[i])) {
449
+ currAvgVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('avg') || 0;
450
+ currCountVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('count') || 0;
451
+ }
452
+ else {
453
+ currCountVal = 0;
454
+ currAvgVal = 0;
455
+ }
456
+ if (currCountVal > 0 && prevCountVal > 0) {
457
+ let AVGCOLOR = '#ff000047';
458
+ let COUNTCOLOR = '#ff000047';
459
+ if (currAvgVal == prevAvgVal) {
460
+ AVGCOLOR = pAVGCOLOR;
461
+ }
462
+ else if (currAvgVal > prevAvgVal) {
463
+ AVGCOLOR = '#00800054';
464
+ }
465
+ if (currCountVal == prevCountVal) {
466
+ COUNTCOLOR = pCOUNTCOLOR;
467
+ }
468
+ else if (currCountVal > prevCountVal) {
469
+ COUNTCOLOR = '#00800054';
470
+ }
471
+ pCOUNTCOLOR = COUNTCOLOR;
472
+ pAVGCOLOR = AVGCOLOR;
473
+ gblGridSubMap.set('AVGCOLOR', AVGCOLOR);
474
+ gblGridSubMap.set('COUNTCOLOR', COUNTCOLOR); //#00800054==green //ff000047 == red
475
+ this.gblGrdDataColor.set(grp + '#' + row + '#' + cols + '#' + sortedStt[i], gblGridSubMap);
476
+ prevCountVal = currCountVal;
477
+ prevAvgVal = currAvgVal;
478
+ }
479
+ else {
480
+ gblGridSubMap.set('AVGCOLOR', 'white');
481
+ gblGridSubMap.set('COUNTCOLOR', 'white'); //#00800054==green //ff000047 == red
482
+ this.gblGrdDataColor.set(grp + '#' + row + '#' + cols + '#' + sortedStt[i], gblGridSubMap);
483
+ if (currCountVal > 0) {
484
+ prevCountVal = currCountVal;
485
+ prevAvgVal = currAvgVal;
486
+ }
487
+ }
488
+ }
489
+ }
490
+ });
491
+ });
492
+ });
493
+ // this.gblGrpArr = {...garr};
494
+ console.log(this.gblGrdDataColor);
495
+ this.arrtDtl[this.sideval[0] + '#p'].map(ele1 => {
496
+ sortedRows.forEach(ele2 => {
497
+ if (ele1 == ele2) {
498
+ this.side.push(ele1);
499
+ }
500
+ });
501
+ });
502
+ this.arrtDtl[this.headval[0] + '#p'].map(ele1 => {
503
+ sortedCols.forEach(ele2 => {
504
+ if (ele1 == ele2) {
505
+ this.head.push(ele1);
506
+ }
507
+ });
508
+ });
509
+ // console.log("marix", this.matrix);
510
+ this.stt = [...sortedStt];
511
+ this.rowTotal.forEach((value, key) => {
512
+ let lKey = key;
513
+ let count = parseFloat(value.get('count'));
514
+ let val = parseFloat(value.get('value'));
515
+ let grpVal = lKey.split('#')[0];
516
+ let rowVal = lKey.split('#')[1];
517
+ let status = lKey.split('#')[2];
518
+ let wt = parseFloat(value.get('wt'));
519
+ let rap = parseFloat(value.get('rap'));
520
+ let svpd = parseFloat(value.get('svpd')) == undefined ? 0 : parseFloat(value.get('svpd'));
521
+ let msd = parseFloat(value.get('msd')) == undefined ? 0 : parseFloat(value.get('msd'));
522
+ let age = parseFloat(value.get('age'));
523
+ let valueAge = parseFloat(value.get('valueage'));
524
+ let gtKey = "GT#" + grpVal + "#" + status;
525
+ let cTotal = this.grandTotal.get(gtKey) == null ? new Map() : this.grandTotal.get(gtKey);
526
+ let cCount = cTotal.get('count') == null ? 0 : cTotal.get('count');
527
+ let cWt = cTotal.get('wt') == null ? 0 : cTotal.get('wt');
528
+ let cRap = cTotal.get('rap') == null ? 0 : cTotal.get('rap');
529
+ let cVal = cTotal.get('value') == null ? 0 : cTotal.get('value');
530
+ let cAge = cTotal.get('age') == null ? 0 : cTotal.get('age');
531
+ let cValueAge = cTotal.get('valueage') == null ? 0 : cTotal.get('valueage');
532
+ cTotal.set('count', cCount + count);
533
+ cTotal.set('wt', cWt + wt);
534
+ cTotal.set('rap', cRap + rap);
535
+ cTotal.set('value', cVal + val);
536
+ cTotal.set('disc', ((((cVal + val) * 100) / (cRap + rap)) - 100));
537
+ cTotal.set('avg', (cVal + val) / (cWt + wt));
538
+ cTotal.set('age', ((cAge * cCount) + age) / (cCount + 1));
539
+ cTotal.set('valueage', ((cValueAge * cVal) + (valueAge * val)) / (cVal + val));
540
+ this.grandTotal.set(gtKey, cTotal);
541
+ let isSold = false;
542
+ if (this.anaGrpStt.indexOf(status) == -1)
543
+ isSold = true;
544
+ if (isSold) {
545
+ let cmpData = this.rowTotal.get(grpVal + '#' + rowVal + '#mkt');
546
+ debugger;
547
+ if (cmpData != undefined) {
548
+ let cmpCount = parseFloat(cmpData.get('count'));
549
+ let msd = Math.round(period * cmpCount / count);
550
+ value.set('msd', msd);
551
+ let cmpval = parseFloat(cmpData.get('value'));
552
+ let msdvlu = Math.round(period * cmpval / val);
553
+ value.set('msdvlu', msdvlu);
554
+ let chkcount = (stockdays * count / period);
555
+ let netratio = (chkcount * 100) / cmpCount;
556
+ let gridcolor = '#ffff00';
557
+ if (netratio <= 30) {
558
+ gridcolor = dred;
559
+ }
560
+ else if (netratio > 30 && netratio < 60) {
561
+ gridcolor = mred;
562
+ }
563
+ else if (netratio >= 60 && netratio < minvariation) {
564
+ gridcolor = lred;
565
+ }
566
+ else if (netratio >= minvariation && netratio < maxvariation) {
567
+ gridcolor = 'rgba(255, 255, 0, 0.38)';
568
+ }
569
+ else if (netratio >= maxvariation && netratio < 200) {
570
+ gridcolor = lgreen;
571
+ }
572
+ else if (netratio >= 200 && netratio < 300) {
573
+ gridcolor = mgreen;
574
+ }
575
+ else {
576
+ gridcolor = dgreen;
577
+ }
578
+ value.set('grpcolor', gridcolor);
579
+ }
580
+ let svpd = Math.round(val / period);
581
+ value.set('svpd', svpd);
582
+ }
583
+ if (status == 'mkt')
584
+ value.set('grpcolor', '#dddddd');
585
+ });
586
+ ////for rowwise total
587
+ // sortedRows.forEach(row => {
588
+ // this.sortedGrp.forEach(grp => {
589
+ // for (let i = 0; i < sortedStt.length || 0; i++) {
590
+ // debugger
591
+ // let currVal;
592
+ // let prevVal;
593
+ // let currCount;
594
+ // let prevCount;
595
+ // if (i == 0) {
596
+ // this.gblRowTotColorValWise.set(grp + '#' + row + '#' + sortedStt[i], "#dddddd");
597
+ // }
598
+ // else {
599
+ // console.log(this.matrix);
600
+ // if (this.rowTotal.has(grp + '#' + row + '#' + sortedStt[i])) {
601
+ // currVal = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i]).get('value') || 0;
602
+ // currCount = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i]).get('count') || 0;
603
+ // }
604
+ // if (this.rowTotal.has(grp + '#' + row + '#' + sortedStt[i - 1])) {
605
+ // prevVal = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i - 1]).get('value') || 0;//pass dynamic value as per user select in ddl
606
+ // prevCount = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i - 1]).get('count') || 0;
607
+ // }
608
+ // this.gblRowTotColorValWise.set(grp + '#' + row + '#' + sortedStt[i], ((currVal == 0 || currVal == null || currVal == undefined || prevVal == 0 || prevVal == null || prevVal == undefined) ? '' : (currVal > 0 && currVal > prevVal) ? 'green' : 'red'));
609
+ // // this.gblRowTotColorValWise.set(grp + '#' + row + '#' + sortedStt[i], ((currCount == 0 || currCount == null || currCount == undefined || prevCount == 0 || prevCount == null || prevCount == undefined) ? '' : (currCount > 0 && currCount > prevCount) ? 'green' : 'red'));
610
+ // }
611
+ // }
612
+ // });
613
+ // });
614
+ // console.log(this.gblRowTotColorValWise);
615
+ // this.colTotal.forEach((value, key) => {
616
+ // let lKey = key;
617
+ // let count = parseFloat(value.get('count'));
618
+ // let val = parseFloat(value.get('value'));
619
+ // let grpVal = lKey.split('#')[0];
620
+ // let colVal = lKey.split('#')[1];
621
+ // let status = lKey.split('#')[2];
622
+ // let isSold = false;
623
+ // if (this.anaGrpStt.indexOf(status) == -1)
624
+ // isSold = true;
625
+ // if (isSold) {
626
+ // let cmpData = this.colTotal.get(grpVal + '#' + colVal + '#mkt');
627
+ // if (cmpData != undefined) {
628
+ // let cmpCount = parseFloat(cmpData.get('count'));
629
+ // let msd = Math.round(period * cmpCount / count);
630
+ // value.set('msd', msd);
631
+ // let chkcount = (stockdays * count / period);
632
+ // let mincount = (chkcount * minvariation);
633
+ // let maxcount = (chkcount * maxvariation);
634
+ // let gridcolor = '#00800054';
635
+ // if (cmpCount > maxcount) {
636
+ // gridcolor = '#ff000047';
637
+ // } else if (cmpCount >= mincount && cmpCount <= maxcount) {
638
+ // gridcolor = '#ffff0061';
639
+ // }
640
+ // value.set('grpcolor', gridcolor);
641
+ // }
642
+ // let svpd = Math.round(val / period);
643
+ // value.set('svpd', svpd);
644
+ // }
645
+ // if (status == 'mkt')
646
+ // value.set('grpcolor', '#dddddd');
647
+ // });
648
+ this.colTotal.forEach((value, key) => {
649
+ let lKey = key;
650
+ let count = parseFloat(value.get('count'));
651
+ if (this.formname == 'mixAnalysisReportForm')
652
+ count = parseFloat(value.get('wt'));
653
+ let val = parseFloat(value.get('value'));
654
+ let grpVal = lKey.split('#')[0];
655
+ let rowVal = lKey.split('#')[1];
656
+ let status = lKey.split('#')[2];
657
+ let wt = parseFloat(value.get('wt'));
658
+ let rap = parseFloat(value.get('rap'));
659
+ let svpd = parseFloat(value.get('svpd')) == undefined ? 0 : parseFloat(value.get('svpd'));
660
+ let msd = parseFloat(value.get('msd')) == undefined ? 0 : parseFloat(value.get('msd'));
661
+ let age = parseFloat(value.get('age'));
662
+ let valueAge = parseFloat(value.get('valueage'));
663
+ let isSold = false;
664
+ if (this.anaGrpStt.indexOf(status) == -1)
665
+ isSold = true;
666
+ if (isSold) {
667
+ let cmpData = this.colTotal.get(grpVal + '#' + rowVal + '#mkt');
668
+ if (cmpData != undefined) {
669
+ let cmpCount = parseFloat(cmpData.get('count'));
670
+ let msd = Math.round(period * cmpCount / count);
671
+ value.set('msd', msd);
672
+ let cmpval = parseFloat(cmpData.get('value'));
673
+ let msdvlu = Math.round(period * cmpval / val);
674
+ value.set('msdvlu', msdvlu);
675
+ let chkcount = (stockdays * count / period);
676
+ let netratio = (chkcount * 100) / cmpCount;
677
+ let gridcolor = '#ffff00';
678
+ if (netratio <= 30) {
679
+ gridcolor = dred;
680
+ }
681
+ else if (netratio > 30 && netratio < 60) {
682
+ gridcolor = mred;
683
+ }
684
+ else if (netratio >= 60 && netratio < minvariation) {
685
+ gridcolor = lred;
686
+ }
687
+ else if (netratio >= minvariation && netratio < maxvariation) {
688
+ gridcolor = 'rgba(255, 255, 0, 0.38)';
689
+ }
690
+ else if (netratio >= maxvariation && netratio < 200) {
691
+ gridcolor = lgreen;
692
+ }
693
+ else if (netratio >= 200 && netratio < 300) {
694
+ gridcolor = mgreen;
695
+ }
696
+ else {
697
+ gridcolor = dgreen;
698
+ }
699
+ value.set('grpcolor', gridcolor);
700
+ }
701
+ let svpd = Math.round(val / period);
702
+ value.set('svpd', svpd);
703
+ }
704
+ if (status == 'mkt')
705
+ value.set('grpcolor', '#dddddd');
706
+ });
707
+ // Grand Summaries
708
+ this.sortedGrp.map(ele => {
709
+ let mktKey = "GT#" + ele + "#mkt";
710
+ //let soldKey = "GT#" + ele + "#sold";
711
+ let soldKey = "";
712
+ let mkt = this.grandTotal.get(mktKey) == null ? new Map() : this.grandTotal.get(mktKey);
713
+ let mktCount = mkt.get('count') == null ? 0 : mkt.get('count');
714
+ let mktVale = parseFloat(mkt.get('value') == null ? 0 : mkt.get('value'));
715
+ this.stt.forEach(st => {
716
+ let status = st;
717
+ soldKey = "GT#" + ele + '#' + st;
718
+ let sold = this.grandTotal.get(soldKey) == null ? new Map() : this.grandTotal.get(soldKey);
719
+ let soldCount = sold.get('count') == null ? 0 : sold.get('count');
720
+ let msd = Math.round(diffday * mktCount / soldCount);
721
+ let soldvalue = parseFloat(sold.get('value') == null ? 0 : sold.get('value'));
722
+ //let svpd = Math.round(soldvalue / diffday);
723
+ sold.set('msd', msd);
724
+ // sold.set('svpd', svpd);
725
+ //this.grandTotal.set(mktKey, mkt);
726
+ let msdvlu = Math.round(diffday * mktVale / soldvalue);
727
+ sold.set('msdvlu', msdvlu);
728
+ let isSold = false;
729
+ if (this.anaGrpStt.indexOf(status) == -1)
730
+ isSold = true;
731
+ if (isSold) {
732
+ let cmpCount = mktCount;
733
+ let msd = Math.round(period * cmpCount / soldCount);
734
+ sold.set('msd', msd);
735
+ let msdvlu = Math.round(period * mktVale / soldvalue);
736
+ sold.set('msdvlu', msdvlu);
737
+ let chkcount = (stockdays * soldCount / period);
738
+ let mincount = (chkcount * minvariation);
739
+ let maxcount = (chkcount * maxvariation);
740
+ let gridcolor = '#00800054';
741
+ if (cmpCount > maxcount) {
742
+ gridcolor = '#ff000047';
743
+ }
744
+ else if (cmpCount >= mincount && cmpCount <= maxcount) {
745
+ gridcolor = '#ffff0061';
746
+ }
747
+ sold.set('grpcolor', gridcolor);
748
+ }
749
+ let svpd = Math.round(soldvalue / period);
750
+ sold.set('svpd', svpd);
751
+ // }
752
+ if (status == 'mkt')
753
+ sold.set('grpcolor', '#dddddd');
754
+ this.grandTotal.set(soldKey, sold);
755
+ });
756
+ });
757
+ }
758
+ modifySearch() {
759
+ localStorage.setItem('BIcall', 'BImodify');
760
+ this.router.navigate([this.modulename + '/analysis-search/' + this.route.snapshot.params['frmnme']]);
761
+ }
762
+ OnChangeBy(ValType) {
763
+ this.isApplied = true;
764
+ this.key = ValType;
765
+ }
766
+ getData(call, key, st) {
767
+ let pktdata = [];
768
+ let temparr = [];
769
+ if (call == 'cell') {
770
+ pktdata = pktdata.concat([], Array.from(this.pktData.get(key)));
771
+ }
772
+ else if (call == 'row') {
773
+ this.head.forEach(element => {
774
+ if (this.pktData.get(key + '#' + element) != null && this.pktData.get(key + '#' + element) != "" && this.pktData.get(key + '#' + element) != undefined) {
775
+ pktdata = pktdata.concat([], Array.from(this.pktData.get(key + '#' + element)));
776
+ }
777
+ });
778
+ }
779
+ else if (call == 'col') {
780
+ this.side.forEach(element => {
781
+ let k = key.split('#');
782
+ let kc = k[0] + '#' + element + '#' + k[1];
783
+ if (this.pktData.get(kc) != null && this.pktData.get(kc) != "" && this.pktData.get(kc) != undefined) {
784
+ pktdata = pktdata.concat([], Array.from(this.pktData.get(kc)));
785
+ }
786
+ });
787
+ }
788
+ else if (call == 'all') {
789
+ localStorage.setItem('pktData', JSON.stringify(this.schDtl));
790
+ localStorage.setItem('resultView', JSON.stringify(this.result.resultView));
791
+ localStorage.setItem('resultViewDtl', JSON.stringify(this.result.resultViewDtl));
792
+ return;
793
+ }
794
+ // pktdata = pktdata.filter(e => e.grp_stt == st);
795
+ let pd = _.sortBy(pktdata, ['co', 'pu']).reverse();
796
+ localStorage.setItem('pktData', JSON.stringify(pktdata));
797
+ localStorage.setItem('resultView', JSON.stringify(this.result.resultView));
798
+ localStorage.setItem('resultViewDtl', JSON.stringify(this.result.resultViewDtl));
799
+ // this.router.navigate(['bi/pkt-list']);
800
+ }
801
+ // "Cushion Mod,0.50,#H"
802
+ getAll(stt, head, side, grp) {
803
+ let key = '';
804
+ let pktdata = [];
805
+ // head.forEach(hd => {
806
+ // stt.forEach(st => {
807
+ // key = grp + ',' + '#' + hd + ',' + '#' + st;
808
+ // if (this.headData.get(key) != null && this.headData.get(key) != "" && this.headData.get(key) != undefined) {
809
+ // pktdata = pktdata.concat([], Array.from(this.headData.get(key)));
810
+ // console.log(key);
811
+ // }
812
+ // });
813
+ // });
814
+ side.forEach(sd => {
815
+ stt.forEach(st => {
816
+ key = grp + ',' + '#' + sd + ',' + '#' + st;
817
+ if (this.sideData.get(key) != null && this.sideData.get(key) != "" && this.sideData.get(key) != undefined) {
818
+ pktdata = pktdata.concat([], Array.from(this.sideData.get(key)));
819
+ }
820
+ });
821
+ });
822
+ localStorage.setItem('pktData', JSON.stringify(pktdata));
823
+ localStorage.setItem('resultView', JSON.stringify(this.result.resultView));
824
+ localStorage.setItem('resultViewDtl', JSON.stringify(this.result.resultViewDtl));
825
+ }
826
+ hideShow(call, status) {
827
+ // var dates = document.querySelectorAll('*[id^="' + index + '"]');
828
+ // let nodes = (document.querySelectorAll('[id^="' + call + '"]') as any);
829
+ // if (status) {
830
+ // nodes.forEach(element => {
831
+ // // console.log();
832
+ // document.getElementById(element.id).style.display = 'block';
833
+ // });
834
+ // } else {
835
+ // nodes.forEach(element => {
836
+ // console.log();
837
+ // document.getElementById(element.id).style.display = 'none';
838
+ // });
839
+ // }
840
+ // document.getElementById(call);
841
+ if (call == 'CTS') {
842
+ this.wt = !this.wt;
843
+ }
844
+ else if (call == 'AVG') {
845
+ this.avg = !this.avg;
846
+ }
847
+ else if (call == 'RAP') {
848
+ this.rap = !this.rap;
849
+ }
850
+ else if (call == 'VLU') {
851
+ this.val = !this.val;
852
+ }
853
+ else if (call == 'SVP') {
854
+ this.svpd = !this.svpd;
855
+ }
856
+ else if (call == 'MSD') {
857
+ this.msd = !this.msd;
858
+ }
859
+ else if (call == 'MSDVLU') {
860
+ this.msdvlu = !this.msdvlu;
861
+ }
862
+ else if (call == 'AGE') {
863
+ this.age = !this.age;
864
+ }
865
+ else if (call == 'VA') {
866
+ this.va = !this.va;
867
+ }
868
+ }
869
+ changeGrp(gridGrp) {
870
+ this.generateGridGrpWise('c', gridGrp);
871
+ }
872
+ generateGridGrpWise(call, selectedgrp) {
873
+ this.grpval = '';
874
+ this.headval = '';
875
+ this.sideval = '';
876
+ this.matrix.clear();
877
+ this.rowTotal.clear();
878
+ this.colTotal.clear();
879
+ this.grandTotal.clear();
880
+ this.pktData.clear();
881
+ this.head = [];
882
+ this.side = [];
883
+ let grps = selectedgrp.group.split(',');
884
+ let head = selectedgrp.head.split(',');
885
+ let side = selectedgrp.side.split(',');
886
+ this.grpval = [...grps];
887
+ this.headval = [...head];
888
+ this.sideval = [...side];
889
+ this.createGrid();
890
+ }
891
+ btnVisibilityByPos() {
892
+ if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 10) {
893
+ // document.getElementById("btnGoTop").style.display = "block";
894
+ document.getElementById("staticHead").style.top = "50px";
895
+ }
896
+ else {
897
+ document.getElementById("staticHead").style.top = "110px";
898
+ }
899
+ }
900
+ creategrpPie(pieStatusList, grp, attr, piechartDataList, typ) {
901
+ this.isshowchart = false;
902
+ this.ChatMapDtl = {};
903
+ pieStatusList.forEach(status => {
904
+ let pieChartLabels = [];
905
+ let pieChartData = [];
906
+ let pieChartlegend = [];
907
+ piechartDataList.forEach(data => {
908
+ let dtl;
909
+ if (typ == 'head') {
910
+ dtl = this.matrix.get(grp + "#" + data + "#" + attr + "#" + status) || '';
911
+ }
912
+ else {
913
+ dtl = this.matrix.get(grp + "#" + attr + "#" + data + "#" + status) || '';
914
+ }
915
+ if (dtl != '') {
916
+ let cnt = dtl.get('count') || '';
917
+ if (cnt != '' && cnt != '0')
918
+ pieChartData.push(parseInt(cnt));
919
+ pieChartLabels.push(data);
920
+ pieChartlegend.push(data);
921
+ }
922
+ });
923
+ this.ChatMapDtl[status + "_data"] = pieChartData;
924
+ this.ChatMapDtl[status + "_lable"] = pieChartLabels;
925
+ this.ChatMapDtl[status + "_legend"] = pieChartlegend;
926
+ });
927
+ this.ChartType = 'pie';
928
+ this.refreshChart('pie');
929
+ document.getElementById('PiechartModelBtn').click();
930
+ }
931
+ creategrpBar(pieStatusList, grp, attr, piechartDataList, typ) {
932
+ this.isbarshowchart = false;
933
+ this.barChartData = [];
934
+ this.barChartLabels = [];
935
+ pieStatusList.forEach(status => {
936
+ let barcharDtl = {};
937
+ let barchatlist = [];
938
+ let linechartList = [];
939
+ piechartDataList.forEach(data => {
940
+ let dtl;
941
+ if (typ == 'head') {
942
+ dtl = this.matrix.get(grp + "#" + data + "#" + attr + "#" + status) || '';
943
+ }
944
+ else {
945
+ dtl = this.matrix.get(grp + "#" + attr + "#" + data + "#" + status) || '';
946
+ }
947
+ if (this.barChartLabels.indexOf(data) == -1) {
948
+ this.barChartLabels.push(data);
949
+ }
950
+ if (dtl != '') {
951
+ let cnt = dtl.get('count') || '0';
952
+ let avg = dtl.get('avg') || '0';
953
+ barchatlist.push(cnt);
954
+ linechartList.push(avg);
955
+ }
956
+ else {
957
+ barchatlist.push('0');
958
+ linechartList.push('0');
959
+ }
960
+ });
961
+ debugger;
962
+ barcharDtl['label'] = status + " Qty";
963
+ barcharDtl['data'] = barchatlist;
964
+ barcharDtl['type'] = 'bar';
965
+ barcharDtl['yAxisID'] = 'y-axis-1';
966
+ this.barChartData.push(barcharDtl);
967
+ barcharDtl = {};
968
+ barcharDtl['label'] = status + " Avg";
969
+ barcharDtl['data'] = linechartList;
970
+ barcharDtl['type'] = 'line';
971
+ barcharDtl['fill'] = false;
972
+ barcharDtl['yAxisID'] = 'y-axis-2';
973
+ this.barChartData.push(barcharDtl);
974
+ });
975
+ this.barChartType = 'bar';
976
+ this.refreshChart('bar');
977
+ document.getElementById('barchartModelBtn').click();
978
+ }
979
+ refreshChart(type) {
980
+ setTimeout(() => {
981
+ if (type == 'bar')
982
+ this.isbarshowchart = true;
983
+ if (type == 'pie')
984
+ this.isshowchart = true;
985
+ }, 5);
986
+ }
987
+ ngOnInit() {
988
+ window.addEventListener('scroll', this.scroll, true);
989
+ this.route.params.subscribe(map => {
990
+ let schId = localStorage.getItem('srcIdns');
991
+ let period = localStorage.getItem('BIPeriod');
992
+ this.formname = this.route.snapshot.params['frmnme'];
993
+ this.srchHistory['period'] = period;
994
+ let frmdt = localStorage.getItem('BIpTo');
995
+ let todt = localStorage.getItem('BIpFrom');
996
+ this.cUrl = this.router.url;
997
+ this.modulename = this.cUrl.split('/')[1];
998
+ if (frmdt != null && frmdt != undefined) {
999
+ this.srchHistory['frmdt'] = (localStorage.getItem('BIpFrom')).replace(/['"]+/g, '');
1000
+ }
1001
+ if (todt != null && todt != undefined) {
1002
+ this.srchHistory['todt'] = (localStorage.getItem('BIpTo')).replace(/['"]+/g, '');
1003
+ }
1004
+ if (schId != undefined) {
1005
+ this.getSearchResult(schId, period);
1006
+ }
1007
+ });
1008
+ // this.groups = [
1009
+ // {
1010
+ // 'val': 'sh_sz_co_pu',
1011
+ // 'grp': 'sh,sz',
1012
+ // 'head': 'pu',
1013
+ // 'side': 'co',
1014
+ // }, {
1015
+ // 'val': 'sh_co_pu',
1016
+ // 'grp': 'sh',
1017
+ // 'head': 'pu',
1018
+ // 'side': 'co',
1019
+ // }, {
1020
+ // 'val': 'pur_co_pu',
1021
+ // 'grp': 'pur',
1022
+ // 'head': 'pu',
1023
+ // 'side': 'co',
1024
+ // }
1025
+ // ]
1026
+ // this.createGrid();
1027
+ }
1028
+ }
1029
+ /** @nocollapse */ /** @nocollapse */ QaAnalysisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QaAnalysisComponent, deps: [{ token: i1.CommanServiceService }, { token: i2.BiService }, { token: i3.NgxSpinnerService }, { token: i4.ToastrService }, { token: i5.Router }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
1030
+ /** @nocollapse */ /** @nocollapse */ QaAnalysisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: QaAnalysisComponent, selector: "app-qa-analysis", ngImport: i0, template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span>&nbsp;&nbsp;&nbsp;Analysis\r\n <span class=\"f-12\">({{cs.cDate | date:'medium'}})</span>\r\n <!-- <button (click)=\"test()\"></button> -->\r\n\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"content-frame-body\" style=\"margin-left:0;\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"row\" id=\"staticHead\"\r\n style=\" position: fixed;width: 100%;background: white;z-index: 99;padding-top:5px\">\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label>Grid Formate </label> &nbsp;&nbsp;\r\n <select class=\"form-control form-control-sm\" name=\"gridGrp\" (change)=\"changeGrp(gridGrp);\"\r\n [(ngModel)]=\"gridGrp\">\r\n <option *ngFor=\"let group of groups\" [ngValue]=\"group\">{{group.name}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"form-group\">\r\n <p style=\"font-weight: 600;\">Sale period &nbsp;&nbsp; {{srchHistory?.frmdt}} &nbsp;&nbsp; To\r\n &nbsp;&nbsp; {{srchHistory?.todt}} &nbsp;&nbsp;&nbsp;&nbsp; |\r\n &nbsp;&nbsp; Period {{srchHistory?.period}}</p>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">change By &nbsp;&nbsp;</label>\r\n <select style=\"width:80px;\" class=\"form-control form-control-sm\" name=\"ChangeBy\"\r\n (change)=\"OnChangeBy(ChangeBy);\" [(ngModel)]=\"ChangeBy\">\r\n <option value=\"COUNTCOLOR\">Qty</option>\r\n <option value=\"AVGCOLOR\">Avg</option>\r\n </select>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div class=\"stats\">\r\n <input type=\"checkbox\" (click)=\"hideShow('CTS', $event.target.checked);\"> CTS\r\n <input type=\"checkbox\" (click)=\"hideShow('AVG', $event.target.checked);\"> AVG\r\n <input type=\"checkbox\" (click)=\"hideShow('RAP', $event.target.checked);\"> DISC\r\n <!-- <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE -->\r\n <input type=\"checkbox\" (click)=\"hideShow('VLU', $event.target.checked);\"> VLU\r\n\r\n <input type=\"checkbox\" (click)=\"hideShow('MSD', $event.target.checked);\"> MSD\r\n <input type=\"checkbox\" (click)=\"hideShow('MSDVLU', $event.target.checked);\"> MSD VLU\r\n <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE\r\n <input type=\"checkbox\" (click)=\"hideShow('VA', $event.target.checked);\"> VA\r\n <input type=\"checkbox\" (click)=\"hideShow('SVP', $event.target.checked);\"> SVPD\r\n </div>\r\n </div>\r\n <div class=\"grids\" style=\"margin-top: 75px;\">\r\n <div class=\"row\" *ngFor=\"let grp of sortedGrp;let i = index\">\r\n <div class=\"stats\">\r\n <strong>{{grp}} </strong>\r\n </div>\r\n <div class=\"table-responsive\" style=\"overflow-y: hidden;\r\n height: auto;\">\r\n <table class=\"table table-bordered analysisTable\">\r\n <ng-container>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th *ngFor=\"let hrd of head;\" class=\"text-center\" [attr.colspan]=\"stt?.length\">{{hrd}} <i\r\n class=\"fa fa-pie-chart\" (click)=\"creategrpPie(stt,grp,hrd,side,'head')\"\r\n aria-hidden=\"true\"></i>\r\n &nbsp;\r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,hrd,side,'head')\" aria-hidden=\"true\"></i>\r\n </th>\r\n <th class=\"text-center\" colspan=\"2\" [attr.colspan]=\"stt?.length\">Total</th>\r\n </tr>\r\n <tr>\r\n <th></th>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <th *ngFor=\"let st of stt;\" class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\">&nbsp;</td>\r\n </tr>\r\n </table>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <th class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\">&nbsp;</td>\r\n </tr>\r\n </table>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let sid of side;\">\r\n <td class=\"text-center\">{{sid}} <i class=\"fa fa-pie-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpPie(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i> &nbsp;\r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\"\r\n [ngStyle]=\"{'background':isApplied==true?gblGrdDataColor.get(grp+'#'+sid+'#'+hrd+'#'+st).get(key) : matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('grpcolor')}\"\r\n class=\"text-center\">\r\n <!-- <span>{{gblGrpArr[grp+'#'+sid+'#'+hrd+'#'+st] |json}}</span> -->\r\n <span class=\"cp\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"Click here to get data\"\r\n data-placement=\"right\"><a href=\"javascript:void(0)\" target=\"_blank\"\r\n (click)=\"getData('cell', grp+'#'+sid+'#'+hrd,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">\r\n {{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n </span>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')== null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt'))}}</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td> -->\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc'))}}</td>\r\n\r\n <td *ngIf=\"val\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')==null)?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value'))}}</td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd') }}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')}}</td>\r\n\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">{{cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')== null )?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')==null)? '-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage'))}}</td>\r\n </tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')}}</td>\r\n <td>&nbsp;</td>\r\n <tr>\r\n\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': rowTotal?.get(grp+'#'+sid+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\" (click)=\"getData('row', grp+'#'+sid,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt'))}}\r\n </td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')}}\r\n </td> -->\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg'))}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==null\r\n )?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}\r\n <!-- :{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')}}\r\n </td>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <td class=\"text-center\">Total</td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\" class=\"text-center\"\r\n [ngStyle]=\"{'background': colTotal?.get(grp+'#'+hrd+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\"\r\n (click)=\"getData('col', grp+'#'+hrd,st);\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt'))}}\r\n </td>\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td> -->\r\n\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==\"\" ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==null\r\n )?'-':colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc') == '' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==''\r\n ||colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==null ) ?\r\n '-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd'))}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}\r\n <!-- :{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')==null)?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': grandTotal?.get('GT#'+grp+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\" (click)=\"getAll(stt,head,side,grp)\">\r\n <!-- (click)=\"getData('all', '');\" -->\r\n {{grandTotal?.get('GT#'+grp+'#'+st)?.get('count')}}\r\n </a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt'))}}\r\n </td>\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg'))}}\r\n\r\n\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('value')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('value')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('age')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('age') |json}} -->\r\n\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <div *ngIf=\"isshowchart\" class=\"col-sm-6\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [data]=\"ChatMapDtl[st+'_data']\" [labels]=\"ChatMapDtl[st+'_lable']\"\r\n [legend]=\"ChatMapDtl[st+'_legend']\" [chartType]=\"ChartType\" [options]=\"chartOptions\"></canvas>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"barchartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Bar Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n\r\n <div *ngIf=\"isbarshowchart\" class=\"col-sm-12\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [datasets]=\"barChartData\" [labels]=\"barChartLabels\" [options]=\"barChartOptions\"\r\n [legend]=\"barChartLegend\" [colors]=\"barchartColors\" [chartType]=\"barChartType\">\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n<button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n<button id=\"barchartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#barchartModel\"></button>", styles: [".dispblock{display:block}.dispnone{display:none}.table>tbody>tr>td{font-size:13px;font-weight:700}\n"], directives: [{ type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i8.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["options", "data", "datasets", "labels", "chartType", "colors", "legend", "plugins"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }], pipes: { "date": i7.DatePipe } });
1031
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QaAnalysisComponent, decorators: [{
1032
+ type: Component,
1033
+ args: [{ selector: 'app-qa-analysis', template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span>&nbsp;&nbsp;&nbsp;Analysis\r\n <span class=\"f-12\">({{cs.cDate | date:'medium'}})</span>\r\n <!-- <button (click)=\"test()\"></button> -->\r\n\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"content-frame-body\" style=\"margin-left:0;\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"row\" id=\"staticHead\"\r\n style=\" position: fixed;width: 100%;background: white;z-index: 99;padding-top:5px\">\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label>Grid Formate </label> &nbsp;&nbsp;\r\n <select class=\"form-control form-control-sm\" name=\"gridGrp\" (change)=\"changeGrp(gridGrp);\"\r\n [(ngModel)]=\"gridGrp\">\r\n <option *ngFor=\"let group of groups\" [ngValue]=\"group\">{{group.name}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"form-group\">\r\n <p style=\"font-weight: 600;\">Sale period &nbsp;&nbsp; {{srchHistory?.frmdt}} &nbsp;&nbsp; To\r\n &nbsp;&nbsp; {{srchHistory?.todt}} &nbsp;&nbsp;&nbsp;&nbsp; |\r\n &nbsp;&nbsp; Period {{srchHistory?.period}}</p>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">change By &nbsp;&nbsp;</label>\r\n <select style=\"width:80px;\" class=\"form-control form-control-sm\" name=\"ChangeBy\"\r\n (change)=\"OnChangeBy(ChangeBy);\" [(ngModel)]=\"ChangeBy\">\r\n <option value=\"COUNTCOLOR\">Qty</option>\r\n <option value=\"AVGCOLOR\">Avg</option>\r\n </select>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div class=\"stats\">\r\n <input type=\"checkbox\" (click)=\"hideShow('CTS', $event.target.checked);\"> CTS\r\n <input type=\"checkbox\" (click)=\"hideShow('AVG', $event.target.checked);\"> AVG\r\n <input type=\"checkbox\" (click)=\"hideShow('RAP', $event.target.checked);\"> DISC\r\n <!-- <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE -->\r\n <input type=\"checkbox\" (click)=\"hideShow('VLU', $event.target.checked);\"> VLU\r\n\r\n <input type=\"checkbox\" (click)=\"hideShow('MSD', $event.target.checked);\"> MSD\r\n <input type=\"checkbox\" (click)=\"hideShow('MSDVLU', $event.target.checked);\"> MSD VLU\r\n <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE\r\n <input type=\"checkbox\" (click)=\"hideShow('VA', $event.target.checked);\"> VA\r\n <input type=\"checkbox\" (click)=\"hideShow('SVP', $event.target.checked);\"> SVPD\r\n </div>\r\n </div>\r\n <div class=\"grids\" style=\"margin-top: 75px;\">\r\n <div class=\"row\" *ngFor=\"let grp of sortedGrp;let i = index\">\r\n <div class=\"stats\">\r\n <strong>{{grp}} </strong>\r\n </div>\r\n <div class=\"table-responsive\" style=\"overflow-y: hidden;\r\n height: auto;\">\r\n <table class=\"table table-bordered analysisTable\">\r\n <ng-container>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th *ngFor=\"let hrd of head;\" class=\"text-center\" [attr.colspan]=\"stt?.length\">{{hrd}} <i\r\n class=\"fa fa-pie-chart\" (click)=\"creategrpPie(stt,grp,hrd,side,'head')\"\r\n aria-hidden=\"true\"></i>\r\n &nbsp;\r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,hrd,side,'head')\" aria-hidden=\"true\"></i>\r\n </th>\r\n <th class=\"text-center\" colspan=\"2\" [attr.colspan]=\"stt?.length\">Total</th>\r\n </tr>\r\n <tr>\r\n <th></th>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <th *ngFor=\"let st of stt;\" class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\">&nbsp;</td>\r\n </tr>\r\n </table>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <th class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\">&nbsp;</td>\r\n </tr>\r\n </table>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let sid of side;\">\r\n <td class=\"text-center\">{{sid}} <i class=\"fa fa-pie-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpPie(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i> &nbsp;\r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\"\r\n [ngStyle]=\"{'background':isApplied==true?gblGrdDataColor.get(grp+'#'+sid+'#'+hrd+'#'+st).get(key) : matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('grpcolor')}\"\r\n class=\"text-center\">\r\n <!-- <span>{{gblGrpArr[grp+'#'+sid+'#'+hrd+'#'+st] |json}}</span> -->\r\n <span class=\"cp\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"Click here to get data\"\r\n data-placement=\"right\"><a href=\"javascript:void(0)\" target=\"_blank\"\r\n (click)=\"getData('cell', grp+'#'+sid+'#'+hrd,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">\r\n {{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n </span>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')== null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt'))}}</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td> -->\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc'))}}</td>\r\n\r\n <td *ngIf=\"val\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')==null)?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value'))}}</td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd') }}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')}}</td>\r\n\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">{{cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')== null )?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')==null)? '-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage'))}}</td>\r\n </tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')}}</td>\r\n <td>&nbsp;</td>\r\n <tr>\r\n\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': rowTotal?.get(grp+'#'+sid+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\" (click)=\"getData('row', grp+'#'+sid,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt'))}}\r\n </td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')}}\r\n </td> -->\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg'))}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==null\r\n )?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}\r\n <!-- :{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')}}\r\n </td>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <td class=\"text-center\">Total</td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\" class=\"text-center\"\r\n [ngStyle]=\"{'background': colTotal?.get(grp+'#'+hrd+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\"\r\n (click)=\"getData('col', grp+'#'+hrd,st);\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt'))}}\r\n </td>\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td> -->\r\n\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==\"\" ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==null\r\n )?'-':colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc') == '' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==''\r\n ||colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==null ) ?\r\n '-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd'))}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}\r\n <!-- :{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')==null)?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': grandTotal?.get('GT#'+grp+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\" (click)=\"getAll(stt,head,side,grp)\">\r\n <!-- (click)=\"getData('all', '');\" -->\r\n {{grandTotal?.get('GT#'+grp+'#'+st)?.get('count')}}\r\n </a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt'))}}\r\n </td>\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg'))}}\r\n\r\n\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('value')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('value')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('age')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('age') |json}} -->\r\n\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <div *ngIf=\"isshowchart\" class=\"col-sm-6\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [data]=\"ChatMapDtl[st+'_data']\" [labels]=\"ChatMapDtl[st+'_lable']\"\r\n [legend]=\"ChatMapDtl[st+'_legend']\" [chartType]=\"ChartType\" [options]=\"chartOptions\"></canvas>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"barchartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Bar Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n\r\n <div *ngIf=\"isbarshowchart\" class=\"col-sm-12\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [datasets]=\"barChartData\" [labels]=\"barChartLabels\" [options]=\"barChartOptions\"\r\n [legend]=\"barChartLegend\" [colors]=\"barchartColors\" [chartType]=\"barChartType\">\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n<button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n<button id=\"barchartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#barchartModel\"></button>", styles: [".dispblock{display:block}.dispnone{display:none}.table>tbody>tr>td{font-size:13px;font-weight:700}\n"] }]
1034
+ }], ctorParameters: function () { return [{ type: i1.CommanServiceService }, { type: i2.BiService }, { type: i3.NgxSpinnerService }, { type: i4.ToastrService }, { type: i5.Router }, { type: i5.ActivatedRoute }]; } });
1035
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWEtYW5hbHlzaXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9xYS1hbmFseXNpcy9xYS1hbmFseXNpcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lemxpYi9zcmMvbGliL3FhLWFuYWx5c2lzL3FhLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRTtBQUMvRSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7OztBQVM1QixNQUFNLE9BQU8sbUJBQW1CO0lBRTlCLFlBQ1MsRUFBd0IsRUFDdkIsR0FBYyxFQUNkLGVBQWtDLEVBQ2xDLE1BQXFCLEVBQ3JCLE1BQWMsRUFDZCxLQUFxQjtRQUx0QixPQUFFLEdBQUYsRUFBRSxDQUFzQjtRQUN2QixRQUFHLEdBQUgsR0FBRyxDQUFXO1FBQ2Qsb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBRy9CLFFBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxFQUFF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QUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNuRDtZQUNELFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckgsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMvRyxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQy9HLElBQUksT0FBTyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxJQUFJLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkcsSUFBSSxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBRXZHLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QyxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN0RCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksUUFBUSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLEVBQUU7Z0JBQzdDLFFBQVEsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO2FBQ3pCO1lBQ0QsSUFBSSxlQUFlLEdBQUcsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN6QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUNoQixLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFHcEMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLFlBQVksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLFlBQVksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ2pEO2lCQUFNO2dCQUNMLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLEdBQUcsZUFBZSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJO2dCQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO2dCQUNyQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO2dCQUNyQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNmLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFFM0MsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFHaEMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNwQixVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBR2QsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBRW5CLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBRWhCLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUM7Z0JBQ3hGLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxPQUFPLElBQUksU0FBUyxFQUFFO29CQUN4QixRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFFN0M7Z0JBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUU7b0JBQ3hCLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM3QztnQkFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixJQUFJLFFBQVEsR0FBRyxDQUFDLFNBQVMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQzVDLDRDQUE0QztnQkFDNUMsNENBQTRDO2dCQUM1QyxRQUFRLENBQUM7Z0JBQ1QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQzFCLElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRTtvQkFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQztpQkFDbEI7cUJBQU0sSUFBSSxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUU7b0JBQ3pDLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ2xCO3FCQUFNLElBQUksUUFBUSxJQUFJLEVBQUUsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO29CQUNwRCxTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUNsQjtxQkFBTSxJQUFJLFFBQVEsSUFBSSxZQUFZLElBQUksUUFBUSxHQUFHLFlBQVksRUFBRTtvQkFDOUQsU0FBUyxHQUFHLHlCQUF5QixDQUFDO2lCQUN2QztxQkFBTSxJQUFJLFFBQVEsSUFBSSxZQUFZLElBQUksUUFBUSxHQUFHLEdBQUcsRUFBRTtvQkFDckQsU0FBUyxHQUFHLE1BQU0sQ0FBQztpQkFDcEI7cUJBQU0sSUFBSSxRQUFRLElBQUksR0FBRyxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUU7b0JBQzVDLFNBQVMsR0FBRyxNQUFNLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNMLFNBQVMsR0FBRyxNQUFNLENBQUM7aUJBQ3BCO2dCQUdELEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUdqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDekI7WUFDRCxJQUFJLE1BQU0sSUFBSSxLQUFLO2dCQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVuQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzthQUNwQztZQUNELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsSUFBSSxjQUFjLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUMxRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFHbkUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsSUFBSSxjQUFjLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUMxRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFHbkUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckIsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxVQUFVO1FBRTVDLDJCQUEyQjtRQUMzQiwyQkFBMkI7UUFDM0IsMEJBQTBCO1FBQzFCLCtCQUErQjtRQUUvQixzQkFBc0I7UUFDdEIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7b0JBQ25CLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztvQkFDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7b0JBQ3JCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO29CQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzlDLElBQUksYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDVixhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQzs0QkFDekMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQzs0QkFFM0YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDdEUsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ2hHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUNyRzt5QkFDRjs2QkFDSTs0QkFDSCxJQUFJLElBQUksQ0FBQyxN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SUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkYsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRWpELElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUMxQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pGLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRW5DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztZQUVuQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUVoQixJQUFJLE1BQU0sRUFBRTtn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QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDMUYsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFakQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBRW5CLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBRWhCLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUks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QUNOLElBQUk7UUFDSixxQkFBcUI7SUFDdkIsQ0FBQzs7c0pBbnBDVSxtQkFBbUI7MElBQW5CLG1CQUFtQix1RENqQmhDLDQ4Z0NBMGdCd0c7MkZEemYzRixtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgU3RvY2tDb21wb25lbnQgfSBmcm9tICcuLy4uLy4uL3N0b2NrLW1vZHVsZS9zdG9jay9zdG9jay5jb21wb25lbnQnO1xyXG4vLyBpbXBvcnQgeyBlbGVtZW50IH0gZnJvbSAncHJvdHJhY3Rvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1hblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbWFuLXNlcnZpY2UvY29tbWFuLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuaW1wb3J0IHsgQmlTZXJ2aWNlIH0gZnJvbSAnLi8uLi9iaS1zZXJ2aWNlL2JpLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IENoYXJ0T3B0aW9ucyB9IGZyb20gJ2NoYXJ0LmpzJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1xYS1hbmFseXNpcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3FhLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9xYS1hbmFseXNpcy5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFFhQW5hbHlzaXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJpczogQmlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7IH1cclxuXHJcbiAgY0R0ID0gbmV3IERhdGUoKTtcclxuICBodG1sQXJyID0gW107XHJcbiAgaGVhZCA9IFtdO1xyXG4gIHNpZGUgPSBbXTtcclxuICBwcml2YXRlIGdycHZhbDtcclxuICBwcml2YXRlIGhlYWR2YWw7XHJcbiAgcHJpdmF0ZSBzaWRldmFsO1xyXG4gIHByaXZhdGUgYXJydER0bDtcclxuICBwcml2YXRlIHF1ZXJ5UGFyYW07XHJcbiAgcWFBbmFseXNpc0FycjtcclxuICBncmFuZFRvdGFsID0gbmV3IE1hcCgpO1xyXG4gIG1hdHJpeCA9IG5ldyBNYXAoKTtcclxuICByb3dUb3RhbCA9IG5ldyBNYXAoKTtcclxuICBjb2xUb3RhbCA9IG5ldyBNYXAoKTtcclxuICBwa3REYXRhID0gbmV3IE1hcCgpO1xyXG4gIHNpZGVEYXRhID0gbmV3IE1hcCgpO1xyXG4gIGhlYWREYXRhID0gbmV3IE1hcCgpO1xyXG4gIHNvcnRlZEdycDtcclxuICBwcml2YXRlIHNjaER0bDtcclxuICBwcml2YXRlIHJlc3VsdDtcclxuICBncmlkR3JwO1xyXG4gIGF0dHJHcmlkRm9ybWF0O1xyXG4gIGdyb3VwcyA9IFtdO1xyXG4gIGludmVudG9yeURheXM7XHJcbiAgZm9ybW5hbWU7XHJcbiAgcHJpdmF0ZSBhbmFHcnBTdHQgPSBbJ21rdCcsICdhc3J0JywgJ2xhYiddO1xyXG4gIHN0O1xyXG5cclxuICBwdWJsaWMgQ2hhcnRUeXBlID0gXCJcIjtcclxuICBwdWJsaWMgY2hhcnRPcHRpb25zOiBhbnkgPSB7XHJcbiAgICBsZWdlbmQ6IHtcclxuICAgICAgcG9zaXRpb246ICdsZWZ0JyxcclxuICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgZm9udENvbG9yOiAnYmxhY2snLFxyXG4gICAgICAgIGJveFdpZHRoOiAxMCxcclxuICAgICAgICBwYWRkaW5nOiAxMCxcclxuICAgICAgICBmb250U2l6ZTogMTBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyBwcml2YXRlIGFuYUFsbEdycFN0dCA9IFsnYXNydCcsICdsYWInLCAnbWt0JywgJ3NvbGQnXTtcclxuXHJcbiAgc3JjaEhpc3RvcnkgPSB7XHJcbiAgICBwZXJpb2Q6ICcnLFxyXG4gICAgZnJtZHQ6ICcnLFxyXG4gICAgdG9kdDogJydcclxuICB9O1xyXG4gIHBlcmlvZDtcclxuICBzZWFyY2hGO1xyXG4gIHNhbGVQZXJpb2Q7XHJcbiAgQ2hhbmdlQnk7XHJcbiAgZ3JpZFZhcmlhbmNlO1xyXG4gIGdibEdyZERhdGFDb2xvciA9IG5ldyBNYXAoKTtcclxuICAvLyBnYmxHcmlkU3ViTWFwID0gbmV3IE1hcCgpO1xyXG4gIGdibFJvd1RvdENvbG9yVmFsV2lzZSA9IG5ldyBNYXAoKTtcclxuICBsZWdlbmRMaXN0ID0gW107XHJcbiAgbW9kdWxlbmFtZTtcclxuICBjVXJsO1xyXG4gIGdldFNlYXJjaFJlc3VsdChpZCwgcGVyaW9kKSB7XHJcbiAgICB0aGlzLl9zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ3NlYXJjaElkbkxpc3QnXSA9IGlkLnNwbGl0KCcsJyk7XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTtcclxuICAgIHJlcU9ialsncGVyaW9kJ10gPSBwZXJpb2Q7XHJcbiAgICB0aGlzLmJpcy5kYXRhKHJlcU9iaiwgJ3NlYXJjaCcsICdtYXJrZXRpbmcvc2VhcmNoJylcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgbGV0IHJlcyA9IGRhdGEucmVzdWx0O1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJyZXNcIiwgcmVzKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdCSS1QS1RfR1JPVVBfQlknLCBKU09OLnN0cmluZ2lmeShyZXMucGFnZURlZmluYXRpb24uZm9ybV9maWVsZFswXS5sb3ZfcXJ5KSk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnQkktZ3JpZEF2ZycsIEpTT04uc3RyaW5naWZ5KHJlcy5wYWdlRGVmaW5hdGlvbi50YWJzWzBdLmxvdl9xcnkuc3BsaXQoJywnKSkpO1xyXG4gICAgICAgICAgdGhpcy5pbnZlbnRvcnlEYXlzID0gcmVzLmludmVudG9yeURheXMgfHwgJzYwJztcclxuICAgICAgICAgIHRoaXMuZ3JpZFZhcmlhbmNlID0gcmVzLmdyaWRWYXJpYW5jZSB8fCAnMTAnO1xyXG4gICAgICAgICAgdGhpcy5hcnJ0RHRsID0gcmVzLmF0dHJEdGw7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdCA9IHJlcztcclxuICAgICAgICAgIHRoaXMubGVnZW5kTGlzdCA9IHJlcy5sZWdlbmRMaXN0O1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0JJTGVnZW5kcycsIEpTT04uc3RyaW5naWZ5KHRoaXMubGVnZW5kTGlzdCkpO1xyXG4gICAgICAgICAgdGhpcy5zY2hEdGwgPSByZXMuc2VhcmNoUmVzdWx0RHRsO1xyXG4gICAgICAgICAgbGV0IGdycFZpZXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYW5hR3JwVHlwZScpO1xyXG4gICAgICAgICAgdGhpcy5ncm91cHMgPSByZXMuYXR0ckdyaWRGb3JtYXQ7XHJcbiAgICAgICAgICBsZXQgZGVmYXVsdEdycDtcclxuICAgICAgICAgIGlmIChncnBWaWV3ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWZhdWx0R3JwID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYW5hR3JwVHlwZScpKTtcclxuICAgICAgICAgICAgbGV0IGNpbmR4ID0gdGhpcy5ncm91cHMuaW5kZXhPZihkZWZhdWx0R3JwKTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkR3JwID0gdGhpcy5ncm91cHNbY2luZHhdO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkR3JwID0gdGhpcy5ncm91cHNbMF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlR3JpZEdycFdpc2UoJ2knLCBkZWZhdWx0R3JwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuc2hvdyhkYXRhLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5zaG93KGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHN0dDtcclxuICBjcmVhdGVHcmlkKCkge1xyXG4gICAgbGV0IG5ld0FycnkgPSB0aGlzLnNjaER0bDtcclxuICAgIC8vIGNvbnNvbGUubG9nKG5ld0FycnkpO1xyXG4gICAgZGVidWdnZXJcclxuICAgIGxldCBkaWZmZGF5ID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RpZmYnKSk7XHJcbiAgICBsZXQgYmlwZXJpb2QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklQZXJpb2QnKSB8fCAnJztcclxuICAgIGlmIChiaXBlcmlvZCA9PSAnd2VlaycpXHJcbiAgICAgIGJpcGVyaW9kID0gXCI3XCI7XHJcbiAgICBpZiAoYmlwZXJpb2QgPT0gJ21vbnRoJylcclxuICAgICAgYmlwZXJpb2QgPSBcIjMwXCI7XHJcbiAgICBpZiAoYmlwZXJpb2QgPT0gJ3F1YXJ0ZXInKVxyXG4gICAgICBiaXBlcmlvZCA9IFwiOTBcIjtcclxuICAgIGxldCBwZXJpb2QgPSBwYXJzZUludChiaXBlcmlvZCk7XHJcbiAgICBpZiAocGVyaW9kID09IDEpIHtcclxuICAgICAgcGVyaW9kID0gZGlmZmRheTtcclxuICAgIH1cclxuICAgIGxldCBkcmVkID0gXCJyZ2JhKDI1NSwgMCwgMCwwLjYpXCI7XHJcbiAgICBsZXQgbXJlZCA9IFwicmdiYSgyNTUsIDAsIDAsMC40KVwiO1xyXG4gICAgbGV0IGxyZWQgPSBcInJnYmEoMjU1LCAwLCAwLDAuMilcIjtcclxuICAgIGxldCBkZ3JlZW4gPSBcInJnYmEoMCAsMTI4LCAwICwwLjYpXCI7XHJcbiAgICBsZXQgbWdyZWVuID0gXCJyZ2JhKDAgLDEyOCwgMCAsMC40KVwiO1xyXG4gICAgbGV0IGxncmVlbiA9IFwicmdiYSgwICwxMjgsIDAgLDAuMilcIjtcclxuICAgIGxldCBzdG9ja2RheXMgPSB0aGlzLmludmVudG9yeURheXNcclxuICAgIGxldCBtaW52YXJpYXRpb24gPSAoMTAwIC0gcGFyc2VJbnQodGhpcy5ncmlkVmFyaWFuY2UpKTtcclxuICAgIGxldCBtYXh2YXJpYXRpb24gPSAoMTAwICsgcGFyc2VJbnQodGhpcy5ncmlkVmFyaWFuY2UpKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInBlcmlvZFwiLCBwZXJpb2QpO1xyXG4gICAgdGhpcy5zY2hEdGwubWFwKGVsZW1lbnQgPT4ge1xyXG4gICAgICBsZXQgaGVhZGVyID0gJyc7XHJcbiAgICAgIGxldCBncm91cEtleXMgPSAnJztcclxuICAgICAgbGV0IHNpZGVLZXlzID0gJyc7XHJcbiAgICAgIGxldCBoZWFkS2V5cyA9ICcnO1xyXG4gICAgICBsZXQgbElkeDtcclxuICAgICAgdGhpcy5ncnB2YWwubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgaGVhZGVyICs9IGVsZW1lbnRbZWxlXSArICcsJztcclxuICAgICAgICBncm91cEtleXMgKz0gZWxlbWVudFtlbGVdICsgJywnO1xyXG4gICAgICB9KTtcclxuICAgICAgbElkeCA9IGhlYWRlci5sYXN0SW5kZXhPZignLCcpO1xyXG4gICAgICBpZiAobElkeCA9PSBoZWFkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGhlYWRlciA9IGhlYWRlci5zdWJzdHIoMCwgaGVhZGVyLmxlbmd0aCAtIDEpICsgXCIjXCI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zaWRldmFsLm1hcChlbGUgPT4ge1xyXG4gICAgICAgIGhlYWRlciArPSBlbGVtZW50W2VsZV0gKyAnLCc7XHJcbiAgICAgICAgc2lkZUtleXMgKz0gZWxlbWVudFtlbGVdICsgJywnO1xyXG4gICAgICB9KTtcclxuICAgICAgbElkeCA9IGhlYWRlci5sYXN0SW5kZXhPZignLCcpO1xyXG4gICAgICBpZiAobElkeCA9PSBoZWFkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGhlYWRlciA9IGhlYWRlci5zdWJzdHIoMCwgaGVhZGVyLmxlbmd0aCAtIDEpICsgXCIjXCI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oZWFkdmFsLm1hcChlbGUgPT4ge1xyXG4gICAgICAgIGhlYWRlciArPSBlbGVtZW50W2VsZV0gKyAnLCc7XHJcbiAgICAgICAgaGVhZEtleXMgKz0gZWxlbWVudFtlbGVdICsgJywnO1xyXG4gICAgICB9KTtcclxuICAgICAgbElkeCA9IGhlYWRlci5sYXN0SW5kZXhPZignLCcpO1xyXG4gICAgICBpZiAobElkeCA9PSBoZWFkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGhlYWRlciA9IGhlYWRlci5zdWJzdHIoMCwgaGVhZGVyLmxlbmd0aCAtIDEpICsgXCJcIjtcclxuICAgICAgfVxyXG4gICAgICBncm91cEtleXMgPSAoZ3JvdXBLZXlzLmxhc3RJbmRleE9mKCcsJykgPT0gZ3JvdXBLZXlzLmxlbmd0aCkgPyBncm91cEtleXMuc3Vic3RyKDAsIGdyb3VwS2V5cy5sZW5ndGggLSAxKSA6IGdyb3VwS2V5cztcclxuICAgICAgc2lkZUtleXMgPSAoc2lkZUtleXMubGFzdEluZGV4T2YoJywnKSA9PSBzaWRlS2V5cy5sZW5ndGgpID8gc2lkZUtleXMuc3Vic3RyKDAsIHNpZGVLZXlzLmxlbmd0aCAtIDEpIDogc2lkZUtleXM7XHJcbiAgICAgIGhlYWRLZXlzID0gKGhlYWRLZXlzLmxhc3RJbmRleE9mKCcsJykgPT0gaGVhZEtleXMubGVuZ3RoKSA/IGhlYWRLZXlzLnN1YnN0cigwLCBoZWFkS2V5cy5sZW5ndGggLSAxKSA6IGhlYWRLZXlzO1xyXG4gICAgICBsZXQgbEhlYWRlciA9IGhlYWRlciArICcjJyArIGVsZW1lbnQuZHNwX3N0dDtcclxuICAgICAgbGV0IGxTaWRlS2V5ID0gKGdyb3VwS2V5cy5sZW5ndGggPT0gMCkgPyBzaWRlS2V5cyA6IGdyb3VwS2V5cyArIFwiI1wiICsgc2lkZUtleXMgKyAnIycgKyBlbGVtZW50LmRzcF9zdHQ7XHJcbiAgICAgIGxldCBsSGVhZEtleSA9IChncm91cEtleXMubGVuZ3RoID09IDApID8gaGVhZEtleXMgOiBncm91cEtleXMgKyBcIiNcIiArIGhlYWRLZXlzICsgJyMnICsgZWxlbWVudC5kc3Bfc3R0O1xyXG5cclxuICAgICAgbGV0IHd0ID0gcGFyc2VGbG9hdChlbGVtZW50LmNydHd0KTtcclxuICAgICAgbGV0IHJ0ZSA9IHBhcnNlRmxvYXQoZWxlbWVudC5hc2tpbmdfcnRlKTtcclxuICAgICAgbGV0IHNhbHJhdGUgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc2FsX3J0ZSk7XHJcbiAgICAgIGxldCBzYWxfcnRlID0gcGFyc2VGbG9hdChlbGVtZW50LnF1b3QpO1xyXG4gICAgICBsZXQgYmVuY2htYXJrX3J0ZSA9IHBhcnNlRmxvYXQoZWxlbWVudC5iZW5jaG1hcmtfcnRlKTtcclxuICAgICAgbGV0IGFnZSA9IHBhcnNlSW50KGVsZW1lbnQuYWdlKTtcclxuICAgICAgbGV0IHJ0ZVZhbHVlID0gcnRlICogd3Q7XHJcbiAgICAgIGlmICgoZWxlbWVudC5ncnBfc3R0KS50b0xvd2VyQ2FzZSgpID09ICdzb2xkJykge1xyXG4gICAgICAgIHJ0ZVZhbHVlID0gc2FscmF0ZSAqIHd0O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBiZW5hY2htYXJrVmFsdWUgPSBiZW5jaG1hcmtfcnRlICogd3Q7XHJcbiAgICAgIGxldCBncmlkV3QgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJ0ZVZhbHVlID0gMDtcclxuICAgICAgbGV0IGdyaWR2YWx1ZSA9IDA7XHJcbiAgICAgIGxldCBncmlkQWdlID0gMDtcclxuICAgICAgbGV0IGdyaWRWYWx1ZUFnZSA9IDA7XHJcbiAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgIGxldCBncmlkID0gdGhpcy5tYXRyaXguZ2V0KGxIZWFkZXIpO1xyXG4gICAgICBpZiAoZ3JpZCAhPSBudWxsKSB7XHJcbiAgICAgICAgY291bnQgPSBwYXJzZUludChncmlkLmdldCgnY291bnQnKSk7XHJcblxyXG5cclxuICAgICAgICBncmlkV3QgPSBwYXJzZUZsb2F0KGdyaWQuZ2V0KCd3dCcpKTtcclxuICAgICAgICBncmlkUnRlVmFsdWUgPSBwYXJzZUZsb2F0KGdyaWQuZ2V0KCdyYXAnKSk7XHJcbiAgICAgICAgZ3JpZHZhbHVlID0gcGFyc2VGbG9hdChncmlkLmdldCgndmFsdWUnKSk7XHJcbiAgICAgICAgZ3JpZEFnZSA9IHBhcnNlRmxvYXQoZ3JpZC5nZXQoJ2FnZScpKTtcclxuICAgICAgICBncmlkVmFsdWVBZ2UgPSBwYXJzZUZsb2F0KGdyaWQuZ2V0KCd2YWx1ZWFnZScpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkID0gbmV3IE1hcCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGdyaWQuc2V0KCdjb3VudCcsIGNvdW50ICsgMSk7XHJcbiAgICAgIGdyaWQuc2V0KCd3dCcsIGdyaWRXdCArIHd0KTtcclxuICAgICAgZ3JpZC5zZXQoJ3JhcCcsIGdyaWRSdGVWYWx1ZSArIGJlbmFjaG1hcmtWYWx1ZSk7XHJcbiAgICAgIGdyaWQuc2V0KCd2YWx1ZScsIGdyaWR2YWx1ZSArIHJ0ZVZhbHVlKTtcclxuICAgICAgZ3JpZC5zZXQoJ2FnZScsICgoZ3JpZEFnZSAqIGNvdW50KSArIGFnZSkgLyAoY291bnQgKyAxKSk7XHJcbiAgICAgIGdyaWQuc2V0KCd2YWx1ZWFnZScsICgoZ3JpZHZhbHVlICogZ3JpZEFnZSkgKyAoYWdlICogcnRlVmFsdWUpKSAvIChncmlkdmFsdWUgKyBydGVWYWx1ZSkpO1xyXG4gICAgICB0aGlzLm1hdHJpeC5zZXQobEhlYWRlciwgZ3JpZCk7XHJcbiAgICAgIGxldCBwa3RzID0gbmV3IFNldCgpO1xyXG4gICAgICBsZXQgc2lkZVBrdHMgPSBuZXcgU2V0KCk7XHJcbiAgICAgIGxldCBoZWFkUGt0cyA9IG5ldyBTZXQoKTtcclxuICAgICAgaWYgKHRoaXMucGt0RGF0YS5nZXQoaGVhZGVyKSAhPSBudWxsKVxyXG4gICAgICAgIHBrdHMgPSB0aGlzLnBrdERhdGEuZ2V0KGhlYWRlcik7XHJcbiAgICAgIGlmICh0aGlzLnNpZGVEYXRhLmdldChsU2lkZUtleSkgIT0gbnVsbClcclxuICAgICAgICBzaWRlUGt0cyA9IHRoaXMuc2lkZURhdGEuZ2V0KGxTaWRlS2V5KTtcclxuICAgICAgaWYgKHRoaXMuaGVhZERhdGEuZ2V0KGxIZWFkS2V5KSAhPSBudWxsKVxyXG4gICAgICAgIGhlYWRQa3RzID0gdGhpcy5oZWFkRGF0YS5nZXQobEhlYWRLZXkpO1xyXG4gICAgICBwa3RzLmFkZChlbGVtZW50KTtcclxuICAgICAgdGhpcy5wa3REYXRhLnNldChoZWFkZXIsIHBrdHMpO1xyXG4gICAgICBzaWRlUGt0cy5hZGQoZWxlbWVudCk7XHJcbiAgICAgIHRoaXMuc2lkZURhdGEuc2V0KGxTaWRlS2V5LCBzaWRlUGt0cyk7XHJcbiAgICAgIGhlYWRQa3RzLmFkZChlbGVtZW50KTtcclxuICAgICAgdGhpcy5oZWFkRGF0YS5zZXQobEhlYWRLZXksIGhlYWRQa3RzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBncnBzID0gbmV3IFNldCgpO1xyXG4gICAgbGV0IHJvd3MgPSBuZXcgU2V0KCk7XHJcbiAgICBsZXQgY29scyA9IG5ldyBTZXQoKTtcclxuICAgIGxldCBzdHQgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgdGhpcy5tYXRyaXguZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBsZXQgbEtleSA9IGtleTtcclxuICAgICAgbGV0IGNvdW50ID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ2NvdW50JykpO1xyXG5cclxuICAgICAgbGV0IHd0ID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3d0JykpO1xyXG4gICAgICBsZXQgcmFwID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3JhcCcpKTtcclxuICAgICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCd2YWx1ZScpKTtcclxuICAgICAgbGV0IGFnZSA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdhZ2UnKSk7XHJcbiAgICAgIGxldCB2YWx1ZUFnZSA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCd2YWx1ZWFnZScpKTtcclxuICAgICAgbGV0IGdycFZhbCA9IGxLZXkuc3BsaXQoJyMnKVswXTtcclxuICAgICAgbGV0IHJvd1ZhbCA9IGxLZXkuc3BsaXQoJyMnKVsxXTtcclxuICAgICAgbGV0IGNvbFZhbCA9IGxLZXkuc3BsaXQoJyMnKVsyXTtcclxuICAgICAgbGV0IHN0YXR1cyA9IGxLZXkuc3BsaXQoJyMnKVszXTtcclxuXHJcblxyXG4gICAgICBsZXQgdmFsQ29tcEFyciA9IFtdO1xyXG4gICAgICBsZXQgdmFsQ29tcE9iaiA9IHt9O1xyXG4gICAgICB2YWxDb21wT2JqW3N0YXR1c10gPSB2YWw7XHJcbiAgICAgIHZhbENvbXBBcnIucHVzaCh2YWxDb21wT2JqKTtcclxuICAgICAgY29uc29sZS5sb2coKTtcclxuXHJcblxyXG4gICAgICBsZXQgaXNTb2xkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgIGlzU29sZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoaXNTb2xkKSB7XHJcbiAgICAgICAgbGV0IGNvbXBhcmVXaXRoID0gJ21rdCc7XHJcbiAgICAgICAgbGV0IGNtcERhdGEgPSB0aGlzLm1hdHJpeC5nZXQoZ3JwVmFsICsgJyMnICsgcm93VmFsICsgJyMnICsgY29sVmFsICsgJyMnICsgY29tcGFyZVdpdGgpO1xyXG4gICAgICAgIGxldCBjbXBDb3VudCA9IDA7XHJcbiAgICAgICAgaWYgKGNtcERhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjbXBDb3VudCA9IHBhcnNlRmxvYXQoY21wRGF0YS5nZXQoJ2NvdW50JykpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1zZCA9IE1hdGgucm91bmQocGVyaW9kICogY21wQ291bnQgLyBjb3VudCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdtc2QnLCBtc2QpO1xyXG4gICAgICAgIGxldCBjbXBWYWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKGNtcERhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjbXBWYWx1ZSA9IHBhcnNlRmxvYXQoY21wRGF0YS5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbXNkdmx1ID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBWYWx1ZSAvIHZhbCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG4gICAgICAgIGxldCBjaGtjb3VudCA9IChzdG9ja2RheXMgKiBjb3VudCAvIHBlcmlvZCk7XHJcbiAgICAgICAgLy8gbGV0IG1pbmNvdW50ID0gKGNoa2NvdW50ICogbWludmFyaWF0aW9uKTtcclxuICAgICAgICAvLyBsZXQgbWF4Y291bnQgPSAoY2hrY291bnQgKiBtYXh2YXJpYXRpb24pO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIGxldCBuZXRyYXRpbyA9IChjaGtjb3VudCAqIDEwMCkgLyBjbXBDb3VudDtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNoZWNrY291bnRcIiwgcm93VmFsLCBjb2xWYWwsIGNoa2NvdW50KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm5ldHJhdGlvXCIsIHJvd1ZhbCwgY29sVmFsLCBuZXRyYXRpbyk7XHJcbiAgICAgICAgbGV0IGdyaWRjb2xvciA9ICcjZmZmZjAwJztcclxuICAgICAgICBpZiAobmV0cmF0aW8gPD0gMzApIHtcclxuICAgICAgICAgIGdyaWRjb2xvciA9IGRyZWQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+IDMwICYmIG5ldHJhdGlvIDwgNjApIHtcclxuICAgICAgICAgIGdyaWRjb2xvciA9IG1yZWQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSA2MCAmJiBuZXRyYXRpbyA8IG1pbnZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZ3JpZGNvbG9yID0gbHJlZDtcclxuICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID49IG1pbnZhcmlhdGlvbiAmJiBuZXRyYXRpbyA8IG1heHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZ3JpZGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMzgpJztcclxuICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID49IG1heHZhcmlhdGlvbiAmJiBuZXRyYXRpbyA8IDIwMCkge1xyXG4gICAgICAgICAgZ3JpZGNvbG9yID0gbGdyZWVuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gMjAwICYmIG5ldHJhdGlvIDwgMzAwKSB7XHJcbiAgICAgICAgICBncmlkY29sb3IgPSBtZ3JlZW47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGdyaWRjb2xvciA9IGRncmVlbjtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2YWx1ZS5zZXQoJ2dycGNvbG9yJywgZ3JpZGNvbG9yKTtcclxuXHJcblxyXG4gICAgICAgIGxldCBzdnBkID0gTWF0aC5yb3VuZCh2YWwgLyBwZXJpb2QpO1xyXG4gICAgICAgIHZhbHVlLnNldCgnc3ZwZCcsIHN2cGQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdGF0dXMgPT0gJ21rdCcpXHJcbiAgICAgICAgdmFsdWUuc2V0KCdncnBjb2xvcicsICcjZGRkZGRkJyk7XHJcblxyXG4gICAgICBsZXQgZGlzYyA9IDA7XHJcbiAgICAgIGlmIChyYXAgPiAxKSB7XHJcbiAgICAgICAgZGlzYyA9ICgoKHZhbCAqIDEwMCkgLyByYXApIC0gMTAwKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgYXZnID0gTWF0aC5yb3VuZCh2YWwgLyB3dCk7XHJcbiAgICAgIHZhbHVlLnNldCgnZGlzYycsIGRpc2MpO1xyXG4gICAgICB2YWx1ZS5zZXQoJ2F2ZycsIGF2Zyk7XHJcbiAgICAgIHJvd3MuYWRkKHJvd1ZhbCk7XHJcbiAgICAgIGxldCBzdHJSb3dUb3RhbEtleSA9IGdycFZhbCArICcjJyArIHJvd1ZhbCArICcjJyArIHN0YXR1cztcclxuICAgICAgbGV0IHJUb3RhbCA9IHRoaXMucm93VG90YWwuZ2V0KHN0clJvd1RvdGFsS2V5KSA9PSBudWxsID8gbmV3IE1hcCgpIDogdGhpcy5yb3dUb3RhbC5nZXQoc3RyUm93VG90YWxLZXkpO1xyXG4gICAgICBsZXQgbENvdW50ID0gclRvdGFsLmdldCgnY291bnQnKSA9PSBudWxsID8gMCA6IHJUb3RhbC5nZXQoJ2NvdW50Jyk7XHJcblxyXG5cclxuICAgICAgbGV0IGxXdCA9IHJUb3RhbC5nZXQoJ3d0JykgPT0gbnVsbCA/IDAgOiByVG90YWwuZ2V0KCd3dCcpO1xyXG4gICAgICBsZXQgbFJhcCA9IHJUb3RhbC5nZXQoJ3JhcCcpID09IG51bGwgPyAwIDogclRvdGFsLmdldCgncmFwJyk7XHJcbiAgICAgIGxldCBsVmFsID0gclRvdGFsLmdldCgndmFsdWUnKSA9PSBudWxsID8gMCA6IHJUb3RhbC5nZXQoJ3ZhbHVlJyk7XHJcbiAgICAgIGxldCBsQWdlID0gclRvdGFsLmdldCgnYWdlJykgPT0gbnVsbCA/IDAgOiByVG90YWwuZ2V0KCdhZ2UnKTtcclxuICAgICAgbGV0IGxWYWx1ZUFnZSA9IHJUb3RhbC5nZXQoJ3ZhbHVlYWdlJykgPT0gbnVsbCA/IDAgOiByVG90YWwuZ2V0KCd2YWx1ZWFnZScpO1xyXG5cclxuICAgICAgclRvdGFsLnNldCgnY291bnQnLCBsQ291bnQgKyBjb3VudCk7XHJcbiAgICAgIHJUb3RhbC5zZXQoJ3d0JywgbFd0ICsgd3QpO1xyXG4gICAgICByVG90YWwuc2V0KCdyYXAnLCBsUmFwICsgcmFwKTtcclxuICAgICAgclRvdGFsLnNldCgndmFsdWUnLCBsVmFsICsgdmFsKTtcclxuICAgICAgclRvdGFsLnNldCgnZGlzYycsICgoKChsVmFsICsgdmFsKSAqIDEwMCkgLyAobFJhcCArIHJhcCkpIC0gMTAwKSk7XHJcbiAgICAgIHJUb3RhbC5zZXQoJ2F2ZycsIChsVmFsICsgdmFsKSAvIChsV3QgKyB3dCkpO1xyXG4gICAgICByVG90YWwuc2V0KCdhZ2UnLCAoKGxBZ2UgKiBsQ291bnQpICsgYWdlKSAvIChsQ291bnQgKyAxKSk7XHJcbiAgICAgIHJUb3RhbC5zZXQoJ3ZhbHVlYWdlJywgKChsVmFsdWVBZ2UgKiBsQWdlKSArIChhZ2UgKiB2YWwpKSAvIChsVmFsdWVBZ2UgKyB2YWwpKTtcclxuXHJcbiAgICAgIHRoaXMucm93VG90YWwuc2V0KHN0clJvd1RvdGFsS2V5LCByVG90YWwpO1xyXG5cclxuICAgICAgY29scy5hZGQoY29sVmFsKTtcclxuICAgICAgbGV0IHN0ckNvbFRvdGFsS2V5ID0gZ3JwVmFsICsgJyMnICsgY29sVmFsICsgJyMnICsgc3RhdHVzO1xyXG4gICAgICBsZXQgY1RvdGFsID0gdGhpcy5jb2xUb3RhbC5nZXQoc3RyQ29sVG90YWxLZXkpID09IG51bGwgPyBuZXcgTWFwKCkgOiB0aGlzLmNvbFRvdGFsLmdldChzdHJDb2xUb3RhbEtleSk7XHJcbiAgICAgIGxldCBjQ291bnQgPSBjVG90YWwuZ2V0KCdjb3VudCcpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgnY291bnQnKTtcclxuXHJcblxyXG4gICAgICBsZXQgY1d0ID0gY1RvdGFsLmdldCgnd3QnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ3d0Jyk7XHJcbiAgICAgIGxldCBjUmFwID0gY1RvdGFsLmdldCgncmFwJykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCdyYXAnKTtcclxuICAgICAgbGV0IGNWYWwgPSBjVG90YWwuZ2V0KCd2YWx1ZScpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgndmFsdWUnKTtcclxuICAgICAgbGV0IGNBZ2UgPSBjVG90YWwuZ2V0KCdhZ2UnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ2FnZScpO1xyXG4gICAgICBsZXQgY1ZhbHVlQWdlID0gY1RvdGFsLmdldCgndmFsdWVhZ2UnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ3ZhbHVlYWdlJyk7XHJcblxyXG4gICAgICBjVG90YWwuc2V0KCdjb3VudCcsIGNDb3VudCArIGNvdW50KTtcclxuICAgICAgY1RvdGFsLnNldCgnd3QnLCBjV3QgKyB3dCk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ3JhcCcsIGNSYXAgKyByYXApO1xyXG4gICAgICBjVG90YWwuc2V0KCd2YWx1ZScsIGNWYWwgKyB2YWwpO1xyXG4gICAgICBjVG90YWwuc2V0KCdkaXNjJywgKCgoKGNWYWwgKyB2YWwpICogMTAwKSAvIChjUmFwICsgcmFwKSkgLSAxMDApKTtcclxuICAgICAgY1RvdGFsLnNldCgnYXZnJywgKGNWYWwgKyB2YWwpIC8gKGNXdCArIHd0KSk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ2FnZScsICgoY0FnZSAqIGNDb3VudCkgKyBhZ2UpIC8gKGNDb3VudCArIDEpKTtcclxuICAgICAgY1RvdGFsLnNldCgndmFsdWVhZ2UnLCAoKGNWYWx1ZUFnZSAqIGNBZ2UpICsgKGFnZSAqIHZhbCkpIC8gKGNWYWx1ZUFnZSArIHZhbCkpO1xyXG5cclxuICAgICAgdGhpcy5jb2xUb3RhbC5zZXQoc3RyQ29sVG90YWxLZXksIGNUb3RhbCk7XHJcblxyXG4gICAgICBpZiAoIXN0dC5oYXMoc3RhdHVzKSlcclxuICAgICAgICBzdHQuYWRkKHN0YXR1cyk7XHJcbiAgICAgIGlmICghZ3Jwcy5oYXMoZ3JwVmFsKSlcclxuICAgICAgICBncnBzLmFkZChncnBWYWwpO1xyXG5cclxuICAgIH0pXHJcbiAgICBsZXQgc29ydGVkUm93cyA9IEFycmF5LmZyb20ocm93cykuc29ydCgpO1xyXG4gICAgbGV0IHNvcnRlZENvbHMgPSBBcnJheS5mcm9tKGNvbHMpLnNvcnQoKTtcclxuICAgIGxldCBzb3J0ZWRTdHQgPSBBcnJheS5mcm9tKHN0dCkuc29ydCgpO1xyXG4gICAgdGhpcy5zb3J0ZWRHcnAgPSBBcnJheS5mcm9tKGdycHMpOy8vLnNvcnQoKTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhzb3J0ZWRSb3dzKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHNvcnRlZENvbHMpO1xyXG4gICAgLy8gY29uc29sZS5sb2coc29ydGVkU3R0KTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc29ydGVkR3JwKTtcclxuXHJcbiAgICAvLyBsZXQga2V5VmFsT2JqID0ge307XHJcbiAgICAvLyBsZXQgZ2FyciA9IFtdO1xyXG4gICAgLy8vL2ZvciBncmlkIGRhdGFcclxuICAgIHNvcnRlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICBzb3J0ZWRDb2xzLmZvckVhY2goY29scyA9PiB7XHJcbiAgICAgICAgdGhpcy5zb3J0ZWRHcnAuZm9yRWFjaChncnAgPT4ge1xyXG4gICAgICAgICAgbGV0IGN1cnJBdmdWYWwgPSAwO1xyXG4gICAgICAgICAgbGV0IHByZXZBdmdWYWwgPSAwO1xyXG4gICAgICAgICAgbGV0IGN1cnJDb3VudFZhbCA9IDA7XHJcbiAgICAgICAgICBsZXQgcHJldkNvdW50VmFsID0gMDtcclxuICAgICAgICAgIGxldCBwQVZHQ09MT1IgPSAnJztcclxuICAgICAgICAgIGxldCBwQ09VTlRDT0xPUiA9ICcnO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRTdHQubGVuZ3RoIHx8IDA7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgZ2JsR3JpZFN1Yk1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgIGdibEdyaWRTdWJNYXAuc2V0KCdBVkdDT0xPUicsIFwiI2RkZGRkZFwiKTtcclxuICAgICAgICAgICAgICBnYmxHcmlkU3ViTWFwLnNldCgnQ09VTlRDT0xPUicsIFwiI2RkZGRkZFwiKTtcclxuICAgICAgICAgICAgICB0aGlzLmdibEdyZERhdGFDb2xvci5zZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSwgZ2JsR3JpZFN1Yk1hcCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1hdHJpeC5oYXMoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSkpIHtcclxuICAgICAgICAgICAgICAgIHByZXZBdmdWYWwgPSB0aGlzLm1hdHJpeC5nZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSkuZ2V0KCdhdmcnKSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgcHJldkNvdW50VmFsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0pLmdldCgnY291bnQnKSB8fCAwO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5tYXRyaXguaGFzKGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyQXZnVmFsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0pLmdldCgnYXZnJykgfHwgMDtcclxuICAgICAgICAgICAgICAgIGN1cnJDb3VudFZhbCA9IHRoaXMubWF0cml4LmdldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBjb2xzICsgJyMnICsgc29ydGVkU3R0W2ldKS5nZXQoJ2NvdW50JykgfHwgMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyQ291bnRWYWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgY3VyckF2Z1ZhbCA9IDA7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoY3VyckNvdW50VmFsID4gMCAmJiBwcmV2Q291bnRWYWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgQVZHQ09MT1IgPSAnI2ZmMDAwMDQ3JztcclxuICAgICAgICAgICAgICAgIGxldCBDT1VOVENPTE9SID0gJyNmZjAwMDA0Nyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VyckF2Z1ZhbCA9PSBwcmV2QXZnVmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgIEFWR0NPTE9SID0gcEFWR0NPTE9SO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyQXZnVmFsID4gcHJldkF2Z1ZhbCkge1xyXG4gICAgICAgICAgICAgICAgICBBVkdDT0xPUiA9ICcjMDA4MDAwNTQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJDb3VudFZhbCA9PSBwcmV2Q291bnRWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgQ09VTlRDT0xPUiA9IHBDT1VOVENPTE9SO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyQ291bnRWYWwgPiBwcmV2Q291bnRWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgQ09VTlRDT0xPUiA9ICcjMDA4MDAwNTQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcENPVU5UQ09MT1IgPSBDT1VOVENPTE9SO1xyXG4gICAgICAgICAgICAgICAgcEFWR0NPTE9SID0gQVZHQ09MT1I7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2JsR3JpZFN1Yk1hcC5zZXQoJ0FWR0NPTE9SJywgQVZHQ09MT1IpO1xyXG4gICAgICAgICAgICAgICAgZ2JsR3JpZFN1Yk1hcC5zZXQoJ0NPVU5UQ09MT1InLCBDT1VOVENPTE9SKTsvLyMwMDgwMDA1ND09Z3JlZW4gIC8vZmYwMDAwNDcgPT0gcmVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdibEdyZERhdGFDb2xvci5zZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSwgZ2JsR3JpZFN1Yk1hcCk7XHJcbiAgICAgICAgICAgICAgICBwcmV2Q291bnRWYWwgPSBjdXJyQ291bnRWYWw7XHJcbiAgICAgICAgICAgICAgICBwcmV2QXZnVmFsID0gY3VyckF2Z1ZhbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnYmxHcmlkU3ViTWFwLnNldCgnQVZHQ09MT1InLCAnd2hpdGUnKTtcclxuICAgICAgICAgICAgICAgIGdibEdyaWRTdWJNYXAuc2V0KCdDT1VOVENPTE9SJywgJ3doaXRlJyk7Ly8jMDA4MDAwNTQ9PWdyZWVuICAvL2ZmMDAwMDQ3ID09IHJlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nYmxHcmREYXRhQ29sb3Iuc2V0KGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0sIGdibEdyaWRTdWJNYXApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJDb3VudFZhbCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgcHJldkNvdW50VmFsID0gY3VyckNvdW50VmFsO1xyXG4gICAgICAgICAgICAgICAgICBwcmV2QXZnVmFsID0gY3VyckF2Z1ZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuZ2JsR3JwQXJyID0gey4uLmdhcnJ9O1xyXG4gICAgY29uc29sZS5sb2codGhpcy5nYmxHcmREYXRhQ29sb3IpO1xyXG5cclxuICAgIHRoaXMuYXJydER0bFt0aGlzLnNpZGV2YWxbMF0gKyAnI3AnXS5tYXAoZWxlMSA9PiB7XHJcbiAgICAgIHNvcnRlZFJvd3MuZm9yRWFjaChlbGUyID0+IHtcclxuICAgICAgICBpZiAoZWxlMSA9PSBlbGUyKSB7XHJcbiAgICAgICAgICB0aGlzLnNpZGUucHVzaChlbGUxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXJydER0bFt0aGlzLmhlYWR2YWxbMF0gKyAnI3AnXS5tYXAoZWxlMSA9PiB7XHJcbiAgICAgIHNvcnRlZENvbHMuZm9yRWFjaChlbGUyID0+IHtcclxuICAgICAgICBpZiAoZWxlMSA9PSBlbGUyKSB7XHJcbiAgICAgICAgICB0aGlzLmhlYWQucHVzaChlbGUxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwibWFyaXhcIiwgdGhpcy5tYXRyaXgpO1xyXG4gICAgdGhpcy5zdHQgPSBbLi4uc29ydGVkU3R0XTtcclxuICAgIHRoaXMucm93VG90YWwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBsZXQgbEtleSA9IGtleTtcclxuICAgICAgbGV0IGNvdW50ID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ2NvdW50JykpO1xyXG4gICAgICBsZXQgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICBsZXQgZ3JwVmFsID0gbEtleS5zcGxpdCgnIycpWzBdO1xyXG4gICAgICBsZXQgcm93VmFsID0gbEtleS5zcGxpdCgnIycpWzFdO1xyXG4gICAgICBsZXQgc3RhdHVzID0gbEtleS5zcGxpdCgnIycpWzJdO1xyXG4gICAgICBsZXQgd3QgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnd3QnKSk7XHJcbiAgICAgIGxldCByYXAgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgncmFwJykpO1xyXG4gICAgICBsZXQgc3ZwZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdzdnBkJykpID09IHVuZGVmaW5lZCA/IDAgOiBwYXJzZUZsb2F0KHZhbHVlLmdldCgnc3ZwZCcpKTtcclxuICAgICAgbGV0IG1zZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSkgPT0gdW5kZWZpbmVkID8gMCA6IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSk7XHJcbiAgICAgIGxldCBhZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnYWdlJykpO1xyXG4gICAgICBsZXQgdmFsdWVBZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgndmFsdWVhZ2UnKSk7XHJcblxyXG4gICAgICBsZXQgZ3RLZXkgPSBcIkdUI1wiICsgZ3JwVmFsICsgXCIjXCIgKyBzdGF0dXM7XHJcbiAgICAgIGxldCBjVG90YWwgPSB0aGlzLmdyYW5kVG90YWwuZ2V0KGd0S2V5KSA9PSBudWxsID8gbmV3IE1hcCgpIDogdGhpcy5ncmFuZFRvdGFsLmdldChndEtleSk7XHJcbiAgICAgIGxldCBjQ291bnQgPSBjVG90YWwuZ2V0KCdjb3VudCcpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgnY291bnQnKTtcclxuICAgICAgbGV0IGNXdCA9IGNUb3RhbC5nZXQoJ3d0JykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCd3dCcpO1xyXG4gICAgICBsZXQgY1JhcCA9IGNUb3RhbC5nZXQoJ3JhcCcpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgncmFwJyk7XHJcbiAgICAgIGxldCBjVmFsID0gY1RvdGFsLmdldCgndmFsdWUnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ3ZhbHVlJyk7XHJcbiAgICAgIGxldCBjQWdlID0gY1RvdGFsLmdldCgnYWdlJykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCdhZ2UnKTtcclxuICAgICAgbGV0IGNWYWx1ZUFnZSA9IGNUb3RhbC5nZXQoJ3ZhbHVlYWdlJykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCd2YWx1ZWFnZScpO1xyXG5cclxuICAgICAgY1RvdGFsLnNldCgnY291bnQnLCBjQ291bnQgKyBjb3VudCk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ3d0JywgY1d0ICsgd3QpO1xyXG4gICAgICBjVG90YWwuc2V0KCdyYXAnLCBjUmFwICsgcmFwKTtcclxuICAgICAgY1RvdGFsLnNldCgndmFsdWUnLCBjVmFsICsgdmFsKTtcclxuICAgICAgY1RvdGFsLnNldCgnZGlzYycsICgoKChjVmFsICsgdmFsKSAqIDEwMCkgLyAoY1JhcCArIHJhcCkpIC0gMTAwKSk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ2F2ZycsIChjVmFsICsgdmFsKSAvIChjV3QgKyB3dCkpO1xyXG4gICAgICBjVG90YWwuc2V0KCdhZ2UnLCAoKGNBZ2UgKiBjQ291bnQpICsgYWdlKSAvIChjQ291bnQgKyAxKSk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ3ZhbHVlYWdlJywgKChjVmFsdWVBZ2UgKiBjVmFsKSArICh2YWx1ZUFnZSAqIHZhbCkpIC8gKGNWYWwgKyB2YWwpKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JhbmRUb3RhbC5zZXQoZ3RLZXksIGNUb3RhbCk7XHJcblxyXG4gICAgICBsZXQgaXNTb2xkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgIGlzU29sZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoaXNTb2xkKSB7XHJcbiAgICAgICAgbGV0IGNtcERhdGEgPSB0aGlzLnJvd1RvdGFsLmdldChncnBWYWwgKyAnIycgKyByb3dWYWwgKyAnI21rdCcpO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIGlmIChjbXBEYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGNtcENvdW50ID0gcGFyc2VGbG9hdChjbXBEYXRhLmdldCgnY291bnQnKSk7XHJcbiAgICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBDb3VudCAvIGNvdW50KTtcclxuICAgICAgICAgIHZhbHVlLnNldCgnbXNkJywgbXNkKTtcclxuICAgICAgICAgIGxldCBjbXB2YWwgPSBwYXJzZUZsb2F0KGNtcERhdGEuZ2V0KCd2YWx1ZScpKTtcclxuICAgICAgICAgIGxldCBtc2R2bHUgPSBNYXRoLnJvdW5kKHBlcmlvZCAqIGNtcHZhbCAvIHZhbCk7XHJcbiAgICAgICAgICB2YWx1ZS5zZXQoJ21zZHZsdScsIG1zZHZsdSk7XHJcblxyXG4gICAgICAgICAgbGV0IGNoa2NvdW50ID0gKHN0b2NrZGF5cyAqIGNvdW50IC8gcGVyaW9kKTtcclxuICAgICAgICAgIGxldCBuZXRyYXRpbyA9IChjaGtjb3VudCAqIDEwMCkgLyBjbXBDb3VudDtcclxuXHJcbiAgICAgICAgICBsZXQgZ3JpZGNvbG9yID0gJyNmZmZmMDAnO1xyXG4gICAgICAgICAgaWYgKG5ldHJhdGlvIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRyZWQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID4gMzAgJiYgbmV0cmF0aW8gPCA2MCkge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBtcmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSA2MCAmJiBuZXRyYXRpbyA8IG1pbnZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBscmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSBtaW52YXJpYXRpb24gJiYgbmV0cmF0aW8gPCBtYXh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgZ3JpZGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMzgpJztcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gbWF4dmFyaWF0aW9uICYmIG5ldHJhdGlvIDwgMjAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGxncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gMjAwICYmIG5ldHJhdGlvIDwgMzAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IG1ncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRncmVlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbHVlLnNldCgnZ3JwY29sb3InLCBncmlkY29sb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN2cGQgPSBNYXRoLnJvdW5kKHZhbCAvIHBlcmlvZCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN0YXR1cyA9PSAnbWt0JylcclxuICAgICAgICB2YWx1ZS5zZXQoJ2dycGNvbG9yJywgJyNkZGRkZGQnKTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLy8vL2ZvciByb3d3aXNlIHRvdGFsXHJcbiAgICAvLyBzb3J0ZWRSb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgIC8vICAgdGhpcy5zb3J0ZWRHcnAuZm9yRWFjaChncnAgPT4ge1xyXG4gICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkU3R0Lmxlbmd0aCB8fCAwOyBpKyspIHtcclxuICAgIC8vICAgICAgIGRlYnVnZ2VyXHJcbiAgICAvLyAgICAgICBsZXQgY3VyclZhbDtcclxuICAgIC8vICAgICAgIGxldCBwcmV2VmFsO1xyXG4gICAgLy8gICAgICAgbGV0IGN1cnJDb3VudDtcclxuICAgIC8vICAgICAgIGxldCBwcmV2Q291bnQ7XHJcbiAgICAvLyAgICAgICBpZiAoaSA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZ2JsUm93VG90Q29sb3JWYWxXaXNlLnNldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBzb3J0ZWRTdHRbaV0sIFwiI2RkZGRkZFwiKTtcclxuXHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2codGhpcy5tYXRyaXgpO1xyXG4gICAgLy8gICAgICAgICBpZiAodGhpcy5yb3dUb3RhbC5oYXMoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2ldKSkge1xyXG4gICAgLy8gICAgICAgICAgIGN1cnJWYWwgPSB0aGlzLnJvd1RvdGFsLmdldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBzb3J0ZWRTdHRbaV0pLmdldCgndmFsdWUnKSB8fCAwO1xyXG4gICAgLy8gICAgICAgICAgIGN1cnJDb3VudCA9IHRoaXMucm93VG90YWwuZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIHNvcnRlZFN0dFtpXSkuZ2V0KCdjb3VudCcpIHx8IDA7XHJcblxyXG5cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBpZiAodGhpcy5yb3dUb3RhbC5oYXMoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2kgLSAxXSkpIHtcclxuICAgIC8vICAgICAgICAgICBwcmV2VmFsID0gdGhpcy5yb3dUb3RhbC5nZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2kgLSAxXSkuZ2V0KCd2YWx1ZScpIHx8IDA7Ly9wYXNzIGR5bmFtaWMgdmFsdWUgYXMgcGVyIHVzZXIgc2VsZWN0IGluIGRkbFxyXG4gICAgLy8gICAgICAgICAgIHByZXZDb3VudCA9IHRoaXMucm93VG90YWwuZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIHNvcnRlZFN0dFtpIC0gMV0pLmdldCgnY291bnQnKSB8fCAwO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZ2JsUm93VG90Q29sb3JWYWxXaXNlLnNldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBzb3J0ZWRTdHRbaV0sICgoY3VyclZhbCA9PSAwIHx8IGN1cnJWYWwgPT0gbnVsbCB8fCBjdXJyVmFsID09IHVuZGVmaW5lZCB8fCBwcmV2VmFsID09IDAgfHwgcHJldlZhbCA9PSBudWxsIHx8IHByZXZWYWwgPT0gdW5kZWZpbmVkKSA/ICcnIDogKGN1cnJWYWwgPiAwICYmIGN1cnJWYWwgPiBwcmV2VmFsKSA/ICdncmVlbicgOiAncmVkJykpO1xyXG4gICAgLy8gICAgICAgICAvLyB0aGlzLmdibFJvd1RvdENvbG9yVmFsV2lzZS5zZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2ldLCAoKGN1cnJDb3VudCA9PSAwIHx8IGN1cnJDb3VudCA9PSBudWxsIHx8IGN1cnJDb3VudCA9PSB1bmRlZmluZWQgfHwgcHJldkNvdW50ID09IDAgfHwgcHJldkNvdW50ID09IG51bGwgfHwgcHJldkNvdW50ID09IHVuZGVmaW5lZCkgPyAnJyA6IChjdXJyQ291bnQgPiAwICYmIGN1cnJDb3VudCA+IHByZXZDb3VudCkgPyAnZ3JlZW4nIDogJ3JlZCcpKTtcclxuXHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0pO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ2JsUm93VG90Q29sb3JWYWxXaXNlKTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyB0aGlzLmNvbFRvdGFsLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgIC8vICAgbGV0IGxLZXkgPSBrZXk7XHJcbiAgICAvLyAgIGxldCBjb3VudCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdjb3VudCcpKTtcclxuICAgIC8vICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCd2YWx1ZScpKTtcclxuICAgIC8vICAgbGV0IGdycFZhbCA9IGxLZXkuc3BsaXQoJyMnKVswXTtcclxuICAgIC8vICAgbGV0IGNvbFZhbCA9IGxLZXkuc3BsaXQoJyMnKVsxXTtcclxuICAgIC8vICAgbGV0IHN0YXR1cyA9IGxLZXkuc3BsaXQoJyMnKVsyXTtcclxuICAgIC8vICAgbGV0IGlzU29sZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vICAgaWYgKHRoaXMuYW5hR3JwU3R0LmluZGV4T2Yoc3RhdHVzKSA9PSAtMSlcclxuICAgIC8vICAgICBpc1NvbGQgPSB0cnVlO1xyXG5cclxuICAgIC8vICAgaWYgKGlzU29sZCkge1xyXG4gICAgLy8gICAgIGxldCBjbXBEYXRhID0gdGhpcy5jb2xUb3RhbC5nZXQoZ3JwVmFsICsgJyMnICsgY29sVmFsICsgJyNta3QnKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGNtcERhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyAgICAgICBsZXQgY21wQ291bnQgPSBwYXJzZUZsb2F0KGNtcERhdGEuZ2V0KCdjb3VudCcpKTtcclxuICAgIC8vICAgICAgIGxldCBtc2QgPSBNYXRoLnJvdW5kKHBlcmlvZCAqIGNtcENvdW50IC8gY291bnQpO1xyXG4gICAgLy8gICAgICAgdmFsdWUuc2V0KCdtc2QnLCBtc2QpO1xyXG4gICAgLy8gICAgICAgbGV0IGNoa2NvdW50ID0gKHN0b2NrZGF5cyAqIGNvdW50IC8gcGVyaW9kKTtcclxuICAgIC8vICAgICAgIGxldCBtaW5jb3VudCA9IChjaGtjb3VudCAqIG1pbnZhcmlhdGlvbik7XHJcbiAgICAvLyAgICAgICBsZXQgbWF4Y291bnQgPSAoY2hrY291bnQgKiBtYXh2YXJpYXRpb24pO1xyXG4gICAgLy8gICAgICAgbGV0IGdyaWRjb2xvciA9ICcjMDA4MDAwNTQnO1xyXG4gICAgLy8gICAgICAgaWYgKGNtcENvdW50ID4gbWF4Y291bnQpIHtcclxuICAgIC8vICAgICAgICAgZ3JpZGNvbG9yID0gJyNmZjAwMDA0Nyc7XHJcbiAgICAvLyAgICAgICB9IGVsc2UgaWYgKGNtcENvdW50ID49IG1pbmNvdW50ICYmIGNtcENvdW50IDw9IG1heGNvdW50KSB7XHJcbiAgICAvLyAgICAgICAgIGdyaWRjb2xvciA9ICcjZmZmZjAwNjEnO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgdmFsdWUuc2V0KCdncnBjb2xvcicsIGdyaWRjb2xvcik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGxldCBzdnBkID0gTWF0aC5yb3VuZCh2YWwgLyBwZXJpb2QpO1xyXG4gICAgLy8gICAgIHZhbHVlLnNldCgnc3ZwZCcsIHN2cGQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGlmIChzdGF0dXMgPT0gJ21rdCcpXHJcbiAgICAvLyAgICAgdmFsdWUuc2V0KCdncnBjb2xvcicsICcjZGRkZGRkJyk7XHJcblxyXG4gICAgLy8gfSk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICB0aGlzLmNvbFRvdGFsLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgbGV0IGxLZXkgPSBrZXk7XHJcbiAgICAgIGxldCBjb3VudCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdjb3VudCcpKTtcclxuICAgICAgaWYgKHRoaXMuZm9ybW5hbWUgPT0gJ21peEFuYWx5c2lzUmVwb3J0Rm9ybScpXHJcbiAgICAgICAgY291bnQgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnd3QnKSk7XHJcblxyXG4gICAgICBsZXQgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICBsZXQgZ3JwVmFsID0gbEtleS5zcGxpdCgnIycpWzBdO1xyXG4gICAgICBsZXQgcm93VmFsID0gbEtleS5zcGxpdCgnIycpWzFdO1xyXG4gICAgICBsZXQgc3RhdHVzID0gbEtleS5zcGxpdCgnIycpWzJdO1xyXG4gICAgICBsZXQgd3QgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnd3QnKSk7XHJcbiAgICAgIGxldCByYXAgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgncmFwJykpO1xyXG4gICAgICBsZXQgc3ZwZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdzdnBkJykpID09IHVuZGVmaW5lZCA/IDAgOiBwYXJzZUZsb2F0KHZhbHVlLmdldCgnc3ZwZCcpKTtcclxuICAgICAgbGV0IG1zZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSkgPT0gdW5kZWZpbmVkID8gMCA6IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSk7XHJcbiAgICAgIGxldCBhZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnYWdlJykpO1xyXG4gICAgICBsZXQgdmFsdWVBZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgndmFsdWVhZ2UnKSk7XHJcblxyXG4gICAgICBsZXQgaXNTb2xkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgIGlzU29sZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoaXNTb2xkKSB7XHJcbiAgICAgICAgbGV0IGNtcERhdGEgPSB0aGlzLmNvbFRvdGFsLmdldChncnBWYWwgKyAnIycgKyByb3dWYWwgKyAnI21rdCcpO1xyXG4gICAgICAgIGlmIChjbXBEYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGNtcENvdW50ID0gcGFyc2VGbG9hdChjbXBEYXRhLmdldCgnY291bnQnKSk7XHJcbiAgICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBDb3VudCAvIGNvdW50KTtcclxuICAgICAgICAgIHZhbHVlLnNldCgnbXNkJywgbXNkKTtcclxuXHJcbiAgICAgICAgICBsZXQgY21wdmFsID0gcGFyc2VGbG9hdChjbXBEYXRhLmdldCgndmFsdWUnKSk7XHJcbiAgICAgICAgICBsZXQgbXNkdmx1ID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXB2YWwgLyB2YWwpO1xyXG4gICAgICAgICAgdmFsdWUuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG4gICAgICAgICAgbGV0IGNoa2NvdW50ID0gKHN0b2NrZGF5cyAqIGNvdW50IC8gcGVyaW9kKTtcclxuICAgICAgICAgIGxldCBuZXRyYXRpbyA9IChjaGtjb3VudCAqIDEwMCkgLyBjbXBDb3VudDtcclxuXHJcbiAgICAgICAgICBsZXQgZ3JpZGNvbG9yID0gJyNmZmZmMDAnO1xyXG4gICAgICAgICAgaWYgKG5ldHJhdGlvIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRyZWQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID4gMzAgJiYgbmV0cmF0aW8gPCA2MCkge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBtcmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSA2MCAmJiBuZXRyYXRpbyA8IG1pbnZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBscmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSBtaW52YXJpYXRpb24gJiYgbmV0cmF0aW8gPCBtYXh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgZ3JpZGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMzgpJztcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gbWF4dmFyaWF0aW9uICYmIG5ldHJhdGlvIDwgMjAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGxncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gMjAwICYmIG5ldHJhdGlvIDwgMzAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IG1ncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRncmVlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbHVlLnNldCgnZ3JwY29sb3InLCBncmlkY29sb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN2cGQgPSBNYXRoLnJvdW5kKHZhbCAvIHBlcmlvZCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN0YXR1cyA9PSAnbWt0JylcclxuICAgICAgICB2YWx1ZS5zZXQoJ2dycGNvbG9yJywgJyNkZGRkZGQnKTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyBHcmFuZCBTdW1tYXJpZXNcclxuXHJcbiAgICB0aGlzLnNvcnRlZEdycC5tYXAoZWxlID0+IHtcclxuICAgICAgbGV0IG1rdEtleSA9IFwiR1QjXCIgKyBlbGUgKyBcIiNta3RcIjtcclxuICAgICAgLy9sZXQgc29sZEtleSA9IFwiR1QjXCIgKyBlbGUgKyBcIiNzb2xkXCI7XHJcblxyXG4gICAgICBsZXQgc29sZEtleSA9IFwiXCI7XHJcbiAgICAgIGxldCBta3QgPSB0aGlzLmdyYW5kVG90YWwuZ2V0KG1rdEtleSkgPT0gbnVsbCA/IG5ldyBNYXAoKSA6IHRoaXMuZ3JhbmRUb3RhbC5nZXQobWt0S2V5KTtcclxuICAgICAgbGV0IG1rdENvdW50ID0gbWt0LmdldCgnY291bnQnKSA9PSBudWxsID8gMCA6IG1rdC5nZXQoJ2NvdW50Jyk7XHJcbiAgICAgIGxldCBta3RWYWxlID0gcGFyc2VGbG9hdChta3QuZ2V0KCd2YWx1ZScpID09IG51bGwgPyAwIDogbWt0LmdldCgndmFsdWUnKSk7XHJcblxyXG5cclxuICAgICAgdGhpcy5zdHQuZm9yRWFjaChzdCA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXR1cyA9IHN0O1xyXG5cclxuICAgICAgICBzb2xkS2V5ID0gXCJHVCNcIiArIGVsZSArICcjJyArIHN0O1xyXG4gICAgICAgIGxldCBzb2xkID0gdGhpcy5ncmFuZFRvdGFsLmdldChzb2xkS2V5KSA9PSBudWxsID8gbmV3IE1hcCgpIDogdGhpcy5ncmFuZFRvdGFsLmdldChzb2xkS2V5KTtcclxuICAgICAgICBsZXQgc29sZENvdW50ID0gc29sZC5nZXQoJ2NvdW50JykgPT0gbnVsbCA/IDAgOiBzb2xkLmdldCgnY291bnQnKTtcclxuICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChkaWZmZGF5ICogbWt0Q291bnQgLyBzb2xkQ291bnQpO1xyXG4gICAgICAgIGxldCBzb2xkdmFsdWUgPSBwYXJzZUZsb2F0KHNvbGQuZ2V0KCd2YWx1ZScpID09IG51bGwgPyAwIDogc29sZC5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICAgIC8vbGV0IHN2cGQgPSBNYXRoLnJvdW5kKHNvbGR2YWx1ZSAvIGRpZmZkYXkpO1xyXG4gICAgICAgIHNvbGQuc2V0KCdtc2QnLCBtc2QpO1xyXG4gICAgICAgIC8vIHNvbGQuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgICAgLy90aGlzLmdyYW5kVG90YWwuc2V0KG1rdEtleSwgbWt0KTtcclxuXHJcbiAgICAgICAgbGV0IG1zZHZsdSA9IE1hdGgucm91bmQoZGlmZmRheSAqIG1rdFZhbGUgLyBzb2xkdmFsdWUpO1xyXG4gICAgICAgIHNvbGQuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG5cclxuXHJcbiAgICAgICAgbGV0IGlzU29sZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgICAgaXNTb2xkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzU29sZCkge1xyXG4gICAgICAgICAgbGV0IGNtcENvdW50ID0gbWt0Q291bnQ7XHJcbiAgICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBDb3VudCAvIHNvbGRDb3VudCk7XHJcbiAgICAgICAgICBzb2xkLnNldCgnbXNkJywgbXNkKTtcclxuXHJcbiAgICAgICAgICBsZXQgbXNkdmx1ID0gTWF0aC5yb3VuZChwZXJpb2QgKiBta3RWYWxlIC8gc29sZHZhbHVlKTtcclxuICAgICAgICAgIHNvbGQuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG5cclxuXHJcbiAgICAgICAgICBsZXQgY2hrY291bnQgPSAoc3RvY2tkYXlzICogc29sZENvdW50IC8gcGVyaW9kKTtcclxuICAgICAgICAgIGxldCBtaW5jb3VudCA9IChjaGtjb3VudCAqIG1pbnZhcmlhdGlvbik7XHJcbiAgICAgICAgICBsZXQgbWF4Y291bnQgPSAoY2hrY291bnQgKiBtYXh2YXJpYXRpb24pO1xyXG4gICAgICAgICAgbGV0IGdyaWRjb2xvciA9ICcjMDA4MDAwNTQnO1xyXG4gICAgICAgICAgaWYgKGNtcENvdW50ID4gbWF4Y291bnQpIHtcclxuICAgICAgICAgICAgZ3JpZGNvbG9yID0gJyNmZjAwMDA0Nyc7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNtcENvdW50ID49IG1pbmNvdW50ICYmIGNtcENvdW50IDw9IG1heGNvdW50KSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9ICcjZmZmZjAwNjEnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc29sZC5zZXQoJ2dycGNvbG9yJywgZ3JpZGNvbG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdnBkID0gTWF0aC5yb3VuZChzb2xkdmFsdWUgLyBwZXJpb2QpO1xyXG4gICAgICAgIHNvbGQuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgICAgLy8gIH1cclxuICAgICAgICBpZiAoc3RhdHVzID09ICdta3QnKVxyXG4gICAgICAgICAgc29sZC5zZXQoJ2dycGNvbG9yJywgJyNkZGRkZGQnKTtcclxuICAgICAgICB0aGlzLmdyYW5kVG90YWwuc2V0KHNvbGRLZXksIHNvbGQpO1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIG1vZGlmeVNlYXJjaCgpIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdCSWNhbGwnLCAnQkltb2RpZnknKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLm1vZHVsZW5hbWUgKyAnL2FuYWx5c2lzLXNlYXJjaC8nICsgdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddXSk7XHJcbiAgfVxyXG4gIGtleTtcclxuICBpc0FwcGxpZWQgPSBmYWxzZTtcclxuICBPbkNoYW5nZUJ5KFZhbFR5cGUpIHtcclxuICAgIHRoaXMuaXNBcHBsaWVkID0gdHJ1ZTtcclxuICAgIHRoaXMua2V5ID0gVmFsVHlwZTtcclxuICB9XHJcblxyXG4gIGdldERhdGEoY2FsbCwga2V5LCBzdCkge1xyXG4gICAgbGV0IHBrdGRhdGEgPSBbXTtcclxuICAgIGxldCB0ZW1wYXJyID0gW107XHJcbiAgICBpZiAoY2FsbCA9PSAnY2VsbCcpIHtcclxuXHJcbiAgICAgIHBrdGRhdGEgPSBwa3RkYXRhLmNvbmNhdChbXSwgQXJyYXkuZnJvbSh0aGlzLnBrdERhdGEuZ2V0KGtleSkpKTtcclxuXHJcblxyXG5cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNhbGwgPT0gJ3JvdycpIHtcclxuICAgICAgdGhpcy5oZWFkLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMucGt0RGF0YS5nZXQoa2V5ICsgJyMnICsgZWxlbWVudCkgIT0gbnVsbCAmJiB0aGlzLnBrdERhdGEuZ2V0KGtleSArICcjJyArIGVsZW1lbnQpICE9IFwiXCIgJiYgdGhpcy5wa3REYXRhLmdldChrZXkgKyAnIycgKyBlbGVtZW50KSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHBrdGRhdGEgPSBwa3RkYXRhLmNvbmNhdChbXSwgQXJyYXkuZnJvbSh0aGlzLnBrdERhdGEuZ2V0KGtleSArICcjJyArIGVsZW1lbnQpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY2FsbCA9PSAnY29sJykge1xyXG4gICAgICB0aGlzLnNpZGUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBsZXQgayA9IGtleS5zcGxpdCgnIycpO1xyXG4gICAgICAgIGxldCBrYyA9IGtbMF0gKyAnIycgKyBlbGVtZW50ICsgJyMnICsga1sxXTtcclxuICAgICAgICBpZiAodGhpcy5wa3REYXRhLmdldChrYykgIT0gbnVsbCAmJiB0aGlzLnBrdERhdGEuZ2V0KGtjKSAhPSBcIlwiICYmIHRoaXMucGt0RGF0YS5nZXQoa2MpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcGt0ZGF0YSA9IHBrdGRhdGEuY29uY2F0KFtdLCBBcnJheS5mcm9tKHRoaXMucGt0RGF0YS5nZXQoa2MpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBlbHNlIGlmIChjYWxsID09ICdhbGwnKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwa3REYXRhJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zY2hEdGwpKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Jlc3VsdFZpZXcnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdC5yZXN1bHRWaWV3KSk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZXN1bHRWaWV3RHRsJywgSlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQucmVzdWx0Vmlld0R0bCkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHBrdGRhdGEgPSBwa3RkYXRhLmZpbHRlcihlID0+IGUuZ3JwX3N0dCA9PSBzdCk7XHJcblxyXG5cclxuXHJcblxyXG4gICAgbGV0IHBkID0gXy5zb3J0QnkocGt0ZGF0YSwgWydjbycsICdwdSddKS5yZXZlcnNlKCk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGt0RGF0YScsIEpTT04uc3RyaW5naWZ5KHBrdGRhdGEpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZXN1bHRWaWV3JywgSlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQucmVzdWx0VmlldykpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Jlc3VsdFZpZXdEdGwnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdC5yZXN1bHRWaWV3RHRsKSk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2JpL3BrdC1saXN0J10pO1xyXG4gIH1cclxuICAvLyBcIkN1c2hpb24gTW9kLDAuNTAsI0hcIlxyXG4gIGdldEFsbChzdHQsIGhlYWQsIHNpZGUsIGdycCkge1xyXG4gICAgbGV0IGtleSA9ICcnO1xyXG4gICAgbGV0IHBrdGRhdGEgPSBbXTtcclxuICAgIC8vIGhlYWQuZm9yRWFjaChoZCA9PiB7XHJcbiAgICAvLyAgIHN0dC5mb3JFYWNoKHN0ID0+IHtcclxuICAgIC8vICAgICBrZXkgPSBncnAgKyAnLCcgKyAnIycgKyBoZCArICcsJyArICcjJyArIHN0O1xyXG4gICAgLy8gICAgIGlmICh0aGlzLmhlYWREYXRhLmdldChrZXkpICE9IG51bGwgJiYgdGhpcy5oZWFkRGF0YS5nZXQoa2V5KSAhPSBcIlwiICYmIHRoaXMuaGVhZERhdGEuZ2V0KGtleSkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyAgICAgcGt0ZGF0YSA9IHBrdGRhdGEuY29uY2F0KFtdLCBBcnJheS5mcm9tKHRoaXMuaGVhZERhdGEuZ2V0KGtleSkpKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhrZXkpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgc2lkZS5mb3JFYWNoKHNkID0+IHtcclxuICAgICAgc3R0LmZvckVhY2goc3QgPT4ge1xyXG4gICAgICAgIGtleSA9IGdycCArICcsJyArICcjJyArIHNkICsgJywnICsgJyMnICsgc3Q7XHJcbiAgICAgICAgaWYgKHRoaXMuc2lkZURhdGEuZ2V0KGtleSkgIT0gbnVsbCAmJiB0aGlzLnNpZGVEYXRhLmdldChrZXkpICE9IFwiXCIgJiYgdGhpcy5zaWRlRGF0YS5nZXQoa2V5KSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHBrdGRhdGEgPSBwa3RkYXRhLmNvbmNhdChbXSwgQXJyYXkuZnJvbSh0aGlzLnNpZGVEYXRhLmdldChrZXkpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BrdERhdGEnLCBKU09OLnN0cmluZ2lmeShwa3RkYXRhKSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVzdWx0VmlldycsIEpTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LnJlc3VsdFZpZXcpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZXN1bHRWaWV3RHRsJywgSlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQucmVzdWx0Vmlld0R0bCkpO1xyXG4gIH1cclxuXHJcbiAgd3QgPSBmYWxzZTtcclxuICBhdmcgPSBmYWxzZTtcclxuICByYXAgPSBmYWxzZTtcclxuICB2YWwgPSBmYWxzZTtcclxuICBzdnBkID0gZmFsc2U7XHJcbiAgbXNkID0gZmFsc2U7XHJcbiAgbXNkdmx1ID0gZmFsc2U7XHJcblxyXG4gIGFnZSA9IGZhbHNlO1xyXG4gIHZhID0gZmFsc2U7XHJcbiAgaGlkZVNob3coY2FsbCwgc3RhdHVzKSB7XHJcbiAgICAvLyB2YXIgZGF0ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqW2lkXj1cIicgKyBpbmRleCArICdcIl0nKTtcclxuICAgIC8vIGxldCBub2RlcyA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRePVwiJyArIGNhbGwgKyAnXCJdJykgYXMgYW55KTtcclxuICAgIC8vIGlmIChzdGF0dXMpIHtcclxuICAgIC8vICAgbm9kZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgIC8vICAgICAvLyBjb25zb2xlLmxvZygpO1xyXG4gICAgLy8gICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIG5vZGVzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coKTtcclxuICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNhbGwpO1xyXG4gICAgaWYgKGNhbGwgPT0gJ0NUUycpIHtcclxuICAgICAgdGhpcy53dCA9ICF0aGlzLnd0XHJcbiAgICB9IGVsc2UgaWYgKGNhbGwgPT0gJ0FWRycpIHtcclxuICAgICAgdGhpcy5hdmcgPSAhdGhpcy5hdmdcclxuICAgIH0gZWxzZSBpZiAoY2FsbCA9PSAnUkFQJykge1xyXG4gICAgICB0aGlzLnJhcCA9ICF0aGlzLnJhcFxyXG4gICAgfSBlbHNlIGlmIChjYWxsID09ICdWTFUnKSB7XHJcbiAgICAgIHRoaXMudmFsID0gIXRoaXMudmFsXHJcbiAgICB9IGVsc2UgaWYgKGNhbGwgPT0gJ1NWUCcpIHtcclxuICAgICAgdGhpcy5zdnBkID0gIXRoaXMuc3ZwZFxyXG4gICAgfSBlbHNlIGlmIChjYWxsID09ICdNU0QnKSB7XHJcbiAgICAgIHRoaXMubXNkID0gIXRoaXMubXNkXHJcbiAgICB9IGVsc2UgaWYgKGNhbGwgPT0gJ01TRFZMVScpIHtcclxuICAgICAgdGhpcy5tc2R2bHUgPSAhdGhpcy5tc2R2bHVcclxuICAgIH0gZWxzZSBpZiAoY2FsbCA9PSAnQUdFJykge1xyXG4gICAgICB0aGlzLmFnZSA9ICF0aGlzLmFnZVxyXG4gICAgfSBlbHNlIGlmIChjYWxsID09ICdWQScpIHtcclxuICAgICAgdGhpcy52YSA9ICF0aGlzLnZhXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VHcnAoZ3JpZEdycCkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRHcnBXaXNlKCdjJywgZ3JpZEdycCk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUdyaWRHcnBXaXNlKGNhbGwsIHNlbGVjdGVkZ3JwKSB7XHJcbiAgICB0aGlzLmdycHZhbCA9ICcnO1xyXG4gICAgdGhpcy5oZWFkdmFsID0gJyc7XHJcbiAgICB0aGlzLnNpZGV2YWwgPSAnJztcclxuICAgIHRoaXMubWF0cml4LmNsZWFyKClcclxuICAgIHRoaXMucm93VG90YWwuY2xlYXIoKVxyXG4gICAgdGhpcy5jb2xUb3RhbC5jbGVhcigpXHJcbiAgICB0aGlzLmdyYW5kVG90YWwuY2xlYXIoKVxyXG4gICAgdGhpcy5wa3REYXRhLmNsZWFyKClcclxuICAgIHRoaXMuaGVhZCA9IFtdO1xyXG4gICAgdGhpcy5zaWRlID0gW107XHJcbiAgICBsZXQgZ3JwcyA9IHNlbGVjdGVkZ3JwLmdyb3VwLnNwbGl0KCcsJyk7XHJcbiAgICBsZXQgaGVhZCA9IHNlbGVjdGVkZ3JwLmhlYWQuc3BsaXQoJywnKTtcclxuICAgIGxldCBzaWRlID0gc2VsZWN0ZWRncnAuc2lkZS5zcGxpdCgnLCcpO1xyXG4gICAgdGhpcy5ncnB2YWwgPSBbLi4uZ3Jwc107XHJcbiAgICB0aGlzLmhlYWR2YWwgPSBbLi4uaGVhZF07XHJcbiAgICB0aGlzLnNpZGV2YWwgPSBbLi4uc2lkZV07XHJcbiAgICB0aGlzLmNyZWF0ZUdyaWQoKTtcclxuICB9XHJcblxyXG4gIHNjcm9sbCA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuYnRuVmlzaWJpbGl0eUJ5UG9zKCk7XHJcbiAgfTtcclxuXHJcbiAgYnRuVmlzaWJpbGl0eUJ5UG9zKCkge1xyXG4gICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID4gMjAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDEwKSB7XHJcbiAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnRuR29Ub3BcIikuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0aWNIZWFkXCIpLnN0eWxlLnRvcCA9IFwiNTBweFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0aWNIZWFkXCIpLnN0eWxlLnRvcCA9IFwiMTEwcHhcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBDaGF0TWFwRHRsID0ge307XHJcbiAgaXNzaG93Y2hhcnQgPSBmYWxzZTtcclxuICBjcmVhdGVncnBQaWUocGllU3RhdHVzTGlzdCwgZ3JwLCBhdHRyLCBwaWVjaGFydERhdGFMaXN0LCB0eXApIHtcclxuICAgIHRoaXMuaXNzaG93Y2hhcnQgPSBmYWxzZTtcclxuICAgIHRoaXMuQ2hhdE1hcER0bCA9IHt9O1xyXG4gICAgcGllU3RhdHVzTGlzdC5mb3JFYWNoKHN0YXR1cyA9PiB7XHJcbiAgICAgIGxldCBwaWVDaGFydExhYmVscyA9IFtdO1xyXG4gICAgICBsZXQgcGllQ2hhcnREYXRhID0gW107XHJcbiAgICAgIGxldCBwaWVDaGFydGxlZ2VuZCA9IFtdO1xyXG4gICAgICBwaWVjaGFydERhdGFMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgbGV0IGR0bDtcclxuICAgICAgICBpZiAodHlwID09ICdoZWFkJykge1xyXG4gICAgICAgICAgZHRsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArIFwiI1wiICsgZGF0YSArIFwiI1wiICsgYXR0ciArIFwiI1wiICsgc3RhdHVzKSB8fCAnJztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGR0bCA9IHRoaXMubWF0cml4LmdldChncnAgKyBcIiNcIiArIGF0dHIgKyBcIiNcIiArIGRhdGEgKyBcIiNcIiArIHN0YXR1cykgfHwgJyc7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGR0bCAhPSAnJykge1xyXG4gICAgICAgICAgbGV0IGNudCA9IGR0bC5nZXQoJ2NvdW50JykgfHwgJyc7XHJcbiAgICAgICAgICBpZiAoY250ICE9ICcnICYmIGNudCAhPSAnMCcpXHJcbiAgICAgICAgICAgIHBpZUNoYXJ0RGF0YS5wdXNoKHBhcnNlSW50KGNudCkpO1xyXG4gICAgICAgICAgcGllQ2hhcnRMYWJlbHMucHVzaChkYXRhKTtcclxuICAgICAgICAgIHBpZUNoYXJ0bGVnZW5kLnB1c2goZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5DaGF0TWFwRHRsW3N0YXR1cyArIFwiX2RhdGFcIl0gPSBwaWVDaGFydERhdGE7XHJcbiAgICAgIHRoaXMuQ2hhdE1hcER0bFtzdGF0dXMgKyBcIl9sYWJsZVwiXSA9IHBpZUNoYXJ0TGFiZWxzO1xyXG4gICAgICB0aGlzLkNoYXRNYXBEdGxbc3RhdHVzICsgXCJfbGVnZW5kXCJdID0gcGllQ2hhcnRsZWdlbmQ7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5DaGFydFR5cGUgPSAncGllJztcclxuICAgIHRoaXMucmVmcmVzaENoYXJ0KCdwaWUnKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaWVjaGFydE1vZGVsQnRuJykuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYXJDaGFydERhdGE7XHJcbiAgcHVibGljIGJhckNoYXJ0TGFiZWxzO1xyXG4gIHB1YmxpYyBiYXJDaGFydFR5cGU7XHJcbiAgcHVibGljIGJhckNoYXJ0TGVnZW5kID0gdHJ1ZTtcclxuICBpc2JhcnNob3djaGFydCA9IGZhbHNlO1xyXG5cclxuXHJcbiAgcHVibGljIGJhckNoYXJ0T3B0aW9uczogQ2hhcnRPcHRpb25zID0ge1xyXG4gICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuXHJcbiAgICBzY2FsZXM6IHtcclxuICAgICAgeUF4ZXM6IFt7XHJcbiAgICAgICAgaWQ6IFwieS1heGlzLTFcIixcclxuICAgICAgICBwb3NpdGlvbjogJ2xlZnQnLFxyXG5cclxuICAgICAgICB0aWNrczoge1xyXG4gICAgICAgICAgYmVnaW5BdFplcm86IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNjYWxlTGFiZWw6IHtcclxuICAgICAgICAgIGRpc3BsYXk6IHRydWUsXHJcbiAgICAgICAgICBsYWJlbFN0cmluZzogJ1F0eSdcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IFwieS1heGlzLTJcIixcclxuICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0JyxcclxuXHJcbiAgICAgICAgdGlja3M6IHtcclxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICAsXHJcbiAgICAgICAgc2NhbGVMYWJlbDoge1xyXG4gICAgICAgICAgZGlzcGxheTogdHJ1ZSxcclxuICAgICAgICAgIGxhYmVsU3RyaW5nOiAnQXZnJ1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgfV1cclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxhYmVsczoge1xyXG4gICAgICAgIC8vIHJlbmRlciAnbGFiZWwnLCAndmFsdWUnLCAncGVyY2VudGFnZScsICdpbWFnZScgb3IgY3VzdG9tIGZ1bmN0aW9uLCBkZWZhdWx0IGlzICdwZXJjZW50YWdlJ1xyXG4gICAgICAgIHJlbmRlcjogJ3ZhbHVlJyxcclxuICAgICAgICBzaG93WmVybzogZmFsc2UsXHJcbiAgICAgICAgb3ZlcmxhcDogZmFsc2UsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuXHJcblxyXG5cclxuICBwdWJsaWMgYmFyY2hhcnRDb2xvcnM6IEFycmF5PGFueT4gPSBbXHJcbiAgICB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoNTksIDg5LCAxNTIsMC44KScsXHJcbiAgICAgIGJvcmRlckNvbG9yOiAncmdiYSg1OSwgODksIDE1MiwwLjgpJyxcclxuICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDU5LCA4OSwgMTUyLDAuOCknLFxyXG4gICAgICBib3JkZXJDb2xvcjogJ3JnYmEoNTksIDg5LCAxNTIsMC44KScsXHJcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDEwMiwgMTc5LDAuOCknLFxyXG4gICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMjU1LCAxMDIsIDE3OSwwLjgpJyxcclxuICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMTAyLCAxNzksMC44KScsXHJcbiAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgyNTUsIDEwMiwgMTc5LDAuOCknLFxyXG4gICAgICBib3JkZXJXaWR0aDogMixcclxuICAgIH1cclxuICBdO1xyXG5cclxuXHJcbiAgY3JlYXRlZ3JwQmFyKHBpZVN0YXR1c0xpc3QsIGdycCwgYXR0ciwgcGllY2hhcnREYXRhTGlzdCwgdHlwKSB7XHJcbiAgICB0aGlzLmlzYmFyc2hvd2NoYXJ0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmJhckNoYXJ0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5iYXJDaGFydExhYmVscyA9IFtdO1xyXG4gICAgcGllU3RhdHVzTGlzdC5mb3JFYWNoKHN0YXR1cyA9PiB7XHJcbiAgICAgIGxldCBiYXJjaGFyRHRsID0ge307XHJcbiAgICAgIGxldCBiYXJjaGF0bGlzdCA9IFtdO1xyXG4gICAgICBsZXQgbGluZWNoYXJ0TGlzdCA9IFtdO1xyXG4gICAgICBwaWVjaGFydERhdGFMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgbGV0IGR0bDtcclxuICAgICAgICBpZiAodHlwID09ICdoZWFkJykge1xyXG4gICAgICAgICAgZHRsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArIFwiI1wiICsgZGF0YSArIFwiI1wiICsgYXR0ciArIFwiI1wiICsgc3RhdHVzKSB8fCAnJztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGR0bCA9IHRoaXMubWF0cml4LmdldChncnAgKyBcIiNcIiArIGF0dHIgKyBcIiNcIiArIGRhdGEgKyBcIiNcIiArIHN0YXR1cykgfHwgJyc7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5iYXJDaGFydExhYmVscy5pbmRleE9mKGRhdGEpID09IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLmJhckNoYXJ0TGFiZWxzLnB1c2goZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkdGwgIT0gJycpIHtcclxuICAgICAgICAgIGxldCBjbnQgPSBkdGwuZ2V0KCdjb3VudCcpIHx8ICcwJztcclxuICAgICAgICAgIGxldCBhdmcgPSBkdGwuZ2V0KCdhdmcnKSB8fCAnMCc7XHJcbiAgICAgICAgICBiYXJjaGF0bGlzdC5wdXNoKGNudCk7XHJcbiAgICAgICAgICBsaW5lY2hhcnRMaXN0LnB1c2goYXZnKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJhcmNoYXRsaXN0LnB1c2goJzAnKTtcclxuICAgICAgICAgIGxpbmVjaGFydExpc3QucHVzaCgnMCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICBiYXJjaGFyRHRsWydsYWJlbCddID0gc3RhdHVzICsgXCIgUXR5XCI7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ2RhdGEnXSA9IGJhcmNoYXRsaXN0O1xyXG4gICAgICBiYXJjaGFyRHRsWyd0eXBlJ10gPSAnYmFyJztcclxuICAgICAgYmFyY2hhckR0bFsneUF4aXNJRCddID0gJ3ktYXhpcy0xJztcclxuICAgICAgdGhpcy5iYXJDaGFydERhdGEucHVzaChiYXJjaGFyRHRsKTtcclxuICAgICAgYmFyY2hhckR0bCA9IHt9O1xyXG4gICAgICBiYXJjaGFyRHRsWydsYWJlbCddID0gc3RhdHVzICsgXCIgQXZnXCI7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ2RhdGEnXSA9IGxpbmVjaGFydExpc3Q7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ3R5cGUnXSA9ICdsaW5lJztcclxuICAgICAgYmFyY2hhckR0bFsnZmlsbCddID0gZmFsc2U7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ3lBeGlzSUQnXSA9ICd5LWF4aXMtMic7XHJcbiAgICAgIHRoaXMuYmFyQ2hhcnREYXRhLnB1c2goYmFyY2hhckR0bCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmJhckNoYXJ0VHlwZSA9ICdiYXInO1xyXG4gICAgdGhpcy5yZWZyZXNoQ2hhcnQoJ2JhcicpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcmNoYXJ0TW9kZWxCdG4nKS5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaENoYXJ0KHR5cGUpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodHlwZSA9PSAnYmFyJylcclxuICAgICAgICB0aGlzLmlzYmFyc2hvd2NoYXJ0ID0gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGUgPT0gJ3BpZScpXHJcbiAgICAgICAgdGhpcy5pc3Nob3djaGFydCA9IHRydWU7XHJcblxyXG4gICAgfSwgNSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbCwgdHJ1ZSk7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUobWFwID0+IHtcclxuICAgICAgbGV0IHNjaElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NyY0lkbnMnKTtcclxuICAgICAgbGV0IHBlcmlvZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSVBlcmlvZCcpO1xyXG4gICAgICB0aGlzLmZvcm1uYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgICB0aGlzLnNyY2hIaXN0b3J5WydwZXJpb2QnXSA9IHBlcmlvZDtcclxuICAgICAgbGV0IGZybWR0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJcFRvJyk7XHJcbiAgICAgIGxldCB0b2R0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJcEZyb20nKTtcclxuICAgICAgdGhpcy5jVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgICB0aGlzLm1vZHVsZW5hbWUgPSB0aGlzLmNVcmwuc3BsaXQoJy8nKVsxXTtcclxuICAgICAgaWYgKGZybWR0ICE9IG51bGwgJiYgZnJtZHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zcmNoSGlzdG9yeVsnZnJtZHQnXSA9IChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklwRnJvbScpKS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9kdCAhPSBudWxsICYmIHRvZHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zcmNoSGlzdG9yeVsndG9kdCddID0gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSXBUbycpKS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgaWYgKHNjaElkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuZ2V0U2VhcmNoUmVzdWx0KHNjaElkLCBwZXJpb2QpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuZ3JvdXBzID0gW1xyXG4gICAgLy8gICB7XHJcbiAgICAvLyAgICAgJ3ZhbCc6ICdzaF9zel9jb19wdScsXHJcbiAgICAvLyAgICAgJ2dycCc6ICdzaCxzeicsXHJcbiAgICAvLyAgICAgJ2hlYWQnOiAncHUnLFxyXG4gICAgLy8gICAgICdzaWRlJzogJ2NvJyxcclxuICAgIC8vICAgfSwge1xyXG4gICAgLy8gICAgICd2YWwnOiAnc2hfY29fcHUnLFxyXG4gICAgLy8gICAgICdncnAnOiAnc2gnLFxyXG4gICAgLy8gICAgICdoZWFkJzogJ3B1JyxcclxuICAgIC8vICAgICAnc2lkZSc6ICdjbycsXHJcbiAgICAvLyAgIH0sIHtcclxuICAgIC8vICAgICAndmFsJzogJ3B1cl9jb19wdScsXHJcbiAgICAvLyAgICAgJ2dycCc6ICdwdXInLFxyXG4gICAgLy8gICAgICdoZWFkJzogJ3B1JyxcclxuICAgIC8vICAgICAnc2lkZSc6ICdjbycsXHJcbiAgICAvLyAgIH1cclxuICAgIC8vIF1cclxuICAgIC8vIHRoaXMuY3JlYXRlR3JpZCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibXRcIj5cclxuICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIj5cclxuICAgICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdCBjcFwiIChjbGljayk9XCJjcy5wYWdlQmNrKCk7XCI+IEJhY2s8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5hbHlzaXNcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImYtMTJcIj4oe3tjcy5jRGF0ZSB8IGRhdGU6J21lZGl1bSd9fSk8L3NwYW4+XHJcbiAgICAgICAgPCEtLSA8YnV0dG9uIChjbGljayk9XCJ0ZXN0KClcIj48L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICA8L2gzPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lLWJvZHlcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjA7XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBpZD1cInN0YXRpY0hlYWRcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIiBwb3NpdGlvbjogZml4ZWQ7d2lkdGg6IDEwMCU7YmFja2dyb3VuZDogd2hpdGU7ei1pbmRleDogOTk7cGFkZGluZy10b3A6NXB4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmUgcHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWw+R3JpZCBGb3JtYXRlIDwvbGFiZWw+ICZuYnNwOyZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIG5hbWU9XCJncmlkR3JwXCIgKGNoYW5nZSk9XCJjaGFuZ2VHcnAoZ3JpZEdycCk7XCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyaWRHcnBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHNcIiBbbmdWYWx1ZV09XCJncm91cFwiPnt7Z3JvdXAubmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogNXB4O1wiIChjbGljayk9XCJtb2RpZnlTZWFyY2goKVwiPk1vZGlmeVxyXG4gICAgICAgICAgICAgICAgICAgIFNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDtcIj5TYWxlIHBlcmlvZCAmbmJzcDsmbmJzcDsge3tzcmNoSGlzdG9yeT8uZnJtZHR9fSAmbmJzcDsmbmJzcDsgVG9cclxuICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7IHt7c3JjaEhpc3Rvcnk/LnRvZHR9fSAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfFxyXG4gICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsgUGVyaW9kIHt7c3JjaEhpc3Rvcnk/LnBlcmlvZH19PC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGFtcGxlSW5wdXROYW1lMlwiPmNoYW5nZSBCeSAmbmJzcDsmbmJzcDs8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPVwid2lkdGg6ODBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBuYW1lPVwiQ2hhbmdlQnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiT25DaGFuZ2VCeShDaGFuZ2VCeSk7XCIgWyhuZ01vZGVsKV09XCJDaGFuZ2VCeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJDT1VOVENPTE9SXCI+UXR5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFWR0NPTE9SXCI+QXZnPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0c1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0NUUycsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IENUU1xyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0FWRycsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IEFWR1xyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ1JBUCcsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IERJU0NcclxuICAgICAgICAgICAgICA8IS0tIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0FHRScsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IEFHRSAtLT5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNsaWNrKT1cImhpZGVTaG93KCdWTFUnLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1wiPiBWTFVcclxuXHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjbGljayk9XCJoaWRlU2hvdygnTVNEJywgJGV2ZW50LnRhcmdldC5jaGVja2VkKTtcIj4gTVNEXHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjbGljayk9XCJoaWRlU2hvdygnTVNEVkxVJywgJGV2ZW50LnRhcmdldC5jaGVja2VkKTtcIj4gTVNEIFZMVVxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0FHRScsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IEFHRVxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ1ZBJywgJGV2ZW50LnRhcmdldC5jaGVja2VkKTtcIj4gVkFcclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNsaWNrKT1cImhpZGVTaG93KCdTVlAnLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1wiPiBTVlBEXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDc1cHg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgZ3JwIG9mIHNvcnRlZEdycDtsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7Z3JwfX0gPC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcclxuICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCBhbmFseXNpc1RhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBocmQgb2YgaGVhZDtcIiBjbGFzcz1cInRleHQtY2VudGVyXCIgW2F0dHIuY29sc3Bhbl09XCJzdHQ/Lmxlbmd0aFwiPnt7aHJkfX0gPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtcGllLWNoYXJ0XCIgKGNsaWNrKT1cImNyZWF0ZWdycFBpZShzdHQsZ3JwLGhyZCxzaWRlLCdoZWFkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyLWNoYXJ0XCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZWdycEJhcihzdHQsZ3JwLGhyZCxzaWRlLCdoZWFkJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtY2VudGVyXCIgY29sc3Bhbj1cIjJcIiBbYXR0ci5jb2xzcGFuXT1cInN0dD8ubGVuZ3RoXCI+VG90YWw8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhyZCBvZiBoZWFkO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgc3Qgb2Ygc3R0O1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e3N0fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImlubmVyVGJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ3dFwiIGlkPVwie3tpfX1cIiBjbGFzcz1cInRleHQtY2VudGVyXCI+V3Q8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImF2Z1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5Bdmc8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwicmFwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkRpc2M8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5WYWx1ZTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2RcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+TVNEPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2R2bHVcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+TVNEIFZsdTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhZ2VcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+QUdFPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5WQTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzdnBkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlNWUEQ8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0IG9mIHN0dDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7c3R9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiaW5uZXJUYmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInd0XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPld0PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+QXZnPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInJhcFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5EaXNjPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YWxcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+VmFsdWU8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPk1TRDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkdmx1XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPk1TRCBWbHU8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiYWdlXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkFHRTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwidmFcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+VkE8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic3ZwZFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5TVlBEPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHNpZCBvZiBzaWRlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7c2lkfX0gPGkgY2xhc3M9XCJmYSBmYS1waWUtY2hhcnRcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlZ3JwUGllKHN0dCxncnAsc2lkLGhlYWQsJ3NpZGUnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4gJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXItY2hhcnRcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlZ3JwQmFyKHN0dCxncnAsc2lkLGhlYWQsJ3NpZGUnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkIG9mIGhlYWQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzdCBvZiBzdHQ7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6aXNBcHBsaWVkPT10cnVlP2dibEdyZERhdGFDb2xvci5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3QpLmdldChrZXkpIDogbWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2dycGNvbG9yJyl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4+e3tnYmxHcnBBcnJbZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3RdIHxqc29ufX08L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcFwiIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIGRhdGEtcGxhY2VtZW50PVwicmlnaHRcIiB0aXRsZT1cIkNsaWNrIGhlcmUgdG8gZ2V0IGRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldERhdGEoJ2NlbGwnLCBncnArJyMnK3NpZCsnIycraHJkLHN0KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCIve3ttb2R1bGVuYW1lfX0vcGt0LWxpc3Qve3tmb3JtbmFtZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ttYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkKycjJytzdCk/LmdldCgnY291bnQnKX19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiaW5uZXJUYmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInd0XCIgaWQ9XCJ7e2l9fVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd3dCcpPT0nJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd3dCcpPT0gbnVsbCApPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd3dCcpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnYXZnJyk9PScnIHx8IG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpPT0gbnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdhdmcnKT09XCJcIiB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpPT1udWxsICApPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpKX19PC90ZD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJyYXBcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnZGlzYycpPT0nJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdkaXNjJyk9PSBudWxsKT8nLSc6Y3Muc3BsaXRUb1R3b0RlY2ltYWwobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnZGlzYycpKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwidmFsXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7KG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ3ZhbHVlJyk9PScnIHx8IG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ3ZhbHVlJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd2YWx1ZScpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2RcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnbXNkJyk9PSAnJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdtc2QnKT09bnVsbCk/Jy0nOm1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ21zZCcpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDp7e21hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmQrJyMnK3N0KT8uZ2V0KCdtc2QnKSB8IGpzb259fSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1zZHZsdVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKT09JycgfHwgbWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PW51bGwpPyctJzptYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e2NzLnJvdW5kdmFsKG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09XCJcIiB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09IG51bGwgKT8nLSc6Y3Mucm91bmR2YWwobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnYWdlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7bWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpPT0gJycgfHwgbWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKT09bnVsbCk/ICctJzpjcy5yb3VuZHZhbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic3ZwZFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnc3ZwZCcpPT0nJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnc3ZwZCcpPT1udWxsKT8nLSc6bWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ3N2cGQnKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdCBvZiBzdHQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2dycGNvbG9yJyl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cImdldERhdGEoJ3JvdycsIGdycCsnIycrc2lkLHN0KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJMaW5rPVwiL3t7bW9kdWxlbmFtZX19L3BrdC1saXN0L3t7Zm9ybW5hbWV9fVwiPnt7cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2NvdW50Jyl9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImlubmVyVGJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ3dFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCd3dCcpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3d0Jyk9PW51bGwpPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnd3QnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHRkICpuZ0lmPVwiYXZnXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2F2ZycpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnYXZnJyk9PVwiXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdhdmcnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdhdmcnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwicmFwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3socm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2Rpc2MnKT09JycgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdkaXNjJyk9PW51bGwpPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnZGlzYycpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YWxcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgndmFsdWUnKT09JycgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCd2YWx1ZScpPT1udWxsKT8nLSc6Y3Mucm91bmR2YWwocm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3ZhbHVlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1zZFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdtc2QnKT09Jyd8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ21zZCcpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnbXNkJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkdmx1XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3socm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ21zZHZsdScpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PW51bGwpPyctJzpyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnbXNkdmx1Jyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y3Mucm91bmR2YWwocm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdhZ2UnKT09XCJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2FnZScpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpjcy5yb3VuZHZhbChyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnYWdlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2FnZScpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3socm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3ZhbHVlYWdlJyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKT09bnVsbCk/Jy0nOmNzLnJvdW5kdmFsKHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInN2cGRcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnc3ZwZCcpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnc3ZwZCcpPT1udWxsKT8nLSc6cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3N2cGQnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlRvdGFsPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkIG9mIGhlYWQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzdCBvZiBzdHQ7XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnZ3JwY29sb3InKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJMaW5rPVwiL3t7bW9kdWxlbmFtZX19L3BrdC1saXN0L3t7Zm9ybW5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXREYXRhKCdjb2wnLCBncnArJyMnK2hyZCxzdCk7XCI+e3tjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnY291bnQnKX19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiaW5uZXJUYmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInd0XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3d0Jyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnd3QnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCd3dCcpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImF2Z1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e2NvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdhdmcnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImF2Z1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdhdmcnKT09XCJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2F2ZycpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnYXZnJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwicmFwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2Rpc2MnKSA9PSAnJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2Rpc2MnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdkaXNjJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCd2YWx1ZScpPT0nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHxjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgndmFsdWUnKT09bnVsbCApID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctJzpjcy5yb3VuZHZhbChjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgndmFsdWUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ21zZCcpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ21zZCcpPT1udWxsKT8nLSc6Y3Muc3BsaXRUb1R3b0RlY2ltYWwoY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ21zZCcpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2R2bHVcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PScnfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y3Mucm91bmR2YWwoY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdhZ2UnKT09Jyd8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpjcy5yb3VuZHZhbChjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnYWdlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7Y29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3ZhbHVlYWdlJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzdnBkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3N2cGQnKT09Jyd8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3N2cGQnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdzdnBkJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Qgb2Ygc3R0O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6IGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdncnBjb2xvcicpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCIve3ttb2R1bGVuYW1lfX0vcGt0LWxpc3Qve3tmb3JtbmFtZX19XCIgKGNsaWNrKT1cImdldEFsbChzdHQsaGVhZCxzaWRlLGdycClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoY2xpY2spPVwiZ2V0RGF0YSgnYWxsJywgJycpO1wiIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdjb3VudCcpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImlubmVyVGJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ3dFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd3dCcpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnd3QnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd3dCcpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnYXZnJyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnYXZnJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnYXZnJykpfX1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJyYXBcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnZGlzYycpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ2Rpc2MnKT09bnVsbCk/Jy0nOmNzLnJvdW5kdmFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdkaXNjJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd2YWx1ZScpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ3ZhbHVlJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgndmFsdWUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkICYmIHN0PT0nc29sZCdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkJyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkJyk9PW51bGwpPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7Z3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ21zZCcpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkdmx1ICYmIHN0PT0nc29sZCdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PScnfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y3Mucm91bmR2YWwoZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09JycgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09bnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKT8nLSc6Y3Mucm91bmR2YWwoZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ2FnZScpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDp7e2dyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdhZ2UnKSB8anNvbn19IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKT09bnVsbCk/Jy0nOmNzLnJvdW5kdmFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInN2cGRcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnc3ZwZCcpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnc3ZwZCcpPT1udWxsKT8nLSc6Y3Muc3BsaXRUb1R3b0RlY2ltYWwoZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ3N2cGQnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJQaWVjaGFydE1vZGVsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJleGFtcGxlTW9kYWxMYWJlbFwiXHJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJtYWlsTW9kYWxIZWFkXCI+UGllIENoYXJ0PC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Qgb2Ygc3R0O1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNzaG93Y2hhcnRcIiBjbGFzcz1cImNvbC1zbS02XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiB3aXRoPVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDE2cHg7Zm9udC13ZWlnaHQ6IGJvbGQ7XCI+IHt7c3R9fSBDaGFydDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IHdpdGg9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2FudmFzIGJhc2VDaGFydCBbZGF0YV09XCJDaGF0TWFwRHRsW3N0KydfZGF0YSddXCIgW2xhYmVsc109XCJDaGF0TWFwRHRsW3N0KydfbGFibGUnXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtsZWdlbmRdPVwiQ2hhdE1hcER0bFtzdCsnX2xlZ2VuZCddXCIgW2NoYXJ0VHlwZV09XCJDaGFydFR5cGVcIiBbb3B0aW9uc109XCJjaGFydE9wdGlvbnNcIj48L2NhbnZhcz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiYmFyY2hhcnRNb2RlbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZXhhbXBsZU1vZGFsTGFiZWxcIlxyXG4gIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIiByb2xlPVwiZG9jdW1lbnRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwibWFpbE1vZGFsSGVhZFwiPkJhciBDaGFydDwvaDQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcblxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzYmFyc2hvd2NoYXJ0XCIgY2xhc3M9XCJjb2wtc20tMTJcIj5cclxuICAgICAgICAgICAgPGRpdiB3aXRoPVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4O2ZvbnQtd2VpZ2h0OiBib2xkO1wiPiB7e3N0fX0gQ2hhcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHdpdGg9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgPGNhbnZhcyBiYXNlQ2hhcnQgW2RhdGFzZXRzXT1cImJhckNoYXJ0RGF0YVwiIFtsYWJlbHNdPVwiYmFyQ2hhcnRMYWJlbHNcIiBbb3B0aW9uc109XCJiYXJDaGFydE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgW2xlZ2VuZF09XCJiYXJDaGFydExlZ2VuZFwiIFtjb2xvcnNdPVwiYmFyY2hhcnRDb2xvcnNcIiBbY2hhcnRUeXBlXT1cImJhckNoYXJ0VHlwZVwiPlxyXG4gICAgICAgICAgICAgIDwvY2FudmFzPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGJ1dHRvbiBpZD1cIlBpZWNoYXJ0TW9kZWxCdG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjUGllY2hhcnRNb2RlbFwiPjwvYnV0dG9uPlxyXG48YnV0dG9uIGlkPVwiYmFyY2hhcnRNb2RlbEJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNiYXJjaGFydE1vZGVsXCI+PC9idXR0b24+Il19