@bitgo-beta/sdk-coin-dot 1.3.3-alpha.477 → 1.3.3-alpha.478

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.
@@ -1 +1 @@
1
- {"version":3,"file":"wasmParser.d.ts","sourceRoot":"","sources":["../../../src/lib/wasmParser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAA8B,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAmBpG;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,kBAAkB,CAgC7F;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAsCnE"}
1
+ {"version":3,"file":"wasmParser.d.ts","sourceRoot":"","sources":["../../../src/lib/wasmParser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAA8B,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAsBpG;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,kBAAkB,CAiC7F;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAsCnE"}
@@ -22,6 +22,8 @@ const MAX_NESTING_DEPTH = 10;
22
22
  * went to staking". Same constant used by the legacy account-lib Transaction class.
23
23
  */
24
24
  const STAKING_DESTINATION = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM';
25
+ /** Sentinel for transferAll: the actual amount is determined on-chain. */
26
+ const ALL = 'ALL';
25
27
  // =============================================================================
26
28
  // Main exports
27
29
  // =============================================================================
@@ -34,25 +36,26 @@ const STAKING_DESTINATION = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM';
34
36
  function explainDotTransaction(params) {
35
37
  const explained = buildExplanation(params);
36
38
  const sender = explained.sender || params.senderAddress || '';
37
- const type = mapTransactionType(explained.typeName);
38
39
  const methodName = `${explained.method.pallet}.${explained.method.name}`;
40
+ // Convert bigint to string at the serialization boundary
39
41
  const outputs = explained.outputs.map((o) => ({
40
42
  address: o.address,
41
- amount: o.amount === 'ALL' ? '0' : o.amount,
43
+ amount: o.amount === ALL ? '0' : String(o.amount),
42
44
  }));
43
45
  const inputs = explained.inputs.map((i) => {
44
- const value = i.value === 'ALL' ? 0 : parseInt(i.value || '0', 10);
45
- return { address: i.address, value, valueString: i.value };
46
+ const valueStr = i.value === ALL ? ALL : String(i.value);
47
+ const value = i.value === ALL ? 0 : Number(i.value);
48
+ return { address: i.address, value, valueString: valueStr };
46
49
  });
47
50
  return {
48
51
  displayOrder: ['outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type', 'sequenceId', 'id'],
49
52
  id: explained.id || '',
50
53
  outputs,
51
- outputAmount: explained.outputAmount,
54
+ outputAmount: String(explained.outputAmount),
52
55
  changeOutputs: [],
53
56
  changeAmount: '0',
54
- fee: { fee: explained.tip || '0', type: 'tip' },
55
- type,
57
+ fee: { fee: explained.tip ? String(explained.tip) : '0', type: 'tip' },
58
+ type: explained.type,
56
59
  sender,
57
60
  nonce: explained.nonce,
58
61
  isSigned: explained.isSigned,
@@ -69,7 +72,7 @@ function explainDotTransaction(params) {
69
72
  */
70
73
  function toJsonFromWasm(params) {
71
74
  const explained = buildExplanation(params);
72
- const type = mapTransactionType(explained.typeName);
75
+ const type = explained.type;
73
76
  const method = explained.method;
74
77
  const args = method.args;
75
78
  const result = {
@@ -109,7 +112,6 @@ function toJsonFromWasm(params) {
109
112
  }
110
113
  return result;
111
114
  }
112
- /** Parse and explain a DOT transaction. Replaces the old wasm-dot explainTransaction. */
113
115
  function buildExplanation(params) {
114
116
  const tx = wasm_dot_1.DotTransaction.fromHex(params.txHex, params.material);
115
117
  const context = {
@@ -119,182 +121,149 @@ function buildExplanation(params) {
119
121
  blockNumber: params.blockNumber,
120
122
  };
121
123
  const parsed = (0, wasm_dot_1.parseTransaction)(tx, context);
122
- const typeName = deriveTransactionType(parsed.method, 0);
123
124
  const sender = parsed.sender ?? params.senderAddress;
124
- // Check for batch patterns that need proxy deposit cost handling
125
- const batchInfo = detectProxyBatch(parsed.method);
126
- let outputs;
127
- let inputs;
128
- if (batchInfo && sender) {
129
- const proxyDepositCost = (0, wasm_dot_1.getProxyDepositCost)(params.material.metadata).toString();
130
- if (batchInfo.type === 'unstake') {
131
- // Unstaking batch (removeProxy + chill + unbond): proxy deposit refund flows
132
- // from proxy address back to sender. The unbond amount is NOT in inputs/outputs.
133
- outputs = [{ address: sender, amount: proxyDepositCost }];
134
- inputs = [{ address: batchInfo.proxyAddress, value: proxyDepositCost }];
135
- }
136
- else {
137
- // Staking batch (bond + addProxy): bond amount to staking destination + proxy deposit cost
138
- const bondAmount = extractBondAmount(parsed.method);
139
- outputs = [
140
- { address: STAKING_DESTINATION, amount: bondAmount },
141
- { address: batchInfo.proxyAddress, amount: proxyDepositCost },
142
- ];
143
- inputs = outputs.map((o) => ({ address: sender, value: o.amount }));
144
- }
145
- }
146
- else {
147
- outputs = extractOutputs(parsed.method, 0);
148
- inputs = sender ? outputs.map((o) => ({ address: sender, value: o.amount })) : [];
149
- }
150
- const outputAmount = outputs.reduce((sum, o) => {
151
- if (o.amount === 'ALL')
125
+ const analysis = analyzeMethod(parsed.method, sender, params.material.metadata);
126
+ // Use explicit inputs from analysis if provided (e.g., unstake batch where
127
+ // the input source is the proxy address, not the sender). Otherwise, mirror
128
+ // outputs with sender as the default input source.
129
+ const inputs = analysis.inputs ?? (sender ? analysis.outputs.map((o) => ({ address: sender, value: o.amount })) : []);
130
+ const outputAmount = analysis.outputs.reduce((sum, o) => {
131
+ if (o.amount === ALL)
152
132
  return sum;
153
- return (BigInt(sum) + BigInt(o.amount)).toString();
154
- }, '0');
133
+ return sum + o.amount;
134
+ }, 0n);
155
135
  return {
156
- typeName,
136
+ type: analysis.type,
157
137
  id: parsed.id ?? undefined,
158
138
  sender: parsed.sender ?? undefined,
159
- outputs,
139
+ outputs: analysis.outputs,
160
140
  inputs,
161
141
  outputAmount,
162
- tip: parsed.tip,
142
+ tip: BigInt(parsed.tip || '0'),
163
143
  era: parsed.era,
164
144
  method: parsed.method,
165
145
  isSigned: parsed.isSigned,
166
146
  nonce: parsed.nonce,
167
147
  };
168
148
  }
169
- // =============================================================================
170
- // Transaction type derivation (moved from @bitgo/wasm-dot)
171
- // =============================================================================
172
- function deriveTransactionType(method, depth) {
149
+ /**
150
+ * Analyze a parsed method to determine its transaction type and extract outputs.
151
+ *
152
+ * This is a single switch that handles both concerns together, preventing them
153
+ * from getting out of sync. Every case that sets a type also sets the outputs
154
+ * for that type.
155
+ */
156
+ function analyzeMethod(method, senderAddress, metadataHex) {
157
+ return analyzeMethodInner(method, senderAddress, metadataHex, 0);
158
+ }
159
+ function analyzeMethodInner(method, senderAddress, metadataHex, depth) {
173
160
  const key = `${method.pallet}.${method.name}`;
174
161
  const args = (method.args ?? {});
175
162
  switch (key) {
163
+ // --- Transfers ---
176
164
  case 'balances.transfer':
177
165
  case 'balances.transferKeepAlive':
178
166
  case 'balances.transferAllowDeath':
167
+ return {
168
+ type: sdk_core_1.TransactionType.Send,
169
+ outputs: [{ address: String(args.dest ?? ''), amount: BigInt(args.value ?? '0') }],
170
+ };
179
171
  case 'balances.transferAll':
180
- return 'Send';
172
+ return {
173
+ type: sdk_core_1.TransactionType.Send,
174
+ outputs: [{ address: String(args.dest ?? ''), amount: ALL }],
175
+ };
176
+ // --- Staking ---
181
177
  case 'staking.bond':
182
178
  case 'staking.bondExtra':
183
- return 'StakingActivate';
179
+ return {
180
+ type: sdk_core_1.TransactionType.StakingActivate,
181
+ outputs: [{ address: STAKING_DESTINATION, amount: BigInt(args.value ?? '0') }],
182
+ };
184
183
  case 'staking.unbond':
185
- return 'StakingUnlock';
184
+ // Empty outputs: unbond unlocks DOT (no external spend). Matches legacy Transaction class
185
+ // behavior where decodeInputsAndOutputsForUnbond() returns []. Bond/bondExtra keep the
186
+ // sentinel because they represent actual balance locks visible to policy evaluation.
187
+ return { type: sdk_core_1.TransactionType.StakingUnlock, outputs: [] };
186
188
  case 'staking.withdrawUnbonded':
187
- return 'StakingWithdraw';
189
+ return { type: sdk_core_1.TransactionType.StakingWithdraw, outputs: [] };
188
190
  case 'staking.chill':
189
- return 'StakingUnvote';
191
+ return { type: sdk_core_1.TransactionType.StakingUnvote, outputs: [] };
190
192
  case 'staking.payoutStakers':
191
- return 'StakingClaim';
193
+ return { type: sdk_core_1.TransactionType.StakingClaim, outputs: [] };
194
+ // --- Proxy ---
192
195
  case 'proxy.addProxy':
193
196
  case 'proxy.removeProxy':
194
197
  case 'proxy.createPure':
195
- return 'AddressInitialization';
196
- case 'utility.batch':
197
- case 'utility.batchAll':
198
- return 'Batch';
198
+ return { type: sdk_core_1.TransactionType.AddressInitialization, outputs: [] };
199
+ // --- Proxy-wrapped call ---
199
200
  case 'proxy.proxy': {
200
201
  if (depth >= MAX_NESTING_DEPTH)
201
- return 'Unknown';
202
+ return { type: sdk_core_1.TransactionType.Send, outputs: [] };
202
203
  const call = args.call;
203
204
  if (call?.pallet && call?.name)
204
- return deriveTransactionType(call, depth + 1);
205
- return 'Unknown';
205
+ return analyzeMethodInner(call, senderAddress, metadataHex, depth + 1);
206
+ return { type: sdk_core_1.TransactionType.Send, outputs: [] };
206
207
  }
207
- default:
208
- return 'Unknown';
209
- }
210
- }
211
- // =============================================================================
212
- // Output extraction (moved from @bitgo/wasm-dot)
213
- // =============================================================================
214
- function extractOutputs(method, depth) {
215
- const args = (method.args ?? {});
216
- const key = `${method.pallet}.${method.name}`;
217
- switch (key) {
218
- case 'balances.transfer':
219
- case 'balances.transferKeepAlive':
220
- case 'balances.transferAllowDeath':
221
- return [{ address: String(args.dest ?? ''), amount: String(args.value ?? '0') }];
222
- case 'balances.transferAll':
223
- return [{ address: String(args.dest ?? ''), amount: 'ALL' }];
224
- case 'staking.bond':
225
- case 'staking.bondExtra':
226
- case 'staking.unbond':
227
- return [{ address: STAKING_DESTINATION, amount: String(args.value ?? '0') }];
208
+ // --- Batch ---
228
209
  case 'utility.batch':
229
- case 'utility.batchAll': {
230
- if (depth >= MAX_NESTING_DEPTH)
231
- return [];
232
- const calls = (args.calls ?? []);
233
- return calls.filter((c) => c?.pallet && c?.name).flatMap((c) => extractOutputs(c, depth + 1));
234
- }
235
- case 'proxy.proxy': {
236
- if (depth >= MAX_NESTING_DEPTH)
237
- return [];
238
- const call = args.call;
239
- return call?.pallet && call?.name ? extractOutputs(call, depth + 1) : [];
240
- }
210
+ case 'utility.batchAll':
211
+ return analyzeBatch(args, senderAddress, metadataHex, depth);
241
212
  default:
242
- return [];
213
+ return { type: sdk_core_1.TransactionType.Send, outputs: [] };
243
214
  }
244
215
  }
245
- // =============================================================================
246
- // Batch helpers
247
- // =============================================================================
248
- /** Extract bond amount from a batch method containing a staking.bond call */
249
- function extractBondAmount(method) {
250
- const calls = (method.args ?? {}).calls;
251
- const bondCall = calls?.find((c) => `${c.pallet}.${c.name}` === 'staking.bond');
252
- if (!bondCall)
253
- return '0';
254
- const args = (bondCall.args ?? {});
255
- return String(args.value ?? '0');
256
- }
257
216
  /**
258
- * Detect batch transactions involving proxy operations (stake/unstake batches).
259
- *
260
- * Legacy account-lib reports proxy deposit cost (ProxyDepositBase + ProxyDepositFactor)
261
- * as the value for these batches instead of the bond/unbond amount.
217
+ * Analyze a batch transaction.
262
218
  *
263
- * Unstaking batch: removeProxy + chill + unbond
264
- * Staking batch: bond + addProxy
219
+ * Detects known proxy batch patterns (stake: bond+addProxy, unstake:
220
+ * removeProxy+chill+unbond) and handles proxy deposit cost. For unrecognized
221
+ * batch patterns, recursively extracts outputs from each inner call.
265
222
  */
266
- function detectProxyBatch(method) {
267
- const key = `${method.pallet}.${method.name}`;
268
- if (key !== 'utility.batch' && key !== 'utility.batchAll')
269
- return undefined;
270
- const calls = (method.args ?? {}).calls;
271
- if (!calls || calls.length === 0)
272
- return undefined;
223
+ function analyzeBatch(args, senderAddress, metadataHex, depth) {
224
+ const calls = (args.calls ?? []);
225
+ if (calls.length === 0)
226
+ return { type: sdk_core_1.TransactionType.Batch, outputs: [] };
273
227
  const callKeys = calls.map((c) => `${c.pallet}.${c.name}`);
228
+ // Staking batch: bond + addProxy (2 calls)
229
+ if (calls.length === 2 && callKeys[0] === 'staking.bond' && callKeys[1] === 'proxy.addProxy') {
230
+ const bondArgs = (calls[0].args ?? {});
231
+ const addProxyArgs = (calls[1].args ?? {});
232
+ const bondAmount = BigInt(bondArgs.value ?? '0');
233
+ const proxyAddress = String(addProxyArgs.delegate ?? '');
234
+ const proxyDepositCost = metadataHex ? (0, wasm_dot_1.getProxyDepositCost)(metadataHex) : 0n;
235
+ return {
236
+ type: sdk_core_1.TransactionType.Batch,
237
+ outputs: [
238
+ { address: STAKING_DESTINATION, amount: bondAmount },
239
+ { address: proxyAddress, amount: proxyDepositCost },
240
+ ],
241
+ };
242
+ }
274
243
  // Unstaking batch: removeProxy + chill + unbond (3 calls)
244
+ // Input source is the proxy address (deposit refund), not the sender.
275
245
  if (calls.length === 3 &&
276
246
  callKeys[0] === 'proxy.removeProxy' &&
277
247
  callKeys[1] === 'staking.chill' &&
278
248
  callKeys[2] === 'staking.unbond') {
279
249
  const removeProxyArgs = (calls[0].args ?? {});
280
250
  const proxyAddress = String(removeProxyArgs.delegate ?? '');
281
- return { type: 'unstake', proxyAddress };
251
+ const proxyDepositCost = metadataHex ? (0, wasm_dot_1.getProxyDepositCost)(metadataHex) : 0n;
252
+ const outputs = senderAddress ? [{ address: senderAddress, amount: proxyDepositCost }] : [];
253
+ const inputs = [{ address: proxyAddress, value: proxyDepositCost }];
254
+ return { type: sdk_core_1.TransactionType.Batch, outputs, inputs };
282
255
  }
283
- // Staking batch: bond + addProxy (2 calls)
284
- if (calls.length === 2 && callKeys[0] === 'staking.bond' && callKeys[1] === 'proxy.addProxy') {
285
- const addProxyArgs = (calls[1].args ?? {});
286
- const proxyAddress = String(addProxyArgs.delegate ?? '');
287
- return { type: 'stake', proxyAddress };
288
- }
289
- return undefined;
256
+ // Generic batch: recursively extract outputs from each inner call
257
+ if (depth >= MAX_NESTING_DEPTH)
258
+ return { type: sdk_core_1.TransactionType.Batch, outputs: [] };
259
+ const outputs = calls
260
+ .filter((c) => c?.pallet && c?.name)
261
+ .flatMap((c) => analyzeMethodInner(c, senderAddress, metadataHex, depth + 1).outputs);
262
+ return { type: sdk_core_1.TransactionType.Batch, outputs };
290
263
  }
291
264
  // =============================================================================
292
265
  // Helpers
293
266
  // =============================================================================
294
- /** Map type name string to sdk-core TransactionType via name lookup */
295
- function mapTransactionType(typeName) {
296
- return sdk_core_1.TransactionType[typeName] ?? sdk_core_1.TransactionType.Send;
297
- }
298
267
  function populateSendFields(result, method, args) {
299
268
  const key = `${method.pallet}.${method.name}`;
300
269
  if (key === 'proxy.proxy') {
@@ -355,15 +324,15 @@ function transformBatchCallArgs(args) {
355
324
  const result = {};
356
325
  for (const [key, value] of Object.entries(args)) {
357
326
  if (key === 'delegate' && typeof value === 'string') {
358
- // MultiAddress Id variant: string { id: string }
327
+ // MultiAddress Id variant: string -> { id: string }
359
328
  result[key] = { id: value };
360
329
  }
361
330
  else if (key === 'value' && typeof value === 'string') {
362
- // Compact u128: string number (matches Polkadot.js behavior)
331
+ // Compact u128: string -> number (matches Polkadot.js behavior)
363
332
  result[key] = Number(value);
364
333
  }
365
334
  else if (key === 'payee' && typeof value === 'string') {
366
- // Enum unit variant: "Staked" { staked: null }
335
+ // Enum unit variant: "Staked" -> { staked: null }
367
336
  const variantName = value.charAt(0).toLowerCase() + value.slice(1);
368
337
  result[key] = { [variantName]: null };
369
338
  }
@@ -373,4 +342,4 @@ function transformBatchCallArgs(args) {
373
342
  }
374
343
  return result;
375
344
  }
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvd2FzbVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOztBQXNFSCxzREFnQ0M7QUFTRCx3Q0FzQ0M7QUFuSkQsbURBQXVEO0FBQ3ZELDhDQUFxSDtBQUdySCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUU3Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsa0RBQWtELENBQUM7QUEyQy9FLGdGQUFnRjtBQUNoRixlQUFlO0FBQ2YsZ0ZBQWdGO0FBRWhGOzs7OztHQUtHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsTUFBbUM7SUFDdkUsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsTUFBTSxVQUFVLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRXpFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztRQUNsQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07S0FDNUMsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLE1BQU0sR0FBZSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFD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QUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXQVNNLWJhc2VkIERPVCB0cmFuc2FjdGlvbiBleHBsYW5hdGlvbi5cbiAqXG4gKiBCdWlsdCBvbiBAYml0Z28vd2FzbS1kb3QncyBwYXJzZVRyYW5zYWN0aW9uKCkuIERlcml2ZXMgdHJhbnNhY3Rpb24gdHlwZXMsXG4gKiBleHRyYWN0cyBvdXRwdXRzL2lucHV0cywgYW5kIG1hcHMgdG8gQml0R29KUyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGZvcm1hdC5cbiAqIFRoaXMgaXMgQml0R28tc3BlY2lmaWMgYnVzaW5lc3MgbG9naWMgdGhhdCBsaXZlcyBvdXRzaWRlIHRoZSB3YXNtIHBhY2thZ2UuXG4gKi9cblxuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRG90VHJhbnNhY3Rpb24sIHBhcnNlVHJhbnNhY3Rpb24sIGdldFByb3h5RGVwb3NpdENvc3QsIHR5cGUgUGFyc2VkTWV0aG9kLCB0eXBlIEVyYSB9IGZyb20gJ0BiaXRnby93YXNtLWRvdCc7XG5pbXBvcnQgdHlwZSB7IEJhdGNoQ2FsbE9iamVjdCwgUHJveHlUeXBlLCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBNYXRlcmlhbCwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5cbmNvbnN0IE1BWF9ORVNUSU5HX0RFUFRIID0gMTA7XG5cbi8qKlxuICogRGlzcGxheS1vbmx5IHNlbnRpbmVsIGFkZHJlc3MgZm9yIHN0YWtpbmcgb3V0cHV0cyAoYm9uZCwgYm9uZEV4dHJhLCB1bmJvbmQpLlxuICpcbiAqIFN0YWtpbmcgZXh0cmluc2ljcyBkb24ndCB0cmFuc2ZlciBmdW5kcyB0byBhbiBleHRlcm5hbCBhZGRyZXNzLiBUaGUgYm9uZGVkIERPVFxuICogc3RheXMgaW4gdGhlIHNlbmRlcidzIGFjY291bnQgYXMgXCJib25kZWQgYmFsYW5jZVwiLiBCdXQgdGhlIGV4cGxhbmF0aW9uIGZvcm1hdFxuICogcmVxdWlyZXMgYW4gb3V0cHV0IGFkZHJlc3MsIHNvIHdlIHVzZSB0aGlzIG51bGwgYWRkcmVzcyAoU1M1OCBlbmNvZGluZyBvZiAzMlxuICogemVybyBieXRlcywgc3Vic3RyYXRlIGdlbmVyaWMgcHJlZml4IDQyKSBhcyBhIHBsYWNlaG9sZGVyIG1lYW5pbmcgXCJ0aGlzIGFtb3VudFxuICogd2VudCB0byBzdGFraW5nXCIuIFNhbWUgY29uc3RhbnQgdXNlZCBieSB0aGUgbGVnYWN5IGFjY291bnQtbGliIFRyYW5zYWN0aW9uIGNsYXNzLlxuICovXG5jb25zdCBTVEFLSU5HX0RFU1RJTkFUSU9OID0gJzVDNGhyZmp3OURqWFpUelYzTXd6cnJBcjlQMU1KaFNydldHV3FpMWVTdXlVcG5oTSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQdWJsaWMgdHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogSW5wdXQgZW50cnkgZm9yIGEgRE9UIHRyYW5zYWN0aW9uLlxuICogRm9yIGFjY291bnQtbW9kZWwgY2hhaW5zLCB0aGVyZSdzIHR5cGljYWxseSBvbmUgaW5wdXQgKHRoZSBzZW5kZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvdElucHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICB2YWx1ZVN0cmluZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIGV4cGxhbmF0aW9uIHJldHVybmVkIGJ5IFdBU00tYmFzZWQgcGFyc2luZy5cbiAqIEluY2x1ZGVzIGZpZWxkcyBuZWVkZWQgYnkgd2FsbGV0LXBsYXRmb3JtIHRoYXQgYXJlbid0IGluIHRoZSBiYXNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG90V2FzbUV4cGxhbmF0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gIHNlbmRlcjogc3RyaW5nO1xuICBub25jZTogbnVtYmVyO1xuICBpc1NpZ25lZDogYm9vbGVhbjtcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBpbnB1dHM6IERvdElucHV0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpbkRvdFRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBzZW5kZXJBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvSnNvbkZyb21XYXNtUGFyYW1zIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBzZW5kZXJBZGRyZXNzOiBzdHJpbmc7XG4gIGNvaW5Db25maWdOYW1lOiBzdHJpbmc7XG4gIHJlZmVyZW5jZUJsb2NrPzogc3RyaW5nO1xuICBibG9ja051bWJlcj86IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1haW4gZXhwb3J0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFeHBsYWluIGEgRE9UIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBXQVNNIHBhcnNlci5cbiAqXG4gKiBQYXJzZXMgdGhlIHRyYW5zYWN0aW9uIHZpYSBXQVNNLCBkZXJpdmVzIHRoZSB0cmFuc2FjdGlvbiB0eXBlIGFuZFxuICogb3V0cHV0cyBsb2NhbGx5LCB0aGVuIG1hcHMgdG8gQml0R29KUyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Eb3RUcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5Eb3RUcmFuc2FjdGlvblBhcmFtcyk6IERvdFdhc21FeHBsYW5hdGlvbiB7XG4gIGNvbnN0IGV4cGxhaW5lZCA9IGJ1aWxkRXhwbGFuYXRpb24ocGFyYW1zKTtcblxuICBjb25zdCBzZW5kZXIgPSBleHBsYWluZWQuc2VuZGVyIHx8IHBhcmFtcy5zZW5kZXJBZGRyZXNzIHx8ICcnO1xuICBjb25zdCB0eXBlID0gbWFwVHJhbnNhY3Rpb25UeXBlKGV4cGxhaW5lZC50eXBlTmFtZSk7XG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBgJHtleHBsYWluZWQubWV0aG9kLnBhbGxldH0uJHtleHBsYWluZWQubWV0aG9kLm5hbWV9YDtcblxuICBjb25zdCBvdXRwdXRzID0gZXhwbGFpbmVkLm91dHB1dHMubWFwKChvKSA9PiAoe1xuICAgIGFkZHJlc3M6IG8uYWRkcmVzcyxcbiAgICBhbW91bnQ6IG8uYW1vdW50ID09PSAnQUxMJyA/ICcwJyA6IG8uYW1vdW50LFxuICB9KSk7XG5cbiAgY29uc3QgaW5wdXRzOiBEb3RJbnB1dFtdID0gZXhwbGFpbmVkLmlucHV0cy5tYXAoKGkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGkudmFsdWUgPT09ICdBTEwnID8gMCA6IHBhcnNlSW50KGkudmFsdWUgfHwgJzAnLCAxMCk7XG4gICAgcmV0dXJuIHsgYWRkcmVzczogaS5hZGRyZXNzLCB2YWx1ZSwgdmFsdWVTdHJpbmc6IGkudmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwbGF5T3JkZXI6IFsnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnLCAnc2VxdWVuY2VJZCcsICdpZCddLFxuICAgIGlkOiBleHBsYWluZWQuaWQgfHwgJycsXG4gICAgb3V0cHV0cyxcbiAgICBvdXRwdXRBbW91bnQ6IGV4cGxhaW5lZC5vdXRwdXRBbW91bnQsXG4gICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgZmVlOiB7IGZlZTogZXhwbGFpbmVkLnRpcCB8fCAnMCcsIHR5cGU6ICd0aXAnIH0sXG4gICAgdHlwZSxcbiAgICBzZW5kZXIsXG4gICAgbm9uY2U6IGV4cGxhaW5lZC5ub25jZSxcbiAgICBpc1NpZ25lZDogZXhwbGFpbmVkLmlzU2lnbmVkLFxuICAgIG1ldGhvZE5hbWUsXG4gICAgaW5wdXRzLFxuICB9O1xufVxuXG4vKipcbiAqIFByb2R1Y2UgYSBUeERhdGEgb2JqZWN0IHVzaW5nIFdBU00gcGFyc2luZyBpbnN0ZWFkIG9mIHRoZSBKUyB0eHdyYXBwZXIuXG4gKlxuICogVGhpcyByZXBsYWNlcyB0aGUgbGVnYWN5IGB0b0pzb24oKWAgcGF0aCBmb3IgY2hhaW5zIHdoZXJlIFdBU00gcGFyc2luZyBpcyBlbmFibGVkLlxuICogVGhlIFdBU00gcGFyc2VyIGRlY29kZXMgdGhlIGV4dHJpbnNpYyBieXRlcyAod2l0aCBtZXRhZGF0YS1hd2FyZSBzaWduZWQgZXh0ZW5zaW9uIGhhbmRsaW5nKSxcbiAqIGFuZCB0aGlzIGZ1bmN0aW9uIG1hcHMgdGhlIHJlc3VsdCB0byB0aGUgVHhEYXRhIGludGVyZmFjZSB0aGF0IGNvbnN1bWVycyBleHBlY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25Gcm9tV2FzbShwYXJhbXM6IFRvSnNvbkZyb21XYXNtUGFyYW1zKTogVHhEYXRhIHtcbiAgY29uc3QgZXhwbGFpbmVkID0gYnVpbGRFeHBsYW5hdGlvbihwYXJhbXMpO1xuICBjb25zdCB0eXBlID0gbWFwVHJhbnNhY3Rpb25UeXBlKGV4cGxhaW5lZC50eXBlTmFtZSk7XG4gIGNvbnN0IG1ldGhvZCA9IGV4cGxhaW5lZC5tZXRob2Q7XG4gIGNvbnN0IGFyZ3MgPSBtZXRob2QuYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb25zdCByZXN1bHQ6IFR4RGF0YSA9IHtcbiAgICBpZDogZXhwbGFpbmVkLmlkIHx8ICcnLFxuICAgIHNlbmRlcjogZXhwbGFpbmVkLnNlbmRlciB8fCBwYXJhbXMuc2VuZGVyQWRkcmVzcyxcbiAgICByZWZlcmVuY2VCbG9jazogcGFyYW1zLnJlZmVyZW5jZUJsb2NrIHx8ICcnLFxuICAgIGJsb2NrTnVtYmVyOiBwYXJhbXMuYmxvY2tOdW1iZXIgfHwgMCxcbiAgICBnZW5lc2lzSGFzaDogcGFyYW1zLm1hdGVyaWFsLmdlbmVzaXNIYXNoIHx8ICcnLFxuICAgIG5vbmNlOiBleHBsYWluZWQubm9uY2UsXG4gICAgc3BlY1ZlcnNpb246IHBhcmFtcy5tYXRlcmlhbC5zcGVjVmVyc2lvbiB8fCAwLFxuICAgIHRyYW5zYWN0aW9uVmVyc2lvbjogcGFyYW1zLm1hdGVyaWFsLnR4VmVyc2lvbiB8fCAwLFxuICAgIGNoYWluTmFtZTogcGFyYW1zLm1hdGVyaWFsLmNoYWluTmFtZSB8fCAnJyxcbiAgICB0aXA6IE51bWJlcihleHBsYWluZWQudGlwKSB8fCAwLFxuICAgIGVyYVBlcmlvZDogZXhwbGFpbmVkLmVyYS50eXBlID09PSAnbW9ydGFsJyA/IChleHBsYWluZWQuZXJhIGFzIHsgcGVyaW9kOiBudW1iZXIgfSkucGVyaW9kIDogMCxcbiAgfTtcblxuICBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICBwb3B1bGF0ZVNlbmRGaWVsZHMocmVzdWx0LCBtZXRob2QsIGFyZ3MpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpIHtcbiAgICBwb3B1bGF0ZVN0YWtpbmdBY3RpdmF0ZUZpZWxkcyhyZXN1bHQsIG1ldGhvZCwgYXJncywgcGFyYW1zLnNlbmRlckFkZHJlc3MpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrKSB7XG4gICAgcmVzdWx0LmFtb3VudCA9IFN0cmluZyhhcmdzLnZhbHVlID8/ICcnKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KSB7XG4gICAgcmVzdWx0Lm51bVNsYXNoaW5nU3BhbnMgPSBOdW1iZXIoYXJncy5udW1TbGFzaGluZ1NwYW5zID8/IDApO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQ2xhaW0pIHtcbiAgICByZXN1bHQudmFsaWRhdG9yU3Rhc2ggPSBTdHJpbmcoYXJncy52YWxpZGF0b3JTdGFzaCA/PyAnJyk7XG4gICAgcmVzdWx0LmNsYWltRXJhID0gU3RyaW5nKGFyZ3MuZXJhID8/ICcnKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uKSB7XG4gICAgcG9wdWxhdGVBZGRyZXNzSW5pdEZpZWxkcyhyZXN1bHQsIG1ldGhvZCwgYXJncyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkJhdGNoKSB7XG4gICAgcmVzdWx0LmJhdGNoQ2FsbHMgPSBtYXBCYXRjaENhbGxzKGFyZ3MuY2FsbHMgYXMgUGFyc2VkTWV0aG9kW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvcmUgZXhwbGFpbiBsb2dpYyAobW92ZWQgZnJvbSBAYml0Z28vd2FzbS1kb3QpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxFeHBsYWluZWQge1xuICB0eXBlTmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzZW5kZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgb3V0cHV0czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH1bXTtcbiAgaW5wdXRzOiB7IGFkZHJlc3M6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG4gIG91dHB1dEFtb3VudDogc3RyaW5nO1xuICB0aXA6IHN0cmluZztcbiAgZXJhOiBFcmE7XG4gIG1ldGhvZDogUGFyc2VkTWV0aG9kO1xuICBpc1NpZ25lZDogYm9vbGVhbjtcbiAgbm9uY2U6IG51bWJlcjtcbn1cblxuLyoqIFBhcnNlIGFuZCBleHBsYWluIGEgRE9UIHRyYW5zYWN0aW9uLiBSZXBsYWNlcyB0aGUgb2xkIHdhc20tZG90IGV4cGxhaW5UcmFuc2FjdGlvbi4gKi9cbmZ1bmN0aW9uIGJ1aWxkRXhwbGFuYXRpb24ocGFyYW1zOiB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIG1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgc2VuZGVyQWRkcmVzcz86IHN0cmluZztcbiAgcmVmZXJlbmNlQmxvY2s/OiBzdHJpbmc7XG4gIGJsb2NrTnVtYmVyPzogbnVtYmVyO1xufSk6IEludGVybmFsRXhwbGFpbmVkIHtcbiAgY29uc3QgdHggPSBEb3RUcmFuc2FjdGlvbi5mcm9tSGV4KHBhcmFtcy50eEhleCwgcGFyYW1zLm1hdGVyaWFsKTtcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsLFxuICAgIHNlbmRlcjogcGFyYW1zLnNlbmRlckFkZHJlc3MsXG4gICAgcmVmZXJlbmNlQmxvY2s6IHBhcmFtcy5yZWZlcmVuY2VCbG9jayxcbiAgICBibG9ja051bWJlcjogcGFyYW1zLmJsb2NrTnVtYmVyLFxuICB9O1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVRyYW5zYWN0aW9uKHR4LCBjb250ZXh0KTtcblxuICBjb25zdCB0eXBlTmFtZSA9IGRlcml2ZVRyYW5zYWN0aW9uVHlwZShwYXJzZWQubWV0aG9kLCAwKTtcbiAgY29uc3Qgc2VuZGVyID0gcGFyc2VkLnNlbmRlciA/PyBwYXJhbXMuc2VuZGVyQWRkcmVzcztcblxuICAvLyBDaGVjayBmb3IgYmF0Y2ggcGF0dGVybnMgdGhhdCBuZWVkIHByb3h5IGRlcG9zaXQgY29zdCBoYW5kbGluZ1xuICBjb25zdCBiYXRjaEluZm8gPSBkZXRlY3RQcm94eUJhdGNoKHBhcnNlZC5tZXRob2QpO1xuICBsZXQgb3V0cHV0czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH1bXTtcbiAgbGV0IGlucHV0czogeyBhZGRyZXNzOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xuXG4gIGlmIChiYXRjaEluZm8gJiYgc2VuZGVyKSB7XG4gICAgY29uc3QgcHJveHlEZXBvc2l0Q29zdCA9IGdldFByb3h5RGVwb3NpdENvc3QocGFyYW1zLm1hdGVyaWFsLm1ldGFkYXRhKS50b1N0cmluZygpO1xuICAgIGlmIChiYXRjaEluZm8udHlwZSA9PT0gJ3Vuc3Rha2UnKSB7XG4gICAgICAvLyBVbnN0YWtpbmcgYmF0Y2ggKHJlbW92ZVByb3h5ICsgY2hpbGwgKyB1bmJvbmQpOiBwcm94eSBkZXBvc2l0IHJlZnVuZCBmbG93c1xuICAgICAgLy8gZnJvbSBwcm94eSBhZGRyZXNzIGJhY2sgdG8gc2VuZGVyLiBUaGUgdW5ib25kIGFtb3VudCBpcyBOT1QgaW4gaW5wdXRzL291dHB1dHMuXG4gICAgICBvdXRwdXRzID0gW3sgYWRkcmVzczogc2VuZGVyLCBhbW91bnQ6IHByb3h5RGVwb3NpdENvc3QgfV07XG4gICAgICBpbnB1dHMgPSBbeyBhZGRyZXNzOiBiYXRjaEluZm8ucHJveHlBZGRyZXNzLCB2YWx1ZTogcHJveHlEZXBvc2l0Q29zdCB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3Rha2luZyBiYXRjaCAoYm9uZCArIGFkZFByb3h5KTogYm9uZCBhbW91bnQgdG8gc3Rha2luZyBkZXN0aW5hdGlvbiArIHByb3h5IGRlcG9zaXQgY29zdFxuICAgICAgY29uc3QgYm9uZEFtb3VudCA9IGV4dHJhY3RCb25kQW1vdW50KHBhcnNlZC5tZXRob2QpO1xuICAgICAgb3V0cHV0cyA9IFtcbiAgICAgICAgeyBhZGRyZXNzOiBTVEFLSU5HX0RFU1RJTkFUSU9OLCBhbW91bnQ6IGJvbmRBbW91bnQgfSxcbiAgICAgICAgeyBhZGRyZXNzOiBiYXRjaEluZm8ucHJveHlBZGRyZXNzLCBhbW91bnQ6IHByb3h5RGVwb3NpdENvc3QgfSxcbiAgICAgIF07XG4gICAgICBpbnB1dHMgPSBvdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogc2VuZGVyLCB2YWx1ZTogby5hbW91bnQgfSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXRzID0gZXh0cmFjdE91dHB1dHMocGFyc2VkLm1ldGhvZCwgMCk7XG4gICAgaW5wdXRzID0gc2VuZGVyID8gb3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IHNlbmRlciwgdmFsdWU6IG8uYW1vdW50IH0pKSA6IFtdO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gb3V0cHV0cy5yZWR1Y2UoKHN1bSwgbykgPT4ge1xuICAgIGlmIChvLmFtb3VudCA9PT0gJ0FMTCcpIHJldHVybiBzdW07XG4gICAgcmV0dXJuIChCaWdJbnQoc3VtKSArIEJpZ0ludChvLmFtb3VudCkpLnRvU3RyaW5nKCk7XG4gIH0sICcwJyk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlTmFtZSxcbiAgICBpZDogcGFyc2VkLmlkID8/IHVuZGVmaW5lZCxcbiAgICBzZW5kZXI6IHBhcnNlZC5zZW5kZXIgPz8gdW5kZWZpbmVkLFxuICAgIG91dHB1dHMsXG4gICAgaW5wdXRzLFxuICAgIG91dHB1dEFtb3VudCxcbiAgICB0aXA6IHBhcnNlZC50aXAsXG4gICAgZXJhOiBwYXJzZWQuZXJhLFxuICAgIG1ldGhvZDogcGFyc2VkLm1ldGhvZCxcbiAgICBpc1NpZ25lZDogcGFyc2VkLmlzU2lnbmVkLFxuICAgIG5vbmNlOiBwYXJzZWQubm9uY2UsXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUcmFuc2FjdGlvbiB0eXBlIGRlcml2YXRpb24gKG1vdmVkIGZyb20gQGJpdGdvL3dhc20tZG90KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZGVyaXZlVHJhbnNhY3Rpb25UeXBlKG1ldGhvZDogUGFyc2VkTWV0aG9kLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qga2V5ID0gYCR7bWV0aG9kLnBhbGxldH0uJHttZXRob2QubmFtZX1gO1xuICBjb25zdCBhcmdzID0gKG1ldGhvZC5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdiYWxhbmNlcy50cmFuc2Zlcic6XG4gICAgY2FzZSAnYmFsYW5jZXMudHJhbnNmZXJLZWVwQWxpdmUnOlxuICAgIGNhc2UgJ2JhbGFuY2VzLnRyYW5zZmVyQWxsb3dEZWF0aCc6XG4gICAgY2FzZSAnYmFsYW5jZXMudHJhbnNmZXJBbGwnOlxuICAgICAgcmV0dXJuICdTZW5kJztcblxuICAgIGNhc2UgJ3N0YWtpbmcuYm9uZCc6XG4gICAgY2FzZSAnc3Rha2luZy5ib25kRXh0cmEnOlxuICAgICAgcmV0dXJuICdTdGFraW5nQWN0aXZhdGUnO1xuXG4gICAgY2FzZSAnc3Rha2luZy51bmJvbmQnOlxuICAgICAgcmV0dXJuICdTdGFraW5nVW5sb2NrJztcblxuICAgIGNhc2UgJ3N0YWtpbmcud2l0aGRyYXdVbmJvbmRlZCc6XG4gICAgICByZXR1cm4gJ1N0YWtpbmdXaXRoZHJhdyc7XG5cbiAgICBjYXNlICdzdGFraW5nLmNoaWxsJzpcbiAgICAgIHJldHVybiAnU3Rha2luZ1Vudm90ZSc7XG5cbiAgICBjYXNlICdzdGFraW5nLnBheW91dFN0YWtlcnMnOlxuICAgICAgcmV0dXJuICdTdGFraW5nQ2xhaW0nO1xuXG4gICAgY2FzZSAncHJveHkuYWRkUHJveHknOlxuICAgIGNhc2UgJ3Byb3h5LnJlbW92ZVByb3h5JzpcbiAgICBjYXNlICdwcm94eS5jcmVhdGVQdXJlJzpcbiAgICAgIHJldHVybiAnQWRkcmVzc0luaXRpYWxpemF0aW9uJztcblxuICAgIGNhc2UgJ3V0aWxpdHkuYmF0Y2gnOlxuICAgIGNhc2UgJ3V0aWxpdHkuYmF0Y2hBbGwnOlxuICAgICAgcmV0dXJuICdCYXRjaCc7XG5cbiAgICBjYXNlICdwcm94eS5wcm94eSc6IHtcbiAgICAgIGlmIChkZXB0aCA+PSBNQVhfTkVTVElOR19ERVBUSCkgcmV0dXJuICdVbmtub3duJztcbiAgICAgIGNvbnN0IGNhbGwgPSBhcmdzLmNhbGwgYXMgUGFyc2VkTWV0aG9kIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGw/LnBhbGxldCAmJiBjYWxsPy5uYW1lKSByZXR1cm4gZGVyaXZlVHJhbnNhY3Rpb25UeXBlKGNhbGwsIGRlcHRoICsgMSk7XG4gICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ1Vua25vd24nO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPdXRwdXQgZXh0cmFjdGlvbiAobW92ZWQgZnJvbSBAYml0Z28vd2FzbS1kb3QpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBleHRyYWN0T3V0cHV0cyhtZXRob2Q6IFBhcnNlZE1ldGhvZCwgZGVwdGg6IG51bWJlcik6IHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IHN0cmluZyB9W10ge1xuICBjb25zdCBhcmdzID0gKG1ldGhvZC5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qga2V5ID0gYCR7bWV0aG9kLnBhbGxldH0uJHttZXRob2QubmFtZX1gO1xuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAnYmFsYW5jZXMudHJhbnNmZXInOlxuICAgIGNhc2UgJ2JhbGFuY2VzLnRyYW5zZmVyS2VlcEFsaXZlJzpcbiAgICBjYXNlICdiYWxhbmNlcy50cmFuc2ZlckFsbG93RGVhdGgnOlxuICAgICAgcmV0dXJuIFt7IGFkZHJlc3M6IFN0cmluZyhhcmdzLmRlc3QgPz8gJycpLCBhbW91bnQ6IFN0cmluZyhhcmdzLnZhbHVlID8/ICcwJykgfV07XG5cbiAgICBjYXNlICdiYWxhbmNlcy50cmFuc2ZlckFsbCc6XG4gICAgICByZXR1cm4gW3sgYWRkcmVzczogU3RyaW5nKGFyZ3MuZGVzdCA/PyAnJyksIGFtb3VudDogJ0FMTCcgfV07XG5cbiAgICBjYXNlICdzdGFraW5nLmJvbmQnOlxuICAgIGNhc2UgJ3N0YWtpbmcuYm9uZEV4dHJhJzpcbiAgICBjYXNlICdzdGFraW5nLnVuYm9uZCc6XG4gICAgICByZXR1cm4gW3sgYWRkcmVzczogU1RBS0lOR19ERVNUSU5BVElPTiwgYW1vdW50OiBTdHJpbmcoYXJncy52YWx1ZSA/PyAnMCcpIH1dO1xuXG4gICAgY2FzZSAndXRpbGl0eS5iYXRjaCc6XG4gICAgY2FzZSAndXRpbGl0eS5iYXRjaEFsbCc6IHtcbiAgICAgIGlmIChkZXB0aCA+PSBNQVhfTkVTVElOR19ERVBUSCkgcmV0dXJuIFtdO1xuICAgICAgY29uc3QgY2FsbHMgPSAoYXJncy5jYWxscyA/PyBbXSkgYXMgUGFyc2VkTWV0aG9kW107XG4gICAgICByZXR1cm4gY2FsbHMuZmlsdGVyKChjKSA9PiBjPy5wYWxsZXQgJiYgYz8ubmFtZSkuZmxhdE1hcCgoYykgPT4gZXh0cmFjdE91dHB1dHMoYywgZGVwdGggKyAxKSk7XG4gICAgfVxuXG4gICAgY2FzZSAncHJveHkucHJveHknOiB7XG4gICAgICBpZiAoZGVwdGggPj0gTUFYX05FU1RJTkdfREVQVEgpIHJldHVybiBbXTtcbiAgICAgIGNvbnN0IGNhbGwgPSBhcmdzLmNhbGwgYXMgUGFyc2VkTWV0aG9kIHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGNhbGw/LnBhbGxldCAmJiBjYWxsPy5uYW1lID8gZXh0cmFjdE91dHB1dHMoY2FsbCwgZGVwdGggKyAxKSA6IFtdO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJhdGNoIGhlbHBlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBFeHRyYWN0IGJvbmQgYW1vdW50IGZyb20gYSBiYXRjaCBtZXRob2QgY29udGFpbmluZyBhIHN0YWtpbmcuYm9uZCBjYWxsICovXG5mdW5jdGlvbiBleHRyYWN0Qm9uZEFtb3VudChtZXRob2Q6IFBhcnNlZE1ldGhvZCk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbGxzID0gKChtZXRob2QuYXJncyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmNhbGxzIGFzIFBhcnNlZE1ldGhvZFtdIHwgdW5kZWZpbmVkO1xuICBjb25zdCBib25kQ2FsbCA9IGNhbGxzPy5maW5kKChjKSA9PiBgJHtjLnBhbGxldH0uJHtjLm5hbWV9YCA9PT0gJ3N0YWtpbmcuYm9uZCcpO1xuICBpZiAoIWJvbmRDYWxsKSByZXR1cm4gJzAnO1xuICBjb25zdCBhcmdzID0gKGJvbmRDYWxsLmFyZ3MgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gU3RyaW5nKGFyZ3MudmFsdWUgPz8gJzAnKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJhdGNoIHByb3h5IGRldGVjdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuaW50ZXJmYWNlIFByb3h5QmF0Y2hJbmZvIHtcbiAgdHlwZTogJ3N0YWtlJyB8ICd1bnN0YWtlJztcbiAgcHJveHlBZGRyZXNzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGV0ZWN0IGJhdGNoIHRyYW5zYWN0aW9ucyBpbnZvbHZpbmcgcHJveHkgb3BlcmF0aW9ucyAoc3Rha2UvdW5zdGFrZSBiYXRjaGVzKS5cbiAqXG4gKiBMZWdhY3kgYWNjb3VudC1saWIgcmVwb3J0cyBwcm94eSBkZXBvc2l0IGNvc3QgKFByb3h5RGVwb3NpdEJhc2UgKyBQcm94eURlcG9zaXRGYWN0b3IpXG4gKiBhcyB0aGUgdmFsdWUgZm9yIHRoZXNlIGJhdGNoZXMgaW5zdGVhZCBvZiB0aGUgYm9uZC91bmJvbmQgYW1vdW50LlxuICpcbiAqIFVuc3Rha2luZyBiYXRjaDogcmVtb3ZlUHJveHkgKyBjaGlsbCArIHVuYm9uZFxuICogU3Rha2luZyBiYXRjaDogYm9uZCArIGFkZFByb3h5XG4gKi9cbmZ1bmN0aW9uIGRldGVjdFByb3h5QmF0Y2gobWV0aG9kOiBQYXJzZWRNZXRob2QpOiBQcm94eUJhdGNoSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGtleSA9IGAke21ldGhvZC5wYWxsZXR9LiR7bWV0aG9kLm5hbWV9YDtcbiAgaWYgKGtleSAhPT0gJ3V0aWxpdHkuYmF0Y2gnICYmIGtleSAhPT0gJ3V0aWxpdHkuYmF0Y2hBbGwnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNhbGxzID0gKChtZXRob2QuYXJncyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmNhbGxzIGFzIFBhcnNlZE1ldGhvZFtdIHwgdW5kZWZpbmVkO1xuICBpZiAoIWNhbGxzIHx8IGNhbGxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBjYWxsS2V5cyA9IGNhbGxzLm1hcCgoYykgPT4gYCR7Yy5wYWxsZXR9LiR7Yy5uYW1lfWApO1xuXG4gIC8vIFVuc3Rha2luZyBiYXRjaDogcmVtb3ZlUHJveHkgKyBjaGlsbCArIHVuYm9uZCAoMyBjYWxscylcbiAgaWYgKFxuICAgIGNhbGxzLmxlbmd0aCA9PT0gMyAmJlxuICAgIGNhbGxLZXlzWzBdID09PSAncHJveHkucmVtb3ZlUHJveHknICYmXG4gICAgY2FsbEtleXNbMV0gPT09ICdzdGFraW5nLmNoaWxsJyAmJlxuICAgIGNhbGxLZXlzWzJdID09PSAnc3Rha2luZy51bmJvbmQnXG4gICkge1xuICAgIGNvbnN0IHJlbW92ZVByb3h5QXJncyA9IChjYWxsc1swXS5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBwcm94eUFkZHJlc3MgPSBTdHJpbmcocmVtb3ZlUHJveHlBcmdzLmRlbGVnYXRlID8/ICcnKTtcbiAgICByZXR1cm4geyB0eXBlOiAndW5zdGFrZScsIHByb3h5QWRkcmVzcyB9O1xuICB9XG5cbiAgLy8gU3Rha2luZyBiYXRjaDogYm9uZCArIGFkZFByb3h5ICgyIGNhbGxzKVxuICBpZiAoY2FsbHMubGVuZ3RoID09PSAyICYmIGNhbGxLZXlzWzBdID09PSAnc3Rha2luZy5ib25kJyAmJiBjYWxsS2V5c1sxXSA9PT0gJ3Byb3h5LmFkZFByb3h5Jykge1xuICAgIGNvbnN0IGFkZFByb3h5QXJncyA9IChjYWxsc1sxXS5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBwcm94eUFkZHJlc3MgPSBTdHJpbmcoYWRkUHJveHlBcmdzLmRlbGVnYXRlID8/ICcnKTtcbiAgICByZXR1cm4geyB0eXBlOiAnc3Rha2UnLCBwcm94eUFkZHJlc3MgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogTWFwIHR5cGUgbmFtZSBzdHJpbmcgdG8gc2RrLWNvcmUgVHJhbnNhY3Rpb25UeXBlIHZpYSBuYW1lIGxvb2t1cCAqL1xuZnVuY3Rpb24gbWFwVHJhbnNhY3Rpb25UeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBUcmFuc2FjdGlvblR5cGUge1xuICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlW3R5cGVOYW1lIGFzIGtleW9mIHR5cGVvZiBUcmFuc2FjdGlvblR5cGVdID8/IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xufVxuXG5mdW5jdGlvbiBwb3B1bGF0ZVNlbmRGaWVsZHMocmVzdWx0OiBUeERhdGEsIG1ldGhvZDogUGFyc2VkTWV0aG9kLCBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBrZXkgPSBgJHttZXRob2QucGFsbGV0fS4ke21ldGhvZC5uYW1lfWA7XG5cbiAgaWYgKGtleSA9PT0gJ3Byb3h5LnByb3h5Jykge1xuICAgIC8vIFByb3h5LXdyYXBwZWQgdHJhbnNmZXJcbiAgICBjb25zdCBpbm5lckNhbGwgPSBhcmdzLmNhbGwgYXMgUGFyc2VkTWV0aG9kIHwgdW5kZWZpbmVkO1xuICAgIHJlc3VsdC5vd25lciA9IFN0cmluZyhhcmdzLnJlYWwgPz8gJycpO1xuICAgIHJlc3VsdC5mb3JjZVByb3h5VHlwZSA9IChhcmdzLmZvcmNlUHJveHlUeXBlIGFzIFByb3h5VHlwZSkgPz8gdW5kZWZpbmVkO1xuICAgIGlmIChpbm5lckNhbGw/LmFyZ3MpIHtcbiAgICAgIGNvbnN0IGlubmVyQXJncyA9IGlubmVyQ2FsbC5hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmVzdWx0LnRvID0gU3RyaW5nKGlubmVyQXJncy5kZXN0ID8/ICcnKTtcbiAgICAgIHJlc3VsdC5hbW91bnQgPSBTdHJpbmcoaW5uZXJBcmdzLnZhbHVlID8/ICcnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoa2V5ID09PSAnYmFsYW5jZXMudHJhbnNmZXJBbGwnKSB7XG4gICAgcmVzdWx0LnRvID0gU3RyaW5nKGFyZ3MuZGVzdCA/PyAnJyk7XG4gICAgcmVzdWx0LmtlZXBBbGl2ZSA9IEJvb2xlYW4oYXJncy5rZWVwQWxpdmUpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRyYW5zZmVyLCB0cmFuc2ZlcktlZXBBbGl2ZSwgdHJhbnNmZXJBbGxvd0RlYXRoXG4gICAgcmVzdWx0LnRvID0gU3RyaW5nKGFyZ3MuZGVzdCA/PyAnJyk7XG4gICAgcmVzdWx0LmFtb3VudCA9IFN0cmluZyhhcmdzLnZhbHVlID8/ICcnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3B1bGF0ZVN0YWtpbmdBY3RpdmF0ZUZpZWxkcyhcbiAgcmVzdWx0OiBUeERhdGEsXG4gIG1ldGhvZDogUGFyc2VkTWV0aG9kLFxuICBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2VuZGVyQWRkcmVzczogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKG1ldGhvZC5uYW1lID09PSAnYm9uZEV4dHJhJykge1xuICAgIHJlc3VsdC5hbW91bnQgPSBTdHJpbmcoYXJncy52YWx1ZSA/PyAnJyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYm9uZFxuICAgIHJlc3VsdC5jb250cm9sbGVyID0gc2VuZGVyQWRkcmVzcztcbiAgICByZXN1bHQuYW1vdW50ID0gU3RyaW5nKGFyZ3MudmFsdWUgPz8gJycpO1xuICAgIHJlc3VsdC5wYXllZSA9IFN0cmluZyhhcmdzLnBheWVlID8/ICcnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3B1bGF0ZUFkZHJlc3NJbml0RmllbGRzKHJlc3VsdDogVHhEYXRhLCBtZXRob2Q6IFBhcnNlZE1ldGhvZCwgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3Qga2V5ID0gYCR7bWV0aG9kLnBhbGxldH0uJHttZXRob2QubmFtZX1gO1xuICByZXN1bHQubWV0aG9kID0ga2V5O1xuICByZXN1bHQucHJveHlUeXBlID0gU3RyaW5nKGFyZ3MucHJveHlfdHlwZSA/PyAnJyk7XG4gIHJlc3VsdC5kZWxheSA9IFN0cmluZyhhcmdzLmRlbGF5ID8/ICcnKTtcblxuICBpZiAoa2V5ID09PSAncHJveHkuY3JlYXRlUHVyZScpIHtcbiAgICByZXN1bHQuaW5kZXggPSBTdHJpbmcoYXJncy5pbmRleCA/PyAnJyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYWRkUHJveHksIHJlbW92ZVByb3h5XG4gICAgcmVzdWx0Lm93bmVyID0gU3RyaW5nKGFyZ3MuZGVsZWdhdGUgPz8gJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcEJhdGNoQ2FsbHMoY2FsbHM6IFBhcnNlZE1ldGhvZFtdIHwgdW5kZWZpbmVkKTogQmF0Y2hDYWxsT2JqZWN0W10ge1xuICBpZiAoIWNhbGxzKSByZXR1cm4gW107XG4gIHJldHVybiBjYWxscy5tYXAoKGNhbGwpID0+ICh7XG4gICAgY2FsbEluZGV4OiBgMHgke2NhbGwucGFsbGV0SW5kZXgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtjYWxsLm1ldGhvZEluZGV4LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfWAsXG4gICAgYXJnczogdHJhbnNmb3JtQmF0Y2hDYWxsQXJncygoY2FsbC5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gIH0pKTtcbn1cblxuLyoqIFRyYW5zZm9ybSBXQVNNLWRlY29kZWQgYmF0Y2ggY2FsbCBhcmdzIHRvIG1hdGNoIHRoZSBQb2xrYWRvdC5qcyBmb3JtYXQgdGhhdCBjb25zdW1lcnMgZXhwZWN0ICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1CYXRjaENhbGxBcmdzKGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3MpKSB7XG4gICAgaWYgKGtleSA9PT0gJ2RlbGVnYXRlJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBNdWx0aUFkZHJlc3MgSWQgdmFyaWFudDogc3RyaW5nIOKGkiB7IGlkOiBzdHJpbmcgfVxuICAgICAgcmVzdWx0W2tleV0gPSB7IGlkOiB2YWx1ZSB9O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAndmFsdWUnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIENvbXBhY3QgdTEyODogc3RyaW5nIOKGkiBudW1iZXIgKG1hdGNoZXMgUG9sa2Fkb3QuanMgYmVoYXZpb3IpXG4gICAgICByZXN1bHRba2V5XSA9IE51bWJlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdwYXllZScgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gRW51bSB1bml0IHZhcmlhbnQ6IFwiU3Rha2VkXCIg4oaSIHsgc3Rha2VkOiBudWxsIH1cbiAgICAgIGNvbnN0IHZhcmlhbnROYW1lID0gdmFsdWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKTtcbiAgICAgIHJlc3VsdFtrZXldID0geyBbdmFyaWFudE5hbWVdOiBudWxsIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbVBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvd2FzbVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOztBQXlFSCxzREFpQ0M7QUFTRCx3Q0FzQ0M7QUF2SkQsbURBQXVEO0FBQ3ZELDhDQUFxSDtBQUdySCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUU3Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsa0RBQWtELENBQUM7QUFFL0UsMEVBQTBFO0FBQzFFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQztBQTJDbEIsZ0ZBQWdGO0FBQ2hGLGVBQWU7QUFDZixnRkFBZ0Y7QUFFaEY7Ozs7O0dBS0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxNQUFtQztJQUN2RSxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUzQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV6RSx5REFBeUQ7SUFDekQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1FBQ2xCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztLQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sTUFBTSxHQUFlLFNBQVMsQ0FBQyxNQUFNLENBQUMs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QUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQUksR0FBRyxLQUFLLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxvREFBb0Q7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzlCLENBQUM7YUFBTSxJQUFJLEdBQUcsS0FBSyxPQUFPLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEQsZ0VBQWdFO1lBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLE9BQU8sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4RCxrREFBa0Q7WUFDbEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV0FTTS1iYXNlZCBET1QgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb24uXG4gKlxuICogQnVpbHQgb24gQGJpdGdvL3dhc20tZG90J3MgcGFyc2VUcmFuc2FjdGlvbigpLiBEZXJpdmVzIHRyYW5zYWN0aW9uIHR5cGVzLFxuICogZXh0cmFjdHMgb3V0cHV0cy9pbnB1dHMsIGFuZCBtYXBzIHRvIEJpdEdvSlMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBmb3JtYXQuXG4gKiBUaGlzIGlzIEJpdEdvLXNwZWNpZmljIGJ1c2luZXNzIGxvZ2ljIHRoYXQgbGl2ZXMgb3V0c2lkZSB0aGUgd2FzbSBwYWNrYWdlLlxuICovXG5cbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IERvdFRyYW5zYWN0aW9uLCBwYXJzZVRyYW5zYWN0aW9uLCBnZXRQcm94eURlcG9zaXRDb3N0LCB0eXBlIFBhcnNlZE1ldGhvZCwgdHlwZSBFcmEgfSBmcm9tICdAYml0Z28vd2FzbS1kb3QnO1xuaW1wb3J0IHR5cGUgeyBCYXRjaENhbGxPYmplY3QsIFByb3h5VHlwZSwgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgTWF0ZXJpYWwsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuXG5jb25zdCBNQVhfTkVTVElOR19ERVBUSCA9IDEwO1xuXG4vKipcbiAqIERpc3BsYXktb25seSBzZW50aW5lbCBhZGRyZXNzIGZvciBzdGFraW5nIG91dHB1dHMgKGJvbmQsIGJvbmRFeHRyYSwgdW5ib25kKS5cbiAqXG4gKiBTdGFraW5nIGV4dHJpbnNpY3MgZG9uJ3QgdHJhbnNmZXIgZnVuZHMgdG8gYW4gZXh0ZXJuYWwgYWRkcmVzcy4gVGhlIGJvbmRlZCBET1RcbiAqIHN0YXlzIGluIHRoZSBzZW5kZXIncyBhY2NvdW50IGFzIFwiYm9uZGVkIGJhbGFuY2VcIi4gQnV0IHRoZSBleHBsYW5hdGlvbiBmb3JtYXRcbiAqIHJlcXVpcmVzIGFuIG91dHB1dCBhZGRyZXNzLCBzbyB3ZSB1c2UgdGhpcyBudWxsIGFkZHJlc3MgKFNTNTggZW5jb2Rpbmcgb2YgMzJcbiAqIHplcm8gYnl0ZXMsIHN1YnN0cmF0ZSBnZW5lcmljIHByZWZpeCA0MikgYXMgYSBwbGFjZWhvbGRlciBtZWFuaW5nIFwidGhpcyBhbW91bnRcbiAqIHdlbnQgdG8gc3Rha2luZ1wiLiBTYW1lIGNvbnN0YW50IHVzZWQgYnkgdGhlIGxlZ2FjeSBhY2NvdW50LWxpYiBUcmFuc2FjdGlvbiBjbGFzcy5cbiAqL1xuY29uc3QgU1RBS0lOR19ERVNUSU5BVElPTiA9ICc1QzRocmZqdzlEalhaVHpWM013enJyQXI5UDFNSmhTcnZXR1dxaTFlU3V5VXBuaE0nO1xuXG4vKiogU2VudGluZWwgZm9yIHRyYW5zZmVyQWxsOiB0aGUgYWN0dWFsIGFtb3VudCBpcyBkZXRlcm1pbmVkIG9uLWNoYWluLiAqL1xuY29uc3QgQUxMID0gJ0FMTCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQdWJsaWMgdHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogSW5wdXQgZW50cnkgZm9yIGEgRE9UIHRyYW5zYWN0aW9uLlxuICogRm9yIGFjY291bnQtbW9kZWwgY2hhaW5zLCB0aGVyZSdzIHR5cGljYWxseSBvbmUgaW5wdXQgKHRoZSBzZW5kZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvdElucHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICB2YWx1ZVN0cmluZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIGV4cGxhbmF0aW9uIHJldHVybmVkIGJ5IFdBU00tYmFzZWQgcGFyc2luZy5cbiAqIEluY2x1ZGVzIGZpZWxkcyBuZWVkZWQgYnkgd2FsbGV0LXBsYXRmb3JtIHRoYXQgYXJlbid0IGluIHRoZSBiYXNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG90V2FzbUV4cGxhbmF0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gIHNlbmRlcjogc3RyaW5nO1xuICBub25jZTogbnVtYmVyO1xuICBpc1NpZ25lZDogYm9vbGVhbjtcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBpbnB1dHM6IERvdElucHV0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpbkRvdFRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBzZW5kZXJBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvSnNvbkZyb21XYXNtUGFyYW1zIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBzZW5kZXJBZGRyZXNzOiBzdHJpbmc7XG4gIGNvaW5Db25maWdOYW1lOiBzdHJpbmc7XG4gIHJlZmVyZW5jZUJsb2NrPzogc3RyaW5nO1xuICBibG9ja051bWJlcj86IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1haW4gZXhwb3J0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFeHBsYWluIGEgRE9UIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBXQVNNIHBhcnNlci5cbiAqXG4gKiBQYXJzZXMgdGhlIHRyYW5zYWN0aW9uIHZpYSBXQVNNLCBkZXJpdmVzIHRoZSB0cmFuc2FjdGlvbiB0eXBlIGFuZFxuICogb3V0cHV0cyBsb2NhbGx5LCB0aGVuIG1hcHMgdG8gQml0R29KUyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Eb3RUcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5Eb3RUcmFuc2FjdGlvblBhcmFtcyk6IERvdFdhc21FeHBsYW5hdGlvbiB7XG4gIGNvbnN0IGV4cGxhaW5lZCA9IGJ1aWxkRXhwbGFuYXRpb24ocGFyYW1zKTtcblxuICBjb25zdCBzZW5kZXIgPSBleHBsYWluZWQuc2VuZGVyIHx8IHBhcmFtcy5zZW5kZXJBZGRyZXNzIHx8ICcnO1xuICBjb25zdCBtZXRob2ROYW1lID0gYCR7ZXhwbGFpbmVkLm1ldGhvZC5wYWxsZXR9LiR7ZXhwbGFpbmVkLm1ldGhvZC5uYW1lfWA7XG5cbiAgLy8gQ29udmVydCBiaWdpbnQgdG8gc3RyaW5nIGF0IHRoZSBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5XG4gIGNvbnN0IG91dHB1dHMgPSBleHBsYWluZWQub3V0cHV0cy5tYXAoKG8pID0+ICh7XG4gICAgYWRkcmVzczogby5hZGRyZXNzLFxuICAgIGFtb3VudDogby5hbW91bnQgPT09IEFMTCA/ICcwJyA6IFN0cmluZyhvLmFtb3VudCksXG4gIH0pKTtcblxuICBjb25zdCBpbnB1dHM6IERvdElucHV0W10gPSBleHBsYWluZWQuaW5wdXRzLm1hcCgoaSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlU3RyID0gaS52YWx1ZSA9PT0gQUxMID8gQUxMIDogU3RyaW5nKGkudmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlID0gaS52YWx1ZSA9PT0gQUxMID8gMCA6IE51bWJlcihpLnZhbHVlKTtcbiAgICByZXR1cm4geyBhZGRyZXNzOiBpLmFkZHJlc3MsIHZhbHVlLCB2YWx1ZVN0cmluZzogdmFsdWVTdHIgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwbGF5T3JkZXI6IFsnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnLCAnc2VxdWVuY2VJZCcsICdpZCddLFxuICAgIGlkOiBleHBsYWluZWQuaWQgfHwgJycsXG4gICAgb3V0cHV0cyxcbiAgICBvdXRwdXRBbW91bnQ6IFN0cmluZyhleHBsYWluZWQub3V0cHV0QW1vdW50KSxcbiAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICBmZWU6IHsgZmVlOiBleHBsYWluZWQudGlwID8gU3RyaW5nKGV4cGxhaW5lZC50aXApIDogJzAnLCB0eXBlOiAndGlwJyB9LFxuICAgIHR5cGU6IGV4cGxhaW5lZC50eXBlLFxuICAgIHNlbmRlcixcbiAgICBub25jZTogZXhwbGFpbmVkLm5vbmNlLFxuICAgIGlzU2lnbmVkOiBleHBsYWluZWQuaXNTaWduZWQsXG4gICAgbWV0aG9kTmFtZSxcbiAgICBpbnB1dHMsXG4gIH07XG59XG5cbi8qKlxuICogUHJvZHVjZSBhIFR4RGF0YSBvYmplY3QgdXNpbmcgV0FTTSBwYXJzaW5nIGluc3RlYWQgb2YgdGhlIEpTIHR4d3JhcHBlci5cbiAqXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBsZWdhY3kgYHRvSnNvbigpYCBwYXRoIGZvciBjaGFpbnMgd2hlcmUgV0FTTSBwYXJzaW5nIGlzIGVuYWJsZWQuXG4gKiBUaGUgV0FTTSBwYXJzZXIgZGVjb2RlcyB0aGUgZXh0cmluc2ljIGJ5dGVzICh3aXRoIG1ldGFkYXRhLWF3YXJlIHNpZ25lZCBleHRlbnNpb24gaGFuZGxpbmcpLFxuICogYW5kIHRoaXMgZnVuY3Rpb24gbWFwcyB0aGUgcmVzdWx0IHRvIHRoZSBUeERhdGEgaW50ZXJmYWNlIHRoYXQgY29uc3VtZXJzIGV4cGVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbkZyb21XYXNtKHBhcmFtczogVG9Kc29uRnJvbVdhc21QYXJhbXMpOiBUeERhdGEge1xuICBjb25zdCBleHBsYWluZWQgPSBidWlsZEV4cGxhbmF0aW9uKHBhcmFtcyk7XG4gIGNvbnN0IHR5cGUgPSBleHBsYWluZWQudHlwZTtcbiAgY29uc3QgbWV0aG9kID0gZXhwbGFpbmVkLm1ldGhvZDtcbiAgY29uc3QgYXJncyA9IG1ldGhvZC5hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGNvbnN0IHJlc3VsdDogVHhEYXRhID0ge1xuICAgIGlkOiBleHBsYWluZWQuaWQgfHwgJycsXG4gICAgc2VuZGVyOiBleHBsYWluZWQuc2VuZGVyIHx8IHBhcmFtcy5zZW5kZXJBZGRyZXNzLFxuICAgIHJlZmVyZW5jZUJsb2NrOiBwYXJhbXMucmVmZXJlbmNlQmxvY2sgfHwgJycsXG4gICAgYmxvY2tOdW1iZXI6IHBhcmFtcy5ibG9ja051bWJlciB8fCAwLFxuICAgIGdlbmVzaXNIYXNoOiBwYXJhbXMubWF0ZXJpYWwuZ2VuZXNpc0hhc2ggfHwgJycsXG4gICAgbm9uY2U6IGV4cGxhaW5lZC5ub25jZSxcbiAgICBzcGVjVmVyc2lvbjogcGFyYW1zLm1hdGVyaWFsLnNwZWNWZXJzaW9uIHx8IDAsXG4gICAgdHJhbnNhY3Rpb25WZXJzaW9uOiBwYXJhbXMubWF0ZXJpYWwudHhWZXJzaW9uIHx8IDAsXG4gICAgY2hhaW5OYW1lOiBwYXJhbXMubWF0ZXJpYWwuY2hhaW5OYW1lIHx8ICcnLFxuICAgIHRpcDogTnVtYmVyKGV4cGxhaW5lZC50aXApIHx8IDAsXG4gICAgZXJhUGVyaW9kOiBleHBsYWluZWQuZXJhLnR5cGUgPT09ICdtb3J0YWwnID8gKGV4cGxhaW5lZC5lcmEgYXMgeyBwZXJpb2Q6IG51bWJlciB9KS5wZXJpb2QgOiAwLFxuICB9O1xuXG4gIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgIHBvcHVsYXRlU2VuZEZpZWxkcyhyZXN1bHQsIG1ldGhvZCwgYXJncyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSkge1xuICAgIHBvcHVsYXRlU3Rha2luZ0FjdGl2YXRlRmllbGRzKHJlc3VsdCwgbWV0aG9kLCBhcmdzLCBwYXJhbXMuc2VuZGVyQWRkcmVzcyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2spIHtcbiAgICByZXN1bHQuYW1vdW50ID0gU3RyaW5nKGFyZ3MudmFsdWUgPz8gJycpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpIHtcbiAgICByZXN1bHQubnVtU2xhc2hpbmdTcGFucyA9IE51bWJlcihhcmdzLm51bVNsYXNoaW5nU3BhbnMgPz8gMCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSkge1xuICAgIHJlc3VsdC52YWxpZGF0b3JTdGFzaCA9IFN0cmluZyhhcmdzLnZhbGlkYXRvclN0YXNoID8/ICcnKTtcbiAgICByZXN1bHQuY2xhaW1FcmEgPSBTdHJpbmcoYXJncy5lcmEgPz8gJycpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pIHtcbiAgICBwb3B1bGF0ZUFkZHJlc3NJbml0RmllbGRzKHJlc3VsdCwgbWV0aG9kLCBhcmdzKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQmF0Y2gpIHtcbiAgICByZXN1bHQuYmF0Y2hDYWxscyA9IG1hcEJhdGNoQ2FsbHMoYXJncy5jYWxscyBhcyBQYXJzZWRNZXRob2RbXSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29yZSBleHBsYWluIGxvZ2ljXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxPdXRwdXQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogYmlnaW50IHwgdHlwZW9mIEFMTDtcbn1cblxuaW50ZXJmYWNlIEludGVybmFsSW5wdXQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIHZhbHVlOiBiaWdpbnQgfCB0eXBlb2YgQUxMO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxFeHBsYWluZWQge1xuICB0eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIGlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNlbmRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvdXRwdXRzOiBJbnRlcm5hbE91dHB1dFtdO1xuICBpbnB1dHM6IEludGVybmFsSW5wdXRbXTtcbiAgb3V0cHV0QW1vdW50OiBiaWdpbnQ7XG4gIHRpcDogYmlnaW50O1xuICBlcmE6IEVyYTtcbiAgbWV0aG9kOiBQYXJzZWRNZXRob2Q7XG4gIGlzU2lnbmVkOiBib29sZWFuO1xuICBub25jZTogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBidWlsZEV4cGxhbmF0aW9uKHBhcmFtczoge1xuICB0eEhleDogc3RyaW5nO1xuICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gIHNlbmRlckFkZHJlc3M/OiBzdHJpbmc7XG4gIHJlZmVyZW5jZUJsb2NrPzogc3RyaW5nO1xuICBibG9ja051bWJlcj86IG51bWJlcjtcbn0pOiBJbnRlcm5hbEV4cGxhaW5lZCB7XG4gIGNvbnN0IHR4ID0gRG90VHJhbnNhY3Rpb24uZnJvbUhleChwYXJhbXMudHhIZXgsIHBhcmFtcy5tYXRlcmlhbCk7XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbCxcbiAgICBzZW5kZXI6IHBhcmFtcy5zZW5kZXJBZGRyZXNzLFxuICAgIHJlZmVyZW5jZUJsb2NrOiBwYXJhbXMucmVmZXJlbmNlQmxvY2ssXG4gICAgYmxvY2tOdW1iZXI6IHBhcmFtcy5ibG9ja051bWJlcixcbiAgfTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFuc2FjdGlvbih0eCwgY29udGV4dCk7XG4gIGNvbnN0IHNlbmRlciA9IHBhcnNlZC5zZW5kZXIgPz8gcGFyYW1zLnNlbmRlckFkZHJlc3M7XG5cbiAgY29uc3QgYW5hbHlzaXMgPSBhbmFseXplTWV0aG9kKHBhcnNlZC5tZXRob2QsIHNlbmRlciwgcGFyYW1zLm1hdGVyaWFsLm1ldGFkYXRhKTtcblxuICAvLyBVc2UgZXhwbGljaXQgaW5wdXRzIGZyb20gYW5hbHlzaXMgaWYgcHJvdmlkZWQgKGUuZy4sIHVuc3Rha2UgYmF0Y2ggd2hlcmVcbiAgLy8gdGhlIGlucHV0IHNvdXJjZSBpcyB0aGUgcHJveHkgYWRkcmVzcywgbm90IHRoZSBzZW5kZXIpLiBPdGhlcndpc2UsIG1pcnJvclxuICAvLyBvdXRwdXRzIHdpdGggc2VuZGVyIGFzIHRoZSBkZWZhdWx0IGlucHV0IHNvdXJjZS5cbiAgY29uc3QgaW5wdXRzOiBJbnRlcm5hbElucHV0W10gPVxuICAgIGFuYWx5c2lzLmlucHV0cyA/PyAoc2VuZGVyID8gYW5hbHlzaXMub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IHNlbmRlciwgdmFsdWU6IG8uYW1vdW50IH0pKSA6IFtdKTtcblxuICBjb25zdCBvdXRwdXRBbW91bnQgPSBhbmFseXNpcy5vdXRwdXRzLnJlZHVjZSgoc3VtLCBvKSA9PiB7XG4gICAgaWYgKG8uYW1vdW50ID09PSBBTEwpIHJldHVybiBzdW07XG4gICAgcmV0dXJuIHN1bSArIG8uYW1vdW50O1xuICB9LCAwbik7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhbmFseXNpcy50eXBlLFxuICAgIGlkOiBwYXJzZWQuaWQgPz8gdW5kZWZpbmVkLFxuICAgIHNlbmRlcjogcGFyc2VkLnNlbmRlciA/PyB1bmRlZmluZWQsXG4gICAgb3V0cHV0czogYW5hbHlzaXMub3V0cHV0cyxcbiAgICBpbnB1dHMsXG4gICAgb3V0cHV0QW1vdW50LFxuICAgIHRpcDogQmlnSW50KHBhcnNlZC50aXAgfHwgJzAnKSxcbiAgICBlcmE6IHBhcnNlZC5lcmEsXG4gICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgIGlzU2lnbmVkOiBwYXJzZWQuaXNTaWduZWQsXG4gICAgbm9uY2U6IHBhcnNlZC5ub25jZSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbWJpbmVkIHR5cGUgKyBvdXRwdXQgYW5hbHlzaXMgKHNpbmdsZSBzd2l0Y2gsIHNpbmdsZSBwbGFjZSB0byB1cGRhdGUpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgTWV0aG9kQW5hbHlzaXMge1xuICB0eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIG91dHB1dHM6IEludGVybmFsT3V0cHV0W107XG4gIC8qKiBFeHBsaWNpdCBpbnB1dHMsIHdoZW4gdGhleSBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCAoc2VuZGVyIG1pcnJvcnMgb3V0cHV0cykuICovXG4gIGlucHV0cz86IEludGVybmFsSW5wdXRbXTtcbn1cblxuLyoqXG4gKiBBbmFseXplIGEgcGFyc2VkIG1ldGhvZCB0byBkZXRlcm1pbmUgaXRzIHRyYW5zYWN0aW9uIHR5cGUgYW5kIGV4dHJhY3Qgb3V0cHV0cy5cbiAqXG4gKiBUaGlzIGlzIGEgc2luZ2xlIHN3aXRjaCB0aGF0IGhhbmRsZXMgYm90aCBjb25jZXJucyB0b2dldGhlciwgcHJldmVudGluZyB0aGVtXG4gKiBmcm9tIGdldHRpbmcgb3V0IG9mIHN5bmMuIEV2ZXJ5IGNhc2UgdGhhdCBzZXRzIGEgdHlwZSBhbHNvIHNldHMgdGhlIG91dHB1dHNcbiAqIGZvciB0aGF0IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVNZXRob2QobWV0aG9kOiBQYXJzZWRNZXRob2QsIHNlbmRlckFkZHJlc3M/OiBzdHJpbmcsIG1ldGFkYXRhSGV4Pzogc3RyaW5nKTogTWV0aG9kQW5hbHlzaXMge1xuICByZXR1cm4gYW5hbHl6ZU1ldGhvZElubmVyKG1ldGhvZCwgc2VuZGVyQWRkcmVzcywgbWV0YWRhdGFIZXgsIDApO1xufVxuXG5mdW5jdGlvbiBhbmFseXplTWV0aG9kSW5uZXIoXG4gIG1ldGhvZDogUGFyc2VkTWV0aG9kLFxuICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1ldGFkYXRhSGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRlcHRoOiBudW1iZXJcbik6IE1ldGhvZEFuYWx5c2lzIHtcbiAgY29uc3Qga2V5ID0gYCR7bWV0aG9kLnBhbGxldH0uJHttZXRob2QubmFtZX1gO1xuICBjb25zdCBhcmdzID0gKG1ldGhvZC5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBzd2l0Y2ggKGtleSkge1xuICAgIC8vIC0tLSBUcmFuc2ZlcnMgLS0tXG4gICAgY2FzZSAnYmFsYW5jZXMudHJhbnNmZXInOlxuICAgIGNhc2UgJ2JhbGFuY2VzLnRyYW5zZmVyS2VlcEFsaXZlJzpcbiAgICBjYXNlICdiYWxhbmNlcy50cmFuc2ZlckFsbG93RGVhdGgnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlNlbmQsXG4gICAgICAgIG91dHB1dHM6IFt7IGFkZHJlc3M6IFN0cmluZyhhcmdzLmRlc3QgPz8gJycpLCBhbW91bnQ6IEJpZ0ludCgoYXJncy52YWx1ZSBhcyBzdHJpbmcpID8/ICcwJykgfV0sXG4gICAgICB9O1xuXG4gICAgY2FzZSAnYmFsYW5jZXMudHJhbnNmZXJBbGwnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlNlbmQsXG4gICAgICAgIG91dHB1dHM6IFt7IGFkZHJlc3M6IFN0cmluZyhhcmdzLmRlc3QgPz8gJycpLCBhbW91bnQ6IEFMTCB9XSxcbiAgICAgIH07XG5cbiAgICAvLyAtLS0gU3Rha2luZyAtLS1cbiAgICBjYXNlICdzdGFraW5nLmJvbmQnOlxuICAgIGNhc2UgJ3N0YWtpbmcuYm9uZEV4dHJhJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIG91dHB1dHM6IFt7IGFkZHJlc3M6IFNUQUtJTkdfREVTVElOQVRJT04sIGFtb3VudDogQmlnSW50KChhcmdzLnZhbHVlIGFzIHN0cmluZykgPz8gJzAnKSB9XSxcbiAgICAgIH07XG5cbiAgICBjYXNlICdzdGFraW5nLnVuYm9uZCc6XG4gICAgICAvLyBFbXB0eSBvdXRwdXRzOiB1bmJvbmQgdW5sb2NrcyBET1QgKG5vIGV4dGVybmFsIHNwZW5kKS4gTWF0Y2hlcyBsZWdhY3kgVHJhbnNhY3Rpb24gY2xhc3NcbiAgICAgIC8vIGJlaGF2aW9yIHdoZXJlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JVbmJvbmQoKSByZXR1cm5zIFtdLiBCb25kL2JvbmRFeHRyYSBrZWVwIHRoZVxuICAgICAgLy8gc2VudGluZWwgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCBhY3R1YWwgYmFsYW5jZSBsb2NrcyB2aXNpYmxlIHRvIHBvbGljeSBldmFsdWF0aW9uLlxuICAgICAgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2ssIG91dHB1dHM6IFtdIH07XG5cbiAgICBjYXNlICdzdGFraW5nLndpdGhkcmF3VW5ib25kZWQnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdywgb3V0cHV0czogW10gfTtcblxuICAgIGNhc2UgJ3N0YWtpbmcuY2hpbGwnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbnZvdGUsIG91dHB1dHM6IFtdIH07XG5cbiAgICBjYXNlICdzdGFraW5nLnBheW91dFN0YWtlcnMnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSwgb3V0cHV0czogW10gfTtcblxuICAgIC8vIC0tLSBQcm94eSAtLS1cbiAgICBjYXNlICdwcm94eS5hZGRQcm94eSc6XG4gICAgY2FzZSAncHJveHkucmVtb3ZlUHJveHknOlxuICAgIGNhc2UgJ3Byb3h5LmNyZWF0ZVB1cmUnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbiwgb3V0cHV0czogW10gfTtcblxuICAgIC8vIC0tLSBQcm94eS13cmFwcGVkIGNhbGwgLS0tXG4gICAgY2FzZSAncHJveHkucHJveHknOiB7XG4gICAgICBpZiAoZGVwdGggPj0gTUFYX05FU1RJTkdfREVQVEgpIHJldHVybiB7IHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLCBvdXRwdXRzOiBbXSB9O1xuICAgICAgY29uc3QgY2FsbCA9IGFyZ3MuY2FsbCBhcyBQYXJzZWRNZXRob2QgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FsbD8ucGFsbGV0ICYmIGNhbGw/Lm5hbWUpIHJldHVybiBhbmFseXplTWV0aG9kSW5uZXIoY2FsbCwgc2VuZGVyQWRkcmVzcywgbWV0YWRhdGFIZXgsIGRlcHRoICsgMSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU2VuZCwgb3V0cHV0czogW10gfTtcbiAgICB9XG5cbiAgICAvLyAtLS0gQmF0Y2ggLS0tXG4gICAgY2FzZSAndXRpbGl0eS5iYXRjaCc6XG4gICAgY2FzZSAndXRpbGl0eS5iYXRjaEFsbCc6XG4gICAgICByZXR1cm4gYW5hbHl6ZUJhdGNoKGFyZ3MsIHNlbmRlckFkZHJlc3MsIG1ldGFkYXRhSGV4LCBkZXB0aCk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlNlbmQsIG91dHB1dHM6IFtdIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBbmFseXplIGEgYmF0Y2ggdHJhbnNhY3Rpb24uXG4gKlxuICogRGV0ZWN0cyBrbm93biBwcm94eSBiYXRjaCBwYXR0ZXJucyAoc3Rha2U6IGJvbmQrYWRkUHJveHksIHVuc3Rha2U6XG4gKiByZW1vdmVQcm94eStjaGlsbCt1bmJvbmQpIGFuZCBoYW5kbGVzIHByb3h5IGRlcG9zaXQgY29zdC4gRm9yIHVucmVjb2duaXplZFxuICogYmF0Y2ggcGF0dGVybnMsIHJlY3Vyc2l2ZWx5IGV4dHJhY3RzIG91dHB1dHMgZnJvbSBlYWNoIGlubmVyIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVCYXRjaChcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlbmRlckFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWV0YWRhdGFIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVwdGg6IG51bWJlclxuKTogTWV0aG9kQW5hbHlzaXMge1xuICBjb25zdCBjYWxscyA9IChhcmdzLmNhbGxzID8/IFtdKSBhcyBQYXJzZWRNZXRob2RbXTtcbiAgaWYgKGNhbGxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkJhdGNoLCBvdXRwdXRzOiBbXSB9O1xuXG4gIGNvbnN0IGNhbGxLZXlzID0gY2FsbHMubWFwKChjKSA9PiBgJHtjLnBhbGxldH0uJHtjLm5hbWV9YCk7XG5cbiAgLy8gU3Rha2luZyBiYXRjaDogYm9uZCArIGFkZFByb3h5ICgyIGNhbGxzKVxuICBpZiAoY2FsbHMubGVuZ3RoID09PSAyICYmIGNhbGxLZXlzWzBdID09PSAnc3Rha2luZy5ib25kJyAmJiBjYWxsS2V5c1sxXSA9PT0gJ3Byb3h5LmFkZFByb3h5Jykge1xuICAgIGNvbnN0IGJvbmRBcmdzID0gKGNhbGxzWzBdLmFyZ3MgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGFkZFByb3h5QXJncyA9IChjYWxsc1sxXS5hcmdzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBib25kQW1vdW50ID0gQmlnSW50KChib25kQXJncy52YWx1ZSBhcyBzdHJpbmcpID8/ICcwJyk7XG4gICAgY29uc3QgcHJveHlBZGRyZXNzID0gU3RyaW5nKGFkZFByb3h5QXJncy5kZWxlZ2F0ZSA/PyAnJyk7XG4gICAgY29uc3QgcHJveHlEZXBvc2l0Q29zdCA9IG1ldGFkYXRhSGV4ID8gZ2V0UHJveHlEZXBvc2l0Q29zdChtZXRhZGF0YUhleCkgOiAwbjtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQmF0Y2gsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHsgYWRkcmVzczogU1RBS0lOR19ERVNUSU5BVElPTiwgYW1vdW50OiBib25kQW1vdW50IH0sXG4gICAgICAgIHsgYWRkcmVzczogcHJveHlBZGRyZXNzLCBhbW91bnQ6IHByb3h5RGVwb3NpdENvc3QgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFVuc3Rha2luZyBiYXRjaDogcmVtb3ZlUHJveHkgKyBjaGlsbCArIHVuYm9uZCAoMyBjYWxscylcbiAgLy8gSW5wdXQgc291cmNlIGlzIHRoZSBwcm94eSBhZGRyZXNzIChkZXBvc2l0IHJlZnVuZCksIG5vdCB0aGUgc2VuZGVyLlxuICBpZiAoXG4gICAgY2FsbHMubGVuZ3RoID09PSAzICYmXG4gICAgY2FsbEtleXNbMF0gPT09ICdwcm94eS5yZW1vdmVQcm94eScgJiZcbiAgICBjYWxsS2V5c1sxXSA9PT0gJ3N0YWtpbmcuY2hpbGwnICYmXG4gICAgY2FsbEtleXNbMl0gPT09ICdzdGFraW5nLnVuYm9uZCdcbiAgKSB7XG4gICAgY29uc3QgcmVtb3ZlUHJveHlBcmdzID0gKGNhbGxzWzBdLmFyZ3MgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHByb3h5QWRkcmVzcyA9IFN0cmluZyhyZW1vdmVQcm94eUFyZ3MuZGVsZWdhdGUgPz8gJycpO1xuICAgIGNvbnN0IHByb3h5RGVwb3NpdENvc3QgPSBtZXRhZGF0YUhleCA/IGdldFByb3h5RGVwb3NpdENvc3QobWV0YWRhdGFIZXgpIDogMG47XG5cbiAgICBjb25zdCBvdXRwdXRzID0gc2VuZGVyQWRkcmVzcyA/IFt7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsIGFtb3VudDogcHJveHlEZXBvc2l0Q29zdCB9XSA6IFtdO1xuICAgIGNvbnN0IGlucHV0cyA9IFt7IGFkZHJlc3M6IHByb3h5QWRkcmVzcywgdmFsdWU6IHByb3h5RGVwb3NpdENvc3QgfV07XG5cbiAgICByZXR1cm4geyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQmF0Y2gsIG91dHB1dHMsIGlucHV0cyB9O1xuICB9XG5cbiAgLy8gR2VuZXJpYyBiYXRjaDogcmVjdXJzaXZlbHkgZXh0cmFjdCBvdXRwdXRzIGZyb20gZWFjaCBpbm5lciBjYWxsXG4gIGlmIChkZXB0aCA+PSBNQVhfTkVTVElOR19ERVBUSCkgcmV0dXJuIHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkJhdGNoLCBvdXRwdXRzOiBbXSB9O1xuICBjb25zdCBvdXRwdXRzID0gY2FsbHNcbiAgICAuZmlsdGVyKChjKSA9PiBjPy5wYWxsZXQgJiYgYz8ubmFtZSlcbiAgICAuZmxhdE1hcCgoYykgPT4gYW5hbHl6ZU1ldGhvZElubmVyKGMsIHNlbmRlckFkZHJlc3MsIG1ldGFkYXRhSGV4LCBkZXB0aCArIDEpLm91dHB1dHMpO1xuICByZXR1cm4geyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQmF0Y2gsIG91dHB1dHMgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhlbHBlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHBvcHVsYXRlU2VuZEZpZWxkcyhyZXN1bHQ6IFR4RGF0YSwgbWV0aG9kOiBQYXJzZWRNZXRob2QsIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IGtleSA9IGAke21ldGhvZC5wYWxsZXR9LiR7bWV0aG9kLm5hbWV9YDtcblxuICBpZiAoa2V5ID09PSAncHJveHkucHJveHknKSB7XG4gICAgLy8gUHJveHktd3JhcHBlZCB0cmFuc2ZlclxuICAgIGNvbnN0IGlubmVyQ2FsbCA9IGFyZ3MuY2FsbCBhcyBQYXJzZWRNZXRob2QgfCB1bmRlZmluZWQ7XG4gICAgcmVzdWx0Lm93bmVyID0gU3RyaW5nKGFyZ3MucmVhbCA/PyAnJyk7XG4gICAgcmVzdWx0LmZvcmNlUHJveHlUeXBlID0gKGFyZ3MuZm9yY2VQcm94eVR5cGUgYXMgUHJveHlUeXBlKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKGlubmVyQ2FsbD8uYXJncykge1xuICAgICAgY29uc3QgaW5uZXJBcmdzID0gaW5uZXJDYWxsLmFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICByZXN1bHQudG8gPSBTdHJpbmcoaW5uZXJBcmdzLmRlc3QgPz8gJycpO1xuICAgICAgcmVzdWx0LmFtb3VudCA9IFN0cmluZyhpbm5lckFyZ3MudmFsdWUgPz8gJycpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChrZXkgPT09ICdiYWxhbmNlcy50cmFuc2ZlckFsbCcpIHtcbiAgICByZXN1bHQudG8gPSBTdHJpbmcoYXJncy5kZXN0ID8/ICcnKTtcbiAgICByZXN1bHQua2VlcEFsaXZlID0gQm9vbGVhbihhcmdzLmtlZXBBbGl2ZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdHJhbnNmZXIsIHRyYW5zZmVyS2VlcEFsaXZlLCB0cmFuc2ZlckFsbG93RGVhdGhcbiAgICByZXN1bHQudG8gPSBTdHJpbmcoYXJncy5kZXN0ID8/ICcnKTtcbiAgICByZXN1bHQuYW1vdW50ID0gU3RyaW5nKGFyZ3MudmFsdWUgPz8gJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcHVsYXRlU3Rha2luZ0FjdGl2YXRlRmllbGRzKFxuICByZXN1bHQ6IFR4RGF0YSxcbiAgbWV0aG9kOiBQYXJzZWRNZXRob2QsXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZW5kZXJBZGRyZXNzOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAobWV0aG9kLm5hbWUgPT09ICdib25kRXh0cmEnKSB7XG4gICAgcmVzdWx0LmFtb3VudCA9IFN0cmluZyhhcmdzLnZhbHVlID8/ICcnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBib25kXG4gICAgcmVzdWx0LmNvbnRyb2xsZXIgPSBzZW5kZXJBZGRyZXNzO1xuICAgIHJlc3VsdC5hbW91bnQgPSBTdHJpbmcoYXJncy52YWx1ZSA/PyAnJyk7XG4gICAgcmVzdWx0LnBheWVlID0gU3RyaW5nKGFyZ3MucGF5ZWUgPz8gJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcHVsYXRlQWRkcmVzc0luaXRGaWVsZHMocmVzdWx0OiBUeERhdGEsIG1ldGhvZDogUGFyc2VkTWV0aG9kLCBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBrZXkgPSBgJHttZXRob2QucGFsbGV0fS4ke21ldGhvZC5uYW1lfWA7XG4gIHJlc3VsdC5tZXRob2QgPSBrZXk7XG4gIHJlc3VsdC5wcm94eVR5cGUgPSBTdHJpbmcoYXJncy5wcm94eV90eXBlID8/ICcnKTtcbiAgcmVzdWx0LmRlbGF5ID0gU3RyaW5nKGFyZ3MuZGVsYXkgPz8gJycpO1xuXG4gIGlmIChrZXkgPT09ICdwcm94eS5jcmVhdGVQdXJlJykge1xuICAgIHJlc3VsdC5pbmRleCA9IFN0cmluZyhhcmdzLmluZGV4ID8/ICcnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBhZGRQcm94eSwgcmVtb3ZlUHJveHlcbiAgICByZXN1bHQub3duZXIgPSBTdHJpbmcoYXJncy5kZWxlZ2F0ZSA/PyAnJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwQmF0Y2hDYWxscyhjYWxsczogUGFyc2VkTWV0aG9kW10gfCB1bmRlZmluZWQpOiBCYXRjaENhbGxPYmplY3RbXSB7XG4gIGlmICghY2FsbHMpIHJldHVybiBbXTtcbiAgcmV0dXJuIGNhbGxzLm1hcCgoY2FsbCkgPT4gKHtcbiAgICBjYWxsSW5kZXg6IGAweCR7Y2FsbC5wYWxsZXRJbmRleC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2NhbGwubWV0aG9kSW5kZXgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YCxcbiAgICBhcmdzOiB0cmFuc2Zvcm1CYXRjaENhbGxBcmdzKChjYWxsLmFyZ3MgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgfSkpO1xufVxuXG4vKiogVHJhbnNmb3JtIFdBU00tZGVjb2RlZCBiYXRjaCBjYWxsIGFyZ3MgdG8gbWF0Y2ggdGhlIFBvbGthZG90LmpzIGZvcm1hdCB0aGF0IGNvbnN1bWVycyBleHBlY3QgKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybUJhdGNoQ2FsbEFyZ3MoYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJncykpIHtcbiAgICBpZiAoa2V5ID09PSAnZGVsZWdhdGUnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIE11bHRpQWRkcmVzcyBJZCB2YXJpYW50OiBzdHJpbmcgLT4geyBpZDogc3RyaW5nIH1cbiAgICAgIHJlc3VsdFtrZXldID0geyBpZDogdmFsdWUgfTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3ZhbHVlJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBDb21wYWN0IHUxMjg6IHN0cmluZyAtPiBudW1iZXIgKG1hdGNoZXMgUG9sa2Fkb3QuanMgYmVoYXZpb3IpXG4gICAgICByZXN1bHRba2V5XSA9IE51bWJlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdwYXllZScgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gRW51bSB1bml0IHZhcmlhbnQ6IFwiU3Rha2VkXCIgLT4geyBzdGFrZWQ6IG51bGwgfVxuICAgICAgY29uc3QgdmFyaWFudE5hbWUgPSB2YWx1ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpO1xuICAgICAgcmVzdWx0W2tleV0gPSB7IFt2YXJpYW50TmFtZV06IG51bGwgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==