@tomerh2001/israeli-bank-scrapers 6.3.12 → 6.4.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/lib/scrapers/hapoalim.js +314 -3
- package/lib/transactions.d.ts +12 -0
- package/lib/transactions.js +1 -1
- package/package.json +1 -1
package/lib/scrapers/hapoalim.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _moment = _interopRequireDefault(require("moment"));
|
|
8
8
|
var _uuid = require("uuid");
|
|
9
|
+
var _constants = require("../constants");
|
|
9
10
|
var _debug = require("../helpers/debug");
|
|
10
11
|
var _fetch = require("../helpers/fetch");
|
|
11
12
|
var _navigation = require("../helpers/navigation");
|
|
@@ -52,7 +53,7 @@ function convertTransactions(txns) {
|
|
|
52
53
|
date: (0, _moment.default)(txn.eventDate, DATE_FORMAT).toISOString(),
|
|
53
54
|
processedDate: (0, _moment.default)(txn.valueDate, DATE_FORMAT).toISOString(),
|
|
54
55
|
originalAmount: isOutbound ? -txn.eventAmount : txn.eventAmount,
|
|
55
|
-
originalCurrency:
|
|
56
|
+
originalCurrency: _constants.SHEKEL_CURRENCY,
|
|
56
57
|
chargedAmount: isOutbound ? -txn.eventAmount : txn.eventAmount,
|
|
57
58
|
description: txn.activityDescription || '',
|
|
58
59
|
status: txn.serialNumber === 0 ? _transactions.TransactionStatuses.Pending : _transactions.TransactionStatuses.Completed,
|
|
@@ -61,6 +62,31 @@ function convertTransactions(txns) {
|
|
|
61
62
|
return result;
|
|
62
63
|
});
|
|
63
64
|
}
|
|
65
|
+
function convertForexTransactions(txns, currency) {
|
|
66
|
+
return txns.map(txn => {
|
|
67
|
+
const isOutbound = txn.eventActivityTypeCode === 2;
|
|
68
|
+
const dateStr = txn.executingDate.toString(); // Date transaction was executed
|
|
69
|
+
const valueDateStr = txn.valueDate.toString(); // Date value was actually added to account
|
|
70
|
+
|
|
71
|
+
let memo = '';
|
|
72
|
+
if (txn.eventDetails) {
|
|
73
|
+
memo = txn.eventDetails;
|
|
74
|
+
}
|
|
75
|
+
const result = {
|
|
76
|
+
type: _transactions.TransactionTypes.Normal,
|
|
77
|
+
identifier: txn.referenceNumber || txn.recordSerialNumber,
|
|
78
|
+
date: (0, _moment.default)(valueDateStr, DATE_FORMAT).toISOString(),
|
|
79
|
+
processedDate: (0, _moment.default)(dateStr, DATE_FORMAT).toISOString(),
|
|
80
|
+
originalAmount: isOutbound ? -txn.eventAmount : txn.eventAmount,
|
|
81
|
+
originalCurrency: currency,
|
|
82
|
+
chargedAmount: isOutbound ? -txn.eventAmount : txn.eventAmount,
|
|
83
|
+
description: txn.activityDescription || '',
|
|
84
|
+
status: _transactions.TransactionStatuses.Completed,
|
|
85
|
+
memo
|
|
86
|
+
};
|
|
87
|
+
return result;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
64
90
|
async function getRestContext(page) {
|
|
65
91
|
await (0, _waiting.waitUntil)(() => {
|
|
66
92
|
return page.evaluate(() => !!window.bnhpApp);
|
|
@@ -121,6 +147,256 @@ async function getAccountBalance(apiSiteUrl, page, accountNumber) {
|
|
|
121
147
|
const balanceAndCreditLimit = await (0, _fetch.fetchGetWithinPage)(page, balanceAndCreditLimitUrl);
|
|
122
148
|
return balanceAndCreditLimit?.currentBalance;
|
|
123
149
|
}
|
|
150
|
+
async function getForexAccounts(baseUrl, page, accountNumber, startDate, endDate) {
|
|
151
|
+
debug('========== FETCHING FOREX ACCOUNTS ==========');
|
|
152
|
+
debug('Account: %s, Date range: %s to %s', accountNumber, startDate, endDate);
|
|
153
|
+
const accounts = [];
|
|
154
|
+
const currency = {
|
|
155
|
+
code: 19,
|
|
156
|
+
swift: _constants.SHEKEL_CURRENCY
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
const detailedAccountTypeCode = 142; // For foreign currency accounts
|
|
160
|
+
const forexUrl = `${baseUrl}/ServerServices/foreign-currency/transactions?accountId=${accountNumber}&type=business&retrievalStartDate=${startDate}&retrievalEndDate=${endDate}¤cyCodeList=${currency.code}&detailedAccountTypeCodeList=${detailedAccountTypeCode}&view=details&lang=he`;
|
|
161
|
+
debug('Trying forex %s', forexUrl);
|
|
162
|
+
const forexData = await (0, _fetch.fetchGetWithinPage)(page, forexUrl, true); // ignoreErrors = true
|
|
163
|
+
|
|
164
|
+
if (forexData && forexData.balancesAndLimitsDataList && forexData.balancesAndLimitsDataList.length > 0) {
|
|
165
|
+
debug('✓ Found forex data');
|
|
166
|
+
for (const currencyData of forexData.balancesAndLimitsDataList) {
|
|
167
|
+
const currencySwiftCode = currencyData.currencySwiftCode || currency.swift;
|
|
168
|
+
const transactionCount = currencyData.transactions?.length || 0;
|
|
169
|
+
|
|
170
|
+
// Get balance from the most recent transaction's currentBalance field
|
|
171
|
+
// If no transactions, fall back to currencyData.currentBalance
|
|
172
|
+
let balance = currencyData.currentBalance;
|
|
173
|
+
if (transactionCount > 0 && currencyData.transactions) {
|
|
174
|
+
balance = currencyData.transactions[0].currentBalance;
|
|
175
|
+
debug(' - Using balance from most recent transaction: %s', balance);
|
|
176
|
+
}
|
|
177
|
+
debug(' - Currency: %s, Balance: %s, Transactions: %d', currencySwiftCode, balance, transactionCount);
|
|
178
|
+
|
|
179
|
+
// Log transaction dates for debugging
|
|
180
|
+
if (transactionCount > 0) {
|
|
181
|
+
const txnDates = currencyData.transactions?.map(t => t.executingDate).join(', ') || '';
|
|
182
|
+
debug(' Transaction dates: %s', txnDates);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Only add if there's actually a balance or transactions
|
|
186
|
+
if (balance !== 0 || transactionCount > 0) {
|
|
187
|
+
const txns = convertForexTransactions(currencyData.transactions || [], currencySwiftCode);
|
|
188
|
+
const forexAccountNumber = `${accountNumber}-${currencySwiftCode}`;
|
|
189
|
+
accounts.push({
|
|
190
|
+
accountNumber: forexAccountNumber,
|
|
191
|
+
balance,
|
|
192
|
+
currency: currencySwiftCode,
|
|
193
|
+
txns
|
|
194
|
+
});
|
|
195
|
+
debug(' ✓ Added forex account: %s with %d transactions', forexAccountNumber, txns.length);
|
|
196
|
+
} else {
|
|
197
|
+
debug(' - Skipping %s (zero balance and no transactions)', currencySwiftCode);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
} else {
|
|
201
|
+
debug(' - No forex data found');
|
|
202
|
+
}
|
|
203
|
+
} catch (error) {
|
|
204
|
+
debug(' - Error fetching forex: %s', error);
|
|
205
|
+
// Continue trying other currencies
|
|
206
|
+
}
|
|
207
|
+
debug('Returning %d forex accounts', accounts.length);
|
|
208
|
+
return accounts;
|
|
209
|
+
}
|
|
210
|
+
async function getSavingsAccounts(baseUrl, page, accountNumber) {
|
|
211
|
+
const savingsUrl = `${baseUrl}/ServerServices/deposits-and-savings/deposits?accountId=${accountNumber}&view=details&lang=he`;
|
|
212
|
+
const savingsData = await (0, _fetch.fetchGetWithinPage)(page, savingsUrl);
|
|
213
|
+
if (!savingsData || !savingsData.depositsWrapperData || savingsData.depositsWrapperData.length === 0) {
|
|
214
|
+
debug('No savings accounts found for account %s', accountNumber);
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
const accounts = [];
|
|
218
|
+
for (const wrapper of savingsData.depositsWrapperData) {
|
|
219
|
+
// Create a separate account for each individual deposit
|
|
220
|
+
for (const deposit of wrapper.data) {
|
|
221
|
+
const balance = deposit.revaluedTotalAmount || deposit.principalAmount;
|
|
222
|
+
const savingsAccountNumber = `${accountNumber}-${deposit.depositSerialId}`;
|
|
223
|
+
accounts.push({
|
|
224
|
+
accountNumber: savingsAccountNumber,
|
|
225
|
+
savingsAccount: true,
|
|
226
|
+
balance,
|
|
227
|
+
txns: [] // Savings accounts typically don't have transaction history in the same way
|
|
228
|
+
});
|
|
229
|
+
debug('Added savings account %s with balance %s', savingsAccountNumber, balance);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return accounts;
|
|
233
|
+
}
|
|
234
|
+
async function getInvestmentAccounts(baseUrl, page, account) {
|
|
235
|
+
debug('========== FETCHING INVESTMENT ACCOUNTS ==========');
|
|
236
|
+
const accounts = [];
|
|
237
|
+
const accountNumber = `${account.branchNumber}-${account.accountNumber}`; // Don't include bankNumber here because investment API doesn't use it
|
|
238
|
+
|
|
239
|
+
// Set up request interception to capture session headers
|
|
240
|
+
let capturedSession = null;
|
|
241
|
+
let capturedCsession = null;
|
|
242
|
+
const requestHandler = request => {
|
|
243
|
+
try {
|
|
244
|
+
const headers = request.headers();
|
|
245
|
+
if (headers.session && !capturedSession) {
|
|
246
|
+
capturedSession = headers.session;
|
|
247
|
+
debug(' - Captured session from network request');
|
|
248
|
+
}
|
|
249
|
+
if (headers.csession && !capturedCsession) {
|
|
250
|
+
capturedCsession = headers.csession;
|
|
251
|
+
debug(' - Captured csession from network request');
|
|
252
|
+
}
|
|
253
|
+
request.continue();
|
|
254
|
+
} catch (e) {
|
|
255
|
+
debug(' - Error in request handler: %s', e);
|
|
256
|
+
// Try to continue anyway
|
|
257
|
+
try {
|
|
258
|
+
request.continue();
|
|
259
|
+
} catch (continueError) {
|
|
260
|
+
// Ignore if already handled
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
try {
|
|
265
|
+
// Navigate to mytrade section to establish session
|
|
266
|
+
const mytradeUrl = `${baseUrl}/mytrade/app`;
|
|
267
|
+
debug('Navigating to mytrade section: %s', mytradeUrl);
|
|
268
|
+
await page.setRequestInterception(true);
|
|
269
|
+
page.on('request', requestHandler);
|
|
270
|
+
|
|
271
|
+
// Try to navigate, but if it fails (e.g., MyTrade not enabled), clean up and return empty
|
|
272
|
+
try {
|
|
273
|
+
await page.goto(mytradeUrl, {
|
|
274
|
+
waitUntil: 'networkidle2',
|
|
275
|
+
timeout: 60000
|
|
276
|
+
});
|
|
277
|
+
// Wait longer for the page to fully load and establish session
|
|
278
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
279
|
+
} catch (navError) {
|
|
280
|
+
debug(' - Navigation to MyTrade failed (likely not enabled): %s', navError);
|
|
281
|
+
// Clean up request interception
|
|
282
|
+
page.off('request', requestHandler);
|
|
283
|
+
await page.setRequestInterception(false);
|
|
284
|
+
debug('Returning 0 investment accounts (MyTrade not accessible)');
|
|
285
|
+
return accounts;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Now turn off request interception before we make API calls
|
|
289
|
+
page.off('request', requestHandler);
|
|
290
|
+
await page.setRequestInterception(false);
|
|
291
|
+
debug('Mytrade page loaded, session established');
|
|
292
|
+
const fields = 'EngName,EngSymbol,HebName,HebSymbol,Symbol,ExpirationDate,ItemType,StockType,IsEtf,IsForeign,CurrencyCode,Exchange,CreationEquityNum,EquityType,ContractType,AllowedOrderDirection,EquitySubType';
|
|
293
|
+
const investmentUrl = `${baseUrl}/ServerServices/mytrade/api/v2/json2/account/view?account=${accountNumber}&fields=${fields}`;
|
|
294
|
+
debug('Trying investment account URL: %s', investmentUrl);
|
|
295
|
+
|
|
296
|
+
// Get XSRF token and session data from cookies
|
|
297
|
+
const cookies = await page.cookies();
|
|
298
|
+
const XSRFCookie = cookies.find(cookie => cookie.name === 'XSRF-TOKEN');
|
|
299
|
+
|
|
300
|
+
// Use captured session or fallback to generated ones
|
|
301
|
+
const sessionId = capturedSession || (0, _uuid.v4)();
|
|
302
|
+
const csession = capturedCsession || Math.random().toString();
|
|
303
|
+
const headers = {
|
|
304
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
305
|
+
csession,
|
|
306
|
+
session: sessionId,
|
|
307
|
+
Referer: mytradeUrl
|
|
308
|
+
};
|
|
309
|
+
if (XSRFCookie != null) {
|
|
310
|
+
headers['X-XSRF-TOKEN'] = XSRFCookie.value;
|
|
311
|
+
debug(' - Using XSRF token: %s', XSRFCookie.value.substring(0, 10) + '...');
|
|
312
|
+
}
|
|
313
|
+
debug(' - Request headers: csession=%s, session=%s', csession, sessionId);
|
|
314
|
+
const investmentData = await (0, _fetch.fetchPostWithinPage)(page, investmentUrl, {}, headers);
|
|
315
|
+
debug(' - Response received: %s', investmentData ? 'YES' : 'NO');
|
|
316
|
+
if (investmentData) {
|
|
317
|
+
debug(' - Response has View: %s', investmentData.View ? 'YES' : 'NO');
|
|
318
|
+
debug(' - Response has View.Account: %s', investmentData.View?.Account ? 'YES' : 'NO');
|
|
319
|
+
}
|
|
320
|
+
if (investmentData?.View?.Account) {
|
|
321
|
+
debug('✓ Found investment account data');
|
|
322
|
+
const accountData = investmentData.View.Account;
|
|
323
|
+
const balance = accountData.OnlineValue || 0;
|
|
324
|
+
const currency = accountData.CurrencyCode || _constants.SHEKEL_CURRENCY;
|
|
325
|
+
|
|
326
|
+
// Get securities from the balance array
|
|
327
|
+
const securities = [];
|
|
328
|
+
const balances = accountData.AccountPosition?.Balance || [];
|
|
329
|
+
const metaSecurities = investmentData.View.Meta?.Security || [];
|
|
330
|
+
|
|
331
|
+
// Create a map of security metadata for easy lookup
|
|
332
|
+
const metaMap = new Map();
|
|
333
|
+
for (const meta of metaSecurities) {
|
|
334
|
+
metaMap.set(meta['-Key'], meta);
|
|
335
|
+
}
|
|
336
|
+
for (const securityBalance of balances) {
|
|
337
|
+
const meta = metaMap.get(securityBalance.EquityNumber);
|
|
338
|
+
securities.push({
|
|
339
|
+
name: meta?.EngName || '',
|
|
340
|
+
symbol: meta?.EngSymbol || '',
|
|
341
|
+
volume: securityBalance.OnlineNV,
|
|
342
|
+
value: securityBalance.OnlineVL,
|
|
343
|
+
currency: securityBalance.CurrencyCode || meta?.CurrencyCode || _constants.SHEKEL_CURRENCY,
|
|
344
|
+
changePercentage: securityBalance.BaseRateChangePercentage,
|
|
345
|
+
profitLoss: securityBalance.ProfitLoss
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
debug(' - Balance: %s %s, Securities: %d', balance, currency, securities.length);
|
|
349
|
+
if (balance !== 0 || securities.length > 0) {
|
|
350
|
+
const investmentAccountNumber = `${account.bankNumber}-${account.branchNumber}-${account.accountNumber}-investment`;
|
|
351
|
+
accounts.push({
|
|
352
|
+
accountNumber: investmentAccountNumber,
|
|
353
|
+
balance,
|
|
354
|
+
currency,
|
|
355
|
+
savingsAccount: true,
|
|
356
|
+
txns: [],
|
|
357
|
+
securities
|
|
358
|
+
});
|
|
359
|
+
debug(' ✓ Added investment account: %s with %d securities', investmentAccountNumber, securities.length);
|
|
360
|
+
} else {
|
|
361
|
+
debug(' - Skipping (zero balance and no securities)');
|
|
362
|
+
}
|
|
363
|
+
} else {
|
|
364
|
+
debug(' - No investment account data found');
|
|
365
|
+
}
|
|
366
|
+
} catch (error) {
|
|
367
|
+
debug(' - Error fetching investment account: %s', error);
|
|
368
|
+
// Log more details about the error
|
|
369
|
+
if (error instanceof Error) {
|
|
370
|
+
debug(' Error message: %s', error.message);
|
|
371
|
+
debug(' Error stack: %s', error.stack);
|
|
372
|
+
}
|
|
373
|
+
} finally {
|
|
374
|
+
// Clean up request interception (in case it wasn't already done)
|
|
375
|
+
try {
|
|
376
|
+
page.off('request', requestHandler);
|
|
377
|
+
await page.setRequestInterception(false);
|
|
378
|
+
} catch (e) {
|
|
379
|
+
// Ignore cleanup errors
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Navigate back to the main homepage to restore the session for subsequent scraping
|
|
383
|
+
try {
|
|
384
|
+
const homepageUrl = `${baseUrl}/ng-portals/rb/he/homepage`;
|
|
385
|
+
debug('Navigating back to homepage: %s', homepageUrl);
|
|
386
|
+
await page.goto(homepageUrl, {
|
|
387
|
+
waitUntil: 'networkidle2',
|
|
388
|
+
timeout: 30000
|
|
389
|
+
});
|
|
390
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
391
|
+
debug('Homepage restored');
|
|
392
|
+
} catch (navError) {
|
|
393
|
+
debug(' - Failed to navigate back to homepage: %s', navError);
|
|
394
|
+
// Continue anyway, the outer try-catch in fetchAccountData will handle it
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
debug('Returning %d investment accounts', accounts.length);
|
|
398
|
+
return accounts;
|
|
399
|
+
}
|
|
124
400
|
async function fetchAccountData(page, baseUrl, options) {
|
|
125
401
|
const restContext = await getRestContext(page);
|
|
126
402
|
const apiSiteUrl = `${baseUrl}/${restContext}`;
|
|
@@ -146,12 +422,47 @@ async function fetchAccountData(page, baseUrl, options) {
|
|
|
146
422
|
} else {
|
|
147
423
|
debug('Skipping balance for a closed account, balance will be undefined');
|
|
148
424
|
}
|
|
149
|
-
|
|
425
|
+
let txns = [];
|
|
426
|
+
try {
|
|
427
|
+
txns = await getAccountTransactions(baseUrl, apiSiteUrl, page, accountNumber, startDateStr, endDateStr, additionalTransactionInformation);
|
|
428
|
+
} catch (error) {
|
|
429
|
+
debug('Error fetching transactions for %s (possibly closed account): %s', accountNumber, error);
|
|
430
|
+
// Continue with empty transactions
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Add regular checking account
|
|
150
434
|
accounts.push({
|
|
151
435
|
accountNumber,
|
|
152
436
|
balance,
|
|
153
437
|
txns
|
|
154
438
|
});
|
|
439
|
+
|
|
440
|
+
// Fetch forex accounts for this account number
|
|
441
|
+
try {
|
|
442
|
+
const forexAccounts = await getForexAccounts(baseUrl, page, accountNumber, startDateStr, endDateStr);
|
|
443
|
+
accounts.push(...forexAccounts);
|
|
444
|
+
debug('Added %d forex accounts to results', forexAccounts.length);
|
|
445
|
+
} catch (error) {
|
|
446
|
+
debug('Error fetching forex accounts for %s: %s', accountNumber, error);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Fetch savings accounts for this account number
|
|
450
|
+
try {
|
|
451
|
+
const savingsAccounts = await getSavingsAccounts(baseUrl, page, accountNumber);
|
|
452
|
+
accounts.push(...savingsAccounts);
|
|
453
|
+
debug('Added %d savings accounts to results', savingsAccounts.length);
|
|
454
|
+
} catch (error) {
|
|
455
|
+
debug('Error fetching savings accounts for %s: %s', accountNumber, error);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Fetch investment accounts for this account number
|
|
459
|
+
try {
|
|
460
|
+
const investmentAccounts = await getInvestmentAccounts(baseUrl, page, account);
|
|
461
|
+
accounts.push(...investmentAccounts);
|
|
462
|
+
debug('Added %d investment accounts to results', investmentAccounts.length);
|
|
463
|
+
} catch (error) {
|
|
464
|
+
debug('Error fetching investment accounts for %s: %s', accountNumber, error);
|
|
465
|
+
}
|
|
155
466
|
}
|
|
156
467
|
const accountData = {
|
|
157
468
|
success: true,
|
|
@@ -195,4 +506,4 @@ class HapoalimScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
|
195
506
|
}
|
|
196
507
|
}
|
|
197
508
|
var _default = exports.default = HapoalimScraper;
|
|
198
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdXVpZCIsIl9kZWJ1ZyIsIl9mZXRjaCIsIl9uYXZpZ2F0aW9uIiwiX3dhaXRpbmciLCJfdHJhbnNhY3Rpb25zIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiREFURV9GT1JNQVQiLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsIm1hcCIsInR4biIsImlzT3V0Ym91bmQiLCJldmVudEFjdGl2aXR5VHlwZUNvZGUiLCJtZW1vIiwiYmVuZWZpY2lhcnlEZXRhaWxzRGF0YSIsInBhcnR5SGVhZGxpbmUiLCJwYXJ0eU5hbWUiLCJtZXNzYWdlSGVhZGxpbmUiLCJtZXNzYWdlRGV0YWlsIiwibWVtb0xpbmVzIiwicHVzaCIsImxlbmd0aCIsImpvaW4iLCJyZXN1bHQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2VOdW1iZXIiLCJkYXRlIiwibW9tZW50IiwiZXZlbnREYXRlIiwidG9JU09TdHJpbmciLCJwcm9jZXNzZWREYXRlIiwidmFsdWVEYXRlIiwib3JpZ2luYWxBbW91bnQiLCJldmVudEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJjaGFyZ2VkQW1vdW50IiwiZGVzY3JpcHRpb24iLCJhY3Rpdml0eURlc2NyaXB0aW9uIiwic3RhdHVzIiwic2VyaWFsTnVtYmVyIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIlBlbmRpbmciLCJDb21wbGV0ZWQiLCJnZXRSZXN0Q29udGV4dCIsInBhZ2UiLCJ3YWl0VW50aWwiLCJldmFsdWF0ZSIsIndpbmRvdyIsImJuaHBBcHAiLCJyZXN0Q29udGV4dCIsInNsaWNlIiwiZmV0Y2hQb2FsaW1YU1JGV2l0aGluUGFnZSIsInVybCIsInBhZ2VVdWlkIiwiY29va2llcyIsIlhTUkZDb29raWUiLCJmaW5kIiwiY29va2llIiwibmFtZSIsImhlYWRlcnMiLCJ2YWx1ZSIsInV1aWQiLCJ1dWlkNCIsImZldGNoUG9zdFdpdGhpblBhZ2UiLCJnZXRFeHRyYVNjcmFwIiwidHhuc1Jlc3VsdCIsImJhc2VVcmwiLCJhY2NvdW50TnVtYmVyIiwicHJvbWlzZXMiLCJ0cmFuc2FjdGlvbnMiLCJ0cmFuc2FjdGlvbiIsInBmbURldGFpbHMiLCJleHRyYVRyYW5zYWN0aW9uRGV0YWlscyIsImZldGNoR2V0V2l0aGluUGFnZSIsInRyYW5zYWN0aW9uTnVtYmVyIiwicmVzIiwiUHJvbWlzZSIsImFsbCIsImdldEFjY291bnRUcmFuc2FjdGlvbnMiLCJhcGlTaXRlVXJsIiwic3RhcnREYXRlIiwiZW5kRGF0ZSIsImFkZGl0aW9uYWxUcmFuc2FjdGlvbkluZm9ybWF0aW9uIiwidHhuc1VybCIsImZpbmFsUmVzdWx0IiwiZ2V0QWNjb3VudEJhbGFuY2UiLCJiYWxhbmNlQW5kQ3JlZGl0TGltaXRVcmwiLCJiYWxhbmNlQW5kQ3JlZGl0TGltaXQiLCJjdXJyZW50QmFsYW5jZSIsImZldGNoQWNjb3VudERhdGEiLCJvcHRpb25zIiwiYWNjb3VudERhdGFVcmwiLCJhY2NvdW50c0luZm8iLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsInRvRGF0ZSIsInN0YXJ0TW9tZW50IiwibWF4Iiwic3RhcnREYXRlU3RyIiwiZm9ybWF0IiwiZW5kRGF0ZVN0ciIsImFjY291bnRzIiwiYWNjb3VudCIsImJhbGFuY2UiLCJiYW5rTnVtYmVyIiwiYnJhbmNoTnVtYmVyIiwiaXNBY3RpdmVBY2NvdW50IiwiYWNjb3VudENsb3NpbmdSZWFzb25Db2RlIiwiYWNjb3VudERhdGEiLCJzdWNjZXNzIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkludmFsaWRQYXNzd29yZCIsIkNoYW5nZVBhc3N3b3JkIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidXNlckNvZGUiLCJwYXNzd29yZCIsIkhhcG9hbGltU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRMb2dpbk9wdGlvbnMiLCJsb2dpblVybCIsImZpZWxkcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwicG9zdEFjdGlvbiIsIndhaXRGb3JSZWRpcmVjdCIsInBvc3NpYmxlUmVzdWx0cyIsImZldGNoRGF0YSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9oYXBvYWxpbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgdjQgYXMgdXVpZDQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBmZXRjaEdldFdpdGhpblBhZ2UsIGZldGNoUG9zdFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IHdhaXRGb3JSZWRpcmVjdCB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgdHlwZSBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdoYXBvYWxpbScpO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdZWVlZTU1ERCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5kZWNsYXJlIG5hbWVzcGFjZSB3aW5kb3cge1xuICBjb25zdCBibmhwQXBwOiBhbnk7XG59XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBzZXJpYWxOdW1iZXI/OiBudW1iZXI7XG4gIGFjdGl2aXR5RGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGV2ZW50QW1vdW50OiBudW1iZXI7XG4gIHZhbHVlRGF0ZT86IHN0cmluZztcbiAgZXZlbnREYXRlPzogc3RyaW5nO1xuICByZWZlcmVuY2VOdW1iZXI/OiBudW1iZXI7XG4gIFNjcmFwZWRUcmFuc2FjdGlvbj86IHN0cmluZztcbiAgZXZlbnRBY3Rpdml0eVR5cGVDb2RlOiBudW1iZXI7XG4gIGN1cnJlbnRCYWxhbmNlOiBudW1iZXI7XG4gIHBmbURldGFpbHM6IHN0cmluZztcbiAgYmVuZWZpY2lhcnlEZXRhaWxzRGF0YT86IHtcbiAgICBwYXJ0eUhlYWRsaW5lPzogc3RyaW5nO1xuICAgIHBhcnR5TmFtZT86IHN0cmluZztcbiAgICBtZXNzYWdlSGVhZGxpbmU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZURldGFpbD86IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRQZm1UcmFuc2FjdGlvbiB7XG4gIHRyYW5zYWN0aW9uTnVtYmVyOiBudW1iZXI7XG59XG5cbnR5cGUgRmV0Y2hlZEFjY291bnREYXRhID0ge1xuICBiYW5rTnVtYmVyOiBzdHJpbmc7XG4gIGFjY291bnROdW1iZXI6IHN0cmluZztcbiAgYnJhbmNoTnVtYmVyOiBzdHJpbmc7XG4gIGFjY291bnRDbG9zaW5nUmVhc29uQ29kZTogbnVtYmVyO1xufVtdO1xuXG50eXBlIEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YSA9IHtcbiAgdHJhbnNhY3Rpb25zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXTtcbn07XG5cbnR5cGUgQmFsYW5jZUFuZENyZWRpdExpbWl0ID0ge1xuICBjcmVkaXRMaW1pdEFtb3VudDogbnVtYmVyO1xuICBjcmVkaXRMaW1pdERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNyZWRpdExpbWl0VXRpbGl6YXRpb25BbW91bnQ6IG51bWJlcjtcbiAgY3JlZGl0TGltaXRVdGlsaXphdGlvbkV4aXN0YW5jZUNvZGU6IG51bWJlcjtcbiAgY3JlZGl0TGltaXRVdGlsaXphdGlvblBlcmNlbnQ6IG51bWJlcjtcbiAgY3VycmVudEFjY291bnRMaW1pdHNBbW91bnQ6IG51bWJlcjtcbiAgY3VycmVudEJhbGFuY2U6IG51bWJlcjtcbiAgd2l0aGRyYXdhbEJhbGFuY2U6IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKHR4biA9PiB7XG4gICAgY29uc3QgaXNPdXRib3VuZCA9IHR4bi5ldmVudEFjdGl2aXR5VHlwZUNvZGUgPT09IDI7XG5cbiAgICBsZXQgbWVtbyA9ICcnO1xuICAgIGlmICh0eG4uYmVuZWZpY2lhcnlEZXRhaWxzRGF0YSkge1xuICAgICAgY29uc3QgeyBwYXJ0eUhlYWRsaW5lLCBwYXJ0eU5hbWUsIG1lc3NhZ2VIZWFkbGluZSwgbWVzc2FnZURldGFpbCB9ID0gdHhuLmJlbmVmaWNpYXJ5RGV0YWlsc0RhdGE7XG4gICAgICBjb25zdCBtZW1vTGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAocGFydHlIZWFkbGluZSkge1xuICAgICAgICBtZW1vTGluZXMucHVzaChwYXJ0eUhlYWRsaW5lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnR5TmFtZSkge1xuICAgICAgICBtZW1vTGluZXMucHVzaChgJHtwYXJ0eU5hbWV9LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZUhlYWRsaW5lKSB7XG4gICAgICAgIG1lbW9MaW5lcy5wdXNoKG1lc3NhZ2VIZWFkbGluZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlRGV0YWlsKSB7XG4gICAgICAgIG1lbW9MaW5lcy5wdXNoKGAke21lc3NhZ2VEZXRhaWx9LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVtb0xpbmVzLmxlbmd0aCkge1xuICAgICAgICBtZW1vID0gbWVtb0xpbmVzLmpvaW4oJyAnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlTnVtYmVyLFxuICAgICAgZGF0ZTogbW9tZW50KHR4bi5ldmVudERhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogbW9tZW50KHR4bi52YWx1ZURhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGlzT3V0Ym91bmQgPyAtdHhuLmV2ZW50QW1vdW50IDogdHhuLmV2ZW50QW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogJ0lMUycsXG4gICAgICBjaGFyZ2VkQW1vdW50OiBpc091dGJvdW5kID8gLXR4bi5ldmVudEFtb3VudCA6IHR4bi5ldmVudEFtb3VudCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uYWN0aXZpdHlEZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIHN0YXR1czogdHhuLnNlcmlhbE51bWJlciA9PT0gMCA/IFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyA6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgbWVtbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc3RDb250ZXh0KHBhZ2U6IFBhZ2UpIHtcbiAgYXdhaXQgd2FpdFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZSgoKSA9PiAhIXdpbmRvdy5ibmhwQXBwKTtcbiAgfSwgJ3dhaXRpbmcgZm9yIGFwcCBkYXRhIGxvYWQnKTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHtcbiAgICByZXR1cm4gd2luZG93LmJuaHBBcHAucmVzdENvbnRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuc2xpY2UoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUG9hbGltWFNSRldpdGhpblBhZ2UoXG4gIHBhZ2U6IFBhZ2UsXG4gIHVybDogc3RyaW5nLFxuICBwYWdlVXVpZDogc3RyaW5nLFxuKTogUHJvbWlzZTxGZXRjaGVkQWNjb3VudFRyYW5zYWN0aW9uc0RhdGEgfCBudWxsPiB7XG4gIGNvbnN0IGNvb2tpZXMgPSBhd2FpdCBwYWdlLmNvb2tpZXMoKTtcbiAgY29uc3QgWFNSRkNvb2tpZSA9IGNvb2tpZXMuZmluZChjb29raWUgPT4gY29va2llLm5hbWUgPT09ICdYU1JGLVRPS0VOJyk7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgaWYgKFhTUkZDb29raWUgIT0gbnVsbCkge1xuICAgIGhlYWRlcnNbJ1gtWFNSRi1UT0tFTiddID0gWFNSRkNvb2tpZS52YWx1ZTtcbiAgfVxuICBoZWFkZXJzLnBhZ2VVdWlkID0gcGFnZVV1aWQ7XG4gIGhlYWRlcnMudXVpZCA9IHV1aWQ0KCk7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCc7XG4gIHJldHVybiBmZXRjaFBvc3RXaXRoaW5QYWdlPEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YT4ocGFnZSwgdXJsLCBbXSwgaGVhZGVycyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhU2NyYXAoXG4gIHR4bnNSZXN1bHQ6IEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YSxcbiAgYmFzZVVybDogc3RyaW5nLFxuICBwYWdlOiBQYWdlLFxuICBhY2NvdW50TnVtYmVyOiBzdHJpbmcsXG4pOiBQcm9taXNlPEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YT4ge1xuICBjb25zdCBwcm9taXNlcyA9IHR4bnNSZXN1bHQudHJhbnNhY3Rpb25zLm1hcChhc3luYyAodHJhbnNhY3Rpb246IFNjcmFwZWRUcmFuc2FjdGlvbik6IFByb21pc2U8U2NyYXBlZFRyYW5zYWN0aW9uPiA9PiB7XG4gICAgY29uc3QgeyBwZm1EZXRhaWxzLCBzZXJpYWxOdW1iZXIgfSA9IHRyYW5zYWN0aW9uO1xuICAgIGlmIChzZXJpYWxOdW1iZXIgIT09IDApIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9JHtwZm1EZXRhaWxzfSZhY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZsYW5nPWhlYDtcbiAgICAgIGNvbnN0IGV4dHJhVHJhbnNhY3Rpb25EZXRhaWxzID0gKGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkUGZtVHJhbnNhY3Rpb25bXT4ocGFnZSwgdXJsKSkgfHwgW107XG4gICAgICBpZiAoZXh0cmFUcmFuc2FjdGlvbkRldGFpbHMgJiYgZXh0cmFUcmFuc2FjdGlvbkRldGFpbHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNhY3Rpb25OdW1iZXIgfSA9IGV4dHJhVHJhbnNhY3Rpb25EZXRhaWxzWzBdO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25OdW1iZXIpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi50cmFuc2FjdGlvbiwgcmVmZXJlbmNlTnVtYmVyOiB0cmFuc2FjdGlvbk51bWJlciB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiByZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhcbiAgYmFzZVVybDogc3RyaW5nLFxuICBhcGlTaXRlVXJsOiBzdHJpbmcsXG4gIHBhZ2U6IFBhZ2UsXG4gIGFjY291bnROdW1iZXI6IHN0cmluZyxcbiAgc3RhcnREYXRlOiBzdHJpbmcsXG4gIGVuZERhdGU6IHN0cmluZyxcbiAgYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24gPSBmYWxzZSxcbikge1xuICBjb25zdCB0eG5zVXJsID0gYCR7YXBpU2l0ZVVybH0vY3VycmVudC1hY2NvdW50L3RyYW5zYWN0aW9ucz9hY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZudW1JdGVtc1BlclBhZ2U9MTAwMCZyZXRyaWV2YWxFbmREYXRlPSR7ZW5kRGF0ZX0mcmV0cmlldmFsU3RhcnREYXRlPSR7c3RhcnREYXRlfSZzb3J0Q29kZT0xYDtcbiAgY29uc3QgdHhuc1Jlc3VsdCA9IGF3YWl0IGZldGNoUG9hbGltWFNSRldpdGhpblBhZ2UocGFnZSwgdHhuc1VybCwgJy9jdXJyZW50LWFjY291bnQvdHJhbnNhY3Rpb25zJyk7XG5cbiAgY29uc3QgZmluYWxSZXN1bHQgPVxuICAgIGFkZGl0aW9uYWxUcmFuc2FjdGlvbkluZm9ybWF0aW9uICYmIHR4bnNSZXN1bHQ/LnRyYW5zYWN0aW9ucy5sZW5ndGhcbiAgICAgID8gYXdhaXQgZ2V0RXh0cmFTY3JhcCh0eG5zUmVzdWx0LCBiYXNlVXJsLCBwYWdlLCBhY2NvdW50TnVtYmVyKVxuICAgICAgOiB0eG5zUmVzdWx0O1xuXG4gIHJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25zKGZpbmFsUmVzdWx0Py50cmFuc2FjdGlvbnMgPz8gW10pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50QmFsYW5jZShhcGlTaXRlVXJsOiBzdHJpbmcsIHBhZ2U6IFBhZ2UsIGFjY291bnROdW1iZXI6IHN0cmluZykge1xuICBjb25zdCBiYWxhbmNlQW5kQ3JlZGl0TGltaXRVcmwgPSBgJHthcGlTaXRlVXJsfS9jdXJyZW50LWFjY291bnQvY29tcG9zaXRlL2JhbGFuY2VBbmRDcmVkaXRMaW1pdD9hY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZ2aWV3PWRldGFpbHMmbGFuZz1oZWA7XG4gIGNvbnN0IGJhbGFuY2VBbmRDcmVkaXRMaW1pdCA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxCYWxhbmNlQW5kQ3JlZGl0TGltaXQ+KHBhZ2UsIGJhbGFuY2VBbmRDcmVkaXRMaW1pdFVybCk7XG5cbiAgcmV0dXJuIGJhbGFuY2VBbmRDcmVkaXRMaW1pdD8uY3VycmVudEJhbGFuY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGEocGFnZTogUGFnZSwgYmFzZVVybDogc3RyaW5nLCBvcHRpb25zOiBTY3JhcGVyT3B0aW9ucykge1xuICBjb25zdCByZXN0Q29udGV4dCA9IGF3YWl0IGdldFJlc3RDb250ZXh0KHBhZ2UpO1xuICBjb25zdCBhcGlTaXRlVXJsID0gYCR7YmFzZVVybH0vJHtyZXN0Q29udGV4dH1gO1xuICBjb25zdCBhY2NvdW50RGF0YVVybCA9IGAke2Jhc2VVcmx9L1NlcnZlclNlcnZpY2VzL2dlbmVyYWwvYWNjb3VudHNgO1xuXG4gIGRlYnVnKCdmZXRjaGluZyBhY2NvdW50cyBkYXRhJyk7XG4gIGNvbnN0IGFjY291bnRzSW5mbyA9IChhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8RmV0Y2hlZEFjY291bnREYXRhPihwYWdlLCBhY2NvdW50RGF0YVVybCkpIHx8IFtdO1xuICBkZWJ1ZygnZ290ICVkIGFjY291bnRzLCBmZXRjaGluZyB0eG5zIGFuZCBiYWxhbmNlJywgYWNjb3VudHNJbmZvLmxlbmd0aCk7XG5cbiAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuYWRkKDEsICdkYXknKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG4gIGNvbnN0IHsgYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24gfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc3RhcnREYXRlU3RyID0gc3RhcnRNb21lbnQuZm9ybWF0KERBVEVfRk9STUFUKTtcbiAgY29uc3QgZW5kRGF0ZVN0ciA9IG1vbWVudCgpLmZvcm1hdChEQVRFX0ZPUk1BVCk7XG5cbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYWNjb3VudCBvZiBhY2NvdW50c0luZm8pIHtcbiAgICBsZXQgYmFsYW5jZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjY291bnROdW1iZXIgPSBgJHthY2NvdW50LmJhbmtOdW1iZXJ9LSR7YWNjb3VudC5icmFuY2hOdW1iZXJ9LSR7YWNjb3VudC5hY2NvdW50TnVtYmVyfWA7XG5cbiAgICBjb25zdCBpc0FjdGl2ZUFjY291bnQgPSBhY2NvdW50LmFjY291bnRDbG9zaW5nUmVhc29uQ29kZSA9PT0gMDtcbiAgICBpZiAoaXNBY3RpdmVBY2NvdW50KSB7XG4gICAgICBiYWxhbmNlID0gYXdhaXQgZ2V0QWNjb3VudEJhbGFuY2UoYXBpU2l0ZVVybCwgcGFnZSwgYWNjb3VudE51bWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdTa2lwcGluZyBiYWxhbmNlIGZvciBhIGNsb3NlZCBhY2NvdW50LCBiYWxhbmNlIHdpbGwgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhucyA9IGF3YWl0IGdldEFjY291bnRUcmFuc2FjdGlvbnMoXG4gICAgICBiYXNlVXJsLFxuICAgICAgYXBpU2l0ZVVybCxcbiAgICAgIHBhZ2UsXG4gICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgc3RhcnREYXRlU3RyLFxuICAgICAgZW5kRGF0ZVN0cixcbiAgICAgIGFkZGl0aW9uYWxUcmFuc2FjdGlvbkluZm9ybWF0aW9uLFxuICAgICk7XG5cbiAgICBhY2NvdW50cy5wdXNoKHtcbiAgICAgIGFjY291bnROdW1iZXIsXG4gICAgICBiYWxhbmNlLFxuICAgICAgdHhucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGFjY291bnREYXRhID0ge1xuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgYWNjb3VudHMsXG4gIH07XG4gIGRlYnVnKCdmZXRjaGluZyBlbmRlZCcpO1xuICByZXR1cm4gYWNjb3VudERhdGE7XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKGJhc2VVcmw6IHN0cmluZykge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtcbiAgICBgJHtiYXNlVXJsfS9wb3J0YWxzZXJ2ZXIvSG9tZVBhZ2VgLFxuICAgIGAke2Jhc2VVcmx9L25nLXBvcnRhbHMtYnQvcmIvaGUvaG9tZXBhZ2VgLFxuICAgIGAke2Jhc2VVcmx9L25nLXBvcnRhbHMvcmIvaGUvaG9tZXBhZ2VgLFxuICBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gW1xuICAgIGAke2Jhc2VVcmx9L0FVVEhFTlRJQ0FURS9MT0dPTj9mbG93PUFVVEhFTlRJQ0FURSZzdGF0ZT1MT0dPTiZlcnJvcmNvZGU9MS42JmNhbGxtZT1mYWxzZWAsXG4gIF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkXSA9IFtcbiAgICBgJHtiYXNlVXJsfS9NQ1AvU1RBUlQ/Zmxvdz1NQ1Amc3RhdGU9U1RBUlQmZXhwaXJlZERhdGU9bnVsbGAsXG4gICAgL1xcL0FCT1VUVE9FWFBJUkVcXC9TVEFSVC9pLFxuICBdO1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN1c2VyQ29kZScsIHZhbHVlOiBjcmVkZW50aWFscy51c2VyQ29kZSB9LFxuICAgIHsgc2VsZWN0b3I6ICcjcGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlckNvZGU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBIYXBvYWxpbVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIGdldCBiYXNlVXJsKCkge1xuICAgIHJldHVybiAnaHR0cHM6Ly9sb2dpbi5iYW5raGFwb2FsaW0uY28uaWwnO1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogYCR7dGhpcy5iYXNlVXJsfS9jZ2ktYmluL3BvYWx3d3djP3JlcU5hbWU9Z2V0TG9nb25QYWdlYCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICcubG9naW4tYnRuJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JSZWRpcmVjdCh0aGlzLnBhZ2UpLFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyh0aGlzLmJhc2VVcmwpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgcmV0dXJuIGZldGNoQWNjb3VudERhdGEodGhpcy5wYWdlLCB0aGlzLmJhc2VVcmwsIHRoaXMub3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFwb2FsaW1TY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxhQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyx1QkFBQSxHQUFBUCxPQUFBO0FBQThHLFNBQUFELHVCQUFBUyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRzlHLE1BQU1HLEtBQUssR0FBRyxJQUFBQyxlQUFRLEVBQUMsVUFBVSxDQUFDO0FBRWxDLE1BQU1DLFdBQVcsR0FBRyxVQUFVOztBQUU5Qjs7QUFrREEsU0FBU0MsbUJBQW1CQSxDQUFDQyxJQUEwQixFQUFpQjtFQUN0RSxPQUFPQSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsR0FBRyxJQUFJO0lBQ3JCLE1BQU1DLFVBQVUsR0FBR0QsR0FBRyxDQUFDRSxxQkFBcUIsS0FBSyxDQUFDO0lBRWxELElBQUlDLElBQUksR0FBRyxFQUFFO0lBQ2IsSUFBSUgsR0FBRyxDQUFDSSxzQkFBc0IsRUFBRTtNQUM5QixNQUFNO1FBQUVDLGFBQWE7UUFBRUMsU0FBUztRQUFFQyxlQUFlO1FBQUVDO01BQWMsQ0FBQyxHQUFHUixHQUFHLENBQUNJLHNCQUFzQjtNQUMvRixNQUFNSyxTQUFtQixHQUFHLEVBQUU7TUFDOUIsSUFBSUosYUFBYSxFQUFFO1FBQ2pCSSxTQUFTLENBQUNDLElB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
|
|
509
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdXVpZCIsIl9jb25zdGFudHMiLCJfZGVidWciLCJfZmV0Y2giLCJfbmF2aWdhdGlvbiIsIl93YWl0aW5nIiwiX3RyYW5zYWN0aW9ucyIsIl9iYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZGVidWciLCJnZXREZWJ1ZyIsIkRBVEVfRk9STUFUIiwiY29udmVydFRyYW5zYWN0aW9ucyIsInR4bnMiLCJtYXAiLCJ0eG4iLCJpc091dGJvdW5kIiwiZXZlbnRBY3Rpdml0eVR5cGVDb2RlIiwibWVtbyIsImJlbmVmaWNpYXJ5RGV0YWlsc0RhdGEiLCJwYXJ0eUhlYWRsaW5lIiwicGFydHlOYW1lIiwibWVzc2FnZUhlYWRsaW5lIiwibWVzc2FnZURldGFpbCIsIm1lbW9MaW5lcyIsInB1c2giLCJsZW5ndGgiLCJqb2luIiwicmVzdWx0IiwidHlwZSIsIlRyYW5zYWN0aW9uVHlwZXMiLCJOb3JtYWwiLCJpZGVudGlmaWVyIiwicmVmZXJlbmNlTnVtYmVyIiwiZGF0ZSIsIm1vbWVudCIsImV2ZW50RGF0ZSIsInRvSVNPU3RyaW5nIiwicHJvY2Vzc2VkRGF0ZSIsInZhbHVlRGF0ZSIsIm9yaWdpbmFsQW1vdW50IiwiZXZlbnRBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiU0hFS0VMX0NVUlJFTkNZIiwiY2hhcmdlZEFtb3VudCIsImRlc2NyaXB0aW9uIiwiYWN0aXZpdHlEZXNjcmlwdGlvbiIsInN0YXR1cyIsInNlcmlhbE51bWJlciIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJQZW5kaW5nIiwiQ29tcGxldGVkIiwiY29udmVydEZvcmV4VHJhbnNhY3Rpb25zIiwiY3VycmVuY3kiLCJkYXRlU3RyIiwiZXhlY3V0aW5nRGF0ZSIsInRvU3RyaW5nIiwidmFsdWVEYXRlU3RyIiwiZXZlbnREZXRhaWxzIiwicmVjb3JkU2VyaWFsTnVtYmVyIiwiZ2V0UmVzdENvbnRleHQiLCJwYWdlIiwid2FpdFVudGlsIiwiZXZhbHVhdGUiLCJ3aW5kb3ciLCJibmhwQXBwIiwicmVzdENvbnRleHQiLCJzbGljZSIsImZldGNoUG9hbGltWFNSRldpdGhpblBhZ2UiLCJ1cmwiLCJwYWdlVXVpZCIsImNvb2tpZXMiLCJYU1JGQ29va2llIiwiZmluZCIsImNvb2tpZSIsIm5hbWUiLCJoZWFkZXJzIiwidmFsdWUiLCJ1dWlkIiwidXVpZDQiLCJmZXRjaFBvc3RXaXRoaW5QYWdlIiwiZ2V0RXh0cmFTY3JhcCIsInR4bnNSZXN1bHQiLCJiYXNlVXJsIiwiYWNjb3VudE51bWJlciIsInByb21pc2VzIiwidHJhbnNhY3Rpb25zIiwidHJhbnNhY3Rpb24iLCJwZm1EZXRhaWxzIiwiZXh0cmFUcmFuc2FjdGlvbkRldGFpbHMiLCJmZXRjaEdldFdpdGhpblBhZ2UiLCJ0cmFuc2FjdGlvbk51bWJlciIsInJlcyIsIlByb21pc2UiLCJhbGwiLCJnZXRBY2NvdW50VHJhbnNhY3Rpb25zIiwiYXBpU2l0ZVVybCIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJhZGRpdGlvbmFsVHJhbnNhY3Rpb25JbmZvcm1hdGlvbiIsInR4bnNVcmwiLCJmaW5hbFJlc3VsdCIsImdldEFjY291bnRCYWxhbmNlIiwiYmFsYW5jZUFuZENyZWRpdExpbWl0VXJsIiwiYmFsYW5jZUFuZENyZWRpdExpbWl0IiwiY3VycmVudEJhbGFuY2UiLCJnZXRGb3JleEFjY291bnRzIiwiYWNjb3VudHMiLCJjb2RlIiwic3dpZnQiLCJkZXRhaWxlZEFjY291bnRUeXBlQ29kZSIsImZvcmV4VXJsIiwiZm9yZXhEYXRhIiwiYmFsYW5jZXNBbmRMaW1pdHNEYXRhTGlzdCIsImN1cnJlbmN5RGF0YSIsImN1cnJlbmN5U3dpZnRDb2RlIiwidHJhbnNhY3Rpb25Db3VudCIsImJhbGFuY2UiLCJ0eG5EYXRlcyIsInQiLCJmb3JleEFjY291bnROdW1iZXIiLCJlcnJvciIsImdldFNhdmluZ3NBY2NvdW50cyIsInNhdmluZ3NVcmwiLCJzYXZpbmdzRGF0YSIsImRlcG9zaXRzV3JhcHBlckRhdGEiLCJ3cmFwcGVyIiwiZGVwb3NpdCIsImRhdGEiLCJyZXZhbHVlZFRvdGFsQW1vdW50IiwicHJpbmNpcGFsQW1vdW50Iiwic2F2aW5nc0FjY291bnROdW1iZXIiLCJkZXBvc2l0U2VyaWFsSWQiLCJzYXZpbmdzQWNjb3VudCIsImdldEludmVzdG1lbnRBY2NvdW50cyIsImFjY291bnQiLCJicmFuY2hOdW1iZXIiLCJjYXB0dXJlZFNlc3Npb24iLCJjYXB0dXJlZENzZXNzaW9uIiwicmVxdWVzdEhhbmRsZXIiLCJyZXF1ZXN0Iiwic2Vzc2lvbiIsImNzZXNzaW9uIiwiY29udGludWUiLCJjb250aW51ZUVycm9yIiwibXl0cmFkZVVybCIsInNldFJlcXVlc3RJbnRlcmNlcHRpb24iLCJvbiIsImdvdG8iLCJ0aW1lb3V0IiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJuYXZFcnJvciIsIm9mZiIsImZpZWxkcyIsImludmVzdG1lbnRVcmwiLCJzZXNzaW9uSWQiLCJNYXRoIiwicmFuZG9tIiwiUmVmZXJlciIsInN1YnN0cmluZyIsImludmVzdG1lbnREYXRhIiwiVmlldyIsIkFjY291bnQiLCJhY2NvdW50RGF0YSIsIk9ubGluZVZhbHVlIiwiQ3VycmVuY3lDb2RlIiwic2VjdXJpdGllcyIsImJhbGFuY2VzIiwiQWNjb3VudFBvc2l0aW9uIiwiQmFsYW5jZSIsIm1ldGFTZWN1cml0aWVzIiwiTWV0YSIsIlNlY3VyaXR5IiwibWV0YU1hcCIsIk1hcCIsIm1ldGEiLCJzZXQiLCJzZWN1cml0eUJhbGFuY2UiLCJnZXQiLCJFcXVpdHlOdW1iZXIiLCJFbmdOYW1lIiwic3ltYm9sIiwiRW5nU3ltYm9sIiwidm9sdW1lIiwiT25saW5lTlYiLCJPbmxpbmVWTCIsImNoYW5nZVBlcmNlbnRhZ2UiLCJCYXNlUmF0ZUNoYW5nZVBlcmNlbnRhZ2UiLCJwcm9maXRMb3NzIiwiUHJvZml0TG9zcyIsImludmVzdG1lbnRBY2NvdW50TnVtYmVyIiwiYmFua051bWJlciIsIkVycm9yIiwibWVzc2FnZSIsInN0YWNrIiwiaG9tZXBhZ2VVcmwiLCJmZXRjaEFjY291bnREYXRhIiwib3B0aW9ucyIsImFjY291bnREYXRhVXJsIiwiYWNjb3VudHNJbmZvIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJhZGQiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsInN0YXJ0RGF0ZVN0ciIsImZvcm1hdCIsImVuZERhdGVTdHIiLCJpc0FjdGl2ZUFjY291bnQiLCJhY2NvdW50Q2xvc2luZ1JlYXNvbkNvZGUiLCJmb3JleEFjY291bnRzIiwic2F2aW5nc0FjY291bnRzIiwiaW52ZXN0bWVudEFjY291bnRzIiwic3VjY2VzcyIsImdldFBvc3NpYmxlTG9naW5SZXN1bHRzIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJDaGFuZ2VQYXNzd29yZCIsImNyZWF0ZUxvZ2luRmllbGRzIiwiY3JlZGVudGlhbHMiLCJzZWxlY3RvciIsInVzZXJDb2RlIiwicGFzc3dvcmQiLCJIYXBvYWxpbVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInBvc3RBY3Rpb24iLCJ3YWl0Rm9yUmVkaXJlY3QiLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvaGFwb2FsaW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IHY0IGFzIHV1aWQ0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTSEVLRUxfQ1VSUkVOQ1kgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGZldGNoR2V0V2l0aGluUGFnZSwgZmV0Y2hQb3N0V2l0aGluUGFnZSB9IGZyb20gJy4uL2hlbHBlcnMvZmV0Y2gnO1xuaW1wb3J0IHsgd2FpdEZvclJlZGlyZWN0IH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IHdhaXRVbnRpbCB9IGZyb20gJy4uL2hlbHBlcnMvd2FpdGluZyc7XG5pbXBvcnQge1xuICB0eXBlIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblN0YXR1c2VzLFxuICBUcmFuc2FjdGlvblR5cGVzLFxuICB0eXBlIFRyYW5zYWN0aW9uc0FjY291bnQsXG4gIHR5cGUgU2VjdXJpdHksXG59IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnaGFwb2FsaW0nKTtcblxuY29uc3QgREFURV9GT1JNQVQgPSAnWVlZWU1NREQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZGVjbGFyZSBuYW1lc3BhY2Ugd2luZG93IHtcbiAgY29uc3QgYm5ocEFwcDogYW55O1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgc2VyaWFsTnVtYmVyPzogbnVtYmVyO1xuICBhY3Rpdml0eURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBldmVudEFtb3VudDogbnVtYmVyO1xuICB2YWx1ZURhdGU/OiBzdHJpbmc7XG4gIGV2ZW50RGF0ZT86IHN0cmluZztcbiAgcmVmZXJlbmNlTnVtYmVyPzogbnVtYmVyO1xuICBTY3JhcGVkVHJhbnNhY3Rpb24/OiBzdHJpbmc7XG4gIGV2ZW50QWN0aXZpdHlUeXBlQ29kZTogbnVtYmVyO1xuICBjdXJyZW50QmFsYW5jZTogbnVtYmVyO1xuICBwZm1EZXRhaWxzOiBzdHJpbmc7XG4gIGJlbmVmaWNpYXJ5RGV0YWlsc0RhdGE/OiB7XG4gICAgcGFydHlIZWFkbGluZT86IHN0cmluZztcbiAgICBwYXJ0eU5hbWU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZUhlYWRsaW5lPzogc3RyaW5nO1xuICAgIG1lc3NhZ2VEZXRhaWw/OiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTY3JhcGVkUGZtVHJhbnNhY3Rpb24ge1xuICB0cmFuc2FjdGlvbk51bWJlcjogbnVtYmVyO1xufVxuXG50eXBlIEZldGNoZWRBY2NvdW50RGF0YSA9IHtcbiAgYmFua051bWJlcjogc3RyaW5nO1xuICBhY2NvdW50TnVtYmVyOiBzdHJpbmc7XG4gIGJyYW5jaE51bWJlcjogc3RyaW5nO1xuICBhY2NvdW50Q2xvc2luZ1JlYXNvbkNvZGU6IG51bWJlcjtcbn1bXTtcblxudHlwZSBGZXRjaGVkQWNjb3VudFRyYW5zYWN0aW9uc0RhdGEgPSB7XG4gIHRyYW5zYWN0aW9uczogU2NyYXBlZFRyYW5zYWN0aW9uW107XG59O1xuXG50eXBlIEJhbGFuY2VBbmRDcmVkaXRMaW1pdCA9IHtcbiAgY3JlZGl0TGltaXRBbW91bnQ6IG51bWJlcjtcbiAgY3JlZGl0TGltaXREZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVkaXRMaW1pdFV0aWxpemF0aW9uQW1vdW50OiBudW1iZXI7XG4gIGNyZWRpdExpbWl0VXRpbGl6YXRpb25FeGlzdGFuY2VDb2RlOiBudW1iZXI7XG4gIGNyZWRpdExpbWl0VXRpbGl6YXRpb25QZXJjZW50OiBudW1iZXI7XG4gIGN1cnJlbnRBY2NvdW50TGltaXRzQW1vdW50OiBudW1iZXI7XG4gIGN1cnJlbnRCYWxhbmNlOiBudW1iZXI7XG4gIHdpdGhkcmF3YWxCYWxhbmNlOiBudW1iZXI7XG59O1xuXG5pbnRlcmZhY2UgRm9yZXhUcmFuc2FjdGlvbiB7XG4gIGV4ZWN1dGluZ0RhdGU6IG51bWJlcjtcbiAgdmFsdWVEYXRlOiBudW1iZXI7XG4gIGFjdGl2aXR5RGVzY3JpcHRpb246IHN0cmluZztcbiAgZXZlbnRBbW91bnQ6IG51bWJlcjtcbiAgY3VycmVudEJhbGFuY2U6IG51bWJlcjtcbiAgcmVmZXJlbmNlTnVtYmVyPzogbnVtYmVyO1xuICBldmVudERldGFpbHM/OiBzdHJpbmc7XG4gIGV2ZW50QWN0aXZpdHlUeXBlQ29kZTogbnVtYmVyO1xuICBjdXJyZW5jeVN3aWZ0Q29kZTogc3RyaW5nO1xuICByZWNvcmRTZXJpYWxOdW1iZXI/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBGb3JleEN1cnJlbmN5RGF0YSB7XG4gIGN1cnJlbmN5Q29kZTogbnVtYmVyO1xuICBjdXJyZW5jeVN3aWZ0Q29kZTogc3RyaW5nO1xuICBjdXJyZW5jeVN3aWZ0RGVzY3JpcHRpb246IHN0cmluZztcbiAgY3VycmVudEJhbGFuY2U6IG51bWJlcjtcbiAgdHJhbnNhY3Rpb25zOiBGb3JleFRyYW5zYWN0aW9uW107XG4gIGRldGFpbGVkQWNjb3VudFR5cGVDb2RlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBGb3JleEFjY291bnREYXRhIHtcbiAgYmFsYW5jZXNBbmRMaW1pdHNEYXRhTGlzdDogRm9yZXhDdXJyZW5jeURhdGFbXTtcbn1cblxuaW50ZXJmYWNlIFNhdmluZ3NEZXBvc2l0IHtcbiAgcHJpbmNpcGFsQW1vdW50OiBudW1iZXI7XG4gIHJldmFsdWVkVG90YWxBbW91bnQ6IG51bWJlcjtcbiAgZGVwb3NpdFNlcmlhbElkOiBudW1iZXI7XG4gIHByb2R1Y3RGcmVlVGV4dD86IHN0cmluZztcbiAgc2hvcnRQcm9kdWN0TmFtZT86IHN0cmluZztcbiAgZm9ybWF0dGVkQWdyZWVtZW50T3BlbmluZ0RhdGU/OiBzdHJpbmc7XG4gIGZvcm1hdHRlZEVuZEV4aXREYXRlPzogc3RyaW5nO1xuICBub21pbmFsSW50ZXJlc3Q/OiBudW1iZXI7XG4gIGRldGFpbGVkQWNjb3VudFR5cGVDb2RlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTYXZpbmdzV3JhcHBlciB7XG4gIGRhdGE6IFNhdmluZ3NEZXBvc2l0W107XG4gIGFtb3VudDogbnVtYmVyO1xuICByZXZhbHVhdGVkQW1vdW50OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTYXZpbmdzQWNjb3VudERhdGEge1xuICBkZXBvc2l0c1dyYXBwZXJEYXRhOiBTYXZpbmdzV3JhcHBlcltdO1xufVxuXG5pbnRlcmZhY2UgSW52ZXN0bWVudFNlY3VyaXR5QmFsYW5jZSB7XG4gIEVxdWl0eU51bWJlcjogc3RyaW5nO1xuICBCYXNlUmF0ZT86IG51bWJlcjtcbiAgTGFzdFJhdGU/OiBudW1iZXI7XG4gIEJhc2VSYXRlQ2hhbmdlUGVyY2VudGFnZT86IG51bWJlcjtcbiAgT25saW5lTlY6IG51bWJlcjtcbiAgT25saW5lVkw6IG51bWJlcjtcbiAgT25saW5lTmlzVkw/OiBudW1iZXI7XG4gIFByb2ZpdExvc3M/OiBudW1iZXI7XG4gIEN1cnJlbmN5Q29kZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludmVzdG1lbnRTZWN1cml0eU1ldGEge1xuICAnLUtleSc6IHN0cmluZztcbiAgRW5nTmFtZT86IHN0cmluZztcbiAgRW5nU3ltYm9sPzogc3RyaW5nO1xuICBIZWJOYW1lPzogc3RyaW5nO1xuICBIZWJTeW1ib2w/OiBzdHJpbmc7XG4gIFN5bWJvbD86IHN0cmluZztcbiAgSXRlbVR5cGU/OiBzdHJpbmc7XG4gIFN0b2NrVHlwZT86IHN0cmluZztcbiAgSXNGb3JlaWduPzogYm9vbGVhbjtcbiAgQ3VycmVuY3lDb2RlPzogc3RyaW5nO1xuICBFeGNoYW5nZT86IHN0cmluZztcbiAgRXF1aXR5VHlwZT86IG51bWJlcjtcbiAgRXF1aXR5U3ViVHlwZT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEludmVzdG1lbnRBY2NvdW50RGF0YSB7XG4gIFZpZXc/OiB7XG4gICAgQWNjb3VudD86IHtcbiAgICAgIE9ubGluZVZhbHVlPzogbnVtYmVyO1xuICAgICAgT25saW5lQ2FzaD86IG51bWJlcjtcbiAgICAgIEN1cnJlbmN5Q29kZT86IHN0cmluZztcbiAgICAgIEFjY291bnRQb3NpdGlvbj86IHtcbiAgICAgICAgQmFsYW5jZT86IEludmVzdG1lbnRTZWN1cml0eUJhbGFuY2VbXTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBNZXRhPzoge1xuICAgICAgU2VjdXJpdHk/OiBJbnZlc3RtZW50U2VjdXJpdHlNZXRhW107XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICByZXR1cm4gdHhucy5tYXAodHhuID0+IHtcbiAgICBjb25zdCBpc091dGJvdW5kID0gdHhuLmV2ZW50QWN0aXZpdHlUeXBlQ29kZSA9PT0gMjtcblxuICAgIGxldCBtZW1vID0gJyc7XG4gICAgaWYgKHR4bi5iZW5lZmljaWFyeURldGFpbHNEYXRhKSB7XG4gICAgICBjb25zdCB7IHBhcnR5SGVhZGxpbmUsIHBhcnR5TmFtZSwgbWVzc2FnZUhlYWRsaW5lLCBtZXNzYWdlRGV0YWlsIH0gPSB0eG4uYmVuZWZpY2lhcnlEZXRhaWxzRGF0YTtcbiAgICAgIGNvbnN0IG1lbW9MaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChwYXJ0eUhlYWRsaW5lKSB7XG4gICAgICAgIG1lbW9MaW5lcy5wdXNoKHBhcnR5SGVhZGxpbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydHlOYW1lKSB7XG4gICAgICAgIG1lbW9MaW5lcy5wdXNoKGAke3BhcnR5TmFtZX0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlSGVhZGxpbmUpIHtcbiAgICAgICAgbWVtb0xpbmVzLnB1c2gobWVzc2FnZUhlYWRsaW5lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2VEZXRhaWwpIHtcbiAgICAgICAgbWVtb0xpbmVzLnB1c2goYCR7bWVzc2FnZURldGFpbH0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZW1vTGluZXMubGVuZ3RoKSB7XG4gICAgICAgIG1lbW8gPSBtZW1vTGluZXMuam9pbignICcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5yZWZlcmVuY2VOdW1iZXIsXG4gICAgICBkYXRlOiBtb21lbnQodHhuLmV2ZW50RGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcm9jZXNzZWREYXRlOiBtb21lbnQodHhuLnZhbHVlRGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCksXG4gICAgICBvcmlnaW5hbEFtb3VudDogaXNPdXRib3VuZCA/IC10eG4uZXZlbnRBbW91bnQgOiB0eG4uZXZlbnRBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBTSEVLRUxfQ1VSUkVOQ1ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBpc091dGJvdW5kID8gLXR4bi5ldmVudEFtb3VudCA6IHR4bi5ldmVudEFtb3VudCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uYWN0aXZpdHlEZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIHN0YXR1czogdHhuLnNlcmlhbE51bWJlciA9PT0gMCA/IFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyA6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgbWVtbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGb3JleFRyYW5zYWN0aW9ucyh0eG5zOiBGb3JleFRyYW5zYWN0aW9uW10sIGN1cnJlbmN5OiBzdHJpbmcpOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKHR4biA9PiB7XG4gICAgY29uc3QgaXNPdXRib3VuZCA9IHR4bi5ldmVudEFjdGl2aXR5VHlwZUNvZGUgPT09IDI7XG4gICAgY29uc3QgZGF0ZVN0ciA9IHR4bi5leGVjdXRpbmdEYXRlLnRvU3RyaW5nKCk7IC8vIERhdGUgdHJhbnNhY3Rpb24gd2FzIGV4ZWN1dGVkXG4gICAgY29uc3QgdmFsdWVEYXRlU3RyID0gdHhuLnZhbHVlRGF0ZS50b1N0cmluZygpOyAvLyBEYXRlIHZhbHVlIHdhcyBhY3R1YWxseSBhZGRlZCB0byBhY2NvdW50XG5cbiAgICBsZXQgbWVtbyA9ICcnO1xuICAgIGlmICh0eG4uZXZlbnREZXRhaWxzKSB7XG4gICAgICBtZW1vID0gdHhuLmV2ZW50RGV0YWlscztcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlTnVtYmVyIHx8IHR4bi5yZWNvcmRTZXJpYWxOdW1iZXIsXG4gICAgICBkYXRlOiBtb21lbnQodmFsdWVEYXRlU3RyLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IG1vbWVudChkYXRlU3RyLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBpc091dGJvdW5kID8gLXR4bi5ldmVudEFtb3VudCA6IHR4bi5ldmVudEFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IGN1cnJlbmN5LFxuICAgICAgY2hhcmdlZEFtb3VudDogaXNPdXRib3VuZCA/IC10eG4uZXZlbnRBbW91bnQgOiB0eG4uZXZlbnRBbW91bnQsXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmFjdGl2aXR5RGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgbWVtbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc3RDb250ZXh0KHBhZ2U6IFBhZ2UpIHtcbiAgYXdhaXQgd2FpdFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZSgoKSA9PiAhIXdpbmRvdy5ibmhwQXBwKTtcbiAgfSwgJ3dhaXRpbmcgZm9yIGFwcCBkYXRhIGxvYWQnKTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHtcbiAgICByZXR1cm4gd2luZG93LmJuaHBBcHAucmVzdENvbnRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuc2xpY2UoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUG9hbGltWFNSRldpdGhpblBhZ2UoXG4gIHBhZ2U6IFBhZ2UsXG4gIHVybDogc3RyaW5nLFxuICBwYWdlVXVpZDogc3RyaW5nLFxuKTogUHJvbWlzZTxGZXRjaGVkQWNjb3VudFRyYW5zYWN0aW9uc0RhdGEgfCBudWxsPiB7XG4gIGNvbnN0IGNvb2tpZXMgPSBhd2FpdCBwYWdlLmNvb2tpZXMoKTtcbiAgY29uc3QgWFNSRkNvb2tpZSA9IGNvb2tpZXMuZmluZChjb29raWUgPT4gY29va2llLm5hbWUgPT09ICdYU1JGLVRPS0VOJyk7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgaWYgKFhTUkZDb29raWUgIT0gbnVsbCkge1xuICAgIGhlYWRlcnNbJ1gtWFNSRi1UT0tFTiddID0gWFNSRkNvb2tpZS52YWx1ZTtcbiAgfVxuICBoZWFkZXJzLnBhZ2VVdWlkID0gcGFnZVV1aWQ7XG4gIGhlYWRlcnMudXVpZCA9IHV1aWQ0KCk7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCc7XG4gIHJldHVybiBmZXRjaFBvc3RXaXRoaW5QYWdlPEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YT4ocGFnZSwgdXJsLCBbXSwgaGVhZGVycyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhU2NyYXAoXG4gIHR4bnNSZXN1bHQ6IEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YSxcbiAgYmFzZVVybDogc3RyaW5nLFxuICBwYWdlOiBQYWdlLFxuICBhY2NvdW50TnVtYmVyOiBzdHJpbmcsXG4pOiBQcm9taXNlPEZldGNoZWRBY2NvdW50VHJhbnNhY3Rpb25zRGF0YT4ge1xuICBjb25zdCBwcm9taXNlcyA9IHR4bnNSZXN1bHQudHJhbnNhY3Rpb25zLm1hcChhc3luYyAodHJhbnNhY3Rpb246IFNjcmFwZWRUcmFuc2FjdGlvbik6IFByb21pc2U8U2NyYXBlZFRyYW5zYWN0aW9uPiA9PiB7XG4gICAgY29uc3QgeyBwZm1EZXRhaWxzLCBzZXJpYWxOdW1iZXIgfSA9IHRyYW5zYWN0aW9uO1xuICAgIGlmIChzZXJpYWxOdW1iZXIgIT09IDApIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9JHtwZm1EZXRhaWxzfSZhY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZsYW5nPWhlYDtcbiAgICAgIGNvbnN0IGV4dHJhVHJhbnNhY3Rpb25EZXRhaWxzID0gKGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkUGZtVHJhbnNhY3Rpb25bXT4ocGFnZSwgdXJsKSkgfHwgW107XG4gICAgICBpZiAoZXh0cmFUcmFuc2FjdGlvbkRldGFpbHMgJiYgZXh0cmFUcmFuc2FjdGlvbkRldGFpbHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNhY3Rpb25OdW1iZXIgfSA9IGV4dHJhVHJhbnNhY3Rpb25EZXRhaWxzWzBdO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25OdW1iZXIpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi50cmFuc2FjdGlvbiwgcmVmZXJlbmNlTnVtYmVyOiB0cmFuc2FjdGlvbk51bWJlciB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiByZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhcbiAgYmFzZVVybDogc3RyaW5nLFxuICBhcGlTaXRlVXJsOiBzdHJpbmcsXG4gIHBhZ2U6IFBhZ2UsXG4gIGFjY291bnROdW1iZXI6IHN0cmluZyxcbiAgc3RhcnREYXRlOiBzdHJpbmcsXG4gIGVuZERhdGU6IHN0cmluZyxcbiAgYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24gPSBmYWxzZSxcbikge1xuICBjb25zdCB0eG5zVXJsID0gYCR7YXBpU2l0ZVVybH0vY3VycmVudC1hY2NvdW50L3RyYW5zYWN0aW9ucz9hY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZudW1JdGVtc1BlclBhZ2U9MTAwMCZyZXRyaWV2YWxFbmREYXRlPSR7ZW5kRGF0ZX0mcmV0cmlldmFsU3RhcnREYXRlPSR7c3RhcnREYXRlfSZzb3J0Q29kZT0xYDtcbiAgY29uc3QgdHhuc1Jlc3VsdCA9IGF3YWl0IGZldGNoUG9hbGltWFNSRldpdGhpblBhZ2UocGFnZSwgdHhuc1VybCwgJy9jdXJyZW50LWFjY291bnQvdHJhbnNhY3Rpb25zJyk7XG5cbiAgY29uc3QgZmluYWxSZXN1bHQgPVxuICAgIGFkZGl0aW9uYWxUcmFuc2FjdGlvbkluZm9ybWF0aW9uICYmIHR4bnNSZXN1bHQ/LnRyYW5zYWN0aW9ucy5sZW5ndGhcbiAgICAgID8gYXdhaXQgZ2V0RXh0cmFTY3JhcCh0eG5zUmVzdWx0LCBiYXNlVXJsLCBwYWdlLCBhY2NvdW50TnVtYmVyKVxuICAgICAgOiB0eG5zUmVzdWx0O1xuXG4gIHJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25zKGZpbmFsUmVzdWx0Py50cmFuc2FjdGlvbnMgPz8gW10pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50QmFsYW5jZShhcGlTaXRlVXJsOiBzdHJpbmcsIHBhZ2U6IFBhZ2UsIGFjY291bnROdW1iZXI6IHN0cmluZykge1xuICBjb25zdCBiYWxhbmNlQW5kQ3JlZGl0TGltaXRVcmwgPSBgJHthcGlTaXRlVXJsfS9jdXJyZW50LWFjY291bnQvY29tcG9zaXRlL2JhbGFuY2VBbmRDcmVkaXRMaW1pdD9hY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZ2aWV3PWRldGFpbHMmbGFuZz1oZWA7XG4gIGNvbnN0IGJhbGFuY2VBbmRDcmVkaXRMaW1pdCA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxCYWxhbmNlQW5kQ3JlZGl0TGltaXQ+KHBhZ2UsIGJhbGFuY2VBbmRDcmVkaXRMaW1pdFVybCk7XG5cbiAgcmV0dXJuIGJhbGFuY2VBbmRDcmVkaXRMaW1pdD8uY3VycmVudEJhbGFuY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZvcmV4QWNjb3VudHMoXG4gIGJhc2VVcmw6IHN0cmluZyxcbiAgcGFnZTogUGFnZSxcbiAgYWNjb3VudE51bWJlcjogc3RyaW5nLFxuICBzdGFydERhdGU6IHN0cmluZyxcbiAgZW5kRGF0ZTogc3RyaW5nLFxuKTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50W10+IHtcbiAgZGVidWcoJz09PT09PT09PT0gRkVUQ0hJTkcgRk9SRVggQUNDT1VOVFMgPT09PT09PT09PScpO1xuICBkZWJ1ZygnQWNjb3VudDogJXMsIERhdGUgcmFuZ2U6ICVzIHRvICVzJywgYWNjb3VudE51bWJlciwgc3RhcnREYXRlLCBlbmREYXRlKTtcblxuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG5cbiAgY29uc3QgY3VycmVuY3kgPSB7IGNvZGU6IDE5LCBzd2lmdDogU0hFS0VMX0NVUlJFTkNZIH07XG4gIHRyeSB7XG4gICAgY29uc3QgZGV0YWlsZWRBY2NvdW50VHlwZUNvZGUgPSAxNDI7IC8vIEZvciBmb3JlaWduIGN1cnJlbmN5IGFjY291bnRzXG4gICAgY29uc3QgZm9yZXhVcmwgPSBgJHtiYXNlVXJsfS9TZXJ2ZXJTZXJ2aWNlcy9mb3JlaWduLWN1cnJlbmN5L3RyYW5zYWN0aW9ucz9hY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZ0eXBlPWJ1c2luZXNzJnJldHJpZXZhbFN0YXJ0RGF0ZT0ke3N0YXJ0RGF0ZX0mcmV0cmlldmFsRW5kRGF0ZT0ke2VuZERhdGV9JmN1cnJlbmN5Q29kZUxpc3Q9JHtjdXJyZW5jeS5jb2RlfSZkZXRhaWxlZEFjY291bnRUeXBlQ29kZUxpc3Q9JHtkZXRhaWxlZEFjY291bnRUeXBlQ29kZX0mdmlldz1kZXRhaWxzJmxhbmc9aGVgO1xuICAgIGRlYnVnKCdUcnlpbmcgZm9yZXggJXMnLCBmb3JleFVybCk7XG5cbiAgICBjb25zdCBmb3JleERhdGEgPSBhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8Rm9yZXhBY2NvdW50RGF0YT4ocGFnZSwgZm9yZXhVcmwsIHRydWUpOyAvLyBpZ25vcmVFcnJvcnMgPSB0cnVlXG5cbiAgICBpZiAoZm9yZXhEYXRhICYmIGZvcmV4RGF0YS5iYWxhbmNlc0FuZExpbWl0c0RhdGFMaXN0ICYmIGZvcmV4RGF0YS5iYWxhbmNlc0FuZExpbWl0c0RhdGFMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGRlYnVnKCfinJMgRm91bmQgZm9yZXggZGF0YScpO1xuXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbmN5RGF0YSBvZiBmb3JleERhdGEuYmFsYW5jZXNBbmRMaW1pdHNEYXRhTGlzdCkge1xuICAgICAgICBjb25zdCBjdXJyZW5jeVN3aWZ0Q29kZSA9IGN1cnJlbmN5RGF0YS5jdXJyZW5jeVN3aWZ0Q29kZSB8fCBjdXJyZW5jeS5zd2lmdDtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25Db3VudCA9IGN1cnJlbmN5RGF0YS50cmFuc2FjdGlvbnM/Lmxlbmd0aCB8fCAwO1xuXG4gICAgICAgIC8vIEdldCBiYWxhbmNlIGZyb20gdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uJ3MgY3VycmVudEJhbGFuY2UgZmllbGRcbiAgICAgICAgLy8gSWYgbm8gdHJhbnNhY3Rpb25zLCBmYWxsIGJhY2sgdG8gY3VycmVuY3lEYXRhLmN1cnJlbnRCYWxhbmNlXG4gICAgICAgIGxldCBiYWxhbmNlID0gY3VycmVuY3lEYXRhLmN1cnJlbnRCYWxhbmNlO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25Db3VudCA+IDAgJiYgY3VycmVuY3lEYXRhLnRyYW5zYWN0aW9ucykge1xuICAgICAgICAgIGJhbGFuY2UgPSBjdXJyZW5jeURhdGEudHJhbnNhY3Rpb25zWzBdLmN1cnJlbnRCYWxhbmNlO1xuICAgICAgICAgIGRlYnVnKCcgIC0gVXNpbmcgYmFsYW5jZSBmcm9tIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uOiAlcycsIGJhbGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoJyAgLSBDdXJyZW5jeTogJXMsIEJhbGFuY2U6ICVzLCBUcmFuc2FjdGlvbnM6ICVkJywgY3VycmVuY3lTd2lmdENvZGUsIGJhbGFuY2UsIHRyYW5zYWN0aW9uQ291bnQpO1xuXG4gICAgICAgIC8vIExvZyB0cmFuc2FjdGlvbiBkYXRlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmICh0cmFuc2FjdGlvbkNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHR4bkRhdGVzID0gY3VycmVuY3lEYXRhLnRyYW5zYWN0aW9ucz8ubWFwKHQgPT4gdC5leGVjdXRpbmdEYXRlKS5qb2luKCcsICcpIHx8ICcnO1xuICAgICAgICAgIGRlYnVnKCcgICAgVHJhbnNhY3Rpb24gZGF0ZXM6ICVzJywgdHhuRGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgaWYgdGhlcmUncyBhY3R1YWxseSBhIGJhbGFuY2Ugb3IgdHJhbnNhY3Rpb25zXG4gICAgICAgIGlmIChiYWxhbmNlICE9PSAwIHx8IHRyYW5zYWN0aW9uQ291bnQgPiAwKSB7XG4gICAgICAgICAgY29uc3QgdHhucyA9IGNvbnZlcnRGb3JleFRyYW5zYWN0aW9ucyhjdXJyZW5jeURhdGEudHJhbnNhY3Rpb25zIHx8IFtdLCBjdXJyZW5jeVN3aWZ0Q29kZSk7XG4gICAgICAgICAgY29uc3QgZm9yZXhBY2NvdW50TnVtYmVyID0gYCR7YWNjb3VudE51bWJlcn0tJHtjdXJyZW5jeVN3aWZ0Q29kZX1gO1xuXG4gICAgICAgICAgYWNjb3VudHMucHVzaCh7XG4gICAgICAgICAgICBhY2NvdW50TnVtYmVyOiBmb3JleEFjY291bnROdW1iZXIsXG4gICAgICAgICAgICBiYWxhbmNlLFxuICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5U3dpZnRDb2RlLFxuICAgICAgICAgICAgdHhucyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRlYnVnKCcgIOKckyBBZGRlZCBmb3JleCBhY2NvdW50OiAlcyB3aXRoICVkIHRyYW5zYWN0aW9ucycsIGZvcmV4QWNjb3VudE51bWJlciwgdHhucy5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlYnVnKCcgIC0gU2tpcHBpbmcgJXMgKHplcm8gYmFsYW5jZSBhbmQgbm8gdHJhbnNhY3Rpb25zKScsIGN1cnJlbmN5U3dpZnRDb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygnICAtIE5vIGZvcmV4IGRhdGEgZm91bmQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZGVidWcoJyAgLSBFcnJvciBmZXRjaGluZyBmb3JleDogJXMnLCBlcnJvcik7XG4gICAgLy8gQ29udGludWUgdHJ5aW5nIG90aGVyIGN1cnJlbmNpZXNcbiAgfVxuXG4gIGRlYnVnKCdSZXR1cm5pbmcgJWQgZm9yZXggYWNjb3VudHMnLCBhY2NvdW50cy5sZW5ndGgpO1xuICByZXR1cm4gYWNjb3VudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNhdmluZ3NBY2NvdW50cyhiYXNlVXJsOiBzdHJpbmcsIHBhZ2U6IFBhZ2UsIGFjY291bnROdW1iZXI6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25zQWNjb3VudFtdPiB7XG4gIGNvbnN0IHNhdmluZ3NVcmwgPSBgJHtiYXNlVXJsfS9TZXJ2ZXJTZXJ2aWNlcy9kZXBvc2l0cy1hbmQtc2F2aW5ncy9kZXBvc2l0cz9hY2NvdW50SWQ9JHthY2NvdW50TnVtYmVyfSZ2aWV3PWRldGFpbHMmbGFuZz1oZWA7XG4gIGNvbnN0IHNhdmluZ3NEYXRhID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNhdmluZ3NBY2NvdW50RGF0YT4ocGFnZSwgc2F2aW5nc1VybCk7XG5cbiAgaWYgKCFzYXZpbmdzRGF0YSB8fCAhc2F2aW5nc0RhdGEuZGVwb3NpdHNXcmFwcGVyRGF0YSB8fCBzYXZpbmdzRGF0YS5kZXBvc2l0c1dyYXBwZXJEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlYnVnKCdObyBzYXZpbmdzIGFjY291bnRzIGZvdW5kIGZvciBhY2NvdW50ICVzJywgYWNjb3VudE51bWJlcik7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgd3JhcHBlciBvZiBzYXZpbmdzRGF0YS5kZXBvc2l0c1dyYXBwZXJEYXRhKSB7XG4gICAgLy8gQ3JlYXRlIGEgc2VwYXJhdGUgYWNjb3VudCBmb3IgZWFjaCBpbmRpdmlkdWFsIGRlcG9zaXRcbiAgICBmb3IgKGNvbnN0IGRlcG9zaXQgb2Ygd3JhcHBlci5kYXRhKSB7XG4gICAgICBjb25zdCBiYWxhbmNlID0gZGVwb3NpdC5yZXZhbHVlZFRvdGFsQW1vdW50IHx8IGRlcG9zaXQucHJpbmNpcGFsQW1vdW50O1xuICAgICAgY29uc3Qgc2F2aW5nc0FjY291bnROdW1iZXIgPSBgJHthY2NvdW50TnVtYmVyfS0ke2RlcG9zaXQuZGVwb3NpdFNlcmlhbElkfWA7XG5cbiAgICAgIGFjY291bnRzLnB1c2goe1xuICAgICAgICBhY2NvdW50TnVtYmVyOiBzYXZpbmdzQWNjb3VudE51bWJlcixcbiAgICAgICAgc2F2aW5nc0FjY291bnQ6IHRydWUsXG4gICAgICAgIGJhbGFuY2UsXG4gICAgICAgIHR4bnM6IFtdLCAvLyBTYXZpbmdzIGFjY291bnRzIHR5cGljYWxseSBkb24ndCBoYXZlIHRyYW5zYWN0aW9uIGhpc3RvcnkgaW4gdGhlIHNhbWUgd2F5XG4gICAgICB9KTtcblxuICAgICAgZGVidWcoJ0FkZGVkIHNhdmluZ3MgYWNjb3VudCAlcyB3aXRoIGJhbGFuY2UgJXMnLCBzYXZpbmdzQWNjb3VudE51bWJlciwgYmFsYW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnZlc3RtZW50QWNjb3VudHMoXG4gIGJhc2VVcmw6IHN0cmluZyxcbiAgcGFnZTogUGFnZSxcbiAgYWNjb3VudDogeyBiYW5rTnVtYmVyOiBzdHJpbmc7IGJyYW5jaE51bWJlcjogc3RyaW5nOyBhY2NvdW50TnVtYmVyOiBzdHJpbmcgfSxcbik6IFByb21pc2U8VHJhbnNhY3Rpb25zQWNjb3VudFtdPiB7XG4gIGRlYnVnKCc9PT09PT09PT09IEZFVENISU5HIElOVkVTVE1FTlQgQUNDT1VOVFMgPT09PT09PT09PScpO1xuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBgJHthY2NvdW50LmJyYW5jaE51bWJlcn0tJHthY2NvdW50LmFjY291bnROdW1iZXJ9YDsgLy8gRG9uJ3QgaW5jbHVkZSBiYW5rTnVtYmVyIGhlcmUgYmVjYXVzZSBpbnZlc3RtZW50IEFQSSBkb2Vzbid0IHVzZSBpdFxuXG4gIC8vIFNldCB1cCByZXF1ZXN0IGludGVyY2VwdGlvbiB0byBjYXB0dXJlIHNlc3Npb24gaGVhZGVyc1xuICBsZXQgY2FwdHVyZWRTZXNzaW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGNhcHR1cmVkQ3Nlc3Npb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHJlcXVlc3RIYW5kbGVyID0gKHJlcXVlc3Q6IGFueSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzKCk7XG4gICAgICBpZiAoaGVhZGVycy5zZXNzaW9uICYmICFjYXB0dXJlZFNlc3Npb24pIHtcbiAgICAgICAgY2FwdHVyZWRTZXNzaW9uID0gaGVhZGVycy5zZXNzaW9uO1xuICAgICAgICBkZWJ1ZygnICAtIENhcHR1cmVkIHNlc3Npb24gZnJvbSBuZXR3b3JrIHJlcXVlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkZXJzLmNzZXNzaW9uICYmICFjYXB0dXJlZENzZXNzaW9uKSB7XG4gICAgICAgIGNhcHR1cmVkQ3Nlc3Npb24gPSBoZWFkZXJzLmNzZXNzaW9uO1xuICAgICAgICBkZWJ1ZygnICAtIENhcHR1cmVkIGNzZXNzaW9uIGZyb20gbmV0d29yayByZXF1ZXN0Jyk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0LmNvbnRpbnVlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJyAgLSBFcnJvciBpbiByZXF1ZXN0IGhhbmRsZXI6ICVzJywgZSk7XG4gICAgICAvLyBUcnkgdG8gY29udGludWUgYW55d2F5XG4gICAgICB0cnkge1xuICAgICAgICByZXF1ZXN0LmNvbnRpbnVlKCk7XG4gICAgICB9IGNhdGNoIChjb250aW51ZUVycm9yKSB7XG4gICAgICAgIC8vIElnbm9yZSBpZiBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdHJ5IHtcbiAgICAvLyBOYXZpZ2F0ZSB0byBteXRyYWRlIHNlY3Rpb24gdG8gZXN0YWJsaXNoIHNlc3Npb25cbiAgICBjb25zdCBteXRyYWRlVXJsID0gYCR7YmFzZVVybH0vbXl0cmFkZS9hcHBgO1xuICAgIGRlYnVnKCdOYXZpZ2F0aW5nIHRvIG15dHJhZGUgc2VjdGlvbjogJXMnLCBteXRyYWRlVXJsKTtcblxuICAgIGF3YWl0IHBhZ2Uuc2V0UmVxdWVzdEludGVyY2VwdGlvbih0cnVlKTtcbiAgICBwYWdlLm9uKCdyZXF1ZXN0JywgcmVxdWVzdEhhbmRsZXIpO1xuXG4gICAgLy8gVHJ5IHRvIG5hdmlnYXRlLCBidXQgaWYgaXQgZmFpbHMgKGUuZy4sIE15VHJhZGUgbm90IGVuYWJsZWQpLCBjbGVhbiB1cCBhbmQgcmV0dXJuIGVtcHR5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBhZ2UuZ290byhteXRyYWRlVXJsLCB7IHdhaXRVbnRpbDogJ25ldHdvcmtpZGxlMicsIHRpbWVvdXQ6IDYwMDAwIH0pO1xuICAgICAgLy8gV2FpdCBsb25nZXIgZm9yIHRoZSBwYWdlIHRvIGZ1bGx5IGxvYWQgYW5kIGVzdGFibGlzaCBzZXNzaW9uXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwMCkpO1xuICAgIH0gY2F0Y2ggKG5hdkVycm9yKSB7XG4gICAgICBkZWJ1ZygnICAtIE5hdmlnYXRpb24gdG8gTXlUcmFkZSBmYWlsZWQgKGxpa2VseSBub3QgZW5hYmxlZCk6ICVzJywgbmF2RXJyb3IpO1xuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdCBpbnRlcmNlcHRpb25cbiAgICAgIHBhZ2Uub2ZmKCdyZXF1ZXN0JywgcmVxdWVzdEhhbmRsZXIpO1xuICAgICAgYXdhaXQgcGFnZS5zZXRSZXF1ZXN0SW50ZXJjZXB0aW9uKGZhbHNlKTtcbiAgICAgIGRlYnVnKCdSZXR1cm5pbmcgMCBpbnZlc3RtZW50IGFjY291bnRzIChNeVRyYWRlIG5vdCBhY2Nlc3NpYmxlKScpO1xuICAgICAgcmV0dXJuIGFjY291bnRzO1xuICAgIH1cblxuICAgIC8vIE5vdyB0dXJuIG9mZiByZXF1ZXN0IGludGVyY2VwdGlvbiBiZWZvcmUgd2UgbWFrZSBBUEkgY2FsbHNcbiAgICBwYWdlLm9mZigncmVxdWVzdCcsIHJlcXVlc3RIYW5kbGVyKTtcbiAgICBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24oZmFsc2UpO1xuXG4gICAgZGVidWcoJ015dHJhZGUgcGFnZSBsb2FkZWQsIHNlc3Npb24gZXN0YWJsaXNoZWQnKTtcblxuICAgIGNvbnN0IGZpZWxkcyA9XG4gICAgICAnRW5nTmFtZSxFbmdTeW1ib2wsSGViTmFtZSxIZWJTeW1ib2wsU3ltYm9sLEV4cGlyYXRpb25EYXRlLEl0ZW1UeXBlLFN0b2NrVHlwZSxJc0V0ZixJc0ZvcmVpZ24sQ3VycmVuY3lDb2RlLEV4Y2hhbmdlLENyZWF0aW9uRXF1aXR5TnVtLEVxdWl0eVR5cGUsQ29udHJhY3RUeXBlLEFsbG93ZWRPcmRlckRpcmVjdGlvbixFcXVpdHlTdWJUeXBlJztcbiAgICBjb25zdCBpbnZlc3RtZW50VXJsID0gYCR7YmFzZVVybH0vU2VydmVyU2VydmljZXMvbXl0cmFkZS9hcGkvdjIvanNvbjIvYWNjb3VudC92aWV3P2FjY291bnQ9JHthY2NvdW50TnVtYmVyfSZmaWVsZHM9JHtmaWVsZHN9YDtcbiAgICBkZWJ1ZygnVHJ5aW5nIGludmVzdG1lbnQgYWNjb3VudCBVUkw6ICVzJywgaW52ZXN0bWVudFVybCk7XG5cbiAgICAvLyBHZXQgWFNSRiB0b2tlbiBhbmQgc2Vzc2lvbiBkYXRhIGZyb20gY29va2llc1xuICAgIGNvbnN0IGNvb2tpZXMgPSBhd2FpdCBwYWdlLmNvb2tpZXMoKTtcbiAgICBjb25zdCBYU1JGQ29va2llID0gY29va2llcy5maW5kKGNvb2tpZSA9PiBjb29raWUubmFtZSA9PT0gJ1hTUkYtVE9LRU4nKTtcblxuICAgIC8vIFVzZSBjYXB0dXJlZCBzZXNzaW9uIG9yIGZhbGxiYWNrIHRvIGdlbmVyYXRlZCBvbmVzXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gY2FwdHVyZWRTZXNzaW9uIHx8IHV1aWQ0KCk7XG4gICAgY29uc3QgY3Nlc3Npb24gPSBjYXB0dXJlZENzZXNzaW9uIHx8IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLFxuICAgICAgY3Nlc3Npb24sXG4gICAgICBzZXNzaW9uOiBzZXNzaW9uSWQsXG4gICAgICBSZWZlcmVyOiBteXRyYWRlVXJsLFxuICAgIH07XG4gICAgaWYgKFhTUkZDb29raWUgIT0gbnVsbCkge1xuICAgICAgaGVhZGVyc1snWC1YU1JGLVRPS0VOJ10gPSBYU1JGQ29va2llLnZhbHVlO1xuICAgICAgZGVidWcoJyAgLSBVc2luZyBYU1JGIHRva2VuOiAlcycsIFhTUkZDb29raWUudmFsdWUuc3Vic3RyaW5nKDAsIDEwKSArICcuLi4nKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnICAtIFJlcXVlc3QgaGVhZGVyczogY3Nlc3Npb249JXMsIHNlc3Npb249JXMnLCBjc2Vzc2lvbiwgc2Vzc2lvbklkKTtcblxuICAgIGNvbnN0IGludmVzdG1lbnREYXRhID0gYXdhaXQgZmV0Y2hQb3N0V2l0aGluUGFnZTxJbnZlc3RtZW50QWNjb3VudERhdGE+KHBhZ2UsIGludmVzdG1lbnRVcmwsIHt9LCBoZWFkZXJzKTtcblxuICAgIGRlYnVnKCcgIC0gUmVzcG9uc2UgcmVjZWl2ZWQ6ICVzJywgaW52ZXN0bWVudERhdGEgPyAnWUVTJyA6ICdOTycpO1xuICAgIGlmIChpbnZlc3RtZW50RGF0YSkge1xuICAgICAgZGVidWcoJyAgLSBSZXNwb25zZSBoYXMgVmlldzogJXMnLCBpbnZlc3RtZW50RGF0YS5WaWV3ID8gJ1lFUycgOiAnTk8nKTtcbiAgICAgIGRlYnVnKCcgIC0gUmVzcG9uc2UgaGFzIFZpZXcuQWNjb3VudDogJXMnLCBpbnZlc3RtZW50RGF0YS5WaWV3Py5BY2NvdW50ID8gJ1lFUycgOiAnTk8nKTtcbiAgICB9XG5cbiAgICBpZiAoaW52ZXN0bWVudERhdGE/LlZpZXc/LkFjY291bnQpIHtcbiAgICAgIGRlYnVnKCfinJMgRm91bmQgaW52ZXN0bWVudCBhY2NvdW50IGRhdGEnKTtcblxuICAgICAgY29uc3QgYWNjb3VudERhdGEgPSBpbnZlc3RtZW50RGF0YS5WaWV3LkFjY291bnQ7XG4gICAgICBjb25zdCBiYWxhbmNlID0gYWNjb3VudERhdGEuT25saW5lVmFsdWUgfHwgMDtcbiAgICAgIGNvbnN0IGN1cnJlbmN5ID0gYWNjb3VudERhdGEuQ3VycmVuY3lDb2RlIHx8IFNIRUtFTF9DVVJSRU5DWTtcblxuICAgICAgLy8gR2V0IHNlY3VyaXRpZXMgZnJvbSB0aGUgYmFsYW5jZSBhcnJheVxuICAgICAgY29uc3Qgc2VjdXJpdGllczogU2VjdXJpdHlbXSA9IFtdO1xuICAgICAgY29uc3QgYmFsYW5jZXMgPSBhY2NvdW50RGF0YS5BY2NvdW50UG9zaXRpb24/LkJhbGFuY2UgfHwgW107XG4gICAgICBjb25zdCBtZXRhU2VjdXJpdGllcyA9IGludmVzdG1lbnREYXRhLlZpZXcuTWV0YT8uU2VjdXJpdHkgfHwgW107XG5cbiAgICAgIC8vIENyZWF0ZSBhIG1hcCBvZiBzZWN1cml0eSBtZXRhZGF0YSBmb3IgZWFzeSBsb29rdXBcbiAgICAgIGNvbnN0IG1ldGFNYXAgPSBuZXcgTWFwPHN0cmluZywgSW52ZXN0bWVudFNlY3VyaXR5TWV0YT4oKTtcbiAgICAgIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhU2VjdXJpdGllcykge1xuICAgICAgICBtZXRhTWFwLnNldChtZXRhWyctS2V5J10sIG1ldGEpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNlY3VyaXR5QmFsYW5jZSBvZiBiYWxhbmNlcykge1xuICAgICAgICBjb25zdCBtZXRhID0gbWV0YU1hcC5nZXQoc2VjdXJpdHlCYWxhbmNlLkVxdWl0eU51bWJlcik7XG5cbiAgICAgICAgc2VjdXJpdGllcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBtZXRhPy5FbmdOYW1lIHx8ICcnLFxuICAgICAgICAgIHN5bWJvbDogbWV0YT8uRW5nU3ltYm9sIHx8ICcnLFxuICAgICAgICAgIHZvbHVtZTogc2VjdXJpdHlCYWxhbmNlLk9ubGluZU5WLFxuICAgICAgICAgIHZhbHVlOiBzZWN1cml0eUJhbGFuY2UuT25saW5lVkwsXG4gICAgICAgICAgY3VycmVuY3k6IHNlY3VyaXR5QmFsYW5jZS5DdXJyZW5jeUNvZGUgfHwgbWV0YT8uQ3VycmVuY3lDb2RlIHx8IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgICAgICBjaGFuZ2VQZXJjZW50YWdlOiBzZWN1cml0eUJhbGFuY2UuQmFzZVJhdGVDaGFuZ2VQZXJjZW50YWdlLFxuICAgICAgICAgIHByb2ZpdExvc3M6IHNlY3VyaXR5QmFsYW5jZS5Qcm9maXRMb3NzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoJyAgLSBCYWxhbmNlOiAlcyAlcywgU2VjdXJpdGllczogJWQnLCBiYWxhbmNlLCBjdXJyZW5jeSwgc2VjdXJpdGllcy5sZW5ndGgpO1xuXG4gICAgICBpZiAoYmFsYW5jZSAhPT0gMCB8fCBzZWN1cml0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaW52ZXN0bWVudEFjY291bnROdW1iZXIgPSBgJHthY2NvdW50LmJhbmtOdW1iZXJ9LSR7YWNjb3VudC5icmFuY2hOdW1iZXJ9LSR7YWNjb3VudC5hY2NvdW50TnVtYmVyfS1pbnZlc3RtZW50YDtcbiAgICAgICAgYWNjb3VudHMucHVzaCh7XG4gICAgICAgICAgYWNjb3VudE51bWJlcjogaW52ZXN0bWVudEFjY291bnROdW1iZXIsXG4gICAgICAgICAgYmFsYW5jZSxcbiAgICAgICAgICBjdXJyZW5jeSxcbiAgICAgICAgICBzYXZpbmdzQWNjb3VudDogdHJ1ZSxcbiAgICAgICAgICB0eG5zOiBbXSxcbiAgICAgICAgICBzZWN1cml0aWVzLFxuICAgICAgICB9KTtcblxuICAgICAgICBkZWJ1ZygnICDinJMgQWRkZWQgaW52ZXN0bWVudCBhY2NvdW50OiAlcyB3aXRoICVkIHNlY3VyaXRpZXMnLCBpbnZlc3RtZW50QWNjb3VudE51bWJlciwgc2VjdXJpdGllcy5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWcoJyAgLSBTa2lwcGluZyAoemVybyBiYWxhbmNlIGFuZCBubyBzZWN1cml0aWVzKScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygnICAtIE5vIGludmVzdG1lbnQgYWNjb3VudCBkYXRhIGZvdW5kJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGRlYnVnKCcgIC0gRXJyb3IgZmV0Y2hpbmcgaW52ZXN0bWVudCBhY2NvdW50OiAlcycsIGVycm9yKTtcbiAgICAvLyBMb2cgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBlcnJvclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBkZWJ1ZygnICAgIEVycm9yIG1lc3NhZ2U6ICVzJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICBkZWJ1ZygnICAgIEVycm9yIHN0YWNrOiAlcycsIGVycm9yLnN0YWNrKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2xlYW4gdXAgcmVxdWVzdCBpbnRlcmNlcHRpb24gKGluIGNhc2UgaXQgd2Fzbid0IGFscmVhZHkgZG9uZSlcbiAgICB0cnkge1xuICAgICAgcGFnZS5vZmYoJ3JlcXVlc3QnLCByZXF1ZXN0SGFuZGxlcik7XG4gICAgICBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24oZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgIH1cblxuICAgIC8vIE5hdmlnYXRlIGJhY2sgdG8gdGhlIG1haW4gaG9tZXBhZ2UgdG8gcmVzdG9yZSB0aGUgc2Vzc2lvbiBmb3Igc3Vic2VxdWVudCBzY3JhcGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBob21lcGFnZVVybCA9IGAke2Jhc2VVcmx9L25nLXBvcnRhbHMvcmIvaGUvaG9tZXBhZ2VgO1xuICAgICAgZGVidWcoJ05hdmlnYXRpbmcgYmFjayB0byBob21lcGFnZTogJXMnLCBob21lcGFnZVVybCk7XG4gICAgICBhd2FpdCBwYWdlLmdvdG8oaG9tZXBhZ2VVcmwsIHsgd2FpdFVudGlsOiAnbmV0d29ya2lkbGUyJywgdGltZW91dDogMzAwMDAgfSk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwMCkpO1xuICAgICAgZGVidWcoJ0hvbWVwYWdlIHJlc3RvcmVkJyk7XG4gICAgfSBjYXRjaCAobmF2RXJyb3IpIHtcbiAgICAgIGRlYnVnKCcgIC0gRmFpbGVkIHRvIG5hdmlnYXRlIGJhY2sgdG8gaG9tZXBhZ2U6ICVzJywgbmF2RXJyb3IpO1xuICAgICAgLy8gQ29udGludWUgYW55d2F5LCB0aGUgb3V0ZXIgdHJ5LWNhdGNoIGluIGZldGNoQWNjb3VudERhdGEgd2lsbCBoYW5kbGUgaXRcbiAgICB9XG4gIH1cblxuICBkZWJ1ZygnUmV0dXJuaW5nICVkIGludmVzdG1lbnQgYWNjb3VudHMnLCBhY2NvdW50cy5sZW5ndGgpO1xuICByZXR1cm4gYWNjb3VudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGEocGFnZTogUGFnZSwgYmFzZVVybDogc3RyaW5nLCBvcHRpb25zOiBTY3JhcGVyT3B0aW9ucykge1xuICBjb25zdCByZXN0Q29udGV4dCA9IGF3YWl0IGdldFJlc3RDb250ZXh0KHBhZ2UpO1xuICBjb25zdCBhcGlTaXRlVXJsID0gYCR7YmFzZVVybH0vJHtyZXN0Q29udGV4dH1gO1xuICBjb25zdCBhY2NvdW50RGF0YVVybCA9IGAke2Jhc2VVcmx9L1NlcnZlclNlcnZpY2VzL2dlbmVyYWwvYWNjb3VudHNgO1xuXG4gIGRlYnVnKCdmZXRjaGluZyBhY2NvdW50cyBkYXRhJyk7XG4gIGNvbnN0IGFjY291bnRzSW5mbyA9IChhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8RmV0Y2hlZEFjY291bnREYXRhPihwYWdlLCBhY2NvdW50RGF0YVVybCkpIHx8IFtdO1xuICBkZWJ1ZygnZ290ICVkIGFjY291bnRzLCBmZXRjaGluZyB0eG5zIGFuZCBiYWxhbmNlJywgYWNjb3VudHNJbmZvLmxlbmd0aCk7XG5cbiAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuYWRkKDEsICdkYXknKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG4gIGNvbnN0IHsgYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24gfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc3RhcnREYXRlU3RyID0gc3RhcnRNb21lbnQuZm9ybWF0KERBVEVfRk9STUFUKTtcbiAgY29uc3QgZW5kRGF0ZVN0ciA9IG1vbWVudCgpLmZvcm1hdChEQVRFX0ZPUk1BVCk7XG5cbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYWNjb3VudCBvZiBhY2NvdW50c0luZm8pIHtcbiAgICBsZXQgYmFsYW5jZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjY291bnROdW1iZXIgPSBgJHthY2NvdW50LmJhbmtOdW1iZXJ9LSR7YWNjb3VudC5icmFuY2hOdW1iZXJ9LSR7YWNjb3VudC5hY2NvdW50TnVtYmVyfWA7XG5cbiAgICBjb25zdCBpc0FjdGl2ZUFjY291bnQgPSBhY2NvdW50LmFjY291bnRDbG9zaW5nUmVhc29uQ29kZSA9PT0gMDtcbiAgICBpZiAoaXNBY3RpdmVBY2NvdW50KSB7XG4gICAgICBiYWxhbmNlID0gYXdhaXQgZ2V0QWNjb3VudEJhbGFuY2UoYXBpU2l0ZVVybCwgcGFnZSwgYWNjb3VudE51bWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdTa2lwcGluZyBiYWxhbmNlIGZvciBhIGNsb3NlZCBhY2NvdW50LCBiYWxhbmNlIHdpbGwgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgbGV0IHR4bnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgdHhucyA9IGF3YWl0IGdldEFjY291bnRUcmFuc2FjdGlvbnMoXG4gICAgICAgIGJhc2VVcmwsXG4gICAgICAgIGFwaVNpdGVVcmwsXG4gICAgICAgIHBhZ2UsXG4gICAgICAgIGFjY291bnROdW1iZXIsXG4gICAgICAgIHN0YXJ0RGF0ZVN0cixcbiAgICAgICAgZW5kRGF0ZVN0cixcbiAgICAgICAgYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWJ1ZygnRXJyb3IgZmV0Y2hpbmcgdHJhbnNhY3Rpb25zIGZvciAlcyAocG9zc2libHkgY2xvc2VkIGFjY291bnQpOiAlcycsIGFjY291bnROdW1iZXIsIGVycm9yKTtcbiAgICAgIC8vIENvbnRpbnVlIHdpdGggZW1wdHkgdHJhbnNhY3Rpb25zXG4gICAgfVxuXG4gICAgLy8gQWRkIHJlZ3VsYXIgY2hlY2tpbmcgYWNjb3VudFxuICAgIGFjY291bnRzLnB1c2goe1xuICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgIGJhbGFuY2UsXG4gICAgICB0eG5zLFxuICAgIH0pO1xuXG4gICAgLy8gRmV0Y2ggZm9yZXggYWNjb3VudHMgZm9yIHRoaXMgYWNjb3VudCBudW1iZXJcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9yZXhBY2NvdW50cyA9IGF3YWl0IGdldEZvcmV4QWNjb3VudHMoYmFzZVVybCwgcGFnZSwgYWNjb3VudE51bWJlciwgc3RhcnREYXRlU3RyLCBlbmREYXRlU3RyKTtcbiAgICAgIGFjY291bnRzLnB1c2goLi4uZm9yZXhBY2NvdW50cyk7XG4gICAgICBkZWJ1ZygnQWRkZWQgJWQgZm9yZXggYWNjb3VudHMgdG8gcmVzdWx0cycsIGZvcmV4QWNjb3VudHMubGVuZ3RoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZGVidWcoJ0Vycm9yIGZldGNoaW5nIGZvcmV4IGFjY291bnRzIGZvciAlczogJXMnLCBhY2NvdW50TnVtYmVyLCBlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggc2F2aW5ncyBhY2NvdW50cyBmb3IgdGhpcyBhY2NvdW50IG51bWJlclxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZpbmdzQWNjb3VudHMgPSBhd2FpdCBnZXRTYXZpbmdzQWNjb3VudHMoYmFzZVVybCwgcGFnZSwgYWNjb3VudE51bWJlcik7XG4gICAgICBhY2NvdW50cy5wdXNoKC4uLnNhdmluZ3NBY2NvdW50cyk7XG4gICAgICBkZWJ1ZygnQWRkZWQgJWQgc2F2aW5ncyBhY2NvdW50cyB0byByZXN1bHRzJywgc2F2aW5nc0FjY291bnRzLmxlbmd0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlYnVnKCdFcnJvciBmZXRjaGluZyBzYXZpbmdzIGFjY291bnRzIGZvciAlczogJXMnLCBhY2NvdW50TnVtYmVyLCBlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggaW52ZXN0bWVudCBhY2NvdW50cyBmb3IgdGhpcyBhY2NvdW50IG51bWJlclxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnZlc3RtZW50QWNjb3VudHMgPSBhd2FpdCBnZXRJbnZlc3RtZW50QWNjb3VudHMoYmFzZVVybCwgcGFnZSwgYWNjb3VudCk7XG4gICAgICBhY2NvdW50cy5wdXNoKC4uLmludmVzdG1lbnRBY2NvdW50cyk7XG4gICAgICBkZWJ1ZygnQWRkZWQgJWQgaW52ZXN0bWVudCBhY2NvdW50cyB0byByZXN1bHRzJywgaW52ZXN0bWVudEFjY291bnRzLmxlbmd0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlYnVnKCdFcnJvciBmZXRjaGluZyBpbnZlc3RtZW50IGFjY291bnRzIGZvciAlczogJXMnLCBhY2NvdW50TnVtYmVyLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWNjb3VudERhdGEgPSB7XG4gICAgc3VjY2VzczogdHJ1ZSxcbiAgICBhY2NvdW50cyxcbiAgfTtcbiAgZGVidWcoJ2ZldGNoaW5nIGVuZGVkJyk7XG4gIHJldHVybiBhY2NvdW50RGF0YTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoYmFzZVVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gW1xuICAgIGAke2Jhc2VVcmx9L3BvcnRhbHNlcnZlci9Ib21lUGFnZWAsXG4gICAgYCR7YmFzZVVybH0vbmctcG9ydGFscy1idC9yYi9oZS9ob21lcGFnZWAsXG4gICAgYCR7YmFzZVVybH0vbmctcG9ydGFscy9yYi9oZS9ob21lcGFnZWAsXG4gIF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbXG4gICAgYCR7YmFzZVVybH0vQVVUSEVOVElDQVRFL0xPR09OP2Zsb3c9QVVUSEVOVElDQVRFJnN0YXRlPUxPR09OJmVycm9yY29kZT0xLjYmY2FsbG1lPWZhbHNlYCxcbiAgXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdID0gW1xuICAgIGAke2Jhc2VVcmx9L01DUC9TVEFSVD9mbG93PU1DUCZzdGF0ZT1TVEFSVCZleHBpcmVkRGF0ZT1udWxsYCxcbiAgICAvXFwvQUJPVVRUT0VYUElSRVxcL1NUQVJUL2ksXG4gIF07XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VzZXJDb2RlJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJDb2RlIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VyQ29kZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEhhcG9hbGltU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgZ2V0IGJhc2VVcmwoKSB7XG4gICAgcmV0dXJuICdodHRwczovL2xvZ2luLmJhbmtoYXBvYWxpbS5jby5pbCc7XG4gIH1cblxuICBnZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHt0aGlzLmJhc2VVcmx9L2NnaS1iaW4vcG9hbHd3d2M/cmVxTmFtZT1nZXRMb2dvblBhZ2VgLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogJy5sb2dpbi1idG4nLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gd2FpdEZvclJlZGlyZWN0KHRoaXMucGFnZSksXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHRoaXMuYmFzZVVybCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICByZXR1cm4gZmV0Y2hBY2NvdW50RGF0YSh0aGlzLnBhZ2UsIHRoaXMuYmFzZVVybCwgdGhpcy5vcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIYXBvYWxpbVNjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FB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
|
package/lib/transactions.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export interface TransactionsAccount {
|
|
2
2
|
accountNumber: string;
|
|
3
3
|
balance?: number;
|
|
4
|
+
currency?: string;
|
|
5
|
+
savingsAccount?: boolean;
|
|
4
6
|
txns: Transaction[];
|
|
7
|
+
securities?: Security[];
|
|
5
8
|
}
|
|
6
9
|
export declare enum TransactionTypes {
|
|
7
10
|
Normal = "normal",
|
|
@@ -45,3 +48,12 @@ export interface Transaction {
|
|
|
45
48
|
installments?: TransactionInstallments;
|
|
46
49
|
category?: string;
|
|
47
50
|
}
|
|
51
|
+
export interface Security {
|
|
52
|
+
name?: string;
|
|
53
|
+
symbol: string;
|
|
54
|
+
volume: number;
|
|
55
|
+
value: number;
|
|
56
|
+
currency?: string;
|
|
57
|
+
changePercentage?: number;
|
|
58
|
+
profitLoss?: number;
|
|
59
|
+
}
|
package/lib/transactions.js
CHANGED
|
@@ -14,4 +14,4 @@ let TransactionStatuses = exports.TransactionStatuses = /*#__PURE__*/function (T
|
|
|
14
14
|
TransactionStatuses["Pending"] = "pending";
|
|
15
15
|
return TransactionStatuses;
|
|
16
16
|
}({});
|
|
17
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUcmFuc2FjdGlvblR5cGVzIiwiZXhwb3J0cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiXSwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zQWNjb3VudCB7XG4gIGFjY291bnROdW1iZXI6IHN0cmluZztcbiAgYmFsYW5jZT86IG51bWJlcjtcbiAgY3VycmVuY3k/OiBzdHJpbmc7XG4gIHNhdmluZ3NBY2NvdW50PzogYm9vbGVhbjtcbiAgdHhuczogVHJhbnNhY3Rpb25bXTtcbiAgc2VjdXJpdGllcz86IFNlY3VyaXR5W107XG59XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uVHlwZXMge1xuICBOb3JtYWwgPSAnbm9ybWFsJyxcbiAgSW5zdGFsbG1lbnRzID0gJ2luc3RhbGxtZW50cycsXG59XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU3RhdHVzZXMge1xuICBDb21wbGV0ZWQgPSAnY29tcGxldGVkJyxcbiAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkluc3RhbGxtZW50cyB7XG4gIC8qKlxuICAgKiB0aGUgY3VycmVudCBpbnN0YWxsbWVudCBudW1iZXJcbiAgICovXG4gIG51bWJlcjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiB0aGUgdG90YWwgbnVtYmVyIG9mIGluc3RhbGxtZW50c1xuICAgKi9cbiAgdG90YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbiB7XG4gIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXM7XG4gIC8qKlxuICAgKiBzb21ldGltZXMgY2FsbGVkIEFzbWFjaHRhXG4gICAqL1xuICBpZGVudGlmaWVyPzogc3RyaW5nIHwgbnVtYmVyO1xuICAvKipcbiAgICogSVNPIGRhdGUgc3RyaW5nXG4gICAqL1xuICBkYXRlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJU08gZGF0ZSBzdHJpbmdcbiAgICovXG4gIHByb2Nlc3NlZERhdGU6IHN0cmluZztcbiAgb3JpZ2luYWxBbW91bnQ6IG51bWJlcjtcbiAgb3JpZ2luYWxDdXJyZW5jeTogc3RyaW5nO1xuICBjaGFyZ2VkQW1vdW50OiBudW1iZXI7XG4gIGNoYXJnZWRDdXJyZW5jeT86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzO1xuICBpbnN0YWxsbWVudHM/OiBUcmFuc2FjdGlvbkluc3RhbGxtZW50cztcbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHkge1xuICBuYW1lPzogc3RyaW5nO1xuICBzeW1ib2w6IHN0cmluZztcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGN1cnJlbmN5Pzogc3RyaW5nO1xuICBjaGFuZ2VQZXJjZW50YWdlPzogbnVtYmVyO1xuICBwcm9maXRMb3NzPzogbnVtYmVyO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFTWUEsZ0JBQWdCLEdBQUFDLE9BQUEsQ0FBQUQsZ0JBQUEsMEJBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQUEsT0FBaEJBLGdCQUFnQjtBQUFBO0FBQUEsSUFLaEJFLG1CQUFtQixHQUFBRCxPQUFBLENBQUFDLG1CQUFBLDBCQUFuQkEsbUJBQW1CO0VBQW5CQSxtQkFBbUI7RUFBbkJBLG1CQUFtQjtFQUFBLE9BQW5CQSxtQkFBbUI7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|