@uengage.io/platform-sdk 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/wallet/client.d.ts +205 -1
- package/dist/wallet/client.js +390 -2
- package/dist/wallet/index.d.ts +2 -2
- package/dist/wallet/index.js +13 -2
- package/dist/wallet/schema.d.ts +212 -2
- package/dist/wallet/schema.js +1 -1
- package/package.json +1 -1
package/dist/wallet/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.WalletIdentityMismatchError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
|
|
3
|
+
exports.SettlementNotFoundError = exports.CreditIdempotencyConflictError = exports.CreditLineHasOutstandingError = exports.CreditLineNotFoundError = exports.CreditTopUpRefusedError = exports.CreditCurrencyMismatchError = exports.CreditCurrencyConflictError = exports.CreditCorrectionReasonRequiredError = exports.CreditOverrideRefusedError = exports.CreditBreakupRequiredError = exports.CreditLimitReachedError = exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.WalletIdentityMismatchError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
|
|
4
4
|
exports.createWalletClient = createWalletClient;
|
|
5
5
|
const config_1 = require("../config");
|
|
6
6
|
const http_1 = require("../http");
|
|
@@ -78,6 +78,197 @@ class WalletNotFoundError extends WalletApiError {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
exports.WalletNotFoundError = WalletNotFoundError;
|
|
81
|
+
/**
|
|
82
|
+
* The charge would exceed the merchant's credit limit; nothing was moved
|
|
83
|
+
* (HTTP 409).
|
|
84
|
+
*
|
|
85
|
+
* Distinct from `InsufficientBalanceError` because the merchant's next
|
|
86
|
+
* step is different — settle an invoice or talk to their account
|
|
87
|
+
* manager, not top up. The figures also separate two cases that share
|
|
88
|
+
* this error and need different copy:
|
|
89
|
+
*
|
|
90
|
+
* - `availableMinor === 0` — the limit is used up.
|
|
91
|
+
* - `availableMinor > 0` — this one charge is larger than what is
|
|
92
|
+
* left, which can happen at any utilisation. Telling that merchant
|
|
93
|
+
* their "credit limit is reached" would be wrong.
|
|
94
|
+
* - `availableMinor === undefined` — the response carried no figures
|
|
95
|
+
* (a trimmed or proxied body). Fall back to generic copy; do not
|
|
96
|
+
* read it as zero, which is the sentinel above.
|
|
97
|
+
*
|
|
98
|
+
* And a third the fields cannot distinguish on their own: consumption
|
|
99
|
+
* spans months, so a merchant can be at their ceiling purely because
|
|
100
|
+
* older invoices are unpaid. `getCreditLine()` tells you which.
|
|
101
|
+
*/
|
|
102
|
+
class CreditLimitReachedError extends WalletApiError {
|
|
103
|
+
limitMinor;
|
|
104
|
+
consumedMinor;
|
|
105
|
+
availableMinor;
|
|
106
|
+
requestedMinor;
|
|
107
|
+
constructor(figures, body) {
|
|
108
|
+
super(409, body);
|
|
109
|
+
this.name = 'CreditLimitReachedError';
|
|
110
|
+
this.limitMinor = figures.limitMinor;
|
|
111
|
+
this.consumedMinor = figures.consumedMinor;
|
|
112
|
+
this.availableMinor = figures.availableMinor;
|
|
113
|
+
this.requestedMinor = figures.requestedMinor;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.CreditLimitReachedError = CreditLimitReachedError;
|
|
117
|
+
/**
|
|
118
|
+
* A charge on a credit-line merchant arrived without its GST split
|
|
119
|
+
* (HTTP 400).
|
|
120
|
+
*
|
|
121
|
+
* Consumption is tracked net of GST, so `breakup` is required rather
|
|
122
|
+
* than a rate being inferred. If you hit this, the caller is sending
|
|
123
|
+
* gross-only amounts and needs to send `breakup` — the same split it
|
|
124
|
+
* almost certainly already computes.
|
|
125
|
+
*/
|
|
126
|
+
class CreditBreakupRequiredError extends WalletApiError {
|
|
127
|
+
constructor(body) {
|
|
128
|
+
super(400, body);
|
|
129
|
+
this.name = 'CreditBreakupRequiredError';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.CreditBreakupRequiredError = CreditBreakupRequiredError;
|
|
133
|
+
/** `allowNegative` was passed for a credit-line merchant (HTTP 400). */
|
|
134
|
+
class CreditOverrideRefusedError extends WalletApiError {
|
|
135
|
+
constructor(body) {
|
|
136
|
+
super(400, body);
|
|
137
|
+
this.name = 'CreditOverrideRefusedError';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.CreditOverrideRefusedError = CreditOverrideRefusedError;
|
|
141
|
+
/**
|
|
142
|
+
* A re-settlement changed an invoice's figures without saying why
|
|
143
|
+
* (HTTP 400).
|
|
144
|
+
*
|
|
145
|
+
* Re-settling a REVERSED invoice with different figures is how a settled
|
|
146
|
+
* amount is corrected, so the service does not refuse it the way it
|
|
147
|
+
* refuses a conflicting first settlement. But it releases against the
|
|
148
|
+
* merchant's whole outstanding consumption rather than the invoice's own
|
|
149
|
+
* amount, so a mistyped figure can hand back far more than the invoice
|
|
150
|
+
* held — and a deliberate correction can say what it is correcting where
|
|
151
|
+
* a replayed webhook cannot. Pass `reason` and retry. Re-settling with
|
|
152
|
+
* the SAME figures needs none.
|
|
153
|
+
*/
|
|
154
|
+
class CreditCorrectionReasonRequiredError extends WalletApiError {
|
|
155
|
+
previousNetMinor;
|
|
156
|
+
constructor(
|
|
157
|
+
/** What the invoice was previously settled for, in minor units. */
|
|
158
|
+
previousNetMinor, body) {
|
|
159
|
+
super(400, body);
|
|
160
|
+
this.previousNetMinor = previousNetMinor;
|
|
161
|
+
this.name = 'CreditCorrectionReasonRequiredError';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.CreditCorrectionReasonRequiredError = CreditCorrectionReasonRequiredError;
|
|
165
|
+
/**
|
|
166
|
+
* A limit change named a currency the credit line is not denominated in
|
|
167
|
+
* (HTTP 409).
|
|
168
|
+
*
|
|
169
|
+
* The line's currency is fixed when it is created, because it sets the
|
|
170
|
+
* exponent every stored figure is already scaled by — changing it would
|
|
171
|
+
* re-denominate the limit and the consumption without touching either
|
|
172
|
+
* number. Re-denominating a live line is a migration, not a field
|
|
173
|
+
* update, so this is not something a caller can retry past: send the
|
|
174
|
+
* currency the line already carries.
|
|
175
|
+
*/
|
|
176
|
+
class CreditCurrencyConflictError extends WalletApiError {
|
|
177
|
+
storedCurrency;
|
|
178
|
+
requestedCurrency;
|
|
179
|
+
constructor(storedCurrency, requestedCurrency, body) {
|
|
180
|
+
super(409, body);
|
|
181
|
+
this.storedCurrency = storedCurrency;
|
|
182
|
+
this.requestedCurrency = requestedCurrency;
|
|
183
|
+
this.name = 'CreditCurrencyConflictError';
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.CreditCurrencyConflictError = CreditCurrencyConflictError;
|
|
187
|
+
/**
|
|
188
|
+
* The merchant's credit line and the wallet the charge routed to are in
|
|
189
|
+
* different currencies (HTTP 409).
|
|
190
|
+
*
|
|
191
|
+
* `amountMinor` and `breakup` carry no currency of their own — they are
|
|
192
|
+
* read with the exponent of the resolved wallet — so when the two
|
|
193
|
+
* disagree there is no reading of them that is right for both, and the
|
|
194
|
+
* service refuses rather than mis-scaling by a factor of ten or a
|
|
195
|
+
* hundred. Not caller-fixable: it means the merchant's routing and their
|
|
196
|
+
* credit line disagree, which is an ops/data problem.
|
|
197
|
+
*/
|
|
198
|
+
class CreditCurrencyMismatchError extends WalletApiError {
|
|
199
|
+
constructor(body) {
|
|
200
|
+
super(409, body);
|
|
201
|
+
this.name = 'CreditCurrencyMismatchError';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.CreditCurrencyMismatchError = CreditCurrencyMismatchError;
|
|
205
|
+
/**
|
|
206
|
+
* A plain top-up was sent for a credit-line merchant (HTTP 400).
|
|
207
|
+
*
|
|
208
|
+
* These merchants have no balance to top up: `wallet_balance` is the
|
|
209
|
+
* fiction the credit line replaces and is deliberately frozen, so the
|
|
210
|
+
* write would move nothing while appearing to succeed. Credit is handed
|
|
211
|
+
* back by settling an invoice (`settleInvoice`), never by crediting the
|
|
212
|
+
* wallet. A genuine refund is accepted — send it as `reversalOf` or
|
|
213
|
+
* `isRefund` and it releases the credit the original charge consumed.
|
|
214
|
+
*/
|
|
215
|
+
class CreditTopUpRefusedError extends WalletApiError {
|
|
216
|
+
constructor(body) {
|
|
217
|
+
super(400, body);
|
|
218
|
+
this.name = 'CreditTopUpRefusedError';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.CreditTopUpRefusedError = CreditTopUpRefusedError;
|
|
222
|
+
/**
|
|
223
|
+
* The merchant is not on the credit line (HTTP 404).
|
|
224
|
+
*
|
|
225
|
+
* The normal state for a prepaid merchant, so a widget should treat it
|
|
226
|
+
* as "show the wallet balance instead", not as an error.
|
|
227
|
+
*/
|
|
228
|
+
class CreditLineNotFoundError extends WalletApiError {
|
|
229
|
+
constructor(body) {
|
|
230
|
+
super(404, body);
|
|
231
|
+
this.name = 'CreditLineNotFoundError';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.CreditLineNotFoundError = CreditLineNotFoundError;
|
|
235
|
+
/**
|
|
236
|
+
* `enabled: false` was refused because the merchant still owes for the
|
|
237
|
+
* credit line (HTTP 409).
|
|
238
|
+
*
|
|
239
|
+
* Disabling moves a merchant back to a wallet balance, and doing that
|
|
240
|
+
* with consumption outstanding abandons it. Show `consumedMinor` and
|
|
241
|
+
* tell the operator to settle first — or, if the intent was to stop the
|
|
242
|
+
* merchant trading rather than to move them off the model, set
|
|
243
|
+
* `limitMinor: 0`, which blocks every charge and keeps the balance.
|
|
244
|
+
*/
|
|
245
|
+
class CreditLineHasOutstandingError extends WalletApiError {
|
|
246
|
+
consumedMinor;
|
|
247
|
+
gstAccruedMinor;
|
|
248
|
+
constructor(consumedMinor, gstAccruedMinor, body) {
|
|
249
|
+
super(409, body);
|
|
250
|
+
this.name = 'CreditLineHasOutstandingError';
|
|
251
|
+
this.consumedMinor = consumedMinor;
|
|
252
|
+
this.gstAccruedMinor = gstAccruedMinor;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
exports.CreditLineHasOutstandingError = CreditLineHasOutstandingError;
|
|
256
|
+
/** A limit `referenceId` or an invoice was reused for different figures (HTTP 409). */
|
|
257
|
+
class CreditIdempotencyConflictError extends WalletApiError {
|
|
258
|
+
constructor(body) {
|
|
259
|
+
super(409, body);
|
|
260
|
+
this.name = 'CreditIdempotencyConflictError';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
exports.CreditIdempotencyConflictError = CreditIdempotencyConflictError;
|
|
264
|
+
/** No settlement to reverse for that invoice (HTTP 404). */
|
|
265
|
+
class SettlementNotFoundError extends WalletApiError {
|
|
266
|
+
constructor(body) {
|
|
267
|
+
super(404, body);
|
|
268
|
+
this.name = 'SettlementNotFoundError';
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
exports.SettlementNotFoundError = SettlementNotFoundError;
|
|
81
272
|
const BUSINESS_ID_RE = /^business:(\d+)$/;
|
|
82
273
|
/** Parse a typed wallet id (`"business:8841"`) into the numeric business id. */
|
|
83
274
|
function parseBusinessId(id) {
|
|
@@ -91,10 +282,16 @@ function parseBusinessId(id) {
|
|
|
91
282
|
function walletError(status, body) {
|
|
92
283
|
let code;
|
|
93
284
|
let balanceMinor;
|
|
285
|
+
let credit = {};
|
|
286
|
+
let outstanding = {};
|
|
287
|
+
let correction = {};
|
|
94
288
|
try {
|
|
95
289
|
const parsed = JSON.parse(body);
|
|
96
290
|
code = parsed.error;
|
|
97
291
|
balanceMinor = parsed.balanceMinor;
|
|
292
|
+
credit = parsed;
|
|
293
|
+
outstanding = parsed;
|
|
294
|
+
correction = parsed;
|
|
98
295
|
}
|
|
99
296
|
catch {
|
|
100
297
|
// non-JSON body — fall through to a generic error
|
|
@@ -102,6 +299,48 @@ function walletError(status, body) {
|
|
|
102
299
|
if (status === 409 && code === 'insufficient_balance') {
|
|
103
300
|
return new InsufficientBalanceError(balanceMinor ?? 0, body);
|
|
104
301
|
}
|
|
302
|
+
if (status === 409 && code === 'credit_limit_reached') {
|
|
303
|
+
// NOT `?? 0`. `availableMinor === 0` is the documented sentinel for
|
|
304
|
+
// "the limit is used up", and defaulting to it made a trimmed or
|
|
305
|
+
// proxied body indistinguishable from that — producing exactly the
|
|
306
|
+
// wrong merchant copy in the one place this error type exists to get
|
|
307
|
+
// right. Absent stays absent, which also matches PHP's
|
|
308
|
+
// `creditFigures()`, so the two SDKs agree on the rule.
|
|
309
|
+
return new CreditLimitReachedError({
|
|
310
|
+
limitMinor: credit.limitMinor,
|
|
311
|
+
consumedMinor: credit.consumedMinor,
|
|
312
|
+
availableMinor: credit.availableMinor,
|
|
313
|
+
requestedMinor: credit.requestedMinor,
|
|
314
|
+
}, body);
|
|
315
|
+
}
|
|
316
|
+
if (status === 400 && code === 'credit_breakup_required') {
|
|
317
|
+
return new CreditBreakupRequiredError(body);
|
|
318
|
+
}
|
|
319
|
+
if (status === 400 && code === 'credit_override_refused') {
|
|
320
|
+
return new CreditOverrideRefusedError(body);
|
|
321
|
+
}
|
|
322
|
+
if (status === 400 && code === 'credit_top_up_refused') {
|
|
323
|
+
return new CreditTopUpRefusedError(body);
|
|
324
|
+
}
|
|
325
|
+
if (status === 400 && code === 'credit_correction_reason_required') {
|
|
326
|
+
return new CreditCorrectionReasonRequiredError(correction.previousNetMinor, body);
|
|
327
|
+
}
|
|
328
|
+
if (status === 409 && code === 'credit_currency_conflict') {
|
|
329
|
+
return new CreditCurrencyConflictError(correction.storedCurrency, correction.requestedCurrency, body);
|
|
330
|
+
}
|
|
331
|
+
if (status === 409 && code === 'credit_currency_mismatch') {
|
|
332
|
+
return new CreditCurrencyMismatchError(body);
|
|
333
|
+
}
|
|
334
|
+
if (status === 409 && code === 'credit_line_has_outstanding') {
|
|
335
|
+
return new CreditLineHasOutstandingError(outstanding.consumedMinor ?? 0, outstanding.gstAccruedMinor ?? 0, body);
|
|
336
|
+
}
|
|
337
|
+
if (status === 409 && code === 'credit_idempotency_conflict') {
|
|
338
|
+
return new CreditIdempotencyConflictError(body);
|
|
339
|
+
}
|
|
340
|
+
if (status === 404 && code === 'credit_line_not_found')
|
|
341
|
+
return new CreditLineNotFoundError(body);
|
|
342
|
+
if (status === 404 && code === 'settlement_not_found')
|
|
343
|
+
return new SettlementNotFoundError(body);
|
|
105
344
|
if (status === 409 && code === 'over_refund')
|
|
106
345
|
return new OverRefundError(body);
|
|
107
346
|
if (status === 409 && code === 'idempotency_conflict')
|
|
@@ -129,6 +368,29 @@ function createWalletClient(input = {}) {
|
|
|
129
368
|
state.setAuth(opts);
|
|
130
369
|
return client;
|
|
131
370
|
},
|
|
371
|
+
async getCreditUtilisation(filter = {}) {
|
|
372
|
+
const p = new URLSearchParams();
|
|
373
|
+
if (filter.minUtilisationBps !== undefined) {
|
|
374
|
+
p.set('minUtilisationBps', String(filter.minUtilisationBps));
|
|
375
|
+
}
|
|
376
|
+
if (filter.band)
|
|
377
|
+
p.set('band', filter.band);
|
|
378
|
+
if (filter.offset !== undefined)
|
|
379
|
+
p.set('offset', String(filter.offset));
|
|
380
|
+
if (filter.limit !== undefined)
|
|
381
|
+
p.set('limit', String(filter.limit));
|
|
382
|
+
const path = '/v1/wallet/credit/utilisation';
|
|
383
|
+
const config = state.resolve();
|
|
384
|
+
const query = p.toString();
|
|
385
|
+
const res = await (0, http_1.sendWithAuthRetry)(config, {
|
|
386
|
+
method: 'GET',
|
|
387
|
+
path,
|
|
388
|
+
url: `${config.baseUrl}${path}${query ? `?${query}` : ''}`,
|
|
389
|
+
});
|
|
390
|
+
if (!res.ok)
|
|
391
|
+
throw walletError(res.status, await res.text());
|
|
392
|
+
return (await res.json());
|
|
393
|
+
},
|
|
132
394
|
getWallet(opts) {
|
|
133
395
|
// Parse eagerly so a malformed id fails fast at the call site,
|
|
134
396
|
// but do NOT resolve the wallet here — that happens on the first
|
|
@@ -141,6 +403,29 @@ function createWalletClient(input = {}) {
|
|
|
141
403
|
p.set('forceChildWallet', 'true');
|
|
142
404
|
return p;
|
|
143
405
|
};
|
|
406
|
+
const getJson = async (path, params) => {
|
|
407
|
+
const config = state.resolve();
|
|
408
|
+
const res = await (0, http_1.sendWithAuthRetry)(config, {
|
|
409
|
+
method: 'GET',
|
|
410
|
+
path,
|
|
411
|
+
url: `${config.baseUrl}${path}?${params.toString()}`,
|
|
412
|
+
});
|
|
413
|
+
if (!res.ok)
|
|
414
|
+
throw walletError(res.status, await res.text());
|
|
415
|
+
return (await res.json());
|
|
416
|
+
};
|
|
417
|
+
const sendJson = async (method, path, payload) => {
|
|
418
|
+
const config = state.resolve();
|
|
419
|
+
const res = await (0, http_1.sendWithAuthRetry)(config, {
|
|
420
|
+
method,
|
|
421
|
+
path,
|
|
422
|
+
url: `${config.baseUrl}${path}`,
|
|
423
|
+
body: JSON.stringify(payload),
|
|
424
|
+
});
|
|
425
|
+
if (!res.ok)
|
|
426
|
+
throw walletError(res.status, await res.text());
|
|
427
|
+
return (await res.json());
|
|
428
|
+
};
|
|
144
429
|
const postTransaction = async (type, body) => {
|
|
145
430
|
const path = '/v1/wallet/transactions';
|
|
146
431
|
// The wallet identity is exactly-one-of server-side, so an explicit
|
|
@@ -159,6 +444,63 @@ function createWalletClient(input = {}) {
|
|
|
159
444
|
return (await res.json());
|
|
160
445
|
};
|
|
161
446
|
const wallet = {
|
|
447
|
+
/**
|
|
448
|
+
* BALANCE FIRST, deliberately, and the order is the whole design.
|
|
449
|
+
*
|
|
450
|
+
* `getBalance()` carries `source`, so for any merchant who has a
|
|
451
|
+
* wallet at all it settles prepaid-vs-credit without an
|
|
452
|
+
* exception. The alternative — call `getCreditLine()` and catch
|
|
453
|
+
* its 404 — makes the *normal* state of a prepaid merchant an
|
|
454
|
+
* error: a 404 in the network tab and a throw in the logs on
|
|
455
|
+
* every dashboard load, for nothing being wrong.
|
|
456
|
+
*
|
|
457
|
+
* It also costs less where it matters. Most merchants are
|
|
458
|
+
* prepaid, and for them this is ONE request: the balance is both
|
|
459
|
+
* the answer and the data. Only a credit merchant pays a second
|
|
460
|
+
* round trip, and only because they have figures a balance cannot
|
|
461
|
+
* carry.
|
|
462
|
+
*
|
|
463
|
+
* `source` absent means a wallet service older than the credit
|
|
464
|
+
* line, which is prepaid by definition — so an old service reads
|
|
465
|
+
* as prepaid rather than throwing.
|
|
466
|
+
*
|
|
467
|
+
* WHAT THIS DOES NOT SWALLOW. `getBalance()` is not a guaranteed
|
|
468
|
+
* 200: it answers `WalletNotFoundError` when no wallet document
|
|
469
|
+
* exists for the resolved identity, and `UnresolvableWalletError`
|
|
470
|
+
* when routing cannot name one. Both propagate, because both mean
|
|
471
|
+
* there is genuinely nothing to render — reporting `prepaid` with
|
|
472
|
+
* a zero balance would invent a wallet.
|
|
473
|
+
*
|
|
474
|
+
* CAPABILITIES. `wallet.balance:read` covers a prepaid merchant.
|
|
475
|
+
* A credit merchant needs `wallet.credit:read` as well, and a
|
|
476
|
+
* token holding only the former gets a `WalletApiError` with
|
|
477
|
+
* `status === 403` from the second call — every wallet method
|
|
478
|
+
* throws from that one hierarchy, so branch on `.status` rather
|
|
479
|
+
* than looking for the SDK's `AuthorizationError`, which this
|
|
480
|
+
* namespace does not raise. It is deliberately not caught:
|
|
481
|
+
* falling back to `prepaid` would hand the dashboard a
|
|
482
|
+
* `wallet_balance` that is frozen for exactly these merchants, so
|
|
483
|
+
* it would render a confident, stale, wrong number instead of an
|
|
484
|
+
* error someone can fix by widening the grant.
|
|
485
|
+
*/
|
|
486
|
+
async getOverview() {
|
|
487
|
+
const balance = await wallet.getBalance();
|
|
488
|
+
if (balance.source !== 'credit_line') {
|
|
489
|
+
return { mode: 'prepaid', balance };
|
|
490
|
+
}
|
|
491
|
+
try {
|
|
492
|
+
return { mode: 'credit', balance, creditLine: await wallet.getCreditLine() };
|
|
493
|
+
}
|
|
494
|
+
catch (err) {
|
|
495
|
+
// Ops can disable a credit line between the two calls. Rare,
|
|
496
|
+
// but the honest answer is then "prepaid" rather than an
|
|
497
|
+
// error a dashboard cannot act on.
|
|
498
|
+
if (err instanceof CreditLineNotFoundError) {
|
|
499
|
+
return { mode: 'prepaid', balance };
|
|
500
|
+
}
|
|
501
|
+
throw err;
|
|
502
|
+
}
|
|
503
|
+
},
|
|
162
504
|
async getBalance() {
|
|
163
505
|
const path = '/v1/wallet/balance';
|
|
164
506
|
const config = state.resolve();
|
|
@@ -233,10 +575,56 @@ function createWalletClient(input = {}) {
|
|
|
233
575
|
throw walletError(res.status, await res.text());
|
|
234
576
|
return (await res.json());
|
|
235
577
|
},
|
|
578
|
+
// ── Credit line ──
|
|
579
|
+
//
|
|
580
|
+
// These send `businessId` alone, never `forceChildWallet`: the
|
|
581
|
+
// credit line is resolved to the merchant that owns the business,
|
|
582
|
+
// and which wallet would have paid is not part of that question.
|
|
583
|
+
//
|
|
584
|
+
// `businessId` is spread LAST so the handle's merchant wins. A
|
|
585
|
+
// caller who passes their own `businessId` is naming a different
|
|
586
|
+
// merchant, and honouring it would move a limit or settle an
|
|
587
|
+
// invoice against that one while every log line and error still
|
|
588
|
+
// named this handle's.
|
|
589
|
+
async getCreditLine() {
|
|
590
|
+
return getJson('/v1/wallet/credit', new URLSearchParams({ businessId: String(businessId) }));
|
|
591
|
+
},
|
|
592
|
+
async listCreditEvents(filter = {}) {
|
|
593
|
+
const p = new URLSearchParams({ businessId: String(businessId) });
|
|
594
|
+
if (filter.limit !== undefined)
|
|
595
|
+
p.set('limit', String(filter.limit));
|
|
596
|
+
const page = await getJson('/v1/wallet/credit/events', p);
|
|
597
|
+
// `?? []` rather than a bare `page.events`: the declared type
|
|
598
|
+
// says the key is always there, but the type describes what the
|
|
599
|
+
// service intends to send, not what a proxy, an older
|
|
600
|
+
// deployment or a truncated body actually delivered. Returning
|
|
601
|
+
// `undefined` from a method typed `CreditEvent[]` puts a lie in
|
|
602
|
+
// the caller's hands, and it surfaces as `.map of undefined`
|
|
603
|
+
// inside their render — far from the request that caused it.
|
|
604
|
+
return page.events ?? [];
|
|
605
|
+
},
|
|
606
|
+
setCreditLimit(input) {
|
|
607
|
+
return sendJson('PUT', '/v1/wallet/credit/limit', {
|
|
608
|
+
...input,
|
|
609
|
+
businessId,
|
|
610
|
+
});
|
|
611
|
+
},
|
|
612
|
+
settleInvoice(input) {
|
|
613
|
+
return sendJson('POST', '/v1/wallet/credit/settlements', {
|
|
614
|
+
...input,
|
|
615
|
+
businessId,
|
|
616
|
+
});
|
|
617
|
+
},
|
|
618
|
+
reverseSettlement(input) {
|
|
619
|
+
return sendJson('POST', '/v1/wallet/credit/settlements/reversal', {
|
|
620
|
+
...input,
|
|
621
|
+
businessId,
|
|
622
|
+
});
|
|
623
|
+
},
|
|
236
624
|
};
|
|
237
625
|
return wallet;
|
|
238
626
|
},
|
|
239
627
|
};
|
|
240
628
|
return client;
|
|
241
629
|
}
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0tBLGdEQXFIQztBQXBTRCxzQ0FLbUI7QUFDbkIsa0NBQTRDO0FBd0Q1QyxNQUFhLGNBQWUsU0FBUSxLQUFLO0lBQzlCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsd0NBVUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBYSx3QkFBeUIsU0FBUSxjQUFjO0lBQ2pELFlBQVksQ0FBUztJQUM5QixZQUFZLFlBQW9CLEVBQUUsSUFBWTtRQUM1QyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCw4RUFBOEU7QUFDOUUsTUFBYSxlQUFnQixTQUFRLGNBQWM7SUFDakQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLG9CQUFxQixTQUFRLGNBQWM7SUFDdEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxD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TSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzdELE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBc0IsQ0FBQztnQkFDakQsQ0FBQzthQUNGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNlbmRXaXRoQXV0aFJldHJ5IH0gZnJvbSAnLi4vaHR0cCc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWRpdElucHV0LFxuICBDdXJyZW5jeSxcbiAgRGViaXRJbnB1dCxcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcixcbiAgVHJhbnNhY3Rpb25QYWdlLFxuICBUcmFuc2FjdGlvblJlc3VsdCxcbiAgV2FsbGV0QmFsYW5jZSxcbiAgV2FsbGV0SW5zdGFuY2UsXG4gIFdhbGxldFRyYW5zYWN0aW9uLFxufSBmcm9tICcuL3NjaGVtYSc7XG5cbi8qKlxuICogQSBoYW5kbGUgdG8gb25lIGJ1c2luZXNzIHdhbGxldC4gQ2hlYXAgdG8gY3JlYXRlIOKAlCBgZ2V0V2FsbGV0KC4uLilgXG4gKiBkb2VzIG5vIEkvTy4gVGhlIHdhbGxldCBpcyByZXNvbHZlZCBzZXJ2ZXItc2lkZSBvbiB0aGUgZmlyc3RcbiAqIG9wZXJhdGlvbiwgc28gYFVucmVzb2x2YWJsZVdhbGxldEVycm9yYCAvIGBXYWxsZXROb3RGb3VuZEVycm9yYFxuICogc3VyZmFjZSBmcm9tIHRoZSBvcGVyYXRpb24sIG5vdCBmcm9tIGBnZXRXYWxsZXQoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0IHtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2JhbGFuY2Ug4oCUIHJlc29sdmVzIHRoZSB3YWxsZXQgYW5kIHJldHVybnMgaXRzIGJhbGFuY2UgKyBjdXJyZW5jeS4gKi9cbiAgZ2V0QmFsYW5jZSgpOiBQcm9taXNlPFdhbGxldEJhbGFuY2U+O1xuICAvKiogR0VUIC92MS93YWxsZXQvaW5zdGFuY2Ug4oCUIHdhbGxldCBpZGVudGl0eSArIGN1cnJlbmN5LCB3aXRob3V0IHRoZSBiYWxhbmNlLiAqL1xuICBnZXRJbnN0YW5jZSgpOiBQcm9taXNlPFdhbGxldEluc3RhbmNlPjtcbiAgLyoqIFRoZSB3YWxsZXQncyBjdXJyZW5jeSBge2NvZGUsIHN5bWJvbH1gIChhIHNsaWNlIG9mIGdldEluc3RhbmNlKCkpLiAqL1xuICBnZXRDdXJyZW5jeSgpOiBQcm9taXNlPEN1cnJlbmN5PjtcbiAgLyoqXG4gICAqIFBPU1QgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMgKHR5cGU9ZGViaXQpLiBJZGVtcG90ZW50IG9uXG4gICAqIGByZWZlcmVuY2VJZGAuIFBhc3MgYHdhbGxldGAgdG8gY2hhcmdlIGEgd2FsbGV0IG90aGVyIHRoYW4gdGhlIG9uZVxuICAgKiB0aGlzIGhhbmRsZSByb3V0ZXMgdG8uXG4gICAqL1xuICBkZWJpdChpbnB1dDogRGViaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKipcbiAgICogUE9TVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyAodHlwZT1jcmVkaXQpLiBQYXNzIGByZXZlcnNhbE9mYCBmb3IgYVxuICAgKiByZWZ1bmQgY2FwcGVkIGJ5IHRoZSBvcmlnaW5hbCBkZWJpdCwgb3IgYGlzUmVmdW5kYCBmb3Igb25lIGNvbXB1dGVkXG4gICAqIGluZGVwZW5kZW50bHkgb2YgaXQuXG4gICAqL1xuICBjcmVkaXQoaW5wdXQ6IENyZWRpdElucHV0KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMg4oCUIG5ld2VzdC1maXJzdCwga2V5c2V0LXBhZ2luYXRlZC4gKi9cbiAgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXI/OiBMaXN0VHJhbnNhY3Rpb25zRmlsdGVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblBhZ2U+O1xuICAvKiogR0VUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zLzppZCDigJQgc2NvcGVkIHRvIHRoaXMgd2FsbGV0LiAqL1xuICBnZXRUcmFuc2FjdGlvbihpZDogc3RyaW5nKTogUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogV2FsbGV0Q2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFdhbGxldENsaWVudDtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFuZGxlIHRvIGEgYnVzaW5lc3Mgd2FsbGV0LiBTeW5jaHJvbm91cyBhbmQgSS9PLWZyZWUg4oCUIGl0XG4gICAqIG9ubHkgcGFyc2VzIGBpZGAuIFJlcXVpcmVzIGEgc2VydmljZSB0b2tlbiBjYXJyeWluZyB0aGUgcmVsZXZhbnRcbiAgICogYHdhbGxldC4qYCBzY29wZSBmb3IgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHJldHVybmVkIGhhbmRsZS5cbiAgICovXG4gIGdldFdhbGxldChvcHRzOiBHZXRXYWxsZXRPcHRpb25zKTogV2FsbGV0O1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0QXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB3YWxsZXQgQVBJICR7c3RhdHVzfTogJHtib2R5fWApO1xuICAgIHRoaXMubmFtZSA9ICdXYWxsZXRBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG4vKiogQSBkZWJpdCB3b3VsZCBvdmVyZHJhdyB0aGUgd2FsbGV0OyBub3RoaW5nIHdhcyBtb3ZlZCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudEJhbGFuY2VFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGJhbGFuY2VNaW5vcjogbnVtYmVyLCBib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3InO1xuICAgIHRoaXMuYmFsYW5jZU1pbm9yID0gYmFsYW5jZU1pbm9yO1xuICB9XG59XG5cbi8qKiBBIHJlZnVuZCB3b3VsZCBwdXNoIHRvdGFsIHJldmVyc2FscyBwYXN0IHRoZSBvcmlnaW5hbCBkZWJpdCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJSZWZ1bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnT3ZlclJlZnVuZEVycm9yJztcbiAgfVxufVxuXG4vKiogYHJldmVyc2FsT2ZgIGRvZXNuJ3QgcmVmZXJlbmNlIGEgdmFsaWQgZGViaXQgb24gdGhpcyB3YWxsZXQgKEhUVFAgNDIyKS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUmV2ZXJzYWxFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDIyLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJldmVyc2FsRXJyb3InO1xuICB9XG59XG5cbi8qKiBBIGByZWZlcmVuY2VJZGAgd2FzIHJldXNlZCB3aXRoIGEgZGlmZmVyZW50IGFtb3VudC90eXBlL3NlcnZpY2UgKEhUVFAgNDA5KS4gKi9cbmV4cG9ydCBjbGFzcyBJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0lkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGB3YWxsZXRgIG92ZXJyaWRlIG5hbWVkIGEgYHBhcmVudEJ1c2luZXNzSWRgIHRoZSB3YWxsZXQgZG9jdW1lbnRcbiAqIGNvbnRyYWRpY3RzIChIVFRQIDQwOSkuIE5vdGhpbmcgd2FzIG1vdmVkIOKAlCB0aGUgd3JpdGUgaXMgcmVmdXNlZCByYXRoZXJcbiAqIHRoYW4gY2hhcmdpbmcgdGhlIHJpZ2h0IHdhbGxldCB1bmRlciB0aGUgd3JvbmcgaWRlbnRpdHksIHdoaWNoIHdvdWxkXG4gKiBtaXNhdHRyaWJ1dGUgdGhlIGxlZGdlciByb3cgYW5kIHNwbGl0IGl0cyBpZGVtcG90ZW5jeSBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0SWRlbnRpdHlNaXNtYXRjaEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShib2R5KSBhcyB7IGVycm9yPzogc3RyaW5nOyBiYWxhbmNlTWlub3I/OiBudW1iZXIgfTtcbiAgICBjb2RlID0gcGFyc2VkLmVycm9yO1xuICAgIGJhbGFuY2VNaW5vciA9IHBhcnNlZC5iYWxhbmNlTWlub3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vbi1KU09OIGJvZHkg4oCUIGZhbGwgdGhyb3VnaCB0byBhIGdlbmVyaWMgZXJyb3JcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ2luc3VmZmljaWVudF9iYWxhbmNlJykge1xuICAgIHJldHVybiBuZXcgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yKGJhbGFuY2VNaW5vciA/PyAwLCBib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ292ZXJfcmVmdW5kJykgcmV0dXJuIG5ldyBPdmVyUmVmdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaWRlbXBvdGVuY3lfY29uZmxpY3QnKSByZXR1cm4gbmV3IElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICd3YWxsZXRfaWRlbnRpdHlfbWlzbWF0Y2gnKSB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXRJZGVudGl0eU1pc21hdGNoRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICdpbnZhbGlkX3JldmVyc2FsJykgcmV0dXJuIG5ldyBJbnZhbGlkUmV2ZXJzYWxFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICd1bnJlc29sdmFibGVfd2FsbGV0JykgcmV0dXJuIG5ldyBVbnJlc29sdmFibGVXYWxsZXRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbmV3IFdhbGxldE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIHJldHVybiBuZXcgV2FsbGV0QXBpRXJyb3Ioc3RhdHVzLCBib2R5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhbGxldENsaWVudChpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9KTogV2FsbGV0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGNvbnN0IGNsaWVudDogV2FsbGV0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgZ2V0V2FsbGV0KG9wdHMpIHtcbiAgICAgIC8vIFBhcnNlIGVhZ2VybHkgc28gYSBtYWxmb3JtZWQgaWQgZmFpbHMgZmFzdCBhdCB0aGUgY2FsbCBzaXRlLFxuICAgICAgLy8gYnV0IGRvIE5PVCByZXNvbHZlIHRoZSB3YWxsZXQgaGVyZSDigJQgdGhhdCBoYXBwZW5zIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gb3BlcmF0aW9uIGFnYWluc3QgdGhlIGhhbmRsZS5cbiAgICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBwYXJzZUJ1c2luZXNzSWQob3B0cy5pZCk7XG4gICAgICBjb25zdCBmb3JjZUNoaWxkV2FsbGV0ID0gb3B0cy5mb3JjZUNoaWxkV2FsbGV0ID09PSB0cnVlO1xuXG4gICAgICBjb25zdCBiYXNlUGFyYW1zID0gKCk6IFVSTFNlYXJjaFBhcmFtcyA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pO1xuICAgICAgICBpZiAoZm9yY2VDaGlsZFdhbGxldCkgcC5zZXQoJ2ZvcmNlQ2hpbGRXYWxsZXQnLCAndHJ1ZScpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBvc3RUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogJ2RlYml0JyB8ICdjcmVkaXQnLFxuICAgICAgICBib2R5OiBEZWJpdElucHV0IHwgQ3JlZGl0SW5wdXQsXG4gICAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC90cmFuc2FjdGlvbnMnO1xuICAgICAgICAvLyBUaGUgd2FsbGV0IGlkZW50aXR5IGlzIGV4YWN0bHktb25lLW9mIHNlcnZlci1zaWRlLCBzbyBhbiBleHBsaWNpdFxuICAgICAgICAvLyBgd2FsbGV0YCBvdmVycmlkZSBSRVBMQUNFUyB0aGlzIGhhbmRsZSdzIGJ1c2luZXNzSWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gdHJhdmVsbGluZyBhbG9uZ3NpZGUgaXQg4oCUIHNlbmRpbmcgYm90aCBpcyBhIDQwMC5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGJvZHkud2FsbGV0ID8geyB0eXBlLCAuLi5ib2R5IH0gOiB7IGJ1c2luZXNzSWQsIGZvcmNlQ2hpbGRXYWxsZXQsIHR5cGUsIC4uLmJvZHkgfSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofWAsXG4gICAgICAgICAgYm9keTogcGF5bG9hZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdhbGxldDogV2FsbGV0ID0ge1xuICAgICAgICBhc3luYyBnZXRCYWxhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9iYWxhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2luc3RhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0SW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldEN1cnJlbmN5KCkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LmdldEluc3RhbmNlKCkpLmN1cnJlbmN5O1xuICAgICAgICB9LFxuICAgICAgICBkZWJpdChib2R5KSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3RUcmFuc2FjdGlvbignZGViaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGl0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdjcmVkaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXIgPSB7fSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBiYXNlUGFyYW1zKCk7XG4gICAgICAgICAgaWYgKGZpbHRlci50eXBlKSBwLnNldCgndHlwZScsIGZpbHRlci50eXBlKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmZyb20pIHAuc2V0KCdmcm9tJywgZmlsdGVyLmZyb20pO1xuICAgICAgICAgIGlmIChmaWx0ZXIudG8pIHAuc2V0KCd0bycsIGZpbHRlci50byk7XG4gICAgICAgICAgaWYgKGZpbHRlci5zZXJ2aWNlICE9PSB1bmRlZmluZWQpIHAuc2V0KCdzZXJ2aWNlJywgU3RyaW5nKGZpbHRlci5zZXJ2aWNlKSk7XG4gICAgICAgICAgaWYgKGZpbHRlci5yZWZlcmVuY2VJZCkgcC5zZXQoJ3JlZmVyZW5jZUlkJywgZmlsdGVyLnJlZmVyZW5jZUlkKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnRhZykgcC5zZXQoJ3RhZycsIGZpbHRlci50YWcpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuY3Vyc29yKSBwLnNldCgnY3Vyc29yJywgZmlsdGVyLmN1cnNvcik7XG4gICAgICAgICAgaWYgKGZpbHRlci5saW1pdCAhPT0gdW5kZWZpbmVkKSBwLnNldCgnbGltaXQnLCBTdHJpbmcoZmlsdGVyLmxpbWl0KSk7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyc7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblBhZ2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uKGlkKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy8ke2lkfWA7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtiYXNlUGFyYW1zKCkudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFdhbGxldFRyYW5zYWN0aW9uO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB3YWxsZXQ7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gY2xpZW50O1xufVxuIl19
|
|
630
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaWhCQSxnREE2UUM7QUE5eEJELHNDQUttQjtBQUNuQixrQ0FBNEM7QUFzSTVDLE1BQWEsY0FBZSxTQUFRLEtBQUs7SUFDOUIsTUFBTSxDQUFTO0lBQ2YsSUFBSSxDQUFTO0lBRXRCLFlBQVksTUFBYyxFQUFFLElBQVk7UUFDdEMsS0FBSyxDQUFDLGNBQWMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFWRCx3Q0FVQztBQUVELHVFQUF1RTtBQUN2RSxNQUFhLHdCQUF5QixTQUFRLGNBQWM7SUFDakQsWUFBWSxDQUFTO0lBQzlCLFlBQVksWUFBb0IsRUFBRSxJQUFZO1FBQzVDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFQRCw0REFPQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLGVBQWdCLFNBQVEsY0FBYztJQUNqRCxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUxELDBDQUtDO0FBRUQsOEVBQThFO0FBQzlFLE1BQWEsb0JBQXFCLFNBQVEsY0FBYztJQUN0RCxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJ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QUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDckUsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQTZCLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN0Riw4REFBOEQ7b0JBQzlELGdFQUFnRTtvQkFDaEUsc0RBQXNEO29CQUN0RCwrREFBK0Q7b0JBQy9ELGdFQUFnRTtvQkFDaEUsNkRBQTZEO29CQUM3RCw2REFBNkQ7b0JBQzdELE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQzNCLENBQUM7Z0JBQ0QsY0FBYyxDQUFDLEtBQUs7b0JBQ2xCLE9BQU8sUUFBUSxDQUF1QixLQUFLLEVBQUUseUJBQXlCLEVBQUU7d0JBQ3RFLEdBQUcsS0FBSzt3QkFDUixVQUFVO3FCQUNYLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELGFBQWEsQ0FBQyxLQUFLO29CQUNqQixPQUFPLFFBQVEsQ0FBc0IsTUFBTSxFQUFFLCtCQUErQixFQUFFO3dCQUM1RSxHQUFHLEtBQUs7d0JBQ1IsVUFBVTtxQkFDWCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxpQkFBaUIsQ0FBQyxLQUFLO29CQUNyQixPQUFPLFFBQVEsQ0FBc0IsTUFBTSxFQUFFLHdDQUF3QyxFQUFFO3dCQUNyRixHQUFHLEtBQUs7d0JBQ1IsVUFBVTtxQkFDWCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQzthQUNGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNlbmRXaXRoQXV0aFJldHJ5IH0gZnJvbSAnLi4vaHR0cCc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWRpdEV2ZW50LFxuICBDcmVkaXRJbnB1dCxcbiAgQ3JlZGl0TGluZSxcbiAgQ3JlZGl0VXRpbGlzYXRpb25GaWx0ZXIsXG4gIENyZWRpdFV0aWxpc2F0aW9uUGFnZSxcbiAgQ3VycmVuY3ksXG4gIERlYml0SW5wdXQsXG4gIEdldFdhbGxldE9wdGlvbnMsXG4gIExpc3RDcmVkaXRFdmVudHNGaWx0ZXIsXG4gIExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIsXG4gIFJldmVyc2VTZXR0bGVtZW50SW5wdXQsXG4gIFNldENyZWRpdExpbWl0SW5wdXQsXG4gIFNldENyZWRpdExpbWl0UmVzdWx0LFxuICBTZXR0bGVJbnZvaWNlSW5wdXQsXG4gIFNldHRsZUludm9pY2VSZXN1bHQsXG4gIFRyYW5zYWN0aW9uUGFnZSxcbiAgVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFdhbGxldEJhbGFuY2UsXG4gIFdhbGxldEluc3RhbmNlLFxuICBXYWxsZXRPdmVydmlldyxcbiAgV2FsbGV0VHJhbnNhY3Rpb24sXG59IGZyb20gJy4vc2NoZW1hJztcblxuLyoqXG4gKiBBIGhhbmRsZSB0byBvbmUgYnVzaW5lc3Mgd2FsbGV0LiBDaGVhcCB0byBjcmVhdGUg4oCUIGBnZXRXYWxsZXQoLi4uKWBcbiAqIGRvZXMgbm8gSS9PLiBUaGUgd2FsbGV0IGlzIHJlc29sdmVkIHNlcnZlci1zaWRlIG9uIHRoZSBmaXJzdFxuICogb3BlcmF0aW9uLCBzbyBgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3JgIC8gYFdhbGxldE5vdEZvdW5kRXJyb3JgXG4gKiBzdXJmYWNlIGZyb20gdGhlIG9wZXJhdGlvbiwgbm90IGZyb20gYGdldFdhbGxldCgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAvKipcbiAgICogV0hJQ0ggTU9ERUwgSVMgVEhJUyBNRVJDSEFOVCBPTiDigJQgY2FsbCB0aGlzIGZpcnN0LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgZGlzY3JpbWluYXRlZCB1bmlvbiBvbiBgbW9kZWAsIHNvIGEgZGFzaGJvYXJkIHNldHRsZXNcbiAgICogXCJ3YWxsZXQgYmFsYW5jZSBvciBjcmVkaXQgbGluZT9cIiBmcm9tIGEgdmFsdWUgcmF0aGVyIHRoYW4gYnlcbiAgICogY2F0Y2hpbmcgYSA0MDQsIGFuZCBUeXBlU2NyaXB0IG5hcnJvd3MgdGhlIHJlc3QgZm9yIHlvdTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgbyA9IGF3YWl0IHdhbGxldC5nZXRPdmVydmlldygpO1xuICAgKiBpZiAoby5tb2RlID09PSAnY3JlZGl0JykgcmVuZGVyQ3JlZGl0V2lkZ2V0KG8uY3JlZGl0TGluZSk7XG4gICAqIGVsc2UgcmVuZGVyV2FsbGV0UGFuZWwoby5iYWxhbmNlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIE9uZSByZXF1ZXN0IGZvciBhIHByZXBhaWQgbWVyY2hhbnQsIHR3byBmb3IgYSBjcmVkaXQgb25lLCBhbmQgbmV2ZXJcbiAgICogYSA0MDQgb24gdGhlIGhhcHB5IHBhdGgg4oCUIHNlZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHdoeSB0aGF0IG9yZGVyLlxuICAgKi9cbiAgZ2V0T3ZlcnZpZXcoKTogUHJvbWlzZTxXYWxsZXRPdmVydmlldz47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC9iYWxhbmNlIOKAlCByZXNvbHZlcyB0aGUgd2FsbGV0IGFuZCByZXR1cm5zIGl0cyBiYWxhbmNlICsgY3VycmVuY3kuICovXG4gIGdldEJhbGFuY2UoKTogUHJvbWlzZTxXYWxsZXRCYWxhbmNlPjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2luc3RhbmNlIOKAlCB3YWxsZXQgaWRlbnRpdHkgKyBjdXJyZW5jeSwgd2l0aG91dCB0aGUgYmFsYW5jZS4gKi9cbiAgZ2V0SW5zdGFuY2UoKTogUHJvbWlzZTxXYWxsZXRJbnN0YW5jZT47XG4gIC8qKiBUaGUgd2FsbGV0J3MgY3VycmVuY3kgYHtjb2RlLCBzeW1ib2x9YCAoYSBzbGljZSBvZiBnZXRJbnN0YW5jZSgpKS4gKi9cbiAgZ2V0Q3VycmVuY3koKTogUHJvbWlzZTxDdXJyZW5jeT47XG4gIC8qKlxuICAgKiBQT1NUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zICh0eXBlPWRlYml0KS4gSWRlbXBvdGVudCBvblxuICAgKiBgcmVmZXJlbmNlSWRgLiBQYXNzIGB3YWxsZXRgIHRvIGNoYXJnZSBhIHdhbGxldCBvdGhlciB0aGFuIHRoZSBvbmVcbiAgICogdGhpcyBoYW5kbGUgcm91dGVzIHRvLlxuICAgKi9cbiAgZGViaXQoaW5wdXQ6IERlYml0SW5wdXQpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PjtcbiAgLyoqXG4gICAqIFBPU1QgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMgKHR5cGU9Y3JlZGl0KS4gUGFzcyBgcmV2ZXJzYWxPZmAgZm9yIGFcbiAgICogcmVmdW5kIGNhcHBlZCBieSB0aGUgb3JpZ2luYWwgZGViaXQsIG9yIGBpc1JlZnVuZGAgZm9yIG9uZSBjb21wdXRlZFxuICAgKiBpbmRlcGVuZGVudGx5IG9mIGl0LlxuICAgKi9cbiAgY3JlZGl0KGlucHV0OiBDcmVkaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKiogR0VUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zIOKAlCBuZXdlc3QtZmlyc3QsIGtleXNldC1wYWdpbmF0ZWQuICovXG4gIGxpc3RUcmFuc2FjdGlvbnMoZmlsdGVyPzogTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcik6IFByb21pc2U8VHJhbnNhY3Rpb25QYWdlPjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy86aWQg4oCUIHNjb3BlZCB0byB0aGlzIHdhbGxldC4gKi9cbiAgZ2V0VHJhbnNhY3Rpb24oaWQ6IHN0cmluZyk6IFByb21pc2U8V2FsbGV0VHJhbnNhY3Rpb24+O1xuXG4gIC8vIOKUgOKUgCBDcmVkaXQgbGluZSDilIDilIBcbiAgLy9cbiAgLy8gUmVzb2x2ZWQgdG8gdGhlIE1FUkNIQU5UIHRoaXMgd2FsbGV0IGJlbG9uZ3MgdG8sIG5vdCB0byB0aGUgd2FsbGV0OlxuICAvLyBhbGwgb2YgYSBtZXJjaGFudCdzIG91dGxldHMgc2hhcmUgb25lIGNyZWRpdCBsaW5lLCBzbyBjYWxsaW5nIHRoZXNlXG4gIC8vIG9uIGFuIG91dGxldCBoYW5kbGUgYW5kIG9uIGl0cyBwYXJlbnQncyBoYW5kbGUgaXMgdGhlIHNhbWUgcmVxdWVzdC5cblxuICAvKipcbiAgICogR0VUIC92MS93YWxsZXQvY3JlZGl0IOKAlCBldmVyeXRoaW5nIHRoZSBtZXJjaGFudCB3aWRnZXQgcmVuZGVycy5cbiAgICogVGhyb3dzIGBDcmVkaXRMaW5lTm90Rm91bmRFcnJvcmAgKDQwNCkgd2hlbiB0aGUgbWVyY2hhbnQgaXMgbm90IG9uXG4gICAqIHRoZSBjcmVkaXQgbGluZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBwcmVwYWlkIG1lcmNoYW50LlxuICAgKiBSZXF1aXJlcyBgd2FsbGV0LmNyZWRpdDpyZWFkYC5cbiAgICovXG4gIGdldENyZWRpdExpbmUoKTogUHJvbWlzZTxDcmVkaXRMaW5lPjtcbiAgLyoqXG4gICAqIEdFVCAvdjEvd2FsbGV0L2NyZWRpdC9ldmVudHMg4oCUIHRoZSBsaW1pdC1jaGFuZ2UgYW5kIHNldHRsZW1lbnRcbiAgICogdHJhaWwsIG5ld2VzdCBmaXJzdC4gUmVxdWlyZXMgYHdhbGxldC5jcmVkaXQ6cmVhZGAuXG4gICAqXG4gICAqIFBhc3MgYSBgbGltaXRgIHRvIHdpZGVuIHRoZSBwYWdlOiB0aGUgc2VydmljZSBkZWZhdWx0cyB0byA1MCwgd2hpY2hcbiAgICogYSBtZXJjaGFudCBvbiB0aGUgbGluZSBmb3IgYSB5ZWFyIHdpbGwgaGF2ZSBvdXRncm93bi5cbiAgICovXG4gIGxpc3RDcmVkaXRFdmVudHMoZmlsdGVyPzogTGlzdENyZWRpdEV2ZW50c0ZpbHRlcik6IFByb21pc2U8Q3JlZGl0RXZlbnRbXT47XG4gIC8qKlxuICAgKiBQVVQgL3YxL3dhbGxldC9jcmVkaXQvbGltaXQg4oCUIHNldCB0aGUgbGltaXQsIGNyZWF0aW5nIHRoZSBjcmVkaXRcbiAgICogbGluZSBvbiBmaXJzdCB1c2UuIENvbnN1bXB0aW9uIGlzIG5ldmVyIHRvdWNoZWQsIHNvIHJhaXNpbmcgYSBsaW1pdFxuICAgKiBoYW5kcyBiYWNrIGV4YWN0bHkgdGhlIGRpZmZlcmVuY2UuIFJlcXVpcmVzIGB3YWxsZXQuY3JlZGl0OndyaXRlYC5cbiAgICovXG4gIHNldENyZWRpdExpbWl0KGlucHV0OiBTZXRDcmVkaXRMaW1pdElucHV0KTogUHJvbWlzZTxTZXRDcmVkaXRMaW1pdFJlc3VsdD47XG4gIC8qKlxuICAgKiBQT1NUIC92MS93YWxsZXQvY3JlZGl0L3NldHRsZW1lbnRzIOKAlCByZWxlYXNlIHRoZSBjcmVkaXQgYW4gaW52b2ljZVxuICAgKiB3YXMgaG9sZGluZywgb24gcGF5bWVudCBJTiBGVUxMLiBSZWxlYXNlcyB0aGUgaW52b2ljZSdzIG5ldCBmaWd1cmU7XG4gICAqIHNlZSBgU2V0dGxlSW52b2ljZUlucHV0Lm5ldE1pbm9yYC4gUmVxdWlyZXMgYHdhbGxldC5jcmVkaXQ6c2V0dGxlYC5cbiAgICovXG4gIHNldHRsZUludm9pY2UoaW5wdXQ6IFNldHRsZUludm9pY2VJbnB1dCk6IFByb21pc2U8U2V0dGxlSW52b2ljZVJlc3VsdD47XG4gIC8qKlxuICAgKiBQT1NUIC92MS93YWxsZXQvY3JlZGl0L3NldHRsZW1lbnRzL3JldmVyc2FsIOKAlCB1bmRvIGEgc2V0dGxlbWVudFxuICAgKiByZWNvcmRlZCBpbiBlcnJvciwgcmUtaG9sZGluZyBleGFjdGx5IHdoYXQgaXQgcmVsZWFzZWQuIFJlcXVpcmVzXG4gICAqIGB3YWxsZXQuY3JlZGl0OnNldHRsZWAuXG4gICAqL1xuICByZXZlcnNlU2V0dGxlbWVudChpbnB1dDogUmV2ZXJzZVNldHRsZW1lbnRJbnB1dCk6IFByb21pc2U8U2V0dGxlSW52b2ljZVJlc3VsdD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogV2FsbGV0Q2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFdhbGxldENsaWVudDtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFuZGxlIHRvIGEgYnVzaW5lc3Mgd2FsbGV0LiBTeW5jaHJvbm91cyBhbmQgSS9PLWZyZWUg4oCUIGl0XG4gICAqIG9ubHkgcGFyc2VzIGBpZGAuIFJlcXVpcmVzIGEgc2VydmljZSB0b2tlbiBjYXJyeWluZyB0aGUgcmVsZXZhbnRcbiAgICogYHdhbGxldC4qYCBzY29wZSBmb3IgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHJldHVybmVkIGhhbmRsZS5cbiAgICovXG4gIGdldFdhbGxldChvcHRzOiBHZXRXYWxsZXRPcHRpb25zKTogV2FsbGV0O1xuICAvKipcbiAgICogR0VUIC92MS93YWxsZXQvY3JlZGl0L3V0aWxpc2F0aW9uIOKAlCBldmVyeSBtZXJjaGFudCBvbiB0aGUgY3JlZGl0XG4gICAqIGxpbmUsIG1vc3QtdXRpbGlzZWQgZmlyc3QuXG4gICAqXG4gICAqIE9uIHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gb24gYSB3YWxsZXQgaGFuZGxlIGJlY2F1c2UgaXQgaXMgdGhlIG9uZVxuICAgKiB3YWxsZXQgb3BlcmF0aW9uIHRoYXQgaXMgbm90IHNjb3BlZCB0byBhIGJ1c2luZXNzLCBhbmQgaXQgY2Fycmllc1xuICAgKiBpdHMgb3duIGNhcGFiaWxpdHkgKGB3YWxsZXQuY3JlZGl0Omxpc3RgKSBmb3IgdGhlIHNhbWUgcmVhc29uOiBpdCBpc1xuICAgKiBhIG1hdGVyaWFsbHkgYnJvYWRlciBncmFudCB0aGFuIHJlYWRpbmcgb25lIG1lcmNoYW50J3MgbGluZS5cbiAgICovXG4gIGdldENyZWRpdFV0aWxpc2F0aW9uKGZpbHRlcj86IENyZWRpdFV0aWxpc2F0aW9uRmlsdGVyKTogUHJvbWlzZTxDcmVkaXRVdGlsaXNhdGlvblBhZ2U+O1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0QXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB3YWxsZXQgQVBJICR7c3RhdHVzfTogJHtib2R5fWApO1xuICAgIHRoaXMubmFtZSA9ICdXYWxsZXRBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG4vKiogQSBkZWJpdCB3b3VsZCBvdmVyZHJhdyB0aGUgd2FsbGV0OyBub3RoaW5nIHdhcyBtb3ZlZCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudEJhbGFuY2VFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGJhbGFuY2VNaW5vcjogbnVtYmVyLCBib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3InO1xuICAgIHRoaXMuYmFsYW5jZU1pbm9yID0gYmFsYW5jZU1pbm9yO1xuICB9XG59XG5cbi8qKiBBIHJlZnVuZCB3b3VsZCBwdXNoIHRvdGFsIHJldmVyc2FscyBwYXN0IHRoZSBvcmlnaW5hbCBkZWJpdCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJSZWZ1bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnT3ZlclJlZnVuZEVycm9yJztcbiAgfVxufVxuXG4vKiogYHJldmVyc2FsT2ZgIGRvZXNuJ3QgcmVmZXJlbmNlIGEgdmFsaWQgZGViaXQgb24gdGhpcyB3YWxsZXQgKEhUVFAgNDIyKS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUmV2ZXJzYWxFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDIyLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJldmVyc2FsRXJyb3InO1xuICB9XG59XG5cbi8qKiBBIGByZWZlcmVuY2VJZGAgd2FzIHJldXNlZCB3aXRoIGEgZGlmZmVyZW50IGFtb3VudC90eXBlL3NlcnZpY2UgKEhUVFAgNDA5KS4gKi9cbmV4cG9ydCBjbGFzcyBJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0lkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGB3YWxsZXRgIG92ZXJyaWRlIG5hbWVkIGEgYHBhcmVudEJ1c2luZXNzSWRgIHRoZSB3YWxsZXQgZG9jdW1lbnRcbiAqIGNvbnRyYWRpY3RzIChIVFRQIDQwOSkuIE5vdGhpbmcgd2FzIG1vdmVkIOKAlCB0aGUgd3JpdGUgaXMgcmVmdXNlZCByYXRoZXJcbiAqIHRoYW4gY2hhcmdpbmcgdGhlIHJpZ2h0IHdhbGxldCB1bmRlciB0aGUgd3JvbmcgaWRlbnRpdHksIHdoaWNoIHdvdWxkXG4gKiBtaXNhdHRyaWJ1dGUgdGhlIGxlZGdlciByb3cgYW5kIHNwbGl0IGl0cyBpZGVtcG90ZW5jeSBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0SWRlbnRpdHlNaXNtYXRjaEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY2hhcmdlIHdvdWxkIGV4Y2VlZCB0aGUgbWVyY2hhbnQncyBjcmVkaXQgbGltaXQ7IG5vdGhpbmcgd2FzIG1vdmVkXG4gKiAoSFRUUCA0MDkpLlxuICpcbiAqIERpc3RpbmN0IGZyb20gYEluc3VmZmljaWVudEJhbGFuY2VFcnJvcmAgYmVjYXVzZSB0aGUgbWVyY2hhbnQncyBuZXh0XG4gKiBzdGVwIGlzIGRpZmZlcmVudCDigJQgc2V0dGxlIGFuIGludm9pY2Ugb3IgdGFsayB0byB0aGVpciBhY2NvdW50XG4gKiBtYW5hZ2VyLCBub3QgdG9wIHVwLiBUaGUgZmlndXJlcyBhbHNvIHNlcGFyYXRlIHR3byBjYXNlcyB0aGF0IHNoYXJlXG4gKiB0aGlzIGVycm9yIGFuZCBuZWVkIGRpZmZlcmVudCBjb3B5OlxuICpcbiAqICAgLSBgYXZhaWxhYmxlTWlub3IgPT09IDBgIOKAlCB0aGUgbGltaXQgaXMgdXNlZCB1cC5cbiAqICAgLSBgYXZhaWxhYmxlTWlub3IgPiAwYCDigJQgdGhpcyBvbmUgY2hhcmdlIGlzIGxhcmdlciB0aGFuIHdoYXQgaXNcbiAqICAgICBsZWZ0LCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB1dGlsaXNhdGlvbi4gVGVsbGluZyB0aGF0IG1lcmNoYW50XG4gKiAgICAgdGhlaXIgXCJjcmVkaXQgbGltaXQgaXMgcmVhY2hlZFwiIHdvdWxkIGJlIHdyb25nLlxuICogICAtIGBhdmFpbGFibGVNaW5vciA9PT0gdW5kZWZpbmVkYCDigJQgdGhlIHJlc3BvbnNlIGNhcnJpZWQgbm8gZmlndXJlc1xuICogICAgIChhIHRyaW1tZWQgb3IgcHJveGllZCBib2R5KS4gRmFsbCBiYWNrIHRvIGdlbmVyaWMgY29weTsgZG8gbm90XG4gKiAgICAgcmVhZCBpdCBhcyB6ZXJvLCB3aGljaCBpcyB0aGUgc2VudGluZWwgYWJvdmUuXG4gKlxuICogQW5kIGEgdGhpcmQgdGhlIGZpZWxkcyBjYW5ub3QgZGlzdGluZ3Vpc2ggb24gdGhlaXIgb3duOiBjb25zdW1wdGlvblxuICogc3BhbnMgbW9udGhzLCBzbyBhIG1lcmNoYW50IGNhbiBiZSBhdCB0aGVpciBjZWlsaW5nIHB1cmVseSBiZWNhdXNlXG4gKiBvbGRlciBpbnZvaWNlcyBhcmUgdW5wYWlkLiBgZ2V0Q3JlZGl0TGluZSgpYCB0ZWxscyB5b3Ugd2hpY2guXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkaXRMaW1pdFJlYWNoZWRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgbGltaXRNaW5vcj86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29uc3VtZWRNaW5vcj86IG51bWJlcjtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlTWlub3I/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHJlcXVlc3RlZE1pbm9yPzogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihcbiAgICBmaWd1cmVzOiB7XG4gICAgICBsaW1pdE1pbm9yPzogbnVtYmVyO1xuICAgICAgY29uc3VtZWRNaW5vcj86IG51bWJlcjtcbiAgICAgIGF2YWlsYWJsZU1pbm9yPzogbnVtYmVyO1xuICAgICAgcmVxdWVzdGVkTWlub3I/OiBudW1iZXI7XG4gICAgfSxcbiAgICBib2R5OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0NyZWRpdExpbWl0UmVhY2hlZEVycm9yJztcbiAgICB0aGlzLmxpbWl0TWlub3IgPSBmaWd1cmVzLmxpbWl0TWlub3I7XG4gICAgdGhpcy5jb25zdW1lZE1pbm9yID0gZmlndXJlcy5jb25zdW1lZE1pbm9yO1xuICAgIHRoaXMuYXZhaWxhYmxlTWlub3IgPSBmaWd1cmVzLmF2YWlsYWJsZU1pbm9yO1xuICAgIHRoaXMucmVxdWVzdGVkTWlub3IgPSBmaWd1cmVzLnJlcXVlc3RlZE1pbm9yO1xuICB9XG59XG5cbi8qKlxuICogQSBjaGFyZ2Ugb24gYSBjcmVkaXQtbGluZSBtZXJjaGFudCBhcnJpdmVkIHdpdGhvdXQgaXRzIEdTVCBzcGxpdFxuICogKEhUVFAgNDAwKS5cbiAqXG4gKiBDb25zdW1wdGlvbiBpcyB0cmFja2VkIG5ldCBvZiBHU1QsIHNvIGBicmVha3VwYCBpcyByZXF1aXJlZCByYXRoZXJcbiAqIHRoYW4gYSByYXRlIGJlaW5nIGluZmVycmVkLiBJZiB5b3UgaGl0IHRoaXMsIHRoZSBjYWxsZXIgaXMgc2VuZGluZ1xuICogZ3Jvc3Mtb25seSBhbW91bnRzIGFuZCBuZWVkcyB0byBzZW5kIGBicmVha3VwYCDigJQgdGhlIHNhbWUgc3BsaXQgaXRcbiAqIGFsbW9zdCBjZXJ0YWlubHkgYWxyZWFkeSBjb21wdXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdEJyZWFrdXBSZXF1aXJlZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDAsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRCcmVha3VwUmVxdWlyZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqIGBhbGxvd05lZ2F0aXZlYCB3YXMgcGFzc2VkIGZvciBhIGNyZWRpdC1saW5lIG1lcmNoYW50IChIVFRQIDQwMCkuICovXG5leHBvcnQgY2xhc3MgQ3JlZGl0T3ZlcnJpZGVSZWZ1c2VkRXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwMCwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0NyZWRpdE92ZXJyaWRlUmVmdXNlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEEgcmUtc2V0dGxlbWVudCBjaGFuZ2VkIGFuIGludm9pY2UncyBmaWd1cmVzIHdpdGhvdXQgc2F5aW5nIHdoeVxuICogKEhUVFAgNDAwKS5cbiAqXG4gKiBSZS1zZXR0bGluZyBhIFJFVkVSU0VEIGludm9pY2Ugd2l0aCBkaWZmZXJlbnQgZmlndXJlcyBpcyBob3cgYSBzZXR0bGVkXG4gKiBhbW91bnQgaXMgY29ycmVjdGVkLCBzbyB0aGUgc2VydmljZSBkb2VzIG5vdCByZWZ1c2UgaXQgdGhlIHdheSBpdFxuICogcmVmdXNlcyBhIGNvbmZsaWN0aW5nIGZpcnN0IHNldHRsZW1lbnQuIEJ1dCBpdCByZWxlYXNlcyBhZ2FpbnN0IHRoZVxuICogbWVyY2hhbnQncyB3aG9sZSBvdXRzdGFuZGluZyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiB0aGUgaW52b2ljZSdzIG93blxuICogYW1vdW50LCBzbyBhIG1pc3R5cGVkIGZpZ3VyZSBjYW4gaGFuZCBiYWNrIGZhciBtb3JlIHRoYW4gdGhlIGludm9pY2VcbiAqIGhlbGQg4oCUIGFuZCBhIGRlbGliZXJhdGUgY29ycmVjdGlvbiBjYW4gc2F5IHdoYXQgaXQgaXMgY29ycmVjdGluZyB3aGVyZVxuICogYSByZXBsYXllZCB3ZWJob29rIGNhbm5vdC4gUGFzcyBgcmVhc29uYCBhbmQgcmV0cnkuIFJlLXNldHRsaW5nIHdpdGhcbiAqIHRoZSBTQU1FIGZpZ3VyZXMgbmVlZHMgbm9uZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdENvcnJlY3Rpb25SZWFzb25SZXF1aXJlZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogV2hhdCB0aGUgaW52b2ljZSB3YXMgcHJldmlvdXNseSBzZXR0bGVkIGZvciwgaW4gbWlub3IgdW5pdHMuICovXG4gICAgcmVhZG9ubHkgcHJldmlvdXNOZXRNaW5vcjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoNDAwLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0Q29ycmVjdGlvblJlYXNvblJlcXVpcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQSBsaW1pdCBjaGFuZ2UgbmFtZWQgYSBjdXJyZW5jeSB0aGUgY3JlZGl0IGxpbmUgaXMgbm90IGRlbm9taW5hdGVkIGluXG4gKiAoSFRUUCA0MDkpLlxuICpcbiAqIFRoZSBsaW5lJ3MgY3VycmVuY3kgaXMgZml4ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLCBiZWNhdXNlIGl0IHNldHMgdGhlXG4gKiBleHBvbmVudCBldmVyeSBzdG9yZWQgZmlndXJlIGlzIGFscmVhZHkgc2NhbGVkIGJ5IOKAlCBjaGFuZ2luZyBpdCB3b3VsZFxuICogcmUtZGVub21pbmF0ZSB0aGUgbGltaXQgYW5kIHRoZSBjb25zdW1wdGlvbiB3aXRob3V0IHRvdWNoaW5nIGVpdGhlclxuICogbnVtYmVyLiBSZS1kZW5vbWluYXRpbmcgYSBsaXZlIGxpbmUgaXMgYSBtaWdyYXRpb24sIG5vdCBhIGZpZWxkXG4gKiB1cGRhdGUsIHNvIHRoaXMgaXMgbm90IHNvbWV0aGluZyBhIGNhbGxlciBjYW4gcmV0cnkgcGFzdDogc2VuZCB0aGVcbiAqIGN1cnJlbmN5IHRoZSBsaW5lIGFscmVhZHkgY2Fycmllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdEN1cnJlbmN5Q29uZmxpY3RFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RvcmVkQ3VycmVuY3k6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZWFkb25seSByZXF1ZXN0ZWRDdXJyZW5jeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0Q3VycmVuY3lDb25mbGljdEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtZXJjaGFudCdzIGNyZWRpdCBsaW5lIGFuZCB0aGUgd2FsbGV0IHRoZSBjaGFyZ2Ugcm91dGVkIHRvIGFyZSBpblxuICogZGlmZmVyZW50IGN1cnJlbmNpZXMgKEhUVFAgNDA5KS5cbiAqXG4gKiBgYW1vdW50TWlub3JgIGFuZCBgYnJlYWt1cGAgY2Fycnkgbm8gY3VycmVuY3kgb2YgdGhlaXIgb3duIOKAlCB0aGV5IGFyZVxuICogcmVhZCB3aXRoIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzb2x2ZWQgd2FsbGV0IOKAlCBzbyB3aGVuIHRoZSB0d29cbiAqIGRpc2FncmVlIHRoZXJlIGlzIG5vIHJlYWRpbmcgb2YgdGhlbSB0aGF0IGlzIHJpZ2h0IGZvciBib3RoLCBhbmQgdGhlXG4gKiBzZXJ2aWNlIHJlZnVzZXMgcmF0aGVyIHRoYW4gbWlzLXNjYWxpbmcgYnkgYSBmYWN0b3Igb2YgdGVuIG9yIGFcbiAqIGh1bmRyZWQuIE5vdCBjYWxsZXItZml4YWJsZTogaXQgbWVhbnMgdGhlIG1lcmNoYW50J3Mgcm91dGluZyBhbmQgdGhlaXJcbiAqIGNyZWRpdCBsaW5lIGRpc2FncmVlLCB3aGljaCBpcyBhbiBvcHMvZGF0YSBwcm9ibGVtLlxuICovXG5leHBvcnQgY2xhc3MgQ3JlZGl0Q3VycmVuY3lNaXNtYXRjaEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRDdXJyZW5jeU1pc21hdGNoRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQSBwbGFpbiB0b3AtdXAgd2FzIHNlbnQgZm9yIGEgY3JlZGl0LWxpbmUgbWVyY2hhbnQgKEhUVFAgNDAwKS5cbiAqXG4gKiBUaGVzZSBtZXJjaGFudHMgaGF2ZSBubyBiYWxhbmNlIHRvIHRvcCB1cDogYHdhbGxldF9iYWxhbmNlYCBpcyB0aGVcbiAqIGZpY3Rpb24gdGhlIGNyZWRpdCBsaW5lIHJlcGxhY2VzIGFuZCBpcyBkZWxpYmVyYXRlbHkgZnJvemVuLCBzbyB0aGVcbiAqIHdyaXRlIHdvdWxkIG1vdmUgbm90aGluZyB3aGlsZSBhcHBlYXJpbmcgdG8gc3VjY2VlZC4gQ3JlZGl0IGlzIGhhbmRlZFxuICogYmFjayBieSBzZXR0bGluZyBhbiBpbnZvaWNlIChgc2V0dGxlSW52b2ljZWApLCBuZXZlciBieSBjcmVkaXRpbmcgdGhlXG4gKiB3YWxsZXQuIEEgZ2VudWluZSByZWZ1bmQgaXMgYWNjZXB0ZWQg4oCUIHNlbmQgaXQgYXMgYHJldmVyc2FsT2ZgIG9yXG4gKiBgaXNSZWZ1bmRgIGFuZCBpdCByZWxlYXNlcyB0aGUgY3JlZGl0IHRoZSBvcmlnaW5hbCBjaGFyZ2UgY29uc3VtZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkaXRUb3BVcFJlZnVzZWRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDAwLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0VG9wVXBSZWZ1c2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG1lcmNoYW50IGlzIG5vdCBvbiB0aGUgY3JlZGl0IGxpbmUgKEhUVFAgNDA0KS5cbiAqXG4gKiBUaGUgbm9ybWFsIHN0YXRlIGZvciBhIHByZXBhaWQgbWVyY2hhbnQsIHNvIGEgd2lkZ2V0IHNob3VsZCB0cmVhdCBpdFxuICogYXMgXCJzaG93IHRoZSB3YWxsZXQgYmFsYW5jZSBpbnN0ZWFkXCIsIG5vdCBhcyBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWRpdExpbmVOb3RGb3VuZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDQsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRMaW5lTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBgZW5hYmxlZDogZmFsc2VgIHdhcyByZWZ1c2VkIGJlY2F1c2UgdGhlIG1lcmNoYW50IHN0aWxsIG93ZXMgZm9yIHRoZVxuICogY3JlZGl0IGxpbmUgKEhUVFAgNDA5KS5cbiAqXG4gKiBEaXNhYmxpbmcgbW92ZXMgYSBtZXJjaGFudCBiYWNrIHRvIGEgd2FsbGV0IGJhbGFuY2UsIGFuZCBkb2luZyB0aGF0XG4gKiB3aXRoIGNvbnN1bXB0aW9uIG91dHN0YW5kaW5nIGFiYW5kb25zIGl0LiBTaG93IGBjb25zdW1lZE1pbm9yYCBhbmRcbiAqIHRlbGwgdGhlIG9wZXJhdG9yIHRvIHNldHRsZSBmaXJzdCDigJQgb3IsIGlmIHRoZSBpbnRlbnQgd2FzIHRvIHN0b3AgdGhlXG4gKiBtZXJjaGFudCB0cmFkaW5nIHJhdGhlciB0aGFuIHRvIG1vdmUgdGhlbSBvZmYgdGhlIG1vZGVsLCBzZXRcbiAqIGBsaW1pdE1pbm9yOiAwYCwgd2hpY2ggYmxvY2tzIGV2ZXJ5IGNoYXJnZSBhbmQga2VlcHMgdGhlIGJhbGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVkaXRMaW5lSGFzT3V0c3RhbmRpbmdFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgY29uc3VtZWRNaW5vcjogbnVtYmVyO1xuICByZWFkb25seSBnc3RBY2NydWVkTWlub3I6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoY29uc3VtZWRNaW5vcjogbnVtYmVyLCBnc3RBY2NydWVkTWlub3I6IG51bWJlciwgYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnQ3JlZGl0TGluZUhhc091dHN0YW5kaW5nRXJyb3InO1xuICAgIHRoaXMuY29uc3VtZWRNaW5vciA9IGNvbnN1bWVkTWlub3I7XG4gICAgdGhpcy5nc3RBY2NydWVkTWlub3IgPSBnc3RBY2NydWVkTWlub3I7XG4gIH1cbn1cblxuLyoqIEEgbGltaXQgYHJlZmVyZW5jZUlkYCBvciBhbiBpbnZvaWNlIHdhcyByZXVzZWQgZm9yIGRpZmZlcmVudCBmaWd1cmVzIChIVFRQIDQwOSkuICovXG5leHBvcnQgY2xhc3MgQ3JlZGl0SWRlbXBvdGVuY3lDb25mbGljdEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdDcmVkaXRJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3InO1xuICB9XG59XG5cbi8qKiBObyBzZXR0bGVtZW50IHRvIHJldmVyc2UgZm9yIHRoYXQgaW52b2ljZSAoSFRUUCA0MDQpLiAqL1xuZXhwb3J0IGNsYXNzIFNldHRsZW1lbnROb3RGb3VuZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDQsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdTZXR0bGVtZW50Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjcmVkaXQ6IHtcbiAgICBsaW1pdE1pbm9yPzogbnVtYmVyO1xuICAgIGNvbnN1bWVkTWlub3I/OiBudW1iZXI7XG4gICAgYXZhaWxhYmxlTWlub3I/OiBudW1iZXI7XG4gICAgcmVxdWVzdGVkTWlub3I/OiBudW1iZXI7XG4gIH0gPSB7fTtcbiAgbGV0IG91dHN0YW5kaW5nOiB7IGNvbnN1bWVkTWlub3I/OiBudW1iZXI7IGdzdEFjY3J1ZWRNaW5vcj86IG51bWJlciB9ID0ge307XG4gIGxldCBjb3JyZWN0aW9uOiB7XG4gICAgcHJldmlvdXNOZXRNaW5vcj86IG51bWJlcjtcbiAgICBzdG9yZWRDdXJyZW5jeT86IHN0cmluZztcbiAgICByZXF1ZXN0ZWRDdXJyZW5jeT86IHN0cmluZztcbiAgfSA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYm9keSkgYXMge1xuICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICBiYWxhbmNlTWlub3I/OiBudW1iZXI7XG4gICAgICBsaW1pdE1pbm9yPzogbnVtYmVyO1xuICAgICAgY29uc3VtZWRNaW5vcj86IG51bWJlcjtcbiAgICAgIGF2YWlsYWJsZU1pbm9yPzogbnVtYmVyO1xuICAgICAgcmVxdWVzdGVkTWlub3I/OiBudW1iZXI7XG4gICAgICBnc3RBY2NydWVkTWlub3I/OiBudW1iZXI7XG4gICAgICBwcmV2aW91c05ldE1pbm9yPzogbnVtYmVyO1xuICAgICAgc3RvcmVkQ3VycmVuY3k/OiBzdHJpbmc7XG4gICAgICByZXF1ZXN0ZWRDdXJyZW5jeT86IHN0cmluZztcbiAgICB9O1xuICAgIGNvZGUgPSBwYXJzZWQuZXJyb3I7XG4gICAgYmFsYW5jZU1pbm9yID0gcGFyc2VkLmJhbGFuY2VNaW5vcjtcbiAgICBjcmVkaXQgPSBwYXJzZWQ7XG4gICAgb3V0c3RhbmRpbmcgPSBwYXJzZWQ7XG4gICAgY29ycmVjdGlvbiA9IHBhcnNlZDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9uLUpTT04gYm9keSDigJQgZmFsbCB0aHJvdWdoIHRvIGEgZ2VuZXJpYyBlcnJvclxuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaW5zdWZmaWNpZW50X2JhbGFuY2UnKSB7XG4gICAgcmV0dXJuIG5ldyBJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3IoYmFsYW5jZU1pbm9yID8/IDAsIGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnY3JlZGl0X2xpbWl0X3JlYWNoZWQnKSB7XG4gICAgLy8gTk9UIGA/PyAwYC4gYGF2YWlsYWJsZU1pbm9yID09PSAwYCBpcyB0aGUgZG9jdW1lbnRlZCBzZW50aW5lbCBmb3JcbiAgICAvLyBcInRoZSBsaW1pdCBpcyB1c2VkIHVwXCIsIGFuZCBkZWZhdWx0aW5nIHRvIGl0IG1hZGUgYSB0cmltbWVkIG9yXG4gICAgLy8gcHJveGllZCBib2R5IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhhdCDigJQgcHJvZHVjaW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gd3JvbmcgbWVyY2hhbnQgY29weSBpbiB0aGUgb25lIHBsYWNlIHRoaXMgZXJyb3IgdHlwZSBleGlzdHMgdG8gZ2V0XG4gICAgLy8gcmlnaHQuIEFic2VudCBzdGF5cyBhYnNlbnQsIHdoaWNoIGFsc28gbWF0Y2hlcyBQSFAnc1xuICAgIC8vIGBjcmVkaXRGaWd1cmVzKClgLCBzbyB0aGUgdHdvIFNES3MgYWdyZWUgb24gdGhlIHJ1bGUuXG4gICAgcmV0dXJuIG5ldyBDcmVkaXRMaW1pdFJlYWNoZWRFcnJvcihcbiAgICAgIHtcbiAgICAgICAgbGltaXRNaW5vcjogY3JlZGl0LmxpbWl0TWlub3IsXG4gICAgICAgIGNvbnN1bWVkTWlub3I6IGNyZWRpdC5jb25zdW1lZE1pbm9yLFxuICAgICAgICBhdmFpbGFibGVNaW5vcjogY3JlZGl0LmF2YWlsYWJsZU1pbm9yLFxuICAgICAgICByZXF1ZXN0ZWRNaW5vcjogY3JlZGl0LnJlcXVlc3RlZE1pbm9yLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgKTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDAgJiYgY29kZSA9PT0gJ2NyZWRpdF9icmVha3VwX3JlcXVpcmVkJykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0QnJlYWt1cFJlcXVpcmVkRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDAwICYmIGNvZGUgPT09ICdjcmVkaXRfb3ZlcnJpZGVfcmVmdXNlZCcpIHtcbiAgICByZXR1cm4gbmV3IENyZWRpdE92ZXJyaWRlUmVmdXNlZEVycm9yKGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwMCAmJiBjb2RlID09PSAnY3JlZGl0X3RvcF91cF9yZWZ1c2VkJykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0VG9wVXBSZWZ1c2VkRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDAwICYmIGNvZGUgPT09ICdjcmVkaXRfY29ycmVjdGlvbl9yZWFzb25fcmVxdWlyZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBDcmVkaXRDb3JyZWN0aW9uUmVhc29uUmVxdWlyZWRFcnJvcihjb3JyZWN0aW9uLnByZXZpb3VzTmV0TWlub3IsIGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnY3JlZGl0X2N1cnJlbmN5X2NvbmZsaWN0Jykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0Q3VycmVuY3lDb25mbGljdEVycm9yKFxuICAgICAgY29ycmVjdGlvbi5zdG9yZWRDdXJyZW5jeSxcbiAgICAgIGNvcnJlY3Rpb24ucmVxdWVzdGVkQ3VycmVuY3ksXG4gICAgICBib2R5LFxuICAgICk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICdjcmVkaXRfY3VycmVuY3lfbWlzbWF0Y2gnKSB7XG4gICAgcmV0dXJuIG5ldyBDcmVkaXRDdXJyZW5jeU1pc21hdGNoRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICdjcmVkaXRfbGluZV9oYXNfb3V0c3RhbmRpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBDcmVkaXRMaW5lSGFzT3V0c3RhbmRpbmdFcnJvcihcbiAgICAgIG91dHN0YW5kaW5nLmNvbnN1bWVkTWlub3IgPz8gMCxcbiAgICAgIG91dHN0YW5kaW5nLmdzdEFjY3J1ZWRNaW5vciA/PyAwLFxuICAgICAgYm9keSxcbiAgICApO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnY3JlZGl0X2lkZW1wb3RlbmN5X2NvbmZsaWN0Jykge1xuICAgIHJldHVybiBuZXcgQ3JlZGl0SWRlbXBvdGVuY3lDb25mbGljdEVycm9yKGJvZHkpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IDQwNCAmJiBjb2RlID09PSAnY3JlZGl0X2xpbmVfbm90X2ZvdW5kJykgcmV0dXJuIG5ldyBDcmVkaXRMaW5lTm90Rm91bmRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0ICYmIGNvZGUgPT09ICdzZXR0bGVtZW50X25vdF9mb3VuZCcpIHJldHVybiBuZXcgU2V0dGxlbWVudE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnb3Zlcl9yZWZ1bmQnKSByZXR1cm4gbmV3IE92ZXJSZWZ1bmRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICdpZGVtcG90ZW5jeV9jb25mbGljdCcpIHJldHVybiBuZXcgSWRlbXBvdGVuY3lDb25mbGljdEVycm9yKGJvZHkpO1xuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ3dhbGxldF9pZGVudGl0eV9taXNtYXRjaCcpIHtcbiAgICByZXR1cm4gbmV3IFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvcihib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MjIgJiYgY29kZSA9PT0gJ2ludmFsaWRfcmV2ZXJzYWwnKSByZXR1cm4gbmV3IEludmFsaWRSZXZlcnNhbEVycm9yKGJvZHkpO1xuICBpZiAoc3RhdHVzID09PSA0MjIgJiYgY29kZSA9PT0gJ3VucmVzb2x2YWJsZV93YWxsZXQnKSByZXR1cm4gbmV3IFVucmVzb2x2YWJsZVdhbGxldEVycm9yKGJvZHkpO1xuICBpZiAoc3RhdHVzID09PSA0MDQpIHJldHVybiBuZXcgV2FsbGV0Tm90Rm91bmRFcnJvcihib2R5KTtcbiAgcmV0dXJuIG5ldyBXYWxsZXRBcGlFcnJvcihzdGF0dXMsIGJvZHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2FsbGV0Q2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBXYWxsZXRDbGllbnQge1xuICBjb25zdCBzdGF0ZSA9IG5ldyBDb25maWdTdGF0ZSgpO1xuICBzdGF0ZS5hcHBseShpbnB1dCk7XG5cbiAgY29uc3QgY2xpZW50OiBXYWxsZXRDbGllbnQgPSB7XG4gICAgY29uZmlnKG9wdHMpIHtcbiAgICAgIHN0YXRlLmFwcGx5KG9wdHMpO1xuICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICB9LFxuICAgIGF1dGgob3B0cykge1xuICAgICAgc3RhdGUuc2V0QXV0aChvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhc3luYyBnZXRDcmVkaXRVdGlsaXNhdGlvbihmaWx0ZXIgPSB7fSkge1xuICAgICAgY29uc3QgcCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIGlmIChmaWx0ZXIubWluVXRpbGlzYXRpb25CcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwLnNldCgnbWluVXRpbGlzYXRpb25CcHMnLCBTdHJpbmcoZmlsdGVyLm1pblV0aWxpc2F0aW9uQnBzKSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyLmJhbmQpIHAuc2V0KCdiYW5kJywgZmlsdGVyLmJhbmQpO1xuICAgICAgaWYgKGZpbHRlci5vZmZzZXQgIT09IHVuZGVmaW5lZCkgcC5zZXQoJ29mZnNldCcsIFN0cmluZyhmaWx0ZXIub2Zmc2V0KSk7XG4gICAgICBpZiAoZmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQpIHAuc2V0KCdsaW1pdCcsIFN0cmluZyhmaWx0ZXIubGltaXQpKTtcbiAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9jcmVkaXQvdXRpbGlzYXRpb24nO1xuICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgcXVlcnkgPSBwLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBDcmVkaXRVdGlsaXNhdGlvblBhZ2U7XG4gICAgfSxcbiAgICBnZXRXYWxsZXQob3B0cykge1xuICAgICAgLy8gUGFyc2UgZWFnZXJseSBzbyBhIG1hbGZvcm1lZCBpZCBmYWlscyBmYXN0IGF0IHRoZSBjYWxsIHNpdGUsXG4gICAgICAvLyBidXQgZG8gTk9UIHJlc29sdmUgdGhlIHdhbGxldCBoZXJlIOKAlCB0aGF0IGhhcHBlbnMgb24gdGhlIGZpcnN0XG4gICAgICAvLyBvcGVyYXRpb24gYWdhaW5zdCB0aGUgaGFuZGxlLlxuICAgICAgY29uc3QgYnVzaW5lc3NJZCA9IHBhcnNlQnVzaW5lc3NJZChvcHRzLmlkKTtcbiAgICAgIGNvbnN0IGZvcmNlQ2hpbGRXYWxsZXQgPSBvcHRzLmZvcmNlQ2hpbGRXYWxsZXQgPT09IHRydWU7XG5cbiAgICAgIGNvbnN0IGJhc2VQYXJhbXMgPSAoKTogVVJMU2VhcmNoUGFyYW1zID0+IHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBidXNpbmVzc0lkOiBTdHJpbmcoYnVzaW5lc3NJZCkgfSk7XG4gICAgICAgIGlmIChmb3JjZUNoaWxkV2FsbGV0KSBwLnNldCgnZm9yY2VDaGlsZFdhbGxldCcsICd0cnVlJyk7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0SnNvbiA9IGFzeW5jIDxUPihwYXRoOiBzdHJpbmcsIHBhcmFtczogVVJMU2VhcmNoUGFyYW1zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke3BhcmFtcy50b1N0cmluZygpfWAsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNlbmRKc29uID0gYXN5bmMgPFQ+KFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyB8ICdQVVQnLFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIHBheWxvYWQ6IHVua25vd24sXG4gICAgICApOiBQcm9taXNlPFQ+ID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH1gLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwb3N0VHJhbnNhY3Rpb24gPSBhc3luYyAoXG4gICAgICAgIHR5cGU6ICdkZWJpdCcgfCAnY3JlZGl0JyxcbiAgICAgICAgYm9keTogRGViaXRJbnB1dCB8IENyZWRpdElucHV0LFxuICAgICAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4gPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gJy92MS93YWxsZXQvdHJhbnNhY3Rpb25zJztcbiAgICAgICAgLy8gVGhlIHdhbGxldCBpZGVudGl0eSBpcyBleGFjdGx5LW9uZS1vZiBzZXJ2ZXItc2lkZSwgc28gYW4gZXhwbGljaXRcbiAgICAgICAgLy8gYHdhbGxldGAgb3ZlcnJpZGUgUkVQTEFDRVMgdGhpcyBoYW5kbGUncyBidXNpbmVzc0lkIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIHRyYXZlbGxpbmcgYWxvbmdzaWRlIGl0IOKAlCBzZW5kaW5nIGJvdGggaXMgYSA0MDAuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBib2R5LndhbGxldCA/IHsgdHlwZSwgLi4uYm9keSB9IDogeyBidXNpbmVzc0lkLCBmb3JjZUNoaWxkV2FsbGV0LCB0eXBlLCAuLi5ib2R5IH0sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH1gLFxuICAgICAgICAgIGJvZHk6IHBheWxvYWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVHJhbnNhY3Rpb25SZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB3YWxsZXQ6IFdhbGxldCA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJBTEFOQ0UgRklSU1QsIGRlbGliZXJhdGVseSwgYW5kIHRoZSBvcmRlciBpcyB0aGUgd2hvbGUgZGVzaWduLlxuICAgICAgICAgKlxuICAgICAgICAgKiBgZ2V0QmFsYW5jZSgpYCBjYXJyaWVzIGBzb3VyY2VgLCBzbyBmb3IgYW55IG1lcmNoYW50IHdobyBoYXMgYVxuICAgICAgICAgKiB3YWxsZXQgYXQgYWxsIGl0IHNldHRsZXMgcHJlcGFpZC12cy1jcmVkaXQgd2l0aG91dCBhblxuICAgICAgICAgKiBleGNlcHRpb24uIFRoZSBhbHRlcm5hdGl2ZSDigJQgY2FsbCBgZ2V0Q3JlZGl0TGluZSgpYCBhbmQgY2F0Y2hcbiAgICAgICAgICogaXRzIDQwNCDigJQgbWFrZXMgdGhlICpub3JtYWwqIHN0YXRlIG9mIGEgcHJlcGFpZCBtZXJjaGFudCBhblxuICAgICAgICAgKiBlcnJvcjogYSA0MDQgaW4gdGhlIG5ldHdvcmsgdGFiIGFuZCBhIHRocm93IGluIHRoZSBsb2dzIG9uXG4gICAgICAgICAqIGV2ZXJ5IGRhc2hib2FyZCBsb2FkLCBmb3Igbm90aGluZyBiZWluZyB3cm9uZy5cbiAgICAgICAgICpcbiAgICAgICAgICogSXQgYWxzbyBjb3N0cyBsZXNzIHdoZXJlIGl0IG1hdHRlcnMuIE1vc3QgbWVyY2hhbnRzIGFyZVxuICAgICAgICAgKiBwcmVwYWlkLCBhbmQgZm9yIHRoZW0gdGhpcyBpcyBPTkUgcmVxdWVzdDogdGhlIGJhbGFuY2UgaXMgYm90aFxuICAgICAgICAgKiB0aGUgYW5zd2VyIGFuZCB0aGUgZGF0YS4gT25seSBhIGNyZWRpdCBtZXJjaGFudCBwYXlzIGEgc2Vjb25kXG4gICAgICAgICAqIHJvdW5kIHRyaXAsIGFuZCBvbmx5IGJlY2F1c2UgdGhleSBoYXZlIGZpZ3VyZXMgYSBiYWxhbmNlIGNhbm5vdFxuICAgICAgICAgKiBjYXJyeS5cbiAgICAgICAgICpcbiAgICAgICAgICogYHNvdXJjZWAgYWJzZW50IG1lYW5zIGEgd2FsbGV0IHNlcnZpY2Ugb2xkZXIgdGhhbiB0aGUgY3JlZGl0XG4gICAgICAgICAqIGxpbmUsIHdoaWNoIGlzIHByZXBhaWQgYnkgZGVmaW5pdGlvbiDigJQgc28gYW4gb2xkIHNlcnZpY2UgcmVhZHNcbiAgICAgICAgICogYXMgcHJlcGFpZCByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICAgICAgICpcbiAgICAgICAgICogV0hBVCBUSElTIERPRVMgTk9UIFNXQUxMT1cuIGBnZXRCYWxhbmNlKClgIGlzIG5vdCBhIGd1YXJhbnRlZWRcbiAgICAgICAgICogMjAwOiBpdCBhbnN3ZXJzIGBXYWxsZXROb3RGb3VuZEVycm9yYCB3aGVuIG5vIHdhbGxldCBkb2N1bWVudFxuICAgICAgICAgKiBleGlzdHMgZm9yIHRoZSByZXNvbHZlZCBpZGVudGl0eSwgYW5kIGBVbnJlc29sdmFibGVXYWxsZXRFcnJvcmBcbiAgICAgICAgICogd2hlbiByb3V0aW5nIGNhbm5vdCBuYW1lIG9uZS4gQm90aCBwcm9wYWdhdGUsIGJlY2F1c2UgYm90aCBtZWFuXG4gICAgICAgICAqIHRoZXJlIGlzIGdlbnVpbmVseSBub3RoaW5nIHRvIHJlbmRlciDigJQgcmVwb3J0aW5nIGBwcmVwYWlkYCB3aXRoXG4gICAgICAgICAqIGEgemVybyBiYWxhbmNlIHdvdWxkIGludmVudCBhIHdhbGxldC5cbiAgICAgICAgICpcbiAgICAgICAgICogQ0FQQUJJTElUSUVTLiBgd2FsbGV0LmJhbGFuY2U6cmVhZGAgY292ZXJzIGEgcHJlcGFpZCBtZXJjaGFudC5cbiAgICAgICAgICogQSBjcmVkaXQgbWVyY2hhbnQgbmVlZHMgYHdhbGxldC5jcmVkaXQ6cmVhZGAgYXMgd2VsbCwgYW5kIGFcbiAgICAgICAgICogdG9rZW4gaG9sZGluZyBvbmx5IHRoZSBmb3JtZXIgZ2V0cyBhIGBXYWxsZXRBcGlFcnJvcmAgd2l0aFxuICAgICAgICAgKiBgc3RhdHVzID09PSA0MDNgIGZyb20gdGhlIHNlY29uZCBjYWxsIOKAlCBldmVyeSB3YWxsZXQgbWV0aG9kXG4gICAgICAgICAqIHRocm93cyBmcm9tIHRoYXQgb25lIGhpZXJhcmNoeSwgc28gYnJhbmNoIG9uIGAuc3RhdHVzYCByYXRoZXJcbiAgICAgICAgICogdGhhbiBsb29raW5nIGZvciB0aGUgU0RLJ3MgYEF1dGhvcml6YXRpb25FcnJvcmAsIHdoaWNoIHRoaXNcbiAgICAgICAgICogbmFtZXNwYWNlIGRvZXMgbm90IHJhaXNlLiBJdCBpcyBkZWxpYmVyYXRlbHkgbm90IGNhdWdodDpcbiAgICAgICAgICogZmFsbGluZyBiYWNrIHRvIGBwcmVwYWlkYCB3b3VsZCBoYW5kIHRoZSBkYXNoYm9hcmQgYVxuICAgICAgICAgKiBgd2FsbGV0X2JhbGFuY2VgIHRoYXQgaXMgZnJvemVuIGZvciBleGFjdGx5IHRoZXNlIG1lcmNoYW50cywgc29cbiAgICAgICAgICogaXQgd291bGQgcmVuZGVyIGEgY29uZmlkZW50LCBzdGFsZSwgd3JvbmcgbnVtYmVyIGluc3RlYWQgb2YgYW5cbiAgICAgICAgICogZXJyb3Igc29tZW9uZSBjYW4gZml4IGJ5IHdpZGVuaW5nIHRoZSBncmFudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldE92ZXJ2aWV3KCkge1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB3YWxsZXQuZ2V0QmFsYW5jZSgpO1xuICAgICAgICAgIGlmIChiYWxhbmNlLnNvdXJjZSAhPT0gJ2NyZWRpdF9saW5lJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogJ3ByZXBhaWQnLCBiYWxhbmNlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiAnY3JlZGl0JywgYmFsYW5jZSwgY3JlZGl0TGluZTogYXdhaXQgd2FsbGV0LmdldENyZWRpdExpbmUoKSB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gT3BzIGNhbiBkaXNhYmxlIGEgY3JlZGl0IGxpbmUgYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiBSYXJlLFxuICAgICAgICAgICAgLy8gYnV0IHRoZSBob25lc3QgYW5zd2VyIGlzIHRoZW4gXCJwcmVwYWlkXCIgcmF0aGVyIHRoYW4gYW5cbiAgICAgICAgICAgIC8vIGVycm9yIGEgZGFzaGJvYXJkIGNhbm5vdCBhY3Qgb24uXG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ3JlZGl0TGluZU5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogJ3ByZXBhaWQnLCBiYWxhbmNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRCYWxhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9iYWxhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2luc3RhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0SW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldEN1cnJlbmN5KCkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LmdldEluc3RhbmNlKCkpLmN1cnJlbmN5O1xuICAgICAgICB9LFxuICAgICAgICBkZWJpdChib2R5KSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3RUcmFuc2FjdGlvbignZGViaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGl0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdjcmVkaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXIgPSB7fSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBiYXNlUGFyYW1zKCk7XG4gICAgICAgICAgaWYgKGZpbHRlci50eXBlKSBwLnNldCgndHlwZScsIGZpbHRlci50eXBlKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmZyb20pIHAuc2V0KCdmcm9tJywgZmlsdGVyLmZyb20pO1xuICAgICAgICAgIGlmIChmaWx0ZXIudG8pIHAuc2V0KCd0bycsIGZpbHRlci50byk7XG4gICAgICAgICAgaWYgKGZpbHRlci5zZXJ2aWNlICE9PSB1bmRlZmluZWQpIHAuc2V0KCdzZXJ2aWNlJywgU3RyaW5nKGZpbHRlci5zZXJ2aWNlKSk7XG4gICAgICAgICAgaWYgKGZpbHRlci5yZWZlcmVuY2VJZCkgcC5zZXQoJ3JlZmVyZW5jZUlkJywgZmlsdGVyLnJlZmVyZW5jZUlkKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnRhZykgcC5zZXQoJ3RhZycsIGZpbHRlci50YWcpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuY3Vyc29yKSBwLnNldCgnY3Vyc29yJywgZmlsdGVyLmN1cnNvcik7XG4gICAgICAgICAgaWYgKGZpbHRlci5saW1pdCAhPT0gdW5kZWZpbmVkKSBwLnNldCgnbGltaXQnLCBTdHJpbmcoZmlsdGVyLmxpbWl0KSk7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyc7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblBhZ2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uKGlkKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy8ke2lkfWA7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtiYXNlUGFyYW1zKCkudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFdhbGxldFRyYW5zYWN0aW9uO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIOKUgOKUgCBDcmVkaXQgbGluZSDilIDilIBcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlc2Ugc2VuZCBgYnVzaW5lc3NJZGAgYWxvbmUsIG5ldmVyIGBmb3JjZUNoaWxkV2FsbGV0YDogdGhlXG4gICAgICAgIC8vIGNyZWRpdCBsaW5lIGlzIHJlc29sdmVkIHRvIHRoZSBtZXJjaGFudCB0aGF0IG93bnMgdGhlIGJ1c2luZXNzLFxuICAgICAgICAvLyBhbmQgd2hpY2ggd2FsbGV0IHdvdWxkIGhhdmUgcGFpZCBpcyBub3QgcGFydCBvZiB0aGF0IHF1ZXN0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgYnVzaW5lc3NJZGAgaXMgc3ByZWFkIExBU1Qgc28gdGhlIGhhbmRsZSdzIG1lcmNoYW50IHdpbnMuIEFcbiAgICAgICAgLy8gY2FsbGVyIHdobyBwYXNzZXMgdGhlaXIgb3duIGBidXNpbmVzc0lkYCBpcyBuYW1pbmcgYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gbWVyY2hhbnQsIGFuZCBob25vdXJpbmcgaXQgd291bGQgbW92ZSBhIGxpbWl0IG9yIHNldHRsZSBhblxuICAgICAgICAvLyBpbnZvaWNlIGFnYWluc3QgdGhhdCBvbmUgd2hpbGUgZXZlcnkgbG9nIGxpbmUgYW5kIGVycm9yIHN0aWxsXG4gICAgICAgIC8vIG5hbWVkIHRoaXMgaGFuZGxlJ3MuXG5cbiAgICAgICAgYXN5bmMgZ2V0Q3JlZGl0TGluZSgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0SnNvbjxDcmVkaXRMaW5lPihcbiAgICAgICAgICAgICcvdjEvd2FsbGV0L2NyZWRpdCcsXG4gICAgICAgICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGxpc3RDcmVkaXRFdmVudHMoZmlsdGVyID0ge30pIHtcbiAgICAgICAgICBjb25zdCBwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGJ1c2luZXNzSWQ6IFN0cmluZyhidXNpbmVzc0lkKSB9KTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQpIHAuc2V0KCdsaW1pdCcsIFN0cmluZyhmaWx0ZXIubGltaXQpKTtcbiAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgZ2V0SnNvbjx7IGV2ZW50cz86IENyZWRpdEV2ZW50W10gfT4oJy92MS93YWxsZXQvY3JlZGl0L2V2ZW50cycsIHApO1xuICAgICAgICAgIC8vIGA/PyBbXWAgcmF0aGVyIHRoYW4gYSBiYXJlIGBwYWdlLmV2ZW50c2A6IHRoZSBkZWNsYXJlZCB0eXBlXG4gICAgICAgICAgLy8gc2F5cyB0aGUga2V5IGlzIGFsd2F5cyB0aGVyZSwgYnV0IHRoZSB0eXBlIGRlc2NyaWJlcyB3aGF0IHRoZVxuICAgICAgICAgIC8vIHNlcnZpY2UgaW50ZW5kcyB0byBzZW5kLCBub3Qgd2hhdCBhIHByb3h5LCBhbiBvbGRlclxuICAgICAgICAgIC8vIGRlcGxveW1lbnQgb3IgYSB0cnVuY2F0ZWQgYm9keSBhY3R1YWxseSBkZWxpdmVyZWQuIFJldHVybmluZ1xuICAgICAgICAgIC8vIGB1bmRlZmluZWRgIGZyb20gYSBtZXRob2QgdHlwZWQgYENyZWRpdEV2ZW50W11gIHB1dHMgYSBsaWUgaW5cbiAgICAgICAgICAvLyB0aGUgY2FsbGVyJ3MgaGFuZHMsIGFuZCBpdCBzdXJmYWNlcyBhcyBgLm1hcCBvZiB1bmRlZmluZWRgXG4gICAgICAgICAgLy8gaW5zaWRlIHRoZWlyIHJlbmRlciDigJQgZmFyIGZyb20gdGhlIHJlcXVlc3QgdGhhdCBjYXVzZWQgaXQuXG4gICAgICAgICAgcmV0dXJuIHBhZ2UuZXZlbnRzID8/IFtdO1xuICAgICAgICB9LFxuICAgICAgICBzZXRDcmVkaXRMaW1pdChpbnB1dCkge1xuICAgICAgICAgIHJldHVybiBzZW5kSnNvbjxTZXRDcmVkaXRMaW1pdFJlc3VsdD4oJ1BVVCcsICcvdjEvd2FsbGV0L2NyZWRpdC9saW1pdCcsIHtcbiAgICAgICAgICAgIC4uLmlucHV0LFxuICAgICAgICAgICAgYnVzaW5lc3NJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0dGxlSW52b2ljZShpbnB1dCkge1xuICAgICAgICAgIHJldHVybiBzZW5kSnNvbjxTZXR0bGVJbnZvaWNlUmVzdWx0PignUE9TVCcsICcvdjEvd2FsbGV0L2NyZWRpdC9zZXR0bGVtZW50cycsIHtcbiAgICAgICAgICAgIC4uLmlucHV0LFxuICAgICAgICAgICAgYnVzaW5lc3NJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmV2ZXJzZVNldHRsZW1lbnQoaW5wdXQpIHtcbiAgICAgICAgICByZXR1cm4gc2VuZEpzb248U2V0dGxlSW52b2ljZVJlc3VsdD4oJ1BPU1QnLCAnL3YxL3dhbGxldC9jcmVkaXQvc2V0dGxlbWVudHMvcmV2ZXJzYWwnLCB7XG4gICAgICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgICAgIGJ1c2luZXNzSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHdhbGxldDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG4iXX0=
|