client-core-services 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,2304 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { UntypedFormControl } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/common-utils/common-function.service";
5
+ import * as i2 from "../common-utils/core-function/core-function.service";
6
+ import * as i3 from "../notify/notification.service";
7
+ import * as i4 from "../storage/storage.service";
8
+ import * as i5 from "./../api/api-call/api-call.service";
9
+ export class LimsCalculationsService {
10
+ constructor(commonFunctionService, coreFunctionService, notificationService, storageService, apiCallService) {
11
+ this.commonFunctionService = commonFunctionService;
12
+ this.coreFunctionService = coreFunctionService;
13
+ this.notificationService = notificationService;
14
+ this.storageService = storageService;
15
+ this.apiCallService = apiCallService;
16
+ }
17
+ calculateBalanceAmountEngLetter(tamplateFormValue, multiFormValue) {
18
+ let list = tamplateFormValue['billingPlan'];
19
+ let fees = +multiFormValue['totalFees'];
20
+ let milestoneAchievedtotal = 0;
21
+ let total = 0;
22
+ if (list != null && list != undefined) {
23
+ for (let i = 0; i < list.length; i++) {
24
+ milestoneAchievedtotal += list[i]['feesOnMilestoneAchieved'];
25
+ }
26
+ }
27
+ total = milestoneAchievedtotal + tamplateFormValue['feesOnMilestoneAchieved'];
28
+ let remaningAmount = fees - total;
29
+ let obj = {
30
+ balanceAmount: remaningAmount
31
+ };
32
+ return obj;
33
+ }
34
+ getTaWithCalculation(value) {
35
+ let localTas = 0;
36
+ let claimSheet = value.claimSheet;
37
+ let priceInKm = claimSheet.priceInKm;
38
+ let distanceInkm = claimSheet.distanceInKm;
39
+ localTas = priceInKm * distanceInkm;
40
+ let obj1 = {
41
+ localTa: localTas
42
+ };
43
+ let obj = {
44
+ claimSheet: obj1
45
+ };
46
+ return obj;
47
+ }
48
+ calculateTotalAmount(formValue) {
49
+ let list = formValue['claimSheet'];
50
+ let total = 0;
51
+ for (let i = 0; i < list.length; i++) {
52
+ total += list[i]['totalForTheDay'];
53
+ }
54
+ let obj = {
55
+ totalAmountOfTravelCliam: total
56
+ };
57
+ return obj;
58
+ }
59
+ calculateTotalFair(value) {
60
+ let totalFair = 0;
61
+ let curValue = {};
62
+ let checkClaimSheet = false;
63
+ let calculateObject = {
64
+ totalForTheDay: 0
65
+ };
66
+ if (value && value.claimSheet) {
67
+ curValue = value.claimSheet;
68
+ checkClaimSheet = true;
69
+ }
70
+ else {
71
+ curValue = value;
72
+ }
73
+ let localTa = curValue.localTa;
74
+ let travelFair = curValue.travelFare;
75
+ let dailyAllowance = curValue.dailyAllowance;
76
+ let food = curValue.food;
77
+ let hotel = curValue.hotel;
78
+ let parking = curValue.parking;
79
+ let toolCharge = curValue.tollCharge;
80
+ let miscellaneous = curValue.miscellaneous;
81
+ totalFair = (+travelFair) + (+localTa) + (+dailyAllowance) + (+food) + (+hotel) + (+parking) + (+toolCharge) + (+miscellaneous);
82
+ calculateObject.totalForTheDay = totalFair;
83
+ if (checkClaimSheet) {
84
+ return {
85
+ claimSheet: calculateObject
86
+ };
87
+ }
88
+ else {
89
+ return calculateObject;
90
+ }
91
+ }
92
+ buggetForcastCalc(templateForm) {
93
+ let templateValue = templateForm.getRawValue();
94
+ let actualCurYr = templateValue.actual_current;
95
+ let actualLastYr = templateValue.actuals;
96
+ let budget = templateValue.this_year;
97
+ let growthpers = {};
98
+ let budgetpers = {};
99
+ let value = [];
100
+ let value1 = [];
101
+ Object.keys(actualCurYr).forEach(key => {
102
+ let growthper = 0;
103
+ let budgetper = 0;
104
+ let actualCurYrMonth = actualCurYr[key];
105
+ let actualLastYrMonth = actualLastYr[key];
106
+ if (actualLastYrMonth != 0) {
107
+ growthper = actualCurYrMonth / actualLastYrMonth;
108
+ }
109
+ let budgetcurYrMonth = budget[key];
110
+ if (budgetcurYrMonth != 0) {
111
+ budgetper = actualCurYrMonth / budgetcurYrMonth;
112
+ }
113
+ growthpers[key] = growthper;
114
+ let obj = {
115
+ field: key, value: growthpers[key]
116
+ };
117
+ value.push(obj);
118
+ budgetpers[key] = budgetper;
119
+ let obj1 = {
120
+ field: key, value: budgetpers[key]
121
+ };
122
+ value1.push(obj1);
123
+ });
124
+ const fieldWithValueforgrowth = {
125
+ field: 'growth_per', value: value
126
+ };
127
+ fieldWithValueforgrowth.value.forEach((element) => {
128
+ templateForm.controls[fieldWithValueforgrowth.field].controls[element.field].patchValue(element.value);
129
+ });
130
+ const fieldWithValueforBudget = {
131
+ field: 'budget_per', value: value1
132
+ };
133
+ fieldWithValueforBudget.value.forEach((element) => {
134
+ templateForm.controls[fieldWithValueforBudget.field].controls[element.field].patchValue(element.value);
135
+ });
136
+ }
137
+ calculateAutoEffRate(data) {
138
+ data.forEach((element) => {
139
+ element["per_sample_net_rate"] = element["no_of_samples"] * element["quotation_effective_rate"];
140
+ });
141
+ return data;
142
+ }
143
+ calculate_next_calibration_due_date(templateForm) {
144
+ const objectValue = templateForm.getRawValue();
145
+ let calibration_date = objectValue['calibration_date'];
146
+ let calibration_frequency = objectValue['calibration_frequency'];
147
+ if (calibration_date != null && calibration_date !== undefined && calibration_frequency != null && calibration_frequency !== undefined && calibration_date !== "" && calibration_frequency !== "") {
148
+ let date = new Date();
149
+ date.setDate(calibration_date.getDate() + calibration_frequency);
150
+ templateForm.controls['next_date'].setValue(date);
151
+ }
152
+ }
153
+ calculation_of_script_for_tds(object, field) {
154
+ const staticModal = [];
155
+ staticModal.push(this.apiCallService.getPaylodWithCriteria('QTMP:CALCULATION_SCRIPT', field.onchange_call_back_field, field.onchange_api_params_criteria, object));
156
+ staticModal[0]['data'] = object;
157
+ return staticModal;
158
+ }
159
+ getDecimalAmount(value) {
160
+ let decimaldigitNo = this.storageService.getApplicationSetting().roundValueNoOfDigits;
161
+ let decimalno = 2;
162
+ if (decimaldigitNo != undefined && decimaldigitNo != null) {
163
+ decimalno = decimaldigitNo;
164
+ }
165
+ if (typeof (value) == 'number' && value != undefined && value != null) {
166
+ return Number(value.toFixed(decimalno));
167
+ }
168
+ else {
169
+ return;
170
+ }
171
+ }
172
+ legacyQuotationParameterCalculation(data, fieldName) {
173
+ let quantity = 0;
174
+ let discount_percent = 0;
175
+ let cost_rate = 0;
176
+ let net_amount = 0;
177
+ let param_quantom = 0;
178
+ let Base_quotation_rate = 0;
179
+ let incoming_field = fieldName.field_name;
180
+ let gross_amount = 0;
181
+ let dis_amt = 0;
182
+ switch (incoming_field) {
183
+ case "claim_unit":
184
+ case "claim_percent":
185
+ this.calculate_pharma_claim_values(data);
186
+ break;
187
+ case "parameter_quantum":
188
+ if (data.parameter_quantum) {
189
+ data['quantum_rate'] = (+data.quotation_rate) * (+data.parameter_quantum);
190
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
191
+ net_amount = +data.quotation_effective_rate;
192
+ if (data.discount_percent) {
193
+ let discount = ((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
194
+ data['discount_amount'] = discount;
195
+ net_amount = (+data.quotation_effective_rate) - discount;
196
+ }
197
+ data['net_amount'] = net_amount;
198
+ }
199
+ break;
200
+ case "qty":
201
+ if (data.qty) {
202
+ if (data.branch && data.branch.name && data.branch.name === "Pune") {
203
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
204
+ }
205
+ else {
206
+ data['quotation_effective_rate'] = (+data.qty) * (+data.offer_rate);
207
+ }
208
+ if (data.no_of_injection > 0) {
209
+ // this.calculateParameterAmtOnInjection(data);
210
+ }
211
+ else {
212
+ net_amount = +data.quotation_effective_rate;
213
+ if (data.discount_percent) {
214
+ let discount = this.getDecimalAmount((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
215
+ data['discount_amount'] = discount;
216
+ net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
217
+ }
218
+ data['net_amount'] = net_amount;
219
+ data['total'] = +data.quotation_effective_rate;
220
+ data['qty'] = data.qty;
221
+ }
222
+ }
223
+ break;
224
+ case "discount_percent":
225
+ if (!data.discount_percent) {
226
+ data.discount_percent = 0;
227
+ }
228
+ if (data.no_of_injection > 0) {
229
+ // this.calculateParameterAmtOnInjection(data);
230
+ }
231
+ else if (data.branch && data.branch.name && data.branch.name === "Pune") {
232
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
233
+ }
234
+ else {
235
+ data['quotation_effective_rate'] = (+data.qty) * (+data.offer_rate);
236
+ }
237
+ net_amount = +data.quotation_effective_rate;
238
+ let discount = this.getDecimalAmount(((+data.quotation_effective_rate) * (+data.discount_percent)) / 100);
239
+ data['discount_amount'] = discount;
240
+ net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
241
+ data['discount_percent'] = data.discount_percent;
242
+ data['net_amount'] = net_amount;
243
+ data['total'] = +data.quotation_effective_rate;
244
+ data['qty'] = data.qty;
245
+ data['discount_percent'] = +data['discount_percent'];
246
+ break;
247
+ case "offer_rate":
248
+ if (data.no_of_injection > 0) {
249
+ if (data.offer_rate) {
250
+ data["rate_per_injection"] = data.offer_rate;
251
+ }
252
+ // this.calculateParameterAmtOnInjection(data);
253
+ }
254
+ else {
255
+ if (data.offer_rate) {
256
+ gross_amount = this.getDecimalAmount(data.offer_rate * data.qty);
257
+ if (data.discount_percent && data.discount_percent > 0) {
258
+ dis_amt = this.getDecimalAmount((gross_amount * data.discount_percent) / 100);
259
+ }
260
+ net_amount = gross_amount - dis_amt;
261
+ }
262
+ data['net_amount'] = net_amount;
263
+ data['discount_amount'] = dis_amt;
264
+ data['total'] = gross_amount;
265
+ data['quotation_effective_rate'] = gross_amount;
266
+ }
267
+ break;
268
+ case "discount_amount":
269
+ if ((data.discount_amount == 0) || (data.discount_amount)) {
270
+ net_amount = (+data.quotation_effective_rate) - (+data.discount_amount);
271
+ let discount_per = this.getDecimalAmount(((+data.discount_amount) * 100) / (+data.quotation_effective_rate));
272
+ data['net_amount'] = net_amount;
273
+ data['discount_percent'] = discount_per;
274
+ data['discount_amount'] = +data['discount_amount'];
275
+ }
276
+ break;
277
+ }
278
+ if (data['qty'] > 0) {
279
+ data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
280
+ }
281
+ let amountFields = [
282
+ 'quotation_effective_rate',
283
+ 'discount_amount',
284
+ 'discount_percent',
285
+ 'net_amount',
286
+ 'total',
287
+ 'per_sample_net_rate'
288
+ ];
289
+ amountFields.forEach(column => {
290
+ data[column] = this.getDecimalAmount(data[column]);
291
+ });
292
+ }
293
+ calculate_pharma_claim_values(new_element) {
294
+ if (new_element.claim_dependent && !isNaN(new_element.claim_percent)) {
295
+ if (!isNaN(+new_element.limit_from)) {
296
+ if (this.coreFunctionService.isNotBlank(new_element.claim_percent)) {
297
+ new_element.claim_limit_from = (+new_element.limit_from) * (new_element.claim_percent) / 100;
298
+ if (new_element.claim_unit) {
299
+ new_element.claim_limit_from = new_element.claim_limit_from + " " + new_element.claim_unit;
300
+ }
301
+ }
302
+ else {
303
+ new_element.claim_limit_from = new_element.limit_from;
304
+ }
305
+ }
306
+ if (!isNaN(+new_element.limit_to)) {
307
+ if (this.coreFunctionService.isNotBlank(new_element.claim_percent)) {
308
+ new_element.claim_limit_to = (+new_element.limit_to) * (new_element.claim_percent) / 100;
309
+ if (new_element.claim_unit) {
310
+ new_element.claim_limit_to = new_element.claim_limit_to + " " + new_element.claim_unit;
311
+ }
312
+ }
313
+ else {
314
+ new_element.claim_limit_to = new_element.limit_to;
315
+ }
316
+ }
317
+ }
318
+ }
319
+ calculatePharamaParameterAmount(data, offer_rate, quantity, field_name) {
320
+ let gross_amount = this.calculateParameterAmtOnInjection(data, data["rate_per_injection"], quantity);
321
+ let effectiveTotal = this.calculateParameterAmtOnInjection(data, offer_rate, quantity);
322
+ let dis_amt = gross_amount - effectiveTotal;
323
+ switch (field_name) {
324
+ case 'discount_amount':
325
+ effectiveTotal = gross_amount - data['discount_amount'];
326
+ dis_amt = data['discount_amount'];
327
+ break;
328
+ default:
329
+ }
330
+ let discount_percent = 0;
331
+ if (gross_amount > 0) {
332
+ discount_percent = (dis_amt / gross_amount) * 100;
333
+ }
334
+ else {
335
+ discount_percent = 0;
336
+ }
337
+ this.populateParameterAmount(data, effectiveTotal, discount_percent, dis_amt, quantity, gross_amount);
338
+ }
339
+ calculateParameterAmtOnInjection(data, rate, quantity) {
340
+ let totalInjection = data.no_of_injection;
341
+ if (!this.coreFunctionService.isNotBlank(totalInjection)) {
342
+ totalInjection = 0;
343
+ }
344
+ if (!this.coreFunctionService.isNotBlank(rate)) {
345
+ rate = 0;
346
+ }
347
+ let rate_per_injection = rate;
348
+ let totalAmount = this.getDecimalAmount(totalInjection * rate_per_injection);
349
+ if (data.no_of_injection2 > 0) {
350
+ let no_of_injection2 = data.no_of_injection2;
351
+ if (quantity > 1 && no_of_injection2 > 0) {
352
+ totalInjection = this.getDecimalAmount(totalInjection + (quantity - 1) * no_of_injection2);
353
+ totalAmount = this.getDecimalAmount(totalInjection * rate_per_injection);
354
+ }
355
+ }
356
+ else if (data.no_of_injection > 0 && data.no_of_injection2 <= 0) {
357
+ let no_of_injection = data.no_of_injection;
358
+ if (quantity > 1 && no_of_injection > 0) {
359
+ totalInjection = this.getDecimalAmount(totalInjection + (quantity - 1) * no_of_injection);
360
+ totalAmount = this.getDecimalAmount(totalInjection * rate_per_injection);
361
+ }
362
+ }
363
+ else {
364
+ totalAmount = this.getDecimalAmount(quantity * totalInjection * rate_per_injection);
365
+ }
366
+ // data["quotation_effective_rate"]= totalAmount;
367
+ // data["total"] = totalAmount;
368
+ // data["discount_amount"] = this.getDecimalAmount((data.total* data.discount_percent)/100);
369
+ // data["net_amount"] = this.getDecimalAmount(data.total- data.discount_amount);
370
+ data["total_injection"] = totalInjection;
371
+ return totalAmount;
372
+ }
373
+ getDiscountPercentage(current_disount, discount_amount, gross_amount, quantity) {
374
+ if (quantity > 0 && gross_amount > 0) {
375
+ current_disount = discount_amount * 100 / gross_amount;
376
+ }
377
+ return current_disount;
378
+ }
379
+ calculateQuotationParameterAmountForAutomotiveLims(data, fieldName) {
380
+ let quantity = 0;
381
+ let discount_percent = 0;
382
+ let cost_rate = 0;
383
+ let net_amount = 0;
384
+ let param_quantom = 0;
385
+ let Base_quotation_rate = 0;
386
+ let incoming_field = fieldName;
387
+ let gross_amount = 0;
388
+ let dis_amt = 0;
389
+ switch (incoming_field) {
390
+ case "parameter_quantum":
391
+ let parameterQuantum = data.parameter_quantum;
392
+ if (!this.coreFunctionService.isNotBlank(parameterQuantum)) {
393
+ parameterQuantum = 0;
394
+ }
395
+ data['quantum_rate'] = (+data.quotation_rate) * (+parameterQuantum);
396
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
397
+ net_amount = +data.quotation_effective_rate;
398
+ if (data.discount_percent) {
399
+ let discount = ((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
400
+ data['discount_amount'] = discount;
401
+ net_amount = (+data.quotation_effective_rate) - discount;
402
+ }
403
+ data['net_amount'] = net_amount;
404
+ break;
405
+ case "qty":
406
+ let quantity = data.qty;
407
+ if (!this.coreFunctionService.isNotBlank(quantity)) {
408
+ quantity = 0;
409
+ }
410
+ data['quotation_effective_rate'] = (+quantity) * (+data.quantum_rate);
411
+ if (data.discount_percent) {
412
+ let discount = this.getDecimalAmount((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
413
+ data['discount_amount'] = discount;
414
+ }
415
+ net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - data['discount_amount']);
416
+ data['net_amount'] = net_amount;
417
+ data['total'] = +data.quotation_effective_rate;
418
+ data['qty'] = data.qty;
419
+ break;
420
+ case "discount_percent":
421
+ let discount_per = data.discount_percent;
422
+ if (!this.coreFunctionService.isNotBlank(discount_per)) {
423
+ discount_per = 0;
424
+ }
425
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
426
+ net_amount = +data.quotation_effective_rate;
427
+ let discount = this.getDecimalAmount(((+data.quotation_effective_rate) * (+discount_per)) / 100);
428
+ data['discount_amount'] = discount;
429
+ net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
430
+ data['net_amount'] = net_amount;
431
+ data['total'] = +data.quotation_effective_rate;
432
+ data['qty'] = data.qty;
433
+ data['discount_percent'] = +discount_per;
434
+ break;
435
+ case "discount_amount":
436
+ let discount_amt = data.discount_amount;
437
+ if (!this.coreFunctionService.isNotBlank(discount_amt)) {
438
+ discount_amt = 0;
439
+ }
440
+ net_amount = (+data.quotation_effective_rate) - (+discount_amt);
441
+ let discount_perc = this.getDecimalAmount(((+discount_amt) * 100) / (+data.quotation_effective_rate));
442
+ data['net_amount'] = net_amount;
443
+ data['discount_percent'] = discount_perc;
444
+ data['discount_amount'] = +data['discount_amount'];
445
+ break;
446
+ default:
447
+ }
448
+ if (data['qty'] > 0) {
449
+ data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
450
+ }
451
+ else {
452
+ data['per_sample_net_rate'] = 0;
453
+ }
454
+ this.sanitizeParameterAmount(data);
455
+ }
456
+ sanitizeParameterAmount(data) {
457
+ let amountFields = [
458
+ 'quotation_effective_rate',
459
+ 'discount_amount',
460
+ 'discount_percent',
461
+ 'net_amount',
462
+ 'total',
463
+ 'per_sample_net_rate'
464
+ ];
465
+ amountFields.forEach(column => {
466
+ data[column] = this.getDecimalAmount(data[column]);
467
+ if (typeof (data[column]) != 'number') {
468
+ data[column] = 0;
469
+ }
470
+ });
471
+ }
472
+ calculateQuotationParameterAmountForLims(data, fieldName) {
473
+ let quantity = 0;
474
+ let discount_percent = 0;
475
+ let cost_rate = 0;
476
+ let net_amount = 0;
477
+ let discount_amount = 0;
478
+ let param_quantom = 0;
479
+ let Base_quotation_rate = 0;
480
+ let incoming_field = fieldName;
481
+ let sale_rate = data['sale_rate'];
482
+ let gross_amount = 0;
483
+ let effectiveTotal = 0;
484
+ let dis_amt = 0;
485
+ quantity = data.qty;
486
+ if (!this.coreFunctionService.isNotBlank(quantity)) {
487
+ quantity = 0;
488
+ }
489
+ gross_amount = quantity * sale_rate;
490
+ switch (incoming_field) {
491
+ case "qty":
492
+ effectiveTotal = (+quantity) * (+data.offer_rate);
493
+ if (data.no_of_injection > 0) {
494
+ this.calculatePharamaParameterAmount(data, data.offer_rate, quantity);
495
+ }
496
+ else {
497
+ dis_amt = gross_amount - effectiveTotal;
498
+ if (gross_amount > 0) {
499
+ discount_percent = this.getDecimalAmount(100 * dis_amt / gross_amount);
500
+ }
501
+ else {
502
+ discount_percent = 0;
503
+ }
504
+ net_amount = effectiveTotal;
505
+ this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
506
+ }
507
+ break;
508
+ case "discount_percent":
509
+ discount_percent = data.discount_percent;
510
+ if (!this.coreFunctionService.isNotBlank(discount_percent)) {
511
+ discount_percent = 0;
512
+ }
513
+ if (data.no_of_injection > 0) {
514
+ let offeringRate = data.rate_per_injection * (1 - discount_percent / 100);
515
+ this.calculatePharamaParameterAmount(data, offeringRate, quantity);
516
+ }
517
+ else {
518
+ dis_amt = this.getDecimalAmount(((+gross_amount) * (+discount_percent)) / 100);
519
+ net_amount = this.getDecimalAmount((+gross_amount) - dis_amt);
520
+ this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
521
+ }
522
+ break;
523
+ case "unit_price":
524
+ discount_percent = data.discount_percent;
525
+ if (!this.coreFunctionService.isNotBlank(discount_percent)) {
526
+ discount_percent = 0;
527
+ }
528
+ if (data.no_of_injection > 0) {
529
+ let offeringRate = data.rate_per_injection * (1 - discount_percent / 100);
530
+ this.calculatePharamaParameterAmount(data, offeringRate, quantity);
531
+ }
532
+ else {
533
+ dis_amt = this.getDecimalAmount(((+gross_amount) * (+discount_percent)) / 100);
534
+ net_amount = this.getDecimalAmount((+gross_amount) - dis_amt);
535
+ this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
536
+ }
537
+ break;
538
+ case "offer_rate":
539
+ let offer_rate = data.offer_rate;
540
+ if (!this.coreFunctionService.isNotBlank(offer_rate)) {
541
+ offer_rate = 0;
542
+ }
543
+ if (data.no_of_injection > 0) {
544
+ this.calculatePharamaParameterAmount(data, offer_rate, quantity);
545
+ }
546
+ else {
547
+ if (offer_rate) {
548
+ effectiveTotal = quantity * offer_rate;
549
+ dis_amt = gross_amount - effectiveTotal;
550
+ if (gross_amount > 0) {
551
+ discount_percent = this.getDecimalAmount(100 * dis_amt / gross_amount);
552
+ }
553
+ else {
554
+ discount_percent = 0;
555
+ }
556
+ net_amount = gross_amount - dis_amt;
557
+ }
558
+ this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
559
+ data["offer_rate"] = offer_rate;
560
+ }
561
+ break;
562
+ case "discount_amount":
563
+ dis_amt = data.discount_amount;
564
+ if (!this.coreFunctionService.isNotBlank(dis_amt)) {
565
+ dis_amt = 0;
566
+ }
567
+ if (data.no_of_injection > 0) {
568
+ if (!this.coreFunctionService.isNotBlank(data['rate_per_injection'])) {
569
+ data['rate_per_injection'] = 0;
570
+ }
571
+ let offeringRate = data['rate_per_injection'] - dis_amt;
572
+ this.calculatePharamaParameterAmount(data, offeringRate, quantity, incoming_field);
573
+ }
574
+ else {
575
+ effectiveTotal = gross_amount - dis_amt;
576
+ net_amount = effectiveTotal;
577
+ if (gross_amount > 0) {
578
+ discount_percent = this.getDecimalAmount(((+dis_amt) * 100) / (+gross_amount));
579
+ }
580
+ else {
581
+ discount_percent = 0;
582
+ }
583
+ this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
584
+ }
585
+ break;
586
+ }
587
+ }
588
+ calculate_invoice_amount_row_wise(data, fieldName) {
589
+ let total = 0;
590
+ let disc_per = 0;
591
+ let disc_amt = 0;
592
+ let final_amt = 0;
593
+ let net_amount = 0;
594
+ let surcharge = 0;
595
+ if (this.coreFunctionService.isNotBlank(data.total)) {
596
+ total = data.total;
597
+ }
598
+ if (this.coreFunctionService.isNotBlank(data.discount_amount)) {
599
+ disc_amt = data.discount_amount;
600
+ }
601
+ if (this.coreFunctionService.isNotBlank(data.sampling_charge)) {
602
+ surcharge = data.sampling_charge;
603
+ }
604
+ if (this.coreFunctionService.isNotBlank(data.discount_percent)) {
605
+ disc_per = data.discount_percent;
606
+ }
607
+ let incoming_field = fieldName;
608
+ switch (incoming_field) {
609
+ case "total":
610
+ disc_amt = disc_per * total / 100;
611
+ net_amount = total - disc_amt;
612
+ final_amt = surcharge + net_amount;
613
+ // disc_per = (disc_amt/(data.total))*100;
614
+ break;
615
+ case "discount_percent":
616
+ disc_amt = disc_per * total / 100;
617
+ net_amount = total - disc_amt;
618
+ final_amt = surcharge + net_amount;
619
+ break;
620
+ case "discount_amount":
621
+ disc_per = (100 * disc_amt) / total;
622
+ net_amount = total - disc_amt;
623
+ final_amt = surcharge + net_amount;
624
+ break;
625
+ case "sampling_charge":
626
+ disc_per = (100 * disc_amt) / total;
627
+ net_amount = total - disc_amt;
628
+ final_amt = surcharge + net_amount;
629
+ break;
630
+ }
631
+ data["discount_percent"] = disc_per;
632
+ data["discount_amount"] = disc_amt;
633
+ data["final_amount"] = final_amt;
634
+ data["net_amount"] = net_amount;
635
+ }
636
+ calculateNetAmount(data, fieldName, grid_cell_function) {
637
+ switch (grid_cell_function) {
638
+ case "calculateQuotationParameterAmountForAutomotiveLims":
639
+ this.calculateQuotationParameterAmountForAutomotiveLims(data, fieldName["field_name"]);
640
+ break;
641
+ case "calculateQuotationParameterAmountForLims":
642
+ this.calculateQuotationParameterAmountForLims(data, fieldName["field_name"]);
643
+ break;
644
+ case "calculateQuotationParameterAmountForLimsWithSubsequent":
645
+ this.calculateQuotationParameterAmountForLimsWithSubsequent(data, fieldName["field_name"]);
646
+ break;
647
+ case "calculate_pharma_claim_values":
648
+ this.calculate_pharma_claim_values(data);
649
+ break;
650
+ case "calculate_invoice_amount_row_wise":
651
+ this.calculate_invoice_amount_row_wise(data, fieldName["field_name"]);
652
+ break;
653
+ default:
654
+ this.legacyQuotationParameterCalculation(data, fieldName["field_name"]);
655
+ }
656
+ }
657
+ calculateQquoteAmount(templateValue, field) {
658
+ var total = 0;
659
+ let discount_percent = 0;
660
+ let net_amount = 0;
661
+ let sampling_amount = 0;
662
+ let final_amount = 0;
663
+ let discount_amount = 0;
664
+ let quotation_param_methods = [];
665
+ let unit_price = 0;
666
+ if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
667
+ templateValue['quotation_param_methods'].forEach((element) => {
668
+ total = total + element.quotation_effective_rate;
669
+ });
670
+ }
671
+ if (templateValue['sampling_charge'] && templateValue['sampling_charge'] != null) {
672
+ sampling_amount = templateValue['sampling_charge'];
673
+ }
674
+ if (total > 0) {
675
+ if (templateValue[field.field_name] != '') {
676
+ if (field.field_name === 'discount_percent') {
677
+ discount_percent = templateValue[field.field_name];
678
+ discount_amount = total * discount_percent / 100;
679
+ net_amount = total - discount_amount;
680
+ quotation_param_methods = [];
681
+ templateValue['quotation_param_methods'].forEach((element) => {
682
+ const new_element = { ...element };
683
+ new_element.discount_percent = this.getDecimalAmount(+discount_percent);
684
+ this.calculateNetAmount(new_element, "qty", "");
685
+ quotation_param_methods.push(new_element);
686
+ });
687
+ templateValue['quotation_param_methods'].setValue(quotation_param_methods);
688
+ this.calculateQquoteAmount(templateValue, { field_name: "quotation_param_methods" });
689
+ }
690
+ else if (field.field_name === 'net_amount') {
691
+ discount_percent = 0;
692
+ net_amount = templateValue[field.field_name];
693
+ discount_amount = total - net_amount;
694
+ discount_percent = this.getDecimalAmount(100 * discount_amount / total);
695
+ templateValue["discount_percent"] = discount_percent;
696
+ let updatedData = this.quote_amount_via_discount_percent(templateValue["quotation_param_methods"], templateValue);
697
+ updatedData[field.field_name] = net_amount;
698
+ return updatedData;
699
+ }
700
+ else if (field.field_name === 'quotation_param_methods') {
701
+ let list = templateValue[field.field_name];
702
+ list.forEach((element) => {
703
+ const new_element = { ...element };
704
+ discount_amount = discount_amount + element.discount_amount;
705
+ net_amount = net_amount + element.net_amount;
706
+ });
707
+ discount_percent = 100 * discount_amount / total;
708
+ }
709
+ else {
710
+ total = templateValue['total'];
711
+ discount_amount = templateValue['discount_amount'];
712
+ net_amount = templateValue['net_amount'];
713
+ discount_percent = templateValue['discount_percent'];
714
+ }
715
+ final_amount = net_amount + sampling_amount;
716
+ unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
717
+ quotation_param_methods = [];
718
+ templateValue['quotation_param_methods'].forEach((element) => {
719
+ const new_element = { ...element };
720
+ new_element.discount_percent = this.getDecimalAmount(+element.discount_percent);
721
+ new_element.net_amount = this.getDecimalAmount(+(element.quotation_effective_rate * (1 - element.discount_percent / 100)));
722
+ new_element.discount_amount = this.getDecimalAmount(+(element.quotation_effective_rate * element.discount_percent / 100));
723
+ if (new_element.qty > 0) {
724
+ new_element.per_sample_net_rate = this.getDecimalAmount(+(new_element.net_amount / new_element.qty));
725
+ }
726
+ quotation_param_methods.push(new_element);
727
+ });
728
+ templateValue['total'] = total;
729
+ templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
730
+ templateValue['net_amount'] = this.getDecimalAmount(net_amount);
731
+ templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
732
+ templateValue['final_amount'] = this.getDecimalAmount(final_amount);
733
+ templateValue['unit_price'] = unit_price;
734
+ if (quotation_param_methods.length > 0) {
735
+ templateValue['quotation_param_methods'] = quotation_param_methods;
736
+ }
737
+ }
738
+ }
739
+ return templateValue;
740
+ }
741
+ calculate_lims_invoice_with_manual_items(templateValue, lims_segment, calculate_on_field) {
742
+ let calculateOnField = "";
743
+ if (calculate_on_field == null || calculate_on_field == '') {
744
+ calculateOnField = 'manualItemsList';
745
+ }
746
+ else {
747
+ calculateOnField = calculate_on_field['field_name'];
748
+ }
749
+ let surcharge = 0;
750
+ let gross_amount = 0;
751
+ let discount_percent = 0;
752
+ let discount_amount = 0;
753
+ let taxable_amount = 0;
754
+ let net_amount = 0;
755
+ if (this.coreFunctionService.isNotBlank(templateValue[calculateOnField]) && templateValue[calculateOnField].length > 0) {
756
+ templateValue[calculateOnField].forEach((element) => {
757
+ if (this.coreFunctionService.isNotBlank(element.sampleTotal)) {
758
+ // gross_amount=gross_amount+element.gross_amount
759
+ gross_amount = gross_amount + element.sampleTotal;
760
+ }
761
+ if (this.coreFunctionService.isNotBlank(element.sampling_charge)) {
762
+ // surcharge=surcharge+element.surcharge
763
+ surcharge = surcharge + element.sampling_charge;
764
+ }
765
+ if (this.coreFunctionService.isNotBlank(element.discount_amount)) {
766
+ discount_amount = discount_amount + element.discount_amount;
767
+ }
768
+ if (this.coreFunctionService.isNotBlank(element.net_amount)) {
769
+ net_amount = net_amount + element.net_amount;
770
+ }
771
+ else {
772
+ net_amount = net_amount + element.sampleTotal;
773
+ }
774
+ taxable_amount = net_amount + surcharge;
775
+ });
776
+ }
777
+ templateValue = this.update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount);
778
+ return templateValue;
779
+ }
780
+ calculate_lims_invoice_with_po_items(templateValue, lims_segment, calculate_on_field) {
781
+ return this.calculate_lims_invoice(templateValue, lims_segment, 'po_items');
782
+ }
783
+ calculate_manual_row_item(templateValue, lims_segment, calculate_on_field) {
784
+ var manualItemsList = templateValue['manualItemsList'];
785
+ var qty = manualItemsList['sampleQty'];
786
+ var cost = manualItemsList['sampleCost'];
787
+ if (qty && cost) {
788
+ manualItemsList['sampleTotal'] = qty * cost;
789
+ }
790
+ else {
791
+ manualItemsList['sampleTotal'] = 0;
792
+ }
793
+ manualItemsList['discount_amount'] = 0;
794
+ manualItemsList['net_amount'] = manualItemsList['sampleTotal'];
795
+ templateValue['manualItemsList'] = manualItemsList;
796
+ return templateValue;
797
+ }
798
+ calculate_po_row_item(templateValue, lims_segment, calculate_on_field) {
799
+ var po_items = templateValue['po_items'];
800
+ var qty = po_items['qty'];
801
+ var cost = po_items['cost'];
802
+ if (qty && cost) {
803
+ po_items['total'] = qty * cost;
804
+ }
805
+ else {
806
+ po_items['total'] = 0;
807
+ }
808
+ po_items['discount_amount'] = 0;
809
+ po_items['net_amount'] = po_items['total'];
810
+ templateValue['po_items'] = po_items;
811
+ return templateValue;
812
+ }
813
+ credit_note_invoice_calculation(templateValue, lims_segment, calculate_on_field) {
814
+ let surcharge = 0;
815
+ let gross_amount = 0;
816
+ let discount_percent = 0;
817
+ let discount_amount = 0;
818
+ let taxable_amount = 0;
819
+ let net_amount = 0;
820
+ let gst_amount = 0;
821
+ let cgst_amount = 0;
822
+ let sgst_amount = 0;
823
+ let igst_amount = 0;
824
+ let tax_amount = 0;
825
+ let sez_amount = 0;
826
+ let net_payble = 0;
827
+ let igst_percent = 0;
828
+ let gst_percent = 0;
829
+ let sez_percent = 0;
830
+ let cgst_percent = 0;
831
+ let sgst_percent = 0;
832
+ let tax_percentage = 0;
833
+ let tax_type = templateValue['tax_type'];
834
+ let parentObjectValue = templateValue[calculate_on_field.parent];
835
+ if (this.coreFunctionService.isNotBlank(parentObjectValue)) {
836
+ if (this.coreFunctionService.isNotBlank(parentObjectValue[calculate_on_field.field_name])) {
837
+ taxable_amount = parentObjectValue[calculate_on_field.field_name];
838
+ }
839
+ }
840
+ if (this.coreFunctionService.isNotBlank(templateValue.tax_percentage)) {
841
+ tax_percentage = templateValue.tax_percentage;
842
+ }
843
+ if ((tax_type == null || tax_type == undefined || tax_type == 'NA') && tax_percentage == 0) {
844
+ net_payble = taxable_amount;
845
+ }
846
+ else {
847
+ switch (tax_type) {
848
+ case "GST":
849
+ gst_amount = taxable_amount * tax_percentage / 100;
850
+ gst_percent = tax_percentage;
851
+ cgst_percent = gst_percent / 2;
852
+ sgst_percent = gst_percent / 2;
853
+ cgst_amount = gst_amount / 2;
854
+ sgst_amount = gst_amount / 2;
855
+ net_payble = taxable_amount + gst_amount;
856
+ tax_amount = gst_amount;
857
+ igst_amount = 0;
858
+ igst_percent = 0;
859
+ break;
860
+ case "IGST":
861
+ igst_amount = taxable_amount * tax_percentage / 100;
862
+ igst_percent = tax_percentage;
863
+ net_payble = taxable_amount + igst_amount;
864
+ tax_amount = igst_amount;
865
+ break;
866
+ default:
867
+ }
868
+ }
869
+ if (gross_amount > 0) {
870
+ discount_percent = this.getDecimalAmount(100 * discount_amount / gross_amount);
871
+ }
872
+ let total = {};
873
+ total['surcharge'] = this.getDecimalAmount(surcharge);
874
+ total['igst_percent'] = this.getDecimalAmount(igst_percent);
875
+ total['gst_percent'] = this.getDecimalAmount(gst_percent);
876
+ total['cgst_percent'] = this.getDecimalAmount(cgst_percent);
877
+ total['sgst_percent'] = this.getDecimalAmount(sgst_percent);
878
+ total['sez_percent'] = this.getDecimalAmount(sez_percent);
879
+ total['gross_amount'] = this.getDecimalAmount(gross_amount);
880
+ total['discount_percent'] = this.getDecimalAmount(discount_percent);
881
+ total['discount_amount'] = this.getDecimalAmount(discount_amount);
882
+ total['taxable_amount'] = this.getDecimalAmount(taxable_amount);
883
+ total['gst_amount'] = this.getDecimalAmount(gst_amount);
884
+ total['cgst_amount'] = this.getDecimalAmount(cgst_amount);
885
+ total['sgst_amount'] = this.getDecimalAmount(sgst_amount);
886
+ total['igst_amount'] = this.getDecimalAmount(igst_amount);
887
+ total['tax_amount'] = this.getDecimalAmount(tax_amount);
888
+ total['sez_amount'] = this.getDecimalAmount(sez_amount);
889
+ // total['net_amount'] = this.getDecimalAmount(net_amount);
890
+ total['net_payble'] = this.getDecimalAmount(net_payble);
891
+ templateValue = {};
892
+ templateValue['total_amount'] = total;
893
+ return templateValue;
894
+ }
895
+ calculate_lims_invoice(templateValue, lims_segment, calculate_on_field) {
896
+ if (calculate_on_field == null || calculate_on_field == '') {
897
+ calculate_on_field = 'items_list';
898
+ }
899
+ let surcharge = 0;
900
+ let gross_amount = 0;
901
+ let discount_percent = 0;
902
+ let discount_amount = 0;
903
+ let taxable_amount = 0;
904
+ let net_amount = 0;
905
+ if (this.coreFunctionService.isNotBlank(templateValue[calculate_on_field]) && templateValue[calculate_on_field].length > 0) {
906
+ templateValue[calculate_on_field].forEach((element) => {
907
+ if (this.coreFunctionService.isNotBlank(element.total)) {
908
+ // gross_amount=gross_amount+element.gross_amount
909
+ gross_amount = gross_amount + element.total;
910
+ }
911
+ if (this.coreFunctionService.isNotBlank(element.sampling_charge)) {
912
+ // surcharge=surcharge+element.surcharge
913
+ surcharge = surcharge + element.sampling_charge;
914
+ }
915
+ if (this.coreFunctionService.isNotBlank(element.discount_amount)) {
916
+ discount_amount = discount_amount + element.discount_amount;
917
+ }
918
+ if (this.coreFunctionService.isNotBlank(element.net_amount)) {
919
+ net_amount = net_amount + element.net_amount;
920
+ }
921
+ else {
922
+ net_amount = net_amount + element.total;
923
+ }
924
+ taxable_amount = net_amount + surcharge;
925
+ });
926
+ }
927
+ templateValue = this.update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount);
928
+ return templateValue;
929
+ }
930
+ calculate_lims_invoice_extra_amount(templateValue, lims_segment, calculate_on_field) {
931
+ if (calculate_on_field == null || calculate_on_field == '') {
932
+ calculate_on_field = 'items_list';
933
+ }
934
+ let surcharge = 0;
935
+ let gross_amount = 0;
936
+ let discount_percent = 0;
937
+ let discount_amount = 0;
938
+ let taxable_amount = 0;
939
+ let net_amount = 0;
940
+ let extraAmount = 0;
941
+ if (this.coreFunctionService.isNotBlank(templateValue[calculate_on_field]) && templateValue[calculate_on_field].length > 0) {
942
+ templateValue[calculate_on_field].forEach((element) => {
943
+ if (this.coreFunctionService.isNotBlank(element.total)) {
944
+ // gross_amount=gross_amount+element.gross_amount
945
+ gross_amount = gross_amount + element.total;
946
+ }
947
+ if (this.coreFunctionService.isNotBlank(element.sampling_charge)) {
948
+ // surcharge=surcharge+element.surcharge
949
+ surcharge = surcharge + element.sampling_charge;
950
+ }
951
+ if (this.coreFunctionService.isNotBlank(element.discount_amount)) {
952
+ discount_amount = discount_amount + element.discount_amount;
953
+ }
954
+ if (this.coreFunctionService.isNotBlank(element.net_amount)) {
955
+ net_amount = net_amount + element.net_amount;
956
+ }
957
+ else {
958
+ net_amount = net_amount + element.total;
959
+ }
960
+ if (element && element.extra_amount) {
961
+ extraAmount = Number(extraAmount) + Number(element.extra_amount);
962
+ }
963
+ taxable_amount = net_amount + surcharge + extraAmount;
964
+ });
965
+ }
966
+ templateValue = this.update_invoice_totatl_extra_amount(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, extraAmount, taxable_amount);
967
+ return templateValue;
968
+ }
969
+ getPercent(templateValue, parent, field) {
970
+ const calculateValue = {};
971
+ if (field && field.calSourceTarget && field.calSourceTarget.length >= 1) {
972
+ let source = field.calSourceTarget[0].source;
973
+ let target = field.calSourceTarget[0].target;
974
+ let sourceValue = this.commonFunctionService.getObjectValue(source, templateValue);
975
+ if (sourceValue && sourceValue != '') {
976
+ if (typeof sourceValue == 'number') {
977
+ let fileName = field.field_name;
978
+ let percent;
979
+ if (parent != '') {
980
+ percent = templateValue[parent.field_name][fileName];
981
+ }
982
+ else {
983
+ percent = templateValue[fileName];
984
+ }
985
+ if (typeof sourceValue == 'number' && percent && percent >= 1) {
986
+ let percentValue = sourceValue * percent / 100;
987
+ let targetFields = target.split('.');
988
+ if (targetFields && targetFields.length == 2) {
989
+ const parent = targetFields[0];
990
+ const child = targetFields[1];
991
+ calculateValue[parent] = {};
992
+ calculateValue[parent][child] = percentValue;
993
+ }
994
+ else {
995
+ const child = targetFields[0];
996
+ calculateValue[child] = percentValue;
997
+ }
998
+ }
999
+ }
1000
+ else {
1001
+ this.notificationService.notify('bg-danger', 'Source Value is not a number.');
1002
+ }
1003
+ }
1004
+ else {
1005
+ this.notificationService.notify('bg-danger', 'Source Field is Required.');
1006
+ }
1007
+ }
1008
+ return calculateValue;
1009
+ }
1010
+ calculate_quotation(templateValue, lims_segment, field) {
1011
+ var total = 0;
1012
+ let discount_percent = 0;
1013
+ let net_amount = 0;
1014
+ let sampling_amount = 0;
1015
+ let final_amount = 0;
1016
+ let discount_amount = 0;
1017
+ let quotation_param_methods = [];
1018
+ let unit_price = 0;
1019
+ let paramArray = [];
1020
+ let gross_amount = 0;
1021
+ let field_name = field.field_name;
1022
+ let qty = 0;
1023
+ let product_wise_pricing = templateValue['product_wise_pricing'];
1024
+ let current_disount = 0;
1025
+ if (this.coreFunctionService.isNotBlank(templateValue['discount_percent'])) {
1026
+ current_disount = templateValue['discount_percent'];
1027
+ }
1028
+ if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
1029
+ qty = templateValue.qty;
1030
+ }
1031
+ if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
1032
+ templateValue['quotation_param_methods'].forEach((element) => {
1033
+ let data = { ...element };
1034
+ paramArray.push(data);
1035
+ });
1036
+ }
1037
+ if (templateValue['sampling_charge'] && templateValue['sampling_charge'] != null) {
1038
+ sampling_amount = templateValue['sampling_charge'];
1039
+ }
1040
+ // if(gross_amount>0){
1041
+ if (true) {
1042
+ switch (field_name) {
1043
+ case 'parameter_array':
1044
+ unit_price = 0;
1045
+ if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
1046
+ unit_price = templateValue.unit_price;
1047
+ }
1048
+ if (product_wise_pricing) {
1049
+ net_amount = qty * unit_price;
1050
+ paramArray.forEach((data) => {
1051
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "qty");
1052
+ gross_amount = gross_amount + data['total'];
1053
+ });
1054
+ discount_amount = gross_amount - net_amount;
1055
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1056
+ paramArray.forEach((data) => {
1057
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1058
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "discount_percent");
1059
+ });
1060
+ }
1061
+ else {
1062
+ if (paramArray.length > 0) {
1063
+ discount_amount = 0;
1064
+ net_amount = 0;
1065
+ total = 0;
1066
+ gross_amount = 0;
1067
+ if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
1068
+ qty = templateValue.qty;
1069
+ }
1070
+ paramArray.forEach((data) => {
1071
+ if (lims_segment == 'standard') {
1072
+ data['qty'] = qty;
1073
+ this.calculateParameterLimsSegmentWise(lims_segment, data, 'qty');
1074
+ }
1075
+ gross_amount = gross_amount + data['total'];
1076
+ net_amount = net_amount + data['net_amount'];
1077
+ discount_amount = discount_amount + data['discount_amount'];
1078
+ });
1079
+ }
1080
+ }
1081
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1082
+ templateValue['discount_amount'] = discount_amount;
1083
+ templateValue['net_amount'] = net_amount;
1084
+ templateValue['discount_percent'] = discount_percent;
1085
+ break;
1086
+ case 'discount_percent':
1087
+ discount_percent = templateValue[field_name];
1088
+ paramArray.forEach((data) => {
1089
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1090
+ this.calculateParameterLimsSegmentWise(lims_segment, data, field_name);
1091
+ gross_amount = gross_amount + data['total'];
1092
+ });
1093
+ discount_amount = gross_amount * discount_percent / 100;
1094
+ net_amount = gross_amount - discount_amount;
1095
+ templateValue['discount_amount'] = discount_amount;
1096
+ templateValue['net_amount'] = net_amount;
1097
+ templateValue['discount_percent'] = discount_percent;
1098
+ break;
1099
+ case 'discount_amount':
1100
+ discount_amount = templateValue[field_name];
1101
+ paramArray.forEach((data) => {
1102
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1103
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "discount_percent");
1104
+ gross_amount = gross_amount + data['total'];
1105
+ });
1106
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1107
+ net_amount = gross_amount - discount_amount;
1108
+ templateValue['discount_amount'] = discount_amount;
1109
+ templateValue['net_amount'] = net_amount;
1110
+ templateValue['discount_percent'] = discount_percent;
1111
+ break;
1112
+ case 'net_amount':
1113
+ discount_percent = 0;
1114
+ net_amount = templateValue[field_name];
1115
+ paramArray.forEach((data) => {
1116
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1117
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "qty");
1118
+ gross_amount = gross_amount + data['total'];
1119
+ });
1120
+ discount_amount = gross_amount - net_amount;
1121
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1122
+ paramArray.forEach((data) => {
1123
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1124
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "discount_percent");
1125
+ });
1126
+ templateValue["discount_percent"] = discount_percent;
1127
+ templateValue["discount_amount"] = discount_amount;
1128
+ templateValue['net_amount'] = net_amount;
1129
+ break;
1130
+ case 'unit_price':
1131
+ unit_price = 0;
1132
+ if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
1133
+ unit_price = templateValue.unit_price;
1134
+ }
1135
+ net_amount = qty * unit_price;
1136
+ paramArray.forEach((data) => {
1137
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1138
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "qty");
1139
+ gross_amount = gross_amount + data['total'];
1140
+ });
1141
+ discount_amount = gross_amount - net_amount;
1142
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1143
+ paramArray.forEach((data) => {
1144
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
1145
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "unit_price");
1146
+ });
1147
+ templateValue['discount_amount'] = discount_amount;
1148
+ templateValue['net_amount'] = net_amount;
1149
+ templateValue['discount_percent'] = discount_percent;
1150
+ break;
1151
+ default:
1152
+ discount_amount = 0;
1153
+ net_amount = 0;
1154
+ if (paramArray.length > 0) {
1155
+ paramArray.forEach((data) => {
1156
+ data['qty'] = qty;
1157
+ this.calculateParameterLimsSegmentWise(lims_segment, data, field_name);
1158
+ gross_amount = gross_amount + data['total'];
1159
+ net_amount = net_amount + data['net_amount'];
1160
+ discount_amount = discount_amount + data['discount_amount'];
1161
+ });
1162
+ }
1163
+ if (product_wise_pricing) {
1164
+ unit_price = templateValue["unit_price"];
1165
+ net_amount = unit_price * qty;
1166
+ discount_amount = gross_amount - net_amount;
1167
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1168
+ if (paramArray.length > 0) {
1169
+ paramArray.forEach((data) => {
1170
+ data['discount_percent'] = discount_percent;
1171
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "unit_price");
1172
+ });
1173
+ }
1174
+ }
1175
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1176
+ templateValue['discount_amount'] = discount_amount;
1177
+ templateValue['net_amount'] = net_amount;
1178
+ templateValue['discount_percent'] = discount_percent;
1179
+ }
1180
+ }
1181
+ final_amount = net_amount + sampling_amount;
1182
+ if (templateValue['qty'] > 0) {
1183
+ unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
1184
+ }
1185
+ else {
1186
+ unit_price = templateValue["unit_price"];
1187
+ }
1188
+ templateValue['total'] = gross_amount;
1189
+ templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
1190
+ templateValue['net_amount'] = this.getDecimalAmount(net_amount);
1191
+ templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
1192
+ templateValue['final_amount'] = this.getDecimalAmount(final_amount);
1193
+ templateValue['unit_price'] = unit_price;
1194
+ if (paramArray.length > 0) {
1195
+ templateValue['quotation_param_methods'] = paramArray;
1196
+ }
1197
+ return templateValue;
1198
+ }
1199
+ calculate_quotation_for_lims(templateValue, lims_segment, field) {
1200
+ var total = 0;
1201
+ let discount_percent = 0;
1202
+ let net_amount = 0;
1203
+ let sampling_amount = 0;
1204
+ let final_amount = 0;
1205
+ let discount_amount = 0;
1206
+ let quotation_param_methods = [];
1207
+ let unit_price = 0;
1208
+ let paramArray = [];
1209
+ let gross_amount = 0;
1210
+ let field_name = field.field_name;
1211
+ let qty = 0;
1212
+ let product_wise_pricing = templateValue['product_wise_pricing'];
1213
+ let current_disount = 0;
1214
+ if (this.coreFunctionService.isNotBlank(templateValue['discount_percent'])) {
1215
+ current_disount = templateValue['discount_percent'];
1216
+ }
1217
+ if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
1218
+ qty = templateValue.qty;
1219
+ }
1220
+ if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
1221
+ templateValue['quotation_param_methods'].forEach((element) => {
1222
+ let data = { ...element };
1223
+ paramArray.push(data);
1224
+ });
1225
+ }
1226
+ // if(gross_amount>0){
1227
+ if (true) {
1228
+ discount_amount = 0;
1229
+ net_amount = 0;
1230
+ if (paramArray.length > 0) {
1231
+ paramArray.forEach((data) => {
1232
+ data['qty'] = qty;
1233
+ this.calculateParameterLimsSegmentWise(lims_segment, data, field_name);
1234
+ gross_amount = gross_amount + data['total'];
1235
+ net_amount = net_amount + data['net_amount'];
1236
+ discount_amount = discount_amount + data['discount_amount'];
1237
+ });
1238
+ }
1239
+ if (product_wise_pricing) {
1240
+ unit_price = templateValue["unit_price"];
1241
+ net_amount = unit_price * qty;
1242
+ discount_amount = gross_amount - net_amount;
1243
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
1244
+ if (paramArray.length > 0) {
1245
+ paramArray.forEach((data) => {
1246
+ data['discount_percent'] = discount_percent;
1247
+ this.calculateParameterLimsSegmentWise(lims_segment, data, "unit_price");
1248
+ });
1249
+ }
1250
+ }
1251
+ }
1252
+ templateValue['total'] = gross_amount;
1253
+ templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
1254
+ templateValue['net_amount'] = this.getDecimalAmount(net_amount);
1255
+ templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
1256
+ templateValue['unit_price'] = unit_price;
1257
+ return templateValue;
1258
+ }
1259
+ calculateParameterLimsSegmentWise(lims_segment, data, fieldName) {
1260
+ switch (lims_segment) {
1261
+ case 'standard':
1262
+ this.calculateQuotationParameterAmountForLims(data, fieldName);
1263
+ break;
1264
+ case 'automotive':
1265
+ this.calculateQuotationParameterAmountForAutomotiveLims(data, fieldName);
1266
+ break;
1267
+ }
1268
+ }
1269
+ samplingAmountAddition(templateValue) {
1270
+ let net_amount = templateValue['net_amount'];
1271
+ let sampling_charge = templateValue['sampling_charge'];
1272
+ let totl = net_amount + sampling_charge;
1273
+ templateValue['final_amount'] = totl;
1274
+ return templateValue;
1275
+ }
1276
+ quote_amount_via_discount_percent(listOfParm, templateValue) {
1277
+ let discount = templateValue.discount_percent;
1278
+ let quantity = templateValue.qty;
1279
+ let updatedParamsList = [];
1280
+ listOfParm.forEach((element) => {
1281
+ const data = JSON.parse(JSON.stringify(element));
1282
+ data['discount_percent'] = discount;
1283
+ data['qty'] = quantity;
1284
+ this.calculateNetAmount(data, "discount_percent", "");
1285
+ updatedParamsList.push(data);
1286
+ });
1287
+ templateValue["quotation_param_methods"] = updatedParamsList;
1288
+ let total = templateValue["total"];
1289
+ let discount_amount = this.getDecimalAmount(total * discount / 100);
1290
+ let net_amount = total - discount_amount;
1291
+ let final_amount = net_amount + templateValue["sampling_charge"];
1292
+ let unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
1293
+ templateValue['total'] = total;
1294
+ templateValue['discount_amount'] = discount_amount;
1295
+ templateValue['net_amount'] = net_amount;
1296
+ templateValue['final_amount'] = final_amount;
1297
+ templateValue['unit_price'] = unit_price;
1298
+ return templateValue;
1299
+ }
1300
+ calculateInvoiceTotalAmount(formValue, invoiceInfos) {
1301
+ let list = invoiceInfos;
1302
+ let total = 0;
1303
+ for (let i = 0; i < list.length; i++) {
1304
+ total += list[i]['netpayableAmount'];
1305
+ }
1306
+ let lumpSumAmount = formValue['lumpSumAmount'];
1307
+ let advanceAmount = formValue['advanceAmount'];
1308
+ let toatallumsumOrAdvance = lumpSumAmount + advanceAmount;
1309
+ let totalFair = total - toatallumsumOrAdvance;
1310
+ let obj = {
1311
+ totalAmount: (total).toFixed(2),
1312
+ payAmount: (totalFair).toFixed(2)
1313
+ };
1314
+ return obj;
1315
+ }
1316
+ quote_amount_via_sample_no(templateValue, listOfParm) {
1317
+ let quantity = templateValue.qty;
1318
+ let discount = templateValue.discount_percent;
1319
+ let updatedParamsList = [];
1320
+ listOfParm.forEach((element) => {
1321
+ const data = JSON.parse(JSON.stringify(element));
1322
+ data['discount_percent'] = discount;
1323
+ data['qty'] = quantity;
1324
+ this.calculateNetAmount(data, "qty", "");
1325
+ updatedParamsList.push(data);
1326
+ });
1327
+ templateValue["quotation_param_methods"] = updatedParamsList;
1328
+ return this.calculateQquoteAmount(templateValue, { field_name: "quotation_param_methods" });
1329
+ }
1330
+ calculateInvoiceOrderAmount(templateForm, field) {
1331
+ var net_amount = 0;
1332
+ var discount_amount = 0;
1333
+ var igst_amount = 0;
1334
+ var sgst_amount = 0;
1335
+ var cgst_amount = 0;
1336
+ var netPayable = 0;
1337
+ var surcharge = 0;
1338
+ var sez_amount = 0;
1339
+ var total = 0;
1340
+ let templateValue = templateForm.getRawValue();
1341
+ if (templateValue['items_list'] != '' && templateValue['items_list'].length > 0) {
1342
+ templateValue['items_list'].forEach((element) => {
1343
+ net_amount = net_amount + element.net_amount;
1344
+ discount_amount = discount_amount + element.discount_amount;
1345
+ surcharge = surcharge + element.surcharge;
1346
+ total = total + element.total;
1347
+ });
1348
+ if (templateValue['tax_type'] != '' && templateValue['tax_type'] == "GST") {
1349
+ sgst_amount = (net_amount * templateValue['tax_percentage']) / 200;
1350
+ cgst_amount = sgst_amount;
1351
+ }
1352
+ else if (templateValue['tax_type'] != '' && templateValue['tax_type'] == "IGST") {
1353
+ igst_amount = (net_amount * templateValue['tax_percentage']) / 100;
1354
+ }
1355
+ }
1356
+ netPayable = net_amount + igst_amount + sgst_amount + cgst_amount + sez_amount;
1357
+ const fieldWithValue = {
1358
+ field: 'total_amount', value: [
1359
+ { field: 'taxable_amount', value: net_amount },
1360
+ { field: 'sgst_amount', value: sgst_amount },
1361
+ { field: 'cgst_amount', value: cgst_amount },
1362
+ { field: 'igst_amount', value: igst_amount },
1363
+ { field: 'net_payble', value: netPayable },
1364
+ { field: 'discount_amount', value: discount_amount },
1365
+ ]
1366
+ };
1367
+ return this.setValueInVieldsForChild(templateForm, fieldWithValue);
1368
+ }
1369
+ setValueInVieldsForChild(templateForm, field) {
1370
+ templateForm.controls['total_amount'].addControl('discount_amount', new UntypedFormControl(''));
1371
+ field.value.forEach((element) => {
1372
+ templateForm.controls[field.field].controls[element.field].patchValue(element.value);
1373
+ });
1374
+ return templateForm;
1375
+ }
1376
+ calculateAdditionalCost(obj) {
1377
+ let list = obj['additional_cost'];
1378
+ let sum = 0;
1379
+ let net_amt = obj['net_amount'];
1380
+ if (list != null && list.length > 0) {
1381
+ list.forEach((element) => {
1382
+ sum += +(element.amount);
1383
+ });
1384
+ }
1385
+ let final_amt = sum + net_amt;
1386
+ obj['sampling_charge'] = sum;
1387
+ obj['final_amount'] = final_amt;
1388
+ return obj;
1389
+ }
1390
+ update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount, field) {
1391
+ let gst_amount = 0;
1392
+ let cgst_amount = 0;
1393
+ let sgst_amount = 0;
1394
+ let igst_amount = 0;
1395
+ let tax_amount = 0;
1396
+ let sez_amount = 0;
1397
+ let net_payble = 0;
1398
+ let igst_percent = 0;
1399
+ let gst_percent = 0;
1400
+ let sez_percent = 0;
1401
+ let cgst_percent = 0;
1402
+ let sgst_percent = 0;
1403
+ let tax_percentage = 0;
1404
+ let tax_type = templateValue['tax_type'];
1405
+ if (this.coreFunctionService.isNotBlank(templateValue.tax_percentage)) {
1406
+ tax_percentage = templateValue.tax_percentage;
1407
+ }
1408
+ if (((tax_type == null || tax_type == undefined || tax_type == 'NA') && tax_percentage == 0) || tax_type == 'Not Applicable') {
1409
+ net_payble = taxable_amount;
1410
+ }
1411
+ else {
1412
+ switch (tax_type) {
1413
+ case "GST":
1414
+ gst_amount = taxable_amount * tax_percentage / 100;
1415
+ gst_percent = tax_percentage;
1416
+ cgst_percent = gst_percent / 2;
1417
+ sgst_percent = gst_percent / 2;
1418
+ cgst_amount = gst_amount / 2;
1419
+ sgst_amount = gst_amount / 2;
1420
+ net_payble = taxable_amount + gst_amount;
1421
+ tax_amount = gst_amount;
1422
+ igst_amount = 0;
1423
+ igst_percent = 0;
1424
+ break;
1425
+ case "IGST":
1426
+ igst_amount = taxable_amount * tax_percentage / 100;
1427
+ igst_percent = tax_percentage;
1428
+ net_payble = taxable_amount + igst_amount;
1429
+ tax_amount = igst_amount;
1430
+ break;
1431
+ default:
1432
+ }
1433
+ }
1434
+ if (gross_amount > 0) {
1435
+ discount_percent = this.getDecimalAmount(100 * discount_amount / gross_amount);
1436
+ }
1437
+ let total = {};
1438
+ total['surcharge'] = this.getDecimalAmount(surcharge);
1439
+ total['igst_percent'] = this.getDecimalAmount(igst_percent);
1440
+ total['gst_percent'] = this.getDecimalAmount(gst_percent);
1441
+ total['cgst_percent'] = this.getDecimalAmount(cgst_percent);
1442
+ total['sgst_percent'] = this.getDecimalAmount(sgst_percent);
1443
+ total['sez_percent'] = this.getDecimalAmount(sez_percent);
1444
+ total['gross_amount'] = this.getDecimalAmount(gross_amount);
1445
+ total['discount_percent'] = this.getDecimalAmount(discount_percent);
1446
+ total['discount_amount'] = this.getDecimalAmount(discount_amount);
1447
+ total['taxable_amount'] = this.getDecimalAmount(taxable_amount);
1448
+ total['gst_amount'] = this.getDecimalAmount(gst_amount);
1449
+ total['cgst_amount'] = this.getDecimalAmount(cgst_amount);
1450
+ total['sgst_amount'] = this.getDecimalAmount(sgst_amount);
1451
+ total['igst_amount'] = this.getDecimalAmount(igst_amount);
1452
+ total['tax_amount'] = this.getDecimalAmount(tax_amount);
1453
+ total['sez_amount'] = this.getDecimalAmount(sez_amount);
1454
+ total['net_amount'] = this.getDecimalAmount(net_amount);
1455
+ total['net_payble'] = this.getDecimalAmount(net_payble);
1456
+ if (field != null && field.field_name != null && field != "") {
1457
+ delete total[field.field_name];
1458
+ }
1459
+ templateValue = {};
1460
+ templateValue['total_amount'] = total;
1461
+ return templateValue;
1462
+ }
1463
+ update_invoice_totatl_extra_amount(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, extraAmount, taxable_amount, field) {
1464
+ let gst_amount = 0;
1465
+ let cgst_amount = 0;
1466
+ let sgst_amount = 0;
1467
+ let igst_amount = 0;
1468
+ let tax_amount = 0;
1469
+ let sez_amount = 0;
1470
+ let net_payble = 0;
1471
+ let igst_percent = 0;
1472
+ let gst_percent = 0;
1473
+ let sez_percent = 0;
1474
+ let cgst_percent = 0;
1475
+ let sgst_percent = 0;
1476
+ let tax_percentage = 0;
1477
+ let tax_type = templateValue['tax_type'];
1478
+ if (this.coreFunctionService.isNotBlank(templateValue.tax_percentage)) {
1479
+ tax_percentage = templateValue.tax_percentage;
1480
+ }
1481
+ if (((tax_type == null || tax_type == undefined || tax_type == 'NA') && tax_percentage == 0) || tax_type == 'Not Applicable') {
1482
+ net_payble = taxable_amount;
1483
+ }
1484
+ else {
1485
+ switch (tax_type) {
1486
+ case "GST":
1487
+ gst_amount = taxable_amount * tax_percentage / 100;
1488
+ gst_percent = tax_percentage;
1489
+ cgst_percent = gst_percent / 2;
1490
+ sgst_percent = gst_percent / 2;
1491
+ cgst_amount = gst_amount / 2;
1492
+ sgst_amount = gst_amount / 2;
1493
+ net_payble = taxable_amount + gst_amount;
1494
+ tax_amount = gst_amount;
1495
+ igst_amount = 0;
1496
+ igst_percent = 0;
1497
+ break;
1498
+ case "IGST":
1499
+ igst_amount = taxable_amount * tax_percentage / 100;
1500
+ igst_percent = tax_percentage;
1501
+ net_payble = taxable_amount + igst_amount;
1502
+ tax_amount = igst_amount;
1503
+ break;
1504
+ default:
1505
+ }
1506
+ }
1507
+ if (gross_amount > 0) {
1508
+ discount_percent = this.getDecimalAmount(100 * discount_amount / gross_amount);
1509
+ }
1510
+ let total = {};
1511
+ total['surcharge'] = this.getDecimalAmount(surcharge);
1512
+ total['igst_percent'] = this.getDecimalAmount(igst_percent);
1513
+ total['gst_percent'] = this.getDecimalAmount(gst_percent);
1514
+ total['cgst_percent'] = this.getDecimalAmount(cgst_percent);
1515
+ total['sgst_percent'] = this.getDecimalAmount(sgst_percent);
1516
+ total['sez_percent'] = this.getDecimalAmount(sez_percent);
1517
+ total['gross_amount'] = this.getDecimalAmount(gross_amount);
1518
+ total['discount_percent'] = this.getDecimalAmount(discount_percent);
1519
+ total['discount_amount'] = this.getDecimalAmount(discount_amount);
1520
+ total['taxable_amount'] = this.getDecimalAmount(taxable_amount);
1521
+ total['gst_amount'] = this.getDecimalAmount(gst_amount);
1522
+ total['cgst_amount'] = this.getDecimalAmount(cgst_amount);
1523
+ total['sgst_amount'] = this.getDecimalAmount(sgst_amount);
1524
+ total['igst_amount'] = this.getDecimalAmount(igst_amount);
1525
+ total['tax_amount'] = this.getDecimalAmount(tax_amount);
1526
+ total['sez_amount'] = this.getDecimalAmount(sez_amount);
1527
+ total['net_amount'] = this.getDecimalAmount(net_amount);
1528
+ total['net_payble'] = this.getDecimalAmount(net_payble);
1529
+ total['extraAmount'] = this.getDecimalAmount(extraAmount);
1530
+ if (field != null && field.field_name != null && field != "") {
1531
+ delete total[field.field_name];
1532
+ }
1533
+ templateValue = {};
1534
+ templateValue['total_amount'] = total;
1535
+ return templateValue;
1536
+ }
1537
+ update_invoice_total_on_custom_field(templateValue, lims_segment, field) {
1538
+ let total = templateValue['total_amount'];
1539
+ let surcharge = total['surcharge'];
1540
+ let gross_amount = total['gross_amount'];
1541
+ let discount_percent = total['discount_percent'];
1542
+ let discount_amount = total['discount_amount'];
1543
+ let taxable_amount = total['taxable_amount'];
1544
+ let net_amount = total['net_amount'];
1545
+ if (gross_amount) {
1546
+ switch (field.field_name) {
1547
+ case 'discount_percent':
1548
+ if (discount_percent != 0) {
1549
+ discount_amount = gross_amount * discount_percent / 100;
1550
+ }
1551
+ else {
1552
+ discount_amount = 0;
1553
+ }
1554
+ break;
1555
+ case 'surcharge':
1556
+ if (!surcharge) {
1557
+ surcharge = 0;
1558
+ }
1559
+ break;
1560
+ case 'discount_amount':
1561
+ if (discount_amount) {
1562
+ discount_percent = discount_amount * 100 / gross_amount;
1563
+ }
1564
+ else {
1565
+ discount_percent = 0;
1566
+ }
1567
+ break;
1568
+ }
1569
+ }
1570
+ else {
1571
+ discount_percent = 0;
1572
+ discount_amount = 0;
1573
+ }
1574
+ net_amount = gross_amount - discount_amount;
1575
+ taxable_amount = gross_amount - discount_amount + surcharge;
1576
+ templateValue = this.update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount, field);
1577
+ return templateValue;
1578
+ }
1579
+ populateParameterAmount(data, net_amount, discount_percent, discount_amount, quantity, gross_amount) {
1580
+ data['net_amount'] = this.getDecimalAmount(net_amount);
1581
+ if (data['total_injection'] && data['total_injection'] > 0) {
1582
+ data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['total_injection']);
1583
+ data["offer_rate"] = data["per_sample_net_rate"];
1584
+ }
1585
+ else if (data['qty'] > 0) {
1586
+ data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
1587
+ data["offer_rate"] = data["per_sample_net_rate"];
1588
+ }
1589
+ else {
1590
+ data['per_sample_net_rate'] = 0;
1591
+ }
1592
+ data['discount_percent'] = this.getDecimalAmount(discount_percent);
1593
+ data['discount_amount'] = this.getDecimalAmount(+discount_amount);
1594
+ data['qty'] = quantity;
1595
+ data['total'] = this.getDecimalAmount(gross_amount);
1596
+ data['quotation_effective_rate'] = this.getDecimalAmount(gross_amount);
1597
+ }
1598
+ setValueInVields(templateForm, field) {
1599
+ field.forEach((element) => {
1600
+ if (templateForm.controls[element.field] !== undefined) {
1601
+ if (typeof (element.value) == 'string') {
1602
+ templateForm.controls[element.field].setValue(element.value);
1603
+ }
1604
+ else {
1605
+ templateForm.controls[element.field].setValue(this.getDecimalAmount(element.value));
1606
+ }
1607
+ }
1608
+ });
1609
+ return templateForm;
1610
+ }
1611
+ create_professional_email(templateForm) {
1612
+ let templateValue = templateForm.getRawValue();
1613
+ let name = templateValue.name;
1614
+ let prof_email = "";
1615
+ let strt = name.substring(0, 2);
1616
+ let last = name.slice(-2);
1617
+ prof_email = strt + last + "@gmail.com";
1618
+ const fieldWithValue = [
1619
+ { field: 'prof_email', value: prof_email },
1620
+ ];
1621
+ this.setValueInVields(templateForm, fieldWithValue);
1622
+ }
1623
+ autopopulateFields(templateForm) {
1624
+ let templateValue = templateForm.getRawValue();
1625
+ let product = templateValue.product.name;
1626
+ const fieldWithValue = [
1627
+ { field: 'sample_name', value: product },
1628
+ ];
1629
+ this.setValueInVields(templateForm, fieldWithValue);
1630
+ }
1631
+ /**
1632
+ * start point for subsequet calculation for quotation
1633
+ */
1634
+ populateParameterAmountWithSubsequent(data, net_amount, discount_percent, discount_amount, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent) {
1635
+ data['net_amount'] = this.getDecimalAmount(net_amount);
1636
+ if (data['qty'] > 0) {
1637
+ data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
1638
+ }
1639
+ else {
1640
+ data['per_sample_net_rate'] = 0;
1641
+ }
1642
+ data['discount_percent'] = this.getDecimalAmount(discount_percent);
1643
+ data['discount_amount'] = this.getDecimalAmount(+discount_amount);
1644
+ if (subsequent_discount_amount || subsequent_discount_amount == 0) {
1645
+ data["subsequent_discount_amount"] = this.getDecimalAmount(subsequent_discount_amount);
1646
+ }
1647
+ if (subsequent_discount_percent || subsequent_discount_percent == 0) {
1648
+ data["subsequent_discount_percent"] = this.getDecimalAmount(subsequent_discount_percent);
1649
+ }
1650
+ data['qty'] = this.getDecimalAmount(quantity);
1651
+ data['total'] = this.getDecimalAmount(gross_amount);
1652
+ data['quotation_effective_rate'] = this.getDecimalAmount(gross_amount);
1653
+ }
1654
+ calculateQuotationParameterAmountForLimsWithSubsequent(data, fieldName) {
1655
+ let quantity = 0;
1656
+ let discount_percent = 0;
1657
+ let net_amount = 0;
1658
+ let incoming_field = fieldName;
1659
+ let sale_rate = data['sale_rate'];
1660
+ let gross_amount = 0;
1661
+ let effectiveTotal = 0;
1662
+ let dis_amt = 0;
1663
+ let subsequent_discount_amount = 0;
1664
+ let subsequent_discount_percent = 0;
1665
+ let totalDiscountAmount = 0;
1666
+ quantity = data.qty;
1667
+ if (!this.coreFunctionService.isNotBlank(quantity)) {
1668
+ quantity = 0;
1669
+ }
1670
+ if (quantity > 0) {
1671
+ if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1672
+ gross_amount = ((quantity - 1) * data.no_of_injection2) + sale_rate;
1673
+ }
1674
+ else {
1675
+ gross_amount = quantity * sale_rate;
1676
+ }
1677
+ }
1678
+ switch (incoming_field) {
1679
+ case "qty":
1680
+ //effectiveTotal = (+quantity) * (+data.offer_rate);
1681
+ if (data.subsequent_offer_rate && data.subsequent_offer_rate > 0 && data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1682
+ effectiveTotal = ((quantity - 1) * data.subsequent_offer_rate) + data.offer_rate;
1683
+ if (sale_rate > 0) {
1684
+ dis_amt = sale_rate - data.offer_rate;
1685
+ discount_percent = this.getDecimalAmount(100 * dis_amt / sale_rate);
1686
+ }
1687
+ else {
1688
+ discount_percent = 0;
1689
+ dis_amt = 0;
1690
+ }
1691
+ let subseqGrossAmount = ((quantity - 1) * data.no_of_injection2);
1692
+ let subseqEffectiveAmount = ((quantity - 1) * data.subsequent_offer_rate);
1693
+ if (subseqGrossAmount > 0) {
1694
+ subsequent_discount_amount = subseqGrossAmount - subseqEffectiveAmount;
1695
+ subsequent_discount_percent = this.getDecimalAmount(100 * subsequent_discount_amount / subseqGrossAmount);
1696
+ }
1697
+ else {
1698
+ subsequent_discount_amount = 0;
1699
+ subsequent_discount_percent = 0;
1700
+ }
1701
+ }
1702
+ else {
1703
+ if (sale_rate && sale_rate > 0) {
1704
+ effectiveTotal = quantity * data.offer_rate;
1705
+ }
1706
+ dis_amt = gross_amount - effectiveTotal;
1707
+ if (gross_amount > 0) {
1708
+ discount_percent = this.getDecimalAmount(100 * dis_amt / gross_amount);
1709
+ }
1710
+ else {
1711
+ discount_percent = 0;
1712
+ }
1713
+ }
1714
+ net_amount = effectiveTotal;
1715
+ this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
1716
+ break;
1717
+ case "discount_percent":
1718
+ case "subsequent_discount_percent":
1719
+ if (sale_rate && sale_rate > 0) {
1720
+ discount_percent = data.discount_percent;
1721
+ if (!this.coreFunctionService.isNotBlank(discount_percent)) {
1722
+ discount_percent = 0;
1723
+ }
1724
+ let effectiveGrossAmount = 0;
1725
+ if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1726
+ effectiveGrossAmount = sale_rate;
1727
+ }
1728
+ else {
1729
+ effectiveGrossAmount = quantity * sale_rate;
1730
+ }
1731
+ dis_amt = this.getDecimalAmount(((+effectiveGrossAmount) * (+discount_percent)) / 100);
1732
+ if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1733
+ data['offer_rate'] = (effectiveGrossAmount - dis_amt);
1734
+ }
1735
+ else {
1736
+ data['offer_rate'] = (effectiveGrossAmount - dis_amt) / quantity;
1737
+ }
1738
+ }
1739
+ else {
1740
+ discount_percent = 0;
1741
+ dis_amt = 0;
1742
+ }
1743
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1744
+ subsequent_discount_percent = data.subsequent_discount_percent;
1745
+ if (!this.coreFunctionService.isNotBlank(subsequent_discount_percent)) {
1746
+ subsequent_discount_percent = 0;
1747
+ }
1748
+ let subsequentGrossAmount = 0;
1749
+ if (quantity > 1) {
1750
+ subsequentGrossAmount = data.no_of_injection2 * (quantity - 1);
1751
+ }
1752
+ else {
1753
+ subsequentGrossAmount = data.no_of_injection2;
1754
+ }
1755
+ subsequent_discount_amount = this.getDecimalAmount(((+subsequentGrossAmount) * (+subsequent_discount_percent)) / 100);
1756
+ if (quantity > 1) {
1757
+ data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount) / (quantity - 1);
1758
+ }
1759
+ else {
1760
+ data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount);
1761
+ }
1762
+ }
1763
+ else {
1764
+ subsequent_discount_amount = 0;
1765
+ subsequent_discount_percent = 0;
1766
+ }
1767
+ if (quantity > 1) {
1768
+ totalDiscountAmount = subsequent_discount_amount + dis_amt;
1769
+ }
1770
+ else {
1771
+ totalDiscountAmount = dis_amt;
1772
+ }
1773
+ net_amount = this.getDecimalAmount((+gross_amount) - totalDiscountAmount);
1774
+ this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
1775
+ break;
1776
+ case "unit_price":
1777
+ if (data.sale_rate && data.sale_rate > 0) {
1778
+ discount_percent = data.discount_percent;
1779
+ if (!this.coreFunctionService.isNotBlank(discount_percent)) {
1780
+ discount_percent = 0;
1781
+ }
1782
+ let effectiveGrossAmount = 0;
1783
+ if (quantity > 1) {
1784
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1785
+ effectiveGrossAmount = data.sale_rate;
1786
+ }
1787
+ else {
1788
+ effectiveGrossAmount = data.sale_rate * quantity;
1789
+ }
1790
+ }
1791
+ else {
1792
+ effectiveGrossAmount = data.sale_rate * quantity;
1793
+ }
1794
+ dis_amt = this.getDecimalAmount(((+effectiveGrossAmount) * (+discount_percent)) / 100);
1795
+ let offerRate = 0;
1796
+ if (quantity > 1) {
1797
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1798
+ offerRate = data.sale_rate - dis_amt;
1799
+ }
1800
+ else {
1801
+ offerRate = data.sale_rate - (dis_amt / quantity);
1802
+ }
1803
+ }
1804
+ else {
1805
+ offerRate = data.sale_rate - dis_amt;
1806
+ }
1807
+ data['offer_rate'] = offerRate;
1808
+ }
1809
+ else {
1810
+ dis_amt = 0;
1811
+ discount_percent = 0;
1812
+ data['offer_rate'] = 0;
1813
+ }
1814
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1815
+ subsequent_discount_percent = data.subsequent_discount_percent;
1816
+ if (!this.coreFunctionService.isNotBlank(subsequent_discount_percent)) {
1817
+ subsequent_discount_percent = 0;
1818
+ }
1819
+ let subsequentGrossAmount = 0;
1820
+ if (quantity > 1) {
1821
+ subsequentGrossAmount = data.no_of_injection2 * (quantity - 1);
1822
+ }
1823
+ else {
1824
+ subsequentGrossAmount = data.no_of_injection2;
1825
+ }
1826
+ subsequent_discount_amount = this.getDecimalAmount(((+subsequentGrossAmount) * (+subsequent_discount_percent)) / 100);
1827
+ let offerRate = 0;
1828
+ if (quantity > 1) {
1829
+ offerRate = data.no_of_injection2 - (subsequent_discount_amount / (quantity - 1));
1830
+ }
1831
+ else {
1832
+ offerRate = data.no_of_injection2 - subsequent_discount_amount;
1833
+ }
1834
+ data['subsequent_offer_rate'] = offerRate;
1835
+ }
1836
+ else {
1837
+ subsequent_discount_percent = 0;
1838
+ subsequent_discount_amount = 0;
1839
+ data['subsequent_offer_rate'] = 0;
1840
+ }
1841
+ if (quantity > 1) {
1842
+ totalDiscountAmount = dis_amt + subsequent_discount_amount;
1843
+ }
1844
+ else {
1845
+ totalDiscountAmount = dis_amt;
1846
+ }
1847
+ net_amount = this.getDecimalAmount((+gross_amount) - totalDiscountAmount);
1848
+ this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
1849
+ break;
1850
+ case "offer_rate":
1851
+ case "subsequent_offer_rate":
1852
+ let offer_rate = 0;
1853
+ if (incoming_field == "subsequent_offer_rate") {
1854
+ offer_rate = this.getDecimalAmount(data.subsequent_offer_rate);
1855
+ }
1856
+ else {
1857
+ offer_rate = this.getDecimalAmount(data.offer_rate);
1858
+ }
1859
+ if (!this.coreFunctionService.isNotBlank(offer_rate)) {
1860
+ offer_rate = 0;
1861
+ }
1862
+ // if (offer_rate >= 0 ) {
1863
+ if (data.subsequent_offer_rate && data.subsequent_offer_rate > 0 && data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1864
+ effectiveTotal = ((quantity - 1) * data.subsequent_offer_rate) + data.offer_rate;
1865
+ }
1866
+ else {
1867
+ if (sale_rate && sale_rate > 0) {
1868
+ effectiveTotal = quantity * data.offer_rate;
1869
+ }
1870
+ }
1871
+ totalDiscountAmount = gross_amount - effectiveTotal;
1872
+ net_amount = gross_amount - totalDiscountAmount;
1873
+ //if(incoming_field == 'offer_rate'){
1874
+ let effectiveGrossAmount = 0;
1875
+ if (sale_rate && sale_rate > 0) {
1876
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1877
+ effectiveGrossAmount = sale_rate;
1878
+ dis_amt = effectiveGrossAmount - data.offer_rate;
1879
+ }
1880
+ else {
1881
+ effectiveGrossAmount = sale_rate * quantity;
1882
+ dis_amt = effectiveGrossAmount - (data.offer_rate * quantity);
1883
+ }
1884
+ }
1885
+ else {
1886
+ data["offer_rate"] = 0;
1887
+ }
1888
+ if (effectiveGrossAmount > 0) {
1889
+ discount_percent = this.getDecimalAmount(100 * dis_amt / effectiveGrossAmount);
1890
+ }
1891
+ else {
1892
+ discount_percent = 0;
1893
+ }
1894
+ //}
1895
+ //if (incoming_field == 'subsequent_offer_rate' && data.no_of_injection2 > 0) {
1896
+ let subsequentGrossAmount = 0;
1897
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1898
+ if (quantity == 1) {
1899
+ subsequentGrossAmount = data.no_of_injection2;
1900
+ subsequent_discount_amount = this.getDecimalAmount(subsequentGrossAmount - data.subsequent_offer_rate);
1901
+ }
1902
+ else {
1903
+ subsequentGrossAmount = this.getDecimalAmount(gross_amount - effectiveGrossAmount);
1904
+ subsequent_discount_amount = subsequentGrossAmount - (effectiveTotal - data.offer_rate);
1905
+ }
1906
+ }
1907
+ else {
1908
+ data["subsequent_offer_rate"] = 0;
1909
+ }
1910
+ if (subsequentGrossAmount > 0) {
1911
+ subsequent_discount_percent = this.getDecimalAmount(100 * subsequent_discount_amount / subsequentGrossAmount);
1912
+ }
1913
+ else {
1914
+ subsequent_discount_percent = 0;
1915
+ }
1916
+ //}
1917
+ this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
1918
+ // }else{
1919
+ // if(incoming_field == "subsequent_offer_rate"){
1920
+ // data["subsequent_offer_rate"] = offer_rate;
1921
+ // }else{
1922
+ // data["offer_rate"] = offer_rate;
1923
+ // }
1924
+ // }
1925
+ break;
1926
+ case "discount_amount":
1927
+ case "subsequent_discount_amount":
1928
+ if (incoming_field == 'discount_amount') {
1929
+ if (sale_rate && sale_rate > 0) {
1930
+ dis_amt = data.discount_amount;
1931
+ if (!this.coreFunctionService.isNotBlank(dis_amt)) {
1932
+ dis_amt = 0;
1933
+ }
1934
+ let effectiveGrossAmount = 0;
1935
+ if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1936
+ effectiveGrossAmount = sale_rate;
1937
+ }
1938
+ else {
1939
+ effectiveGrossAmount = quantity * sale_rate;
1940
+ }
1941
+ discount_percent = this.getDecimalAmount(((+dis_amt) * 100) / (+effectiveGrossAmount));
1942
+ if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
1943
+ data['offer_rate'] = (effectiveGrossAmount - dis_amt);
1944
+ }
1945
+ else {
1946
+ data['offer_rate'] = (effectiveGrossAmount - dis_amt) / quantity;
1947
+ }
1948
+ subsequent_discount_amount = data.subsequent_discount_amount;
1949
+ subsequent_discount_percent = data.subsequent_discount_percent;
1950
+ }
1951
+ else {
1952
+ discount_percent = 0;
1953
+ dis_amt = 0;
1954
+ subsequent_discount_amount = data.subsequent_discount_amount;
1955
+ subsequent_discount_percent = data.subsequent_discount_percent;
1956
+ }
1957
+ }
1958
+ else {
1959
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
1960
+ subsequent_discount_amount = this.getDecimalAmount(data.subsequent_discount_amount);
1961
+ if (!this.coreFunctionService.isNotBlank(subsequent_discount_amount)) {
1962
+ subsequent_discount_amount = 0;
1963
+ }
1964
+ let subsequentGrossAmount = 0;
1965
+ if (quantity > 1) {
1966
+ subsequentGrossAmount = data.no_of_injection2 * (quantity - 1);
1967
+ }
1968
+ else {
1969
+ subsequentGrossAmount = data.no_of_injection2;
1970
+ }
1971
+ subsequent_discount_percent = this.getDecimalAmount(((+subsequent_discount_amount) * 100) / (+subsequentGrossAmount));
1972
+ if (quantity > 1) {
1973
+ data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount) / (quantity - 1);
1974
+ }
1975
+ else {
1976
+ data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount);
1977
+ }
1978
+ discount_percent = data.discount_percent;
1979
+ dis_amt = data.discount_amount;
1980
+ }
1981
+ else {
1982
+ subsequent_discount_amount = 0;
1983
+ subsequent_discount_percent = 0;
1984
+ discount_percent = data.discount_percent;
1985
+ dis_amt = data.discount_amount;
1986
+ }
1987
+ }
1988
+ if (quantity > 1) {
1989
+ totalDiscountAmount = subsequent_discount_amount + dis_amt;
1990
+ }
1991
+ else {
1992
+ totalDiscountAmount = dis_amt;
1993
+ }
1994
+ net_amount = this.getDecimalAmount((+gross_amount) - totalDiscountAmount);
1995
+ this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
1996
+ break;
1997
+ }
1998
+ }
1999
+ calculateQuotationParameterAmountForAutomotiveLimsWithSubsequent(data, fieldName) {
2000
+ let quantity = 0;
2001
+ let discount_percent = 0;
2002
+ let cost_rate = 0;
2003
+ let net_amount = 0;
2004
+ let param_quantom = 0;
2005
+ let Base_quotation_rate = 0;
2006
+ let incoming_field = fieldName;
2007
+ let gross_amount = 0;
2008
+ let dis_amt = 0;
2009
+ switch (incoming_field) {
2010
+ case "parameter_quantum":
2011
+ let parameterQuantum = data.parameter_quantum;
2012
+ if (!this.coreFunctionService.isNotBlank(parameterQuantum)) {
2013
+ parameterQuantum = 0;
2014
+ }
2015
+ data['quantum_rate'] = (+data.quotation_rate) * (+parameterQuantum);
2016
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
2017
+ net_amount = +data.quotation_effective_rate;
2018
+ if (data.discount_percent) {
2019
+ let discount = ((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
2020
+ data['discount_amount'] = discount;
2021
+ net_amount = (+data.quotation_effective_rate) - discount;
2022
+ }
2023
+ data['net_amount'] = net_amount;
2024
+ break;
2025
+ case "qty":
2026
+ let quantity = data.qty;
2027
+ if (!this.coreFunctionService.isNotBlank(quantity)) {
2028
+ quantity = 0;
2029
+ }
2030
+ data['quotation_effective_rate'] = (+quantity) * (+data.quantum_rate);
2031
+ if (data.discount_percent) {
2032
+ let discount = this.getDecimalAmount((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
2033
+ data['discount_amount'] = discount;
2034
+ }
2035
+ net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - data['discount_amount']);
2036
+ data['net_amount'] = net_amount;
2037
+ data['total'] = +data.quotation_effective_rate;
2038
+ data['qty'] = data.qty;
2039
+ break;
2040
+ case "discount_percent":
2041
+ let discount_per = data.discount_percent;
2042
+ if (!this.coreFunctionService.isNotBlank(discount_per)) {
2043
+ discount_per = 0;
2044
+ }
2045
+ data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
2046
+ net_amount = +data.quotation_effective_rate;
2047
+ let discount = this.getDecimalAmount(((+data.quotation_effective_rate) * (+discount_per)) / 100);
2048
+ data['discount_amount'] = discount;
2049
+ net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
2050
+ data['net_amount'] = net_amount;
2051
+ data['total'] = +data.quotation_effective_rate;
2052
+ data['qty'] = data.qty;
2053
+ data['discount_percent'] = +discount_per;
2054
+ break;
2055
+ case "discount_amount":
2056
+ let discount_amt = data.discount_amount;
2057
+ if (!this.coreFunctionService.isNotBlank(discount_amt)) {
2058
+ discount_amt = 0;
2059
+ }
2060
+ net_amount = (+data.quotation_effective_rate) - (+discount_amt);
2061
+ let discount_perc = this.getDecimalAmount(((+discount_amt) * 100) / (+data.quotation_effective_rate));
2062
+ data['net_amount'] = net_amount;
2063
+ data['discount_percent'] = discount_perc;
2064
+ data['discount_amount'] = +data['discount_amount'];
2065
+ break;
2066
+ default:
2067
+ }
2068
+ if (data['qty'] > 0) {
2069
+ data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
2070
+ }
2071
+ else {
2072
+ data['per_sample_net_rate'] = 0;
2073
+ }
2074
+ this.sanitizeParameterAmount(data);
2075
+ }
2076
+ calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, fieldName) {
2077
+ switch (lims_segment) {
2078
+ case 'standard':
2079
+ this.calculateQuotationParameterAmountForLimsWithSubsequent(data, fieldName);
2080
+ break;
2081
+ case 'automotive':
2082
+ this.calculateQuotationParameterAmountForAutomotiveLimsWithSubsequent(data, fieldName);
2083
+ break;
2084
+ }
2085
+ }
2086
+ calculate_quotation_with_subsequent(templateValue, lims_segment, field) {
2087
+ var total = 0;
2088
+ let discount_percent = 0;
2089
+ let net_amount = 0;
2090
+ let sampling_amount = 0;
2091
+ let final_amount = 0;
2092
+ let discount_amount = 0;
2093
+ let quotation_param_methods = [];
2094
+ let unit_price = 0;
2095
+ let paramArray = [];
2096
+ let gross_amount = 0;
2097
+ let field_name = field.field_name;
2098
+ let qty = 0;
2099
+ let product_wise_pricing = templateValue['product_wise_pricing'];
2100
+ let current_disount = 0;
2101
+ if (this.coreFunctionService.isNotBlank(templateValue['discount_percent'])) {
2102
+ current_disount = templateValue['discount_percent'];
2103
+ }
2104
+ if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
2105
+ qty = templateValue.qty;
2106
+ }
2107
+ if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
2108
+ templateValue['quotation_param_methods'].forEach((element) => {
2109
+ let data = { ...element };
2110
+ paramArray.push(data);
2111
+ });
2112
+ }
2113
+ if (templateValue['sampling_charge'] && templateValue['sampling_charge'] != null) {
2114
+ sampling_amount = templateValue['sampling_charge'];
2115
+ }
2116
+ // if(gross_amount>0){
2117
+ if (true) {
2118
+ switch (field_name) {
2119
+ case 'parameter_array':
2120
+ unit_price = 0;
2121
+ if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
2122
+ unit_price = templateValue.unit_price;
2123
+ }
2124
+ if (product_wise_pricing) {
2125
+ net_amount = qty * unit_price;
2126
+ paramArray.forEach((data) => {
2127
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
2128
+ gross_amount = gross_amount + data['total'];
2129
+ });
2130
+ discount_amount = gross_amount - net_amount;
2131
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2132
+ paramArray.forEach((data) => {
2133
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
2134
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "discount_percent");
2135
+ });
2136
+ }
2137
+ else {
2138
+ if (paramArray.length > 0) {
2139
+ discount_amount = 0;
2140
+ net_amount = 0;
2141
+ total = 0;
2142
+ gross_amount = 0;
2143
+ if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
2144
+ qty = templateValue.qty;
2145
+ }
2146
+ paramArray.forEach((data) => {
2147
+ if (lims_segment == 'standard') {
2148
+ data['qty'] = qty;
2149
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, 'qty');
2150
+ }
2151
+ gross_amount = gross_amount + data['total'];
2152
+ net_amount = net_amount + data['net_amount'];
2153
+ discount_amount = discount_amount + data['discount_amount'];
2154
+ });
2155
+ }
2156
+ }
2157
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2158
+ templateValue['discount_amount'] = discount_amount;
2159
+ templateValue['net_amount'] = net_amount;
2160
+ templateValue['discount_percent'] = discount_percent;
2161
+ break;
2162
+ case 'discount_percent':
2163
+ discount_percent = templateValue[field_name];
2164
+ paramArray.forEach((data) => {
2165
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
2166
+ data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
2167
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, field_name);
2168
+ gross_amount = gross_amount + data['total'];
2169
+ });
2170
+ discount_amount = gross_amount * discount_percent / 100;
2171
+ net_amount = gross_amount - discount_amount;
2172
+ templateValue['discount_amount'] = discount_amount;
2173
+ templateValue['net_amount'] = net_amount;
2174
+ templateValue['unit_price'] = net_amount / templateValue['qty'];
2175
+ break;
2176
+ case 'discount_amount':
2177
+ discount_amount = templateValue[field_name];
2178
+ paramArray.forEach((data) => {
2179
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
2180
+ gross_amount = gross_amount + data['total'];
2181
+ });
2182
+ net_amount = gross_amount - discount_amount;
2183
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2184
+ paramArray.forEach((data) => {
2185
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
2186
+ data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
2187
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "discount_percent");
2188
+ });
2189
+ templateValue['unit_price'] = net_amount / templateValue['qty'];
2190
+ templateValue['net_amount'] = net_amount;
2191
+ templateValue['discount_percent'] = discount_percent;
2192
+ break;
2193
+ case 'net_amount':
2194
+ discount_percent = 0;
2195
+ net_amount = templateValue[field_name];
2196
+ paramArray.forEach((data) => {
2197
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
2198
+ gross_amount = gross_amount + data['total'];
2199
+ });
2200
+ discount_amount = gross_amount - net_amount;
2201
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2202
+ paramArray.forEach((data) => {
2203
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
2204
+ data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
2205
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "discount_percent");
2206
+ });
2207
+ templateValue["discount_percent"] = discount_percent;
2208
+ templateValue["discount_amount"] = discount_amount;
2209
+ templateValue['unit_price'] = net_amount / templateValue['qty'];
2210
+ break;
2211
+ case 'unit_price':
2212
+ unit_price = 0;
2213
+ if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
2214
+ unit_price = this.getDecimalAmount(templateValue.unit_price);
2215
+ }
2216
+ net_amount = qty * unit_price;
2217
+ paramArray.forEach((data) => {
2218
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
2219
+ gross_amount = gross_amount + data['total'];
2220
+ });
2221
+ discount_amount = gross_amount - net_amount;
2222
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2223
+ paramArray.forEach((data) => {
2224
+ if (data.sale_rate && data.sale_rate > 0) {
2225
+ data.discount_percent = this.getDecimalAmount(+discount_percent);
2226
+ }
2227
+ else {
2228
+ data.discount_percent = 0;
2229
+ }
2230
+ if (data.no_of_injection2 && data.no_of_injection2 > 0) {
2231
+ data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
2232
+ }
2233
+ else {
2234
+ data.subsequent_discount_percent = 0;
2235
+ }
2236
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "unit_price");
2237
+ });
2238
+ templateValue['discount_amount'] = discount_amount;
2239
+ templateValue['net_amount'] = net_amount;
2240
+ templateValue['discount_percent'] = discount_percent;
2241
+ break;
2242
+ default:
2243
+ discount_amount = 0;
2244
+ net_amount = 0;
2245
+ if (paramArray.length > 0) {
2246
+ paramArray.forEach((data) => {
2247
+ data['qty'] = this.getDecimalAmount(qty);
2248
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, field_name);
2249
+ gross_amount = gross_amount + data['total'];
2250
+ net_amount = net_amount + data['net_amount'];
2251
+ if (data['qty'] > 1) {
2252
+ discount_amount = discount_amount + data['discount_amount'] + data['subsequent_discount_amount'];
2253
+ }
2254
+ else {
2255
+ discount_amount = discount_amount + data['discount_amount'];
2256
+ }
2257
+ });
2258
+ }
2259
+ if (product_wise_pricing) {
2260
+ unit_price = templateValue["unit_price"];
2261
+ net_amount = unit_price * qty;
2262
+ discount_amount = gross_amount - net_amount;
2263
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2264
+ if (paramArray.length > 0) {
2265
+ paramArray.forEach((data) => {
2266
+ data['discount_percent'] = discount_percent;
2267
+ this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "unit_price");
2268
+ });
2269
+ }
2270
+ }
2271
+ discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
2272
+ templateValue['discount_amount'] = discount_amount;
2273
+ templateValue['net_amount'] = net_amount;
2274
+ templateValue['discount_percent'] = discount_percent;
2275
+ }
2276
+ }
2277
+ final_amount = net_amount + sampling_amount;
2278
+ if (templateValue['qty'] > 0) {
2279
+ unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
2280
+ }
2281
+ else {
2282
+ unit_price = templateValue["unit_price"];
2283
+ }
2284
+ templateValue['total'] = this.getDecimalAmount(gross_amount);
2285
+ templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
2286
+ templateValue['net_amount'] = this.getDecimalAmount(net_amount);
2287
+ templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
2288
+ templateValue['final_amount'] = this.getDecimalAmount(final_amount);
2289
+ templateValue['unit_price'] = this.getDecimalAmount(unit_price);
2290
+ if (paramArray.length > 0) {
2291
+ templateValue['quotation_param_methods'] = paramArray;
2292
+ }
2293
+ return templateValue;
2294
+ }
2295
+ }
2296
+ LimsCalculationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LimsCalculationsService, deps: [{ token: i1.CommonFunctionService }, { token: i2.CoreFunctionService }, { token: i3.NotificationService }, { token: i4.StorageService }, { token: i5.ApiCallService }], target: i0.ɵɵFactoryTarget.Injectable });
2297
+ LimsCalculationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LimsCalculationsService, providedIn: 'root' });
2298
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LimsCalculationsService, decorators: [{
2299
+ type: Injectable,
2300
+ args: [{
2301
+ providedIn: 'root'
2302
+ }]
2303
+ }], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.CoreFunctionService }, { type: i3.NotificationService }, { type: i4.StorageService }, { type: i5.ApiCallService }]; } });
2304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltcy1jYWxjdWxhdGlvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvbGltcy1jYWxjdWxhdGlvbnMvbGltcy1jYWxjdWxhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBaUMsa0JBQWtCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFVMUcsTUFBTSxPQUFPLHVCQUF1QjtJQUVsQyxZQUNVLHFCQUE0QyxFQUM1QyxtQkFBd0MsRUFDeEMsbUJBQXdDLEVBQ3hDLGNBQTZCLEVBQzdCLGNBQTZCO1FBSjdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO0lBQ25DLENBQUM7SUFHTCwrQkFBK0IsQ0FBQyxpQkFBcUIsRUFBRSxjQUFrQjtRQUN2RSxJQUFJLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxJQUFJLHNCQUFzQixHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEMsc0JBQXNCLElBQUks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QUNoRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RSxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixhQUFhLENBQUMseUJBQXlCLENBQUMsR0FBRyxVQUFVLENBQUM7U0FDdkQ7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUV2QixDQUFDOztxSEE3NEVZLHVCQUF1Qjt5SEFBdkIsdUJBQXVCLGNBRnRCLE1BQU07NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwaUNhbGxTZXJ2aWNlIH0gZnJvbSAnLi8uLi9hcGkvYXBpLWNhbGwvYXBpLWNhbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbW1vbkZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZ5L25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGltc0NhbGN1bGF0aW9uc1NlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOiBDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6IENvcmVGdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOlN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlDYWxsU2VydmljZTpBcGlDYWxsU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG5cclxuICBjYWxjdWxhdGVCYWxhbmNlQW1vdW50RW5nTGV0dGVyKHRhbXBsYXRlRm9ybVZhbHVlOmFueSwgbXVsdGlGb3JtVmFsdWU6YW55KSB7XHJcbiAgICBsZXQgbGlzdCA9IHRhbXBsYXRlRm9ybVZhbHVlWydiaWxsaW5nUGxhbiddO1xyXG4gICAgbGV0IGZlZXMgPSArbXVsdGlGb3JtVmFsdWVbJ3RvdGFsRmVlcyddO1xyXG4gICAgbGV0IG1pbGVzdG9uZUFjaGlldmVkdG90YWwgPSAwO1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIGlmIChsaXN0ICE9IG51bGwgJiYgbGlzdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbWlsZXN0b25lQWNoaWV2ZWR0b3RhbCArPSBsaXN0W2ldWydmZWVzT25NaWxlc3RvbmVBY2hpZXZlZCddXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRvdGFsID0gbWlsZXN0b25lQWNoaWV2ZWR0b3RhbCArIHRhbXBsYXRlRm9ybVZhbHVlWydmZWVzT25NaWxlc3RvbmVBY2hpZXZlZCddO1xyXG4gICAgbGV0IHJlbWFuaW5nQW1vdW50ID0gZmVlcyAtIHRvdGFsO1xyXG5cclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIGJhbGFuY2VBbW91bnQ6IHJlbWFuaW5nQW1vdW50XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuICBnZXRUYVdpdGhDYWxjdWxhdGlvbih2YWx1ZTphbnkpIHtcclxuICAgIGxldCBsb2NhbFRhcyA9IDA7XHJcbiAgICBsZXQgY2xhaW1TaGVldCA9IHZhbHVlLmNsYWltU2hlZXQ7XHJcbiAgICBsZXQgcHJpY2VJbkttID0gY2xhaW1TaGVldC5wcmljZUluS207XHJcbiAgICBsZXQgZGlzdGFuY2VJbmttID0gY2xhaW1TaGVldC5kaXN0YW5jZUluS207XHJcbiAgICBsb2NhbFRhcyA9IHByaWNlSW5LbSAqIGRpc3RhbmNlSW5rbTtcclxuICAgIGxldCBvYmoxID0ge1xyXG4gICAgICBsb2NhbFRhOiBsb2NhbFRhc1xyXG4gICAgfVxyXG4gICAgbGV0IG9iaiA9IHtcclxuICAgICAgY2xhaW1TaGVldDogb2JqMVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50KGZvcm1WYWx1ZTphbnkpIHtcclxuICAgIGxldCBsaXN0ID0gZm9ybVZhbHVlWydjbGFpbVNoZWV0J107XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRvdGFsICs9IGxpc3RbaV1bJ3RvdGFsRm9yVGhlRGF5J11cclxuICAgIH1cclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIHRvdGFsQW1vdW50T2ZUcmF2ZWxDbGlhbTogdG90YWxcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVUb3RhbEZhaXIodmFsdWU6YW55KSB7XHJcbiAgICBsZXQgdG90YWxGYWlyID0gMDtcclxuICAgIGxldCBjdXJWYWx1ZTphbnkgPSB7fTtcclxuICAgIGxldCBjaGVja0NsYWltU2hlZXQgPSBmYWxzZTtcclxuICAgIGxldCBjYWxjdWxhdGVPYmplY3QgPSB7XHJcbiAgICAgIHRvdGFsRm9yVGhlRGF5IDogMFxyXG4gICAgfVxyXG4gICAgaWYodmFsdWUgJiYgdmFsdWUuY2xhaW1TaGVldCl7XHJcbiAgICAgIGN1clZhbHVlID0gdmFsdWUuY2xhaW1TaGVldDtcclxuICAgICAgY2hlY2tDbGFpbVNoZWV0ID0gdHJ1ZTtcclxuICAgIH1lbHNle1xyXG4gICAgICBjdXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgbGV0IGxvY2FsVGEgPSBjdXJWYWx1ZS5sb2NhbFRhO1xyXG4gICAgbGV0IHRyYXZlbEZhaXIgPSBjdXJWYWx1ZS50cmF2ZWxGYXJlO1xyXG4gICAgbGV0IGRhaWx5QWxsb3dhbmNlID0gY3VyVmFsdWUuZGFpbHlBbGxvd2FuY2U7XHJcbiAgICBsZXQgZm9vZCA9IGN1clZhbHVlLmZvb2Q7XHJcbiAgICBsZXQgaG90ZWwgPSBjdXJWYWx1ZS5ob3RlbDtcclxuICAgIGxldCBwYXJraW5nID0gY3VyVmFsdWUucGFya2luZztcclxuICAgIGxldCB0b29sQ2hhcmdlID0gY3VyVmFsdWUudG9sbENoYXJnZTtcclxuICAgIGxldCBtaXNjZWxsYW5lb3VzID0gY3VyVmFsdWUubWlzY2VsbGFuZW91cztcclxuICAgIHRvdGFsRmFpciA9ICgrdHJhdmVsRmFpcikgKyAoK2xvY2FsVGEpICsgKCtkYWlseUFsbG93YW5jZSkgKyAoK2Zvb2QpICsgKCtob3RlbCkgKyAoK3BhcmtpbmcpICsgKCt0b29sQ2hhcmdlKSArICgrbWlzY2VsbGFuZW91cyk7XHJcblxyXG4gICAgY2FsY3VsYXRlT2JqZWN0LnRvdGFsRm9yVGhlRGF5ID0gdG90YWxGYWlyO1xyXG4gICAgaWYoY2hlY2tDbGFpbVNoZWV0KXtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjbGFpbVNoZWV0OiBjYWxjdWxhdGVPYmplY3RcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBjYWxjdWxhdGVPYmplY3RcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1Z2dldEZvcmNhc3RDYWxjKHRlbXBsYXRlRm9ybTogYW55KSB7XHJcbiAgICBsZXQgdGVtcGxhdGVWYWx1ZSA9IHRlbXBsYXRlRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgbGV0IGFjdHVhbEN1cllyID0gdGVtcGxhdGVWYWx1ZS5hY3R1YWxfY3VycmVudDtcclxuICAgIGxldCBhY3R1YWxMYXN0WXIgPSB0ZW1wbGF0ZVZhbHVlLmFjdHVhbHM7XHJcbiAgICBsZXQgYnVkZ2V0ID0gdGVtcGxhdGVWYWx1ZS50aGlzX3llYXI7XHJcbiAgICBsZXQgZ3Jvd3RocGVyczphbnkgPSB7fTtcclxuICAgIGxldCBidWRnZXRwZXJzOmFueSA9IHt9O1xyXG4gICAgbGV0IHZhbHVlOmFueSA9IFtdO1xyXG4gICAgbGV0IHZhbHVlMTphbnkgPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKGFjdHVhbEN1cllyKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGxldCBncm93dGhwZXIgPSAwO1xyXG4gICAgICBsZXQgYnVkZ2V0cGVyID0gMDtcclxuICAgICAgbGV0IGFjdHVhbEN1cllyTW9udGggPSBhY3R1YWxDdXJZcltrZXldO1xyXG4gICAgICBsZXQgYWN0dWFsTGFzdFlyTW9udGggPSBhY3R1YWxMYXN0WXJba2V5XTtcclxuICAgICAgaWYgKGFjdHVhbExhc3RZck1vbnRoICE9IDApIHtcclxuICAgICAgICBncm93dGhwZXIgPSBhY3R1YWxDdXJZck1vbnRoIC8gYWN0dWFsTGFzdFlyTW9udGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBidWRnZXRjdXJZck1vbnRoID0gYnVkZ2V0W2tleV07XHJcbiAgICAgIGlmIChidWRnZXRjdXJZck1vbnRoICE9IDApIHtcclxuICAgICAgICBidWRnZXRwZXIgPSBhY3R1YWxDdXJZck1vbnRoIC8gYnVkZ2V0Y3VyWXJNb250aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZ3Jvd3RocGVyc1trZXldID0gZ3Jvd3RocGVyO1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGZpZWxkOiBrZXksIHZhbHVlOiBncm93dGhwZXJzW2tleV1cclxuICAgICAgfVxyXG4gICAgICB2YWx1ZS5wdXNoKG9iailcclxuXHJcbiAgICAgIGJ1ZGdldHBlcnNba2V5XSA9IGJ1ZGdldHBlcjtcclxuICAgICAgbGV0IG9iajEgPSB7XHJcbiAgICAgICAgZmllbGQ6IGtleSwgdmFsdWU6IGJ1ZGdldHBlcnNba2V5XVxyXG4gICAgICB9XHJcbiAgICAgIHZhbHVlMS5wdXNoKG9iajEpXHJcbiAgICB9KVxyXG4gICAgY29uc3QgZmllbGRXaXRoVmFsdWVmb3Jncm93dGggPSB7XHJcbiAgICAgIGZpZWxkOiAnZ3Jvd3RoX3BlcicsIHZhbHVlOiB2YWx1ZVxyXG4gICAgfVxyXG4gICAgZmllbGRXaXRoVmFsdWVmb3Jncm93dGgudmFsdWUuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZFdpdGhWYWx1ZWZvcmdyb3d0aC5maWVsZF0pLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRdLnBhdGNoVmFsdWUoZWxlbWVudC52YWx1ZSk7XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGZpZWxkV2l0aFZhbHVlZm9yQnVkZ2V0ID0ge1xyXG4gICAgICBmaWVsZDogJ2J1ZGdldF9wZXInLCB2YWx1ZTogdmFsdWUxXHJcbiAgICB9XHJcbiAgICBmaWVsZFdpdGhWYWx1ZWZvckJ1ZGdldC52YWx1ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAoPFVudHlwZWRGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkV2l0aFZhbHVlZm9yQnVkZ2V0LmZpZWxkXSkuY29udHJvbHNbZWxlbWVudC5maWVsZF0ucGF0Y2hWYWx1ZShlbGVtZW50LnZhbHVlKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVBdXRvRWZmUmF0ZShkYXRhOmFueSkge1xyXG4gICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBlbGVtZW50W1wicGVyX3NhbXBsZV9uZXRfcmF0ZVwiXSA9IGVsZW1lbnRbXCJub19vZl9zYW1wbGVzXCJdICogZWxlbWVudFtcInF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZVwiXTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG4gIGNhbGN1bGF0ZV9uZXh0X2NhbGlicmF0aW9uX2R1ZV9kYXRlKHRlbXBsYXRlRm9ybTphbnkpIHtcclxuICAgIGNvbnN0IG9iamVjdFZhbHVlID0gdGVtcGxhdGVGb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICBsZXQgY2FsaWJyYXRpb25fZGF0ZSA9IG9iamVjdFZhbHVlWydjYWxpYnJhdGlvbl9kYXRlJ11cclxuICAgIGxldCBjYWxpYnJhdGlvbl9mcmVxdWVuY3kgPSBvYmplY3RWYWx1ZVsnY2FsaWJyYXRpb25fZnJlcXVlbmN5J11cclxuICAgIGlmIChjYWxpYnJhdGlvbl9kYXRlICE9IG51bGwgJiYgY2FsaWJyYXRpb25fZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbGlicmF0aW9uX2ZyZXF1ZW5jeSAhPSBudWxsICYmIGNhbGlicmF0aW9uX2ZyZXF1ZW5jeSAhPT0gdW5kZWZpbmVkICYmIGNhbGlicmF0aW9uX2RhdGUgIT09IFwiXCIgJiYgY2FsaWJyYXRpb25fZnJlcXVlbmN5ICE9PSBcIlwiKSB7XHJcbiAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgZGF0ZS5zZXREYXRlKGNhbGlicmF0aW9uX2RhdGUuZ2V0RGF0ZSgpICsgY2FsaWJyYXRpb25fZnJlcXVlbmN5KTtcclxuICAgICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWyduZXh0X2RhdGUnXS5zZXRWYWx1ZShkYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGN1bGF0aW9uX29mX3NjcmlwdF9mb3JfdGRzKG9iamVjdDphbnksIGZpZWxkOiBhbnkpIHtcclxuICAgIGNvbnN0IHN0YXRpY01vZGFsID0gW11cclxuICAgIHN0YXRpY01vZGFsLnB1c2godGhpcy5hcGlDYWxsU2VydmljZS5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoJ1FUTVA6Q0FMQ1VMQVRJT05fU0NSSVBUJywgZmllbGQub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLCBmaWVsZC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBvYmplY3QpKTtcclxuICAgIHN0YXRpY01vZGFsWzBdWydkYXRhJ10gPSBvYmplY3Q7XHJcbiAgICByZXR1cm4gc3RhdGljTW9kYWw7XHJcbiAgfVxyXG4gIGdldERlY2ltYWxBbW91bnQodmFsdWU6YW55KTogYW55IHtcclxuICAgIGxldCBkZWNpbWFsZGlnaXRObzpudW1iZXIgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFwcGxpY2F0aW9uU2V0dGluZygpLnJvdW5kVmFsdWVOb09mRGlnaXRzO1xyXG4gICAgbGV0IGRlY2ltYWxubzpudW1iZXIgPSAyO1xyXG4gICAgaWYoZGVjaW1hbGRpZ2l0Tm8gIT0gdW5kZWZpbmVkICYmIGRlY2ltYWxkaWdpdE5vICE9IG51bGwpIHtcclxuICAgICAgZGVjaW1hbG5vID0gZGVjaW1hbGRpZ2l0Tm87XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT0gJ251bWJlcicgJiYgdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKGRlY2ltYWxubykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuICBsZWdhY3lRdW90YXRpb25QYXJhbWV0ZXJDYWxjdWxhdGlvbihkYXRhOmFueSwgZmllbGROYW1lOmFueSkge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBjb3N0X3JhdGUgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBwYXJhbV9xdWFudG9tID0gMDtcclxuICAgIGxldCBCYXNlX3F1b3RhdGlvbl9yYXRlID0gMDtcclxuICAgIGxldCBpbmNvbWluZ19maWVsZCA9IGZpZWxkTmFtZS5maWVsZF9uYW1lO1xyXG5cclxuICAgIGxldCBncm9zc19hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBkaXNfYW10OmFueSA9IDA7XHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcbiAgICAgIGNhc2UgXCJjbGFpbV91bml0XCI6XHJcbiAgICAgIGNhc2UgXCJjbGFpbV9wZXJjZW50XCI6XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVfcGhhcm1hX2NsYWltX3ZhbHVlcyhkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInBhcmFtZXRlcl9xdWFudHVtXCI6XHJcbiAgICAgICAgaWYgKGRhdGEucGFyYW1ldGVyX3F1YW50dW0pIHtcclxuICAgICAgICAgIGRhdGFbJ3F1YW50dW1fcmF0ZSddID0gKCtkYXRhLnF1b3RhdGlvbl9yYXRlKSAqICgrZGF0YS5wYXJhbWV0ZXJfcXVhbnR1bSk7XHJcbiAgICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrZGF0YS5xdHkpICogKCtkYXRhLnF1YW50dW1fcmF0ZSk7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgICBpZiAoZGF0YS5kaXNjb3VudF9wZXJjZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBkaXNjb3VudCA9ICgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtIGRpc2NvdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInF0eVwiOlxyXG4gICAgICAgIGlmIChkYXRhLnF0eSkge1xyXG4gICAgICAgICAgaWYgKGRhdGEuYnJhbmNoICYmIGRhdGEuYnJhbmNoLm5hbWUgJiYgZGF0YS5icmFuY2gubmFtZSA9PT0gXCJQdW5lXCIpIHtcclxuICAgICAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgaWYgKGRhdGEubm9fb2ZfaW5qZWN0aW9uID4gMCkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGVcclxuICAgICAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCkge1xyXG4gICAgICAgICAgICAgIGxldCBkaXNjb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudDtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGlzY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuICAgICAgICAgICAgZGF0YVsndG90YWwnXSA9ICtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZTtcclxuICAgICAgICAgICAgZGF0YVsncXR5J10gPSBkYXRhLnF0eVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJkaXNjb3VudF9wZXJjZW50XCI6XHJcbiAgICAgICAgaWYgKCFkYXRhLmRpc2NvdW50X3BlcmNlbnQpIHtcclxuICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgfSBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5icmFuY2ggJiYgZGF0YS5icmFuY2gubmFtZSAmJiBkYXRhLmJyYW5jaC5uYW1lID09PSBcIlB1bmVcIikge1xyXG4gICAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrZGF0YS5xdHkpICogKCtkYXRhLm9mZmVyX3JhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgbGV0IGRpc2NvdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDApO1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtIGRpc2NvdW50KTtcclxuICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSBkYXRhLmRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG4gICAgICAgIGRhdGFbJ3RvdGFsJ10gPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGU7XHJcbiAgICAgICAgZGF0YVsncXR5J10gPSBkYXRhLnF0eTtcclxuICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSArZGF0YVsnZGlzY291bnRfcGVyY2VudCddO1xyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJvZmZlcl9yYXRlXCI6XHJcbiAgICAgICAgaWYgKGRhdGEubm9fb2ZfaW5qZWN0aW9uID4gMCkge1xyXG4gICAgICAgICAgaWYgKGRhdGEub2ZmZXJfcmF0ZSkge1xyXG4gICAgICAgICAgICBkYXRhW1wicmF0ZV9wZXJfaW5qZWN0aW9uXCJdID0gZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyQW10T25JbmplY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChkYXRhLm9mZmVyX3JhdGUpIHtcclxuICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGEub2ZmZXJfcmF0ZSAqIGRhdGEucXR5KTtcclxuICAgICAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCAmJiBkYXRhLmRpc2NvdW50X3BlcmNlbnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzX2FtdCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoZ3Jvc3NfYW1vdW50ICogZGF0YS5kaXNjb3VudF9wZXJjZW50KSAvIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIGRpc19hbXQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNfYW10O1xyXG4gICAgICAgICAgZGF0YVsndG90YWwnXSA9IGdyb3NzX2Ftb3VudDtcclxuICAgICAgICAgIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gZ3Jvc3NfYW1vdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICAgIGlmICgoZGF0YS5kaXNjb3VudF9hbW91bnQgPT0gMCkgfHwgKGRhdGEuZGlzY291bnRfYW1vdW50KSkge1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9ICgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gKCtkYXRhLmRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgICAgICBsZXQgZGlzY291bnRfcGVyID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2RhdGEuZGlzY291bnRfYW1vdW50KSAqIDEwMCkgLyAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSk7XHJcbiAgICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgZGF0YVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyO1xyXG4gICAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSArZGF0YVsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgIH1cclxuICAgIGlmIChkYXRhWydxdHknXSA+IDApIHtcclxuICAgICAgZGF0YVsncGVyX3NhbXBsZV9uZXRfcmF0ZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGFbJ25ldF9hbW91bnQnXSAvIGRhdGFbJ3F0eSddKTtcclxuICAgIH1cclxuICAgIGxldCBhbW91bnRGaWVsZHMgPSBbXHJcbiAgICAgICdxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnLFxyXG4gICAgICAnZGlzY291bnRfYW1vdW50JyxcclxuICAgICAgJ2Rpc2NvdW50X3BlcmNlbnQnLFxyXG4gICAgICAnbmV0X2Ftb3VudCcsXHJcbiAgICAgICd0b3RhbCcsXHJcbiAgICAgICdwZXJfc2FtcGxlX25ldF9yYXRlJ1xyXG4gICAgXTtcclxuICAgIGFtb3VudEZpZWxkcy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIGRhdGFbY29sdW1uXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhW2NvbHVtbl0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX3BoYXJtYV9jbGFpbV92YWx1ZXMobmV3X2VsZW1lbnQ6IGFueSkge1xyXG4gICAgaWYgKG5ld19lbGVtZW50LmNsYWltX2RlcGVuZGVudCAmJiAhaXNOYU4obmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkpIHtcclxuICAgICAgaWYgKCFpc05hTigrbmV3X2VsZW1lbnQubGltaXRfZnJvbSkpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsobmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkpIHtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmNsYWltX2xpbWl0X2Zyb20gPSAoK25ld19lbGVtZW50LmxpbWl0X2Zyb20pICogKG5ld19lbGVtZW50LmNsYWltX3BlcmNlbnQpIC8gMTAwO1xyXG4gICAgICAgICAgaWYgKG5ld19lbGVtZW50LmNsYWltX3VuaXQpIHtcclxuICAgICAgICAgICAgbmV3X2VsZW1lbnQuY2xhaW1fbGltaXRfZnJvbSA9IG5ld19lbGVtZW50LmNsYWltX2xpbWl0X2Zyb20gKyBcIiBcIiArIG5ld19lbGVtZW50LmNsYWltX3VuaXQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmNsYWltX2xpbWl0X2Zyb20gPSBuZXdfZWxlbWVudC5saW1pdF9mcm9tO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzTmFOKCtuZXdfZWxlbWVudC5saW1pdF90bykpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsobmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkpIHtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmNsYWltX2xpbWl0X3RvID0gKCtuZXdfZWxlbWVudC5saW1pdF90bykgKiAobmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkgLyAxMDA7XHJcbiAgICAgICAgICBpZiAobmV3X2VsZW1lbnQuY2xhaW1fdW5pdCkge1xyXG4gICAgICAgICAgICBuZXdfZWxlbWVudC5jbGFpbV9saW1pdF90byA9IG5ld19lbGVtZW50LmNsYWltX2xpbWl0X3RvICsgXCIgXCIgKyBuZXdfZWxlbWVudC5jbGFpbV91bml0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdfZWxlbWVudC5jbGFpbV9saW1pdF90byA9IG5ld19lbGVtZW50LmxpbWl0X3RvO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlUGhhcmFtYVBhcmFtZXRlckFtb3VudChkYXRhOmFueSwgb2ZmZXJfcmF0ZTogbnVtYmVyLCBxdWFudGl0eTogbnVtYmVyLCBmaWVsZF9uYW1lPzphbnkpIHtcclxuICAgIGxldCBncm9zc19hbW91bnQ6YW55ID0gdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJBbXRPbkluamVjdGlvbihkYXRhLCBkYXRhW1wicmF0ZV9wZXJfaW5qZWN0aW9uXCJdLCBxdWFudGl0eSlcclxuICAgIGxldCBlZmZlY3RpdmVUb3RhbDphbnkgPSB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGEsIG9mZmVyX3JhdGUsIHF1YW50aXR5KVxyXG4gICAgbGV0IGRpc19hbXQgPSBncm9zc19hbW91bnQgLSBlZmZlY3RpdmVUb3RhbDtcclxuICAgIHN3aXRjaCAoZmllbGRfbmFtZSkge1xyXG4gICAgICBjYXNlICdkaXNjb3VudF9hbW91bnQnOlxyXG4gICAgICAgIGVmZmVjdGl2ZVRvdGFsID0gZ3Jvc3NfYW1vdW50IC0gZGF0YVsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgZGlzX2FtdCA9IGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgIH1cclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGlmIChncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAoZGlzX2FtdCAvIGdyb3NzX2Ftb3VudCkgKiAxMDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGEsIGVmZmVjdGl2ZVRvdGFsLCBkaXNjb3VudF9wZXJjZW50LCBkaXNfYW10LCBxdWFudGl0eSwgZ3Jvc3NfYW1vdW50KVxyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGE6YW55LCByYXRlOmFueSwgcXVhbnRpdHk6YW55KSB7XHJcbiAgICBsZXQgdG90YWxJbmplY3Rpb24gPSBkYXRhLm5vX29mX2luamVjdGlvbjtcclxuICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodG90YWxJbmplY3Rpb24pKSB7XHJcbiAgICAgIHRvdGFsSW5qZWN0aW9uID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHJhdGUpKSB7XHJcbiAgICAgIHJhdGUgPSAwO1xyXG4gICAgfVxyXG4gICAgbGV0IHJhdGVfcGVyX2luamVjdGlvbiA9IHJhdGU7XHJcbiAgICBsZXQgdG90YWxBbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQodG90YWxJbmplY3Rpb24gKiByYXRlX3Blcl9pbmplY3Rpb24pO1xyXG4gICAgaWYgKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDApIHtcclxuICAgICAgbGV0IG5vX29mX2luamVjdGlvbjIgPSBkYXRhLm5vX29mX2luamVjdGlvbjI7XHJcbiAgICAgIGlmIChxdWFudGl0eSA+IDEgJiYgbm9fb2ZfaW5qZWN0aW9uMiA+IDApIHtcclxuICAgICAgICB0b3RhbEluamVjdGlvbiA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0b3RhbEluamVjdGlvbiArIChxdWFudGl0eSAtIDEpICogbm9fb2ZfaW5qZWN0aW9uMik7XHJcbiAgICAgICAgdG90YWxBbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQodG90YWxJbmplY3Rpb24gKiByYXRlX3Blcl9pbmplY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChkYXRhLm5vX29mX2luamVjdGlvbiA+IDAgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yIDw9IDApIHtcclxuICAgICAgbGV0IG5vX29mX2luamVjdGlvbiA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uO1xyXG4gICAgICBpZiAocXVhbnRpdHkgPiAxICYmIG5vX29mX2luamVjdGlvbiA+IDApIHtcclxuICAgICAgICB0b3RhbEluamVjdGlvbiA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0b3RhbEluamVjdGlvbiArIChxdWFudGl0eSAtIDEpICogbm9fb2ZfaW5qZWN0aW9uKTtcclxuICAgICAgICB0b3RhbEFtb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0b3RhbEluamVjdGlvbiAqIHJhdGVfcGVyX2luamVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0b3RhbEFtb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChxdWFudGl0eSAqIHRvdGFsSW5qZWN0aW9uICogcmF0ZV9wZXJfaW5qZWN0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIGRhdGFbXCJxdW90YXRpb25fZWZmZWN0aXZlX3JhdGVcIl09IHRvdGFsQW1vdW50O1xyXG4gICAgLy8gZGF0YVtcInRvdGFsXCJdID0gdG90YWxBbW91bnQ7XHJcbiAgICAvLyBkYXRhW1wiZGlzY291bnRfYW1vdW50XCJdID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KChkYXRhLnRvdGFsKiBkYXRhLmRpc2NvdW50X3BlcmNlbnQpLzEwMCk7XHJcbiAgICAvLyBkYXRhW1wibmV0X2Ftb3VudFwiXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhLnRvdGFsLSBkYXRhLmRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICBkYXRhW1widG90YWxfaW5qZWN0aW9uXCJdID0gdG90YWxJbmplY3Rpb247XHJcbiAgICByZXR1cm4gdG90YWxBbW91bnQ7XHJcbiAgfVxyXG5cclxuICBnZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50OiBudW1iZXIsIGRpc2NvdW50X2Ftb3VudDogbnVtYmVyLCBncm9zc19hbW91bnQ6IG51bWJlciwgcXVhbnRpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKHF1YW50aXR5ID4gMCAmJiBncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgIGN1cnJlbnRfZGlzb3VudCA9IGRpc2NvdW50X2Ftb3VudCAqIDEwMCAvIGdyb3NzX2Ftb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50X2Rpc291bnQ7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVRdW90YXRpb25QYXJhbWV0ZXJBbW91bnRGb3JBdXRvbW90aXZlTGltcyhkYXRhOmFueSwgZmllbGROYW1lOmFueSkge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBjb3N0X3JhdGUgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBwYXJhbV9xdWFudG9tID0gMDtcclxuICAgIGxldCBCYXNlX3F1b3RhdGlvbl9yYXRlID0gMDtcclxuICAgIGxldCBpbmNvbWluZ19maWVsZCA9IGZpZWxkTmFtZTtcclxuXHJcbiAgICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgIGxldCBkaXNfYW10ID0gMDtcclxuICAgIHN3aXRjaCAoaW5jb21pbmdfZmllbGQpIHtcclxuICAgICAgY2FzZSBcInBhcmFtZXRlcl9xdWFudHVtXCI6XHJcbiAgICAgICAgbGV0IHBhcmFtZXRlclF1YW50dW0gPSBkYXRhLnBhcmFtZXRlcl9xdWFudHVtO1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocGFyYW1ldGVyUXVhbnR1bSkpIHtcclxuICAgICAgICAgIHBhcmFtZXRlclF1YW50dW0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhWydxdWFudHVtX3JhdGUnXSA9ICgrZGF0YS5xdW90YXRpb25fcmF0ZSkgKiAoK3BhcmFtZXRlclF1YW50dW0pO1xyXG4gICAgICAgIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gKCtkYXRhLnF0eSkgKiAoK2RhdGEucXVhbnR1bV9yYXRlKTtcclxuICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCkge1xyXG4gICAgICAgICAgbGV0IGRpc2NvdW50ID0gKCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpICogKCtkYXRhLmRpc2NvdW50X3BlcmNlbnQpKSAvIDEwMDtcclxuICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gKCtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSkgLSBkaXNjb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInF0eVwiOlxyXG4gICAgICAgIGxldCBxdWFudGl0eSA9IGRhdGEucXR5O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocXVhbnRpdHkpKSB7XHJcbiAgICAgICAgICBxdWFudGl0eSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrcXVhbnRpdHkpICogKCtkYXRhLnF1YW50dW1fcmF0ZSk7XHJcbiAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCkge1xyXG4gICAgICAgICAgbGV0IGRpc2NvdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpICogKCtkYXRhLmRpc2NvdW50X3BlcmNlbnQpKSAvIDEwMDtcclxuICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5ldF9hbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSkgLSBkYXRhWydkaXNjb3VudF9hbW91bnQnXSk7XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG4gICAgICAgIGRhdGFbJ3RvdGFsJ10gPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGU7XHJcbiAgICAgICAgZGF0YVsncXR5J10gPSBkYXRhLnF0eVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X3BlcmNlbnRcIjpcclxuICAgICAgICBsZXQgZGlzY291bnRfcGVyID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfcGVyKSkge1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgIG5ldF9hbW91bnQgPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGVcclxuICAgICAgICBsZXQgZGlzY291bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpICogKCtkaXNjb3VudF9wZXIpKSAvIDEwMCk7XHJcbiAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudDtcclxuICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGlzY291bnQpO1xyXG4gICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuICAgICAgICBkYXRhWyd0b3RhbCddID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlO1xyXG4gICAgICAgIGRhdGFbJ3F0eSddID0gZGF0YS5xdHk7XHJcbiAgICAgICAgZGF0YVsnZGlzY291bnRfcGVyY2VudCddID0gK2Rpc2NvdW50X3BlcjtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiZGlzY291bnRfYW1vdW50XCI6XHJcbiAgICAgICAgbGV0IGRpc2NvdW50X2FtdCA9IGRhdGEuZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfYW10KSkge1xyXG4gICAgICAgICAgZGlzY291bnRfYW10ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5ldF9hbW91bnQgPSAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtICgrZGlzY291bnRfYW10KTtcclxuICAgICAgICBsZXQgZGlzY291bnRfcGVyYyA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtkaXNjb3VudF9hbXQpICogMTAwKSAvICgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpKTtcclxuICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmM7XHJcbiAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSArZGF0YVsnZGlzY291bnRfYW1vdW50J107XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgIH1cclxuICAgIGlmIChkYXRhWydxdHknXSA+IDApIHtcclxuICAgICAgZGF0YVsncGVyX3NhbXBsZV9uZXRfcmF0ZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGFbJ25ldF9hbW91bnQnXSAvIGRhdGFbJ3F0eSddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGFbJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhbml0aXplUGFyYW1ldGVyQW1vdW50KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgc2FuaXRpemVQYXJhbWV0ZXJBbW91bnQoZGF0YTphbnkpe1xyXG4gICAgbGV0IGFtb3VudEZpZWxkcyA9IFtcclxuICAgICAgJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZScsXHJcbiAgICAgICdkaXNjb3VudF9hbW91bnQnLFxyXG4gICAgICAnZGlzY291bnRfcGVyY2VudCcsXHJcbiAgICAgICduZXRfYW1vdW50JyxcclxuICAgICAgJ3RvdGFsJyxcclxuICAgICAgJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXHJcbiAgICBdO1xyXG4gICAgYW1vdW50RmllbGRzLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgZGF0YVtjb2x1bW5dID0gICB0aGlzLmdldERlY2ltYWxBbW91bnQoZGF0YVtjb2x1bW5dKTtcclxuICAgICAgaWYodHlwZW9mKGRhdGFbY29sdW1uXSkgIT0gJ251bWJlcicpe1xyXG4gICAgICAgIGRhdGFbY29sdW1uXT0wO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjYWxjdWxhdGVRdW90YXRpb25QYXJhbWV0ZXJBbW91bnRGb3JMaW1zKGRhdGE6YW55LCBmaWVsZE5hbWU6YW55KSB7XHJcbiAgICBsZXQgcXVhbnRpdHkgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X3BlcmNlbnQ6YW55ID0gMDtcclxuICAgIGxldCBjb3N0X3JhdGUgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHBhcmFtX3F1YW50b20gPSAwO1xyXG4gICAgbGV0IEJhc2VfcXVvdGF0aW9uX3JhdGUgPSAwO1xyXG4gICAgbGV0IGluY29taW5nX2ZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgbGV0IHNhbGVfcmF0ZSA9IGRhdGFbJ3NhbGVfcmF0ZSddO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZWZmZWN0aXZlVG90YWwgPSAwO1xyXG4gICAgbGV0IGRpc19hbXQ6YW55ID0gMDtcclxuICAgIHF1YW50aXR5ID0gZGF0YS5xdHk7XHJcbiAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHF1YW50aXR5KSkge1xyXG4gICAgICBxdWFudGl0eSA9IDA7XHJcbiAgICB9XHJcbiAgICBncm9zc19hbW91bnQgPSBxdWFudGl0eSAqIHNhbGVfcmF0ZTtcclxuXHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcblxyXG4gICAgICBjYXNlIFwicXR5XCI6XHJcbiAgICAgICAgZWZmZWN0aXZlVG90YWwgPSAoK3F1YW50aXR5KSAqICgrZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBoYXJhbWFQYXJhbWV0ZXJBbW91bnQoZGF0YSwgZGF0YS5vZmZlcl9yYXRlLCBxdWFudGl0eSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGRpc19hbXQgPSBncm9zc19hbW91bnQgLSBlZmZlY3RpdmVUb3RhbDtcclxuICAgICAgICAgIGlmIChncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoMTAwICogZGlzX2FtdCAvIGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBlZmZlY3RpdmVUb3RhbDtcclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudClcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZGlzY291bnRfcGVyY2VudFwiOlxyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSBkYXRhLmRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkaXNjb3VudF9wZXJjZW50KSkge1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLm5vX29mX2luamVjdGlvbiA+IDApIHtcclxuICAgICAgICAgIGxldCBvZmZlcmluZ1JhdGUgPSBkYXRhLnJhdGVfcGVyX2luamVjdGlvbiAqICgxIC0gZGlzY291bnRfcGVyY2VudCAvIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBoYXJhbWFQYXJhbWV0ZXJBbW91bnQoZGF0YSwgb2ZmZXJpbmdSYXRlLCBxdWFudGl0eSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRpc19hbXQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZ3Jvc3NfYW1vdW50KSAqICgrZGlzY291bnRfcGVyY2VudCkpIC8gMTAwKTtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCtncm9zc19hbW91bnQpIC0gZGlzX2FtdCk7XHJcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGEsIG5ldF9hbW91bnQsIGRpc2NvdW50X3BlcmNlbnQsIGRpc19hbXQsIHF1YW50aXR5LCBncm9zc19hbW91bnQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInVuaXRfcHJpY2VcIjpcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfcGVyY2VudCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICBsZXQgb2ZmZXJpbmdSYXRlID0gZGF0YS5yYXRlX3Blcl9pbmplY3Rpb24gKiAoMSAtIGRpc2NvdW50X3BlcmNlbnQgLyAxMDApO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQaGFyYW1hUGFyYW1ldGVyQW1vdW50KGRhdGEsIG9mZmVyaW5nUmF0ZSwgcXVhbnRpdHkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkaXNfYW10ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2dyb3NzX2Ftb3VudCkgKiAoK2Rpc2NvdW50X3BlcmNlbnQpKSAvIDEwMCk7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZ3Jvc3NfYW1vdW50KSAtIGRpc19hbXQpO1xyXG5cclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwib2ZmZXJfcmF0ZVwiOlxyXG4gICAgICAgIGxldCBvZmZlcl9yYXRlID0gZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90Qmxhbmsob2ZmZXJfcmF0ZSkpIHtcclxuICAgICAgICAgIG9mZmVyX3JhdGUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcblxyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQaGFyYW1hUGFyYW1ldGVyQW1vdW50KGRhdGEsIG9mZmVyX3JhdGUsIHF1YW50aXR5KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChvZmZlcl9yYXRlKSB7XHJcbiAgICAgICAgICAgIGVmZmVjdGl2ZVRvdGFsID0gcXVhbnRpdHkgKiBvZmZlcl9yYXRlO1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gZ3Jvc3NfYW1vdW50IC0gZWZmZWN0aXZlVG90YWw7XHJcbiAgICAgICAgICAgIGlmIChncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBkaXNfYW10IC8gZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gZGlzX2FtdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgICAgICBkYXRhW1wib2ZmZXJfcmF0ZVwiXSA9IG9mZmVyX3JhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZGlzY291bnRfYW1vdW50XCI6XHJcbiAgICAgICAgZGlzX2FtdCA9IGRhdGEuZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzX2FtdCkpIHtcclxuICAgICAgICAgIGRpc19hbXQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRhdGFbJ3JhdGVfcGVyX2luamVjdGlvbiddKSkge1xyXG4gICAgICAgICAgICBkYXRhWydyYXRlX3Blcl9pbmplY3Rpb24nXSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgb2ZmZXJpbmdSYXRlID0gZGF0YVsncmF0ZV9wZXJfaW5qZWN0aW9uJ10gLSBkaXNfYW10O1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQaGFyYW1hUGFyYW1ldGVyQW1vdW50KGRhdGEsIG9mZmVyaW5nUmF0ZSwgcXVhbnRpdHksIGluY29taW5nX2ZpZWxkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWZmZWN0aXZlVG90YWwgPSBncm9zc19hbW91bnQgLSBkaXNfYW10O1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9IGVmZmVjdGl2ZVRvdGFsO1xyXG4gICAgICAgICAgaWYgKGdyb3NzX2Ftb3VudCA+IDApIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtkaXNfYW10KSAqIDEwMCkgLyAoK2dyb3NzX2Ftb3VudCkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGEsIG5ldF9hbW91bnQsIGRpc2NvdW50X3BlcmNlbnQsIGRpc19hbXQsIHF1YW50aXR5LCBncm9zc19hbW91bnQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX2ludm9pY2VfYW1vdW50X3Jvd193aXNlKGRhdGE6YW55LCBmaWVsZE5hbWU6YW55KSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IGRpc2NfcGVyID0gMDtcclxuICAgIGxldCBkaXNjX2FtdCA9IDA7XHJcbiAgICBsZXQgZmluYWxfYW10ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50ID0gMDtcclxuICAgIGxldCBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRhdGEudG90YWwpKSB7XHJcbiAgICAgIHRvdGFsID0gZGF0YS50b3RhbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkYXRhLmRpc2NvdW50X2Ftb3VudCkpIHtcclxuICAgICAgZGlzY19hbXQgPSBkYXRhLmRpc2NvdW50X2Ftb3VudDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkYXRhLnNhbXBsaW5nX2NoYXJnZSkpIHtcclxuICAgICAgc3VyY2hhcmdlID0gZGF0YS5zYW1wbGluZ19jaGFyZ2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGF0YS5kaXNjb3VudF9wZXJjZW50KSkge1xyXG4gICAgICBkaXNjX3BlciA9IGRhdGEuZGlzY291bnRfcGVyY2VudDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbGV0IGluY29taW5nX2ZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgc3dpdGNoIChpbmNvbWluZ19maWVsZCkge1xyXG4gICAgICBjYXNlIFwidG90YWxcIjpcclxuICAgICAgICBkaXNjX2FtdCA9IGRpc2NfcGVyICogdG90YWwgLyAxMDA7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRvdGFsIC0gZGlzY19hbXQ7XHJcbiAgICAgICAgZmluYWxfYW10ID0gc3VyY2hhcmdlICsgbmV0X2Ftb3VudDtcclxuICAgICAgICAvLyBkaXNjX3BlciA9IChkaXNjX2FtdC8oZGF0YS50b3RhbCkpKjEwMDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X3BlcmNlbnRcIjpcclxuICAgICAgICBkaXNjX2FtdCA9IGRpc2NfcGVyICogdG90YWwgLyAxMDA7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRvdGFsIC0gZGlzY19hbXQ7XHJcbiAgICAgICAgZmluYWxfYW10ID0gc3VyY2hhcmdlICsgbmV0X2Ftb3VudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICAgIGRpc2NfcGVyID0gKDEwMCAqIGRpc2NfYW10KSAvIHRvdGFsO1xyXG4gICAgICAgIG5ldF9hbW91bnQgPSB0b3RhbCAtIGRpc2NfYW10O1xyXG4gICAgICAgIGZpbmFsX2FtdCA9IHN1cmNoYXJnZSArIG5ldF9hbW91bnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJzYW1wbGluZ19jaGFyZ2VcIjpcclxuICAgICAgICBkaXNjX3BlciA9ICgxMDAgKiBkaXNjX2FtdCkgLyB0b3RhbDtcclxuICAgICAgICBuZXRfYW1vdW50ID0gdG90YWwgLSBkaXNjX2FtdDtcclxuICAgICAgICBmaW5hbF9hbXQgPSBzdXJjaGFyZ2UgKyBuZXRfYW1vdW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgZGF0YVtcImRpc2NvdW50X3BlcmNlbnRcIl0gPSBkaXNjX3BlcjtcclxuICAgIGRhdGFbXCJkaXNjb3VudF9hbW91bnRcIl0gPSBkaXNjX2FtdDtcclxuICAgIGRhdGFbXCJmaW5hbF9hbW91bnRcIl0gPSBmaW5hbF9hbXQ7XHJcbiAgICBkYXRhW1wibmV0X2Ftb3VudFwiXSA9IG5ldF9hbW91bnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlTmV0QW1vdW50KGRhdGE6YW55LCBmaWVsZE5hbWU6YW55LCBncmlkX2NlbGxfZnVuY3Rpb246YW55KSB7XHJcbiAgICBzd2l0Y2ggKGdyaWRfY2VsbF9mdW5jdGlvbikge1xyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yQXV0b21vdGl2ZUxpbXNcIjpcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVF1b3RhdGlvblBhcmFtZXRlckFtb3VudEZvckF1dG9tb3RpdmVMaW1zKGRhdGEsIGZpZWxkTmFtZVtcImZpZWxkX25hbWVcIl0pO1xyXG4gICAgICAgIGJyZWFrXHJcblxyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltc1wiOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltcyhkYXRhLCBmaWVsZE5hbWVbXCJmaWVsZF9uYW1lXCJdKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltc1dpdGhTdWJzZXF1ZW50XCI6XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVRdW90YXRpb25QYXJhbWV0ZXJBbW91bnRGb3JMaW1zV2l0aFN1YnNlcXVlbnQoZGF0YSwgZmllbGROYW1lW1wiZmllbGRfbmFtZVwiXSlcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJjYWxjdWxhdGVfcGhhcm1hX2NsYWltX3ZhbHVlc1wiOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlX3BoYXJtYV9jbGFpbV92YWx1ZXMoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlX2ludm9pY2VfYW1vdW50X3Jvd193aXNlXCI6XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVfaW52b2ljZV9hbW91bnRfcm93X3dpc2UoZGF0YSwgZmllbGROYW1lW1wiZmllbGRfbmFtZVwiXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMubGVnYWN5UXVvdGF0aW9uUGFyYW1ldGVyQ2FsY3VsYXRpb24oZGF0YSwgZmllbGROYW1lW1wiZmllbGRfbmFtZVwiXSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBjYWxjdWxhdGVRcXVvdGVBbW91bnQodGVtcGxhdGVWYWx1ZTphbnksIGZpZWxkOiBhbnkpIHtcclxuICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudDphbnkgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHNhbXBsaW5nX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZmluYWxfYW1vdW50ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzOmFueSA9IFtdO1xyXG4gICAgbGV0IHVuaXRfcHJpY2U6YW55ID0gMDtcclxuXHJcbiAgICBpZiAodGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIHRvdGFsID0gdG90YWwgKyBlbGVtZW50LnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICYmIHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICE9IG51bGwpIHtcclxuICAgICAgc2FtcGxpbmdfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnc2FtcGxpbmdfY2hhcmdlJ107XHJcbiAgICB9XHJcbiAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgIGlmICh0ZW1wbGF0ZVZhbHVlW2ZpZWxkLmZpZWxkX25hbWVdICE9ICcnKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkLmZpZWxkX25hbWUgPT09ICdkaXNjb3VudF9wZXJjZW50Jykge1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSB0b3RhbCAqIGRpc2NvdW50X3BlcmNlbnQgLyAxMDA7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdG90YWwgLSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICBxdW90YXRpb25fcGFyYW1fbWV0aG9kcyA9IFtdO1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdfZWxlbWVudCA9IHsgLi4uZWxlbWVudCB9O1xyXG4gICAgICAgICAgICBuZXdfZWxlbWVudC5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVOZXRBbW91bnQobmV3X2VsZW1lbnQsIFwicXR5XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBxdW90YXRpb25fcGFyYW1fbWV0aG9kcy5wdXNoKG5ld19lbGVtZW50KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLnNldFZhbHVlKHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzKTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUXF1b3RlQW1vdW50KHRlbXBsYXRlVmFsdWUsIHsgZmllbGRfbmFtZTogXCJxdW90YXRpb25fcGFyYW1fbWV0aG9kc1wiIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZmllbGRfbmFtZSA9PT0gJ25ldF9hbW91bnQnKSB7XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlW2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gdG90YWwgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBkaXNjb3VudF9hbW91bnQgLyB0b3RhbCk7XHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfcGVyY2VudFwiXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBsZXQgdXBkYXRlZERhdGEgPSB0aGlzLnF1b3RlX2Ftb3VudF92aWFfZGlzY291bnRfcGVyY2VudCh0ZW1wbGF0ZVZhbHVlW1wicXVvdGF0aW9uX3BhcmFtX21ldGhvZHNcIl0sIHRlbXBsYXRlVmFsdWUpXHJcbiAgICAgICAgICB1cGRhdGVkRGF0YVtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldF9hbW91bnRcclxuICAgICAgICAgIHJldHVybiB1cGRhdGVkRGF0YTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmZpZWxkX25hbWUgPT09ICdxdW90YXRpb25fcGFyYW1fbWV0aG9kcycpIHtcclxuICAgICAgICAgIGxldCBsaXN0ID0gdGVtcGxhdGVWYWx1ZVtmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgIGxpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3X2VsZW1lbnQgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZGlzY291bnRfYW1vdW50ICsgZWxlbWVudC5kaXNjb3VudF9hbW91bnRcclxuICAgICAgICAgICAgbmV0X2Ftb3VudCA9IG5ldF9hbW91bnQgKyBlbGVtZW50Lm5ldF9hbW91bnQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAxMDAgKiBkaXNjb3VudF9hbW91bnQgLyB0b3RhbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdG90YWwgPSB0ZW1wbGF0ZVZhbHVlWyd0b3RhbCddO1xyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddO1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzYW1wbGluZ19hbW91bnQ7XHJcbiAgICAgICAgdW5pdF9wcmljZSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50IC8gdGVtcGxhdGVWYWx1ZVsncXR5J10pO1xyXG4gICAgICAgIHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzID0gW107XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3X2VsZW1lbnQgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2VsZW1lbnQuZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICBuZXdfZWxlbWVudC5uZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCsoZWxlbWVudC5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUgKiAoMSAtIGVsZW1lbnQuZGlzY291bnRfcGVyY2VudCAvIDEwMCkpKTtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmRpc2NvdW50X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrKGVsZW1lbnQucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlICogZWxlbWVudC5kaXNjb3VudF9wZXJjZW50IC8gMTAwKSk7XHJcbiAgICAgICAgICBpZiAobmV3X2VsZW1lbnQucXR5ID4gMCkge1xyXG4gICAgICAgICAgICBuZXdfZWxlbWVudC5wZXJfc2FtcGxlX25ldF9yYXRlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCsobmV3X2VsZW1lbnQubmV0X2Ftb3VudCAvIG5ld19lbGVtZW50LnF0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcXVvdGF0aW9uX3BhcmFtX21ldGhvZHMucHVzaChuZXdfZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsndG90YWwnXSA9IHRvdGFsO1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQpO1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWydmaW5hbF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChmaW5hbF9hbW91bnQpO1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ3VuaXRfcHJpY2UnXSA9IHVuaXRfcHJpY2U7XHJcbiAgICAgICAgaWYgKHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10gPSBxdW90YXRpb25fcGFyYW1fbWV0aG9kcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICBjYWxjdWxhdGVfbGltc19pbnZvaWNlX3dpdGhfbWFudWFsX2l0ZW1zKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgbGV0IGNhbGN1bGF0ZU9uRmllbGQgPSBcIlwiO1xyXG4gICAgaWYgKGNhbGN1bGF0ZV9vbl9maWVsZCA9PSBudWxsIHx8IGNhbGN1bGF0ZV9vbl9maWVsZCA9PSAnJykge1xyXG4gICAgICBjYWxjdWxhdGVPbkZpZWxkID0gJ21hbnVhbEl0ZW1zTGlzdCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYWxjdWxhdGVPbkZpZWxkID0gY2FsY3VsYXRlX29uX2ZpZWxkWydmaWVsZF9uYW1lJ11cclxuICAgIH1cclxuICAgIGxldCBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgIGxldCB0YXhhYmxlX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlT25GaWVsZF0pICYmIHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlT25GaWVsZF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlW2NhbGN1bGF0ZU9uRmllbGRdLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQuc2FtcGxlVG90YWwpKSB7XHJcbiAgICAgICAgICAvLyBncm9zc19hbW91bnQ9Z3Jvc3NfYW1vdW50K2VsZW1lbnQuZ3Jvc3NfYW1vdW50XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBlbGVtZW50LnNhbXBsZVRvdGFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LnNhbXBsaW5nX2NoYXJnZSkpIHtcclxuICAgICAgICAgIC8vIHN1cmNoYXJnZT1zdXJjaGFyZ2UrZWxlbWVudC5zdXJjaGFyZ2VcclxuICAgICAgICAgIHN1cmNoYXJnZSA9IHN1cmNoYXJnZSArIGVsZW1lbnQuc2FtcGxpbmdfY2hhcmdlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LmRpc2NvdW50X2Ftb3VudCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGVsZW1lbnQuZGlzY291bnRfYW1vdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50Lm5ldF9hbW91bnQpKSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQubmV0X2Ftb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQuc2FtcGxlVG90YWxcclxuICAgICAgICB9XHJcbiAgICAgICAgdGF4YWJsZV9hbW91bnQgPSBuZXRfYW1vdW50ICsgc3VyY2hhcmdlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRlbXBsYXRlVmFsdWUgPSB0aGlzLnVwZGF0ZV9pbnZvaWNlX3RvdGF0bCh0ZW1wbGF0ZVZhbHVlLCBncm9zc19hbW91bnQsIGRpc2NvdW50X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgbmV0X2Ftb3VudCwgc3VyY2hhcmdlLCB0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuICB9XHJcbiAgY2FsY3VsYXRlX2xpbXNfaW52b2ljZV93aXRoX3BvX2l0ZW1zKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlX2xpbXNfaW52b2ljZSh0ZW1wbGF0ZVZhbHVlLCBsaW1zX3NlZ21lbnQsICdwb19pdGVtcycpXHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVfbWFudWFsX3Jvd19pdGVtKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgdmFyIG1hbnVhbEl0ZW1zTGlzdCA9IHRlbXBsYXRlVmFsdWVbJ21hbnVhbEl0ZW1zTGlzdCddO1xyXG4gICAgdmFyIHF0eSA9IG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlUXR5J107XHJcbiAgICB2YXIgY29zdCA9IG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlQ29zdCddO1xyXG4gICAgaWYgKHF0eSAmJiBjb3N0KSB7XHJcbiAgICAgIG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlVG90YWwnXSA9IHF0eSAqIGNvc3Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtYW51YWxJdGVtc0xpc3RbJ3NhbXBsZVRvdGFsJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgbWFudWFsSXRlbXNMaXN0WydkaXNjb3VudF9hbW91bnQnXSA9IDA7XHJcbiAgICBtYW51YWxJdGVtc0xpc3RbJ25ldF9hbW91bnQnXSA9IG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlVG90YWwnXTtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ21hbnVhbEl0ZW1zTGlzdCddID0gbWFudWFsSXRlbXNMaXN0O1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX3BvX3Jvd19pdGVtKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgdmFyIHBvX2l0ZW1zID0gdGVtcGxhdGVWYWx1ZVsncG9faXRlbXMnXTtcclxuICAgIHZhciBxdHkgPSBwb19pdGVtc1sncXR5J107XHJcbiAgICB2YXIgY29zdCA9IHBvX2l0ZW1zWydjb3N0J107XHJcbiAgICBpZiAocXR5ICYmIGNvc3QpIHtcclxuICAgICAgcG9faXRlbXNbJ3RvdGFsJ10gPSBxdHkgKiBjb3N0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcG9faXRlbXNbJ3RvdGFsJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgcG9faXRlbXNbJ2Rpc2NvdW50X2Ftb3VudCddID0gMDtcclxuICAgIHBvX2l0ZW1zWyduZXRfYW1vdW50J10gPSBwb19pdGVtc1sndG90YWwnXTtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ3BvX2l0ZW1zJ10gPSBwb19pdGVtcztcclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY3JlZGl0X25vdGVfaW52b2ljZV9jYWxjdWxhdGlvbih0ZW1wbGF0ZVZhbHVlOiBhbnksIGxpbXNfc2VnbWVudDogYW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSl7XHJcbiAgICBsZXQgc3VyY2hhcmdlID0gMDtcclxuICAgIGxldCBncm9zc19hbW91bnQgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgdGF4YWJsZV9hbW91bnQgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQgPSAwO1xyXG4gICAgbGV0XHRnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0Y2dzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHRzZ3N0X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdGlnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0dGF4X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9hbW91bnRcdD0wO1xyXG5cclxuICAgIGxldFx0bmV0X3BheWJsZVx0PTA7XHJcblxyXG4gICAgbGV0XHRpZ3N0X3BlcmNlbnRcdD0wO1xyXG4gICAgbGV0XHRnc3RfcGVyY2VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9wZXJjZW50XHQ9MDtcclxuICAgIGxldCBjZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCBzZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCB0YXhfcGVyY2VudGFnZSA9IDA7XHJcbiAgICBsZXQgdGF4X3R5cGUgPSB0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddO1xyXG5cclxuICAgIGxldCBwYXJlbnRPYmplY3RWYWx1ZSA9IHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlX29uX2ZpZWxkLnBhcmVudF07XHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocGFyZW50T2JqZWN0VmFsdWUpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhwYXJlbnRPYmplY3RWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGQuZmllbGRfbmFtZV0pKXtcclxuICAgICAgICAgIHRheGFibGVfYW1vdW50ID0gcGFyZW50T2JqZWN0VmFsdWVbY2FsY3VsYXRlX29uX2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUudGF4X3BlcmNlbnRhZ2UpKXtcclxuICAgICAgdGF4X3BlcmNlbnRhZ2UgPSB0ZW1wbGF0ZVZhbHVlLnRheF9wZXJjZW50YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCh0YXhfdHlwZT09bnVsbCB8fCB0YXhfdHlwZT09dW5kZWZpbmVkIHx8IHRheF90eXBlPT0nTkEnKSAmJiB0YXhfcGVyY2VudGFnZT09MClcclxuICAgIHtcclxuICAgICAgbmV0X3BheWJsZSA9IHRheGFibGVfYW1vdW50O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2godGF4X3R5cGUpe1xyXG4gICAgICAgIGNhc2UgXCJHU1RcIiA6XHJcbiAgICAgICAgIGdzdF9hbW91bnQgPSB0YXhhYmxlX2Ftb3VudCAqIHRheF9wZXJjZW50YWdlLzEwMDtcclxuICAgICAgICAgZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgIGNnc3RfcGVyY2VudCA9IGdzdF9wZXJjZW50LzI7XHJcbiAgICAgICAgIHNnc3RfcGVyY2VudD0gZ3N0X3BlcmNlbnQvMjtcclxuICAgICAgICAgY2dzdF9hbW91bnQgPSBnc3RfYW1vdW50LzI7XHJcbiAgICAgICAgIHNnc3RfYW1vdW50ID0gZ3N0X2Ftb3VudC8yO1xyXG4gICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQrZ3N0X2Ftb3VudDtcclxuICAgICAgICAgdGF4X2Ftb3VudD1nc3RfYW1vdW50O1xyXG4gICAgICAgICBpZ3N0X2Ftb3VudD0wO1xyXG4gICAgICAgICBpZ3N0X3BlcmNlbnQ9MDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiSUdTVFwiIDpcclxuICAgICAgICAgIGlnc3RfYW1vdW50ID0gdGF4YWJsZV9hbW91bnQgKiB0YXhfcGVyY2VudGFnZS8xMDA7XHJcbiAgICAgICAgICBpZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQraWdzdF9hbW91bnQ7XHJcbiAgICAgICAgICB0YXhfYW1vdW50PWlnc3RfYW1vdW50O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0IDpcclxuXHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICAgIGlmKGdyb3NzX2Ftb3VudD4wKXtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCpkaXNjb3VudF9hbW91bnQvZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgdG90YWw6YW55ID17fTtcclxuICAgICAgdG90YWxbJ3N1cmNoYXJnZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHN1cmNoYXJnZSk7XHJcbiAgICAgIHRvdGFsWydpZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChjZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnc2dzdF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9wZXJjZW50KTtcclxuXHJcbiAgICAgIHRvdGFsWydzZXpfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHNlel9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2dyb3NzX2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsndGF4YWJsZV9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGNnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3Nnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsnaWdzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyd0YXhfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQodGF4X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydzZXpfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2V6X2Ftb3VudCk7XHJcbiAgICAgIC8vIHRvdGFsWyduZXRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyduZXRfcGF5YmxlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X3BheWJsZSk7XHJcbiAgICAgIHRlbXBsYXRlVmFsdWUgPSB7fTtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsndG90YWxfYW1vdW50J10gPSB0b3RhbDtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlX2xpbXNfaW52b2ljZSh0ZW1wbGF0ZVZhbHVlOmFueSwgbGltc19zZWdtZW50OmFueSwgY2FsY3VsYXRlX29uX2ZpZWxkOiBhbnkpIHtcclxuICAgIGlmIChjYWxjdWxhdGVfb25fZmllbGQgPT0gbnVsbCB8fCBjYWxjdWxhdGVfb25fZmllbGQgPT0gJycpIHtcclxuICAgICAgY2FsY3VsYXRlX29uX2ZpZWxkID0gJ2l0ZW1zX2xpc3QnO1xyXG4gICAgfVxyXG4gICAgbGV0IHN1cmNoYXJnZSA9IDA7XHJcbiAgICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHRheGFibGVfYW1vdW50ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50ID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGRdKSAmJiB0ZW1wbGF0ZVZhbHVlW2NhbGN1bGF0ZV9vbl9maWVsZF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlW2NhbGN1bGF0ZV9vbl9maWVsZF0uZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZWxlbWVudC50b3RhbCkpIHtcclxuICAgICAgICAgIC8vIGdyb3NzX2Ftb3VudD1ncm9zc19hbW91bnQrZWxlbWVudC5ncm9zc19hbW91bnRcclxuICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGVsZW1lbnQudG90YWxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQuc2FtcGxpbmdfY2hhcmdlKSkge1xyXG4gICAgICAgICAgLy8gc3VyY2hhcmdlPXN1cmNoYXJnZStlbGVtZW50LnN1cmNoYXJnZVxyXG4gICAgICAgICAgc3VyY2hhcmdlID0gc3VyY2hhcmdlICsgZWxlbWVudC5zYW1wbGluZ19jaGFyZ2VcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQuZGlzY291bnRfYW1vdW50KSkge1xyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZGlzY291bnRfYW1vdW50ICsgZWxlbWVudC5kaXNjb3VudF9hbW91bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQubmV0X2Ftb3VudCkpIHtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBuZXRfYW1vdW50ICsgZWxlbWVudC5uZXRfYW1vdW50XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBuZXRfYW1vdW50ICsgZWxlbWVudC50b3RhbFxyXG4gICAgICAgIH1cclxuICAgICAgICB0YXhhYmxlX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzdXJjaGFyZ2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGVtcGxhdGVWYWx1ZSA9IHRoaXMudXBkYXRlX2ludm9pY2VfdG90YXRsKHRlbXBsYXRlVmFsdWUsIGdyb3NzX2Ftb3VudCwgZGlzY291bnRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBuZXRfYW1vdW50LCBzdXJjaGFyZ2UsIHRheGFibGVfYW1vdW50KTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlX2xpbXNfaW52b2ljZV9leHRyYV9hbW91bnQodGVtcGxhdGVWYWx1ZTphbnksIGxpbXNfc2VnbWVudDphbnksIGNhbGN1bGF0ZV9vbl9maWVsZDogYW55KSB7XHJcbiAgICBpZiAoY2FsY3VsYXRlX29uX2ZpZWxkID09IG51bGwgfHwgY2FsY3VsYXRlX29uX2ZpZWxkID09ICcnKSB7XHJcbiAgICAgIGNhbGN1bGF0ZV9vbl9maWVsZCA9ICdpdGVtc19saXN0JztcclxuICAgIH1cclxuICAgIGxldCBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgIGxldCB0YXhhYmxlX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZXh0cmFBbW91bnQgPSAwXHJcblxyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlX29uX2ZpZWxkXSkgJiYgdGVtcGxhdGVWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGRdLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGRdLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQudG90YWwpKSB7XHJcbiAgICAgICAgICAvLyBncm9zc19hbW91bnQ9Z3Jvc3NfYW1vdW50K2VsZW1lbnQuZ3Jvc3NfYW1vdW50XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBlbGVtZW50LnRvdGFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LnNhbXBsaW5nX2NoYXJnZSkpIHtcclxuICAgICAgICAgIC8vIHN1cmNoYXJnZT1zdXJjaGFyZ2UrZWxlbWVudC5zdXJjaGFyZ2VcclxuICAgICAgICAgIHN1cmNoYXJnZSA9IHN1cmNoYXJnZSArIGVsZW1lbnQuc2FtcGxpbmdfY2hhcmdlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LmRpc2NvdW50X2Ftb3VudCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGVsZW1lbnQuZGlzY291bnRfYW1vdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50Lm5ldF9hbW91bnQpKSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQubmV0X2Ftb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQudG90YWxcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmV4dHJhX2Ftb3VudCkge1xyXG4gICAgICAgICAgZXh0cmFBbW91bnQgPSBOdW1iZXIoZXh0cmFBbW91bnQpICsgTnVtYmVyKGVsZW1lbnQuZXh0cmFfYW1vdW50KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0YXhhYmxlX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzdXJjaGFyZ2UgKyBleHRyYUFtb3VudDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0ZW1wbGF0ZVZhbHVlID0gdGhpcy51cGRhdGVfaW52b2ljZV90b3RhdGxfZXh0cmFfYW1vdW50KHRlbXBsYXRlVmFsdWUsIGdyb3NzX2Ftb3VudCwgZGlzY291bnRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBuZXRfYW1vdW50LCBzdXJjaGFyZ2UsIGV4dHJhQW1vdW50LCB0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldFBlcmNlbnQodGVtcGxhdGVWYWx1ZTphbnksIHBhcmVudDphbnksIGZpZWxkOmFueSkge1xyXG4gICAgY29uc3QgY2FsY3VsYXRlVmFsdWU6YW55ID0ge307XHJcbiAgICBpZiAoZmllbGQgJiYgZmllbGQuY2FsU291cmNlVGFyZ2V0ICYmIGZpZWxkLmNhbFNvdXJjZVRhcmdldC5sZW5ndGggPj0gMSkge1xyXG4gICAgICBsZXQgc291cmNlID0gZmllbGQuY2FsU291cmNlVGFyZ2V0WzBdLnNvdXJjZTtcclxuICAgICAgbGV0IHRhcmdldCA9IGZpZWxkLmNhbFNvdXJjZVRhcmdldFswXS50YXJnZXQ7XHJcbiAgICAgIGxldCBzb3VyY2VWYWx1ZSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKHNvdXJjZSwgdGVtcGxhdGVWYWx1ZSk7XHJcbiAgICAgIGlmIChzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPSAnJykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgICAgICAgICBsZXQgcGVyY2VudDogYW55O1xyXG4gICAgICAgICAgaWYgKHBhcmVudCAhPSAnJykge1xyXG4gICAgICAgICAgICBwZXJjZW50ID0gdGVtcGxhdGVWYWx1ZVtwYXJlbnQuZmllbGRfbmFtZV1bZmlsZU5hbWVdXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwZXJjZW50ID0gdGVtcGxhdGVWYWx1ZVtmaWxlTmFtZV1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT0gJ251bWJlcicgJiYgcGVyY2VudCAmJiBwZXJjZW50ID49IDEpIHtcclxuICAgICAgICAgICAgbGV0IHBlcmNlbnRWYWx1ZSA9IHNvdXJjZVZhbHVlICogcGVyY2VudCAvIDEwMDtcclxuICAgICAgICAgICAgbGV0IHRhcmdldEZpZWxkcyA9IHRhcmdldC5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0RmllbGRzICYmIHRhcmdldEZpZWxkcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRhcmdldEZpZWxkc1swXTtcclxuICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHRhcmdldEZpZWxkc1sxXTtcclxuICAgICAgICAgICAgICBjYWxjdWxhdGVWYWx1ZVtwYXJlbnRdID0ge307XHJcbiAgICAgICAgICAgICAgY2FsY3VsYXRlVmFsdWVbcGFyZW50XVtjaGlsZF0gPSBwZXJjZW50VmFsdWVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHRhcmdldEZpZWxkc1swXTtcclxuICAgICAgICAgICAgICBjYWxjdWxhdGVWYWx1ZVtjaGlsZF0gPSBwZXJjZW50VmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCAnU291cmNlIFZhbHVlIGlzIG5vdCBhIG51bWJlci4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCAnU291cmNlIEZpZWxkIGlzIFJlcXVpcmVkLicpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FsY3VsYXRlVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX3F1b3RhdGlvbih0ZW1wbGF0ZVZhbHVlOmFueSwgbGltc19zZWdtZW50OmFueSwgZmllbGQ6IGFueSkge1xyXG4gICAgdmFyIHRvdGFsID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50ID0gMDtcclxuICAgIGxldCBzYW1wbGluZ19hbW91bnQgPSAwO1xyXG4gICAgbGV0IGZpbmFsX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgIGxldCBxdW90YXRpb25fcGFyYW1fbWV0aG9kcyA9IFtdO1xyXG4gICAgbGV0IHVuaXRfcHJpY2U6YW55ID0gMDtcclxuICAgIGxldCBwYXJhbUFycmF5OmFueSA9IFtdO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZmllbGRfbmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgICBsZXQgcXR5ID0gMDtcclxuICAgIGxldCBwcm9kdWN0X3dpc2VfcHJpY2luZyA9IHRlbXBsYXRlVmFsdWVbJ3Byb2R1Y3Rfd2lzZV9wcmljaW5nJ107XHJcbiAgICBsZXQgY3VycmVudF9kaXNvdW50ID0gMDtcclxuICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayh0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J10pKSB7XHJcbiAgICAgIGN1cnJlbnRfZGlzb3VudCA9IHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS5xdHkpKSB7XHJcbiAgICAgIHF0eSA9IHRlbXBsYXRlVmFsdWUucXR5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddICE9ICcnICYmIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgICBwYXJhbUFycmF5LnB1c2goZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICYmIHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICE9IG51bGwpIHtcclxuICAgICAgc2FtcGxpbmdfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnc2FtcGxpbmdfY2hhcmdlJ107XHJcbiAgICB9XHJcbiAgICAvLyBpZihncm9zc19hbW91bnQ+MCl7XHJcbiAgICBpZiAodHJ1ZSkge1xyXG4gICAgICBzd2l0Y2ggKGZpZWxkX25hbWUpIHtcclxuICAgICAgICBjYXNlICdwYXJhbWV0ZXJfYXJyYXknOlxyXG4gICAgICAgICAgdW5pdF9wcmljZSA9IDA7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlKSkge1xyXG4gICAgICAgICAgICB1bml0X3ByaWNlID0gdGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHByb2R1Y3Rfd2lzZV9wcmljaW5nKSB7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSBxdHkgKiB1bml0X3ByaWNlO1xyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2UobGltc19zZWdtZW50LCBkYXRhLCBcInF0eVwiKTtcclxuICAgICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwiZGlzY291bnRfcGVyY2VudFwiKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS5xdHkpKSB7XHJcbiAgICAgICAgICAgICAgICBxdHkgPSB0ZW1wbGF0ZVZhbHVlLnF0eTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpbXNfc2VnbWVudCA9PSAnc3RhbmRhcmQnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGFbJ3F0eSddID0gcXR5O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsICdxdHknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGlzY291bnRQZXJjZW50YWdlKGN1cnJlbnRfZGlzb3VudCwgZGlzY291bnRfYW1vdW50LCBncm9zc19hbW91bnQsIHF0eSlcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZGlzY291bnRfcGVyY2VudCc6XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGVtcGxhdGVWYWx1ZVtmaWVsZF9uYW1lXTtcclxuICAgICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2UobGltc19zZWdtZW50LCBkYXRhLCBmaWVsZF9uYW1lKTtcclxuICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gZ3Jvc3NfYW1vdW50ICsgZGF0YVsndG90YWwnXTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgKiBkaXNjb3VudF9wZXJjZW50IC8gMTAwO1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIGRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZGlzY291bnRfYW1vdW50JzpcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJkaXNjb3VudF9wZXJjZW50XCIpO1xyXG4gICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAnbmV0X2Ftb3VudCc6XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlW2ZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBkYXRhLmRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwicXR5XCIpO1xyXG4gICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJkaXNjb3VudF9wZXJjZW50XCIpO1xyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfcGVyY2VudFwiXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfYW1vdW50XCJdID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICd1bml0X3ByaWNlJzpcclxuICAgICAgICAgIHVuaXRfcHJpY2UgPSAwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUudW5pdF9wcmljZSkpIHtcclxuICAgICAgICAgICAgdW5pdF9wcmljZSA9IHRlbXBsYXRlVmFsdWUudW5pdF9wcmljZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBxdHkgKiB1bml0X3ByaWNlO1xyXG5cclxuXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJ1bml0X3ByaWNlXCIpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgICAgIGlmIChwYXJhbUFycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGRhdGFbJ3F0eSddID0gcXR5O1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgZmllbGRfbmFtZSk7XHJcbiAgICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gZ3Jvc3NfYW1vdW50ICsgZGF0YVsndG90YWwnXTtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBkaXNjb3VudF9hbW91bnQgKyBkYXRhWydkaXNjb3VudF9hbW91bnQnXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocHJvZHVjdF93aXNlX3ByaWNpbmcpIHtcclxuICAgICAgICAgICAgdW5pdF9wcmljZSA9IHRlbXBsYXRlVmFsdWVbXCJ1bml0X3ByaWNlXCJdO1xyXG4gICAgICAgICAgICBuZXRfYW1vdW50ID0gdW5pdF9wcmljZSAqIHF0eTtcclxuICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGlzY291bnRQZXJjZW50YWdlKGN1cnJlbnRfZGlzb3VudCwgZGlzY291bnRfYW1vdW50LCBncm9zc19hbW91bnQsIHF0eSlcclxuICAgICAgICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwidW5pdF9wcmljZVwiKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGlzY291bnRQZXJjZW50YWdlKGN1cnJlbnRfZGlzb3VudCwgZGlzY291bnRfYW1vdW50LCBncm9zc19hbW91bnQsIHF0eSlcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZpbmFsX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzYW1wbGluZ19hbW91bnQ7XHJcbiAgICBpZiAodGVtcGxhdGVWYWx1ZVsncXR5J10gPiAwKSB7XHJcbiAgICAgIHVuaXRfcHJpY2UgPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCAvIHRlbXBsYXRlVmFsdWVbJ3F0eSddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVuaXRfcHJpY2UgPSB0ZW1wbGF0ZVZhbHVlW1widW5pdF9wcmljZVwiXTtcclxuICAgIH1cclxuICAgIHRlbXBsYXRlVmFsdWVbJ3RvdGFsJ10gPSBncm9zc19hbW91bnQ7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQpO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZmluYWxfYW1vdW50KTtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ3VuaXRfcHJpY2UnXSA9IHVuaXRfcHJpY2U7XHJcbiAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10gPSBwYXJhbUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG5cclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZV9xdW90YXRpb25fZm9yX2xpbXModGVtcGxhdGVWYWx1ZTphbnksIGxpbXNfc2VnbWVudDphbnksIGZpZWxkOiBhbnkpIHtcclxuICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgc2FtcGxpbmdfYW1vdW50ID0gMDtcclxuICAgIGxldCBmaW5hbF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgcXVvdGF0aW9uX3BhcmFtX21ldGhvZHMgPSBbXTtcclxuICAgIGxldCB1bml0X3ByaWNlOmFueSA9IDA7XHJcbiAgICBsZXQgcGFyYW1BcnJheTphbnkgPSBbXTtcclxuICAgIGxldCBncm9zc19hbW91bnQgPSAwO1xyXG4gICAgbGV0IGZpZWxkX25hbWUgPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgbGV0IHF0eSA9IDA7XHJcbiAgICBsZXQgcHJvZHVjdF93aXNlX3ByaWNpbmcgPSB0ZW1wbGF0ZVZhbHVlWydwcm9kdWN0X3dpc2VfcHJpY2luZyddO1xyXG4gICAgbGV0IGN1cnJlbnRfZGlzb3VudCA9IDA7XHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddKSkge1xyXG4gICAgICBjdXJyZW50X2Rpc291bnQgPSB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUucXR5KSkge1xyXG4gICAgICBxdHkgPSB0ZW1wbGF0ZVZhbHVlLnF0eTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhID0geyAuLi5lbGVtZW50IH07XHJcbiAgICAgICAgcGFyYW1BcnJheS5wdXNoKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZihncm9zc19hbW91bnQ+MCl7XHJcbiAgICBpZiAodHJ1ZSkge1xyXG4gICAgICBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgIGRhdGFbJ3F0eSddID0gcXR5O1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2UobGltc19zZWdtZW50LCBkYXRhLCBmaWVsZF9uYW1lKTtcclxuICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9kdWN0X3dpc2VfcHJpY2luZykge1xyXG4gICAgICAgIHVuaXRfcHJpY2UgPSB0ZW1wbGF0ZVZhbHVlW1widW5pdF9wcmljZVwiXTtcclxuICAgICAgICBuZXRfYW1vdW50ID0gdW5pdF9wcmljZSAqIHF0eTtcclxuICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSBkaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwidW5pdF9wcmljZVwiKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGVtcGxhdGVWYWx1ZVsndG90YWwnXSA9IGdyb3NzX2Ftb3VudDtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSB1bml0X3ByaWNlO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQ6IGFueSwgZGF0YTogYW55LCBmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoIChsaW1zX3NlZ21lbnQpIHtcclxuICAgICAgY2FzZSAnc3RhbmRhcmQnOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltcyhkYXRhLCBmaWVsZE5hbWUpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2F1dG9tb3RpdmUnOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yQXV0b21vdGl2ZUxpbXMoZGF0YSwgZmllbGROYW1lKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc2FtcGxpbmdBbW91bnRBZGRpdGlvbih0ZW1wbGF0ZVZhbHVlOmFueSkge1xyXG4gICAgbGV0IG5ldF9hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J107XHJcbiAgICBsZXQgc2FtcGxpbmdfY2hhcmdlID0gdGVtcGxhdGVWYWx1ZVsnc2FtcGxpbmdfY2hhcmdlJ107XHJcbiAgICBsZXQgdG90bCA9IG5ldF9hbW91bnQgKyBzYW1wbGluZ19jaGFyZ2U7XHJcblxyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSB0b3RsXHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHF1b3RlX2Ftb3VudF92aWFfZGlzY291bnRfcGVyY2VudChsaXN0T2ZQYXJtOmFueSwgdGVtcGxhdGVWYWx1ZTphbnkpIHtcclxuICAgIGxldCBkaXNjb3VudCA9IHRlbXBsYXRlVmFsdWUuZGlzY291bnRfcGVyY2VudDtcclxuICAgIGxldCBxdWFudGl0eSA9IHRlbXBsYXRlVmFsdWUucXR5O1xyXG4gICAgbGV0IHVwZGF0ZWRQYXJhbXNMaXN0OmFueSA9IFtdO1xyXG4gICAgbGlzdE9mUGFybS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50KSk7XHJcbiAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICBkYXRhWydxdHknXSA9IHF1YW50aXR5O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZU5ldEFtb3VudChkYXRhLCBcImRpc2NvdW50X3BlcmNlbnRcIiwgXCJcIik7XHJcbiAgICAgIHVwZGF0ZWRQYXJhbXNMaXN0LnB1c2goZGF0YSk7XHJcbiAgICB9KTtcclxuICAgIHRlbXBsYXRlVmFsdWVbXCJxdW90YXRpb25fcGFyYW1fbWV0aG9kc1wiXSA9IHVwZGF0ZWRQYXJhbXNMaXN0O1xyXG4gICAgbGV0IHRvdGFsID0gdGVtcGxhdGVWYWx1ZVtcInRvdGFsXCJdO1xyXG4gICAgbGV0IGRpc2NvdW50X2Ftb3VudDphbnkgPSB0aGlzLmdldERlY2ltYWxBbW91bnQodG90YWwgKiBkaXNjb3VudCAvIDEwMCk7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IHRvdGFsIC0gZGlzY291bnRfYW1vdW50O1xyXG5cclxuICAgIGxldCBmaW5hbF9hbW91bnQgPSBuZXRfYW1vdW50ICsgdGVtcGxhdGVWYWx1ZVtcInNhbXBsaW5nX2NoYXJnZVwiXTtcclxuICAgIGxldCB1bml0X3ByaWNlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQgLyB0ZW1wbGF0ZVZhbHVlWydxdHknXSk7XHJcblxyXG4gICAgdGVtcGxhdGVWYWx1ZVsndG90YWwnXSA9IHRvdGFsO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSBmaW5hbF9hbW91bnQ7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSB1bml0X3ByaWNlO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVJbnZvaWNlVG90YWxBbW91bnQoZm9ybVZhbHVlOmFueSwgaW52b2ljZUluZm9zOmFueSkge1xyXG4gICAgbGV0IGxpc3QgPSBpbnZvaWNlSW5mb3M7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRvdGFsICs9IGxpc3RbaV1bJ25ldHBheWFibGVBbW91bnQnXVxyXG4gICAgfVxyXG4gICAgbGV0IGx1bXBTdW1BbW91bnQgPSBmb3JtVmFsdWVbJ2x1bXBTdW1BbW91bnQnXVxyXG4gICAgbGV0IGFkdmFuY2VBbW91bnQgPSBmb3JtVmFsdWVbJ2FkdmFuY2VBbW91bnQnXTtcclxuICAgIGxldCB0b2F0YWxsdW1zdW1PckFkdmFuY2UgPSBsdW1wU3VtQW1vdW50ICsgYWR2YW5jZUFtb3VudDtcclxuICAgIGxldCB0b3RhbEZhaXIgPSB0b3RhbCAtIHRvYXRhbGx1bXN1bU9yQWR2YW5jZTtcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIHRvdGFsQW1vdW50OiAodG90YWwpLnRvRml4ZWQoMiksXHJcbiAgICAgIHBheUFtb3VudDogKHRvdGFsRmFpcikudG9GaXhlZCgyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHF1b3RlX2Ftb3VudF92aWFfc2FtcGxlX25vKHRlbXBsYXRlVmFsdWU6YW55LCBsaXN0T2ZQYXJtOmFueSkge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gdGVtcGxhdGVWYWx1ZS5xdHk7XHJcbiAgICBsZXQgZGlzY291bnQgPSB0ZW1wbGF0ZVZhbHVlLmRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICBsZXQgdXBkYXRlZFBhcmFtc0xpc3Q6YW55ID0gW107XHJcbiAgICBsaXN0T2ZQYXJtLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50KSk7XHJcbiAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICBkYXRhWydxdHknXSA9IHF1YW50aXR5O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZU5ldEFtb3VudChkYXRhLCBcInF0eVwiLCBcIlwiKTtcclxuICAgICAgdXBkYXRlZFBhcmFtc0xpc3QucHVzaChkYXRhKVxyXG4gICAgfSk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlW1wicXVvdGF0aW9uX3BhcmFtX21ldGhvZHNcIl0gPSB1cGRhdGVkUGFyYW1zTGlzdDtcclxuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVFxdW90ZUFtb3VudCh0ZW1wbGF0ZVZhbHVlLCB7IGZpZWxkX25hbWU6IFwicXVvdGF0aW9uX3BhcmFtX21ldGhvZHNcIiB9KTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUludm9pY2VPcmRlckFtb3VudCh0ZW1wbGF0ZUZvcm06IFVudHlwZWRGb3JtR3JvdXAsIGZpZWxkOiBhbnkpIHtcclxuICAgIHZhciBuZXRfYW1vdW50ID0gMDtcclxuICAgIHZhciBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgdmFyIGlnc3RfYW1vdW50ID0gMDtcclxuICAgIHZhciBzZ3N0X2Ftb3VudCA9IDA7XHJcbiAgICB2YXIgY2dzdF9hbW91bnQgPSAwO1xyXG4gICAgdmFyIG5ldFBheWFibGUgPSAwO1xyXG4gICAgdmFyIHN1cmNoYXJnZSA9IDA7XHJcbiAgICB2YXIgc2V6X2Ftb3VudCA9IDA7XHJcbiAgICB2YXIgdG90YWwgPSAwO1xyXG4gICAgbGV0IHRlbXBsYXRlVmFsdWUgPSB0ZW1wbGF0ZUZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgIGlmICh0ZW1wbGF0ZVZhbHVlWydpdGVtc19saXN0J10gIT0gJycgJiYgdGVtcGxhdGVWYWx1ZVsnaXRlbXNfbGlzdCddLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsnaXRlbXNfbGlzdCddLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IG5ldF9hbW91bnQgKyBlbGVtZW50Lm5ldF9hbW91bnQ7XHJcbiAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZGlzY291bnRfYW1vdW50ICsgZWxlbWVudC5kaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgc3VyY2hhcmdlID0gc3VyY2hhcmdlICsgZWxlbWVudC5zdXJjaGFyZ2U7XHJcbiAgICAgICAgdG90YWwgPSB0b3RhbCArIGVsZW1lbnQudG90YWw7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGVtcGxhdGVWYWx1ZVsndGF4X3R5cGUnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddID09IFwiR1NUXCIpIHtcclxuICAgICAgICBzZ3N0X2Ftb3VudCA9IChuZXRfYW1vdW50ICogdGVtcGxhdGVWYWx1ZVsndGF4X3BlcmNlbnRhZ2UnXSkgLyAyMDA7XHJcbiAgICAgICAgY2dzdF9hbW91bnQgPSBzZ3N0X2Ftb3VudDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddICE9ICcnICYmIHRlbXBsYXRlVmFsdWVbJ3RheF90eXBlJ10gPT0gXCJJR1NUXCIpIHtcclxuICAgICAgICBpZ3N0X2Ftb3VudCA9IChuZXRfYW1vdW50ICogdGVtcGxhdGVWYWx1ZVsndGF4X3BlcmNlbnRhZ2UnXSkgLyAxMDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG5ldFBheWFibGUgPSBuZXRfYW1vdW50ICsgaWdzdF9hbW91bnQgKyBzZ3N0X2Ftb3VudCArIGNnc3RfYW1vdW50ICsgc2V6X2Ftb3VudDtcclxuICAgIGNvbnN0IGZpZWxkV2l0aFZhbHVlID0ge1xyXG4gICAgICBmaWVsZDogJ3RvdGFsX2Ftb3VudCcsIHZhbHVlOiBbXHJcbiAgICAgICAgeyBmaWVsZDogJ3RheGFibGVfYW1vdW50JywgdmFsdWU6IG5ldF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnc2dzdF9hbW91bnQnLCB2YWx1ZTogc2dzdF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnY2dzdF9hbW91bnQnLCB2YWx1ZTogY2dzdF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnaWdzdF9hbW91bnQnLCB2YWx1ZTogaWdzdF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnbmV0X3BheWJsZScsIHZhbHVlOiBuZXRQYXlhYmxlIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJ2Rpc2NvdW50X2Ftb3VudCcsIHZhbHVlOiBkaXNjb3VudF9hbW91bnQgfSxcclxuICAgICAgXVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVJblZpZWxkc0ZvckNoaWxkKHRlbXBsYXRlRm9ybSwgZmllbGRXaXRoVmFsdWUpO1xyXG4gIH1cclxuICBzZXRWYWx1ZUluVmllbGRzRm9yQ2hpbGQodGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwLCBmaWVsZDogYW55KSB7XHJcbiAgICAoPFVudHlwZWRGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzWyd0b3RhbF9hbW91bnQnXSkuYWRkQ29udHJvbCgnZGlzY291bnRfYW1vdW50JywgbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJykpXHJcbiAgICBmaWVsZC52YWx1ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAoPFVudHlwZWRGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkLmZpZWxkXSkuY29udHJvbHNbZWxlbWVudC5maWVsZF0ucGF0Y2hWYWx1ZShlbGVtZW50LnZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlRm9ybTtcclxuICB9XHJcbiAgY2FsY3VsYXRlQWRkaXRpb25hbENvc3Qob2JqOmFueSl7XHJcbiAgICBsZXQgbGlzdCA9IG9ialsnYWRkaXRpb25hbF9jb3N0J107XHJcbiAgICBsZXQgc3VtID0gMDtcclxuICAgIGxldCBuZXRfYW10ID0gb2JqWyduZXRfYW1vdW50J107XHJcbiAgICBpZihsaXN0ICE9IG51bGwgJiYgbGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgbGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIHN1bSArPSArKGVsZW1lbnQuYW1vdW50KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgZmluYWxfYW10ID0gc3VtK25ldF9hbXQ7XHJcbiAgICBvYmpbJ3NhbXBsaW5nX2NoYXJnZSddID0gc3VtO1xyXG4gICAgb2JqWydmaW5hbF9hbW91bnQnXSA9IGZpbmFsX2FtdDtcclxuICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHVwZGF0ZV9pbnZvaWNlX3RvdGF0bCh0ZW1wbGF0ZVZhbHVlOmFueSxncm9zc19hbW91bnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIsZGlzY291bnRfcGVyY2VudDphbnksbmV0X2Ftb3VudDpudW1iZXIsc3VyY2hhcmdlOm51bWJlcix0YXhhYmxlX2Ftb3VudDpudW1iZXIsZmllbGQ/OmFueSl7XHJcbiAgICBsZXRcdGdzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHRjZ3N0X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdHNnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0aWdzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHR0YXhfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0c2V6X2Ftb3VudFx0PTA7XHJcblxyXG4gICAgbGV0XHRuZXRfcGF5YmxlXHQ9MDtcclxuXHJcbiAgICBsZXRcdGlnc3RfcGVyY2VudFx0PTA7XHJcbiAgICBsZXRcdGdzdF9wZXJjZW50XHQ9MDtcclxuICAgIGxldFx0c2V6X3BlcmNlbnRcdD0wO1xyXG4gICAgbGV0IGNnc3RfcGVyY2VudD0wO1xyXG4gICAgbGV0IHNnc3RfcGVyY2VudD0wO1xyXG4gICAgbGV0IHRheF9wZXJjZW50YWdlID0gMDtcclxuICAgIGxldCB0YXhfdHlwZSA9IHRlbXBsYXRlVmFsdWVbJ3RheF90eXBlJ107XHJcblxyXG4gICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS50YXhfcGVyY2VudGFnZSkpe1xyXG4gICAgICB0YXhfcGVyY2VudGFnZSA9IHRlbXBsYXRlVmFsdWUudGF4X3BlcmNlbnRhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoKCh0YXhfdHlwZT09bnVsbCB8fCB0YXhfdHlwZT09dW5kZWZpbmVkIHx8IHRheF90eXBlPT0nTkEnKSAmJiB0YXhfcGVyY2VudGFnZT09MCkgfHwgIHRheF90eXBlPT0nTm90IEFwcGxpY2FibGUnKVxyXG4gICAge1xyXG4gICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQ7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHN3aXRjaCh0YXhfdHlwZSl7XHJcbiAgICAgICAgY2FzZSBcIkdTVFwiIDpcclxuICAgICAgICAgZ3N0X2Ftb3VudCA9IHRheGFibGVfYW1vdW50ICogdGF4X3BlcmNlbnRhZ2UvMTAwO1xyXG4gICAgICAgICBnc3RfcGVyY2VudD10YXhfcGVyY2VudGFnZTtcclxuICAgICAgICAgY2dzdF9wZXJjZW50ID0gZ3N0X3BlcmNlbnQvMjtcclxuICAgICAgICAgc2dzdF9wZXJjZW50PSBnc3RfcGVyY2VudC8yO1xyXG4gICAgICAgICBjZ3N0X2Ftb3VudCA9IGdzdF9hbW91bnQvMjtcclxuICAgICAgICAgc2dzdF9hbW91bnQgPSBnc3RfYW1vdW50LzI7XHJcbiAgICAgICAgIG5ldF9wYXlibGUgPSB0YXhhYmxlX2Ftb3VudCtnc3RfYW1vdW50O1xyXG4gICAgICAgICB0YXhfYW1vdW50PWdzdF9hbW91bnQ7XHJcbiAgICAgICAgIGlnc3RfYW1vdW50PTA7XHJcbiAgICAgICAgIGlnc3RfcGVyY2VudD0wO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJJR1NUXCIgOlxyXG4gICAgICAgICAgaWdzdF9hbW91bnQgPSB0YXhhYmxlX2Ftb3VudCAqIHRheF9wZXJjZW50YWdlLzEwMDtcclxuICAgICAgICAgIGlnc3RfcGVyY2VudD10YXhfcGVyY2VudGFnZTtcclxuICAgICAgICAgIG5ldF9wYXlibGUgPSB0YXhhYmxlX2Ftb3VudCtpZ3N0X2Ftb3VudDtcclxuICAgICAgICAgIHRheF9hbW91bnQ9aWdzdF9hbW91bnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQgOlxyXG5cclxuICAgIH1cclxuICAgIH1cclxuICAgICAgaWYoZ3Jvc3NfYW1vdW50PjApe1xyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoMTAwKmRpc2NvdW50X2Ftb3VudC9ncm9zc19hbW91bnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCB0b3RhbDphbnkgPXt9O1xyXG4gICAgICB0b3RhbFsnc3VyY2hhcmdlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc3VyY2hhcmdlKTtcclxuICAgICAgdG90YWxbJ2lnc3RfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGlnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydnc3RfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdzdF9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2Nnc3RfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGNnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydzZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzZ3N0X3BlcmNlbnQpO1xyXG5cclxuICAgICAgdG90YWxbJ3Nlel9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2V6X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnZ3Jvc3NfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2Rpc2NvdW50X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyd0YXhhYmxlX2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHRheGFibGVfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ2dzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ2Nnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoY2dzdF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsnc2dzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydpZ3N0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGlnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3RheF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0YXhfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3Nlel9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzZXpfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ25ldF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ25ldF9wYXlibGUnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfcGF5YmxlKTtcclxuXHJcbiAgICAgIGlmKGZpZWxkICE9IG51bGwgJiYgZmllbGQuZmllbGRfbmFtZSAhPSBudWxsICYmIGZpZWxkICE9IFwiXCIpe1xyXG4gICAgICAgIGRlbGV0ZSB0b3RhbFtmaWVsZC5maWVsZF9uYW1lXVxyXG4gICAgICB9XHJcbiAgICAgIHRlbXBsYXRlVmFsdWUgPSB7fTtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsndG90YWxfYW1vdW50J10gPSB0b3RhbDtcclxuICAgICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgdXBkYXRlX2ludm9pY2VfdG90YXRsX2V4dHJhX2Ftb3VudCh0ZW1wbGF0ZVZhbHVlOmFueSxncm9zc19hbW91bnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIsZGlzY291bnRfcGVyY2VudDphbnksbmV0X2Ftb3VudDpudW1iZXIsc3VyY2hhcmdlOm51bWJlcixleHRyYUFtb3VudDpudW1iZXIsdGF4YWJsZV9hbW91bnQ6bnVtYmVyLGZpZWxkPzphbnkpe1xyXG4gICAgbGV0XHRnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0Y2dzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHRzZ3N0X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdGlnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0dGF4X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9hbW91bnRcdD0wO1xyXG5cclxuICAgIGxldFx0bmV0X3BheWJsZVx0PTA7XHJcblxyXG4gICAgbGV0XHRpZ3N0X3BlcmNlbnRcdD0wO1xyXG4gICAgbGV0XHRnc3RfcGVyY2VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9wZXJjZW50XHQ9MDtcclxuICAgIGxldCBjZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCBzZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCB0YXhfcGVyY2VudGFnZSA9IDA7XHJcbiAgICBsZXQgdGF4X3R5cGUgPSB0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddO1xyXG5cclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUudGF4X3BlcmNlbnRhZ2UpKXtcclxuICAgICAgdGF4X3BlcmNlbnRhZ2UgPSB0ZW1wbGF0ZVZhbHVlLnRheF9wZXJjZW50YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCgodGF4X3R5cGU9PW51bGwgfHwgdGF4X3R5cGU9PXVuZGVmaW5lZCB8fCB0YXhfdHlwZT09J05BJykgJiYgdGF4X3BlcmNlbnRhZ2U9PTAgKSB8fCB0YXhfdHlwZT09J05vdCBBcHBsaWNhYmxlJylcclxuICAgIHtcclxuICAgICAgbmV0X3BheWJsZSA9IHRheGFibGVfYW1vdW50O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2godGF4X3R5cGUpe1xyXG4gICAgICAgIGNhc2UgXCJHU1RcIiA6XHJcbiAgICAgICAgIGdzdF9hbW91bnQgPSB0YXhhYmxlX2Ftb3VudCAqIHRheF9wZXJjZW50YWdlLzEwMDtcclxuICAgICAgICAgZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgIGNnc3RfcGVyY2VudCA9IGdzdF9wZXJjZW50LzI7XHJcbiAgICAgICAgIHNnc3RfcGVyY2VudD0gZ3N0X3BlcmNlbnQvMjtcclxuICAgICAgICAgY2dzdF9hbW91bnQgPSBnc3RfYW1vdW50LzI7XHJcbiAgICAgICAgIHNnc3RfYW1vdW50ID0gZ3N0X2Ftb3VudC8yO1xyXG4gICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQrZ3N0X2Ftb3VudDtcclxuICAgICAgICAgdGF4X2Ftb3VudD1nc3RfYW1vdW50O1xyXG4gICAgICAgICBpZ3N0X2Ftb3VudD0wO1xyXG4gICAgICAgICBpZ3N0X3BlcmNlbnQ9MDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiSUdTVFwiIDpcclxuICAgICAgICAgIGlnc3RfYW1vdW50ID0gdGF4YWJsZV9hbW91bnQgKiB0YXhfcGVyY2VudGFnZS8xMDA7XHJcbiAgICAgICAgICBpZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQraWdzdF9hbW91bnQ7XHJcbiAgICAgICAgICB0YXhfYW1vdW50PWlnc3RfYW1vdW50O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0IDpcclxuXHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICAgIGlmKGdyb3NzX2Ftb3VudD4wKXtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCpkaXNjb3VudF9hbW91bnQvZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgdG90YWw6YW55ID17fTtcclxuICAgICAgdG90YWxbJ3N1cmNoYXJnZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHN1cmNoYXJnZSk7XHJcbiAgICAgIHRvdGFsWydpZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChjZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnc2dzdF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9wZXJjZW50KTtcclxuXHJcbiAgICAgIHRvdGFsWydzZXpfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHNlel9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2dyb3NzX2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsndGF4YWJsZV9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGNnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3Nnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsnaWdzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyd0YXhfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQodGF4X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydzZXpfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2V6X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyduZXRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyduZXRfcGF5YmxlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X3BheWJsZSk7XHJcbiAgICAgIHRvdGFsWydleHRyYUFtb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGV4dHJhQW1vdW50KTtcclxuICAgICAgaWYoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5maWVsZF9uYW1lICE9IG51bGwgJiYgZmllbGQgIT0gXCJcIil7XHJcbiAgICAgICAgZGVsZXRlIHRvdGFsW2ZpZWxkLmZpZWxkX25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgdGVtcGxhdGVWYWx1ZSA9IHt9O1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlWyd0b3RhbF9hbW91bnQnXSA9IHRvdGFsO1xyXG4gICAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICB1cGRhdGVfaW52b2ljZV90b3RhbF9vbl9jdXN0b21fZmllbGQodGVtcGxhdGVWYWx1ZTphbnksbGltc19zZWdtZW50OiBhbnksIGZpZWxkOiBhbnkpe1xyXG4gICAgbGV0IHRvdGFsID10ZW1wbGF0ZVZhbHVlWyd0b3RhbF9hbW91bnQnXTtcclxuICAgIGxldFx0c3VyY2hhcmdlXHQ9dG90YWxbJ3N1cmNoYXJnZSddO1xyXG4gICAgbGV0XHRncm9zc19hbW91bnRcdD10b3RhbFsnZ3Jvc3NfYW1vdW50J107XHJcbiAgICBsZXRcdGRpc2NvdW50X3BlcmNlbnRcdD10b3RhbFsnZGlzY291bnRfcGVyY2VudCddO1xyXG4gICAgbGV0XHRkaXNjb3VudF9hbW91bnQ9XHR0b3RhbFsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICBsZXRcdHRheGFibGVfYW1vdW50PVx0dG90YWxbJ3RheGFibGVfYW1vdW50J107XHJcbiAgICBsZXRcdG5ldF9hbW91bnRcdD10b3RhbFsnbmV0X2Ftb3VudCddO1xyXG5cclxuIGlmKGdyb3NzX2Ftb3VudCl7XHJcbiAgc3dpdGNoKGZpZWxkLmZpZWxkX25hbWUpe1xyXG4gICAgY2FzZSAnZGlzY291bnRfcGVyY2VudCc6XHJcbiAgICAgICAgICBpZihkaXNjb3VudF9wZXJjZW50IT0wKXtcclxuICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50KmRpc2NvdW50X3BlcmNlbnQvMTAwO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgYnJlYWs7XHJcbiAgICBjYXNlICdzdXJjaGFyZ2UnOlxyXG4gICAgaWYoIXN1cmNoYXJnZSl7XHJcbiAgICAgICBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgfVxyXG5icmVhaztcclxuICAgIGNhc2UgJ2Rpc2NvdW50X2Ftb3VudCc6XHJcbiAgICAgICAgICBpZihkaXNjb3VudF9hbW91bnQpe1xyXG4gICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IGRpc2NvdW50X2Ftb3VudCoxMDAvZ3Jvc3NfYW1vdW50O1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQ9MDtcclxuICAgICAgICAgIH1cclxuICAgIGJyZWFrO1xyXG4gfVxyXG59ZWxzZXtcclxuXHJcbiAgZGlzY291bnRfcGVyY2VudD0wO1xyXG4gIGRpc2NvdW50X2Ftb3VudD0wO1xyXG59XHJcblxyXG4gIG5ldF9hbW91bnQgPWdyb3NzX2Ftb3VudC1kaXNjb3VudF9hbW91bnQ7XHJcbiAgdGF4YWJsZV9hbW91bnQgPSBncm9zc19hbW91bnQtZGlzY291bnRfYW1vdW50K3N1cmNoYXJnZTtcclxuICB0ZW1wbGF0ZVZhbHVlID0gdGhpcy51cGRhdGVfaW52b2ljZV90b3RhdGwodGVtcGxhdGVWYWx1ZSxncm9zc19hbW91bnQsZGlzY291bnRfYW1vdW50LGRpc2NvdW50X3BlcmNlbnQsbmV0X2Ftb3VudCxzdXJjaGFyZ2UsdGF4YWJsZV9hbW91bnQsZmllbGQpO1xyXG5cclxuICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuIH1cclxuXHJcblxyXG5cclxuIHBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGE6YW55LG5ldF9hbW91bnQ6bnVtYmVyLGRpc2NvdW50X3BlcmNlbnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIscXVhbnRpdHk6bnVtYmVyLGdyb3NzX2Ftb3VudDpudW1iZXIpe1xyXG4gIGRhdGFbJ25ldF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50KTtcclxuICBpZihkYXRhWyd0b3RhbF9pbmplY3Rpb24nXSAmJiBkYXRhWyd0b3RhbF9pbmplY3Rpb24nXSA+IDApe1xyXG4gICAgZGF0YVsncGVyX3NhbXBsZV9uZXRfcmF0ZSddID0gICB0aGlzLmdldERlY2ltYWxBbW91bnQoZGF0YVsnbmV0X2Ftb3VudCddIC8gZGF0YVsndG90YWxfaW5qZWN0aW9uJ10pO1xyXG4gICAgZGF0YVtcIm9mZmVyX3JhdGVcIl0gPSBkYXRhW1wicGVyX3NhbXBsZV9uZXRfcmF0ZVwiXTtcclxuICB9XHJcbiAgZWxzZSBpZihkYXRhWydxdHknXT4wKXtcclxuICAgIGRhdGFbJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXSA9ICAgdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGFbJ25ldF9hbW91bnQnXSAvIGRhdGFbJ3F0eSddKTtcclxuICAgIGRhdGFbXCJvZmZlcl9yYXRlXCJdID0gZGF0YVtcInBlcl9zYW1wbGVfbmV0X3JhdGVcIl07XHJcbiAgfWVsc2V7XHJcbiAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPTA7XHJcbiAgfVxyXG5cclxuICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X2Ftb3VudCk7XHJcbiAgZGF0YVsncXR5J10gPSBxdWFudGl0eTtcclxuICBkYXRhWyd0b3RhbCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcbiAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAgdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcblxyXG59XHJcblxyXG5zZXRWYWx1ZUluVmllbGRzKHRlbXBsYXRlRm9ybTogVW50eXBlZEZvcm1Hcm91cCwgZmllbGQ6IGFueSkge1xyXG4gIGZpZWxkLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgaWYodGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRdIT09dW5kZWZpbmVkKXtcclxuICAgICAgaWYodHlwZW9mKGVsZW1lbnQudmFsdWUpID09ICdzdHJpbmcnKXtcclxuICAgICAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF0uc2V0VmFsdWUoZWxlbWVudC52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF0uc2V0VmFsdWUodGhpcy5nZXREZWNpbWFsQW1vdW50KGVsZW1lbnQudmFsdWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiB0ZW1wbGF0ZUZvcm07XHJcbn1cclxuXHJcbmNyZWF0ZV9wcm9mZXNzaW9uYWxfZW1haWwodGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwKXtcclxuICBsZXQgdGVtcGxhdGVWYWx1ZSA9IHRlbXBsYXRlRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gIGxldCBuYW1lID0gdGVtcGxhdGVWYWx1ZS5uYW1lO1xyXG4gIGxldCBwcm9mX2VtYWlsID0gXCJcIjtcclxuICBsZXQgc3RydCA9IG5hbWUuc3Vic3RyaW5nKDAsIDIpO1xyXG4gIGxldCBsYXN0ID0gbmFtZS5zbGljZSgtMik7XHJcbiAgcHJvZl9lbWFpbCA9IHN0cnQrbGFzdCtcIkBnbWFpbC5jb21cIjtcclxuICBjb25zdCBmaWVsZFdpdGhWYWx1ZSA9IFtcclxuICAgIHsgZmllbGQ6ICdwcm9mX2VtYWlsJywgdmFsdWU6IHByb2ZfZW1haWwgfSxcclxuICBdXHJcblxyXG4gIHRoaXMuc2V0VmFsdWVJblZpZWxkcyh0ZW1wbGF0ZUZvcm0sIGZpZWxkV2l0aFZhbHVlKTtcclxufVxyXG5hdXRvcG9wdWxhdGVGaWVsZHModGVtcGxhdGVGb3JtOmFueSl7XHJcbiAgbGV0IHRlbXBsYXRlVmFsdWUgPSB0ZW1wbGF0ZUZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICBsZXQgcHJvZHVjdCA9IHRlbXBsYXRlVmFsdWUucHJvZHVjdC5uYW1lO1xyXG4gIGNvbnN0IGZpZWxkV2l0aFZhbHVlID0gW1xyXG4gICAgeyBmaWVsZDogJ3NhbXBsZV9uYW1lJywgdmFsdWU6IHByb2R1Y3QgfSxcclxuICBdXHJcblxyXG4gIHRoaXMuc2V0VmFsdWVJblZpZWxkcyh0ZW1wbGF0ZUZvcm0sIGZpZWxkV2l0aFZhbHVlKTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBzdGFydCBwb2ludCBmb3Igc3Vic2VxdWV0IGNhbGN1bGF0aW9uIGZvciBxdW90YXRpb25cclxuICovXHJcblxyXG5wb3B1bGF0ZVBhcmFtZXRlckFtb3VudFdpdGhTdWJzZXF1ZW50KGRhdGE6YW55LG5ldF9hbW91bnQ6bnVtYmVyLGRpc2NvdW50X3BlcmNlbnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIscXVhbnRpdHk6bnVtYmVyLGdyb3NzX2Ftb3VudDpudW1iZXIsc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQ/Om51bWJlcixzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQ/Om51bWJlcil7XHJcbiAgZGF0YVsnbmV0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQpO1xyXG4gaWYoZGF0YVsncXR5J10+MCl7XHJcbiAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPSAgIHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhWyduZXRfYW1vdW50J10gLyBkYXRhWydxdHknXSk7XHJcbiAgfWVsc2V7XHJcbiAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPTA7XHJcbiAgfVxyXG5cclxuICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X2Ftb3VudCk7XHJcbiAgaWYoc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgfHwgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPT0gMCl7XHJcbiAgICBkYXRhW1wic3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnRcIl0gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQpO1xyXG4gIH1cclxuICBpZihzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgfHwgc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID09IDApe1xyXG4gICAgZGF0YVtcInN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudFwiXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gIH1cclxuICBkYXRhWydxdHknXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChxdWFudGl0eSk7XHJcbiAgZGF0YVsndG90YWwnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChncm9zc19hbW91bnQpO1xyXG4gIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gIHRoaXMuZ2V0RGVjaW1hbEFtb3VudChncm9zc19hbW91bnQpO1xyXG5cclxufVxyXG5cclxuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltc1dpdGhTdWJzZXF1ZW50KGRhdGE6YW55LCBmaWVsZE5hbWU6YW55KSB7XHJcbiAgICBsZXQgcXVhbnRpdHkgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X3BlcmNlbnQ6YW55ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50OmFueSA9IDA7XHJcbiAgICBsZXQgaW5jb21pbmdfZmllbGQgPSBmaWVsZE5hbWU7XHJcbiAgICBsZXQgc2FsZV9yYXRlID0gZGF0YVsnc2FsZV9yYXRlJ107XHJcbiAgICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgIGxldCBlZmZlY3RpdmVUb3RhbCA9IDA7XHJcbiAgICBsZXQgZGlzX2FtdDphbnkgPSAwO1xyXG4gICAgbGV0IHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50OmFueT0wO1xyXG4gICAgbGV0IHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudDphbnk9MDtcclxuICAgIGxldCB0b3RhbERpc2NvdW50QW1vdW50OmFueT0wO1xyXG4gICAgcXVhbnRpdHkgPSBkYXRhLnF0eTtcclxuICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocXVhbnRpdHkpKSB7XHJcbiAgICAgIHF1YW50aXR5ID0gMDtcclxuICAgIH1cclxuICAgIGlmKHF1YW50aXR5ID4gMCl7XHJcbiAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwICYmIHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgZ3Jvc3NfYW1vdW50ID0gKChxdWFudGl0eSAtIDEpICogZGF0YS5ub19vZl9pbmplY3Rpb24yKSArIHNhbGVfcmF0ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZ3Jvc3NfYW1vdW50ID0gcXVhbnRpdHkgKiBzYWxlX3JhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcblxyXG4gICAgICBjYXNlIFwicXR5XCI6XHJcbiAgICAgICAgLy9lZmZlY3RpdmVUb3RhbCA9ICgrcXVhbnRpdHkpICogKCtkYXRhLm9mZmVyX3JhdGUpO1xyXG4gICAgICAgIGlmKGRhdGEuc3Vic2VxdWVudF9vZmZlcl9yYXRlICYmIGRhdGEuc3Vic2VxdWVudF9vZmZlcl9yYXRlID4gMCAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCAmJiBxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgZWZmZWN0aXZlVG90YWwgPSAoKHF1YW50aXR5IC0gMSkgKiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSkgKyBkYXRhLm9mZmVyX3JhdGU7XHJcbiAgICAgICAgICBpZiAoc2FsZV9yYXRlID4gMCkge1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gc2FsZV9yYXRlIC0gZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCAqIGRpc19hbXQgLyBzYWxlX3JhdGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIGRpc19hbXQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHN1YnNlcUdyb3NzQW1vdW50ID0gKChxdWFudGl0eSAtIDEpICogZGF0YS5ub19vZl9pbmplY3Rpb24yKTtcclxuICAgICAgICAgIGxldCBzdWJzZXFFZmZlY3RpdmVBbW91bnQgPSAoKHF1YW50aXR5IC0gMSkgKiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSk7XHJcbiAgICAgICAgICBpZihzdWJzZXFHcm9zc0Ftb3VudCA+IDApe1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IHN1YnNlcUdyb3NzQW1vdW50IC0gc3Vic2VxRWZmZWN0aXZlQW1vdW50O1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoMTAwICogc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgLyBzdWJzZXFHcm9zc0Ftb3VudCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYoc2FsZV9yYXRlICYmIHNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgICBlZmZlY3RpdmVUb3RhbCA9IHF1YW50aXR5ICogZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGlzX2FtdCA9IGdyb3NzX2Ftb3VudCAtIGVmZmVjdGl2ZVRvdGFsO1xyXG4gICAgICAgICAgaWYgKGdyb3NzX2Ftb3VudCA+IDApIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBkaXNfYW10IC8gZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IGVmZmVjdGl2ZVRvdGFsO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnRXaXRoU3Vic2VxdWVudChkYXRhLCBuZXRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBkaXNfYW10LCBxdWFudGl0eSwgZ3Jvc3NfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudClcclxuXHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZGlzY291bnRfcGVyY2VudFwiOlxyXG4gICAgICBjYXNlIFwic3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50XCI6XHJcblxyXG4gICAgICAgICAgaWYoc2FsZV9yYXRlICYmIHNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRpc2NvdW50X3BlcmNlbnQpKSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gMDtcclxuICAgICAgICAgICAgaWYoZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDAgJiYgcXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgICBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IHNhbGVfcmF0ZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgZWZmZWN0aXZlR3Jvc3NBbW91bnQgPSBxdWFudGl0eSAqIHNhbGVfcmF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkaXNfYW10ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2VmZmVjdGl2ZUdyb3NzQW1vdW50KSAqICgrZGlzY291bnRfcGVyY2VudCkpIC8gMTAwKTtcclxuICAgICAgICAgICAgaWYoZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDAgJiYgcXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgICBkYXRhWydvZmZlcl9yYXRlJ10gPSAoZWZmZWN0aXZlR3Jvc3NBbW91bnQgLSBkaXNfYW10KTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgZGF0YVsnb2ZmZXJfcmF0ZSddID0gKGVmZmVjdGl2ZUdyb3NzQW1vdW50IC0gZGlzX2FtdCkgLyBxdWFudGl0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCkpIHtcclxuICAgICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAqIChxdWFudGl0eSAtMSk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtzdWJzZXF1ZW50R3Jvc3NBbW91bnQpICogKCtzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpKSAvIDEwMCk7XHJcbiAgICAgICAgICAgIGlmKHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgICAgZGF0YVsnc3Vic2VxdWVudF9vZmZlcl9yYXRlJ10gPSAoc3Vic2VxdWVudEdyb3NzQW1vdW50IC0gc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQpIC8gKHF1YW50aXR5LTEpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBkYXRhWydzdWJzZXF1ZW50X29mZmVyX3JhdGUnXSA9IChzdWJzZXF1ZW50R3Jvc3NBbW91bnQgLSBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgdG90YWxEaXNjb3VudEFtb3VudCA9IHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ICsgZGlzX2FtdDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRvdGFsRGlzY291bnRBbW91bnQgPSBkaXNfYW10O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2dyb3NzX2Ftb3VudCkgLSB0b3RhbERpc2NvdW50QW1vdW50KTtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50V2l0aFN1YnNlcXVlbnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInVuaXRfcHJpY2VcIjpcclxuICAgICAgICBpZihkYXRhLnNhbGVfcmF0ZSAmJiBkYXRhLnNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IGRhdGEuZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfcGVyY2VudCkpIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgZWZmZWN0aXZlR3Jvc3NBbW91bnQgPSAwO1xyXG4gICAgICAgICAgaWYocXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgaWYoZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDApe1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gZGF0YS5zYWxlX3JhdGU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gZGF0YS5zYWxlX3JhdGUgKiBxdWFudGl0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gZGF0YS5zYWxlX3JhdGUgKiBxdWFudGl0eTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRpc19hbXQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZWZmZWN0aXZlR3Jvc3NBbW91bnQpICogKCtkaXNjb3VudF9wZXJjZW50KSkgLyAxMDApO1xyXG4gICAgICAgICAgbGV0IG9mZmVyUmF0ZSA9IDA7XHJcbiAgICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgICAgb2ZmZXJSYXRlID0gZGF0YS5zYWxlX3JhdGUgLSBkaXNfYW10O1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBvZmZlclJhdGUgPSBkYXRhLnNhbGVfcmF0ZSAtIChkaXNfYW10IC8gcXVhbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2ZmZXJSYXRlID0gZGF0YS5zYWxlX3JhdGUgLSBkaXNfYW10O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YVsnb2ZmZXJfcmF0ZSddID0gb2ZmZXJSYXRlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZGlzX2FtdCA9IDA7XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIGRhdGFbJ29mZmVyX3JhdGUnXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwKXtcclxuICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpKSB7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgc3Vic2VxdWVudEdyb3NzQW1vdW50ID0gMDtcclxuICAgICAgICAgIGlmKHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAqIChxdWFudGl0eSAtIDEpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK3N1YnNlcXVlbnRHcm9zc0Ftb3VudCkgKiAoK3N1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCkpIC8gMTAwKTtcclxuICAgICAgICAgIGxldCBvZmZlclJhdGUgPSAwO1xyXG4gICAgICAgICAgaWYocXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgb2ZmZXJSYXRlID0gZGF0YS5ub19vZl9pbmplY3Rpb24yIC0gKHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50IC8gKHF1YW50aXR5IC0gMSkpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIG9mZmVyUmF0ZSA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAtIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YVsnc3Vic2VxdWVudF9vZmZlcl9yYXRlJ10gPSBvZmZlclJhdGU7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgZGF0YVsnc3Vic2VxdWVudF9vZmZlcl9yYXRlJ10gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgdG90YWxEaXNjb3VudEFtb3VudCA9IGRpc19hbXQgKyBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRvdGFsRGlzY291bnRBbW91bnQgPSBkaXNfYW10O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2dyb3NzX2Ftb3VudCkgLSB0b3RhbERpc2NvdW50QW1vdW50KTtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50V2l0aFN1YnNlcXVlbnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpO1xyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJvZmZlcl9yYXRlXCI6XHJcbiAgICAgIGNhc2UgXCJzdWJzZXF1ZW50X29mZmVyX3JhdGVcIjpcclxuICAgICAgICBsZXQgb2ZmZXJfcmF0ZSA9IDA7XHJcbiAgICAgICAgaWYoaW5jb21pbmdfZmllbGQgPT0gXCJzdWJzZXF1ZW50X29mZmVyX3JhdGVcIil7XHJcbiAgICAgICAgICBvZmZlcl9yYXRlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGEuc3Vic2VxdWVudF9vZmZlcl9yYXRlKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIG9mZmVyX3JhdGUgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhvZmZlcl9yYXRlKSkge1xyXG4gICAgICAgICAgb2ZmZXJfcmF0ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIChvZmZlcl9yYXRlID49IDAgKSB7XHJcbiAgICAgICAgICBpZihkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSAmJiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSA+IDAgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDAgJiYgcXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgZWZmZWN0aXZlVG90YWwgPSAoKHF1YW50aXR5IC0gMSkgKiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSkgKyBkYXRhLm9mZmVyX3JhdGU7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYoc2FsZV9yYXRlICYmIHNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVRvdGFsID0gcXVhbnRpdHkgKiBkYXRhLm9mZmVyX3JhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRvdGFsRGlzY291bnRBbW91bnQgPSBncm9zc19hbW91bnQgLSBlZmZlY3RpdmVUb3RhbFxyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIHRvdGFsRGlzY291bnRBbW91bnQ7XHJcbiAgICAgICAgICAvL2lmKGluY29taW5nX2ZpZWxkID09ICdvZmZlcl9yYXRlJyl7XHJcbiAgICAgICAgICAgIGxldCBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGlmKHNhbGVfcmF0ZSAmJiBzYWxlX3JhdGUgPiAwKXtcclxuICAgICAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IHNhbGVfcmF0ZTtcclxuICAgICAgICAgICAgICAgIGRpc19hbXQgPSBlZmZlY3RpdmVHcm9zc0Ftb3VudCAtIGRhdGEub2ZmZXJfcmF0ZTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gc2FsZV9yYXRlICogcXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICBkaXNfYW10ID0gZWZmZWN0aXZlR3Jvc3NBbW91bnQgLSAoZGF0YS5vZmZlcl9yYXRlICogcXVhbnRpdHkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgZGF0YVtcIm9mZmVyX3JhdGVcIl0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlZmZlY3RpdmVHcm9zc0Ftb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCAqIGRpc19hbXQgLyBlZmZlY3RpdmVHcm9zc0Ftb3VudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAvL2lmIChpbmNvbWluZ19maWVsZCA9PSAnc3Vic2VxdWVudF9vZmZlcl9yYXRlJyAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgICAgaWYocXVhbnRpdHkgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSBkYXRhLm5vX29mX2luamVjdGlvbjI7XHJcbiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzdWJzZXF1ZW50R3Jvc3NBbW91bnQgLSBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSk7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3Jvc3NfYW1vdW50IC0gZWZmZWN0aXZlR3Jvc3NBbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgLSAoIGVmZmVjdGl2ZVRvdGFsIC0gZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRhdGFbXCJzdWJzZXF1ZW50X29mZmVyX3JhdGVcIl0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA+IDApe1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCAvIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgdGhpcy5wb3B1bGF0ZVBhcmFtZXRlckFtb3VudFdpdGhTdWJzZXF1ZW50KGRhdGEsIG5ldF9hbW91bnQsIGRpc2NvdW50X3BlcmNlbnQsIGRpc19hbXQsIHF1YW50aXR5LCBncm9zc19hbW91bnQsc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQsc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50KTtcclxuXHJcbiAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgLy8gICBpZihpbmNvbWluZ19maWVsZCA9PSBcInN1YnNlcXVlbnRfb2ZmZXJfcmF0ZVwiKXtcclxuICAgICAgICAvLyAgICAgZGF0YVtcInN1YnNlcXVlbnRfb2ZmZXJfcmF0ZVwiXSA9IG9mZmVyX3JhdGU7XHJcbiAgICAgICAgLy8gICB9ZWxzZXtcclxuICAgICAgICAvLyAgICAgZGF0YVtcIm9mZmVyX3JhdGVcIl0gPSBvZmZlcl9yYXRlO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICBjYXNlIFwic3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnRcIjpcclxuICAgICAgICBpZihpbmNvbWluZ19maWVsZCA9PSAnZGlzY291bnRfYW1vdW50Jyl7XHJcbiAgICAgICAgICBpZihzYWxlX3JhdGUgJiYgc2FsZV9yYXRlID4gMCl7XHJcbiAgICAgICAgICAgIGRpc19hbXQgPSBkYXRhLmRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkaXNfYW10KSkge1xyXG4gICAgICAgICAgICAgIGRpc19hbXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwICYmIHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgICAgZWZmZWN0aXZlR3Jvc3NBbW91bnQgPSBzYWxlX3JhdGU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gcXVhbnRpdHkgKiBzYWxlX3JhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtkaXNfYW10KSAqIDEwMCkgLyAoK2VmZmVjdGl2ZUdyb3NzQW1vdW50KSk7XHJcbiAgICAgICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwICYmIHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgICAgZGF0YVsnb2ZmZXJfcmF0ZSddID0gKGVmZmVjdGl2ZUdyb3NzQW1vdW50IC0gZGlzX2FtdCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRhdGFbJ29mZmVyX3JhdGUnXSA9IChlZmZlY3RpdmVHcm9zc0Ftb3VudCAtIGRpc19hbXQpIC8gcXVhbnRpdHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSBkYXRhLnN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSBkYXRhLnN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgICAgZGlzX2FtdCA9IDA7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KSkge1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgc3Vic2VxdWVudEdyb3NzQW1vdW50ID0gMDtcclxuICAgICAgICAgICAgaWYocXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSBkYXRhLm5vX29mX2luamVjdGlvbjIgKiAocXVhbnRpdHkgLTEpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSBkYXRhLm5vX29mX2luamVjdGlvbjI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK3N1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KSAqIDEwMCkgLyAoK3N1YnNlcXVlbnRHcm9zc0Ftb3VudCkpO1xyXG4gICAgICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgICAgIGRhdGFbJ3N1YnNlcXVlbnRfb2ZmZXJfcmF0ZSddID0gKHN1YnNlcXVlbnRHcm9zc0Ftb3VudCAtIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KSAvIChxdWFudGl0eSAtMSk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRhdGFbJ3N1YnNlcXVlbnRfb2ZmZXJfcmF0ZSddID0gKHN1YnNlcXVlbnRHcm9zc0Ftb3VudCAtIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gZGF0YS5kaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gZGF0YS5kaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICB0b3RhbERpc2NvdW50QW1vdW50ID0gc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgKyBkaXNfYW10O1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdG90YWxEaXNjb3VudEFtb3VudCA9IGRpc19hbXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZ3Jvc3NfYW1vdW50KSAtIHRvdGFsRGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnRXaXRoU3Vic2VxdWVudChkYXRhLCBuZXRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBkaXNfYW10LCBxdWFudGl0eSwgZ3Jvc3NfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCk7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG59XHJcbmNhbGN1bGF0ZVF1b3RhdGlvblBhcmFtZXRlckFtb3VudEZvckF1dG9tb3RpdmVMaW1zV2l0aFN1YnNlcXVlbnQoZGF0YTphbnksIGZpZWxkTmFtZTphbnkpIHtcclxuICAgIGxldCBxdWFudGl0eSA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgY29zdF9yYXRlID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50OmFueSA9IDA7XHJcbiAgICBsZXQgcGFyYW1fcXVhbnRvbSA9IDA7XHJcbiAgICBsZXQgQmFzZV9xdW90YXRpb25fcmF0ZSA9IDA7XHJcbiAgICBsZXQgaW5jb21pbmdfZmllbGQgPSBmaWVsZE5hbWU7XHJcblxyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzX2FtdCA9IDA7XHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcbiAgICAgIGNhc2UgXCJwYXJhbWV0ZXJfcXVhbnR1bVwiOlxyXG4gICAgICAgIGxldCBwYXJhbWV0ZXJRdWFudHVtID0gZGF0YS5wYXJhbWV0ZXJfcXVhbnR1bTtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHBhcmFtZXRlclF1YW50dW0pKSB7XHJcbiAgICAgICAgICBwYXJhbWV0ZXJRdWFudHVtID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVsncXVhbnR1bV9yYXRlJ10gPSAoK2RhdGEucXVvdGF0aW9uX3JhdGUpICogKCtwYXJhbWV0ZXJRdWFudHVtKTtcclxuICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrZGF0YS5xdHkpICogKCtkYXRhLnF1YW50dW1fcmF0ZSk7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9ICtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZVxyXG4gICAgICAgIGlmIChkYXRhLmRpc2NvdW50X3BlcmNlbnQpIHtcclxuICAgICAgICAgIGxldCBkaXNjb3VudCA9ICgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICBkYXRhWydkaXNjb3VudF9hbW91bnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9ICgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGlzY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJxdHlcIjpcclxuICAgICAgICBsZXQgcXVhbnRpdHkgPSBkYXRhLnF0eTtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHF1YW50aXR5KSkge1xyXG4gICAgICAgICAgcXVhbnRpdHkgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK3F1YW50aXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgIGlmIChkYXRhLmRpc2NvdW50X3BlcmNlbnQpIHtcclxuICAgICAgICAgIGxldCBkaXNjb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICBkYXRhWydkaXNjb3VudF9hbW91bnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGF0YVsnZGlzY291bnRfYW1vdW50J10pO1xyXG4gICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuICAgICAgICBkYXRhWyd0b3RhbCddID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlO1xyXG4gICAgICAgIGRhdGFbJ3F0eSddID0gZGF0YS5xdHlcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJkaXNjb3VudF9wZXJjZW50XCI6XHJcbiAgICAgICAgbGV0IGRpc2NvdW50X3BlciA9IGRhdGEuZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRpc2NvdW50X3BlcikpIHtcclxuICAgICAgICAgIGRpc2NvdW50X3BlciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gKCtkYXRhLnF0eSkgKiAoK2RhdGEucXVhbnR1bV9yYXRlKTtcclxuICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgbGV0IGRpc2NvdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGlzY291bnRfcGVyKSkgLyAxMDApO1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtIGRpc2NvdW50KTtcclxuICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50XHJcbiAgICAgICAgZGF0YVsndG90YWwnXSA9ICtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZTtcclxuICAgICAgICBkYXRhWydxdHknXSA9IGRhdGEucXR5O1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9ICtkaXNjb3VudF9wZXI7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICAgIGxldCBkaXNjb3VudF9hbXQgPSBkYXRhLmRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRpc2NvdW50X2FtdCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X2FtdCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXRfYW1vdW50ID0gKCtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSkgLSAoK2Rpc2NvdW50X2FtdCk7XHJcbiAgICAgICAgbGV0IGRpc2NvdW50X3BlcmMgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZGlzY291bnRfYW10KSAqIDEwMCkgLyAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSk7XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSBkaXNjb3VudF9wZXJjO1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gK2RhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YVsncXR5J10gPiAwKSB7XHJcbiAgICAgIGRhdGFbJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhWyduZXRfYW1vdW50J10gLyBkYXRhWydxdHknXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYW5pdGl6ZVBhcmFtZXRlckFtb3VudChkYXRhKTtcclxuICB9XHJcbmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZUZvclN1YnNlcXVlbnQobGltc19zZWdtZW50OiBhbnksIGRhdGE6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICBzd2l0Y2ggKGxpbXNfc2VnbWVudCkge1xyXG4gICAgY2FzZSAnc3RhbmRhcmQnOlxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVF1b3RhdGlvblBhcmFtZXRlckFtb3VudEZvckxpbXNXaXRoU3Vic2VxdWVudChkYXRhLCBmaWVsZE5hbWUpXHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnYXV0b21vdGl2ZSc6XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yQXV0b21vdGl2ZUxpbXNXaXRoU3Vic2VxdWVudChkYXRhLCBmaWVsZE5hbWUpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxufVxyXG5cclxuY2FsY3VsYXRlX3F1b3RhdGlvbl93aXRoX3N1YnNlcXVlbnQodGVtcGxhdGVWYWx1ZTphbnksIGxpbXNfc2VnbWVudDphbnksIGZpZWxkOiBhbnkpIHtcclxuICB2YXIgdG90YWwgPSAwO1xyXG4gIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcbiAgbGV0IHNhbXBsaW5nX2Ftb3VudCA9IDA7XHJcbiAgbGV0IGZpbmFsX2Ftb3VudCA9IDA7XHJcbiAgbGV0IGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgbGV0IHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzID0gW107XHJcbiAgbGV0IHVuaXRfcHJpY2U6YW55ID0gMDtcclxuICBsZXQgcGFyYW1BcnJheTphbnkgPSBbXTtcclxuICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICBsZXQgZmllbGRfbmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgbGV0IHF0eSA9IDA7XHJcbiAgbGV0IHByb2R1Y3Rfd2lzZV9wcmljaW5nID0gdGVtcGxhdGVWYWx1ZVsncHJvZHVjdF93aXNlX3ByaWNpbmcnXTtcclxuICBsZXQgY3VycmVudF9kaXNvdW50ID0gMDtcclxuICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddKSkge1xyXG4gICAgY3VycmVudF9kaXNvdW50ID0gdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUucXR5KSkge1xyXG4gICAgcXR5ID0gdGVtcGxhdGVWYWx1ZS5xdHk7XHJcbiAgfVxyXG5cclxuICBpZiAodGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmxlbmd0aCA+IDApIHtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10uZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgbGV0IGRhdGEgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgcGFyYW1BcnJheS5wdXNoKGRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGlmICh0ZW1wbGF0ZVZhbHVlWydzYW1wbGluZ19jaGFyZ2UnXSAmJiB0ZW1wbGF0ZVZhbHVlWydzYW1wbGluZ19jaGFyZ2UnXSAhPSBudWxsKSB7XHJcbiAgICBzYW1wbGluZ19hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlWydzYW1wbGluZ19jaGFyZ2UnXTtcclxuICB9XHJcbiAgLy8gaWYoZ3Jvc3NfYW1vdW50PjApe1xyXG4gIGlmICh0cnVlKSB7XHJcbiAgICBzd2l0Y2ggKGZpZWxkX25hbWUpIHtcclxuICAgICAgY2FzZSAncGFyYW1ldGVyX2FycmF5JzpcclxuICAgICAgICB1bml0X3ByaWNlID0gMDtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlKSkge1xyXG4gICAgICAgICAgdW5pdF9wcmljZSA9IHRlbXBsYXRlVmFsdWUudW5pdF9wcmljZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2R1Y3Rfd2lzZV9wcmljaW5nKSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gcXR5ICogdW5pdF9wcmljZTtcclxuICAgICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIFwiZGlzY291bnRfcGVyY2VudFwiKTtcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgICB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayh0ZW1wbGF0ZVZhbHVlLnF0eSkpIHtcclxuICAgICAgICAgICAgICBxdHkgPSB0ZW1wbGF0ZVZhbHVlLnF0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGxpbXNfc2VnbWVudCA9PSAnc3RhbmRhcmQnKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhWydxdHknXSA9IHF0eTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsICdxdHknKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gZ3Jvc3NfYW1vdW50ICsgZGF0YVsndG90YWwnXTtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBkaXNjb3VudF9hbW91bnQgKyBkYXRhWydkaXNjb3VudF9hbW91bnQnXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2Rpc2NvdW50X3BlcmNlbnQnOlxyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0ZW1wbGF0ZVZhbHVlW2ZpZWxkX25hbWVdO1xyXG4gICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICBkYXRhLnN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZUZvclN1YnNlcXVlbnQobGltc19zZWdtZW50LCBkYXRhLCBmaWVsZF9uYW1lKTtcclxuICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgfSlcclxuICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgKiBkaXNjb3VudF9wZXJjZW50IC8gMTAwO1xyXG4gICAgICAgIG5ldF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSBuZXRfYW1vdW50IC8gdGVtcGxhdGVWYWx1ZVsncXR5J107XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdkaXNjb3VudF9hbW91bnQnOlxyXG4gICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIGRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KTtcclxuICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICBkYXRhLmRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJkaXNjb3VudF9wZXJjZW50XCIpO1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ3VuaXRfcHJpY2UnXSA9IG5ldF9hbW91bnQgLyB0ZW1wbGF0ZVZhbHVlWydxdHknXTtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSAnbmV0X2Ftb3VudCc6XHJcbiAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgIGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIFwiZGlzY291bnRfcGVyY2VudFwiKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfcGVyY2VudFwiXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVtcImRpc2NvdW50X2Ftb3VudFwiXSA9IGRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSBuZXRfYW1vdW50IC8gdGVtcGxhdGVWYWx1ZVsncXR5J107XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICd1bml0X3ByaWNlJzpcclxuICAgICAgICB1bml0X3ByaWNlID0gMDtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlKSkge1xyXG4gICAgICAgICAgdW5pdF9wcmljZSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0ZW1wbGF0ZVZhbHVlLnVuaXRfcHJpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXRfYW1vdW50ID0gcXR5ICogdW5pdF9wcmljZTtcclxuXHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgIGlmKGRhdGEuc2FsZV9yYXRlICYmIGRhdGEuc2FsZV9yYXRlID4gMCl7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwKXtcclxuICAgICAgICAgICAgZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIFwidW5pdF9wcmljZVwiKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGFbJ3F0eSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHF0eSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIGZpZWxkX25hbWUpO1xyXG4gICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgaWYoZGF0YVsncXR5J10gPiAxKXtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBkaXNjb3VudF9hbW91bnQgKyBkYXRhWydkaXNjb3VudF9hbW91bnQnXSArIGRhdGFbJ3N1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2R1Y3Rfd2lzZV9wcmljaW5nKSB7XHJcbiAgICAgICAgICB1bml0X3ByaWNlID0gdGVtcGxhdGVWYWx1ZVtcInVuaXRfcHJpY2VcIl07XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdW5pdF9wcmljZSAqIHF0eTtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIG5ldF9hbW91bnQ7XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgZGF0YVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZUZvclN1YnNlcXVlbnQobGltc19zZWdtZW50LCBkYXRhLCBcInVuaXRfcHJpY2VcIik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZmluYWxfYW1vdW50ID0gbmV0X2Ftb3VudCArIHNhbXBsaW5nX2Ftb3VudDtcclxuICBpZiAodGVtcGxhdGVWYWx1ZVsncXR5J10gPiAwKSB7XHJcbiAgICB1bml0X3ByaWNlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQgLyB0ZW1wbGF0ZVZhbHVlWydxdHknXSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHVuaXRfcHJpY2UgPSB0ZW1wbGF0ZVZhbHVlW1widW5pdF9wcmljZVwiXTtcclxuICB9XHJcblxyXG4gIHRlbXBsYXRlVmFsdWVbJ3RvdGFsJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3Jvc3NfYW1vdW50KTtcclxuICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50KTtcclxuICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZmluYWxfYW1vdW50KTtcclxuICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQodW5pdF9wcmljZSk7XHJcbiAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSA9IHBhcmFtQXJyYXk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbmQgcG9pbnQgZm9yIHN1YnNlcXVldCBjYWxjdWxhdGlvbiBmb3IgcXVvdGF0aW9uXHJcbiAqL1xyXG5cclxuXHJcbn1cclxuIl19