israeli-bank-scrapers 6.0.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.
Files changed (83) hide show
  1. package/README.md +1 -0
  2. package/lib/assertNever.js +5 -7
  3. package/lib/constants.js +13 -16
  4. package/lib/definitions.js +109 -113
  5. package/lib/helpers/browser.d.ts +8 -0
  6. package/lib/helpers/browser.js +14 -11
  7. package/lib/helpers/dates.js +18 -19
  8. package/lib/helpers/debug.js +9 -9
  9. package/lib/helpers/elements-interactions.js +78 -84
  10. package/lib/helpers/fetch.js +82 -89
  11. package/lib/helpers/navigation.js +24 -31
  12. package/lib/helpers/storage.js +10 -12
  13. package/lib/helpers/transactions.js +33 -35
  14. package/lib/helpers/waiting.js +45 -44
  15. package/lib/index.js +15 -82
  16. package/lib/scrapers/amex.js +11 -13
  17. package/lib/scrapers/base-beinleumi-group.js +233 -252
  18. package/lib/scrapers/base-isracard-amex.js +273 -286
  19. package/lib/scrapers/base-scraper-with-browser.d.ts +2 -1
  20. package/lib/scrapers/base-scraper-with-browser.js +240 -269
  21. package/lib/scrapers/base-scraper.js +82 -86
  22. package/lib/scrapers/behatsdaa.js +98 -107
  23. package/lib/scrapers/beinleumi.js +11 -20
  24. package/lib/scrapers/beyahad-bishvilha.js +132 -138
  25. package/lib/scrapers/discount.js +97 -103
  26. package/lib/scrapers/errors.js +22 -25
  27. package/lib/scrapers/factory.js +66 -67
  28. package/lib/scrapers/hapoalim.js +162 -182
  29. package/lib/scrapers/interface.d.ts +12 -0
  30. package/lib/scrapers/interface.js +2 -5
  31. package/lib/scrapers/isracard.js +11 -13
  32. package/lib/scrapers/leumi.js +167 -176
  33. package/lib/scrapers/massad.js +11 -20
  34. package/lib/scrapers/max.js +256 -268
  35. package/lib/scrapers/mercantile.js +14 -20
  36. package/lib/scrapers/mizrahi.js +158 -159
  37. package/lib/scrapers/one-zero-queries.js +4 -7
  38. package/lib/scrapers/one-zero.js +176 -240
  39. package/lib/scrapers/otsar-hahayal.js +11 -20
  40. package/lib/scrapers/pagi.js +11 -20
  41. package/lib/scrapers/union-bank.js +172 -179
  42. package/lib/scrapers/visa-cal.js +254 -263
  43. package/lib/scrapers/yahav.js +190 -211
  44. package/lib/transactions.js +13 -16
  45. package/package.json +12 -14
  46. package/lib/scrapers/amex.test.d.ts +0 -1
  47. package/lib/scrapers/amex.test.js +0 -54
  48. package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
  49. package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
  50. package/lib/scrapers/behatsdaa.test.d.ts +0 -1
  51. package/lib/scrapers/behatsdaa.test.js +0 -50
  52. package/lib/scrapers/beinleumi.test.d.ts +0 -1
  53. package/lib/scrapers/beinleumi.test.js +0 -52
  54. package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
  55. package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
  56. package/lib/scrapers/discount.test.d.ts +0 -1
  57. package/lib/scrapers/discount.test.js +0 -54
  58. package/lib/scrapers/factory.test.d.ts +0 -1
  59. package/lib/scrapers/factory.test.js +0 -19
  60. package/lib/scrapers/hapoalim.test.d.ts +0 -1
  61. package/lib/scrapers/hapoalim.test.js +0 -52
  62. package/lib/scrapers/isracard.test.d.ts +0 -1
  63. package/lib/scrapers/isracard.test.js +0 -54
  64. package/lib/scrapers/leumi.test.d.ts +0 -1
  65. package/lib/scrapers/leumi.test.js +0 -52
  66. package/lib/scrapers/max.test.d.ts +0 -1
  67. package/lib/scrapers/max.test.js +0 -71
  68. package/lib/scrapers/mercantile.test.d.ts +0 -1
  69. package/lib/scrapers/mercantile.test.js +0 -50
  70. package/lib/scrapers/mizrahi.test.d.ts +0 -1
  71. package/lib/scrapers/mizrahi.test.js +0 -58
  72. package/lib/scrapers/one-zero.test.d.ts +0 -1
  73. package/lib/scrapers/one-zero.test.js +0 -56
  74. package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
  75. package/lib/scrapers/otsar-hahayal.test.js +0 -52
  76. package/lib/scrapers/pagi.test.d.ts +0 -1
  77. package/lib/scrapers/pagi.test.js +0 -52
  78. package/lib/scrapers/union-bank.test.d.ts +0 -1
  79. package/lib/scrapers/union-bank.test.js +0 -52
  80. package/lib/scrapers/visa-cal.test.d.ts +0 -1
  81. package/lib/scrapers/visa-cal.test.js +0 -54
  82. package/lib/scrapers/yahav.test.d.ts +0 -1
  83. package/lib/scrapers/yahav.test.js +0 -54
@@ -1,155 +1,149 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- require("core-js/modules/es.symbol.description.js");
8
- require("core-js/modules/es.array.iterator.js");
9
- require("core-js/modules/es.promise.js");
10
- require("core-js/modules/es.regexp.exec.js");
11
- require("core-js/modules/es.string.replace.js");
12
- var _moment = _interopRequireDefault(require("moment"));
13
- var _constants = require("../constants");
14
- var _debug = require("../helpers/debug");
15
- var _elementsInteractions = require("../helpers/elements-interactions");
16
- var _transactions = require("../helpers/transactions");
17
- var _transactions2 = require("../transactions");
18
- var _baseScraperWithBrowser = require("./base-scraper-with-browser");
19
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
- const debug = (0, _debug.getDebug)('beyahadBishvilha');
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 constants_1 = require("../constants");
8
+ const debug_1 = require("../helpers/debug");
9
+ const elements_interactions_1 = require("../helpers/elements-interactions");
10
+ const transactions_1 = require("../helpers/transactions");
11
+ const transactions_2 = require("../transactions");
12
+ const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
13
+ const debug = (0, debug_1.getDebug)('beyahadBishvilha');
21
14
  const DATE_FORMAT = 'DD/MM/YY';
22
15
  const LOGIN_URL = 'https://www.hist.org.il/login';
23
16
  const SUCCESS_URL = 'https://www.hist.org.il/';
24
17
  const CARD_URL = 'https://www.hist.org.il/card/balanceAndUses';
25
18
  function getAmountData(amountStr) {
26
- const amountStrCln = amountStr.replace(',', '');
27
- let currency = null;
28
- let amount = null;
29
- if (amountStrCln.includes(_constants.SHEKEL_CURRENCY_SYMBOL)) {
30
- amount = parseFloat(amountStrCln.replace(_constants.SHEKEL_CURRENCY_SYMBOL, ''));
31
- currency = _constants.SHEKEL_CURRENCY;
32
- } else if (amountStrCln.includes(_constants.DOLLAR_CURRENCY_SYMBOL)) {
33
- amount = parseFloat(amountStrCln.replace(_constants.DOLLAR_CURRENCY_SYMBOL, ''));
34
- currency = _constants.DOLLAR_CURRENCY;
35
- } else if (amountStrCln.includes(_constants.EURO_CURRENCY_SYMBOL)) {
36
- amount = parseFloat(amountStrCln.replace(_constants.EURO_CURRENCY_SYMBOL, ''));
37
- currency = _constants.EURO_CURRENCY;
38
- } else {
39
- const parts = amountStrCln.split(' ');
40
- [currency] = parts;
41
- amount = parseFloat(parts[1]);
42
- }
43
- return {
44
- amount,
45
- currency
46
- };
19
+ const amountStrCln = amountStr.replace(',', '');
20
+ let currency = null;
21
+ let amount = null;
22
+ if (amountStrCln.includes(constants_1.SHEKEL_CURRENCY_SYMBOL)) {
23
+ amount = parseFloat(amountStrCln.replace(constants_1.SHEKEL_CURRENCY_SYMBOL, ''));
24
+ currency = constants_1.SHEKEL_CURRENCY;
25
+ }
26
+ else if (amountStrCln.includes(constants_1.DOLLAR_CURRENCY_SYMBOL)) {
27
+ amount = parseFloat(amountStrCln.replace(constants_1.DOLLAR_CURRENCY_SYMBOL, ''));
28
+ currency = constants_1.DOLLAR_CURRENCY;
29
+ }
30
+ else if (amountStrCln.includes(constants_1.EURO_CURRENCY_SYMBOL)) {
31
+ amount = parseFloat(amountStrCln.replace(constants_1.EURO_CURRENCY_SYMBOL, ''));
32
+ currency = constants_1.EURO_CURRENCY;
33
+ }
34
+ else {
35
+ const parts = amountStrCln.split(' ');
36
+ [currency] = parts;
37
+ amount = parseFloat(parts[1]);
38
+ }
39
+ return {
40
+ amount,
41
+ currency,
42
+ };
47
43
  }
48
44
  function convertTransactions(txns) {
49
- debug(`convert ${txns.length} raw transactions to official Transaction structure`);
50
- return txns.map(txn => {
51
- const chargedAmountTuple = getAmountData(txn.chargedAmount || '');
52
- const txnProcessedDate = (0, _moment.default)(txn.date, DATE_FORMAT);
53
- const result = {
54
- type: _transactions2.TransactionTypes.Normal,
55
- status: _transactions2.TransactionStatuses.Completed,
56
- date: txnProcessedDate.toISOString(),
57
- processedDate: txnProcessedDate.toISOString(),
58
- originalAmount: chargedAmountTuple.amount,
59
- originalCurrency: chargedAmountTuple.currency,
60
- chargedAmount: chargedAmountTuple.amount,
61
- chargedCurrency: chargedAmountTuple.currency,
62
- description: txn.description || '',
63
- memo: '',
64
- identifier: txn.identifier
65
- };
66
- return result;
67
- });
45
+ debug(`convert ${txns.length} raw transactions to official Transaction structure`);
46
+ return txns.map(txn => {
47
+ const chargedAmountTuple = getAmountData(txn.chargedAmount || '');
48
+ const txnProcessedDate = (0, moment_1.default)(txn.date, DATE_FORMAT);
49
+ const result = {
50
+ type: transactions_2.TransactionTypes.Normal,
51
+ status: transactions_2.TransactionStatuses.Completed,
52
+ date: txnProcessedDate.toISOString(),
53
+ processedDate: txnProcessedDate.toISOString(),
54
+ originalAmount: chargedAmountTuple.amount,
55
+ originalCurrency: chargedAmountTuple.currency,
56
+ chargedAmount: chargedAmountTuple.amount,
57
+ chargedCurrency: chargedAmountTuple.currency,
58
+ description: txn.description || '',
59
+ memo: '',
60
+ identifier: txn.identifier,
61
+ };
62
+ return result;
63
+ });
68
64
  }
69
65
  async function fetchTransactions(page, options) {
70
- var _options$outputData$e, _options$outputData;
71
- await page.goto(CARD_URL);
72
- await (0, _elementsInteractions.waitUntilElementFound)(page, '.react-loading.hide', false);
73
- const defaultStartMoment = (0, _moment.default)().subtract(1, 'years');
74
- const startDate = options.startDate || defaultStartMoment.toDate();
75
- const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
76
- const accountNumber = await (0, _elementsInteractions.pageEval)(page, '.wallet-details div:nth-of-type(2)', null, element => {
77
- return element.innerText.replace('מספר כרטיס ', '');
78
- });
79
- const balance = await (0, _elementsInteractions.pageEval)(page, '.wallet-details div:nth-of-type(4) > span:nth-of-type(2)', null, element => {
80
- return element.innerText;
81
- });
82
- debug('fetch raw transactions from page');
83
- const rawTransactions = await (0, _elementsInteractions.pageEvalAll)(page, '.transaction-container, .transaction-component-container', [], items => {
84
- return items.map(el => {
85
- const columns = el.querySelectorAll('.transaction-item > span');
86
- if (columns.length === 7) {
87
- return {
88
- date: columns[0].innerText,
89
- identifier: columns[1].innerText,
90
- description: columns[3].innerText,
91
- type: columns[5].innerText,
92
- chargedAmount: columns[6].innerText
93
- };
94
- }
95
- return null;
66
+ await page.goto(CARD_URL);
67
+ await (0, elements_interactions_1.waitUntilElementFound)(page, '.react-loading.hide', false);
68
+ const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years');
69
+ const startDate = options.startDate || defaultStartMoment.toDate();
70
+ const startMoment = moment_1.default.max(defaultStartMoment, (0, moment_1.default)(startDate));
71
+ const accountNumber = await (0, elements_interactions_1.pageEval)(page, '.wallet-details div:nth-of-type(2)', null, element => {
72
+ return element.innerText.replace('מספר כרטיס ', '');
73
+ });
74
+ const balance = await (0, elements_interactions_1.pageEval)(page, '.wallet-details div:nth-of-type(4) > span:nth-of-type(2)', null, element => {
75
+ return element.innerText;
76
+ });
77
+ debug('fetch raw transactions from page');
78
+ const rawTransactions = await (0, elements_interactions_1.pageEvalAll)(page, '.transaction-container, .transaction-component-container', [], items => {
79
+ return items.map(el => {
80
+ const columns = el.querySelectorAll('.transaction-item > span');
81
+ if (columns.length === 7) {
82
+ return {
83
+ date: columns[0].innerText,
84
+ identifier: columns[1].innerText,
85
+ description: columns[3].innerText,
86
+ type: columns[5].innerText,
87
+ chargedAmount: columns[6].innerText,
88
+ };
89
+ }
90
+ return null;
91
+ });
96
92
  });
97
- });
98
- debug(`fetched ${rawTransactions.length} raw transactions from page`);
99
- const accountTransactions = convertTransactions(rawTransactions.filter(item => !!item));
100
- debug('filer out old transactions');
101
- const txns = ((_options$outputData$e = (_options$outputData = options.outputData) === null || _options$outputData === void 0 ? void 0 : _options$outputData.enableTransactionsFilterByDate) !== null && _options$outputData$e !== void 0 ? _options$outputData$e : true) ? (0, _transactions.filterOldTransactions)(accountTransactions, startMoment, false) : accountTransactions;
102
- debug(`found ${txns.length} valid transactions out of ${accountTransactions.length} transactions for account ending with ${accountNumber.substring(accountNumber.length - 2)}`);
103
- return {
104
- accountNumber,
105
- balance: getAmountData(balance).amount,
106
- txns
107
- };
93
+ debug(`fetched ${rawTransactions.length} raw transactions from page`);
94
+ const accountTransactions = convertTransactions(rawTransactions.filter(item => !!item));
95
+ debug('filer out old transactions');
96
+ const txns = (options.outputData?.enableTransactionsFilterByDate ?? true)
97
+ ? (0, transactions_1.filterOldTransactions)(accountTransactions, startMoment, false)
98
+ : accountTransactions;
99
+ debug(`found ${txns.length} valid transactions out of ${accountTransactions.length} transactions for account ending with ${accountNumber.substring(accountNumber.length - 2)}`);
100
+ return {
101
+ accountNumber,
102
+ balance: getAmountData(balance).amount,
103
+ txns,
104
+ };
108
105
  }
109
106
  function getPossibleLoginResults() {
110
- const urls = {};
111
- urls[_baseScraperWithBrowser.LoginResults.Success] = [SUCCESS_URL];
112
- urls[_baseScraperWithBrowser.LoginResults.ChangePassword] = []; // TODO
113
- urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = []; // TODO
114
- urls[_baseScraperWithBrowser.LoginResults.UnknownError] = []; // TODO
115
- return urls;
107
+ const urls = {};
108
+ urls[base_scraper_with_browser_1.LoginResults.Success] = [SUCCESS_URL];
109
+ urls[base_scraper_with_browser_1.LoginResults.ChangePassword] = []; // TODO
110
+ urls[base_scraper_with_browser_1.LoginResults.InvalidPassword] = []; // TODO
111
+ urls[base_scraper_with_browser_1.LoginResults.UnknownError] = []; // TODO
112
+ return urls;
116
113
  }
117
114
  function createLoginFields(credentials) {
118
- return [{
119
- selector: '#loginId',
120
- value: credentials.id
121
- }, {
122
- selector: '#loginPassword',
123
- value: credentials.password
124
- }];
115
+ return [
116
+ { selector: '#loginId', value: credentials.id },
117
+ { selector: '#loginPassword', value: credentials.password },
118
+ ];
125
119
  }
126
- class BeyahadBishvilhaScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
127
- getViewPort() {
128
- return {
129
- width: 1500,
130
- height: 800
131
- };
132
- }
133
- getLoginOptions(credentials) {
134
- return {
135
- loginUrl: LOGIN_URL,
136
- fields: createLoginFields(credentials),
137
- submitButtonSelector: async () => {
138
- const button = await this.page.$('xpath//button[contains(., "התחבר")]');
139
- if (button) {
140
- await button.click();
141
- }
142
- },
143
- possibleResults: getPossibleLoginResults()
144
- };
145
- }
146
- async fetchData() {
147
- const account = await fetchTransactions(this.page, this.options);
148
- return {
149
- success: true,
150
- accounts: [account]
151
- };
152
- }
120
+ class BeyahadBishvilhaScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
121
+ getViewPort() {
122
+ return {
123
+ width: 1500,
124
+ height: 800,
125
+ };
126
+ }
127
+ getLoginOptions(credentials) {
128
+ return {
129
+ loginUrl: LOGIN_URL,
130
+ fields: createLoginFields(credentials),
131
+ submitButtonSelector: async () => {
132
+ const button = await this.page.$('xpath//button[contains(., "התחבר")]');
133
+ if (button) {
134
+ await button.click();
135
+ }
136
+ },
137
+ possibleResults: getPossibleLoginResults(),
138
+ };
139
+ }
140
+ async fetchData() {
141
+ const account = await fetchTransactions(this.page, this.options);
142
+ return {
143
+ success: true,
144
+ accounts: [account],
145
+ };
146
+ }
153
147
  }
154
- var _default = exports.default = BeyahadBishvilhaScraper;
155
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX3RyYW5zYWN0aW9ucyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiREFURV9GT1JNQVQiLCJMT0dJTl9VUkwiLCJTVUNDRVNTX1VSTCIsIkNBUkRfVVJMIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNsbiIsInJlcGxhY2UiLCJjdXJyZW5jeSIsImFtb3VudCIsImluY2x1ZGVzIiwiU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCIsInBhcnNlRmxvYXQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MIiwiRE9MTEFSX0NVUlJFTkNZIiwiRVVST19DVVJSRU5DWV9TWU1CT0wiLCJFVVJPX0NVUlJFTkNZIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibGVuZ3RoIiwibWFwIiwidHhuIiwiY2hhcmdlZEFtb3VudFR1cGxlIiwiY2hhcmdlZEFtb3VudCIsInR4blByb2Nlc3NlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwicmVzdWx0IiwidHlwZSIsIlRyYW5zYWN0aW9uVHlwZXMiLCJOb3JtYWwiLCJzdGF0dXMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiQ29tcGxldGVkIiwidG9JU09TdHJpbmciLCJwcm9jZXNzZWREYXRlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEN1cnJlbmN5IiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiaWRlbnRpZmllciIsImZldGNoVHJhbnNhY3Rpb25zIiwicGFnZSIsIm9wdGlvbnMiLCJfb3B0aW9ucyRvdXRwdXREYXRhJGUiLCJfb3B0aW9ucyRvdXRwdXREYXRhIiwiZ290byIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnREYXRlIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtYXgiLCJhY2NvdW50TnVtYmVyIiwicGFnZUV2YWwiLCJlbGVtZW50IiwiaW5uZXJUZXh0IiwiYmFsYW5jZSIsInJhd1RyYW5zYWN0aW9ucyIsInBhZ2VFdmFsQWxsIiwiaXRlbXMiLCJlbCIsImNvbHVtbnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiYWNjb3VudFRyYW5zYWN0aW9ucyIsImZpbHRlciIsIml0ZW0iLCJvdXRwdXREYXRhIiwiZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlIiwiZmlsdGVyT2xkVHJhbnNhY3Rpb25zIiwic3Vic3RyaW5nIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkNoYW5nZVBhc3N3b3JkIiwiSW52YWxpZFBhc3N3b3JkIiwiVW5rbm93bkVycm9yIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJpZCIsInBhc3N3b3JkIiwiQmV5YWhhZEJpc2h2aWxoYVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJidXR0b24iLCIkIiwiY2xpY2siLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJhY2NvdW50Iiwic3VjY2VzcyIsImFjY291bnRzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2JleWFoYWQtYmlzaHZpbGhhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQge1xuICBET0xMQVJfQ1VSUkVOQ1ksXG4gIERPTExBUl9DVVJSRU5DWV9TWU1CT0wsIEVVUk9fQ1VSUkVOQ1ksXG4gIEVVUk9fQ1VSUkVOQ1lfU1lNQk9MLFxuICBTSEVLRUxfQ1VSUkVOQ1ksXG4gIFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXREZWJ1ZyB9IGZyb20gJy4uL2hlbHBlcnMvZGVidWcnO1xuaW1wb3J0IHsgcGFnZUV2YWwsIHBhZ2VFdmFsQWxsLCB3YWl0VW50aWxFbGVtZW50Rm91bmQgfSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdiZXlhaGFkQmlzaHZpbGhhJyk7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZJztcbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC9sb2dpbic7XG5jb25zdCBTVUNDRVNTX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC8nO1xuY29uc3QgQ0FSRF9VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvY2FyZC9iYWxhbmNlQW5kVXNlcyc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBkYXRlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgY2hhcmdlZEFtb3VudDogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ2xuID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBhbW91bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLCAnJykpO1xuICAgIGN1cnJlbmN5ID0gU0hFS0VMX0NVUlJFTkNZO1xuICB9IGVsc2UgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IERPTExBUl9DVVJSRU5DWTtcbiAgfSBlbHNlIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoRVVST19DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShFVVJPX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IEVVUk9fQ1VSUkVOQ1k7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGFydHMgPSBhbW91bnRTdHJDbG4uc3BsaXQoJyAnKTtcbiAgICBbY3VycmVuY3ldID0gcGFydHM7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChwYXJ0c1sxXSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFtb3VudCxcbiAgICBjdXJyZW5jeSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICBkZWJ1ZyhgY29udmVydCAke3R4bnMubGVuZ3RofSByYXcgdHJhbnNhY3Rpb25zIHRvIG9mZmljaWFsIFRyYW5zYWN0aW9uIHN0cnVjdHVyZWApO1xuICByZXR1cm4gdHhucy5tYXAoKHR4bikgPT4ge1xuICAgIGNvbnN0IGNoYXJnZWRBbW91bnRUdXBsZSA9IGdldEFtb3VudERhdGEodHhuLmNoYXJnZWRBbW91bnQgfHwgJycpO1xuICAgIGNvbnN0IHR4blByb2Nlc3NlZERhdGUgPSBtb21lbnQodHhuLmRhdGUsIERBVEVfRk9STUFUKTtcblxuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBkYXRlOiB0eG5Qcm9jZXNzZWREYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcm9jZXNzZWREYXRlOiB0eG5Qcm9jZXNzZWREYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICBvcmlnaW5hbEFtb3VudDogY2hhcmdlZEFtb3VudFR1cGxlLmFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IGNoYXJnZWRBbW91bnRUdXBsZS5jdXJyZW5jeSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNoYXJnZWRBbW91bnRUdXBsZS5hbW91bnQsXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6IGNoYXJnZWRBbW91bnRUdXBsZS5jdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBtZW1vOiAnJyxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5pZGVudGlmaWVyLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnMocGFnZTogUGFnZSwgb3B0aW9uczogU2NyYXBlck9wdGlvbnMpIHtcbiAgYXdhaXQgcGFnZS5nb3RvKENBUkRfVVJMKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcucmVhY3QtbG9hZGluZy5oaWRlJywgZmFsc2UpO1xuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgY29uc3QgYWNjb3VudE51bWJlciA9IGF3YWl0IHBhZ2VFdmFsKHBhZ2UsICcud2FsbGV0LWRldGFpbHMgZGl2Om50aC1vZi10eXBlKDIpJywgbnVsbCwgKGVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gKGVsZW1lbnQgYXMgYW55KS5pbm5lclRleHQucmVwbGFjZSgn157Xodek16gg15vXqNeY15nXoSAnLCAnJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBwYWdlRXZhbChwYWdlLCAnLndhbGxldC1kZXRhaWxzIGRpdjpudGgtb2YtdHlwZSg0KSA+IHNwYW46bnRoLW9mLXR5cGUoMiknLCBudWxsLCAoZWxlbWVudCkgPT4ge1xuICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLmlubmVyVGV4dDtcbiAgfSk7XG5cbiAgZGVidWcoJ2ZldGNoIHJhdyB0cmFuc2FjdGlvbnMgZnJvbSBwYWdlJyk7XG5cbiAgY29uc3QgcmF3VHJhbnNhY3Rpb25zOiAoU2NyYXBlZFRyYW5zYWN0aW9uIHwgbnVsbClbXSA9IGF3YWl0IHBhZ2VFdmFsQWxsPChTY3JhcGVkVHJhbnNhY3Rpb24gfCBudWxsKVtdPihwYWdlLCAnLnRyYW5zYWN0aW9uLWNvbnRhaW5lciwgLnRyYW5zYWN0aW9uLWNvbXBvbmVudC1jb250YWluZXInLCBbXSwgKGl0ZW1zKSA9PiB7XG4gICAgcmV0dXJuIChpdGVtcykubWFwKChlbCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uczogTm9kZUxpc3RPZjxIVE1MU3BhbkVsZW1lbnQ+ID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLnRyYW5zYWN0aW9uLWl0ZW0gPiBzcGFuJyk7XG4gICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRlOiBjb2x1bW5zWzBdLmlubmVyVGV4dCxcbiAgICAgICAgICBpZGVudGlmaWVyOiBjb2x1bW5zWzFdLmlubmVyVGV4dCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogY29sdW1uc1szXS5pbm5lclRleHQsXG4gICAgICAgICAgdHlwZTogY29sdW1uc1s1XS5pbm5lclRleHQsXG4gICAgICAgICAgY2hhcmdlZEFtb3VudDogY29sdW1uc1s2XS5pbm5lclRleHQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfSk7XG4gIGRlYnVnKGBmZXRjaGVkICR7cmF3VHJhbnNhY3Rpb25zLmxlbmd0aH0gcmF3IHRyYW5zYWN0aW9ucyBmcm9tIHBhZ2VgKTtcblxuICBjb25zdCBhY2NvdW50VHJhbnNhY3Rpb25zID0gY29udmVydFRyYW5zYWN0aW9ucyhyYXdUcmFuc2FjdGlvbnMuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pIGFzIFNjcmFwZWRUcmFuc2FjdGlvbltdKTtcblxuICBkZWJ1ZygnZmlsZXIgb3V0IG9sZCB0cmFuc2FjdGlvbnMnKTtcbiAgY29uc3QgdHhucyA9IChvcHRpb25zLm91dHB1dERhdGE/LmVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSA/PyB0cnVlKSA/XG4gICAgZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGFjY291bnRUcmFuc2FjdGlvbnMsIHN0YXJ0TW9tZW50LCBmYWxzZSkgOlxuICAgIGFjY291bnRUcmFuc2FjdGlvbnM7XG4gIGRlYnVnKGBmb3VuZCAke3R4bnMubGVuZ3RofSB2YWxpZCB0cmFuc2FjdGlvbnMgb3V0IG9mICR7YWNjb3VudFRyYW5zYWN0aW9ucy5sZW5ndGh9IHRyYW5zYWN0aW9ucyBmb3IgYWNjb3VudCBlbmRpbmcgd2l0aCAke2FjY291bnROdW1iZXIuc3Vic3RyaW5nKGFjY291bnROdW1iZXIubGVuZ3RoIC0gMil9YCk7XG5cbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIGJhbGFuY2U6IGdldEFtb3VudERhdGEoYmFsYW5jZSkuYW1vdW50LFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbU1VDQ0VTU19VUkxdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF0gPSBbXTsgLy8gVE9ET1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gW107IC8vIFRPRE9cbiAgdXJsc1tMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yXSA9IFtdOyAvLyBUT0RPXG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI2xvZ2luSWQnLCB2YWx1ZTogY3JlZGVudGlhbHMuaWQgfSxcbiAgICB7IHNlbGVjdG9yOiAnI2xvZ2luUGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgaWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBCZXlhaGFkQmlzaHZpbGhhU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgcHJvdGVjdGVkIGdldFZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAxNTAwLFxuICAgICAgaGVpZ2h0OiA4MDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IExPR0lOX1VSTCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5wYWdlLiQoJ3hwYXRoLy9idXR0b25bY29udGFpbnMoLiwgXCLXlNeq15fXkdeoXCIpXScpO1xuICAgICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgICAgYXdhaXQgYnV0dG9uLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnModGhpcy5wYWdlLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHM6IFthY2NvdW50XSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJleWFoYWRCaXNodmlsaGFTY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQU9BLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLHFCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxjQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSx1QkFBQSxHQUFBTixPQUFBO0FBQThHLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRzlHLE1BQU1HLEtBQUssR0FBRyxJQUFBQyxlQUFRLEVBQUMsa0JBQWtCLENBQUM7QUFFMUMsTUFBTUMsV0FBVyxHQUFHLFVBQVU7QUFDOUIsTUFBTUMsU0FBUyxHQUFHLCtCQUErQjtBQUNqRCxNQUFNQyxXQUFXLEdBQUcsMEJBQTBCO0FBQzlDLE1BQU1DLFFBQVEsR0FBRyw2Q0FBNkM7QUFVOUQsU0FBU0MsYUFBYUEsQ0FBQ0MsU0FBaUIsRUFBRTtFQUN4QyxNQUFNQyxZQUFZLEdBQUdELFNBQVMsQ0FBQ0UsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDL0MsSUFBSUMsUUFBdUIsR0FBRyxJQUFJO0VBQ2xDLElBQUlDLE1BQXFCLEdBQUcsSUFBSTtFQUNoQyxJQUFJSCxZQUFZLENBQUNJLFFBQVEsQ0FBQ0MsaUNBQXNCLENBQUMsRUFBRTtJQUNqREYsTUFBTSxHQUFHRyxVQUFVLENBQUNOLFlBQVksQ0FBQ0MsT0FBTyxDQUFDSSxpQ0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRUgsUUFBUSxHQUFHSyww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
148
+ exports.default = BeyahadBishvilhaScraper;
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmV5YWhhZC1iaXNodmlsaGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmV5YWhhZC1iaXNodmlsaGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsNENBT3NCO0FBQ3RCLDRDQUE0QztBQUM1Qyw0RUFBZ0c7QUFDaEcsMERBQWdFO0FBQ2hFLGtEQUEwRjtBQUMxRiwyRUFBOEc7QUFHOUcsTUFBTSxLQUFLLEdBQUcsSUFBQSxnQkFBUSxFQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFM0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQy9CLE1BQU0sU0FBUyxHQUFHLCtCQUErQixDQUFDO0FBQ2xELE1BQU0sV0FBVyxHQUFHLDBCQUEwQixDQUFDO0FBQy9DLE1BQU0sUUFBUSxHQUFHLDZDQUE2QyxDQUFDO0FBVS9ELFNBQVMsYUFBYSxDQUFDLFNBQWlCO0lBQ3RDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELElBQUksUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDbkMsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQztJQUNqQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsa0NBQXNCLENBQUMsRUFBRTtRQUNqRCxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsa0NBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxRQUFRLEdBQUcsMkJBQWUsQ0FBQztLQUM1QjtTQUFNLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQ0FBc0IsQ0FBQyxFQUFFO1FBQ3hELE1BQU0sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQ0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLFFBQVEsR0FBRywyQkFBZSxDQUFDO0tBQzVCO1NBQU0sSUFBSSxZ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O1FBQ3JELE9BQU87WUFDTCxRQUFRLEVBQUUsU0FBUztZQUNuQixNQUFNLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1lBQ3RDLG9CQUFvQixFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7Z0JBQ3hFLElBQUksTUFBTSxFQUFFO29CQUNWLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUN0QjtZQUNILENBQUM7WUFDRCxlQUFlLEVBQUUsdUJBQXVCLEVBQUU7U0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQ3BCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxrQkFBZSx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQge1xuICBET0xMQVJfQ1VSUkVOQ1ksXG4gIERPTExBUl9DVVJSRU5DWV9TWU1CT0wsXG4gIEVVUk9fQ1VSUkVOQ1ksXG4gIEVVUk9fQ1VSUkVOQ1lfU1lNQk9MLFxuICBTSEVLRUxfQ1VSUkVOQ1ksXG4gIFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXREZWJ1ZyB9IGZyb20gJy4uL2hlbHBlcnMvZGVidWcnO1xuaW1wb3J0IHsgcGFnZUV2YWwsIHBhZ2VFdmFsQWxsLCB3YWl0VW50aWxFbGVtZW50Rm91bmQgfSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdiZXlhaGFkQmlzaHZpbGhhJyk7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZJztcbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC9sb2dpbic7XG5jb25zdCBTVUNDRVNTX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC8nO1xuY29uc3QgQ0FSRF9VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvY2FyZC9iYWxhbmNlQW5kVXNlcyc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBkYXRlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgY2hhcmdlZEFtb3VudDogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ2xuID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBhbW91bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLCAnJykpO1xuICAgIGN1cnJlbmN5ID0gU0hFS0VMX0NVUlJFTkNZO1xuICB9IGVsc2UgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IERPTExBUl9DVVJSRU5DWTtcbiAgfSBlbHNlIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoRVVST19DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShFVVJPX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IEVVUk9fQ1VSUkVOQ1k7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGFydHMgPSBhbW91bnRTdHJDbG4uc3BsaXQoJyAnKTtcbiAgICBbY3VycmVuY3ldID0gcGFydHM7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChwYXJ0c1sxXSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFtb3VudCxcbiAgICBjdXJyZW5jeSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICBkZWJ1ZyhgY29udmVydCAke3R4bnMubGVuZ3RofSByYXcgdHJhbnNhY3Rpb25zIHRvIG9mZmljaWFsIFRyYW5zYWN0aW9uIHN0cnVjdHVyZWApO1xuICByZXR1cm4gdHhucy5tYXAodHhuID0+IHtcbiAgICBjb25zdCBjaGFyZ2VkQW1vdW50VHVwbGUgPSBnZXRBbW91bnREYXRhKHR4bi5jaGFyZ2VkQW1vdW50IHx8ICcnKTtcbiAgICBjb25zdCB0eG5Qcm9jZXNzZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgZGF0ZTogdHhuUHJvY2Vzc2VkRGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogdHhuUHJvY2Vzc2VkRGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGNoYXJnZWRBbW91bnRUdXBsZS5hbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBjaGFyZ2VkQW1vdW50VHVwbGUuY3VycmVuY3ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBjaGFyZ2VkQW1vdW50VHVwbGUuYW1vdW50LFxuICAgICAgY2hhcmdlZEN1cnJlbmN5OiBjaGFyZ2VkQW1vdW50VHVwbGUuY3VycmVuY3ksXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgbWVtbzogJycsXG4gICAgICBpZGVudGlmaWVyOiB0eG4uaWRlbnRpZmllcixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zKSB7XG4gIGF3YWl0IHBhZ2UuZ290byhDQVJEX1VSTCk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnLnJlYWN0LWxvYWRpbmcuaGlkZScsIGZhbHNlKTtcbiAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJyk7XG4gIGNvbnN0IHN0YXJ0RGF0ZSA9IG9wdGlvbnMuc3RhcnREYXRlIHx8IGRlZmF1bHRTdGFydE1vbWVudC50b0RhdGUoKTtcbiAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBhd2FpdCBwYWdlRXZhbChwYWdlLCAnLndhbGxldC1kZXRhaWxzIGRpdjpudGgtb2YtdHlwZSgyKScsIG51bGwsIGVsZW1lbnQgPT4ge1xuICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLmlubmVyVGV4dC5yZXBsYWNlKCfXnteh16TXqCDXm9eo15jXmdehICcsICcnKTtcbiAgfSk7XG5cbiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHBhZ2VFdmFsKHBhZ2UsICcud2FsbGV0LWRldGFpbHMgZGl2Om50aC1vZi10eXBlKDQpID4gc3BhbjpudGgtb2YtdHlwZSgyKScsIG51bGwsIGVsZW1lbnQgPT4ge1xuICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLmlubmVyVGV4dDtcbiAgfSk7XG5cbiAgZGVidWcoJ2ZldGNoIHJhdyB0cmFuc2FjdGlvbnMgZnJvbSBwYWdlJyk7XG5cbiAgY29uc3QgcmF3VHJhbnNhY3Rpb25zOiAoU2NyYXBlZFRyYW5zYWN0aW9uIHwgbnVsbClbXSA9IGF3YWl0IHBhZ2VFdmFsQWxsPChTY3JhcGVkVHJhbnNhY3Rpb24gfCBudWxsKVtdPihcbiAgICBwYWdlLFxuICAgICcudHJhbnNhY3Rpb24tY29udGFpbmVyLCAudHJhbnNhY3Rpb24tY29tcG9uZW50LWNvbnRhaW5lcicsXG4gICAgW10sXG4gICAgaXRlbXMgPT4ge1xuICAgICAgcmV0dXJuIGl0ZW1zLm1hcChlbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IE5vZGVMaXN0T2Y8SFRNTFNwYW5FbGVtZW50PiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50cmFuc2FjdGlvbi1pdGVtID4gc3BhbicpO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0ZTogY29sdW1uc1swXS5pbm5lclRleHQsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBjb2x1bW5zWzFdLmlubmVyVGV4dCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb2x1bW5zWzNdLmlubmVyVGV4dCxcbiAgICAgICAgICAgIHR5cGU6IGNvbHVtbnNbNV0uaW5uZXJUZXh0LFxuICAgICAgICAgICAgY2hhcmdlZEFtb3VudDogY29sdW1uc1s2XS5pbm5lclRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG4gIGRlYnVnKGBmZXRjaGVkICR7cmF3VHJhbnNhY3Rpb25zLmxlbmd0aH0gcmF3IHRyYW5zYWN0aW9ucyBmcm9tIHBhZ2VgKTtcblxuICBjb25zdCBhY2NvdW50VHJhbnNhY3Rpb25zID0gY29udmVydFRyYW5zYWN0aW9ucyhyYXdUcmFuc2FjdGlvbnMuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKSBhcyBTY3JhcGVkVHJhbnNhY3Rpb25bXSk7XG5cbiAgZGVidWcoJ2ZpbGVyIG91dCBvbGQgdHJhbnNhY3Rpb25zJyk7XG4gIGNvbnN0IHR4bnMgPVxuICAgIChvcHRpb25zLm91dHB1dERhdGE/LmVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSA/PyB0cnVlKVxuICAgICAgPyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMoYWNjb3VudFRyYW5zYWN0aW9ucywgc3RhcnRNb21lbnQsIGZhbHNlKVxuICAgICAgOiBhY2NvdW50VHJhbnNhY3Rpb25zO1xuICBkZWJ1ZyhcbiAgICBgZm91bmQgJHt0eG5zLmxlbmd0aH0gdmFsaWQgdHJhbnNhY3Rpb25zIG91dCBvZiAke2FjY291bnRUcmFuc2FjdGlvbnMubGVuZ3RofSB0cmFuc2FjdGlvbnMgZm9yIGFjY291bnQgZW5kaW5nIHdpdGggJHthY2NvdW50TnVtYmVyLnN1YnN0cmluZyhhY2NvdW50TnVtYmVyLmxlbmd0aCAtIDIpfWAsXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIGJhbGFuY2U6IGdldEFtb3VudERhdGEoYmFsYW5jZSkuYW1vdW50LFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbU1VDQ0VTU19VUkxdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF0gPSBbXTsgLy8gVE9ET1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gW107IC8vIFRPRE9cbiAgdXJsc1tMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yXSA9IFtdOyAvLyBUT0RPXG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI2xvZ2luSWQnLCB2YWx1ZTogY3JlZGVudGlhbHMuaWQgfSxcbiAgICB7IHNlbGVjdG9yOiAnI2xvZ2luUGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgaWQ6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBCZXlhaGFkQmlzaHZpbGhhU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgcHJvdGVjdGVkIGdldFZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAxNTAwLFxuICAgICAgaGVpZ2h0OiA4MDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IExPR0lOX1VSTCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5wYWdlLiQoJ3hwYXRoLy9idXR0b25bY29udGFpbnMoLiwgXCLXlNeq15fXkdeoXCIpXScpO1xuICAgICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgICAgYXdhaXQgYnV0dG9uLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnModGhpcy5wYWdlLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHM6IFthY2NvdW50XSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJleWFoYWRCaXNodmlsaGFTY3JhcGVyO1xuIl19