@bitgo/sdk-coin-eth 26.1.2 → 26.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -129,6 +129,15 @@ class Erc7984Token extends eth_1.Eth {
129
129
  if (params.txParams?.type === 'enabletoken') {
130
130
  return this.verifyEnableTokenTransaction(params);
131
131
  }
132
+ if (params.txParams?.type === 'wrap') {
133
+ return this.verifyWrapTransaction(params);
134
+ }
135
+ if (params.txParams?.type === 'unwrap') {
136
+ return this.verifyUnwrapTransaction(params);
137
+ }
138
+ if (params.txParams?.type === 'finalizeUnwrap') {
139
+ return this.verifyFinalizeUnwrapTransaction(params);
140
+ }
132
141
  if (this.isConsolidationTransaction(params)) {
133
142
  return this.verifyConfidentialConsolidation(params);
134
143
  }
@@ -145,6 +154,244 @@ class Erc7984Token extends eth_1.Eth {
145
154
  txParams?.type === 'consolidateToken' ||
146
155
  txParams?.prebuildTx?.consolidateId);
147
156
  }
157
+ /**
158
+ * Verifies WrapERC7984 (shield) transactions.
159
+ *
160
+ * TSS / direct shape:
161
+ * tx.to = wrapper contract
162
+ * tx.data = wrap(baseAddress, amount)
163
+ *
164
+ * Multisig shape:
165
+ * tx.to = wallet contract
166
+ * tx.data = sendMultiSig(wrapper, 0, wrap(baseAddress, amount), ...)
167
+ *
168
+ * Checks: wrapper address, self-directed `to` == base, amount > 0, amount matches
169
+ * recipients, and amount × rate fits uint64 when statics rate is present.
170
+ */
171
+ async verifyWrapTransaction(params) {
172
+ const { txParams, txPrebuild, wallet } = params;
173
+ if (!txPrebuild?.txHex) {
174
+ throw new Error('verifyWrapTransaction: missing txHex in txPrebuild');
175
+ }
176
+ const txBuilder = this.getTransactionBuilder();
177
+ txBuilder.from(txPrebuild.txHex);
178
+ const tx = await txBuilder.build();
179
+ const txJson = tx.toJson();
180
+ let wrapperAddress;
181
+ let wrapCalldata;
182
+ try {
183
+ if (txJson.data.toLowerCase().startsWith(abstract_eth_1.sendMultisigMethodId.toLowerCase())) {
184
+ const decoded = (0, abstract_eth_1.decodeTransferData)(txJson.data);
185
+ wrapperAddress = decoded.to;
186
+ wrapCalldata = decoded.data;
187
+ if (decoded.amount !== '0') {
188
+ throw new Error(`expected sendMultiSig value 0 but got ${decoded.amount}`);
189
+ }
190
+ }
191
+ else if (txJson.data.toLowerCase().startsWith(abstract_eth_1.wrapMethodId.toLowerCase())) {
192
+ wrapperAddress = txJson.to;
193
+ wrapCalldata = txJson.data;
194
+ }
195
+ else {
196
+ throw new Error(`unexpected method ID ${txJson.data.slice(0, 10)}`);
197
+ }
198
+ }
199
+ catch (e) {
200
+ throw new Error(`verifyWrapTransaction: failed to decode wrap calldata — ${e.message}`);
201
+ }
202
+ if (wrapperAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
203
+ throw new Error(`verifyWrapTransaction: wrapper address mismatch — ` +
204
+ `expected ${this.tokenContractAddress}, got ${wrapperAddress}`);
205
+ }
206
+ let to;
207
+ let amount;
208
+ try {
209
+ ({ to, amount } = (0, abstract_eth_1.decodeWrapCalldata)(wrapCalldata));
210
+ }
211
+ catch (e) {
212
+ throw new Error(`verifyWrapTransaction: invalid wrap inner calldata — ${e.message}`);
213
+ }
214
+ if (!Erc7984Token.isPositiveIntegerString(amount)) {
215
+ throw new Error(`verifyWrapTransaction: amount must be a positive integer string, got '${amount}'`);
216
+ }
217
+ const baseAddress = this.getWalletBaseAddress(wallet);
218
+ if (!baseAddress) {
219
+ throw new Error('verifyWrapTransaction: unable to determine wallet base address');
220
+ }
221
+ if (to.toLowerCase() !== baseAddress.toLowerCase()) {
222
+ throw new Error(`verifyWrapTransaction: wrap recipient must equal wallet base address — expected ${baseAddress}, got ${to}`);
223
+ }
224
+ const expectedAmount = txParams?.recipients?.[0]?.amount ?? txPrebuild.buildParams?.recipients?.[0]?.amount;
225
+ if (expectedAmount !== undefined && String(expectedAmount) !== amount) {
226
+ throw new Error(`verifyWrapTransaction: amount mismatch — calldata has '${amount}' but params have '${expectedAmount}'`);
227
+ }
228
+ const rate = this.tokenConfig.rate;
229
+ if (rate !== undefined) {
230
+ try {
231
+ (0, abstract_eth_1.assertAmountTimesRateFitsUint64)(amount, rate);
232
+ }
233
+ catch (e) {
234
+ throw new Error(`verifyWrapTransaction: ${e.message}`);
235
+ }
236
+ }
237
+ if (txJson.value !== undefined && txJson.value !== '0' && txJson.value !== 0) {
238
+ throw new Error(`verifyWrapTransaction: expected transaction value 0 but got ${txJson.value}`);
239
+ }
240
+ return true;
241
+ }
242
+ /**
243
+ * Verifies UnwrapERC7984 (unshield phase-1) transactions.
244
+ *
245
+ * TSS / direct shape:
246
+ * tx.to = wrapper contract
247
+ * tx.data = unwrap(base, base, encryptedAmount, inputProof)
248
+ *
249
+ * Multisig shape:
250
+ * tx.to = wallet contract
251
+ * tx.data = sendMultiSig(wrapper, 0, unwrap(base, base, ...), ...)
252
+ *
253
+ * v1 is self-directed only: from == to == wallet base address.
254
+ */
255
+ async verifyUnwrapTransaction(params) {
256
+ const { txPrebuild, wallet } = params;
257
+ if (!txPrebuild?.txHex) {
258
+ throw new Error('verifyUnwrapTransaction: missing txHex in txPrebuild');
259
+ }
260
+ const txBuilder = this.getTransactionBuilder();
261
+ txBuilder.from(txPrebuild.txHex);
262
+ const tx = await txBuilder.build();
263
+ const txJson = tx.toJson();
264
+ let wrapperAddress;
265
+ let unwrapCalldata;
266
+ try {
267
+ if (txJson.data.toLowerCase().startsWith(abstract_eth_1.sendMultisigMethodId.toLowerCase())) {
268
+ const decoded = (0, abstract_eth_1.decodeTransferData)(txJson.data);
269
+ wrapperAddress = decoded.to;
270
+ unwrapCalldata = decoded.data;
271
+ if (decoded.amount !== '0') {
272
+ throw new Error(`expected sendMultiSig value 0 but got ${decoded.amount}`);
273
+ }
274
+ }
275
+ else if (txJson.data.toLowerCase().startsWith(abstract_eth_1.unwrapMethodId.toLowerCase())) {
276
+ wrapperAddress = txJson.to;
277
+ unwrapCalldata = txJson.data;
278
+ }
279
+ else {
280
+ throw new Error(`unexpected method ID ${txJson.data.slice(0, 10)}`);
281
+ }
282
+ }
283
+ catch (e) {
284
+ throw new Error(`verifyUnwrapTransaction: failed to decode unwrap calldata — ${e.message}`);
285
+ }
286
+ if (wrapperAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
287
+ throw new Error(`verifyUnwrapTransaction: wrapper address mismatch — expected ${this.tokenContractAddress}, got ${wrapperAddress}`);
288
+ }
289
+ let from;
290
+ let to;
291
+ let encryptedAmount;
292
+ let inputProof;
293
+ try {
294
+ ({ from, to, encryptedAmount, inputProof } = (0, abstract_eth_1.decodeUnwrapCalldata)(unwrapCalldata));
295
+ }
296
+ catch (e) {
297
+ throw new Error(`verifyUnwrapTransaction: invalid unwrap inner calldata — ${e.message}`);
298
+ }
299
+ const baseAddress = this.getWalletBaseAddress(wallet);
300
+ if (!baseAddress) {
301
+ throw new Error('verifyUnwrapTransaction: unable to determine wallet base address');
302
+ }
303
+ if (from.toLowerCase() !== baseAddress.toLowerCase()) {
304
+ throw new Error(`verifyUnwrapTransaction: unwrap from must equal wallet base address — expected ${baseAddress}, got ${from}`);
305
+ }
306
+ if (to.toLowerCase() !== baseAddress.toLowerCase()) {
307
+ throw new Error(`verifyUnwrapTransaction: unwrap to must equal wallet base address — expected ${baseAddress}, got ${to}`);
308
+ }
309
+ if (!encryptedAmount || encryptedAmount === '0x' || /^0x0+$/.test(encryptedAmount)) {
310
+ throw new Error('verifyUnwrapTransaction: encryptedAmount is missing or empty');
311
+ }
312
+ if (!inputProof || inputProof === '0x') {
313
+ throw new Error('verifyUnwrapTransaction: inputProof is missing or empty');
314
+ }
315
+ if (txJson.value !== undefined && txJson.value !== '0' && txJson.value !== 0) {
316
+ throw new Error(`verifyUnwrapTransaction: expected transaction value 0 but got ${txJson.value}`);
317
+ }
318
+ return true;
319
+ }
320
+ /**
321
+ * Verifies FinalizeUnwrapERC7984 (unshield phase-2) transactions.
322
+ *
323
+ * TSS / direct shape:
324
+ * tx.to = wrapper contract
325
+ * tx.data = finalizeUnwrap(requestId, cleartextAmount, decryptionProof)
326
+ *
327
+ * Multisig shape:
328
+ * tx.to = wallet contract
329
+ * tx.data = sendMultiSig(wrapper, 0, finalizeUnwrap(...), ...)
330
+ */
331
+ async verifyFinalizeUnwrapTransaction(params) {
332
+ const { txParams, txPrebuild } = params;
333
+ if (!txPrebuild?.txHex) {
334
+ throw new Error('verifyFinalizeUnwrapTransaction: missing txHex in txPrebuild');
335
+ }
336
+ const txBuilder = this.getTransactionBuilder();
337
+ txBuilder.from(txPrebuild.txHex);
338
+ const tx = await txBuilder.build();
339
+ const txJson = tx.toJson();
340
+ let wrapperAddress;
341
+ let finalizeCalldata;
342
+ try {
343
+ if (txJson.data.toLowerCase().startsWith(abstract_eth_1.sendMultisigMethodId.toLowerCase())) {
344
+ const decoded = (0, abstract_eth_1.decodeTransferData)(txJson.data);
345
+ wrapperAddress = decoded.to;
346
+ finalizeCalldata = decoded.data;
347
+ if (decoded.amount !== '0') {
348
+ throw new Error(`expected sendMultiSig value 0 but got ${decoded.amount}`);
349
+ }
350
+ }
351
+ else if (txJson.data.toLowerCase().startsWith(abstract_eth_1.finalizeUnwrapMethodId.toLowerCase())) {
352
+ wrapperAddress = txJson.to;
353
+ finalizeCalldata = txJson.data;
354
+ }
355
+ else {
356
+ throw new Error(`unexpected method ID ${txJson.data.slice(0, 10)}`);
357
+ }
358
+ }
359
+ catch (e) {
360
+ throw new Error(`verifyFinalizeUnwrapTransaction: failed to decode finalizeUnwrap calldata — ${e.message}`);
361
+ }
362
+ if (wrapperAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
363
+ throw new Error(`verifyFinalizeUnwrapTransaction: wrapper address mismatch — expected ${this.tokenContractAddress}, got ${wrapperAddress}`);
364
+ }
365
+ let requestId;
366
+ let cleartextAmount;
367
+ let decryptionProof;
368
+ try {
369
+ ({ requestId, cleartextAmount, decryptionProof } = (0, abstract_eth_1.decodeFinalizeUnwrapCalldata)(finalizeCalldata));
370
+ }
371
+ catch (e) {
372
+ throw new Error(`verifyFinalizeUnwrapTransaction: invalid finalizeUnwrap inner calldata — ${e.message}`);
373
+ }
374
+ if (!requestId || requestId === '0x' || /^0x0+$/.test(requestId)) {
375
+ throw new Error('verifyFinalizeUnwrapTransaction: requestId is missing or empty');
376
+ }
377
+ if (!Erc7984Token.isPositiveIntegerString(cleartextAmount)) {
378
+ throw new Error(`verifyFinalizeUnwrapTransaction: cleartextAmount must be a positive integer string, got '${cleartextAmount}'`);
379
+ }
380
+ if (BigInt(cleartextAmount) > abstract_eth_1.UINT64_MAX) {
381
+ throw new Error('verifyFinalizeUnwrapTransaction: cleartextAmount exceeds uint64');
382
+ }
383
+ if (!decryptionProof || decryptionProof === '0x') {
384
+ throw new Error('verifyFinalizeUnwrapTransaction: decryptionProof is missing or empty');
385
+ }
386
+ const expectedAmount = txParams?.recipients?.[0]?.amount ?? txPrebuild.buildParams?.recipients?.[0]?.amount;
387
+ if (expectedAmount !== undefined && String(expectedAmount) !== cleartextAmount) {
388
+ throw new Error(`verifyFinalizeUnwrapTransaction: amount mismatch — calldata has '${cleartextAmount}' but params have '${expectedAmount}'`);
389
+ }
390
+ if (txJson.value !== undefined && txJson.value !== '0' && txJson.value !== 0) {
391
+ throw new Error(`verifyFinalizeUnwrapTransaction: expected transaction value 0 but got ${txJson.value}`);
392
+ }
393
+ return true;
394
+ }
148
395
  getWalletBaseAddress(wallet) {
149
396
  if (!wallet) {
150
397
  return undefined;
@@ -696,4 +943,4 @@ Erc7984Token.coinNames = {
696
943
  Mainnet: 'eth',
697
944
  Testnet: 'hteth',
698
945
  };
699
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILDhDQVN5QjtBQUN6Qiw0Q0FBb0Y7QUFDcEYsc0RBa0I2QjtBQUM3QixnREFBeUM7QUFDekMsMENBQTRCO0FBRTVCLCtCQUE0QjtBQUM1QiwrQkFBMkM7QUFJM0MsTUFBYSxZQUFhLFNBQVEsU0FBRztJQVFuQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixrRkFBa0Y7UUFDbEYsNEdBQTRHO1FBQzVHLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQTBCO1FBQ3RELE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDNUIsZUFBcUM7UUFDbkMsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCO1FBQ3hDLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtLQUN6QztRQUVELE1BQU0sV0FBVyxHQUEyQixFQUFFLENBQUM7UUFDL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FB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QUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBaUI7WUFDN0IsRUFBRSxFQUFFLDJCQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1NBQ25DLENBQUM7UUFFRixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCw4QkFBOEI7UUFDNUIsT0FBTyxJQUFJLDBDQUEyQixFQUFFLENBQUM7SUFDM0MsQ0FBQzs7QUF2eEJILG9DQXd4QkM7QUFyeEJRLHNCQUFTLEdBQWM7SUFDNUIsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHtcbiAgQml0R29CYXNlLFxuICBDb2luQ29uc3RydWN0b3IsXG4gIGNoZWNrS3JzUHJvdmlkZXIsXG4gIGdldElzS3JzUmVjb3ZlcnksXG4gIGdldElzVW5zaWduZWRTd2VlcCxcbiAgTVBDQWxnb3JpdGhtLFxuICBOYW1lZENvaW5Db25zdHJ1Y3RvcixcbiAgVXRpbCxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBFcmM3OTg0VG9rZW5Db25maWcsIEV0aGVyZXVtTmV0d29yaywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQ29pbk5hbWVzLFxuICBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIsXG4gIGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YSxcbiAgZGVjb2RlQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhLFxuICBkZWNvZGVEaXJlY3RDb25maWRlbnRpYWxUcmFuc2ZlckNhbGxkYXRhLFxuICBkZWNvZGVGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhLFxuICBkZWNvZGVTZW5kTXVsdGlTaWdGbHVzaEVSQzc5ODREYXRhLFxuICBzZW5kTXVsdGlzaWdNZXRob2RJZCxcbiAgY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZNZXRob2RJZCxcbiAgYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEsXG4gIG9wdGlvbmFsRGVwcyxcbiAgUmVjb3Zlck9wdGlvbnMsXG4gIFJlY292ZXJ5SW5mbyxcbiAgT2ZmbGluZVZhdWx0VHhJbmZvLFxuICBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIGFjbE11bHRpY2FsbE1ldGhvZElkLFxuICBjYWxsRnJvbVBhcmVudE1ldGhvZElkLFxufSBmcm9tICdAYml0Z28vYWJzdHJhY3QtZXRoJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3NlY3AyNTZrMSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEV0aCB9IGZyb20gJy4vZXRoJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vbGliJztcblxuZXhwb3J0IHsgRXJjNzk4NFRva2VuQ29uZmlnIH07XG5cbmV4cG9ydCBjbGFzcyBFcmM3OTg0VG9rZW4gZXh0ZW5kcyBFdGgge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IEVyYzc5ODRUb2tlbkNvbmZpZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbmRNZXRob2ROYW1lOiAnc2VuZE11bHRpU2lnJyB8ICdzZW5kTXVsdGlTaWdUb2tlbic7XG4gIHN0YXRpYyBjb2luTmFtZXM6IENvaW5OYW1lcyA9IHtcbiAgICBNYWlubmV0OiAnZXRoJyxcbiAgICBUZXN0bmV0OiAnaHRldGgnLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW5zLmdldCh0b2tlbkNvbmZpZy5jb2luKTtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICAgIHRoaXMudG9rZW5Db25maWcgPSB0b2tlbkNvbmZpZztcbiAgICAvLyBFUkM3OTg0IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgdXNlIHNlbmRNdWx0aVNpZyAobm90IHNlbmRNdWx0aVNpZ1Rva2VuKSBiZWNhdXNlXG4gICAgLy8gdGhlIGNhbGxkYXRhIHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBjYXJyeSBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGVuY3J5cHRlZEhhbmRsZSwgaW5wdXRQcm9vZikuXG4gICAgLy8gc2VuZE11bHRpU2lnVG9rZW4gaGFzIG5vIGRhdGEgcGFyYW1ldGVyIGFuZCBjYW5ub3QgY2FycnkgaW5uZXIgY2FsbGRhdGEuXG4gICAgdGhpcy5zZW5kTWV0aG9kTmFtZSA9ICdzZW5kTXVsdGlTaWcnO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWcpOiBDb2luQ29uc3RydWN0b3Ige1xuICAgIHJldHVybiAoYml0Z286IEJpdEdvQmFzZSkgPT4gbmV3IEVyYzc5ODRUb2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZ3M6IEVyYzc5ODRUb2tlbkNvbmZpZ1tdID0gW1xuICAgICAgLi4udG9rZW5zLmJpdGNvaW4uZXRoLmNvbmZpZGVudGlhbFRva2VucyxcbiAgICAgIC4uLnRva2Vucy50ZXN0bmV0LmV0aC5jb25maWRlbnRpYWxUb2tlbnMsXG4gICAgXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gRXJjNzk4NFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3IodG9rZW4pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnR5cGUsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50b2tlbkNvbnRyYWN0QWRkcmVzcywgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zQ3RvcnM7XG4gIH1cblxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5hbWU7XG4gIH1cblxuICBnZXQgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmNvaW47XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5ldHdvcms7XG4gIH1cblxuICBnZXQgdG9rZW5Db250cmFjdEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgfVxuXG4gIGdldCBkZWNpbWFsUGxhY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcztcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdFUkM3OTg0IENvbmZpZGVudGlhbCBUb2tlbic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMC5cbiAgICogRVJDLTc5ODQgY29uZmlkZW50aWFsIHRyYW5zZmVycyBhbHdheXMgY2FycnkgYW4gZW5jcnlwdGVkIGFtb3VudDsgemVyby12YWx1ZSBzZW5kcyBhcmUgbm90IG1lYW5pbmdmdWwuXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgZGF0YSBhbG9uZyB3aXRoIHRyYW5zYWN0aW9ucyB2aWEgdGhlIHN0YW5kYXJkIHRva2VuLXNlbmQgQVBJLlxuICAgKiBSZXR1cm5zIGZhbHNlIGJlY2F1c2UgRVJDLTc5ODQgc2VuZHMgdXNlIGNvbmZpZGVudGlhbFRyYW5zZmVyKCkgY2FsbGRhdGEgYnVpbHRcbiAgICogYnkgV1AsIG5vdCBhbiBhcmJpdHJhcnkgZGF0YSBmaWVsZCBvbiB0aGUgc2VuZCBwYXJhbXMuXG4gICAqIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJldmVudCBjYWxsZGF0YS1iYXNlZCBmbG93cyBsaWtlIGdldERlbGVnYXRpb25CdWlsZGVyKCksXG4gICAqIHdoaWNoIGJ5cGFzcyB0aGUgdG9rZW4tc2VuZCBwYXRoIGVudGlyZWx5LlxuICAgKi9cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuICdlY2RzYSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChwYXJhbXMudHhQYXJhbXM/LnR5cGUgPT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb24ocGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbihwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcihwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbnNvbGlkYXRpb25UcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9ID0gcGFyYW1zO1xuICAgIHJldHVybiAhIShcbiAgICAgIHZlcmlmaWNhdGlvbj8uY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3MgfHxcbiAgICAgIHR4UHJlYnVpbGQ/LmNvbnNvbGlkYXRlSWQgfHxcbiAgICAgIHR4UGFyYW1zPy50eXBlID09PSAnY29uc29saWRhdGUnIHx8XG4gICAgICAvLyBUU1Mgc2lnbmluZyBwYXRoOiByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgc2V0cyB0eXBlIGZyb20gaW50ZW50LmludGVudFR5cGUgd2hpY2ggaXNcbiAgICAgIC8vICdjb25zb2xpZGF0ZVRva2VuJyBmb3IgRVJDLTc5ODQgdG9rZW4gY29uc29saWRhdGlvbnMuIHR4UHJlYnVpbGQgaGFzIG9ubHkgdHhIZXhcbiAgICAgIC8vIChubyBjb25zb2xpZGF0ZUlkKSBpbiB0aGlzIHBhdGguXG4gICAgICB0eFBhcmFtcz8udHlwZSA9PT0gJ2NvbnNvbGlkYXRlVG9rZW4nIHx8XG4gICAgICB0eFBhcmFtcz8ucHJlYnVpbGRUeD8uY29uc29saWRhdGVJZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFdhbGxldEJhc2VBZGRyZXNzKHdhbGxldDogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zWyd3YWxsZXQnXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3YWxsZXQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHR5cGVvZiB3YWxsZXQuY29pblNwZWNpZmljID09PSAnZnVuY3Rpb24nID8gd2FsbGV0LmNvaW5TcGVjaWZpYygpIDogd2FsbGV0LmNvaW5TcGVjaWZpYztcbiAgICBjb25zdCBldGhDb2luU3BlY2lmaWMgPSBjb2luU3BlY2lmaWMgYXMgeyBiYXNlQWRkcmVzcz86IHN0cmluZzsgcm9vdEFkZHJlc3M/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZXRoQ29pblNwZWNpZmljPy5iYXNlQWRkcmVzcyA/PyBldGhDb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIEVSQy03OTg0IGZvcndhcmRlciBjb25zb2xpZGF0aW9uIChmbHVzaCkgdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBNdWx0aXNpZyBzaGFwZTpcbiAgICogICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyhmb3J3YXJkZXIsIDAsIGNhbGxGcm9tUGFyZW50KHRva2VuLCAwLCBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2YoYmFzZSwgaGFuZGxlKSksIC4uLilcbiAgICpcbiAgICogVFNTIC8gZGlyZWN0IHNoYXBlOlxuICAgKiAgIHR4LnRvICAgPSBmb3J3YXJkZXIgY29udHJhY3RcbiAgICogICB0eC5kYXRhID0gY2FsbEZyb21QYXJlbnQodG9rZW4sIDAsIGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZihiYXNlLCBoYW5kbGUpKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQ/LnR4SGV4KSB7XG4gICAgICBpZiAoIXR4UHJlYnVpbGQ/LmNvbnNvbGlkYXRlSWQgJiYgIXR4UGFyYW1zPy5wcmVidWlsZFR4Py5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogbWlzc2luZyBjb25zb2xpZGF0ZUlkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBsZXQgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgcGFyZW50QWRkcmVzczogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBsZXQgZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU2VuZE11bHRpU2lnRmx1c2hFUkM3OTg0RGF0YSh0eEpzb24uZGF0YSk7XG4gICAgICAgIGZvcndhcmRlckFkZHJlc3MgPSBkZWNvZGVkLmZvcndhcmRlckFkZHJlc3M7XG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzID0gZGVjb2RlZC50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgICAgICAgcGFyZW50QWRkcmVzcyA9IGRlY29kZWQucGFyZW50QWRkcmVzcztcbiAgICAgICAgZW5jcnlwdGVkSGFuZGxlID0gZGVjb2RlZC5lbmNyeXB0ZWRIYW5kbGU7XG4gICAgICB9IGVsc2UgaWYgKHR4SnNvbi5kYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gICAgICAgIHBhcmVudEFkZHJlc3MgPSBkZWNvZGVkLnBhcmVudEFkZHJlc3M7XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgICBmb3J3YXJkZXJBZGRyZXNzID0gdHhKc29uLnRvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke3R4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiBmYWlsZWQgdG8gZGVjb2RlIGNvbnNvbGlkYXRpb24gY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiB0b2tlbiBjb250cmFjdCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICBgZXhwZWN0ZWQgJHt0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzfSwgZ290ICR7dG9rZW5Db250cmFjdEFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuZ2V0V2FsbGV0QmFzZUFkZHJlc3Mod2FsbGV0KTtcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IHVuYWJsZSB0byBkZXRlcm1pbmUgd2FsbGV0IGJhc2UgYWRkcmVzcycpO1xuICAgIH1cbiAgICBpZiAocGFyZW50QWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBiYXNlQWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiBwYXJlbnQgYWRkcmVzcyBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJHtiYXNlQWRkcmVzc30sIGdvdCAke3BhcmVudEFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY3J5cHRlZEhhbmRsZSB8fCBlbmNyeXB0ZWRIYW5kbGUgPT09ICcweCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogZW5jcnlwdGVkSGFuZGxlIGlzIG1pc3Npbmcgb3IgZW1wdHkgaW4gdHJhbnNhY3Rpb24gY2FsbGRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBlY3RlZEZvcndhcmRlciA9XG4gICAgICB0eFByZWJ1aWxkLnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/P1xuICAgICAgdHhQcmVidWlsZC50eEluZm8/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/P1xuICAgICAgdHhQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcztcbiAgICBpZiAoZm9yd2FyZGVyQWRkcmVzcyAmJiBleHBlY3RlZEZvcndhcmRlcikge1xuICAgICAgaWYgKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gZXhwZWN0ZWRGb3J3YXJkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IGZvcndhcmRlciBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICAgIGBleHBlY3RlZCAke2V4cGVjdGVkRm9yd2FyZGVyfSwgZ290ICR7Zm9yd2FyZGVyQWRkcmVzc31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBjb25maWRlbnRpYWwgdG9rZW4gdHJhbnNmZXIgKFNlbmRFUkM3OTg0KSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogV2l0aCB0eEhleCDigJQgdHdvIG9uLWNoYWluIHNoYXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKlxuICAgKiAgIHNlbmRNdWx0aVNpZy13cmFwcGVkIChtdWx0aXNpZyAvIHNtYXJ0LWNvbnRyYWN0IHdhbGxldCk6XG4gICAqICAgICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgICB0eC5kYXRhID0gc2VuZE11bHRpU2lnKHRva2VuQWRkciwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBoYW5kbGUsIHByb29mKSwgLi4uKVxuICAgKiAgICAgVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyBkZWNvZGVkIGZyb20gdGhlIHNlbmRNdWx0aVNpZyBpbm5lciBjYWxsZGF0YS5cbiAgICpcbiAgICogICBEaXJlY3QgY2FsbCAoaG90IC8gVFNTIEVPQSB3YWxsZXQpOlxuICAgKiAgICAgdHgudG8gICA9IHRva2VuIGNvbnRyYWN0XG4gICAqICAgICB0eC5kYXRhID0gY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBoYW5kbGUsIHByb29mKVxuICAgKiAgICAgVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyB0YWtlbiBmcm9tIHR4LnRvLlxuICAgKlxuICAgKiAgIEZvciBib3RoIHNoYXBlcyB0aGUgdmVyaWZpZXIgY2hlY2tzOlxuICAgKiAgICAgMS4gVG9rZW4gY29udHJhY3QgYWRkcmVzcyBtYXRjaGVzIHRoaXMgY29pbidzIHRva2VuQ29udHJhY3RBZGRyZXNzLlxuICAgKiAgICAgMi4gRGVjb2RlZCByZWNpcGllbnQgbWF0Y2hlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3Mgb3IgYnVpbGRQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzLlxuICAgKiAgICAgMy4gZW5jcnlwdGVkSGFuZGxlIGFuZCBpbnB1dFByb29mIGFyZSBzdHJ1Y3R1cmFsbHkgcHJlc2VudCAobm9uLWVtcHR5KS5cbiAgICogICAgIDQuIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50IGlzIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbWF0Y2hlcyBidWlsZFBhcmFtcyB3aGVuIGJvdGggcHJlc2VudC5cbiAgICpcbiAgICogV2l0aG91dCB0eEhleCAoZmlyc3Qtc2lnbmVyIC8gcHJlLXNpZ25pbmcgcGF0aCk6XG4gICAqICAxLiBSZXF1aXJlcyBleGFjdGx5IG9uZSByZWNpcGllbnQgaW4gdHhQYXJhbXMuXG4gICAqICAyLiBWYWxpZGF0ZXMgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzIGlzIGEgdmFsaWQgRXRoZXJldW0gYWRkcmVzcy5cbiAgICogIDMuIFZhbGlkYXRlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudCBpcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gICAqICA0LiBDcm9zcy1jaGVja3MgYWRkcmVzcyBhbmQgYW1vdW50IGFnYWluc3QgYnVpbGRQYXJhbXMgd2hlbiB0aGUgc2VydmVyIGhhcyBzdG9yZWQgdGhlIGludGVudC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQ/LnR4SGV4KSB7XG4gICAgICAvLyBObyByYXcgdHggYXZhaWxhYmxlIChtdWx0aXNpZyBmaXJzdC1zaWduZXIgcGF0aCkuXG4gICAgICAvLyBWYWxpZGF0ZSBFUkM3OTg0LXNwZWNpZmljIGludmFyaWFudHMgZnJvbSB0eFBhcmFtcyBhbmQgYnVpbGRQYXJhbXMuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQYXJhbXM/LnJlY2lwaWVudHM7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogY29uZmlkZW50aWFsIHRyYW5zZmVycyBzdXBwb3J0IGV4YWN0bHkgMSByZWNpcGllbnQsIGdvdCAke3JlY2lwaWVudHMubGVuZ3RofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgICBpZiAoIXJlY2lwaWVudC5hZGRyZXNzIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnQgYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQ6ICR7cmVjaXBpZW50LmFkZHJlc3N9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhbW91bnRTdHIgPSBTdHJpbmcocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICBpZiAoIUVyYzc5ODRUb2tlbi5pc1Bvc2l0aXZlSW50ZWdlclN0cmluZyhhbW91bnRTdHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke2Ftb3VudFN0cn0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQ3Jvc3MtY2hlY2sgYWdhaW5zdCBidWlsZFBhcmFtcyB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgc3RvcmVkIHRoZSBpbnRlbnRcbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zUmVjaXBpZW50ID0gdHhQcmVidWlsZD8uYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXTtcbiAgICAgIGlmIChidWlsZFBhcmFtc1JlY2lwaWVudD8uYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChyZWNpcGllbnQuYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBidWlsZFBhcmFtc1JlY2lwaWVudC5hZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICAgICAgYHR4UGFyYW1zIGhhcyAnJHtyZWNpcGllbnQuYWRkcmVzc30nIGJ1dCBidWlsZFBhcmFtcyBoYXMgJyR7YnVpbGRQYXJhbXNSZWNpcGllbnQuYWRkcmVzc30nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zQW1vdW50ID0gYnVpbGRQYXJhbXNSZWNpcGllbnQ/LmFtb3VudDtcbiAgICAgIGlmIChidWlsZFBhcmFtc0Ftb3VudCAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkUGFyYW1zQW1vdW50ICE9PSBhbW91bnRTdHIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogYW1vdW50IG1pc21hdGNoIOKAlCB0eFBhcmFtcyBoYXMgJyR7YW1vdW50U3RyfScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYW5kIGRlY29kZSB0aGUgcmF3IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IHRvQWRkcmVzczogc3RyaW5nO1xuICAgIGxldCB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBsZXQgaW5wdXRQcm9vZjogc3RyaW5nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgICAgICAvLyBzZW5kTXVsdGlTaWctd3JhcHBlZCBwYXRoOiBzbWFydC1jb250cmFjdCB3YWxsZXQgcmVsYXlzIHRoZSBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsLlxuICAgICAgICAvLyBUb2tlbiBjb250cmFjdCBhZGRyZXNzIGlzIGVuY29kZWQgaW5zaWRlIHRoZSBzZW5kTXVsdGlTaWcgY2FsbGRhdGEuXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b0FkZHJlc3MgPSBkZWNvZGVkLnRvQWRkcmVzcztcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSBkZWNvZGVkLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICAgICAgICBlbmNyeXB0ZWRIYW5kbGUgPSBkZWNvZGVkLmVuY3J5cHRlZEhhbmRsZTtcbiAgICAgICAgaW5wdXRQcm9vZiA9IGRlY29kZWQuaW5wdXRQcm9vZjtcbiAgICAgIH0gZWxzZSBpZiAodHhKc29uLmRhdGEuc3RhcnRzV2l0aChjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkKSkge1xuICAgICAgICAvLyBEaXJlY3QgY2FsbCBwYXRoOiBob3QvVFNTIEVPQSB3YWxsZXQgY2FsbHMgdGhlIHRva2VuIGNvbnRyYWN0IGRpcmVjdGx5LlxuICAgICAgICAvLyBUaGUgdHJhbnNhY3Rpb24ncyBgdG9gIGZpZWxkIGlzIHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzLlxuICAgICAgICBpZiAoIXR4SnNvbi50bykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGlyZWN0IGNvbmZpZGVudGlhbFRyYW5zZmVyIGNhbGwgaXMgbWlzc2luZyB0cmFuc2FjdGlvbiB0byBhZGRyZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZURpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyQ2FsbGRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b0FkZHJlc3MgPSBkZWNvZGVkLnRvQWRkcmVzcztcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSB0eEpzb24udG87XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgICBpbnB1dFByb29mID0gZGVjb2RlZC5pbnB1dFByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke3R4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZmFpbGVkIHRvIGRlY29kZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAxLiBUb2tlbiBjb250cmFjdCBhZGRyZXNzIG11c3QgbWF0Y2ggdGhpcyBjb2luXG4gICAgaWYgKHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgK1xuICAgICAgICAgIGBleHBlY3RlZCAke3RoaXMudG9rZW5Db250cmFjdEFkZHJlc3N9LCBnb3QgJHt0b2tlbkNvbnRyYWN0QWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIFJlY2lwaWVudCBhZGRyZXNzIG11c3QgbWF0Y2ggdHhQYXJhbXMucmVjaXBpZW50c1swXSBvciBidWlsZFBhcmFtcy5yZWNpcGllbnRzWzBdXG4gICAgY29uc3QgZXhwZWN0ZWRSZWNpcGllbnQgPSB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hZGRyZXNzID8/IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcztcbiAgICBpZiAoIWV4cGVjdGVkUmVjaXBpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogbWlzc2luZyBleHBlY3RlZCByZWNpcGllbnQgKHByb3ZpZGUgdHhQYXJhbXMucmVjaXBpZW50cyBvciB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLnJlY2lwaWVudHMpJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRvQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZFJlY2lwaWVudC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgKyBgZXhwZWN0ZWQgJHtleHBlY3RlZFJlY2lwaWVudH0sIGdvdCAke3RvQWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIGVuY3J5cHRlZEhhbmRsZSBtdXN0IGJlIGEgbm9uLXRyaXZpYWwgaGV4IHZhbHVlIChub3QgYmFyZSAnMHgnKVxuICAgIGlmICghZW5jcnlwdGVkSGFuZGxlIHx8IGVuY3J5cHRlZEhhbmRsZSA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZW5jcnlwdGVkSGFuZGxlIGlzIG1pc3Npbmcgb3IgZW1wdHkgaW4gdHJhbnNhY3Rpb24gY2FsbGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyA0LiBpbnB1dFByb29mIG11c3QgYmUgYSBub24tdHJpdmlhbCBoZXggdmFsdWVcbiAgICBpZiAoIWlucHV0UHJvb2YgfHwgaW5wdXRQcm9vZiA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogaW5wdXRQcm9vZiBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gNS4gVmVyaWZ5IHBsYWludGV4dCBpbnRlbnQ6IHR4UGFyYW1zIGFtb3VudCBtdXN0IGJlIHZhbGlkIGFuZCBjb25zaXN0ZW50IHdpdGggYnVpbGRQYXJhbXNcbiAgICBjb25zdCByYXdUeFBhcmFtc0Ftb3VudCA9IHR4UGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFtb3VudDtcbiAgICBpZiAocmF3VHhQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHhQYXJhbXNBbW91bnQgPSBTdHJpbmcocmF3VHhQYXJhbXNBbW91bnQpO1xuICAgICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodHhQYXJhbXNBbW91bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke3R4UGFyYW1zQW1vdW50fSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZFBhcmFtc0Ftb3VudCA9IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYW1vdW50O1xuICAgICAgaWYgKGJ1aWxkUGFyYW1zQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgdHhQYXJhbXNBbW91bnQgIT09IGJ1aWxkUGFyYW1zQW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtaXNtYXRjaCDigJQgdHhQYXJhbXMgaGFzICcke3R4UGFyYW1zQW1vdW50fScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlxcZCskLy50ZXN0KHZhbHVlKSAmJiBCaWdJbnQodmFsdWUpID4gMG47XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uIGZvciBFUkMtNzk4NCBkZWNyeXB0aW9uIGRlbGVnYXRpb24uXG4gICAqXG4gICAqIFRTUyBwYXRoOiBkZWNvZGVzIHRoZSByYXcgdHggYW5kIHZlcmlmaWVzIGl0IGNhbGxzIHRoZSBBQ0wgY29udHJhY3Qgd2l0aFxuICAgKiBjYWxsZGF0YSB0aGF0IGNvdmVycyBhbGwgcmVxdWVzdGVkIHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogTXVsdGlzaWcgcGF0aDogdmVyaWZpZXMgdGhlIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHMgY2FycnkgdGhlIGNvcnJlY3QgdG9rZW5OYW1lc1xuICAgKiBhbmQgemVybyBhbW91bnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0VHlwZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHdhbGxldFR5cGUgPT09ICd0c3MnKSB7XG4gICAgICAvLyBUU1MgcGF0aDogZnVsbCByYXctdHggZGVjb2RlXG4gICAgICBjb25zdCBlbmFibGVUb2tlbnMgPSB0eFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBpZiAoIWVuYWJsZVRva2VucyB8fCBlbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogZW5hYmxlVG9rZW5zIG11c3QgYmUgbm9uLWVtcHR5IGZvciBUU1MgcGF0aCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgcmVxdWVzdGVkIHRva2VuIG5hbWVzIOKGkiBjb250cmFjdCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEFkZHJlc3NlcyA9IGVuYWJsZVRva2Vucy5tYXAoKHQpID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW5Db2luID0gdGhpcy5iaXRnby5jb2luKHQubmFtZSkgYXMgRXJjNzk4NFRva2VuO1xuICAgICAgICByZXR1cm4gdG9rZW5Db2luLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUGFyc2UgdGhlIHJhdyB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gdGFyZ2V0cyB0aGUgY29ycmVjdCBjb250cmFjdCBiYXNlZCBvbiBjYWxsZGF0YSBzaGFwZVxuICAgICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yaygpIGFzIEV0aGVyZXVtTmV0d29yaztcbiAgICAgIGNvbnN0IGFjbENvbnRyYWN0QWRkcmVzcyA9IG5ldHdvcms/LnphbWFBY2xDb250cmFjdEFkZHJlc3M7XG4gICAgICBpZiAoIWFjbENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHphbWFBY2xDb250cmFjdEFkZHJlc3Mgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgbmV0d29yaycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eEpzb24udG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiBpcyBtaXNzaW5nIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluc3BlY3QgY2FsbGRhdGEgbWV0aG9kIElEIHRvIGRpc3Rpbmd1aXNoIHJvb3Qgd2FsbGV0IGZyb20gZm9yd2FyZGVyIHdhbGxldDpcbiAgICAgIC8vICAgYWNsTXVsdGljYWxsTWV0aG9kSWQgICDihpIgcm9vdCB3YWxsZXQ6IHRvID0gQUNMIGNvbnRyYWN0IGRpcmVjdGx5XG4gICAgICAvLyAgIGNhbGxGcm9tUGFyZW50TWV0aG9kSWQg4oaSIGZvcndhcmRlciB3YWxsZXQ6IHRvID0gZm9yd2FyZGVyLCBBQ0wgYWRkcmVzcyBpcyBpbnNpZGUgY2FsbGRhdGFcbiAgICAgIGNvbnN0IGNhbGxkYXRhTWV0aG9kSWQgPSB0eEpzb24uZGF0YS5zbGljZSgwLCAxMCk7XG4gICAgICBpZiAoY2FsbGRhdGFNZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICAgICAgLy8gUm9vdCB3YWxsZXQgKGJhc2UgYWRkcmVzcyk6IHR4IGNhbGxzIHRoZSBBQ0wgY29udHJhY3QgZGlyZWN0bHlcbiAgICAgICAgaWYgKHR4SnNvbi50by50b0xvd2VyQ2FzZSgpICE9PSBhY2xDb250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiB0YXJnZXQgJHt0eEpzb24udG99IGRvZXMgbm90IG1hdGNoIEFDTCBjb250cmFjdCAke2FjbENvbnRyYWN0QWRkcmVzc31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjYWxsZGF0YU1ldGhvZElkID09PSBjYWxsRnJvbVBhcmVudE1ldGhvZElkKSB7XG4gICAgICAgIC8vIEZvcndhcmRlciB3YWxsZXQ6IHR4IGNhbGxzIHRoZSBmb3J3YXJkZXIsIHdoaWNoIGNhbGxzIHRoZSBBQ0wgdmlhIGNhbGxGcm9tUGFyZW50LlxuICAgICAgICAvLyBUaGUgZm9yd2FyZGVyIGFkZHJlc3MgaXMgd2FsbGV0LXNwZWNpZmljIGFuZCBjYW5ub3QgYmUgc3RhdGljYWxseSB2ZXJpZmllZCBoZXJlO1xuICAgICAgICAvLyB0b2tlbiBhZGRyZXNzIGNvcnJlY3RuZXNzIGlzIHN0aWxsIHZlcmlmaWVkIGJlbG93IHZpYSBjYWxsZGF0YSBkZWNvZGluZy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogdW5yZWNvZ25pc2VkIGNhbGxkYXRhIG1ldGhvZCBJRCAke2NhbGxkYXRhTWV0aG9kSWR9OyBleHBlY3RlZCBtdWx0aWNhbGwgb3IgY2FsbEZyb21QYXJlbnRgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSB2YWx1ZSBpcyAwXG4gICAgICBpZiAodHhKc29uLnZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBleHBlY3RlZCB0cmFuc2FjdGlvbiB2YWx1ZSAwIGJ1dCBnb3QgJHt0eEpzb24udmFsdWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY29kZSB0b2tlbiBhZGRyZXNzZXMgZnJvbSBjYWxsZGF0YSBhbmQgdmVyaWZ5IGFsbCByZXF1ZXN0ZWQgdG9rZW5zIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBkZWNvZGVkQWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIHJlcXVlc3RlZEFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIWRlY29kZWRBZGRyZXNzZXMuaW5jbHVkZXMocmVxdWVzdGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBkZWxlZ2F0aW9uIGNhbGxkYXRhYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpc2lnIHBhdGg6IGJ1aWxkUGFyYW1zLWxldmVsIGNoZWNrXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cyBhc1xuICAgICAgICB8IEFycmF5PHsgdG9rZW5OYW1lPzogc3RyaW5nOyBhbW91bnQ/OiBzdHJpbmcgfT5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBtaXNzaW5nIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgZm9yIG11bHRpc2lnIHBhdGgnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHJlcXVlc3RlZCB0b2tlbiBuYW1lcyBmcm9tIHR4UGFyYW1zXG4gICAgICBjb25zdCByZXF1ZXN0ZWRUb2tlbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKHR4UGFyYW1zLmVuYWJsZVRva2VucyAmJiB0eFBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0ZWRUb2tlbk5hbWVzLnB1c2goLi4udHhQYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodCkgPT4gdC5uYW1lKSk7XG4gICAgICB9IGVsc2UgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcXVlc3RlZFRva2VuTmFtZXMucHVzaCguLi50eFBhcmFtcy5yZWNpcGllbnRzLm1hcCgocjogYW55KSA9PiByLnRva2VuTmFtZSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IGFsbCByZWNpcGllbnRzIGhhdmUgdG9rZW5OYW1lIGFuZCBhbW91bnQgPSAnMCdcbiAgICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFyZWNpcGllbnQudG9rZW5OYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZWNpcGllbnQgaXMgbWlzc2luZyB0b2tlbk5hbWUgaW4gYnVpbGRQYXJhbXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjaXBpZW50LmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IGV4cGVjdGVkIGFtb3VudCAwIGZvciB0b2tlbiBlbmFibGVtZW50IGJ1dCBnb3QgJHtyZWNpcGllbnQuYW1vdW50fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSByZXF1ZXN0ZWQgdG9rZW4gbmFtZXMgYXJlIHByZXNlbnQgaW4gcmVjaXBpZW50c1xuICAgICAgaWYgKHJlcXVlc3RlZFRva2VuTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZWNpcGllbnRUb2tlbk5hbWVzID0gcmVjaXBpZW50cy5tYXAoKHIpID0+IHIudG9rZW5OYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWQgb2YgcmVxdWVzdGVkVG9rZW5OYW1lcykge1xuICAgICAgICAgIGlmICghcmVjaXBpZW50VG9rZW5OYW1lcy5pbmNsdWRlcyhyZXF1ZXN0ZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBidWlsZFBhcmFtcyByZWNpcGllbnRzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGdhcyBsaW1pdCBmb3IgRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2VuIHJlY292ZXJ5LlxuICAgKiBBY3R1YWwgb24tY2hhaW4gdXNhZ2UgaXMgfjUwNi01MzBrIGdhcyBiYXNlZCBvbiB0ZXN0bmV0IHJlc3VsdHMuXG4gICAqIERlZmF1bHQ6IDgwMCwwMDAgKGNvbWZvcnRhYmxlIGJ1ZmZlciBvdmVyIG9ic2VydmVkIHVzYWdlKS5cbiAgICovXG4gIHNldEdhc0xpbWl0KHVzZXJHYXNMaW1pdD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF1c2VyR2FzTGltaXQpIHtcbiAgICAgIHJldHVybiA4MDAwMDA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zZXRHYXNMaW1pdCh1c2VyR2FzTGltaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSBmb3IgYSB3YWxsZXQgYWRkcmVzcyB2aWEgZXRoX2NhbGwgdG8gdGhlXG4gICAqIHRva2VuIGNvbnRyYWN0J3MgY29uZmlkZW50aWFsQmFsYW5jZU9mKGFkZHJlc3MpIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0QWRkcmVzcyAtIHRoZSB3YWxsZXQgY29udHJhY3QgYWRkcmVzcyB0byBxdWVyeSBiYWxhbmNlIGZvclxuICAgKiBAcGFyYW0gYXBpS2V5IC0gb3B0aW9uYWwgRXRoZXJzY2FuIEFQSSBrZXlcbiAgICogQHJldHVybnMgYnl0ZXMzMiBlbmNyeXB0ZWQgaGFuZGxlICgweC1wcmVmaXhlZCwgNjYgY2hhcnMpLlxuICAgKiAgIE5vdGU6IGhhbmRsZXMgYXJlIGFsd2F5cyBub24temVybyBldmVuIGZvciB6ZXJvIGJhbGFuY2VzIChlbmNyeXB0ZWQgZG9tYWluKS5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5Q29uZmlkZW50aWFsQmFsYW5jZSh3YWxsZXRBZGRyZXNzOiBzdHJpbmcsIGFwaUtleT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWV0aG9kU2lnbmF0dXJlID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5tZXRob2RJRCgnY29uZmlkZW50aWFsQmFsYW5jZU9mJywgWydhZGRyZXNzJ10pO1xuICAgIGNvbnN0IGVuY29kZWRBcmdzID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5yYXdFbmNvZGUoWydhZGRyZXNzJ10sIFt3YWxsZXRBZGRyZXNzXSk7XG4gICAgY29uc3QgY2FsbGRhdGEgPSBCdWZmZXIuY29uY2F0KFttZXRob2RTaWduYXR1cmUsIGVuY29kZWRBcmdzXSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KFxuICAgICAge1xuICAgICAgICBjaGFpbmlkOiB0aGlzLmdldENoYWluSWQoKS50b1N0cmluZygpLFxuICAgICAgICBtb2R1bGU6ICdwcm94eScsXG4gICAgICAgIGFjdGlvbjogJ2V0aF9jYWxsJyxcbiAgICAgICAgdG86IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgIGRhdGE6IGNhbGxkYXRhLFxuICAgICAgICB0YWc6ICdsYXRlc3QnLFxuICAgICAgfSxcbiAgICAgIGFwaUtleVxuICAgICk7XG5cbiAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IG9idGFpbiBjb25maWRlbnRpYWwgYmFsYW5jZSBmb3IgJHt3YWxsZXRBZGRyZXNzfSBmcm9tIHRva2VuICR7dGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZSA9IHJlc3VsdC5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIGlmICghaGFuZGxlLnN0YXJ0c1dpdGgoJzB4JykgfHwgaGFuZGxlLmxlbmd0aCAhPT0gNjYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjb25maWRlbnRpYWxCYWxhbmNlT2YgcmVzcG9uc2UgZm9ybWF0OiAke2hhbmRsZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG5vbi1CaXRHbyByZWNvdmVyeSB0cmFuc2FjdGlvbiBmb3IgRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2Vucy5cbiAgICpcbiAgICogVXNlcyB0aGUgbm8tcHJvb2YgaGFuZGxlIHN3ZWVwOiBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGhhbmRsZSkgd2l0aCAyIGFyZ3MuXG4gICAqIE5vIEZIRSBkZWNyeXB0aW9uIG9yIHByb29mIGdlbmVyYXRpb24gaXMgbmVlZGVkIOKAlCB0aGUgd2FsbGV0IHRyYW5zZmVycyBpdHMgZW50aXJlXG4gICAqIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSB3aXRob3V0IGtub3dpbmcgdGhlIHBsYWludGV4dCBhbW91bnQuXG4gICAqXG4gICAqIFRoZSBvdXRlciB0cmFuc2FjdGlvbiBzaGFwZSBpczpcbiAgICogICB0eC50byAgID0gd2FsbGV0Q29udHJhY3RBZGRyZXNzXG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyh0b2tlbkNvbnRyYWN0QWRkciwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjb3ZlcnlEZXN0LCBoYW5kbGUpLCAuLi4pXG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3Zlck9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IE9mZmxpbmVWYXVsdFR4SW5mbz4ge1xuICAgIGlmIChwYXJhbXMuaXNUc3MgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRVJDLTc5ODQgVFNTIHJlY292ZXJ5IGlzIG5vdCB5ZXQgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0Q29udHJhY3RBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0tyc1JlY292ZXJ5ID0gZ2V0SXNLcnNSZWNvdmVyeShwYXJhbXMpO1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIGNoZWNrS3JzUHJvdmlkZXIodGhpcywgcGFyYW1zLmtyc1Byb3ZpZGVyLCB7IGNoZWNrQ29pbkZhbWlseVN1cHBvcnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGxldCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICBjb25zdCBnYXNQcmljZSA9IHBhcmFtcy5laXAxNTU5XG4gICAgICA/IG5ldyBvcHRpb25hbERlcHMuZXRoVXRpbC5CTihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpXG4gICAgICA6IG5ldyBvcHRpb25hbERlcHMuZXRoVXRpbC5CTih0aGlzLnNldEdhc1ByaWNlKHBhcmFtcy5nYXNQcmljZSkpO1xuICAgIGNvbnN0IGdhc0xpbWl0ID0gbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKHRoaXMuc2V0R2FzTGltaXQocGFyYW1zLmdhc0xpbWl0KSk7XG5cbiAgICBsZXQgdXNlclBydjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBpZiAoIXVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmICF1c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHVzZXJLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXksXG4gICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdXNlclBydiA9IHVzZXJLZXk7XG4gICAgfVxuXG4gICAgbGV0IGJhY2t1cEtleUFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgYmFja3VwU2lnbmluZ0tleTogQnVmZmVyO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkgfHwgaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCBiYWNrdXBIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGJhY2t1cEtleSk7XG4gICAgICBiYWNrdXBTaWduaW5nS2V5ID0gYmFja3VwSEROb2RlLnB1YmxpY0tleTtcbiAgICAgIGJhY2t1cEtleUFkZHJlc3MgPSBgMHgke29wdGlvbmFsRGVwcy5ldGhVdGlsLnB1YmxpY1RvQWRkcmVzcyhiYWNrdXBTaWduaW5nS2V5LCB0cnVlKS50b1N0cmluZygnaGV4Jyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGJhY2t1cFBydjogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmFja3VwUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2t1cEhETm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoYmFja3VwUHJ2KTtcbiAgICAgIGJhY2t1cFNpZ25pbmdLZXkgPSBiYWNrdXBIRE5vZGUucHJpdmF0ZUtleSBhcyBCdWZmZXI7XG4gICAgICBiYWNrdXBLZXlBZGRyZXNzID0gYDB4JHtvcHRpb25hbERlcHMuZXRoVXRpbC5wcml2YXRlVG9BZGRyZXNzKGJhY2t1cFNpZ25pbmdLZXkpLnRvU3RyaW5nKCdoZXgnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cEtleU5vbmNlID0gYXdhaXQgdGhpcy5nZXRBZGRyZXNzTm9uY2UoYmFja3VwS2V5QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlCYWxhbmNlID0gYXdhaXQgdGhpcy5xdWVyeUFkZHJlc3NCYWxhbmNlKGJhY2t1cEtleUFkZHJlc3MsIHBhcmFtcy5hcGlLZXkpO1xuICAgIGNvbnN0IHRvdGFsR2FzTmVlZGVkID0gZ2FzUHJpY2UubXVsKGdhc0xpbWl0KTtcbiAgICBjb25zdCB3ZWlUb0d3ZWkgPSAxMCAqKiA5O1xuICAgIGlmIChiYWNrdXBLZXlCYWxhbmNlLmx0KHRvdGFsR2FzTmVlZGVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQmFja3VwIGtleSBhZGRyZXNzICR7YmFja3VwS2V5QWRkcmVzc30gaGFzIGJhbGFuY2UgJHsoYmFja3VwS2V5QmFsYW5jZSAvIHdlaVRvR3dlaSkudG9TdHJpbmcoKX0gR3dlaS5gICtcbiAgICAgICAgICBgVGhpcyBhZGRyZXNzIG11c3QgaGF2ZSBhIGJhbGFuY2Ugb2YgYXQgbGVhc3QgJHsodG90YWxHYXNOZWVkZWQgLyB3ZWlUb0d3ZWkpLnRvU3RyaW5nKCl9YCArXG4gICAgICAgICAgYCBHd2VpIHRvIHBlcmZvcm0gcmVjb3Zlcmllcy4gVHJ5IHNlbmRpbmcgc29tZSBFVEggdG8gdGhpcyBhZGRyZXNzIHRoZW4gcmV0cnkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSAoYXV0by1xdWVyeSBvciB1c2VyLXByb3ZpZGVkKVxuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBpZiAocGFyYW1zLmVuY3J5cHRlZEhhbmRsZSkge1xuICAgICAgZW5jcnlwdGVkSGFuZGxlID0gcGFyYW1zLmVuY3J5cHRlZEhhbmRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgZW5jcnlwdGVkSGFuZGxlID0gYXdhaXQgdGhpcy5xdWVyeUNvbmZpZGVudGlhbEJhbGFuY2UocGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogZW5jcnlwdGVkIGhhbmRsZXMgYXJlIGFsd2F5cyBub24temVybyBldmVuIGZvciB6ZXJvIGJhbGFuY2VzIChlbmNyeXB0ZWQgZG9tYWluKS5cbiAgICAvLyBUaGUgdHJhbnNmZXIgd2lsbCBleGVjdXRlIGJ1dCBtb3ZlIDAgdG9rZW5zIGlmIHRoZSB3YWxsZXQgaXMgZW1wdHkuXG5cbiAgICAvLyBCdWlsZCB0aGUgaW5uZXIgY2FsbGRhdGE6IGNvbmZpZGVudGlhbFRyYW5zZmVyKHJlY292ZXJ5RGVzdGluYXRpb24sIGhhbmRsZSlcbiAgICBjb25zdCBpbm5lckNhbGxkYXRhID0gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGVuY3J5cHRlZEhhbmRsZSk7XG5cbiAgICAvLyBGb3Igc2VuZE11bHRpU2lnOiByZWNpcGllbnQgaXMgdGhlIHRva2VuIGNvbnRyYWN0LCBhbW91bnQgaXMgMCwgZGF0YSBjYXJyaWVzIHRoZSBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsZGF0YVxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICBkYXRhOiBvcHRpb25hbERlcHMuZXRoVXRpbC5zdHJpcEhleFByZWZpeChpbm5lckNhbGxkYXRhKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICBjb25zdCBzZXF1ZW5jZUlkID0gYXdhaXQgdGhpcy5xdWVyeVNlcXVlbmNlSWQocGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG5cbiAgICBsZXQgb3BlcmF0aW9uSGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzaWduYXR1cmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgb3BlcmF0aW9uSGFzaCA9IHRoaXMuZ2V0T3BlcmF0aW9uU2hhM0ZvckV4ZWN1dGVBbmRDb25maXJtKHJlY2lwaWVudHMsIHRoaXMuZ2V0RGVmYXVsdEV4cGlyZVRpbWUoKSwgc2VxdWVuY2VJZCk7XG4gICAgICBzaWduYXR1cmUgPSBVdGlsLmV0aFNpZ25Nc2dIYXNoKG9wZXJhdGlvbkhhc2gsIFV0aWwueHBydlRvRXRoUHJpdmF0ZUtleSh1c2VyUHJ2ISkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBVdGlsLmVjUmVjb3ZlckV0aEFkZHJlc3Mob3BlcmF0aW9uSGFzaCwgc2lnbmF0dXJlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHR4SW5mbyA9IHtcbiAgICAgIHJlY2lwaWVudDogcmVjaXBpZW50c1swXSxcbiAgICAgIGV4cGlyZVRpbWU6IHRoaXMuZ2V0RGVmYXVsdEV4cGlyZVRpbWUoKSxcbiAgICAgIGNvbnRyYWN0U2VxdWVuY2VJZDogc2VxdWVuY2VJZCxcbiAgICAgIG9wZXJhdGlvbkhhc2g6IG9wZXJhdGlvbkhhc2gsXG4gICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSA/PyAnJyxcbiAgICAgIGdhc0xpbWl0OiBnYXNMaW1pdC50b1N0cmluZygxMCksXG4gICAgfTtcblxuICAgIGNvbnN0IHNlbmRNZXRob2RBcmdzID0gdGhpcy5nZXRTZW5kTWV0aG9kQXJncyh0eEluZm8pO1xuICAgIGNvbnN0IG1ldGhvZFNpZ25hdHVyZSA9IG9wdGlvbmFsRGVwcy5ldGhBYmkubWV0aG9kSUQodGhpcy5zZW5kTWV0aG9kTmFtZSwgXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJykpO1xuICAgIGNvbnN0IGVuY29kZWRBcmdzID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5yYXdFbmNvZGUoXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJyksIF8ubWFwKHNlbmRNZXRob2RBcmdzLCAndmFsdWUnKSk7XG4gICAgY29uc3Qgc2VuZERhdGEgPSBCdWZmZXIuY29uY2F0KFttZXRob2RTaWduYXR1cmUsIGVuY29kZWRBcmdzXSk7XG5cbiAgICBsZXQgdHggPSBFdGguYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICB0bzogcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgIG5vbmNlOiBiYWNrdXBLZXlOb25jZSxcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLFxuICAgICAgZ2FzTGltaXQ6IGdhc0xpbWl0LFxuICAgICAgZGF0YTogc2VuZERhdGEsXG4gICAgICBlaXAxNTU5OiBwYXJhbXMuZWlwMTU1OSxcbiAgICAgIHJlcGxheVByb3RlY3Rpb25PcHRpb25zOiBwYXJhbXMucmVwbGF5UHJvdGVjdGlvbk9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRGb3JPZmZsaW5lVmF1bHQoXG4gICAgICAgIHR4SW5mbyxcbiAgICAgICAgdHgsXG4gICAgICAgIHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgZ2FzUHJpY2UsXG4gICAgICAgIGdhc0xpbWl0LFxuICAgICAgICBwYXJhbXMuZWlwMTU1OSxcbiAgICAgICAgcGFyYW1zLnJlcGxheVByb3RlY3Rpb25PcHRpb25zLFxuICAgICAgICBwYXJhbXMuYXBpS2V5XG4gICAgICApIGFzIGFueTtcbiAgICB9XG5cbiAgICBpZiAoIWlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHR4ID0gdHguc2lnbihiYWNrdXBTaWduaW5nS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRUeDogUmVjb3ZlcnlJbmZvID0ge1xuICAgICAgaWQ6IG9wdGlvbmFsRGVwcy5ldGhVdGlsLmJ1ZmZlclRvSGV4KHR4Lmhhc2goKSksXG4gICAgICB0eDogdHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHguYmFja3VwS2V5ID0gYmFja3VwS2V5O1xuICAgICAgc2lnbmVkVHguY29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmVkVHg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBmb3IgY29uc3RydWN0aW5nIFphbWEgQUNMIGRlY3J5cHRpb25cbiAgICogZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIFRoZSBidWlsZGVyIHByb2R1Y2VzIGEgRGVjcnlwdGlvbkRlbGVnYXRpb25UeFJlcXVlc3Qge3RvLCBkYXRhLCB2YWx1ZX0gdGhhdCBpc1xuICAgKiB3YWxsZXQtdHlwZS1hZ25vc3RpYyDigJQgV1Agcm91dGVzIGl0IHRvIHRoZSBjb3JyZWN0IHNpZ25pbmcgcGF0aDpcbiAgICogLSBNUEM6IHN1Ym1pdCBhcyBhIHJhdyBUU1MgdHJhbnNhY3Rpb25cbiAgICogLSBNdWx0aXNpZzogd3JhcCBpbiBzZW5kTXVsdGlTaWcod2FsbGV0Q29udHJhY3QsIHRvLCAwLCBkYXRhLCAuLi4pXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqICAgY29uc3QgcmVxID0gY29pbi5nZXREZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKS5idWlsZCh7XG4gICAqICAgICBhY2xDb250cmFjdEFkZHJlc3M6ICcweGYwRmYuLi4nLFxuICAgKiAgICAgZGVsZWdhdGVBZGRyZXNzOiAgICBlbnRlcnByaXNlVmlld2luZ0tleSxcbiAgICogICAgIHRva2VuQ29udHJhY3RBZGRyZXNzZXM6IFt0b2tlbkFkZHJlc3NdLFxuICAgKiAgICAgZXhwaXJ5VGltZXN0YW1wOiAgICBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDM2NSAqIDg2NDAwLFxuICAgKiAgIH0pO1xuICAgKi9cbiAgZ2V0RGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCk6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKTtcbiAgfVxufVxuIl19
946
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILDhDQVN5QjtBQUN6Qiw0Q0FBb0Y7QUFDcEYsc0RBMkI2QjtBQUM3QixnREFBeUM7QUFDekMsMENBQTRCO0FBRTVCLCtCQUE0QjtBQUM1QiwrQkFBMkM7QUFJM0MsTUFBYSxZQUFhLFNBQVEsU0FBRztJQVFuQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixrRkFBa0Y7UUFDbEYsNEdBQTRHO1FBQzVHLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQTBCO1FBQ3RELE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDNUIsZUFBcUM7UUFDbkMsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCO1FBQ3hDLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtLQUN6QztRQUVELE1BQU0sV0FBVyxHQUEyQixFQUFFLENBQUM7UUFDL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FB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LEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FDL0IsTUFBTSxFQUNOLEVBQUUsRUFDRixPQUFPLEVBQ1AsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxDQUFDLE9BQU8sRUFDZCxNQUFNLENBQUMsdUJBQXVCLEVBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQ1AsQ0FBQztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQWlCO1lBQzdCLEVBQUUsRUFBRSwyQkFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNuQyxDQUFDO1FBRUYsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMvQixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsOEJBQThCO1FBQzVCLE9BQU8sSUFBSSwwQ0FBMkIsRUFBRSxDQUFDO0lBQzNDLENBQUM7O0FBMWpDSCxvQ0EyakNDO0FBeGpDUSxzQkFBUyxHQUFjO0lBQzVCLE9BQU8sRUFBRSxLQUFLO0lBQ2QsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7XG4gIEJpdEdvQmFzZSxcbiAgQ29pbkNvbnN0cnVjdG9yLFxuICBjaGVja0tyc1Byb3ZpZGVyLFxuICBnZXRJc0tyc1JlY292ZXJ5LFxuICBnZXRJc1Vuc2lnbmVkU3dlZXAsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTmFtZWRDb2luQ29uc3RydWN0b3IsXG4gIFV0aWwsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucywgRXJjNzk4NFRva2VuQ29uZmlnLCBFdGhlcmV1bU5ldHdvcmssIHRva2VucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIENvaW5OYW1lcyxcbiAgRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyLFxuICBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEsXG4gIGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSxcbiAgZGVjb2RlRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJDYWxsZGF0YSxcbiAgZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YSxcbiAgZGVjb2RlU2VuZE11bHRpU2lnRmx1c2hFUkM3OTg0RGF0YSxcbiAgc2VuZE11bHRpc2lnTWV0aG9kSWQsXG4gIGNvbmZpZGVudGlhbFRyYW5zZmVyV2l0aFByb29mTWV0aG9kSWQsXG4gIGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJCeUhhbmRsZUNhbGxkYXRhLFxuICBvcHRpb25hbERlcHMsXG4gIFJlY292ZXJPcHRpb25zLFxuICBSZWNvdmVyeUluZm8sXG4gIE9mZmxpbmVWYXVsdFR4SW5mbyxcbiAgVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zLFxuICBhY2xNdWx0aWNhbGxNZXRob2RJZCxcbiAgY2FsbEZyb21QYXJlbnRNZXRob2RJZCxcbiAgZGVjb2RlV3JhcENhbGxkYXRhLFxuICB3cmFwTWV0aG9kSWQsXG4gIGFzc2VydEFtb3VudFRpbWVzUmF0ZUZpdHNVaW50NjQsXG4gIGRlY29kZVVud3JhcENhbGxkYXRhLFxuICB1bndyYXBNZXRob2RJZCxcbiAgZGVjb2RlRmluYWxpemVVbndyYXBDYWxsZGF0YSxcbiAgZmluYWxpemVVbndyYXBNZXRob2RJZCxcbiAgVUlOVDY0X01BWCxcbiAgZGVjb2RlVHJhbnNmZXJEYXRhLFxufSBmcm9tICdAYml0Z28vYWJzdHJhY3QtZXRoJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3NlY3AyNTZrMSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEV0aCB9IGZyb20gJy4vZXRoJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vbGliJztcblxuZXhwb3J0IHsgRXJjNzk4NFRva2VuQ29uZmlnIH07XG5cbmV4cG9ydCBjbGFzcyBFcmM3OTg0VG9rZW4gZXh0ZW5kcyBFdGgge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IEVyYzc5ODRUb2tlbkNvbmZpZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbmRNZXRob2ROYW1lOiAnc2VuZE11bHRpU2lnJyB8ICdzZW5kTXVsdGlTaWdUb2tlbic7XG4gIHN0YXRpYyBjb2luTmFtZXM6IENvaW5OYW1lcyA9IHtcbiAgICBNYWlubmV0OiAnZXRoJyxcbiAgICBUZXN0bmV0OiAnaHRldGgnLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW5zLmdldCh0b2tlbkNvbmZpZy5jb2luKTtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICAgIHRoaXMudG9rZW5Db25maWcgPSB0b2tlbkNvbmZpZztcbiAgICAvLyBFUkM3OTg0IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgdXNlIHNlbmRNdWx0aVNpZyAobm90IHNlbmRNdWx0aVNpZ1Rva2VuKSBiZWNhdXNlXG4gICAgLy8gdGhlIGNhbGxkYXRhIHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBjYXJyeSBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGVuY3J5cHRlZEhhbmRsZSwgaW5wdXRQcm9vZikuXG4gICAgLy8gc2VuZE11bHRpU2lnVG9rZW4gaGFzIG5vIGRhdGEgcGFyYW1ldGVyIGFuZCBjYW5ub3QgY2FycnkgaW5uZXIgY2FsbGRhdGEuXG4gICAgdGhpcy5zZW5kTWV0aG9kTmFtZSA9ICdzZW5kTXVsdGlTaWcnO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWcpOiBDb2luQ29uc3RydWN0b3Ige1xuICAgIHJldHVybiAoYml0Z286IEJpdEdvQmFzZSkgPT4gbmV3IEVyYzc5ODRUb2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZ3M6IEVyYzc5ODRUb2tlbkNvbmZpZ1tdID0gW1xuICAgICAgLi4udG9rZW5zLmJpdGNvaW4uZXRoLmNvbmZpZGVudGlhbFRva2VucyxcbiAgICAgIC4uLnRva2Vucy50ZXN0bmV0LmV0aC5jb25maWRlbnRpYWxUb2tlbnMsXG4gICAgXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gRXJjNzk4NFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3IodG9rZW4pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnR5cGUsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50b2tlbkNvbnRyYWN0QWRkcmVzcywgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zQ3RvcnM7XG4gIH1cblxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5hbWU7XG4gIH1cblxuICBnZXQgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmNvaW47XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5ldHdvcms7XG4gIH1cblxuICBnZXQgdG9rZW5Db250cmFjdEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgfVxuXG4gIGdldCBkZWNpbWFsUGxhY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuZGVjaW1hbFBsYWNlcztcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdFUkM3OTg0IENvbmZpZGVudGlhbCBUb2tlbic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMC5cbiAgICogRVJDLTc5ODQgY29uZmlkZW50aWFsIHRyYW5zZmVycyBhbHdheXMgY2FycnkgYW4gZW5jcnlwdGVkIGFtb3VudDsgemVyby12YWx1ZSBzZW5kcyBhcmUgbm90IG1lYW5pbmdmdWwuXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgZGF0YSBhbG9uZyB3aXRoIHRyYW5zYWN0aW9ucyB2aWEgdGhlIHN0YW5kYXJkIHRva2VuLXNlbmQgQVBJLlxuICAgKiBSZXR1cm5zIGZhbHNlIGJlY2F1c2UgRVJDLTc5ODQgc2VuZHMgdXNlIGNvbmZpZGVudGlhbFRyYW5zZmVyKCkgY2FsbGRhdGEgYnVpbHRcbiAgICogYnkgV1AsIG5vdCBhbiBhcmJpdHJhcnkgZGF0YSBmaWVsZCBvbiB0aGUgc2VuZCBwYXJhbXMuXG4gICAqIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJldmVudCBjYWxsZGF0YS1iYXNlZCBmbG93cyBsaWtlIGdldERlbGVnYXRpb25CdWlsZGVyKCksXG4gICAqIHdoaWNoIGJ5cGFzcyB0aGUgdG9rZW4tc2VuZCBwYXRoIGVudGlyZWx5LlxuICAgKi9cbiAgdHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuICdlY2RzYSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChwYXJhbXMudHhQYXJhbXM/LnR5cGUgPT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eFBhcmFtcz8udHlwZSA9PT0gJ3dyYXAnKSB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlXcmFwVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eFBhcmFtcz8udHlwZSA9PT0gJ3Vud3JhcCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeVVud3JhcFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHhQYXJhbXM/LnR5cGUgPT09ICdmaW5hbGl6ZVVud3JhcCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeUZpbmFsaXplVW53cmFwVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb24ocGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbihwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcihwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbnNvbGlkYXRpb25UcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9ID0gcGFyYW1zO1xuICAgIHJldHVybiAhIShcbiAgICAgIHZlcmlmaWNhdGlvbj8uY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3MgfHxcbiAgICAgIHR4UHJlYnVpbGQ/LmNvbnNvbGlkYXRlSWQgfHxcbiAgICAgIHR4UGFyYW1zPy50eXBlID09PSAnY29uc29saWRhdGUnIHx8XG4gICAgICAvLyBUU1Mgc2lnbmluZyBwYXRoOiByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgc2V0cyB0eXBlIGZyb20gaW50ZW50LmludGVudFR5cGUgd2hpY2ggaXNcbiAgICAgIC8vICdjb25zb2xpZGF0ZVRva2VuJyBmb3IgRVJDLTc5ODQgdG9rZW4gY29uc29saWRhdGlvbnMuIHR4UHJlYnVpbGQgaGFzIG9ubHkgdHhIZXhcbiAgICAgIC8vIChubyBjb25zb2xpZGF0ZUlkKSBpbiB0aGlzIHBhdGguXG4gICAgICB0eFBhcmFtcz8udHlwZSA9PT0gJ2NvbnNvbGlkYXRlVG9rZW4nIHx8XG4gICAgICB0eFBhcmFtcz8ucHJlYnVpbGRUeD8uY29uc29saWRhdGVJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgV3JhcEVSQzc5ODQgKHNoaWVsZCkgdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBUU1MgLyBkaXJlY3Qgc2hhcGU6XG4gICAqICAgdHgudG8gICA9IHdyYXBwZXIgY29udHJhY3RcbiAgICogICB0eC5kYXRhID0gd3JhcChiYXNlQWRkcmVzcywgYW1vdW50KVxuICAgKlxuICAgKiBNdWx0aXNpZyBzaGFwZTpcbiAgICogICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyh3cmFwcGVyLCAwLCB3cmFwKGJhc2VBZGRyZXNzLCBhbW91bnQpLCAuLi4pXG4gICAqXG4gICAqIENoZWNrczogd3JhcHBlciBhZGRyZXNzLCBzZWxmLWRpcmVjdGVkIGB0b2AgPT0gYmFzZSwgYW1vdW50ID4gMCwgYW1vdW50IG1hdGNoZXNcbiAgICogcmVjaXBpZW50cywgYW5kIGFtb3VudCDDlyByYXRlIGZpdHMgdWludDY0IHdoZW4gc3RhdGljcyByYXRlIGlzIHByZXNlbnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZlcmlmeVdyYXBUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlXcmFwVHJhbnNhY3Rpb246IG1pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZyb20odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgIGxldCB3cmFwcGVyQWRkcmVzczogc3RyaW5nO1xuICAgIGxldCB3cmFwQ2FsbGRhdGE6IHN0cmluZztcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHhKc29uLmRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVUcmFuc2ZlckRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB3cmFwcGVyQWRkcmVzcyA9IGRlY29kZWQudG87XG4gICAgICAgIHdyYXBDYWxsZGF0YSA9IGRlY29kZWQuZGF0YSBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChkZWNvZGVkLmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBzZW5kTXVsdGlTaWcgdmFsdWUgMCBidXQgZ290ICR7ZGVjb2RlZC5hbW91bnR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHhKc29uLmRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHdyYXBNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB3cmFwcGVyQWRkcmVzcyA9IHR4SnNvbi50byBhcyBzdHJpbmc7XG4gICAgICAgIHdyYXBDYWxsZGF0YSA9IHR4SnNvbi5kYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke3R4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeVdyYXBUcmFuc2FjdGlvbjogZmFpbGVkIHRvIGRlY29kZSB3cmFwIGNhbGxkYXRhIOKAlCAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGlmICh3cmFwcGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHZlcmlmeVdyYXBUcmFuc2FjdGlvbjogd3JhcHBlciBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICBgZXhwZWN0ZWQgJHt0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzfSwgZ290ICR7d3JhcHBlckFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgdG86IHN0cmluZztcbiAgICBsZXQgYW1vdW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgICh7IHRvLCBhbW91bnQgfSA9IGRlY29kZVdyYXBDYWxsZGF0YSh3cmFwQ2FsbGRhdGEpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeVdyYXBUcmFuc2FjdGlvbjogaW52YWxpZCB3cmFwIGlubmVyIGNhbGxkYXRhIOKAlCAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGlmICghRXJjNzk4NFRva2VuLmlzUG9zaXRpdmVJbnRlZ2VyU3RyaW5nKGFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyaWZ5V3JhcFRyYW5zYWN0aW9uOiBhbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nLCBnb3QgJyR7YW1vdW50fSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuZ2V0V2FsbGV0QmFzZUFkZHJlc3Mod2FsbGV0KTtcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeVdyYXBUcmFuc2FjdGlvbjogdW5hYmxlIHRvIGRldGVybWluZSB3YWxsZXQgYmFzZSBhZGRyZXNzJyk7XG4gICAgfVxuICAgIGlmICh0by50b0xvd2VyQ2FzZSgpICE9PSBiYXNlQWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlXcmFwVHJhbnNhY3Rpb246IHdyYXAgcmVjaXBpZW50IG11c3QgZXF1YWwgd2FsbGV0IGJhc2UgYWRkcmVzcyDigJQgZXhwZWN0ZWQgJHtiYXNlQWRkcmVzc30sIGdvdCAke3RvfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRBbW91bnQgPSB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hbW91bnQgPz8gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hbW91bnQ7XG4gICAgaWYgKGV4cGVjdGVkQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKGV4cGVjdGVkQW1vdW50KSAhPT0gYW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlXcmFwVHJhbnNhY3Rpb246IGFtb3VudCBtaXNtYXRjaCDigJQgY2FsbGRhdGEgaGFzICcke2Ftb3VudH0nIGJ1dCBwYXJhbXMgaGF2ZSAnJHtleHBlY3RlZEFtb3VudH0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByYXRlID0gdGhpcy50b2tlbkNvbmZpZy5yYXRlO1xuICAgIGlmIChyYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFzc2VydEFtb3VudFRpbWVzUmF0ZUZpdHNVaW50NjQoYW1vdW50LCByYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlXcmFwVHJhbnNhY3Rpb246ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR4SnNvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR4SnNvbi52YWx1ZSAhPT0gJzAnICYmIHR4SnNvbi52YWx1ZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlXcmFwVHJhbnNhY3Rpb246IGV4cGVjdGVkIHRyYW5zYWN0aW9uIHZhbHVlIDAgYnV0IGdvdCAke3R4SnNvbi52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBVbndyYXBFUkM3OTg0ICh1bnNoaWVsZCBwaGFzZS0xKSB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIFRTUyAvIGRpcmVjdCBzaGFwZTpcbiAgICogICB0eC50byAgID0gd3JhcHBlciBjb250cmFjdFxuICAgKiAgIHR4LmRhdGEgPSB1bndyYXAoYmFzZSwgYmFzZSwgZW5jcnlwdGVkQW1vdW50LCBpbnB1dFByb29mKVxuICAgKlxuICAgKiBNdWx0aXNpZyBzaGFwZTpcbiAgICogICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyh3cmFwcGVyLCAwLCB1bndyYXAoYmFzZSwgYmFzZSwgLi4uKSwgLi4uKVxuICAgKlxuICAgKiB2MSBpcyBzZWxmLWRpcmVjdGVkIG9ubHk6IGZyb20gPT0gdG8gPT0gd2FsbGV0IGJhc2UgYWRkcmVzcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5VW53cmFwVHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHdhbGxldCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlVbndyYXBUcmFuc2FjdGlvbjogbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IHdyYXBwZXJBZGRyZXNzOiBzdHJpbmc7XG4gICAgbGV0IHVud3JhcENhbGxkYXRhOiBzdHJpbmc7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR4SnNvbi5kYXRhLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVHJhbnNmZXJEYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgICAgd3JhcHBlckFkZHJlc3MgPSBkZWNvZGVkLnRvO1xuICAgICAgICB1bndyYXBDYWxsZGF0YSA9IGRlY29kZWQuZGF0YSBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChkZWNvZGVkLmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBzZW5kTXVsdGlTaWcgdmFsdWUgMCBidXQgZ290ICR7ZGVjb2RlZC5hbW91bnR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHhKc29uLmRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHVud3JhcE1ldGhvZElkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHdyYXBwZXJBZGRyZXNzID0gdHhKc29uLnRvIGFzIHN0cmluZztcbiAgICAgICAgdW53cmFwQ2FsbGRhdGEgPSB0eEpzb24uZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtZXRob2QgSUQgJHt0eEpzb24uZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlVbndyYXBUcmFuc2FjdGlvbjogZmFpbGVkIHRvIGRlY29kZSB1bndyYXAgY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgaWYgKHdyYXBwZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5VW53cmFwVHJhbnNhY3Rpb246IHdyYXBwZXIgYWRkcmVzcyBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJHt0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzfSwgZ290ICR7d3JhcHBlckFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgZnJvbTogc3RyaW5nO1xuICAgIGxldCB0bzogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRBbW91bnQ6IHN0cmluZztcbiAgICBsZXQgaW5wdXRQcm9vZjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAoeyBmcm9tLCB0bywgZW5jcnlwdGVkQW1vdW50LCBpbnB1dFByb29mIH0gPSBkZWNvZGVVbndyYXBDYWxsZGF0YSh1bndyYXBDYWxsZGF0YSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyaWZ5VW53cmFwVHJhbnNhY3Rpb246IGludmFsaWQgdW53cmFwIGlubmVyIGNhbGxkYXRhIOKAlCAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdGhpcy5nZXRXYWxsZXRCYXNlQWRkcmVzcyh3YWxsZXQpO1xuICAgIGlmICghYmFzZUFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5VW53cmFwVHJhbnNhY3Rpb246IHVuYWJsZSB0byBkZXRlcm1pbmUgd2FsbGV0IGJhc2UgYWRkcmVzcycpO1xuICAgIH1cbiAgICBpZiAoZnJvbS50b0xvd2VyQ2FzZSgpICE9PSBiYXNlQWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlVbndyYXBUcmFuc2FjdGlvbjogdW53cmFwIGZyb20gbXVzdCBlcXVhbCB3YWxsZXQgYmFzZSBhZGRyZXNzIOKAlCBleHBlY3RlZCAke2Jhc2VBZGRyZXNzfSwgZ290ICR7ZnJvbX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodG8udG9Mb3dlckNhc2UoKSAhPT0gYmFzZUFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5VW53cmFwVHJhbnNhY3Rpb246IHVud3JhcCB0byBtdXN0IGVxdWFsIHdhbGxldCBiYXNlIGFkZHJlc3Mg4oCUIGV4cGVjdGVkICR7YmFzZUFkZHJlc3N9LCBnb3QgJHt0b31gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghZW5jcnlwdGVkQW1vdW50IHx8IGVuY3J5cHRlZEFtb3VudCA9PT0gJzB4JyB8fCAvXjB4MCskLy50ZXN0KGVuY3J5cHRlZEFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5VW53cmFwVHJhbnNhY3Rpb246IGVuY3J5cHRlZEFtb3VudCBpcyBtaXNzaW5nIG9yIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmICghaW5wdXRQcm9vZiB8fCBpbnB1dFByb29mID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeVVud3JhcFRyYW5zYWN0aW9uOiBpbnB1dFByb29mIGlzIG1pc3Npbmcgb3IgZW1wdHknKTtcbiAgICB9XG5cbiAgICBpZiAodHhKc29uLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHhKc29uLnZhbHVlICE9PSAnMCcgJiYgdHhKc29uLnZhbHVlICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeVVud3JhcFRyYW5zYWN0aW9uOiBleHBlY3RlZCB0cmFuc2FjdGlvbiB2YWx1ZSAwIGJ1dCBnb3QgJHt0eEpzb24udmFsdWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgRmluYWxpemVVbndyYXBFUkM3OTg0ICh1bnNoaWVsZCBwaGFzZS0yKSB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIFRTUyAvIGRpcmVjdCBzaGFwZTpcbiAgICogICB0eC50byAgID0gd3JhcHBlciBjb250cmFjdFxuICAgKiAgIHR4LmRhdGEgPSBmaW5hbGl6ZVVud3JhcChyZXF1ZXN0SWQsIGNsZWFydGV4dEFtb3VudCwgZGVjcnlwdGlvblByb29mKVxuICAgKlxuICAgKiBNdWx0aXNpZyBzaGFwZTpcbiAgICogICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyh3cmFwcGVyLCAwLCBmaW5hbGl6ZVVud3JhcCguLi4pLCAuLi4pXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZlcmlmeUZpbmFsaXplVW53cmFwVHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQ/LnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUZpbmFsaXplVW53cmFwVHJhbnNhY3Rpb246IG1pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZyb20odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgIGxldCB3cmFwcGVyQWRkcmVzczogc3RyaW5nO1xuICAgIGxldCBmaW5hbGl6ZUNhbGxkYXRhOiBzdHJpbmc7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR4SnNvbi5kYXRhLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVHJhbnNmZXJEYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgICAgd3JhcHBlckFkZHJlc3MgPSBkZWNvZGVkLnRvO1xuICAgICAgICBmaW5hbGl6ZUNhbGxkYXRhID0gZGVjb2RlZC5kYXRhIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGRlY29kZWQuYW1vdW50ICE9PSAnMCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIHNlbmRNdWx0aVNpZyB2YWx1ZSAwIGJ1dCBnb3QgJHtkZWNvZGVkLmFtb3VudH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eEpzb24uZGF0YS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoZmluYWxpemVVbndyYXBNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB3cmFwcGVyQWRkcmVzcyA9IHR4SnNvbi50byBhcyBzdHJpbmc7XG4gICAgICAgIGZpbmFsaXplQ2FsbGRhdGEgPSB0eEpzb24uZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtZXRob2QgSUQgJHt0eEpzb24uZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5RmluYWxpemVVbndyYXBUcmFuc2FjdGlvbjogZmFpbGVkIHRvIGRlY29kZSBmaW5hbGl6ZVVud3JhcCBjYWxsZGF0YSDigJQgJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh3cmFwcGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHZlcmlmeUZpbmFsaXplVW53cmFwVHJhbnNhY3Rpb246IHdyYXBwZXIgYWRkcmVzcyBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJHt0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzfSwgZ290ICR7d3JhcHBlckFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgbGV0IGNsZWFydGV4dEFtb3VudDogc3RyaW5nO1xuICAgIGxldCBkZWNyeXB0aW9uUHJvb2Y6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgKHsgcmVxdWVzdElkLCBjbGVhcnRleHRBbW91bnQsIGRlY3J5cHRpb25Qcm9vZiB9ID0gZGVjb2RlRmluYWxpemVVbndyYXBDYWxsZGF0YShmaW5hbGl6ZUNhbGxkYXRhKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5RmluYWxpemVVbndyYXBUcmFuc2FjdGlvbjogaW52YWxpZCBmaW5hbGl6ZVVud3JhcCBpbm5lciBjYWxsZGF0YSDigJQgJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkIHx8IHJlcXVlc3RJZCA9PT0gJzB4JyB8fCAvXjB4MCskLy50ZXN0KHJlcXVlc3RJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RmluYWxpemVVbndyYXBUcmFuc2FjdGlvbjogcmVxdWVzdElkIGlzIG1pc3Npbmcgb3IgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcoY2xlYXJ0ZXh0QW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5RmluYWxpemVVbndyYXBUcmFuc2FjdGlvbjogY2xlYXJ0ZXh0QW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHN0cmluZywgZ290ICcke2NsZWFydGV4dEFtb3VudH0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKEJpZ0ludChjbGVhcnRleHRBbW91bnQpID4gVUlOVDY0X01BWCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlGaW5hbGl6ZVVud3JhcFRyYW5zYWN0aW9uOiBjbGVhcnRleHRBbW91bnQgZXhjZWVkcyB1aW50NjQnKTtcbiAgICB9XG4gICAgaWYgKCFkZWNyeXB0aW9uUHJvb2YgfHwgZGVjcnlwdGlvblByb29mID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUZpbmFsaXplVW53cmFwVHJhbnNhY3Rpb246IGRlY3J5cHRpb25Qcm9vZiBpcyBtaXNzaW5nIG9yIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRBbW91bnQgPSB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hbW91bnQgPz8gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hbW91bnQ7XG4gICAgaWYgKGV4cGVjdGVkQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKGV4cGVjdGVkQW1vdW50KSAhPT0gY2xlYXJ0ZXh0QW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlGaW5hbGl6ZVVud3JhcFRyYW5zYWN0aW9uOiBhbW91bnQgbWlzbWF0Y2gg4oCUIGNhbGxkYXRhIGhhcyAnJHtjbGVhcnRleHRBbW91bnR9JyBidXQgcGFyYW1zIGhhdmUgJyR7ZXhwZWN0ZWRBbW91bnR9J2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR4SnNvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR4SnNvbi52YWx1ZSAhPT0gJzAnICYmIHR4SnNvbi52YWx1ZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlGaW5hbGl6ZVVud3JhcFRyYW5zYWN0aW9uOiBleHBlY3RlZCB0cmFuc2FjdGlvbiB2YWx1ZSAwIGJ1dCBnb3QgJHt0eEpzb24udmFsdWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFdhbGxldEJhc2VBZGRyZXNzKHdhbGxldDogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zWyd3YWxsZXQnXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3YWxsZXQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHR5cGVvZiB3YWxsZXQuY29pblNwZWNpZmljID09PSAnZnVuY3Rpb24nID8gd2FsbGV0LmNvaW5TcGVjaWZpYygpIDogd2FsbGV0LmNvaW5TcGVjaWZpYztcbiAgICBjb25zdCBldGhDb2luU3BlY2lmaWMgPSBjb2luU3BlY2lmaWMgYXMgeyBiYXNlQWRkcmVzcz86IHN0cmluZzsgcm9vdEFkZHJlc3M/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZXRoQ29pblNwZWNpZmljPy5iYXNlQWRkcmVzcyA/PyBldGhDb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIEVSQy03OTg0IGZvcndhcmRlciBjb25zb2xpZGF0aW9uIChmbHVzaCkgdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBNdWx0aXNpZyBzaGFwZTpcbiAgICogICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyhmb3J3YXJkZXIsIDAsIGNhbGxGcm9tUGFyZW50KHRva2VuLCAwLCBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2YoYmFzZSwgaGFuZGxlKSksIC4uLilcbiAgICpcbiAgICogVFNTIC8gZGlyZWN0IHNoYXBlOlxuICAgKiAgIHR4LnRvICAgPSBmb3J3YXJkZXIgY29udHJhY3RcbiAgICogICB0eC5kYXRhID0gY2FsbEZyb21QYXJlbnQodG9rZW4sIDAsIGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZihiYXNlLCBoYW5kbGUpKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQ/LnR4SGV4KSB7XG4gICAgICBpZiAoIXR4UHJlYnVpbGQ/LmNvbnNvbGlkYXRlSWQgJiYgIXR4UGFyYW1zPy5wcmVidWlsZFR4Py5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogbWlzc2luZyBjb25zb2xpZGF0ZUlkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBsZXQgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgcGFyZW50QWRkcmVzczogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBsZXQgZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU2VuZE11bHRpU2lnRmx1c2hFUkM3OTg0RGF0YSh0eEpzb24uZGF0YSk7XG4gICAgICAgIGZvcndhcmRlckFkZHJlc3MgPSBkZWNvZGVkLmZvcndhcmRlckFkZHJlc3M7XG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzID0gZGVjb2RlZC50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgICAgICAgcGFyZW50QWRkcmVzcyA9IGRlY29kZWQucGFyZW50QWRkcmVzcztcbiAgICAgICAgZW5jcnlwdGVkSGFuZGxlID0gZGVjb2RlZC5lbmNyeXB0ZWRIYW5kbGU7XG4gICAgICB9IGVsc2UgaWYgKHR4SnNvbi5kYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gICAgICAgIHBhcmVudEFkZHJlc3MgPSBkZWNvZGVkLnBhcmVudEFkZHJlc3M7XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgICBmb3J3YXJkZXJBZGRyZXNzID0gdHhKc29uLnRvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke3R4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiBmYWlsZWQgdG8gZGVjb2RlIGNvbnNvbGlkYXRpb24gY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiB0b2tlbiBjb250cmFjdCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICBgZXhwZWN0ZWQgJHt0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzfSwgZ290ICR7dG9rZW5Db250cmFjdEFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuZ2V0V2FsbGV0QmFzZUFkZHJlc3Mod2FsbGV0KTtcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IHVuYWJsZSB0byBkZXRlcm1pbmUgd2FsbGV0IGJhc2UgYWRkcmVzcycpO1xuICAgIH1cbiAgICBpZiAocGFyZW50QWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBiYXNlQWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiBwYXJlbnQgYWRkcmVzcyBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJHtiYXNlQWRkcmVzc30sIGdvdCAke3BhcmVudEFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY3J5cHRlZEhhbmRsZSB8fCBlbmNyeXB0ZWRIYW5kbGUgPT09ICcweCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogZW5jcnlwdGVkSGFuZGxlIGlzIG1pc3Npbmcgb3IgZW1wdHkgaW4gdHJhbnNhY3Rpb24gY2FsbGRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBlY3RlZEZvcndhcmRlciA9XG4gICAgICB0eFByZWJ1aWxkLnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/P1xuICAgICAgdHhQcmVidWlsZC50eEluZm8/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/P1xuICAgICAgdHhQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcztcbiAgICBpZiAoZm9yd2FyZGVyQWRkcmVzcyAmJiBleHBlY3RlZEZvcndhcmRlcikge1xuICAgICAgaWYgKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gZXhwZWN0ZWRGb3J3YXJkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IGZvcndhcmRlciBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICAgIGBleHBlY3RlZCAke2V4cGVjdGVkRm9yd2FyZGVyfSwgZ290ICR7Zm9yd2FyZGVyQWRkcmVzc31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBjb25maWRlbnRpYWwgdG9rZW4gdHJhbnNmZXIgKFNlbmRFUkM3OTg0KSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogV2l0aCB0eEhleCDigJQgdHdvIG9uLWNoYWluIHNoYXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKlxuICAgKiAgIHNlbmRNdWx0aVNpZy13cmFwcGVkIChtdWx0aXNpZyAvIHNtYXJ0LWNvbnRyYWN0IHdhbGxldCk6XG4gICAqICAgICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgICB0eC5kYXRhID0gc2VuZE11bHRpU2lnKHRva2VuQWRkciwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBoYW5kbGUsIHByb29mKSwgLi4uKVxuICAgKiAgICAgVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyBkZWNvZGVkIGZyb20gdGhlIHNlbmRNdWx0aVNpZyBpbm5lciBjYWxsZGF0YS5cbiAgICpcbiAgICogICBEaXJlY3QgY2FsbCAoaG90IC8gVFNTIEVPQSB3YWxsZXQpOlxuICAgKiAgICAgdHgudG8gICA9IHRva2VuIGNvbnRyYWN0XG4gICAqICAgICB0eC5kYXRhID0gY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBoYW5kbGUsIHByb29mKVxuICAgKiAgICAgVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyB0YWtlbiBmcm9tIHR4LnRvLlxuICAgKlxuICAgKiAgIEZvciBib3RoIHNoYXBlcyB0aGUgdmVyaWZpZXIgY2hlY2tzOlxuICAgKiAgICAgMS4gVG9rZW4gY29udHJhY3QgYWRkcmVzcyBtYXRjaGVzIHRoaXMgY29pbidzIHRva2VuQ29udHJhY3RBZGRyZXNzLlxuICAgKiAgICAgMi4gRGVjb2RlZCByZWNpcGllbnQgbWF0Y2hlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3Mgb3IgYnVpbGRQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzLlxuICAgKiAgICAgMy4gZW5jcnlwdGVkSGFuZGxlIGFuZCBpbnB1dFByb29mIGFyZSBzdHJ1Y3R1cmFsbHkgcHJlc2VudCAobm9uLWVtcHR5KS5cbiAgICogICAgIDQuIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50IGlzIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbWF0Y2hlcyBidWlsZFBhcmFtcyB3aGVuIGJvdGggcHJlc2VudC5cbiAgICpcbiAgICogV2l0aG91dCB0eEhleCAoZmlyc3Qtc2lnbmVyIC8gcHJlLXNpZ25pbmcgcGF0aCk6XG4gICAqICAxLiBSZXF1aXJlcyBleGFjdGx5IG9uZSByZWNpcGllbnQgaW4gdHhQYXJhbXMuXG4gICAqICAyLiBWYWxpZGF0ZXMgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzIGlzIGEgdmFsaWQgRXRoZXJldW0gYWRkcmVzcy5cbiAgICogIDMuIFZhbGlkYXRlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudCBpcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gICAqICA0LiBDcm9zcy1jaGVja3MgYWRkcmVzcyBhbmQgYW1vdW50IGFnYWluc3QgYnVpbGRQYXJhbXMgd2hlbiB0aGUgc2VydmVyIGhhcyBzdG9yZWQgdGhlIGludGVudC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQ/LnR4SGV4KSB7XG4gICAgICAvLyBObyByYXcgdHggYXZhaWxhYmxlIChtdWx0aXNpZyBmaXJzdC1zaWduZXIgcGF0aCkuXG4gICAgICAvLyBWYWxpZGF0ZSBFUkM3OTg0LXNwZWNpZmljIGludmFyaWFudHMgZnJvbSB0eFBhcmFtcyBhbmQgYnVpbGRQYXJhbXMuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQYXJhbXM/LnJlY2lwaWVudHM7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogY29uZmlkZW50aWFsIHRyYW5zZmVycyBzdXBwb3J0IGV4YWN0bHkgMSByZWNpcGllbnQsIGdvdCAke3JlY2lwaWVudHMubGVuZ3RofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgICBpZiAoIXJlY2lwaWVudC5hZGRyZXNzIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnQgYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQ6ICR7cmVjaXBpZW50LmFkZHJlc3N9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhbW91bnRTdHIgPSBTdHJpbmcocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICBpZiAoIUVyYzc5ODRUb2tlbi5pc1Bvc2l0aXZlSW50ZWdlclN0cmluZyhhbW91bnRTdHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke2Ftb3VudFN0cn0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQ3Jvc3MtY2hlY2sgYWdhaW5zdCBidWlsZFBhcmFtcyB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgc3RvcmVkIHRoZSBpbnRlbnRcbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zUmVjaXBpZW50ID0gdHhQcmVidWlsZD8uYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXTtcbiAgICAgIGlmIChidWlsZFBhcmFtc1JlY2lwaWVudD8uYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChyZWNpcGllbnQuYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBidWlsZFBhcmFtc1JlY2lwaWVudC5hZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICAgICAgYHR4UGFyYW1zIGhhcyAnJHtyZWNpcGllbnQuYWRkcmVzc30nIGJ1dCBidWlsZFBhcmFtcyBoYXMgJyR7YnVpbGRQYXJhbXNSZWNpcGllbnQuYWRkcmVzc30nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zQW1vdW50ID0gYnVpbGRQYXJhbXNSZWNpcGllbnQ/LmFtb3VudDtcbiAgICAgIGlmIChidWlsZFBhcmFtc0Ftb3VudCAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkUGFyYW1zQW1vdW50ICE9PSBhbW91bnRTdHIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogYW1vdW50IG1pc21hdGNoIOKAlCB0eFBhcmFtcyBoYXMgJyR7YW1vdW50U3RyfScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYW5kIGRlY29kZSB0aGUgcmF3IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IHRvQWRkcmVzczogc3RyaW5nO1xuICAgIGxldCB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBsZXQgaW5wdXRQcm9vZjogc3RyaW5nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgICAgICAvLyBzZW5kTXVsdGlTaWctd3JhcHBlZCBwYXRoOiBzbWFydC1jb250cmFjdCB3YWxsZXQgcmVsYXlzIHRoZSBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsLlxuICAgICAgICAvLyBUb2tlbiBjb250cmFjdCBhZGRyZXNzIGlzIGVuY29kZWQgaW5zaWRlIHRoZSBzZW5kTXVsdGlTaWcgY2FsbGRhdGEuXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b0FkZHJlc3MgPSBkZWNvZGVkLnRvQWRkcmVzcztcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSBkZWNvZGVkLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICAgICAgICBlbmNyeXB0ZWRIYW5kbGUgPSBkZWNvZGVkLmVuY3J5cHRlZEhhbmRsZTtcbiAgICAgICAgaW5wdXRQcm9vZiA9IGRlY29kZWQuaW5wdXRQcm9vZjtcbiAgICAgIH0gZWxzZSBpZiAodHhKc29uLmRhdGEuc3RhcnRzV2l0aChjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkKSkge1xuICAgICAgICAvLyBEaXJlY3QgY2FsbCBwYXRoOiBob3QvVFNTIEVPQSB3YWxsZXQgY2FsbHMgdGhlIHRva2VuIGNvbnRyYWN0IGRpcmVjdGx5LlxuICAgICAgICAvLyBUaGUgdHJhbnNhY3Rpb24ncyBgdG9gIGZpZWxkIGlzIHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzLlxuICAgICAgICBpZiAoIXR4SnNvbi50bykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGlyZWN0IGNvbmZpZGVudGlhbFRyYW5zZmVyIGNhbGwgaXMgbWlzc2luZyB0cmFuc2FjdGlvbiB0byBhZGRyZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZURpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyQ2FsbGRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b0FkZHJlc3MgPSBkZWNvZGVkLnRvQWRkcmVzcztcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSB0eEpzb24udG87XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgICBpbnB1dFByb29mID0gZGVjb2RlZC5pbnB1dFByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke3R4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZmFpbGVkIHRvIGRlY29kZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAxLiBUb2tlbiBjb250cmFjdCBhZGRyZXNzIG11c3QgbWF0Y2ggdGhpcyBjb2luXG4gICAgaWYgKHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgK1xuICAgICAgICAgIGBleHBlY3RlZCAke3RoaXMudG9rZW5Db250cmFjdEFkZHJlc3N9LCBnb3QgJHt0b2tlbkNvbnRyYWN0QWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIFJlY2lwaWVudCBhZGRyZXNzIG11c3QgbWF0Y2ggdHhQYXJhbXMucmVjaXBpZW50c1swXSBvciBidWlsZFBhcmFtcy5yZWNpcGllbnRzWzBdXG4gICAgY29uc3QgZXhwZWN0ZWRSZWNpcGllbnQgPSB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hZGRyZXNzID8/IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcztcbiAgICBpZiAoIWV4cGVjdGVkUmVjaXBpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogbWlzc2luZyBleHBlY3RlZCByZWNpcGllbnQgKHByb3ZpZGUgdHhQYXJhbXMucmVjaXBpZW50cyBvciB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLnJlY2lwaWVudHMpJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRvQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZFJlY2lwaWVudC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgKyBgZXhwZWN0ZWQgJHtleHBlY3RlZFJlY2lwaWVudH0sIGdvdCAke3RvQWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIGVuY3J5cHRlZEhhbmRsZSBtdXN0IGJlIGEgbm9uLXRyaXZpYWwgaGV4IHZhbHVlIChub3QgYmFyZSAnMHgnKVxuICAgIGlmICghZW5jcnlwdGVkSGFuZGxlIHx8IGVuY3J5cHRlZEhhbmRsZSA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZW5jcnlwdGVkSGFuZGxlIGlzIG1pc3Npbmcgb3IgZW1wdHkgaW4gdHJhbnNhY3Rpb24gY2FsbGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyA0LiBpbnB1dFByb29mIG11c3QgYmUgYSBub24tdHJpdmlhbCBoZXggdmFsdWVcbiAgICBpZiAoIWlucHV0UHJvb2YgfHwgaW5wdXRQcm9vZiA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogaW5wdXRQcm9vZiBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gNS4gVmVyaWZ5IHBsYWludGV4dCBpbnRlbnQ6IHR4UGFyYW1zIGFtb3VudCBtdXN0IGJlIHZhbGlkIGFuZCBjb25zaXN0ZW50IHdpdGggYnVpbGRQYXJhbXNcbiAgICBjb25zdCByYXdUeFBhcmFtc0Ftb3VudCA9IHR4UGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFtb3VudDtcbiAgICBpZiAocmF3VHhQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHhQYXJhbXNBbW91bnQgPSBTdHJpbmcocmF3VHhQYXJhbXNBbW91bnQpO1xuICAgICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodHhQYXJhbXNBbW91bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke3R4UGFyYW1zQW1vdW50fSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZFBhcmFtc0Ftb3VudCA9IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYW1vdW50O1xuICAgICAgaWYgKGJ1aWxkUGFyYW1zQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgdHhQYXJhbXNBbW91bnQgIT09IGJ1aWxkUGFyYW1zQW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtaXNtYXRjaCDigJQgdHhQYXJhbXMgaGFzICcke3R4UGFyYW1zQW1vdW50fScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlxcZCskLy50ZXN0KHZhbHVlKSAmJiBCaWdJbnQodmFsdWUpID4gMG47XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uIGZvciBFUkMtNzk4NCBkZWNyeXB0aW9uIGRlbGVnYXRpb24uXG4gICAqXG4gICAqIFRTUyBwYXRoOiBkZWNvZGVzIHRoZSByYXcgdHggYW5kIHZlcmlmaWVzIGl0IGNhbGxzIHRoZSBBQ0wgY29udHJhY3Qgd2l0aFxuICAgKiBjYWxsZGF0YSB0aGF0IGNvdmVycyBhbGwgcmVxdWVzdGVkIHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogTXVsdGlzaWcgcGF0aDogdmVyaWZpZXMgdGhlIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHMgY2FycnkgdGhlIGNvcnJlY3QgdG9rZW5OYW1lc1xuICAgKiBhbmQgemVybyBhbW91bnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0VHlwZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHdhbGxldFR5cGUgPT09ICd0c3MnKSB7XG4gICAgICAvLyBUU1MgcGF0aDogZnVsbCByYXctdHggZGVjb2RlXG4gICAgICBjb25zdCBlbmFibGVUb2tlbnMgPSB0eFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBpZiAoIWVuYWJsZVRva2VucyB8fCBlbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogZW5hYmxlVG9rZW5zIG11c3QgYmUgbm9uLWVtcHR5IGZvciBUU1MgcGF0aCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgcmVxdWVzdGVkIHRva2VuIG5hbWVzIOKGkiBjb250cmFjdCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEFkZHJlc3NlcyA9IGVuYWJsZVRva2Vucy5tYXAoKHQpID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW5Db2luID0gdGhpcy5iaXRnby5jb2luKHQubmFtZSkgYXMgRXJjNzk4NFRva2VuO1xuICAgICAgICByZXR1cm4gdG9rZW5Db2luLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUGFyc2UgdGhlIHJhdyB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gdGFyZ2V0cyB0aGUgY29ycmVjdCBjb250cmFjdCBiYXNlZCBvbiBjYWxsZGF0YSBzaGFwZVxuICAgICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yaygpIGFzIEV0aGVyZXVtTmV0d29yaztcbiAgICAgIGNvbnN0IGFjbENvbnRyYWN0QWRkcmVzcyA9IG5ldHdvcms/LnphbWFBY2xDb250cmFjdEFkZHJlc3M7XG4gICAgICBpZiAoIWFjbENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHphbWFBY2xDb250cmFjdEFkZHJlc3Mgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgbmV0d29yaycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eEpzb24udG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiBpcyBtaXNzaW5nIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluc3BlY3QgY2FsbGRhdGEgbWV0aG9kIElEIHRvIGRpc3Rpbmd1aXNoIHJvb3Qgd2FsbGV0IGZyb20gZm9yd2FyZGVyIHdhbGxldDpcbiAgICAgIC8vICAgYWNsTXVsdGljYWxsTWV0aG9kSWQgICDihpIgcm9vdCB3YWxsZXQ6IHRvID0gQUNMIGNvbnRyYWN0IGRpcmVjdGx5XG4gICAgICAvLyAgIGNhbGxGcm9tUGFyZW50TWV0aG9kSWQg4oaSIGZvcndhcmRlciB3YWxsZXQ6IHRvID0gZm9yd2FyZGVyLCBBQ0wgYWRkcmVzcyBpcyBpbnNpZGUgY2FsbGRhdGFcbiAgICAgIGNvbnN0IGNhbGxkYXRhTWV0aG9kSWQgPSB0eEpzb24uZGF0YS5zbGljZSgwLCAxMCk7XG4gICAgICBpZiAoY2FsbGRhdGFNZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICAgICAgLy8gUm9vdCB3YWxsZXQgKGJhc2UgYWRkcmVzcyk6IHR4IGNhbGxzIHRoZSBBQ0wgY29udHJhY3QgZGlyZWN0bHlcbiAgICAgICAgaWYgKHR4SnNvbi50by50b0xvd2VyQ2FzZSgpICE9PSBhY2xDb250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiB0YXJnZXQgJHt0eEpzb24udG99IGRvZXMgbm90IG1hdGNoIEFDTCBjb250cmFjdCAke2FjbENvbnRyYWN0QWRkcmVzc31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjYWxsZGF0YU1ldGhvZElkID09PSBjYWxsRnJvbVBhcmVudE1ldGhvZElkKSB7XG4gICAgICAgIC8vIEZvcndhcmRlciB3YWxsZXQ6IHR4IGNhbGxzIHRoZSBmb3J3YXJkZXIsIHdoaWNoIGNhbGxzIHRoZSBBQ0wgdmlhIGNhbGxGcm9tUGFyZW50LlxuICAgICAgICAvLyBUaGUgZm9yd2FyZGVyIGFkZHJlc3MgaXMgd2FsbGV0LXNwZWNpZmljIGFuZCBjYW5ub3QgYmUgc3RhdGljYWxseSB2ZXJpZmllZCBoZXJlO1xuICAgICAgICAvLyB0b2tlbiBhZGRyZXNzIGNvcnJlY3RuZXNzIGlzIHN0aWxsIHZlcmlmaWVkIGJlbG93IHZpYSBjYWxsZGF0YSBkZWNvZGluZy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogdW5yZWNvZ25pc2VkIGNhbGxkYXRhIG1ldGhvZCBJRCAke2NhbGxkYXRhTWV0aG9kSWR9OyBleHBlY3RlZCBtdWx0aWNhbGwgb3IgY2FsbEZyb21QYXJlbnRgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSB2YWx1ZSBpcyAwXG4gICAgICBpZiAodHhKc29uLnZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBleHBlY3RlZCB0cmFuc2FjdGlvbiB2YWx1ZSAwIGJ1dCBnb3QgJHt0eEpzb24udmFsdWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY29kZSB0b2tlbiBhZGRyZXNzZXMgZnJvbSBjYWxsZGF0YSBhbmQgdmVyaWZ5IGFsbCByZXF1ZXN0ZWQgdG9rZW5zIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBkZWNvZGVkQWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIHJlcXVlc3RlZEFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIWRlY29kZWRBZGRyZXNzZXMuaW5jbHVkZXMocmVxdWVzdGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBkZWxlZ2F0aW9uIGNhbGxkYXRhYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpc2lnIHBhdGg6IGJ1aWxkUGFyYW1zLWxldmVsIGNoZWNrXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cyBhc1xuICAgICAgICB8IEFycmF5PHsgdG9rZW5OYW1lPzogc3RyaW5nOyBhbW91bnQ/OiBzdHJpbmcgfT5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBtaXNzaW5nIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgZm9yIG11bHRpc2lnIHBhdGgnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHJlcXVlc3RlZCB0b2tlbiBuYW1lcyBmcm9tIHR4UGFyYW1zXG4gICAgICBjb25zdCByZXF1ZXN0ZWRUb2tlbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKHR4UGFyYW1zLmVuYWJsZVRva2VucyAmJiB0eFBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0ZWRUb2tlbk5hbWVzLnB1c2goLi4udHhQYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodCkgPT4gdC5uYW1lKSk7XG4gICAgICB9IGVsc2UgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcXVlc3RlZFRva2VuTmFtZXMucHVzaCguLi50eFBhcmFtcy5yZWNpcGllbnRzLm1hcCgocjogYW55KSA9PiByLnRva2VuTmFtZSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IGFsbCByZWNpcGllbnRzIGhhdmUgdG9rZW5OYW1lIGFuZCBhbW91bnQgPSAnMCdcbiAgICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFyZWNpcGllbnQudG9rZW5OYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZWNpcGllbnQgaXMgbWlzc2luZyB0b2tlbk5hbWUgaW4gYnVpbGRQYXJhbXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjaXBpZW50LmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IGV4cGVjdGVkIGFtb3VudCAwIGZvciB0b2tlbiBlbmFibGVtZW50IGJ1dCBnb3QgJHtyZWNpcGllbnQuYW1vdW50fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSByZXF1ZXN0ZWQgdG9rZW4gbmFtZXMgYXJlIHByZXNlbnQgaW4gcmVjaXBpZW50c1xuICAgICAgaWYgKHJlcXVlc3RlZFRva2VuTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZWNpcGllbnRUb2tlbk5hbWVzID0gcmVjaXBpZW50cy5tYXAoKHIpID0+IHIudG9rZW5OYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWQgb2YgcmVxdWVzdGVkVG9rZW5OYW1lcykge1xuICAgICAgICAgIGlmICghcmVjaXBpZW50VG9rZW5OYW1lcy5pbmNsdWRlcyhyZXF1ZXN0ZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBidWlsZFBhcmFtcyByZWNpcGllbnRzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGdhcyBsaW1pdCBmb3IgRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2VuIHJlY292ZXJ5LlxuICAgKiBBY3R1YWwgb24tY2hhaW4gdXNhZ2UgaXMgfjUwNi01MzBrIGdhcyBiYXNlZCBvbiB0ZXN0bmV0IHJlc3VsdHMuXG4gICAqIERlZmF1bHQ6IDgwMCwwMDAgKGNvbWZvcnRhYmxlIGJ1ZmZlciBvdmVyIG9ic2VydmVkIHVzYWdlKS5cbiAgICovXG4gIHNldEdhc0xpbWl0KHVzZXJHYXNMaW1pdD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF1c2VyR2FzTGltaXQpIHtcbiAgICAgIHJldHVybiA4MDAwMDA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zZXRHYXNMaW1pdCh1c2VyR2FzTGltaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSBmb3IgYSB3YWxsZXQgYWRkcmVzcyB2aWEgZXRoX2NhbGwgdG8gdGhlXG4gICAqIHRva2VuIGNvbnRyYWN0J3MgY29uZmlkZW50aWFsQmFsYW5jZU9mKGFkZHJlc3MpIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0QWRkcmVzcyAtIHRoZSB3YWxsZXQgY29udHJhY3QgYWRkcmVzcyB0byBxdWVyeSBiYWxhbmNlIGZvclxuICAgKiBAcGFyYW0gYXBpS2V5IC0gb3B0aW9uYWwgRXRoZXJzY2FuIEFQSSBrZXlcbiAgICogQHJldHVybnMgYnl0ZXMzMiBlbmNyeXB0ZWQgaGFuZGxlICgweC1wcmVmaXhlZCwgNjYgY2hhcnMpLlxuICAgKiAgIE5vdGU6IGhhbmRsZXMgYXJlIGFsd2F5cyBub24temVybyBldmVuIGZvciB6ZXJvIGJhbGFuY2VzIChlbmNyeXB0ZWQgZG9tYWluKS5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5Q29uZmlkZW50aWFsQmFsYW5jZSh3YWxsZXRBZGRyZXNzOiBzdHJpbmcsIGFwaUtleT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWV0aG9kU2lnbmF0dXJlID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5tZXRob2RJRCgnY29uZmlkZW50aWFsQmFsYW5jZU9mJywgWydhZGRyZXNzJ10pO1xuICAgIGNvbnN0IGVuY29kZWRBcmdzID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5yYXdFbmNvZGUoWydhZGRyZXNzJ10sIFt3YWxsZXRBZGRyZXNzXSk7XG4gICAgY29uc3QgY2FsbGRhdGEgPSBCdWZmZXIuY29uY2F0KFttZXRob2RTaWduYXR1cmUsIGVuY29kZWRBcmdzXSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KFxuICAgICAge1xuICAgICAgICBjaGFpbmlkOiB0aGlzLmdldENoYWluSWQoKS50b1N0cmluZygpLFxuICAgICAgICBtb2R1bGU6ICdwcm94eScsXG4gICAgICAgIGFjdGlvbjogJ2V0aF9jYWxsJyxcbiAgICAgICAgdG86IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgIGRhdGE6IGNhbGxkYXRhLFxuICAgICAgICB0YWc6ICdsYXRlc3QnLFxuICAgICAgfSxcbiAgICAgIGFwaUtleVxuICAgICk7XG5cbiAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IG9idGFpbiBjb25maWRlbnRpYWwgYmFsYW5jZSBmb3IgJHt3YWxsZXRBZGRyZXNzfSBmcm9tIHRva2VuICR7dGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZSA9IHJlc3VsdC5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIGlmICghaGFuZGxlLnN0YXJ0c1dpdGgoJzB4JykgfHwgaGFuZGxlLmxlbmd0aCAhPT0gNjYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjb25maWRlbnRpYWxCYWxhbmNlT2YgcmVzcG9uc2UgZm9ybWF0OiAke2hhbmRsZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG5vbi1CaXRHbyByZWNvdmVyeSB0cmFuc2FjdGlvbiBmb3IgRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2Vucy5cbiAgICpcbiAgICogVXNlcyB0aGUgbm8tcHJvb2YgaGFuZGxlIHN3ZWVwOiBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGhhbmRsZSkgd2l0aCAyIGFyZ3MuXG4gICAqIE5vIEZIRSBkZWNyeXB0aW9uIG9yIHByb29mIGdlbmVyYXRpb24gaXMgbmVlZGVkIOKAlCB0aGUgd2FsbGV0IHRyYW5zZmVycyBpdHMgZW50aXJlXG4gICAqIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSB3aXRob3V0IGtub3dpbmcgdGhlIHBsYWludGV4dCBhbW91bnQuXG4gICAqXG4gICAqIFRoZSBvdXRlciB0cmFuc2FjdGlvbiBzaGFwZSBpczpcbiAgICogICB0eC50byAgID0gd2FsbGV0Q29udHJhY3RBZGRyZXNzXG4gICAqICAgdHguZGF0YSA9IHNlbmRNdWx0aVNpZyh0b2tlbkNvbnRyYWN0QWRkciwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjb3ZlcnlEZXN0LCBoYW5kbGUpLCAuLi4pXG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3Zlck9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IE9mZmxpbmVWYXVsdFR4SW5mbz4ge1xuICAgIGlmIChwYXJhbXMuaXNUc3MgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRVJDLTc5ODQgVFNTIHJlY292ZXJ5IGlzIG5vdCB5ZXQgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0Q29udHJhY3RBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0tyc1JlY292ZXJ5ID0gZ2V0SXNLcnNSZWNvdmVyeShwYXJhbXMpO1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIGNoZWNrS3JzUHJvdmlkZXIodGhpcywgcGFyYW1zLmtyc1Byb3ZpZGVyLCB7IGNoZWNrQ29pbkZhbWlseVN1cHBvcnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGxldCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICBjb25zdCBnYXNQcmljZSA9IHBhcmFtcy5laXAxNTU5XG4gICAgICA/IG5ldyBvcHRpb25hbERlcHMuZXRoVXRpbC5CTihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpXG4gICAgICA6IG5ldyBvcHRpb25hbERlcHMuZXRoVXRpbC5CTih0aGlzLnNldEdhc1ByaWNlKHBhcmFtcy5nYXNQcmljZSkpO1xuICAgIGNvbnN0IGdhc0xpbWl0ID0gbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKHRoaXMuc2V0R2FzTGltaXQocGFyYW1zLmdhc0xpbWl0KSk7XG5cbiAgICBsZXQgdXNlclBydjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBpZiAoIXVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmICF1c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHVzZXJLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXksXG4gICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdXNlclBydiA9IHVzZXJLZXk7XG4gICAgfVxuXG4gICAgbGV0IGJhY2t1cEtleUFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgYmFja3VwU2lnbmluZ0tleTogQnVmZmVyO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkgfHwgaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCBiYWNrdXBIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGJhY2t1cEtleSk7XG4gICAgICBiYWNrdXBTaWduaW5nS2V5ID0gYmFja3VwSEROb2RlLnB1YmxpY0tleTtcbiAgICAgIGJhY2t1cEtleUFkZHJlc3MgPSBgMHgke29wdGlvbmFsRGVwcy5ldGhVdGlsLnB1YmxpY1RvQWRkcmVzcyhiYWNrdXBTaWduaW5nS2V5LCB0cnVlKS50b1N0cmluZygnaGV4Jyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGJhY2t1cFBydjogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmFja3VwUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2t1cEhETm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoYmFja3VwUHJ2KTtcbiAgICAgIGJhY2t1cFNpZ25pbmdLZXkgPSBiYWNrdXBIRE5vZGUucHJpdmF0ZUtleSBhcyBCdWZmZXI7XG4gICAgICBiYWNrdXBLZXlBZGRyZXNzID0gYDB4JHtvcHRpb25hbERlcHMuZXRoVXRpbC5wcml2YXRlVG9BZGRyZXNzKGJhY2t1cFNpZ25pbmdLZXkpLnRvU3RyaW5nKCdoZXgnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cEtleU5vbmNlID0gYXdhaXQgdGhpcy5nZXRBZGRyZXNzTm9uY2UoYmFja3VwS2V5QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlCYWxhbmNlID0gYXdhaXQgdGhpcy5xdWVyeUFkZHJlc3NCYWxhbmNlKGJhY2t1cEtleUFkZHJlc3MsIHBhcmFtcy5hcGlLZXkpO1xuICAgIGNvbnN0IHRvdGFsR2FzTmVlZGVkID0gZ2FzUHJpY2UubXVsKGdhc0xpbWl0KTtcbiAgICBjb25zdCB3ZWlUb0d3ZWkgPSAxMCAqKiA5O1xuICAgIGlmIChiYWNrdXBLZXlCYWxhbmNlLmx0KHRvdGFsR2FzTmVlZGVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQmFja3VwIGtleSBhZGRyZXNzICR7YmFja3VwS2V5QWRkcmVzc30gaGFzIGJhbGFuY2UgJHsoYmFja3VwS2V5QmFsYW5jZSAvIHdlaVRvR3dlaSkudG9TdHJpbmcoKX0gR3dlaS5gICtcbiAgICAgICAgICBgVGhpcyBhZGRyZXNzIG11c3QgaGF2ZSBhIGJhbGFuY2Ugb2YgYXQgbGVhc3QgJHsodG90YWxHYXNOZWVkZWQgLyB3ZWlUb0d3ZWkpLnRvU3RyaW5nKCl9YCArXG4gICAgICAgICAgYCBHd2VpIHRvIHBlcmZvcm0gcmVjb3Zlcmllcy4gVHJ5IHNlbmRpbmcgc29tZSBFVEggdG8gdGhpcyBhZGRyZXNzIHRoZW4gcmV0cnkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSAoYXV0by1xdWVyeSBvciB1c2VyLXByb3ZpZGVkKVxuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBpZiAocGFyYW1zLmVuY3J5cHRlZEhhbmRsZSkge1xuICAgICAgZW5jcnlwdGVkSGFuZGxlID0gcGFyYW1zLmVuY3J5cHRlZEhhbmRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgZW5jcnlwdGVkSGFuZGxlID0gYXdhaXQgdGhpcy5xdWVyeUNvbmZpZGVudGlhbEJhbGFuY2UocGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogZW5jcnlwdGVkIGhhbmRsZXMgYXJlIGFsd2F5cyBub24temVybyBldmVuIGZvciB6ZXJvIGJhbGFuY2VzIChlbmNyeXB0ZWQgZG9tYWluKS5cbiAgICAvLyBUaGUgdHJhbnNmZXIgd2lsbCBleGVjdXRlIGJ1dCBtb3ZlIDAgdG9rZW5zIGlmIHRoZSB3YWxsZXQgaXMgZW1wdHkuXG5cbiAgICAvLyBCdWlsZCB0aGUgaW5uZXIgY2FsbGRhdGE6IGNvbmZpZGVudGlhbFRyYW5zZmVyKHJlY292ZXJ5RGVzdGluYXRpb24sIGhhbmRsZSlcbiAgICBjb25zdCBpbm5lckNhbGxkYXRhID0gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGVuY3J5cHRlZEhhbmRsZSk7XG5cbiAgICAvLyBGb3Igc2VuZE11bHRpU2lnOiByZWNpcGllbnQgaXMgdGhlIHRva2VuIGNvbnRyYWN0LCBhbW91bnQgaXMgMCwgZGF0YSBjYXJyaWVzIHRoZSBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsZGF0YVxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICBkYXRhOiBvcHRpb25hbERlcHMuZXRoVXRpbC5zdHJpcEhleFByZWZpeChpbm5lckNhbGxkYXRhKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICBjb25zdCBzZXF1ZW5jZUlkID0gYXdhaXQgdGhpcy5xdWVyeVNlcXVlbmNlSWQocGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG5cbiAgICBsZXQgb3BlcmF0aW9uSGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzaWduYXR1cmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgb3BlcmF0aW9uSGFzaCA9IHRoaXMuZ2V0T3BlcmF0aW9uU2hhM0ZvckV4ZWN1dGVBbmRDb25maXJtKHJlY2lwaWVudHMsIHRoaXMuZ2V0RGVmYXVsdEV4cGlyZVRpbWUoKSwgc2VxdWVuY2VJZCk7XG4gICAgICBzaWduYXR1cmUgPSBVdGlsLmV0aFNpZ25Nc2dIYXNoKG9wZXJhdGlvbkhhc2gsIFV0aWwueHBydlRvRXRoUHJpdmF0ZUtleSh1c2VyUHJ2ISkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBVdGlsLmVjUmVjb3ZlckV0aEFkZHJlc3Mob3BlcmF0aW9uSGFzaCwgc2lnbmF0dXJlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHR4SW5mbyA9IHtcbiAgICAgIHJlY2lwaWVudDogcmVjaXBpZW50c1swXSxcbiAgICAgIGV4cGlyZVRpbWU6IHRoaXMuZ2V0RGVmYXVsdEV4cGlyZVRpbWUoKSxcbiAgICAgIGNvbnRyYWN0U2VxdWVuY2VJZDogc2VxdWVuY2VJZCxcbiAgICAgIG9wZXJhdGlvbkhhc2g6IG9wZXJhdGlvbkhhc2gsXG4gICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSA/PyAnJyxcbiAgICAgIGdhc0xpbWl0OiBnYXNMaW1pdC50b1N0cmluZygxMCksXG4gICAgfTtcblxuICAgIGNvbnN0IHNlbmRNZXRob2RBcmdzID0gdGhpcy5nZXRTZW5kTWV0aG9kQXJncyh0eEluZm8pO1xuICAgIGNvbnN0IG1ldGhvZFNpZ25hdHVyZSA9IG9wdGlvbmFsRGVwcy5ldGhBYmkubWV0aG9kSUQodGhpcy5zZW5kTWV0aG9kTmFtZSwgXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJykpO1xuICAgIGNvbnN0IGVuY29kZWRBcmdzID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5yYXdFbmNvZGUoXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJyksIF8ubWFwKHNlbmRNZXRob2RBcmdzLCAndmFsdWUnKSk7XG4gICAgY29uc3Qgc2VuZERhdGEgPSBCdWZmZXIuY29uY2F0KFttZXRob2RTaWduYXR1cmUsIGVuY29kZWRBcmdzXSk7XG5cbiAgICBsZXQgdHggPSBFdGguYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICB0bzogcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgIG5vbmNlOiBiYWNrdXBLZXlOb25jZSxcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLFxuICAgICAgZ2FzTGltaXQ6IGdhc0xpbWl0LFxuICAgICAgZGF0YTogc2VuZERhdGEsXG4gICAgICBlaXAxNTU5OiBwYXJhbXMuZWlwMTU1OSxcbiAgICAgIHJlcGxheVByb3RlY3Rpb25PcHRpb25zOiBwYXJhbXMucmVwbGF5UHJvdGVjdGlvbk9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRGb3JPZmZsaW5lVmF1bHQoXG4gICAgICAgIHR4SW5mbyxcbiAgICAgICAgdHgsXG4gICAgICAgIHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgZ2FzUHJpY2UsXG4gICAgICAgIGdhc0xpbWl0LFxuICAgICAgICBwYXJhbXMuZWlwMTU1OSxcbiAgICAgICAgcGFyYW1zLnJlcGxheVByb3RlY3Rpb25PcHRpb25zLFxuICAgICAgICBwYXJhbXMuYXBpS2V5XG4gICAgICApIGFzIGFueTtcbiAgICB9XG5cbiAgICBpZiAoIWlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHR4ID0gdHguc2lnbihiYWNrdXBTaWduaW5nS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRUeDogUmVjb3ZlcnlJbmZvID0ge1xuICAgICAgaWQ6IG9wdGlvbmFsRGVwcy5ldGhVdGlsLmJ1ZmZlclRvSGV4KHR4Lmhhc2goKSksXG4gICAgICB0eDogdHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHguYmFja3VwS2V5ID0gYmFja3VwS2V5O1xuICAgICAgc2lnbmVkVHguY29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmVkVHg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBmb3IgY29uc3RydWN0aW5nIFphbWEgQUNMIGRlY3J5cHRpb25cbiAgICogZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIFRoZSBidWlsZGVyIHByb2R1Y2VzIGEgRGVjcnlwdGlvbkRlbGVnYXRpb25UeFJlcXVlc3Qge3RvLCBkYXRhLCB2YWx1ZX0gdGhhdCBpc1xuICAgKiB3YWxsZXQtdHlwZS1hZ25vc3RpYyDigJQgV1Agcm91dGVzIGl0IHRvIHRoZSBjb3JyZWN0IHNpZ25pbmcgcGF0aDpcbiAgICogLSBNUEM6IHN1Ym1pdCBhcyBhIHJhdyBUU1MgdHJhbnNhY3Rpb25cbiAgICogLSBNdWx0aXNpZzogd3JhcCBpbiBzZW5kTXVsdGlTaWcod2FsbGV0Q29udHJhY3QsIHRvLCAwLCBkYXRhLCAuLi4pXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqICAgY29uc3QgcmVxID0gY29pbi5nZXREZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKS5idWlsZCh7XG4gICAqICAgICBhY2xDb250cmFjdEFkZHJlc3M6ICcweGYwRmYuLi4nLFxuICAgKiAgICAgZGVsZWdhdGVBZGRyZXNzOiAgICBlbnRlcnByaXNlVmlld2luZ0tleSxcbiAgICogICAgIHRva2VuQ29udHJhY3RBZGRyZXNzZXM6IFt0b2tlbkFkZHJlc3NdLFxuICAgKiAgICAgZXhwaXJ5VGltZXN0YW1wOiAgICBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDM2NSAqIDg2NDAwLFxuICAgKiAgIH0pO1xuICAgKi9cbiAgZ2V0RGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCk6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKTtcbiAgfVxufVxuIl19