israeli-bank-scrapers 6.1.0 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/assertNever.js +5 -7
- package/lib/constants.js +13 -16
- package/lib/definitions.js +109 -113
- package/lib/helpers/browser.js +9 -16
- package/lib/helpers/dates.js +18 -19
- package/lib/helpers/debug.js +9 -9
- package/lib/helpers/elements-interactions.js +78 -84
- package/lib/helpers/fetch.js +82 -89
- package/lib/helpers/navigation.js +24 -31
- package/lib/helpers/storage.js +10 -12
- package/lib/helpers/transactions.js +33 -35
- package/lib/helpers/waiting.js +45 -44
- package/lib/index.js +15 -82
- package/lib/scrapers/amex.js +11 -13
- package/lib/scrapers/base-beinleumi-group.js +233 -252
- package/lib/scrapers/base-isracard-amex.js +273 -286
- package/lib/scrapers/base-scraper-with-browser.js +240 -274
- package/lib/scrapers/base-scraper.js +82 -86
- package/lib/scrapers/behatsdaa.js +98 -107
- package/lib/scrapers/beinleumi.js +11 -20
- package/lib/scrapers/beyahad-bishvilha.js +132 -138
- package/lib/scrapers/discount.js +97 -103
- package/lib/scrapers/errors.js +22 -25
- package/lib/scrapers/factory.js +66 -67
- package/lib/scrapers/hapoalim.js +162 -182
- package/lib/scrapers/interface.js +2 -5
- package/lib/scrapers/isracard.js +11 -13
- package/lib/scrapers/leumi.js +167 -176
- package/lib/scrapers/massad.js +11 -20
- package/lib/scrapers/max.js +256 -268
- package/lib/scrapers/mercantile.js +14 -20
- package/lib/scrapers/mizrahi.js +158 -159
- package/lib/scrapers/one-zero-queries.js +4 -7
- package/lib/scrapers/one-zero.js +176 -240
- package/lib/scrapers/otsar-hahayal.js +11 -20
- package/lib/scrapers/pagi.js +11 -20
- package/lib/scrapers/union-bank.js +172 -179
- package/lib/scrapers/visa-cal.js +254 -263
- package/lib/scrapers/yahav.js +190 -211
- package/lib/transactions.js +13 -16
- package/package.json +12 -14
- package/lib/scrapers/amex.test.d.ts +0 -1
- package/lib/scrapers/amex.test.js +0 -54
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
- package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
- package/lib/scrapers/behatsdaa.test.d.ts +0 -1
- package/lib/scrapers/behatsdaa.test.js +0 -50
- package/lib/scrapers/beinleumi.test.d.ts +0 -1
- package/lib/scrapers/beinleumi.test.js +0 -52
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
- package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
- package/lib/scrapers/discount.test.d.ts +0 -1
- package/lib/scrapers/discount.test.js +0 -54
- package/lib/scrapers/factory.test.d.ts +0 -1
- package/lib/scrapers/factory.test.js +0 -19
- package/lib/scrapers/hapoalim.test.d.ts +0 -1
- package/lib/scrapers/hapoalim.test.js +0 -52
- package/lib/scrapers/isracard.test.d.ts +0 -1
- package/lib/scrapers/isracard.test.js +0 -54
- package/lib/scrapers/leumi.test.d.ts +0 -1
- package/lib/scrapers/leumi.test.js +0 -52
- package/lib/scrapers/max.test.d.ts +0 -1
- package/lib/scrapers/max.test.js +0 -71
- package/lib/scrapers/mercantile.test.d.ts +0 -1
- package/lib/scrapers/mercantile.test.js +0 -50
- package/lib/scrapers/mizrahi.test.d.ts +0 -1
- package/lib/scrapers/mizrahi.test.js +0 -58
- package/lib/scrapers/one-zero.test.d.ts +0 -1
- package/lib/scrapers/one-zero.test.js +0 -56
- package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
- package/lib/scrapers/otsar-hahayal.test.js +0 -52
- package/lib/scrapers/pagi.test.d.ts +0 -1
- package/lib/scrapers/pagi.test.js +0 -52
- package/lib/scrapers/union-bank.test.d.ts +0 -1
- package/lib/scrapers/union-bank.test.js +0 -52
- package/lib/scrapers/visa-cal.test.d.ts +0 -1
- package/lib/scrapers/visa-cal.test.js +0 -54
- package/lib/scrapers/yahav.test.d.ts +0 -1
- package/lib/scrapers/yahav.test.js +0 -54
package/lib/scrapers/visa-cal.js
CHANGED
|
@@ -1,290 +1,281 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
require("
|
|
8
|
-
require("
|
|
9
|
-
require("
|
|
10
|
-
require("
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var _storage = require("../helpers/storage");
|
|
17
|
-
var _transactions = require("../helpers/transactions");
|
|
18
|
-
var _waiting = require("../helpers/waiting");
|
|
19
|
-
var _transactions2 = require("../transactions");
|
|
20
|
-
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
21
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
23
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
24
|
-
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const moment_1 = __importDefault(require("moment"));
|
|
7
|
+
const debug_1 = require("../helpers/debug");
|
|
8
|
+
const elements_interactions_1 = require("../helpers/elements-interactions");
|
|
9
|
+
const fetch_1 = require("../helpers/fetch");
|
|
10
|
+
const navigation_1 = require("../helpers/navigation");
|
|
11
|
+
const storage_1 = require("../helpers/storage");
|
|
12
|
+
const transactions_1 = require("../helpers/transactions");
|
|
13
|
+
const waiting_1 = require("../helpers/waiting");
|
|
14
|
+
const transactions_2 = require("../transactions");
|
|
15
|
+
const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
|
|
25
16
|
const LOGIN_URL = 'https://www.cal-online.co.il/';
|
|
26
17
|
const TRANSACTIONS_REQUEST_ENDPOINT = 'https://api.cal-online.co.il/Transactions/api/transactionsDetails/getCardTransactionsDetails';
|
|
27
18
|
const PENDING_TRANSACTIONS_REQUEST_ENDPOINT = 'https://api.cal-online.co.il/Transactions/api/approvals/getClearanceRequests';
|
|
28
19
|
const InvalidPasswordMessage = 'שם המשתמש או הסיסמה שהוזנו שגויים';
|
|
29
|
-
const debug = (0,
|
|
30
|
-
var TrnTypeCode
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}(TrnTypeCode || {});
|
|
20
|
+
const debug = (0, debug_1.getDebug)('visa-cal');
|
|
21
|
+
var TrnTypeCode;
|
|
22
|
+
(function (TrnTypeCode) {
|
|
23
|
+
TrnTypeCode["regular"] = "5";
|
|
24
|
+
TrnTypeCode["credit"] = "6";
|
|
25
|
+
TrnTypeCode["installments"] = "8";
|
|
26
|
+
TrnTypeCode["standingOrder"] = "9";
|
|
27
|
+
})(TrnTypeCode || (TrnTypeCode = {}));
|
|
37
28
|
function isPending(transaction) {
|
|
38
|
-
|
|
29
|
+
return transaction.debCrdDate === undefined; // an arbitrary field that only appears in a completed transaction
|
|
39
30
|
}
|
|
40
31
|
function isCardTransactionDetails(result) {
|
|
41
|
-
|
|
32
|
+
return result.result !== undefined;
|
|
42
33
|
}
|
|
43
34
|
function isCardPendingTransactionDetails(result) {
|
|
44
|
-
|
|
35
|
+
return result.result !== undefined;
|
|
45
36
|
}
|
|
46
37
|
async function getLoginFrame(page) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
38
|
+
let frame = null;
|
|
39
|
+
debug('wait until login frame found');
|
|
40
|
+
await (0, waiting_1.waitUntil)(() => {
|
|
41
|
+
frame = page.frames().find(f => f.url().includes('connect')) || null;
|
|
42
|
+
return Promise.resolve(!!frame);
|
|
43
|
+
}, 'wait for iframe with login form', 10000, 1000);
|
|
44
|
+
if (!frame) {
|
|
45
|
+
debug('failed to find login frame for 10 seconds');
|
|
46
|
+
throw new Error('failed to extract login iframe');
|
|
47
|
+
}
|
|
48
|
+
return frame;
|
|
58
49
|
}
|
|
59
50
|
async function hasInvalidPasswordError(page) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
51
|
+
const frame = await getLoginFrame(page);
|
|
52
|
+
const errorFound = await (0, elements_interactions_1.elementPresentOnPage)(frame, 'div.general-error > div');
|
|
53
|
+
const errorMessage = errorFound
|
|
54
|
+
? await (0, elements_interactions_1.pageEval)(frame, 'div.general-error > div', '', item => {
|
|
55
|
+
return item.innerText;
|
|
56
|
+
})
|
|
57
|
+
: '';
|
|
58
|
+
return errorMessage === InvalidPasswordMessage;
|
|
66
59
|
}
|
|
67
60
|
async function hasChangePasswordForm(page) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
61
|
+
const frame = await getLoginFrame(page);
|
|
62
|
+
const errorFound = await (0, elements_interactions_1.elementPresentOnPage)(frame, '.change-password-subtitle');
|
|
63
|
+
return errorFound;
|
|
71
64
|
}
|
|
72
65
|
function getPossibleLoginResults() {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
66
|
+
debug('return possible login results');
|
|
67
|
+
const urls = {
|
|
68
|
+
[base_scraper_with_browser_1.LoginResults.Success]: [/dashboard/i],
|
|
69
|
+
[base_scraper_with_browser_1.LoginResults.InvalidPassword]: [
|
|
70
|
+
async (options) => {
|
|
71
|
+
const page = options?.page;
|
|
72
|
+
if (!page) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return hasInvalidPasswordError(page);
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
// [LoginResults.AccountBlocked]: [], // TODO add when reaching this scenario
|
|
79
|
+
[base_scraper_with_browser_1.LoginResults.ChangePassword]: [
|
|
80
|
+
async (options) => {
|
|
81
|
+
const page = options?.page;
|
|
82
|
+
if (!page) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return hasChangePasswordForm(page);
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
return urls;
|
|
93
90
|
}
|
|
94
91
|
function createLoginFields(credentials) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
selector: '[formcontrolname="password"]',
|
|
101
|
-
value: credentials.password
|
|
102
|
-
}];
|
|
92
|
+
debug('create login fields for username and password');
|
|
93
|
+
return [
|
|
94
|
+
{ selector: '[formcontrolname="userName"]', value: credentials.username },
|
|
95
|
+
{ selector: '[formcontrolname="password"]', value: credentials.password },
|
|
96
|
+
];
|
|
103
97
|
}
|
|
104
98
|
function convertParsedDataToTransactions(data, pendingData) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
99
|
+
const pendingTransactions = pendingData?.result
|
|
100
|
+
? pendingData.result.cardsList.flatMap(card => card.authDetalisList)
|
|
101
|
+
: [];
|
|
102
|
+
const bankAccounts = data.flatMap(monthData => monthData.result.bankAccounts);
|
|
103
|
+
const regularDebitDays = bankAccounts.flatMap(accounts => accounts.debitDates);
|
|
104
|
+
const immediateDebitDays = bankAccounts.flatMap(accounts => accounts.immidiateDebits.debitDays);
|
|
105
|
+
const completedTransactions = [...regularDebitDays, ...immediateDebitDays].flatMap(debitDate => debitDate.transactions);
|
|
106
|
+
const all = [...pendingTransactions, ...completedTransactions];
|
|
107
|
+
return all.map(transaction => {
|
|
108
|
+
const numOfPayments = isPending(transaction) ? transaction.numberOfPayments : transaction.numOfPayments;
|
|
109
|
+
const installments = numOfPayments
|
|
110
|
+
? {
|
|
111
|
+
number: isPending(transaction) ? 1 : transaction.curPaymentNum,
|
|
112
|
+
total: numOfPayments,
|
|
113
|
+
}
|
|
114
|
+
: undefined;
|
|
115
|
+
const date = (0, moment_1.default)(transaction.trnPurchaseDate);
|
|
116
|
+
let chargedAmount = isPending(transaction) ? transaction.trnAmt * -1 : transaction.amtBeforeConvAndIndex * -1;
|
|
117
|
+
let originalAmount = transaction.trnAmt * -1;
|
|
118
|
+
if (transaction.trnTypeCode === TrnTypeCode.credit) {
|
|
119
|
+
chargedAmount = isPending(transaction) ? transaction.trnAmt : transaction.amtBeforeConvAndIndex;
|
|
120
|
+
originalAmount = transaction.trnAmt;
|
|
121
|
+
}
|
|
122
|
+
const result = {
|
|
123
|
+
identifier: !isPending(transaction) ? transaction.trnIntId : undefined,
|
|
124
|
+
type: [TrnTypeCode.regular, TrnTypeCode.standingOrder].includes(transaction.trnTypeCode)
|
|
125
|
+
? transactions_2.TransactionTypes.Normal
|
|
126
|
+
: transactions_2.TransactionTypes.Installments,
|
|
127
|
+
status: isPending(transaction) ? transactions_2.TransactionStatuses.Pending : transactions_2.TransactionStatuses.Completed,
|
|
128
|
+
date: installments ? date.add(installments.number - 1, 'month').toISOString() : date.toISOString(),
|
|
129
|
+
processedDate: isPending(transaction) ? date.toISOString() : new Date(transaction.debCrdDate).toISOString(),
|
|
130
|
+
originalAmount,
|
|
131
|
+
originalCurrency: transaction.trnCurrencySymbol,
|
|
132
|
+
chargedAmount,
|
|
133
|
+
chargedCurrency: !isPending(transaction) ? transaction.debCrdCurrencySymbol : undefined,
|
|
134
|
+
description: transaction.merchantName,
|
|
135
|
+
memo: transaction.transTypeCommentDetails.toString(),
|
|
136
|
+
category: transaction.branchCodeDesc,
|
|
137
|
+
};
|
|
138
|
+
if (installments) {
|
|
139
|
+
result.installments = installments;
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
class VisaCalScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
|
|
145
|
+
openLoginPopup = async () => {
|
|
146
|
+
debug('open login popup, wait until login button available');
|
|
147
|
+
await (0, elements_interactions_1.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn', true);
|
|
148
|
+
debug('click on the login button');
|
|
149
|
+
await (0, elements_interactions_1.clickButton)(this.page, '#ccLoginDesktopBtn');
|
|
150
|
+
debug('get the frame that holds the login');
|
|
151
|
+
const frame = await getLoginFrame(this.page);
|
|
152
|
+
debug('wait until the password login tab header is available');
|
|
153
|
+
await (0, elements_interactions_1.waitUntilElementFound)(frame, '#regular-login');
|
|
154
|
+
debug('navigate to the password login tab');
|
|
155
|
+
await (0, elements_interactions_1.clickButton)(frame, '#regular-login');
|
|
156
|
+
debug('wait until the password login tab is active');
|
|
157
|
+
await (0, elements_interactions_1.waitUntilElementFound)(frame, 'regular-login');
|
|
158
|
+
return frame;
|
|
137
159
|
};
|
|
138
|
-
|
|
139
|
-
|
|
160
|
+
async getCards() {
|
|
161
|
+
const initData = await (0, waiting_1.waitUntil)(() => (0, storage_1.getFromSessionStorage)(this.page, 'init'), 'get init data in session storage', 10000, 1000);
|
|
162
|
+
if (!initData) {
|
|
163
|
+
throw new Error("could not find 'init' data in session storage");
|
|
164
|
+
}
|
|
165
|
+
return initData?.result.cards.map(({ cardUniqueId, last4Digits }) => ({ cardUniqueId, last4Digits }));
|
|
140
166
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
_defineProperty(this, "openLoginPopup", async () => {
|
|
148
|
-
debug('open login popup, wait until login button available');
|
|
149
|
-
await (0, _elementsInteractions.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn', true);
|
|
150
|
-
debug('click on the login button');
|
|
151
|
-
await (0, _elementsInteractions.clickButton)(this.page, '#ccLoginDesktopBtn');
|
|
152
|
-
debug('get the frame that holds the login');
|
|
153
|
-
const frame = await getLoginFrame(this.page);
|
|
154
|
-
debug('wait until the password login tab header is available');
|
|
155
|
-
await (0, _elementsInteractions.waitUntilElementFound)(frame, '#regular-login');
|
|
156
|
-
debug('navigate to the password login tab');
|
|
157
|
-
await (0, _elementsInteractions.clickButton)(frame, '#regular-login');
|
|
158
|
-
debug('wait until the password login tab is active');
|
|
159
|
-
await (0, _elementsInteractions.waitUntilElementFound)(frame, 'regular-login');
|
|
160
|
-
return frame;
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
async getCards() {
|
|
164
|
-
const initData = await (0, _waiting.waitUntil)(() => (0, _storage.getFromSessionStorage)(this.page, 'init'), 'get init data in session storage', 10000, 1000);
|
|
165
|
-
if (!initData) {
|
|
166
|
-
throw new Error('could not find \'init\' data in session storage');
|
|
167
|
+
async getAuthorizationHeader() {
|
|
168
|
+
const authModule = await (0, storage_1.getFromSessionStorage)(this.page, 'auth-module');
|
|
169
|
+
if (!authModule) {
|
|
170
|
+
throw new Error("could not find 'auth-module' in session storage");
|
|
171
|
+
}
|
|
172
|
+
return `CALAuthScheme ${authModule.auth.calConnectToken}`;
|
|
167
173
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
174
|
+
async getXSiteId() {
|
|
175
|
+
/*
|
|
176
|
+
I don't know if the constant below will change in the feature.
|
|
177
|
+
If so, use the next code:
|
|
178
|
+
|
|
179
|
+
return this.page.evaluate(() => new Ut().xSiteId);
|
|
180
|
+
|
|
181
|
+
To get the classname search for 'xSiteId' in the page source
|
|
182
|
+
class Ut {
|
|
183
|
+
constructor(_e, on, yn) {
|
|
184
|
+
this.store = _e,
|
|
185
|
+
this.config = on,
|
|
186
|
+
this.eventBusService = yn,
|
|
187
|
+
this.xSiteId = "09031987-273E-2311-906C-8AF85B17C8D9",
|
|
188
|
+
*/
|
|
189
|
+
return Promise.resolve('09031987-273E-2311-906C-8AF85B17C8D9');
|
|
190
|
+
}
|
|
191
|
+
getLoginOptions(credentials) {
|
|
192
|
+
return {
|
|
193
|
+
loginUrl: `${LOGIN_URL}`,
|
|
194
|
+
fields: createLoginFields(credentials),
|
|
195
|
+
submitButtonSelector: 'button[type="submit"]',
|
|
196
|
+
possibleResults: getPossibleLoginResults(),
|
|
197
|
+
checkReadiness: async () => (0, elements_interactions_1.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn'),
|
|
198
|
+
preAction: this.openLoginPopup,
|
|
199
|
+
postAction: async () => {
|
|
200
|
+
try {
|
|
201
|
+
await (0, navigation_1.waitForNavigation)(this.page);
|
|
202
|
+
const currentUrl = await (0, navigation_1.getCurrentUrl)(this.page);
|
|
203
|
+
if (currentUrl.endsWith('site-tutorial')) {
|
|
204
|
+
await (0, elements_interactions_1.clickButton)(this.page, 'button.btn-close');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
const currentUrl = await (0, navigation_1.getCurrentUrl)(this.page);
|
|
209
|
+
if (currentUrl.endsWith('dashboard'))
|
|
210
|
+
return;
|
|
211
|
+
const requiresChangePassword = await hasChangePasswordForm(this.page);
|
|
212
|
+
if (requiresChangePassword)
|
|
213
|
+
return;
|
|
214
|
+
throw e;
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
async fetchData() {
|
|
221
|
+
const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years').subtract(6, 'months').add(1, 'day');
|
|
222
|
+
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
223
|
+
const startMoment = moment_1.default.max(defaultStartMoment, (0, moment_1.default)(startDate));
|
|
224
|
+
debug(`fetch transactions starting ${startMoment.format()}`);
|
|
225
|
+
const Authorization = await this.getAuthorizationHeader();
|
|
226
|
+
const cards = await this.getCards();
|
|
227
|
+
const xSiteId = await this.getXSiteId();
|
|
228
|
+
const futureMonthsToScrape = this.options.futureMonthsToScrape ?? 1;
|
|
229
|
+
const accounts = await Promise.all(cards.map(async (card) => {
|
|
230
|
+
const finalMonthToFetchMoment = (0, moment_1.default)().add(futureMonthsToScrape, 'month');
|
|
231
|
+
const months = finalMonthToFetchMoment.diff(startMoment, 'months');
|
|
232
|
+
const allMonthsData = [];
|
|
233
|
+
debug(`fetch pending transactions for card ${card.cardUniqueId}`);
|
|
234
|
+
let pendingData = await (0, fetch_1.fetchPostWithinPage)(this.page, PENDING_TRANSACTIONS_REQUEST_ENDPOINT, { cardUniqueIDArray: [card.cardUniqueId] }, {
|
|
235
|
+
Authorization,
|
|
236
|
+
'X-Site-Id': xSiteId,
|
|
237
|
+
'Content-Type': 'application/json',
|
|
238
|
+
});
|
|
239
|
+
debug(`fetch completed transactions for card ${card.cardUniqueId}`);
|
|
240
|
+
for (let i = 0; i <= months; i += 1) {
|
|
241
|
+
const month = finalMonthToFetchMoment.clone().subtract(i, 'months');
|
|
242
|
+
const monthData = await (0, fetch_1.fetchPostWithinPage)(this.page, TRANSACTIONS_REQUEST_ENDPOINT, { cardUniqueId: card.cardUniqueId, month: month.format('M'), year: month.format('YYYY') }, {
|
|
243
|
+
Authorization,
|
|
244
|
+
'X-Site-Id': xSiteId,
|
|
245
|
+
'Content-Type': 'application/json',
|
|
246
|
+
});
|
|
247
|
+
if (monthData?.statusCode !== 1)
|
|
248
|
+
throw new Error(`failed to fetch transactions for card ${card.last4Digits}. Message: ${monthData?.title || ''}`);
|
|
249
|
+
if (!isCardTransactionDetails(monthData)) {
|
|
250
|
+
throw new Error('monthData is not of type CardTransactionDetails');
|
|
251
|
+
}
|
|
252
|
+
allMonthsData.push(monthData);
|
|
253
|
+
}
|
|
254
|
+
if (pendingData?.statusCode !== 1 && pendingData?.statusCode !== 96) {
|
|
255
|
+
debug(`failed to fetch pending transactions for card ${card.last4Digits}. Message: ${pendingData?.title || ''}`);
|
|
256
|
+
pendingData = null;
|
|
257
|
+
}
|
|
258
|
+
else if (!isCardPendingTransactionDetails(pendingData)) {
|
|
259
|
+
debug('pendingData is not of type CardTransactionDetails');
|
|
260
|
+
pendingData = null;
|
|
261
|
+
}
|
|
262
|
+
const transactions = convertParsedDataToTransactions(allMonthsData, pendingData);
|
|
263
|
+
debug('filer out old transactions');
|
|
264
|
+
const txns = (this.options.outputData?.enableTransactionsFilterByDate ?? true)
|
|
265
|
+
? (0, transactions_1.filterOldTransactions)(transactions, (0, moment_1.default)(startDate), this.options.combineInstallments || false)
|
|
266
|
+
: transactions;
|
|
267
|
+
return {
|
|
268
|
+
txns,
|
|
269
|
+
accountNumber: card.last4Digits,
|
|
270
|
+
};
|
|
271
|
+
}));
|
|
272
|
+
debug('return the scraped accounts');
|
|
273
|
+
debug(JSON.stringify(accounts, null, 2));
|
|
274
|
+
return {
|
|
275
|
+
success: true,
|
|
276
|
+
accounts,
|
|
277
|
+
};
|
|
180
278
|
}
|
|
181
|
-
return `CALAuthScheme ${authModule.auth.calConnectToken}`;
|
|
182
|
-
}
|
|
183
|
-
async getXSiteId() {
|
|
184
|
-
/*
|
|
185
|
-
I don't know if the constant below will change in the feature.
|
|
186
|
-
If so, use the next code:
|
|
187
|
-
return this.page.evaluate(() => new Ut().xSiteId);
|
|
188
|
-
To get the classname search for 'xSiteId' in the page source
|
|
189
|
-
class Ut {
|
|
190
|
-
constructor(_e, on, yn) {
|
|
191
|
-
this.store = _e,
|
|
192
|
-
this.config = on,
|
|
193
|
-
this.eventBusService = yn,
|
|
194
|
-
this.xSiteId = "09031987-273E-2311-906C-8AF85B17C8D9",
|
|
195
|
-
*/
|
|
196
|
-
return Promise.resolve('09031987-273E-2311-906C-8AF85B17C8D9');
|
|
197
|
-
}
|
|
198
|
-
getLoginOptions(credentials) {
|
|
199
|
-
return {
|
|
200
|
-
loginUrl: `${LOGIN_URL}`,
|
|
201
|
-
fields: createLoginFields(credentials),
|
|
202
|
-
submitButtonSelector: 'button[type="submit"]',
|
|
203
|
-
possibleResults: getPossibleLoginResults(),
|
|
204
|
-
checkReadiness: async () => (0, _elementsInteractions.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn'),
|
|
205
|
-
preAction: this.openLoginPopup,
|
|
206
|
-
postAction: async () => {
|
|
207
|
-
try {
|
|
208
|
-
await (0, _navigation.waitForNavigation)(this.page);
|
|
209
|
-
const currentUrl = await (0, _navigation.getCurrentUrl)(this.page);
|
|
210
|
-
if (currentUrl.endsWith('site-tutorial')) {
|
|
211
|
-
await (0, _elementsInteractions.clickButton)(this.page, 'button.btn-close');
|
|
212
|
-
}
|
|
213
|
-
} catch (e) {
|
|
214
|
-
const currentUrl = await (0, _navigation.getCurrentUrl)(this.page);
|
|
215
|
-
if (currentUrl.endsWith('dashboard')) return;
|
|
216
|
-
const requiresChangePassword = await hasChangePasswordForm(this.page);
|
|
217
|
-
if (requiresChangePassword) return;
|
|
218
|
-
throw e;
|
|
219
|
-
}
|
|
220
|
-
},
|
|
221
|
-
userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
async fetchData() {
|
|
225
|
-
var _this$options$futureM;
|
|
226
|
-
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').subtract(6, 'months').add(1, 'day');
|
|
227
|
-
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
228
|
-
const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
|
|
229
|
-
debug(`fetch transactions starting ${startMoment.format()}`);
|
|
230
|
-
const Authorization = await this.getAuthorizationHeader();
|
|
231
|
-
const cards = await this.getCards();
|
|
232
|
-
const xSiteId = await this.getXSiteId();
|
|
233
|
-
const futureMonthsToScrape = (_this$options$futureM = this.options.futureMonthsToScrape) !== null && _this$options$futureM !== void 0 ? _this$options$futureM : 1;
|
|
234
|
-
const accounts = await Promise.all(cards.map(async card => {
|
|
235
|
-
var _pendingData, _pendingData2, _this$options$outputD, _this$options$outputD2;
|
|
236
|
-
const finalMonthToFetchMoment = (0, _moment.default)().add(futureMonthsToScrape, 'month');
|
|
237
|
-
const months = finalMonthToFetchMoment.diff(startMoment, 'months');
|
|
238
|
-
const allMonthsData = [];
|
|
239
|
-
debug(`fetch pending transactions for card ${card.cardUniqueId}`);
|
|
240
|
-
let pendingData = await (0, _fetch.fetchPostWithinPage)(this.page, PENDING_TRANSACTIONS_REQUEST_ENDPOINT, {
|
|
241
|
-
cardUniqueIDArray: [card.cardUniqueId]
|
|
242
|
-
}, {
|
|
243
|
-
Authorization,
|
|
244
|
-
'X-Site-Id': xSiteId,
|
|
245
|
-
'Content-Type': 'application/json'
|
|
246
|
-
});
|
|
247
|
-
debug(`fetch completed transactions for card ${card.cardUniqueId}`);
|
|
248
|
-
for (let i = 0; i <= months; i += 1) {
|
|
249
|
-
const month = finalMonthToFetchMoment.clone().subtract(i, 'months');
|
|
250
|
-
const monthData = await (0, _fetch.fetchPostWithinPage)(this.page, TRANSACTIONS_REQUEST_ENDPOINT, {
|
|
251
|
-
cardUniqueId: card.cardUniqueId,
|
|
252
|
-
month: month.format('M'),
|
|
253
|
-
year: month.format('YYYY')
|
|
254
|
-
}, {
|
|
255
|
-
Authorization,
|
|
256
|
-
'X-Site-Id': xSiteId,
|
|
257
|
-
'Content-Type': 'application/json'
|
|
258
|
-
});
|
|
259
|
-
if ((monthData === null || monthData === void 0 ? void 0 : monthData.statusCode) !== 1) throw new Error(`failed to fetch transactions for card ${card.last4Digits}. Message: ${(monthData === null || monthData === void 0 ? void 0 : monthData.title) || ''}`);
|
|
260
|
-
if (!isCardTransactionDetails(monthData)) {
|
|
261
|
-
throw new Error('monthData is not of type CardTransactionDetails');
|
|
262
|
-
}
|
|
263
|
-
allMonthsData.push(monthData);
|
|
264
|
-
}
|
|
265
|
-
if (((_pendingData = pendingData) === null || _pendingData === void 0 ? void 0 : _pendingData.statusCode) !== 1 && ((_pendingData2 = pendingData) === null || _pendingData2 === void 0 ? void 0 : _pendingData2.statusCode) !== 96) {
|
|
266
|
-
var _pendingData3;
|
|
267
|
-
debug(`failed to fetch pending transactions for card ${card.last4Digits}. Message: ${((_pendingData3 = pendingData) === null || _pendingData3 === void 0 ? void 0 : _pendingData3.title) || ''}`);
|
|
268
|
-
pendingData = null;
|
|
269
|
-
} else if (!isCardPendingTransactionDetails(pendingData)) {
|
|
270
|
-
debug('pendingData is not of type CardTransactionDetails');
|
|
271
|
-
pendingData = null;
|
|
272
|
-
}
|
|
273
|
-
const transactions = convertParsedDataToTransactions(allMonthsData, pendingData);
|
|
274
|
-
debug('filer out old transactions');
|
|
275
|
-
const txns = ((_this$options$outputD = (_this$options$outputD2 = this.options.outputData) === null || _this$options$outputD2 === void 0 ? void 0 : _this$options$outputD2.enableTransactionsFilterByDate) !== null && _this$options$outputD !== void 0 ? _this$options$outputD : true) ? (0, _transactions.filterOldTransactions)(transactions, (0, _moment.default)(startDate), this.options.combineInstallments || false) : transactions;
|
|
276
|
-
return {
|
|
277
|
-
txns,
|
|
278
|
-
accountNumber: card.last4Digits
|
|
279
|
-
};
|
|
280
|
-
}));
|
|
281
|
-
debug('return the scraped accounts');
|
|
282
|
-
debug(JSON.stringify(accounts, null, 2));
|
|
283
|
-
return {
|
|
284
|
-
success: true,
|
|
285
|
-
accounts
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
279
|
}
|
|
289
|
-
|
|
290
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZGVidWciLCJfZWxlbWVudHNJbnRlcmFjdGlvbnMiLCJfZmV0Y2giLCJfbmF2aWdhdGlvbiIsIl9zdG9yYWdlIiwiX3RyYW5zYWN0aW9ucyIsIl93YWl0aW5nIiwiX3RyYW5zYWN0aW9uczIiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9kZWZpbmVQcm9wZXJ0eSIsInIiLCJ0IiwiX3RvUHJvcGVydHlLZXkiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIkxPR0lOX1VSTCIsIlRSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5UIiwiUEVORElOR19UUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCIsIkludmFsaWRQYXNzd29yZE1lc3NhZ2UiLCJkZWJ1ZyIsImdldERlYnVnIiwiVHJuVHlwZUNvZGUiLCJpc1BlbmRpbmciLCJ0cmFuc2FjdGlvbiIsImRlYkNyZERhdGUiLCJ1bmRlZmluZWQiLCJpc0NhcmRUcmFuc2FjdGlvbkRldGFpbHMiLCJyZXN1bHQiLCJpc0NhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIiwiZ2V0TG9naW5GcmFtZSIsInBhZ2UiLCJmcmFtZSIsIndhaXRVbnRpbCIsImZyYW1lcyIsImZpbmQiLCJmIiwidXJsIiwiaW5jbHVkZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsIkVycm9yIiwiaGFzSW52YWxpZFBhc3N3b3JkRXJyb3IiLCJlcnJvckZvdW5kIiwiZWxlbWVudFByZXNlbnRPblBhZ2UiLCJlcnJvck1lc3NhZ2UiLCJwYWdlRXZhbCIsIml0ZW0iLCJpbm5lclRleHQiLCJoYXNDaGFuZ2VQYXNzd29yZEZvcm0iLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwib3B0aW9ucyIsIkNoYW5nZVBhc3N3b3JkIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImNvbnZlcnRQYXJzZWREYXRhVG9UcmFuc2FjdGlvbnMiLCJkYXRhIiwicGVuZGluZ0RhdGEiLCJwZW5kaW5nVHJhbnNhY3Rpb25zIiwiY2FyZHNMaXN0IiwiZmxhdE1hcCIsImNhcmQiLCJhdXRoRGV0YWxpc0xpc3QiLCJiYW5rQWNjb3VudHMiLCJtb250aERhdGEiLCJyZWd1bGFyRGViaXREYXlzIiwiYWNjb3VudHMiLCJkZWJpdERhdGVzIiwiaW1tZWRpYXRlRGViaXREYXlzIiwiaW1taWRpYXRlRGViaXRzIiwiZGViaXREYXlzIiwiY29tcGxldGVkVHJhbnNhY3Rpb25zIiwiZGViaXREYXRlIiwidHJhbnNhY3Rpb25zIiwiYWxsIiwibWFwIiwibnVtT2ZQYXltZW50cyIsIm51bWJlck9mUGF5bWVudHMiLCJpbnN0YWxsbWVudHMiLCJudW1iZXIiLCJjdXJQYXltZW50TnVtIiwidG90YWwiLCJkYXRlIiwibW9tZW50IiwidHJuUHVyY2hhc2VEYXRlIiwiY2hhcmdlZEFtb3VudCIsInRybkFtdCIsImFtdEJlZm9yZUNvbnZBbmRJbmRleCIsIm9yaWdpbmFsQW1vdW50IiwidHJuVHlwZUNvZGUiLCJjcmVkaXQiLCJpZGVudGlmaWVyIiwidHJuSW50SWQiLCJ0eXBlIiwicmVndWxhciIsInN0YW5kaW5nT3JkZXIiLCJUcmFuc2FjdGlvblR5cGVzIiwiTm9ybWFsIiwiSW5zdGFsbG1lbnRzIiwic3RhdHVzIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIlBlbmRpbmciLCJDb21wbGV0ZWQiLCJhZGQiLCJ0b0lTT1N0cmluZyIsInByb2Nlc3NlZERhdGUiLCJEYXRlIiwib3JpZ2luYWxDdXJyZW5jeSIsInRybkN1cnJlbmN5U3ltYm9sIiwiY2hhcmdlZEN1cnJlbmN5IiwiZGViQ3JkQ3VycmVuY3lTeW1ib2wiLCJkZXNjcmlwdGlvbiIsIm1lcmNoYW50TmFtZSIsIm1lbW8iLCJ0cmFuc1R5cGVDb21tZW50RGV0YWlscyIsInRvU3RyaW5nIiwiY2F0ZWdvcnkiLCJicmFuY2hDb2RlRGVzYyIsIlZpc2FDYWxTY3JhcGVyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImNsaWNrQnV0dG9uIiwiZ2V0Q2FyZHMiLCJpbml0RGF0YSIsImdldEZyb21TZXNzaW9uU3RvcmFnZSIsImNhcmRzIiwiY2FyZFVuaXF1ZUlkIiwibGFzdDREaWdpdHMiLCJnZXRBdXRob3JpemF0aW9uSGVhZGVyIiwiYXV0aE1vZHVsZSIsImF1dGgiLCJjYWxDb25uZWN0VG9rZW4iLCJnZXRYU2l0ZUlkIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInBvc3NpYmxlUmVzdWx0cyIsImNoZWNrUmVhZGluZXNzIiwicHJlQWN0aW9uIiwib3BlbkxvZ2luUG9wdXAiLCJwb3N0QWN0aW9uIiwid2FpdEZvck5hdmlnYXRpb24iLCJjdXJyZW50VXJsIiwiZ2V0Q3VycmVudFVybCIsImVuZHNXaXRoIiwicmVxdWlyZXNDaGFuZ2VQYXNzd29yZCIsInVzZXJBZ2VudCIsImZldGNoRGF0YSIsIl90aGlzJG9wdGlvbnMkZnV0dXJlTSIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnREYXRlIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtYXgiLCJmb3JtYXQiLCJBdXRob3JpemF0aW9uIiwieFNpdGVJZCIsImZ1dHVyZU1vbnRoc1RvU2NyYXBlIiwiX3BlbmRpbmdEYXRhIiwiX3BlbmRpbmdEYXRhMiIsIl90aGlzJG9wdGlvbnMkb3V0cHV0RCIsIl90aGlzJG9wdGlvbnMkb3V0cHV0RDIiLCJmaW5hbE1vbnRoVG9GZXRjaE1vbWVudCIsIm1vbnRocyIsImRpZmYiLCJhbGxNb250aHNEYXRhIiwiZmV0Y2hQb3N0V2l0aGluUGFnZSIsImNhcmRVbmlxdWVJREFycmF5IiwibW9udGgiLCJjbG9uZSIsInllYXIiLCJzdGF0dXNDb2RlIiwidGl0bGUiLCJwdXNoIiwiX3BlbmRpbmdEYXRhMyIsInR4bnMiLCJvdXRwdXREYXRhIiwiZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlIiwiZmlsdGVyT2xkVHJhbnNhY3Rpb25zIiwiY29tYmluZUluc3RhbGxtZW50cyIsImFjY291bnROdW1iZXIiLCJKU09OIiwic3RyaW5naWZ5Iiwic3VjY2VzcyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy92aXNhLWNhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIEZyYW1lLCB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7XG4gIGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgcGFnZUV2YWwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgZmV0Y2hQb3N0V2l0aGluUGFnZSB9IGZyb20gJy4uL2hlbHBlcnMvZmV0Y2gnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVybCwgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgZ2V0RnJvbVNlc3Npb25TdG9yYWdlIH0gZnJvbSAnLi4vaGVscGVycy9zdG9yYWdlJztcbmltcG9ydCB7IGZpbHRlck9sZFRyYW5zYWN0aW9ucyB9IGZyb20gJy4uL2hlbHBlcnMvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IHdhaXRVbnRpbCB9IGZyb20gJy4uL2hlbHBlcnMvd2FpdGluZyc7XG5pbXBvcnQge1xuICBUcmFuc2FjdGlvblN0YXR1c2VzLFxuICBUcmFuc2FjdGlvblR5cGVzLFxuICB0eXBlIFRyYW5zYWN0aW9uLFxuICB0eXBlIFRyYW5zYWN0aW9uc0FjY291bnQsXG59IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgTG9naW5PcHRpb25zIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcbmltcG9ydCB7IHR5cGUgU2NyYXBlclNjcmFwaW5nUmVzdWx0IH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly93d3cuY2FsLW9ubGluZS5jby5pbC8nO1xuY29uc3QgVFJBTlNBQ1RJT05TX1JFUVVFU1RfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcGkuY2FsLW9ubGluZS5jby5pbC9UcmFuc2FjdGlvbnMvYXBpL3RyYW5zYWN0aW9uc0RldGFpbHMvZ2V0Q2FyZFRyYW5zYWN0aW9uc0RldGFpbHMnO1xuY29uc3QgUEVORElOR19UUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCA9ICdodHRwczovL2FwaS5jYWwtb25saW5lLmNvLmlsL1RyYW5zYWN0aW9ucy9hcGkvYXBwcm92YWxzL2dldENsZWFyYW5jZVJlcXVlc3RzJztcblxuY29uc3QgSW52YWxpZFBhc3N3b3JkTWVzc2FnZSA9ICfXqdedINeU157Xqdeq157XqSDXkNeVINeU16HXmdeh157XlCDXqdeU15XXlteg15Ug16nXkteV15nXmdedJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygndmlzYS1jYWwnKTtcblxuZW51bSBUcm5UeXBlQ29kZSB7XG4gIHJlZ3VsYXIgPSAnNScsXG4gIGNyZWRpdCA9ICc2JyxcbiAgaW5zdGFsbG1lbnRzID0gJzgnLFxuICBzdGFuZGluZ09yZGVyID0gJzknLFxufVxuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgYW10QmVmb3JlQ29udkFuZEluZGV4OiBudW1iZXI7XG4gIGJyYW5jaENvZGVEZXNjOiBzdHJpbmc7XG4gIGNhc2hBY2NNYW5hZ2VyTmFtZTogbnVsbDtcbiAgY2FzaEFjY291bnRNYW5hZ2VyOiBudWxsO1xuICBjYXNoQWNjb3VudFRybkFtdDogbnVtYmVyO1xuICBjaGFyZ2VFeHRlcm5hbFRvQ2FyZENvbW1lbnQ6IHN0cmluZztcbiAgY29tbWVudHM6IFtdO1xuICBjdXJQYXltZW50TnVtOiBudW1iZXI7XG4gIGRlYkNyZEN1cnJlbmN5U3ltYm9sOiBDdXJyZW5jeVN5bWJvbDtcbiAgZGViQ3JkRGF0ZTogc3RyaW5nO1xuICBkZWJpdFNwcmVhZEluZDogYm9vbGVhbjtcbiAgZGlzY291bnRBbW91bnQ6IHVua25vd247XG4gIGRpc2NvdW50UmVhc29uOiB1bmtub3duO1xuICBpbW1lZGlhdGVDb21tZW50czogW107XG4gIGlzSW1tZWRpYXRlQ29tbWVudEluZDogYm9vbGVhbjtcbiAgaXNJbW1lZGlhdGVISEtJbmQ6IGJvb2xlYW47XG4gIGlzTWFyZ2FyaXRhOiBib29sZWFuO1xuICBpc1NwcmVhZFBheW1lbnN0QWJyb2FkOiBib29sZWFuO1xuICBsaW5rZWRDb21tZW50czogW107XG4gIG1lcmNoYW50QWRkcmVzczogc3RyaW5nO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgbWVyY2hhbnRQaG9uZU5vOiBzdHJpbmc7XG4gIG51bU9mUGF5bWVudHM6IG51bWJlcjtcbiAgb25Hb2luZ1RyYW5zYWN0aW9uc0NvbW1lbnQ6IHN0cmluZztcbiAgcmVmdW5kSW5kOiBib29sZWFuO1xuICByb3VuZGluZ0Ftb3VudDogdW5rbm93bjtcbiAgcm91bmRpbmdSZWFzb246IHVua25vd247XG4gIHRva2VuSW5kOiAwO1xuICB0b2tlbk51bWJlclBhcnQ0OiAnJztcbiAgdHJhbnNDYXJkUHJlc2VudEluZDogYm9vbGVhbjtcbiAgdHJhbnNUeXBlQ29tbWVudERldGFpbHM6IFtdO1xuICB0cm5BbXQ6IG51bWJlcjtcbiAgdHJuQ3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICB0cm5FeGFjV2F5OiBudW1iZXI7XG4gIHRybkludElkOiBzdHJpbmc7XG4gIHRybk51bWFyZXRvcjogbnVtYmVyO1xuICB0cm5QdXJjaGFzZURhdGU6IHN0cmluZztcbiAgdHJuVHlwZTogc3RyaW5nO1xuICB0cm5UeXBlQ29kZTogVHJuVHlwZUNvZGU7XG4gIHdhbGxldFByb3ZpZGVyQ29kZTogMDtcbiAgd2FsbGV0UHJvdmlkZXJEZXNjOiAnJztcbiAgZWFybHlQYXltZW50SW5kOiBib29sZWFuO1xufVxuaW50ZXJmYWNlIFNjcmFwZWRQZW5kaW5nVHJhbnNhY3Rpb24ge1xuICBtZXJjaGFudElEOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICB0cm5QdXJjaGFzZURhdGU6IHN0cmluZztcbiAgd2FsbGV0VHJhbkluZDogbnVtYmVyO1xuICB0cmFuc2FjdGlvbnNPcmlnaW46IG51bWJlcjtcbiAgdHJuQW10OiBudW1iZXI7XG4gIHRwYUFwcHJvdmFsQW1vdW50OiB1bmtub3duO1xuICB0cm5DdXJyZW5jeVN5bWJvbDogQ3VycmVuY3lTeW1ib2w7XG4gIHRyblR5cGVDb2RlOiBUcm5UeXBlQ29kZTtcbiAgdHJuVHlwZTogc3RyaW5nO1xuICBicmFuY2hDb2RlRGVzYzogc3RyaW5nO1xuICB0cmFuc0NhcmRQcmVzZW50SW5kOiBib29sZWFuO1xuICBqNUluZGljYXRvcjogc3RyaW5nO1xuICBudW1iZXJPZlBheW1lbnRzOiBudW1iZXI7XG4gIGZpcnN0UGF5bWVudEFtb3VudDogbnVtYmVyO1xuICB0cmFuc1R5cGVDb21tZW50RGV0YWlsczogW107XG5cbn1cbmludGVyZmFjZSBJbml0UmVzcG9uc2Uge1xuICByZXN1bHQ6IHtcbiAgICBjYXJkczoge1xuICAgICAgY2FyZFVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgICBsYXN0NERpZ2l0czogc3RyaW5nO1xuICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICB9W107XG4gIH07XG59XG50eXBlIEN1cnJlbmN5U3ltYm9sID0gc3RyaW5nO1xuaW50ZXJmYWNlIENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvciB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgYmFua0FjY291bnRzOiB7XG4gICAgICBiYW5rQWNjb3VudE51bTogc3RyaW5nO1xuICAgICAgYmFua05hbWU6IHN0cmluZztcbiAgICAgIGNob2ljZUV4dGVybmFsVHJhbnNhY3Rpb25zOiBhbnk7XG4gICAgICBjdXJyZW50QmFua0FjY291bnRJbmQ6IGJvb2xlYW47XG4gICAgICBkZWJpdERhdGVzOiB7XG4gICAgICAgIGJhc2tldEFtb3VudENvbW1lbnQ6IHVua25vd247XG4gICAgICAgIGNob2ljZUhIS0RlYml0OiBudW1iZXI7XG4gICAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgICAgZGViaXRSZWFzb246IHVua25vd247XG4gICAgICAgIGZpeERlYml0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIGZyb21QdXJjaGFzZURhdGU6IHN0cmluZztcbiAgICAgICAgaXNDaG9pY2VSZXBhaW1lbnQ6IGJvb2xlYW47XG4gICAgICAgIHRvUHVyY2hhc2VEYXRlOiBzdHJpbmc7XG4gICAgICAgIHRvdGFsQmFza2V0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIHRvdGFsRGViaXRzOiB7XG4gICAgICAgICAgY3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICAgICAgICAgIGFtb3VudDogbnVtYmVyO1xuICAgICAgICB9W107XG4gICAgICAgIHRyYW5zYWN0aW9uczogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gICAgICB9W107XG4gICAgICBpbW1pZGlhdGVEZWJpdHM6IHsgdG90YWxEZWJpdHM6IFtdLCBkZWJpdERheXM6IFtdIH07XG4gICAgfVtdO1xuICAgIGJsb2NrZWRDYXJkSW5kOiBib29sZWFuO1xuICB9O1xuICBzdGF0dXNDb2RlOiAxO1xuICBzdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXNUaXRsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgY2FyZHNMaXN0OiB7XG4gICAgICBjYXJkVW5pcXVlSUQ6IHN0cmluZztcbiAgICAgIGF1dGhEZXRhbGlzTGlzdDogU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbltdO1xuICAgIH1bXTtcbiAgfTtcbiAgc3RhdHVzQ29kZTogMTtcbiAgc3RhdHVzRGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzVGl0bGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNQZW5kaW5nKHRyYW5zYWN0aW9uOiBTY3JhcGVkVHJhbnNhY3Rpb24gfCBTY3JhcGVkUGVuZGluZ1RyYW5zYWN0aW9uKTogdHJhbnNhY3Rpb24gaXMgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbiB7XG4gIHJldHVybiAodHJhbnNhY3Rpb24gYXMgU2NyYXBlZFRyYW5zYWN0aW9uKS5kZWJDcmREYXRlID09PSB1bmRlZmluZWQ7IC8vIGFuIGFyYml0cmFyeSBmaWVsZCB0aGF0IG9ubHkgYXBwZWFycyBpbiBhIGNvbXBsZXRlZCB0cmFuc2FjdGlvblxufVxuXG5mdW5jdGlvbiBpc0NhcmRUcmFuc2FjdGlvbkRldGFpbHMocmVzdWx0OiBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yKTpcbnJlc3VsdCBpcyBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzIHtcbiAgcmV0dXJuIChyZXN1bHQgYXMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlscykucmVzdWx0ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMocmVzdWx0OiBDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscyB8IENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvcik6XG5yZXN1bHQgaXMgQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMge1xuICByZXR1cm4gKHJlc3VsdCBhcyBDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscykucmVzdWx0ICE9PSB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExvZ2luRnJhbWUocGFnZTogUGFnZSkge1xuICBsZXQgZnJhbWU6IEZyYW1lIHwgbnVsbCA9IG51bGw7XG4gIGRlYnVnKCd3YWl0IHVudGlsIGxvZ2luIGZyYW1lIGZvdW5kJyk7XG4gIGF3YWl0IHdhaXRVbnRpbCgoKSA9PiB7XG4gICAgZnJhbWUgPSBwYWdlXG4gICAgICAuZnJhbWVzKClcbiAgICAgIC5maW5kKChmKSA9PiBmLnVybCgpLmluY2x1ZGVzKCdjb25uZWN0JykpIHx8IG51bGw7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSghIWZyYW1lKTtcbiAgfSwgJ3dhaXQgZm9yIGlmcmFtZSB3aXRoIGxvZ2luIGZvcm0nLCAxMDAwMCwgMTAwMCk7XG5cbiAgaWYgKCFmcmFtZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gZmluZCBsb2dpbiBmcmFtZSBmb3IgMTAgc2Vjb25kcycpO1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGV4dHJhY3QgbG9naW4gaWZyYW1lJyk7XG4gIH1cblxuICByZXR1cm4gZnJhbWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0ludmFsaWRQYXNzd29yZEVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICdkaXYuZ2VuZXJhbC1lcnJvciA+IGRpdicpO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckZvdW5kID8gYXdhaXQgcGFnZUV2YWwoZnJhbWUsICdkaXYuZ2VuZXJhbC1lcnJvciA+IGRpdicsICcnLCAoaXRlbSkgPT4ge1xuICAgIHJldHVybiAoaXRlbSBhcyBIVE1MRGl2RWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KSA6ICcnO1xuICByZXR1cm4gZXJyb3JNZXNzYWdlID09PSBJbnZhbGlkUGFzc3dvcmRNZXNzYWdlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNDaGFuZ2VQYXNzd29yZEZvcm0ocGFnZTogUGFnZSkge1xuICBjb25zdCBmcmFtZSA9IGF3YWl0IGdldExvZ2luRnJhbWUocGFnZSk7XG4gIGNvbnN0IGVycm9yRm91bmQgPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShmcmFtZSwgJy5jaGFuZ2UtcGFzc3dvcmQtc3VidGl0bGUnKTtcbiAgcmV0dXJuIGVycm9yRm91bmQ7XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCkge1xuICBkZWJ1ZygncmV0dXJuIHBvc3NpYmxlIGxvZ2luIHJlc3VsdHMnKTtcbiAgY29uc3QgdXJsczogTG9naW5PcHRpb25zWydwb3NzaWJsZVJlc3VsdHMnXSA9IHtcbiAgICBbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdOiBbL2Rhc2hib2FyZC9pXSxcbiAgICBbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF06IFthc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2U7XG4gICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0ludmFsaWRQYXNzd29yZEVycm9yKHBhZ2UpO1xuICAgIH1dLFxuICAgIC8vIFtMb2dpblJlc3VsdHMuQWNjb3VudEJsb2NrZWRdOiBbXSwgLy8gVE9ETyBhZGQgd2hlbiByZWFjaGluZyB0aGlzIHNjZW5hcmlvXG4gICAgW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF06IFthc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2U7XG4gICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0NoYW5nZVBhc3N3b3JkRm9ybShwYWdlKTtcbiAgICB9XSxcbiAgfTtcbiAgcmV0dXJuIHVybHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICBkZWJ1ZygnY3JlYXRlIGxvZ2luIGZpZWxkcyBmb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkJyk7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJ1tmb3JtY29udHJvbG5hbWU9XCJ1c2VyTmFtZVwiXScsIHZhbHVlOiBjcmVkZW50aWFscy51c2VybmFtZSB9LFxuICAgIHsgc2VsZWN0b3I6ICdbZm9ybWNvbnRyb2xuYW1lPVwicGFzc3dvcmRcIl0nLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBhcnNlZERhdGFUb1RyYW5zYWN0aW9ucyhkYXRhOiBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzW10sIHBlbmRpbmdEYXRhPzogQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMgfCBudWxsKTogVHJhbnNhY3Rpb25bXSB7XG4gIGNvbnN0IHBlbmRpbmdUcmFuc2FjdGlvbnMgPSBwZW5kaW5nRGF0YT8ucmVzdWx0ID9cbiAgICBwZW5kaW5nRGF0YS5yZXN1bHQuY2FyZHNMaXN0LmZsYXRNYXAoKGNhcmQpID0+IGNhcmQuYXV0aERldGFsaXNMaXN0KSA6XG4gICAgW107XG5cbiAgY29uc3QgYmFua0FjY291bnRzID0gZGF0YVxuICAgIC5mbGF0TWFwKChtb250aERhdGEpID0+IG1vbnRoRGF0YS5yZXN1bHQuYmFua0FjY291bnRzKTtcbiAgY29uc3QgcmVndWxhckRlYml0RGF5cyA9IGJhbmtBY2NvdW50c1xuICAgIC5mbGF0TWFwKChhY2NvdW50cykgPT4gYWNjb3VudHMuZGViaXREYXRlcyk7XG4gIGNvbnN0IGltbWVkaWF0ZURlYml0RGF5cyA9IGJhbmtBY2NvdW50c1xuICAgIC5mbGF0TWFwKChhY2NvdW50cykgPT4gYWNjb3VudHMuaW1taWRpYXRlRGViaXRzLmRlYml0RGF5cyk7XG4gIGNvbnN0IGNvbXBsZXRlZFRyYW5zYWN0aW9ucyA9IFsuLi5yZWd1bGFyRGViaXREYXlzLCAuLi5pbW1lZGlhdGVEZWJpdERheXNdXG4gICAgLmZsYXRNYXAoKGRlYml0RGF0ZSkgPT4gZGViaXREYXRlLnRyYW5zYWN0aW9ucyk7XG5cbiAgY29uc3QgYWxsOiAoU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbilbXSA9IFsuLi5wZW5kaW5nVHJhbnNhY3Rpb25zLCAuLi5jb21wbGV0ZWRUcmFuc2FjdGlvbnNdO1xuXG4gIHJldHVybiBhbGwubWFwKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgIGNvbnN0IG51bU9mUGF5bWVudHMgPSBpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gdHJhbnNhY3Rpb24ubnVtYmVyT2ZQYXltZW50cyA6IHRyYW5zYWN0aW9uLm51bU9mUGF5bWVudHM7XG4gICAgY29uc3QgaW5zdGFsbG1lbnRzID0gbnVtT2ZQYXltZW50cyA/XG4gICAgICB7XG4gICAgICAgIG51bWJlcjogaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IDEgOiB0cmFuc2FjdGlvbi5jdXJQYXltZW50TnVtLFxuICAgICAgICB0b3RhbDogbnVtT2ZQYXltZW50cyxcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCh0cmFuc2FjdGlvbi50cm5QdXJjaGFzZURhdGUpO1xuXG4gICAgbGV0IGNoYXJnZWRBbW91bnQgPSBpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gdHJhbnNhY3Rpb24udHJuQW10ICogKC0xKSA6IHRyYW5zYWN0aW9uLmFtdEJlZm9yZUNvbnZBbmRJbmRleCAqICgtMSk7XG4gICAgbGV0IG9yaWdpbmFsQW1vdW50ID0gdHJhbnNhY3Rpb24udHJuQW10ICogKC0xKTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi50cm5UeXBlQ29kZSA9PT0gVHJuVHlwZUNvZGUuY3JlZGl0KSB7XG4gICAgICBjaGFyZ2VkQW1vdW50ID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLnRybkFtdCA6IHRyYW5zYWN0aW9uLmFtdEJlZm9yZUNvbnZBbmRJbmRleDtcbiAgICAgIG9yaWdpbmFsQW1vdW50ID0gdHJhbnNhY3Rpb24udHJuQW10O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICBpZGVudGlmaWVyOiAhaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLnRybkludElkIDogdW5kZWZpbmVkLFxuICAgICAgdHlwZTogW1RyblR5cGVDb2RlLnJlZ3VsYXIsIFRyblR5cGVDb2RlLnN0YW5kaW5nT3JkZXJdLmluY2x1ZGVzKHRyYW5zYWN0aW9uLnRyblR5cGVDb2RlKSA/XG4gICAgICAgIFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsIDpcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlcy5JbnN0YWxsbWVudHMsXG4gICAgICBzdGF0dXM6IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyBUcmFuc2FjdGlvblN0YXR1c2VzLlBlbmRpbmcgOiBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICAgIGRhdGU6IGluc3RhbGxtZW50cyA/XG4gICAgICAgIGRhdGUuYWRkKGluc3RhbGxtZW50cy5udW1iZXIgLSAxLCAnbW9udGgnKS50b0lTT1N0cmluZygpIDpcbiAgICAgICAgZGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG5ldyBEYXRlKHRyYW5zYWN0aW9uLmRlYkNyZERhdGUpLnRvSVNPU3RyaW5nKCksXG4gICAgICBvcmlnaW5hbEFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IHRyYW5zYWN0aW9uLnRybkN1cnJlbmN5U3ltYm9sLFxuICAgICAgY2hhcmdlZEFtb3VudCxcbiAgICAgIGNoYXJnZWRDdXJyZW5jeTogIWlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi5kZWJDcmRDdXJyZW5jeVN5bWJvbCA6IHVuZGVmaW5lZCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0cmFuc2FjdGlvbi5tZXJjaGFudE5hbWUsXG4gICAgICBtZW1vOiB0cmFuc2FjdGlvbi50cmFuc1R5cGVDb21tZW50RGV0YWlscy50b1N0cmluZygpLFxuICAgICAgY2F0ZWdvcnk6IHRyYW5zYWN0aW9uLmJyYW5jaENvZGVEZXNjLFxuICAgIH07XG5cbiAgICBpZiAoaW5zdGFsbG1lbnRzKSB7XG4gICAgICByZXN1bHQuaW5zdGFsbG1lbnRzID0gaW5zdGFsbG1lbnRzO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIFZpc2FDYWxTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBvcGVuTG9naW5Qb3B1cCA9IGFzeW5jICgpID0+IHtcbiAgICBkZWJ1Zygnb3BlbiBsb2dpbiBwb3B1cCwgd2FpdCB1bnRpbCBsb2dpbiBidXR0b24gYXZhaWxhYmxlJyk7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicsIHRydWUpO1xuICAgIGRlYnVnKCdjbGljayBvbiB0aGUgbG9naW4gYnV0dG9uJyk7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCAnI2NjTG9naW5EZXNrdG9wQnRuJyk7XG4gICAgZGVidWcoJ2dldCB0aGUgZnJhbWUgdGhhdCBob2xkcyB0aGUgbG9naW4nKTtcbiAgICBjb25zdCBmcmFtZSA9IGF3YWl0IGdldExvZ2luRnJhbWUodGhpcy5wYWdlKTtcbiAgICBkZWJ1Zygnd2FpdCB1bnRpbCB0aGUgcGFzc3dvcmQgbG9naW4gdGFiIGhlYWRlciBpcyBhdmFpbGFibGUnKTtcbiAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQoZnJhbWUsICcjcmVndWxhci1sb2dpbicpO1xuICAgIGRlYnVnKCduYXZpZ2F0ZSB0byB0aGUgcGFzc3dvcmQgbG9naW4gdGFiJyk7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24oZnJhbWUsICcjcmVndWxhci1sb2dpbicpO1xuICAgIGRlYnVnKCd3YWl0IHVudGlsIHRoZSBwYXNzd29yZCBsb2dpbiB0YWIgaXMgYWN0aXZlJyk7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKGZyYW1lLCAncmVndWxhci1sb2dpbicpO1xuXG4gICAgcmV0dXJuIGZyYW1lO1xuICB9O1xuXG4gIGFzeW5jIGdldENhcmRzKCkge1xuICAgIGNvbnN0IGluaXREYXRhID0gYXdhaXQgd2FpdFVudGlsKFxuICAgICAgKCkgPT4gZ2V0RnJvbVNlc3Npb25TdG9yYWdlPEluaXRSZXNwb25zZT4odGhpcy5wYWdlLCAnaW5pdCcpLFxuICAgICAgJ2dldCBpbml0IGRhdGEgaW4gc2Vzc2lvbiBzdG9yYWdlJyxcbiAgICAgIDEwMDAwLFxuICAgICAgMTAwMCxcbiAgICApO1xuICAgIGlmICghaW5pdERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgXFwnaW5pdFxcJyBkYXRhIGluIHNlc3Npb24gc3RvcmFnZScpO1xuICAgIH1cbiAgICByZXR1cm4gaW5pdERhdGE/LnJlc3VsdC5jYXJkcy5tYXAoKHsgY2FyZFVuaXF1ZUlkLCBsYXN0NERpZ2l0cyB9KSA9PiAoeyBjYXJkVW5pcXVlSWQsIGxhc3Q0RGlnaXRzIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGdldEF1dGhvcml6YXRpb25IZWFkZXIoKSB7XG4gICAgY29uc3QgYXV0aE1vZHVsZSA9IGF3YWl0IGdldEZyb21TZXNzaW9uU3RvcmFnZTx7IGF1dGg6IHsgY2FsQ29ubmVjdFRva2VuOiBzdHJpbmcgfSB9Pih0aGlzLnBhZ2UsICdhdXRoLW1vZHVsZScpO1xuICAgIGlmICghYXV0aE1vZHVsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCBcXCdhdXRoLW1vZHVsZVxcJyBpbiBzZXNzaW9uIHN0b3JhZ2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIGBDQUxBdXRoU2NoZW1lICR7YXV0aE1vZHVsZS5hdXRoLmNhbENvbm5lY3RUb2tlbn1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0WFNpdGVJZCgpIHtcbiAgICAvKlxuICAgICAgSSBkb24ndCBrbm93IGlmIHRoZSBjb25zdGFudCBiZWxvdyB3aWxsIGNoYW5nZSBpbiB0aGUgZmVhdHVyZS5cbiAgICAgIElmIHNvLCB1c2UgdGhlIG5leHQgY29kZTpcblxuICAgICAgcmV0dXJuIHRoaXMucGFnZS5ldmFsdWF0ZSgoKSA9PiBuZXcgVXQoKS54U2l0ZUlkKTtcblxuICAgICAgVG8gZ2V0IHRoZSBjbGFzc25hbWUgc2VhcmNoIGZvciAneFNpdGVJZCcgaW4gdGhlIHBhZ2Ugc291cmNlXG4gICAgICBjbGFzcyBVdCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF9lLCBvbiwgeW4pIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBfZSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gb24sXG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzU2VydmljZSA9IHluLFxuICAgICAgICAgICAgdGhpcy54U2l0ZUlkID0gXCIwOTAzMTk4Ny0yNzNFLTIzMTEtOTA2Qy04QUY4NUIxN0M4RDlcIixcbiAgICAqL1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJzA5MDMxOTg3LTI3M0UtMjMxMS05MDZDLThBRjg1QjE3QzhEOScpO1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyk6IExvZ2luT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtMT0dJTl9VUkx9YCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScsXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4gd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpLFxuICAgICAgcHJlQWN0aW9uOiB0aGlzLm9wZW5Mb2dpblBvcHVwLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnc2l0ZS10dXRvcmlhbCcpKSB7XG4gICAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICdidXR0b24uYnRuLWNsb3NlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnZGFzaGJvYXJkJykpIHJldHVybjtcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0NoYW5nZVBhc3N3b3JkID0gYXdhaXQgaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHRoaXMucGFnZSk7XG4gICAgICAgICAgaWYgKHJlcXVpcmVzQ2hhbmdlUGFzc3dvcmQpIHJldHVybjtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzguMC4zOTA0LjEwOCBTYWZhcmkvNTM3LjM2JyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuc3VidHJhY3QoNiwgJ21vbnRocycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuICAgIGRlYnVnKGBmZXRjaCB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgJHtzdGFydE1vbWVudC5mb3JtYXQoKX1gKTtcblxuICAgIGNvbnN0IEF1dGhvcml6YXRpb24gPSBhd2FpdCB0aGlzLmdldEF1dGhvcml6YXRpb25IZWFkZXIoKTtcbiAgICBjb25zdCBjYXJkcyA9IGF3YWl0IHRoaXMuZ2V0Q2FyZHMoKTtcbiAgICBjb25zdCB4U2l0ZUlkID0gYXdhaXQgdGhpcy5nZXRYU2l0ZUlkKCk7XG4gICAgY29uc3QgZnV0dXJlTW9udGhzVG9TY3JhcGUgPSB0aGlzLm9wdGlvbnMuZnV0dXJlTW9udGhzVG9TY3JhcGUgPz8gMTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjYXJkcy5tYXAoYXN5bmMgKGNhcmQpID0+IHtcbiAgICAgICAgY29uc3QgZmluYWxNb250aFRvRmV0Y2hNb21lbnQgPSBtb21lbnQoKS5hZGQoZnV0dXJlTW9udGhzVG9TY3JhcGUsICdtb250aCcpO1xuICAgICAgICBjb25zdCBtb250aHMgPSBmaW5hbE1vbnRoVG9GZXRjaE1vbWVudC5kaWZmKHN0YXJ0TW9tZW50LCAnbW9udGhzJyk7XG5cbiAgICAgICAgY29uc3QgYWxsTW9udGhzRGF0YTogKENhcmRUcmFuc2FjdGlvbkRldGFpbHMpW10gPSBbXTtcblxuICAgICAgICBkZWJ1ZyhgZmV0Y2ggcGVuZGluZyB0cmFuc2FjdGlvbnMgZm9yIGNhcmQgJHtjYXJkLmNhcmRVbmlxdWVJZH1gKTtcbiAgICAgICAgbGV0IHBlbmRpbmdEYXRhID0gYXdhaXQgZmV0Y2hQb3N0V2l0aGluUGFnZTxDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscyB8IENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvcj4oXG4gICAgICAgICAgdGhpcy5wYWdlLCBQRU5ESU5HX1RSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5ULFxuICAgICAgICAgIHsgY2FyZFVuaXF1ZUlEQXJyYXk6IFtjYXJkLmNhcmRVbmlxdWVJZF0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uLFxuICAgICAgICAgICAgJ1gtU2l0ZS1JZCc6IHhTaXRlSWQsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZGVidWcoYGZldGNoIGNvbXBsZXRlZCB0cmFuc2FjdGlvbnMgZm9yIGNhcmQgJHtjYXJkLmNhcmRVbmlxdWVJZH1gKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbW9udGhzOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBtb250aCA9IGZpbmFsTW9udGhUb0ZldGNoTW9tZW50LmNsb25lKCkuc3VidHJhY3QoaSwgJ21vbnRocycpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoRGF0YSA9IGF3YWl0IGZldGNoUG9zdFdpdGhpblBhZ2U8Q2FyZFRyYW5zYWN0aW9uRGV0YWlscyB8IENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvcj4oXG4gICAgICAgICAgICB0aGlzLnBhZ2UsIFRSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5ULFxuICAgICAgICAgICAgeyBjYXJkVW5pcXVlSWQ6IGNhcmQuY2FyZFVuaXF1ZUlkLCBtb250aDogbW9udGguZm9ybWF0KCdNJyksIHllYXI6IG1vbnRoLmZvcm1hdCgnWVlZWScpIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb24sXG4gICAgICAgICAgICAgICdYLVNpdGUtSWQnOiB4U2l0ZUlkLFxuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG1vbnRoRGF0YT8uc3RhdHVzQ29kZSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5sYXN0NERpZ2l0c30uIE1lc3NhZ2U6ICR7bW9udGhEYXRhPy50aXRsZSB8fCAnJ31gKTtcblxuICAgICAgICAgIGlmICghaXNDYXJkVHJhbnNhY3Rpb25EZXRhaWxzKG1vbnRoRGF0YSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbW9udGhEYXRhIGlzIG5vdCBvZiB0eXBlIENhcmRUcmFuc2FjdGlvbkRldGFpbHMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhbGxNb250aHNEYXRhLnB1c2gobW9udGhEYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZW5kaW5nRGF0YT8uc3RhdHVzQ29kZSAhPT0gMSAmJiBwZW5kaW5nRGF0YT8uc3RhdHVzQ29kZSAhPT0gOTYpIHtcbiAgICAgICAgICBkZWJ1ZyhgZmFpbGVkIHRvIGZldGNoIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5sYXN0NERpZ2l0c30uIE1lc3NhZ2U6ICR7cGVuZGluZ0RhdGE/LnRpdGxlIHx8ICcnfWApO1xuICAgICAgICAgIHBlbmRpbmdEYXRhID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscyhwZW5kaW5nRGF0YSkpIHtcbiAgICAgICAgICBkZWJ1ZygncGVuZGluZ0RhdGEgaXMgbm90IG9mIHR5cGUgQ2FyZFRyYW5zYWN0aW9uRGV0YWlscycpO1xuICAgICAgICAgIHBlbmRpbmdEYXRhID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGNvbnZlcnRQYXJzZWREYXRhVG9UcmFuc2FjdGlvbnMoYWxsTW9udGhzRGF0YSwgcGVuZGluZ0RhdGEpO1xuXG4gICAgICAgIGRlYnVnKCdmaWxlciBvdXQgb2xkIHRyYW5zYWN0aW9ucycpO1xuICAgICAgICBjb25zdCB0eG5zID0gKHRoaXMub3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSkgP1xuICAgICAgICAgIGZpbHRlck9sZFRyYW5zYWN0aW9ucyh0cmFuc2FjdGlvbnMsIG1vbWVudChzdGFydERhdGUpLCB0aGlzLm9wdGlvbnMuY29tYmluZUluc3RhbGxtZW50cyB8fCBmYWxzZSkgOlxuICAgICAgICAgIHRyYW5zYWN0aW9ucztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR4bnMsXG4gICAgICAgICAgYWNjb3VudE51bWJlcjogY2FyZC5sYXN0NERpZ2l0cyxcbiAgICAgICAgfSBhcyBUcmFuc2FjdGlvbnNBY2NvdW50O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGRlYnVnKCdyZXR1cm4gdGhlIHNjcmFwZWQgYWNjb3VudHMnKTtcblxuICAgIGRlYnVnKEpTT04uc3RyaW5naWZ5KGFjY291bnRzLCBudWxsLCAyKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpc2FDYWxTY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUscUJBQUEsR0FBQUYsT0FBQTtBQUdBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGNBQUEsR0FBQVIsT0FBQTtBQU1BLElBQUFTLHVCQUFBLEdBQUFULE9BQUE7QUFBc0csU0FBQUQsdUJBQUFXLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxnQkFBQUgsQ0FBQSxFQUFBSSxDQUFBLEVBQUFDLENBQUEsWUFBQUQsQ0FBQSxHQUFBRSxjQUFBLENBQUFGLENBQUEsTUFBQUosQ0FBQSxHQUFBTyxNQUFBLENBQUFDLGNBQUEsQ0FBQVIsQ0FBQSxFQUFBSSxDQUFBLElBQUFLLEtBQUEsRUFB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
|
|
280
|
+
exports.default = VisaCalScraper;
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzYS1jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvdmlzYS1jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsNENBQTRDO0FBQzVDLDRFQUFzSDtBQUN0SCw0Q0FBdUQ7QUFDdkQsc0RBQXlFO0FBQ3pFLGdEQUEyRDtBQUMzRCwwREFBZ0U7QUFDaEUsZ0RBQStDO0FBQy9DLGtEQUFvSDtBQUNwSCwyRUFBc0c7QUFHdEcsTUFBTSxTQUFTLEdBQUcsK0JBQStCLENBQUM7QUFDbEQsTUFBTSw2QkFBNkIsR0FDakMsOEZBQThGLENBQUM7QUFDakcsTUFBTSxxQ0FBcUMsR0FDekMsOEVBQThFLENBQUM7QUFFakYsTUFBTSxzQkFBc0IsR0FBRyxtQ0FBbUMsQ0FBQztBQUVuRSxNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFRLEVBQUMsVUFBVSxDQUFDLENBQUM7QUFFbkMsSUFBSyxXQUtKO0FBTEQsV0FBSyxXQUFXO0lBQ2QsNEJBQWEsQ0FBQTtJQUNiLDJCQUFZLENBQUE7SUFDWixpQ0FBa0IsQ0FBQTtJQUNsQixrQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTEksV0FBVyxLQUFYLFdBQVcsUUFLZjtBQXlIRCxTQUFTLFNBQVMsQ0FDaEIsV0FBMkQ7SUFFM0QsT0FBUSxXQUFrQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxrRUFBa0U7QUFDekksQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQy9CLE1BQTREO0lBRTVELE9BQVEsTUFBaUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUN0QyxNQUFtRTtJQUVuRSxPQUFRLE1BQXdDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUFVO0lBQ3JDLElBQUksS0FBSyxHQUFpQixJQUFJLENBQUM7SUFD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cUIsRUFBQyxZQUFZLEVBQUUsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDO2dCQUNuRyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBRW5CLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDVCxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUVyQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxrQkFBZSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIEZyYW1lLCB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgcGFnZUV2YWwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGZldGNoUG9zdFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGdldEZyb21TZXNzaW9uU3RvcmFnZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XG5pbXBvcnQgeyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBMb2dpbk9wdGlvbnMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyU2NyYXBpbmdSZXN1bHQgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5jYWwtb25saW5lLmNvLmlsLyc7XG5jb25zdCBUUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCA9XG4gICdodHRwczovL2FwaS5jYWwtb25saW5lLmNvLmlsL1RyYW5zYWN0aW9ucy9hcGkvdHJhbnNhY3Rpb25zRGV0YWlscy9nZXRDYXJkVHJhbnNhY3Rpb25zRGV0YWlscyc7XG5jb25zdCBQRU5ESU5HX1RSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5UID1cbiAgJ2h0dHBzOi8vYXBpLmNhbC1vbmxpbmUuY28uaWwvVHJhbnNhY3Rpb25zL2FwaS9hcHByb3ZhbHMvZ2V0Q2xlYXJhbmNlUmVxdWVzdHMnO1xuXG5jb25zdCBJbnZhbGlkUGFzc3dvcmRNZXNzYWdlID0gJ9ep150g15TXntep16rXntepINeQ15Ug15TXodeZ16HXnteUINep15TXldeW16DXlSDXqdeS15XXmdeZ150nO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCd2aXNhLWNhbCcpO1xuXG5lbnVtIFRyblR5cGVDb2RlIHtcbiAgcmVndWxhciA9ICc1JyxcbiAgY3JlZGl0ID0gJzYnLFxuICBpbnN0YWxsbWVudHMgPSAnOCcsXG4gIHN0YW5kaW5nT3JkZXIgPSAnOScsXG59XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBhbXRCZWZvcmVDb252QW5kSW5kZXg6IG51bWJlcjtcbiAgYnJhbmNoQ29kZURlc2M6IHN0cmluZztcbiAgY2FzaEFjY01hbmFnZXJOYW1lOiBudWxsO1xuICBjYXNoQWNjb3VudE1hbmFnZXI6IG51bGw7XG4gIGNhc2hBY2NvdW50VHJuQW10OiBudW1iZXI7XG4gIGNoYXJnZUV4dGVybmFsVG9DYXJkQ29tbWVudDogc3RyaW5nO1xuICBjb21tZW50czogW107XG4gIGN1clBheW1lbnROdW06IG51bWJlcjtcbiAgZGViQ3JkQ3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICBkZWJDcmREYXRlOiBzdHJpbmc7XG4gIGRlYml0U3ByZWFkSW5kOiBib29sZWFuO1xuICBkaXNjb3VudEFtb3VudDogdW5rbm93bjtcbiAgZGlzY291bnRSZWFzb246IHVua25vd247XG4gIGltbWVkaWF0ZUNvbW1lbnRzOiBbXTtcbiAgaXNJbW1lZGlhdGVDb21tZW50SW5kOiBib29sZWFuO1xuICBpc0ltbWVkaWF0ZUhIS0luZDogYm9vbGVhbjtcbiAgaXNNYXJnYXJpdGE6IGJvb2xlYW47XG4gIGlzU3ByZWFkUGF5bWVuc3RBYnJvYWQ6IGJvb2xlYW47XG4gIGxpbmtlZENvbW1lbnRzOiBbXTtcbiAgbWVyY2hhbnRBZGRyZXNzOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICBtZXJjaGFudFBob25lTm86IHN0cmluZztcbiAgbnVtT2ZQYXltZW50czogbnVtYmVyO1xuICBvbkdvaW5nVHJhbnNhY3Rpb25zQ29tbWVudDogc3RyaW5nO1xuICByZWZ1bmRJbmQ6IGJvb2xlYW47XG4gIHJvdW5kaW5nQW1vdW50OiB1bmtub3duO1xuICByb3VuZGluZ1JlYXNvbjogdW5rbm93bjtcbiAgdG9rZW5JbmQ6IDA7XG4gIHRva2VuTnVtYmVyUGFydDQ6ICcnO1xuICB0cmFuc0NhcmRQcmVzZW50SW5kOiBib29sZWFuO1xuICB0cmFuc1R5cGVDb21tZW50RGV0YWlsczogW107XG4gIHRybkFtdDogbnVtYmVyO1xuICB0cm5DdXJyZW5jeVN5bWJvbDogQ3VycmVuY3lTeW1ib2w7XG4gIHRybkV4YWNXYXk6IG51bWJlcjtcbiAgdHJuSW50SWQ6IHN0cmluZztcbiAgdHJuTnVtYXJldG9yOiBudW1iZXI7XG4gIHRyblB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICB0cm5UeXBlOiBzdHJpbmc7XG4gIHRyblR5cGVDb2RlOiBUcm5UeXBlQ29kZTtcbiAgd2FsbGV0UHJvdmlkZXJDb2RlOiAwO1xuICB3YWxsZXRQcm92aWRlckRlc2M6ICcnO1xuICBlYXJseVBheW1lbnRJbmQ6IGJvb2xlYW47XG59XG5pbnRlcmZhY2UgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbiB7XG4gIG1lcmNoYW50SUQ6IHN0cmluZztcbiAgbWVyY2hhbnROYW1lOiBzdHJpbmc7XG4gIHRyblB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICB3YWxsZXRUcmFuSW5kOiBudW1iZXI7XG4gIHRyYW5zYWN0aW9uc09yaWdpbjogbnVtYmVyO1xuICB0cm5BbXQ6IG51bWJlcjtcbiAgdHBhQXBwcm92YWxBbW91bnQ6IHVua25vd247XG4gIHRybkN1cnJlbmN5U3ltYm9sOiBDdXJyZW5jeVN5bWJvbDtcbiAgdHJuVHlwZUNvZGU6IFRyblR5cGVDb2RlO1xuICB0cm5UeXBlOiBzdHJpbmc7XG4gIGJyYW5jaENvZGVEZXNjOiBzdHJpbmc7XG4gIHRyYW5zQ2FyZFByZXNlbnRJbmQ6IGJvb2xlYW47XG4gIGo1SW5kaWNhdG9yOiBzdHJpbmc7XG4gIG51bWJlck9mUGF5bWVudHM6IG51bWJlcjtcbiAgZmlyc3RQYXltZW50QW1vdW50OiBudW1iZXI7XG4gIHRyYW5zVHlwZUNvbW1lbnREZXRhaWxzOiBbXTtcbn1cbmludGVyZmFjZSBJbml0UmVzcG9uc2Uge1xuICByZXN1bHQ6IHtcbiAgICBjYXJkczoge1xuICAgICAgY2FyZFVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgICBsYXN0NERpZ2l0czogc3RyaW5nO1xuICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICB9W107XG4gIH07XG59XG50eXBlIEN1cnJlbmN5U3ltYm9sID0gc3RyaW5nO1xuaW50ZXJmYWNlIENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvciB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgYmFua0FjY291bnRzOiB7XG4gICAgICBiYW5rQWNjb3VudE51bTogc3RyaW5nO1xuICAgICAgYmFua05hbWU6IHN0cmluZztcbiAgICAgIGNob2ljZUV4dGVybmFsVHJhbnNhY3Rpb25zOiBhbnk7XG4gICAgICBjdXJyZW50QmFua0FjY291bnRJbmQ6IGJvb2xlYW47XG4gICAgICBkZWJpdERhdGVzOiB7XG4gICAgICAgIGJhc2tldEFtb3VudENvbW1lbnQ6IHVua25vd247XG4gICAgICAgIGNob2ljZUhIS0RlYml0OiBudW1iZXI7XG4gICAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgICAgZGViaXRSZWFzb246IHVua25vd247XG4gICAgICAgIGZpeERlYml0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIGZyb21QdXJjaGFzZURhdGU6IHN0cmluZztcbiAgICAgICAgaXNDaG9pY2VSZXBhaW1lbnQ6IGJvb2xlYW47XG4gICAgICAgIHRvUHVyY2hhc2VEYXRlOiBzdHJpbmc7XG4gICAgICAgIHRvdGFsQmFza2V0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIHRvdGFsRGViaXRzOiB7XG4gICAgICAgICAgY3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICAgICAgICAgIGFtb3VudDogbnVtYmVyO1xuICAgICAgICB9W107XG4gICAgICAgIHRyYW5zYWN0aW9uczogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gICAgICB9W107XG4gICAgICBpbW1pZGlhdGVEZWJpdHM6IHsgdG90YWxEZWJpdHM6IFtdOyBkZWJpdERheXM6IFtdIH07XG4gICAgfVtdO1xuICAgIGJsb2NrZWRDYXJkSW5kOiBib29sZWFuO1xuICB9O1xuICBzdGF0dXNDb2RlOiAxO1xuICBzdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXNUaXRsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgY2FyZHNMaXN0OiB7XG4gICAgICBjYXJkVW5pcXVlSUQ6IHN0cmluZztcbiAgICAgIGF1dGhEZXRhbGlzTGlzdDogU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbltdO1xuICAgIH1bXTtcbiAgfTtcbiAgc3RhdHVzQ29kZTogMTtcbiAgc3RhdHVzRGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzVGl0bGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNQZW5kaW5nKFxuICB0cmFuc2FjdGlvbjogU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbixcbik6IHRyYW5zYWN0aW9uIGlzIFNjcmFwZWRQZW5kaW5nVHJhbnNhY3Rpb24ge1xuICByZXR1cm4gKHRyYW5zYWN0aW9uIGFzIFNjcmFwZWRUcmFuc2FjdGlvbikuZGViQ3JkRGF0ZSA9PT0gdW5kZWZpbmVkOyAvLyBhbiBhcmJpdHJhcnkgZmllbGQgdGhhdCBvbmx5IGFwcGVhcnMgaW4gYSBjb21wbGV0ZWQgdHJhbnNhY3Rpb25cbn1cblxuZnVuY3Rpb24gaXNDYXJkVHJhbnNhY3Rpb25EZXRhaWxzKFxuICByZXN1bHQ6IENhcmRUcmFuc2FjdGlvbkRldGFpbHMgfCBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzRXJyb3IsXG4pOiByZXN1bHQgaXMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlscyB7XG4gIHJldHVybiAocmVzdWx0IGFzIENhcmRUcmFuc2FjdGlvbkRldGFpbHMpLnJlc3VsdCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0NhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzKFxuICByZXN1bHQ6IENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yLFxuKTogcmVzdWx0IGlzIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHtcbiAgcmV0dXJuIChyZXN1bHQgYXMgQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMpLnJlc3VsdCAhPT0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMb2dpbkZyYW1lKHBhZ2U6IFBhZ2UpIHtcbiAgbGV0IGZyYW1lOiBGcmFtZSB8IG51bGwgPSBudWxsO1xuICBkZWJ1Zygnd2FpdCB1bnRpbCBsb2dpbiBmcmFtZSBmb3VuZCcpO1xuICBhd2FpdCB3YWl0VW50aWwoXG4gICAgKCkgPT4ge1xuICAgICAgZnJhbWUgPSBwYWdlLmZyYW1lcygpLmZpbmQoZiA9PiBmLnVybCgpLmluY2x1ZGVzKCdjb25uZWN0JykpIHx8IG51bGw7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCEhZnJhbWUpO1xuICAgIH0sXG4gICAgJ3dhaXQgZm9yIGlmcmFtZSB3aXRoIGxvZ2luIGZvcm0nLFxuICAgIDEwMDAwLFxuICAgIDEwMDAsXG4gICk7XG5cbiAgaWYgKCFmcmFtZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gZmluZCBsb2dpbiBmcmFtZSBmb3IgMTAgc2Vjb25kcycpO1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGV4dHJhY3QgbG9naW4gaWZyYW1lJyk7XG4gIH1cblxuICByZXR1cm4gZnJhbWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0ludmFsaWRQYXNzd29yZEVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICdkaXYuZ2VuZXJhbC1lcnJvciA+IGRpdicpO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckZvdW5kXG4gICAgPyBhd2FpdCBwYWdlRXZhbChmcmFtZSwgJ2Rpdi5nZW5lcmFsLWVycm9yID4gZGl2JywgJycsIGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0gYXMgSFRNTERpdkVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgIH0pXG4gICAgOiAnJztcbiAgcmV0dXJuIGVycm9yTWVzc2FnZSA9PT0gSW52YWxpZFBhc3N3b3JkTWVzc2FnZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICcuY2hhbmdlLXBhc3N3b3JkLXN1YnRpdGxlJyk7XG4gIHJldHVybiBlcnJvckZvdW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpIHtcbiAgZGVidWcoJ3JldHVybiBwb3NzaWJsZSBsb2dpbiByZXN1bHRzJyk7XG4gIGNvbnN0IHVybHM6IExvZ2luT3B0aW9uc1sncG9zc2libGVSZXN1bHRzJ10gPSB7XG4gICAgW0xvZ2luUmVzdWx0cy5TdWNjZXNzXTogWy9kYXNoYm9hcmQvaV0sXG4gICAgW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNJbnZhbGlkUGFzc3dvcmRFcnJvcihwYWdlKTtcbiAgICAgIH0sXG4gICAgXSxcbiAgICAvLyBbTG9naW5SZXN1bHRzLkFjY291bnRCbG9ja2VkXTogW10sIC8vIFRPRE8gYWRkIHdoZW4gcmVhY2hpbmcgdGhpcyBzY2VuYXJpb1xuICAgIFtMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDaGFuZ2VQYXNzd29yZEZvcm0ocGFnZSk7XG4gICAgICB9LFxuICAgIF0sXG4gIH07XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgZGVidWcoJ2NyZWF0ZSBsb2dpbiBmaWVsZHMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCcpO1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICdbZm9ybWNvbnRyb2xuYW1lPVwidXNlck5hbWVcIl0nLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnW2Zvcm1jb250cm9sbmFtZT1cInBhc3N3b3JkXCJdJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQYXJzZWREYXRhVG9UcmFuc2FjdGlvbnMoXG4gIGRhdGE6IENhcmRUcmFuc2FjdGlvbkRldGFpbHNbXSxcbiAgcGVuZGluZ0RhdGE/OiBDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscyB8IG51bGwsXG4pOiBUcmFuc2FjdGlvbltdIHtcbiAgY29uc3QgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHBlbmRpbmdEYXRhPy5yZXN1bHRcbiAgICA/IHBlbmRpbmdEYXRhLnJlc3VsdC5jYXJkc0xpc3QuZmxhdE1hcChjYXJkID0+IGNhcmQuYXV0aERldGFsaXNMaXN0KVxuICAgIDogW107XG5cbiAgY29uc3QgYmFua0FjY291bnRzID0gZGF0YS5mbGF0TWFwKG1vbnRoRGF0YSA9PiBtb250aERhdGEucmVzdWx0LmJhbmtBY2NvdW50cyk7XG4gIGNvbnN0IHJlZ3VsYXJEZWJpdERheXMgPSBiYW5rQWNjb3VudHMuZmxhdE1hcChhY2NvdW50cyA9PiBhY2NvdW50cy5kZWJpdERhdGVzKTtcbiAgY29uc3QgaW1tZWRpYXRlRGViaXREYXlzID0gYmFua0FjY291bnRzLmZsYXRNYXAoYWNjb3VudHMgPT4gYWNjb3VudHMuaW1taWRpYXRlRGViaXRzLmRlYml0RGF5cyk7XG4gIGNvbnN0IGNvbXBsZXRlZFRyYW5zYWN0aW9ucyA9IFsuLi5yZWd1bGFyRGViaXREYXlzLCAuLi5pbW1lZGlhdGVEZWJpdERheXNdLmZsYXRNYXAoXG4gICAgZGViaXREYXRlID0+IGRlYml0RGF0ZS50cmFuc2FjdGlvbnMsXG4gICk7XG5cbiAgY29uc3QgYWxsOiAoU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbilbXSA9IFsuLi5wZW5kaW5nVHJhbnNhY3Rpb25zLCAuLi5jb21wbGV0ZWRUcmFuc2FjdGlvbnNdO1xuXG4gIHJldHVybiBhbGwubWFwKHRyYW5zYWN0aW9uID0+IHtcbiAgICBjb25zdCBudW1PZlBheW1lbnRzID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLm51bWJlck9mUGF5bWVudHMgOiB0cmFuc2FjdGlvbi5udW1PZlBheW1lbnRzO1xuICAgIGNvbnN0IGluc3RhbGxtZW50cyA9IG51bU9mUGF5bWVudHNcbiAgICAgID8ge1xuICAgICAgICAgIG51bWJlcjogaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IDEgOiB0cmFuc2FjdGlvbi5jdXJQYXltZW50TnVtLFxuICAgICAgICAgIHRvdGFsOiBudW1PZlBheW1lbnRzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQodHJhbnNhY3Rpb24udHJuUHVyY2hhc2VEYXRlKTtcblxuICAgIGxldCBjaGFyZ2VkQW1vdW50ID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLnRybkFtdCAqIC0xIDogdHJhbnNhY3Rpb24uYW10QmVmb3JlQ29udkFuZEluZGV4ICogLTE7XG4gICAgbGV0IG9yaWdpbmFsQW1vdW50ID0gdHJhbnNhY3Rpb24udHJuQW10ICogLTE7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24udHJuVHlwZUNvZGUgPT09IFRyblR5cGVDb2RlLmNyZWRpdCkge1xuICAgICAgY2hhcmdlZEFtb3VudCA9IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi50cm5BbXQgOiB0cmFuc2FjdGlvbi5hbXRCZWZvcmVDb252QW5kSW5kZXg7XG4gICAgICBvcmlnaW5hbEFtb3VudCA9IHRyYW5zYWN0aW9uLnRybkFtdDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgaWRlbnRpZmllcjogIWlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi50cm5JbnRJZCA6IHVuZGVmaW5lZCxcbiAgICAgIHR5cGU6IFtUcm5UeXBlQ29kZS5yZWd1bGFyLCBUcm5UeXBlQ29kZS5zdGFuZGluZ09yZGVyXS5pbmNsdWRlcyh0cmFuc2FjdGlvbi50cm5UeXBlQ29kZSlcbiAgICAgICAgPyBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbFxuICAgICAgICA6IFRyYW5zYWN0aW9uVHlwZXMuSW5zdGFsbG1lbnRzLFxuICAgICAgc3RhdHVzOiBpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gVHJhbnNhY3Rpb25TdGF0dXNlcy5QZW5kaW5nIDogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBkYXRlOiBpbnN0YWxsbWVudHMgPyBkYXRlLmFkZChpbnN0YWxsbWVudHMubnVtYmVyIC0gMSwgJ21vbnRoJykudG9JU09TdHJpbmcoKSA6IGRhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZSh0cmFuc2FjdGlvbi5kZWJDcmREYXRlKS50b0lTT1N0cmluZygpLFxuICAgICAgb3JpZ2luYWxBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiB0cmFuc2FjdGlvbi50cm5DdXJyZW5jeVN5bWJvbCxcbiAgICAgIGNoYXJnZWRBbW91bnQsXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6ICFpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gdHJhbnNhY3Rpb24uZGViQ3JkQ3VycmVuY3lTeW1ib2wgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogdHJhbnNhY3Rpb24ubWVyY2hhbnROYW1lLFxuICAgICAgbWVtbzogdHJhbnNhY3Rpb24udHJhbnNUeXBlQ29tbWVudERldGFpbHMudG9TdHJpbmcoKSxcbiAgICAgIGNhdGVnb3J5OiB0cmFuc2FjdGlvbi5icmFuY2hDb2RlRGVzYyxcbiAgICB9O1xuXG4gICAgaWYgKGluc3RhbGxtZW50cykge1xuICAgICAgcmVzdWx0Lmluc3RhbGxtZW50cyA9IGluc3RhbGxtZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBWaXNhQ2FsU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgb3BlbkxvZ2luUG9wdXAgPSBhc3luYyAoKSA9PiB7XG4gICAgZGVidWcoJ29wZW4gbG9naW4gcG9wdXAsIHdhaXQgdW50aWwgbG9naW4gYnV0dG9uIGF2YWlsYWJsZScpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcjY2NMb2dpbkRlc2t0b3BCdG4nLCB0cnVlKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gdGhlIGxvZ2luIGJ1dHRvbicpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpO1xuICAgIGRlYnVnKCdnZXQgdGhlIGZyYW1lIHRoYXQgaG9sZHMgdGhlIGxvZ2luJyk7XG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHRoaXMucGFnZSk7XG4gICAgZGVidWcoJ3dhaXQgdW50aWwgdGhlIHBhc3N3b3JkIGxvZ2luIHRhYiBoZWFkZXIgaXMgYXZhaWxhYmxlJyk7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKGZyYW1lLCAnI3JlZ3VsYXItbG9naW4nKTtcbiAgICBkZWJ1ZygnbmF2aWdhdGUgdG8gdGhlIHBhc3N3b3JkIGxvZ2luIHRhYicpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKGZyYW1lLCAnI3JlZ3VsYXItbG9naW4nKTtcbiAgICBkZWJ1Zygnd2FpdCB1bnRpbCB0aGUgcGFzc3dvcmQgbG9naW4gdGFiIGlzIGFjdGl2ZScpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChmcmFtZSwgJ3JlZ3VsYXItbG9naW4nKTtcblxuICAgIHJldHVybiBmcmFtZTtcbiAgfTtcblxuICBhc3luYyBnZXRDYXJkcygpIHtcbiAgICBjb25zdCBpbml0RGF0YSA9IGF3YWl0IHdhaXRVbnRpbChcbiAgICAgICgpID0+IGdldEZyb21TZXNzaW9uU3RvcmFnZTxJbml0UmVzcG9uc2U+KHRoaXMucGFnZSwgJ2luaXQnKSxcbiAgICAgICdnZXQgaW5pdCBkYXRhIGluIHNlc3Npb24gc3RvcmFnZScsXG4gICAgICAxMDAwMCxcbiAgICAgIDEwMDAsXG4gICAgKTtcbiAgICBpZiAoIWluaXREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCAnaW5pdCcgZGF0YSBpbiBzZXNzaW9uIHN0b3JhZ2VcIik7XG4gICAgfVxuICAgIHJldHVybiBpbml0RGF0YT8ucmVzdWx0LmNhcmRzLm1hcCgoeyBjYXJkVW5pcXVlSWQsIGxhc3Q0RGlnaXRzIH0pID0+ICh7IGNhcmRVbmlxdWVJZCwgbGFzdDREaWdpdHMgfSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvbkhlYWRlcigpIHtcbiAgICBjb25zdCBhdXRoTW9kdWxlID0gYXdhaXQgZ2V0RnJvbVNlc3Npb25TdG9yYWdlPHsgYXV0aDogeyBjYWxDb25uZWN0VG9rZW46IHN0cmluZyB9IH0+KHRoaXMucGFnZSwgJ2F1dGgtbW9kdWxlJyk7XG4gICAgaWYgKCFhdXRoTW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCAnYXV0aC1tb2R1bGUnIGluIHNlc3Npb24gc3RvcmFnZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGBDQUxBdXRoU2NoZW1lICR7YXV0aE1vZHVsZS5hdXRoLmNhbENvbm5lY3RUb2tlbn1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0WFNpdGVJZCgpIHtcbiAgICAvKlxuICAgICAgSSBkb24ndCBrbm93IGlmIHRoZSBjb25zdGFudCBiZWxvdyB3aWxsIGNoYW5nZSBpbiB0aGUgZmVhdHVyZS5cbiAgICAgIElmIHNvLCB1c2UgdGhlIG5leHQgY29kZTpcblxuICAgICAgcmV0dXJuIHRoaXMucGFnZS5ldmFsdWF0ZSgoKSA9PiBuZXcgVXQoKS54U2l0ZUlkKTtcblxuICAgICAgVG8gZ2V0IHRoZSBjbGFzc25hbWUgc2VhcmNoIGZvciAneFNpdGVJZCcgaW4gdGhlIHBhZ2Ugc291cmNlXG4gICAgICBjbGFzcyBVdCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF9lLCBvbiwgeW4pIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBfZSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gb24sXG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzU2VydmljZSA9IHluLFxuICAgICAgICAgICAgdGhpcy54U2l0ZUlkID0gXCIwOTAzMTk4Ny0yNzNFLTIzMTEtOTA2Qy04QUY4NUIxN0M4RDlcIixcbiAgICAqL1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJzA5MDMxOTg3LTI3M0UtMjMxMS05MDZDLThBRjg1QjE3QzhEOScpO1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyk6IExvZ2luT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtMT0dJTl9VUkx9YCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScsXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4gd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpLFxuICAgICAgcHJlQWN0aW9uOiB0aGlzLm9wZW5Mb2dpblBvcHVwLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnc2l0ZS10dXRvcmlhbCcpKSB7XG4gICAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICdidXR0b24uYnRuLWNsb3NlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnZGFzaGJvYXJkJykpIHJldHVybjtcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0NoYW5nZVBhc3N3b3JkID0gYXdhaXQgaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHRoaXMucGFnZSk7XG4gICAgICAgICAgaWYgKHJlcXVpcmVzQ2hhbmdlUGFzc3dvcmQpIHJldHVybjtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlckFnZW50OlxuICAgICAgICAnTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzguMC4zOTA0LjEwOCBTYWZhcmkvNTM3LjM2JyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuc3VidHJhY3QoNiwgJ21vbnRocycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuICAgIGRlYnVnKGBmZXRjaCB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgJHtzdGFydE1vbWVudC5mb3JtYXQoKX1gKTtcblxuICAgIGNvbnN0IEF1dGhvcml6YXRpb24gPSBhd2FpdCB0aGlzLmdldEF1dGhvcml6YXRpb25IZWFkZXIoKTtcbiAgICBjb25zdCBjYXJkcyA9IGF3YWl0IHRoaXMuZ2V0Q2FyZHMoKTtcbiAgICBjb25zdCB4U2l0ZUlkID0gYXdhaXQgdGhpcy5nZXRYU2l0ZUlkKCk7XG4gICAgY29uc3QgZnV0dXJlTW9udGhzVG9TY3JhcGUgPSB0aGlzLm9wdGlvbnMuZnV0dXJlTW9udGhzVG9TY3JhcGUgPz8gMTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjYXJkcy5tYXAoYXN5bmMgY2FyZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmFsTW9udGhUb0ZldGNoTW9tZW50ID0gbW9tZW50KCkuYWRkKGZ1dHVyZU1vbnRoc1RvU2NyYXBlLCAnbW9udGgnKTtcbiAgICAgICAgY29uc3QgbW9udGhzID0gZmluYWxNb250aFRvRmV0Y2hNb21lbnQuZGlmZihzdGFydE1vbWVudCwgJ21vbnRocycpO1xuXG4gICAgICAgIGNvbnN0IGFsbE1vbnRoc0RhdGE6IENhcmRUcmFuc2FjdGlvbkRldGFpbHNbXSA9IFtdO1xuXG4gICAgICAgIGRlYnVnKGBmZXRjaCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBmb3IgY2FyZCAke2NhcmQuY2FyZFVuaXF1ZUlkfWApO1xuICAgICAgICBsZXQgcGVuZGluZ0RhdGEgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yPihcbiAgICAgICAgICB0aGlzLnBhZ2UsXG4gICAgICAgICAgUEVORElOR19UUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCxcbiAgICAgICAgICB7IGNhcmRVbmlxdWVJREFycmF5OiBbY2FyZC5jYXJkVW5pcXVlSWRdIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICdYLVNpdGUtSWQnOiB4U2l0ZUlkLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGRlYnVnKGBmZXRjaCBjb21wbGV0ZWQgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5jYXJkVW5pcXVlSWR9YCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1vbnRoczsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBmaW5hbE1vbnRoVG9GZXRjaE1vbWVudC5jbG9uZSgpLnN1YnRyYWN0KGksICdtb250aHMnKTtcbiAgICAgICAgICBjb25zdCBtb250aERhdGEgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPENhcmRUcmFuc2FjdGlvbkRldGFpbHMgfCBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzRXJyb3I+KFxuICAgICAgICAgICAgdGhpcy5wYWdlLFxuICAgICAgICAgICAgVFJBTlNBQ1RJT05TX1JFUVVFU1RfRU5EUE9JTlQsXG4gICAgICAgICAgICB7IGNhcmRVbmlxdWVJZDogY2FyZC5jYXJkVW5pcXVlSWQsIG1vbnRoOiBtb250aC5mb3JtYXQoJ00nKSwgeWVhcjogbW9udGguZm9ybWF0KCdZWVlZJykgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICAgJ1gtU2l0ZS1JZCc6IHhTaXRlSWQsXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobW9udGhEYXRhPy5zdGF0dXNDb2RlICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmFpbGVkIHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmb3IgY2FyZCAke2NhcmQubGFzdDREaWdpdHN9LiBNZXNzYWdlOiAke21vbnRoRGF0YT8udGl0bGUgfHwgJyd9YCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlzQ2FyZFRyYW5zYWN0aW9uRGV0YWlscyhtb250aERhdGEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21vbnRoRGF0YSBpcyBub3Qgb2YgdHlwZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWxsTW9udGhzRGF0YS5wdXNoKG1vbnRoRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGVuZGluZ0RhdGE/LnN0YXR1c0NvZGUgIT09IDEgJiYgcGVuZGluZ0RhdGE/LnN0YXR1c0NvZGUgIT09IDk2KSB7XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIGZldGNoIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5sYXN0NERpZ2l0c30uIE1lc3NhZ2U6ICR7cGVuZGluZ0RhdGE/LnRpdGxlIHx8ICcnfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwZW5kaW5nRGF0YSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMocGVuZGluZ0RhdGEpKSB7XG4gICAgICAgICAgZGVidWcoJ3BlbmRpbmdEYXRhIGlzIG5vdCBvZiB0eXBlIENhcmRUcmFuc2FjdGlvbkRldGFpbHMnKTtcbiAgICAgICAgICBwZW5kaW5nRGF0YSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBjb252ZXJ0UGFyc2VkRGF0YVRvVHJhbnNhY3Rpb25zKGFsbE1vbnRoc0RhdGEsIHBlbmRpbmdEYXRhKTtcblxuICAgICAgICBkZWJ1ZygnZmlsZXIgb3V0IG9sZCB0cmFuc2FjdGlvbnMnKTtcbiAgICAgICAgY29uc3QgdHhucyA9XG4gICAgICAgICAgKHRoaXMub3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSlcbiAgICAgICAgICAgID8gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKHRyYW5zYWN0aW9ucywgbW9tZW50KHN0YXJ0RGF0ZSksIHRoaXMub3B0aW9ucy5jb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKVxuICAgICAgICAgICAgOiB0cmFuc2FjdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eG5zLFxuICAgICAgICAgIGFjY291bnROdW1iZXI6IGNhcmQubGFzdDREaWdpdHMsXG4gICAgICAgIH0gYXMgVHJhbnNhY3Rpb25zQWNjb3VudDtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBkZWJ1ZygncmV0dXJuIHRoZSBzY3JhcGVkIGFjY291bnRzJyk7XG5cbiAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeShhY2NvdW50cywgbnVsbCwgMikpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaXNhQ2FsU2NyYXBlcjtcbiJdfQ==
|