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.
Files changed (79) hide show
  1. package/lib/assertNever.js +5 -7
  2. package/lib/constants.js +13 -16
  3. package/lib/definitions.js +109 -113
  4. package/lib/helpers/browser.js +9 -16
  5. package/lib/helpers/dates.js +18 -19
  6. package/lib/helpers/debug.js +9 -9
  7. package/lib/helpers/elements-interactions.js +78 -84
  8. package/lib/helpers/fetch.js +82 -89
  9. package/lib/helpers/navigation.js +24 -31
  10. package/lib/helpers/storage.js +10 -12
  11. package/lib/helpers/transactions.js +33 -35
  12. package/lib/helpers/waiting.js +45 -44
  13. package/lib/index.js +15 -82
  14. package/lib/scrapers/amex.js +11 -13
  15. package/lib/scrapers/base-beinleumi-group.js +233 -252
  16. package/lib/scrapers/base-isracard-amex.js +273 -286
  17. package/lib/scrapers/base-scraper-with-browser.js +240 -274
  18. package/lib/scrapers/base-scraper.js +82 -86
  19. package/lib/scrapers/behatsdaa.js +98 -107
  20. package/lib/scrapers/beinleumi.js +11 -20
  21. package/lib/scrapers/beyahad-bishvilha.js +132 -138
  22. package/lib/scrapers/discount.js +97 -103
  23. package/lib/scrapers/errors.js +22 -25
  24. package/lib/scrapers/factory.js +66 -67
  25. package/lib/scrapers/hapoalim.js +162 -182
  26. package/lib/scrapers/interface.js +2 -5
  27. package/lib/scrapers/isracard.js +11 -13
  28. package/lib/scrapers/leumi.js +167 -176
  29. package/lib/scrapers/massad.js +11 -20
  30. package/lib/scrapers/max.js +256 -268
  31. package/lib/scrapers/mercantile.js +14 -20
  32. package/lib/scrapers/mizrahi.js +158 -159
  33. package/lib/scrapers/one-zero-queries.js +4 -7
  34. package/lib/scrapers/one-zero.js +176 -240
  35. package/lib/scrapers/otsar-hahayal.js +11 -20
  36. package/lib/scrapers/pagi.js +11 -20
  37. package/lib/scrapers/union-bank.js +172 -179
  38. package/lib/scrapers/visa-cal.js +254 -263
  39. package/lib/scrapers/yahav.js +190 -211
  40. package/lib/transactions.js +13 -16
  41. package/package.json +12 -14
  42. package/lib/scrapers/amex.test.d.ts +0 -1
  43. package/lib/scrapers/amex.test.js +0 -54
  44. package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
  45. package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
  46. package/lib/scrapers/behatsdaa.test.d.ts +0 -1
  47. package/lib/scrapers/behatsdaa.test.js +0 -50
  48. package/lib/scrapers/beinleumi.test.d.ts +0 -1
  49. package/lib/scrapers/beinleumi.test.js +0 -52
  50. package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
  51. package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
  52. package/lib/scrapers/discount.test.d.ts +0 -1
  53. package/lib/scrapers/discount.test.js +0 -54
  54. package/lib/scrapers/factory.test.d.ts +0 -1
  55. package/lib/scrapers/factory.test.js +0 -19
  56. package/lib/scrapers/hapoalim.test.d.ts +0 -1
  57. package/lib/scrapers/hapoalim.test.js +0 -52
  58. package/lib/scrapers/isracard.test.d.ts +0 -1
  59. package/lib/scrapers/isracard.test.js +0 -54
  60. package/lib/scrapers/leumi.test.d.ts +0 -1
  61. package/lib/scrapers/leumi.test.js +0 -52
  62. package/lib/scrapers/max.test.d.ts +0 -1
  63. package/lib/scrapers/max.test.js +0 -71
  64. package/lib/scrapers/mercantile.test.d.ts +0 -1
  65. package/lib/scrapers/mercantile.test.js +0 -50
  66. package/lib/scrapers/mizrahi.test.d.ts +0 -1
  67. package/lib/scrapers/mizrahi.test.js +0 -58
  68. package/lib/scrapers/one-zero.test.d.ts +0 -1
  69. package/lib/scrapers/one-zero.test.js +0 -56
  70. package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
  71. package/lib/scrapers/otsar-hahayal.test.js +0 -52
  72. package/lib/scrapers/pagi.test.d.ts +0 -1
  73. package/lib/scrapers/pagi.test.js +0 -52
  74. package/lib/scrapers/union-bank.test.d.ts +0 -1
  75. package/lib/scrapers/union-bank.test.js +0 -52
  76. package/lib/scrapers/visa-cal.test.d.ts +0 -1
  77. package/lib/scrapers/visa-cal.test.js +0 -54
  78. package/lib/scrapers/yahav.test.d.ts +0 -1
  79. package/lib/scrapers/yahav.test.js +0 -54
@@ -1,296 +1,262 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.LoginResults = exports.BaseScraperWithBrowser = void 0;
7
- require("core-js/modules/es.array.iterator.js");
8
- require("core-js/modules/es.promise.js");
9
- require("core-js/modules/es.regexp.constructor.js");
10
- require("core-js/modules/es.regexp.exec.js");
11
- var _puppeteer = _interopRequireDefault(require("puppeteer"));
12
- var _definitions = require("../definitions");
13
- var _debug = require("../helpers/debug");
14
- var _elementsInteractions = require("../helpers/elements-interactions");
15
- var _navigation = require("../helpers/navigation");
16
- var _baseScraper = require("./base-scraper");
17
- var _errors = require("./errors");
18
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
- 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; }
22
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
23
- 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); }
24
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], t.indexOf(o) >= 0 || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
25
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.indexOf(n) >= 0) continue; t[n] = r[n]; } return t; }
26
- const debug = (0, _debug.getDebug)('base-scraper-with-browser');
27
- var LoginBaseResults = /*#__PURE__*/function (LoginBaseResults) {
28
- LoginBaseResults["Success"] = "SUCCESS";
29
- LoginBaseResults["UnknownError"] = "UNKNOWN_ERROR";
30
- return LoginBaseResults;
31
- }(LoginBaseResults || {});
32
- const {
33
- Timeout,
34
- Generic,
35
- General
36
- } = _errors.ScraperErrorTypes,
37
- rest = _objectWithoutProperties(_errors.ScraperErrorTypes, ["Timeout", "Generic", "General"]);
38
- const LoginResults = exports.LoginResults = _objectSpread(_objectSpread({}, rest), LoginBaseResults);
39
-
40
- // eslint-disable-next-line @typescript-eslint/no-redeclare
41
-
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
+ exports.BaseScraperWithBrowser = exports.LoginResults = void 0;
7
+ const puppeteer_1 = __importDefault(require("puppeteer"));
8
+ const definitions_1 = require("../definitions");
9
+ const debug_1 = require("../helpers/debug");
10
+ const elements_interactions_1 = require("../helpers/elements-interactions");
11
+ const navigation_1 = require("../helpers/navigation");
12
+ const base_scraper_1 = require("./base-scraper");
13
+ const errors_1 = require("./errors");
14
+ const debug = (0, debug_1.getDebug)('base-scraper-with-browser');
15
+ var LoginBaseResults;
16
+ (function (LoginBaseResults) {
17
+ LoginBaseResults["Success"] = "SUCCESS";
18
+ LoginBaseResults["UnknownError"] = "UNKNOWN_ERROR";
19
+ })(LoginBaseResults || (LoginBaseResults = {}));
20
+ const { Timeout, Generic, General, ...rest } = errors_1.ScraperErrorTypes;
21
+ exports.LoginResults = {
22
+ ...rest,
23
+ ...LoginBaseResults,
24
+ };
42
25
  async function getKeyByValue(object, value, page) {
43
- const keys = Object.keys(object);
44
- for (const key of keys) {
45
- // @ts-ignore
46
- const conditions = object[key];
47
- for (const condition of conditions) {
48
- let result = false;
49
- if (condition instanceof RegExp) {
50
- result = condition.test(value);
51
- } else if (typeof condition === 'function') {
52
- result = await condition({
53
- page,
54
- value
55
- });
56
- } else {
57
- result = value.toLowerCase() === condition.toLowerCase();
58
- }
59
- if (result) {
26
+ const keys = Object.keys(object);
27
+ for (const key of keys) {
60
28
  // @ts-ignore
61
- return Promise.resolve(key);
62
- }
29
+ const conditions = object[key];
30
+ for (const condition of conditions) {
31
+ let result = false;
32
+ if (condition instanceof RegExp) {
33
+ result = condition.test(value);
34
+ }
35
+ else if (typeof condition === 'function') {
36
+ result = await condition({ page, value });
37
+ }
38
+ else {
39
+ result = value.toLowerCase() === condition.toLowerCase();
40
+ }
41
+ if (result) {
42
+ // @ts-ignore
43
+ return Promise.resolve(key);
44
+ }
45
+ }
63
46
  }
64
- }
65
- return Promise.resolve(LoginResults.UnknownError);
47
+ return Promise.resolve(exports.LoginResults.UnknownError);
66
48
  }
67
49
  function createGeneralError() {
68
- return {
69
- success: false,
70
- errorType: _errors.ScraperErrorTypes.General
71
- };
50
+ return {
51
+ success: false,
52
+ errorType: errors_1.ScraperErrorTypes.General,
53
+ };
72
54
  }
73
- class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
74
- constructor(...args) {
75
- super(...args);
76
- _defineProperty(this, "cleanups", []);
77
- _defineProperty(this, "defaultViewportSize", {
78
- width: 1024,
79
- height: 768
80
- });
55
+ class BaseScraperWithBrowser extends base_scraper_1.BaseScraper {
56
+ cleanups = [];
57
+ defaultViewportSize = {
58
+ width: 1024,
59
+ height: 768,
60
+ };
81
61
  // NOTICE - it is discouraged to use bang (!) in general. It is used here because
82
62
  // all the classes that inherit from this base assume is it mandatory.
83
- _defineProperty(this, "page", void 0);
84
- }
85
- getViewPort() {
86
- var _this$options$viewpor;
87
- return (_this$options$viewpor = this.options.viewportSize) !== null && _this$options$viewpor !== void 0 ? _this$options$viewpor : this.defaultViewportSize;
88
- }
89
- async initialize() {
90
- await super.initialize();
91
- debug('initialize scraper');
92
- this.emitProgress(_definitions.ScraperProgressTypes.Initializing);
93
- const page = await this.initializePage();
94
- await page.setCacheEnabled(false); // Clear cache and avoid 300's response status
95
-
96
- if (!page) {
97
- debug('failed to initiate a browser page, exit');
98
- return;
99
- }
100
- this.page = page;
101
- this.cleanups.push(() => page.close());
102
- if (this.options.defaultTimeout) {
103
- this.page.setDefaultTimeout(this.options.defaultTimeout);
63
+ page;
64
+ getViewPort() {
65
+ return this.options.viewportSize ?? this.defaultViewportSize;
104
66
  }
105
- if (this.options.preparePage) {
106
- debug("execute 'preparePage' interceptor provided in options");
107
- await this.options.preparePage(this.page);
108
- }
109
- const viewport = this.getViewPort();
110
- debug(`set viewport to width ${viewport.width}, height ${viewport.height}`);
111
- await this.page.setViewport({
112
- width: viewport.width,
113
- height: viewport.height
114
- });
115
- this.page.on('requestfailed', request => {
116
- var _request$failure;
117
- debug('Request failed: %s %s', (_request$failure = request.failure()) === null || _request$failure === void 0 ? void 0 : _request$failure.errorText, request.url());
118
- });
119
- }
120
- async initializePage() {
121
- debug('initialize browser page');
122
- if ('browserContext' in this.options) {
123
- debug('Using the browser context provided in options');
124
- return this.options.browserContext.newPage();
67
+ async initialize() {
68
+ await super.initialize();
69
+ debug('initialize scraper');
70
+ this.emitProgress(definitions_1.ScraperProgressTypes.Initializing);
71
+ const page = await this.initializePage();
72
+ await page.setCacheEnabled(false); // Clear cache and avoid 300's response status
73
+ if (!page) {
74
+ debug('failed to initiate a browser page, exit');
75
+ return;
76
+ }
77
+ this.page = page;
78
+ this.cleanups.push(() => page.close());
79
+ if (this.options.defaultTimeout) {
80
+ this.page.setDefaultTimeout(this.options.defaultTimeout);
81
+ }
82
+ if (this.options.preparePage) {
83
+ debug("execute 'preparePage' interceptor provided in options");
84
+ await this.options.preparePage(this.page);
85
+ }
86
+ const viewport = this.getViewPort();
87
+ debug(`set viewport to width ${viewport.width}, height ${viewport.height}`);
88
+ await this.page.setViewport({
89
+ width: viewport.width,
90
+ height: viewport.height,
91
+ });
92
+ this.page.on('requestfailed', request => {
93
+ debug('Request failed: %s %s', request.failure()?.errorText, request.url());
94
+ });
125
95
  }
126
- if ('browser' in this.options) {
127
- debug('Using the browser instance provided in options');
128
- const {
129
- browser
130
- } = this.options;
131
-
132
- /**
133
- * For backward compatibility, we will close the browser even if we didn't create it
134
- */
135
- if (!this.options.skipCloseBrowser) {
96
+ async initializePage() {
97
+ debug('initialize browser page');
98
+ if ('browserContext' in this.options) {
99
+ debug('Using the browser context provided in options');
100
+ return this.options.browserContext.newPage();
101
+ }
102
+ if ('browser' in this.options) {
103
+ debug('Using the browser instance provided in options');
104
+ const { browser } = this.options;
105
+ /**
106
+ * For backward compatibility, we will close the browser even if we didn't create it
107
+ */
108
+ if (!this.options.skipCloseBrowser) {
109
+ this.cleanups.push(async () => {
110
+ debug('closing the browser');
111
+ await browser.close();
112
+ });
113
+ }
114
+ return browser.newPage();
115
+ }
116
+ const { timeout, args, executablePath, showBrowser } = this.options;
117
+ const headless = !showBrowser;
118
+ debug(`launch a browser with headless mode = ${headless}`);
119
+ const browser = await puppeteer_1.default.launch({
120
+ env: this.options.verbose ? { DEBUG: '*', ...process.env } : undefined,
121
+ headless,
122
+ executablePath,
123
+ args,
124
+ timeout,
125
+ });
136
126
  this.cleanups.push(async () => {
137
- debug('closing the browser');
138
- await browser.close();
127
+ debug('closing the browser');
128
+ await browser.close();
139
129
  });
140
- }
141
- return browser.newPage();
142
- }
143
- const {
144
- timeout,
145
- args,
146
- executablePath,
147
- showBrowser
148
- } = this.options;
149
- const headless = !showBrowser;
150
- debug(`launch a browser with headless mode = ${headless}`);
151
- const browser = await _puppeteer.default.launch({
152
- env: this.options.verbose ? _objectSpread({
153
- DEBUG: '*'
154
- }, process.env) : undefined,
155
- headless,
156
- executablePath,
157
- args,
158
- timeout
159
- });
160
- this.cleanups.push(async () => {
161
- debug('closing the browser');
162
- await browser.close();
163
- });
164
- if (this.options.prepareBrowser) {
165
- debug("execute 'prepareBrowser' interceptor provided in options");
166
- await this.options.prepareBrowser(browser);
167
- }
168
- debug('create a new browser page');
169
- return browser.newPage();
170
- }
171
- async navigateTo(url, waitUntil = 'load', retries = (_this$options$navigat => (_this$options$navigat = this.options.navigationRetryCount) !== null && _this$options$navigat !== void 0 ? _this$options$navigat : 0)()) {
172
- var _this$page;
173
- const response = await ((_this$page = this.page) === null || _this$page === void 0 ? void 0 : _this$page.goto(url, {
174
- waitUntil
175
- }));
176
- if (response === null) {
177
- // note: response will be null when navigating to same url while changing the hash part.
178
- // the condition below will always accept null as valid result.
179
- return;
180
- }
181
- if (!response) {
182
- throw new Error(`Error while trying to navigate to url ${url}, response is undefined`);
183
- }
184
- if (!response.ok()) {
185
- const status = response.status();
186
- if (retries > 0) {
187
- debug(`Failed to navigate to url ${url}, status code: ${status}, retrying ${retries} more times`);
188
- await this.navigateTo(url, waitUntil, retries - 1);
189
- } else {
190
- throw new Error(`Failed to navigate to url ${url}, status code: ${status}`);
191
- }
192
- }
193
- }
194
-
195
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
196
- getLoginOptions(_credentials) {
197
- throw new Error(`getLoginOptions() is not created in ${this.options.companyId}`);
198
- }
199
- async fillInputs(pageOrFrame, fields) {
200
- const modified = [...fields];
201
- const input = modified.shift();
202
- if (!input) {
203
- return;
204
- }
205
- await (0, _elementsInteractions.fillInput)(pageOrFrame, input.selector, input.value);
206
- if (modified.length) {
207
- await this.fillInputs(pageOrFrame, modified);
208
- }
209
- }
210
- async login(credentials) {
211
- if (!credentials || !this.page) {
212
- return createGeneralError();
213
- }
214
- debug('execute login process');
215
- const loginOptions = this.getLoginOptions(credentials);
216
- if (loginOptions.userAgent) {
217
- debug('set custom user agent provided in options');
218
- await this.page.setUserAgent(loginOptions.userAgent);
130
+ if (this.options.prepareBrowser) {
131
+ debug("execute 'prepareBrowser' interceptor provided in options");
132
+ await this.options.prepareBrowser(browser);
133
+ }
134
+ debug('create a new browser page');
135
+ return browser.newPage();
219
136
  }
220
- debug('navigate to login url');
221
- await this.navigateTo(loginOptions.loginUrl, loginOptions.waitUntil);
222
- if (loginOptions.checkReadiness) {
223
- debug("execute 'checkReadiness' interceptor provided in login options");
224
- await loginOptions.checkReadiness();
225
- } else if (typeof loginOptions.submitButtonSelector === 'string') {
226
- debug('wait until submit button is available');
227
- await (0, _elementsInteractions.waitUntilElementFound)(this.page, loginOptions.submitButtonSelector);
137
+ async navigateTo(url, waitUntil = 'load', retries = this.options.navigationRetryCount ?? 0) {
138
+ const response = await this.page?.goto(url, { waitUntil });
139
+ if (response === null) {
140
+ // note: response will be null when navigating to same url while changing the hash part.
141
+ // the condition below will always accept null as valid result.
142
+ return;
143
+ }
144
+ if (!response) {
145
+ throw new Error(`Error while trying to navigate to url ${url}, response is undefined`);
146
+ }
147
+ if (!response.ok()) {
148
+ const status = response.status();
149
+ if (retries > 0) {
150
+ debug(`Failed to navigate to url ${url}, status code: ${status}, retrying ${retries} more times`);
151
+ await this.navigateTo(url, waitUntil, retries - 1);
152
+ }
153
+ else {
154
+ throw new Error(`Failed to navigate to url ${url}, status code: ${status}`);
155
+ }
156
+ }
228
157
  }
229
- let loginFrameOrPage = this.page;
230
- if (loginOptions.preAction) {
231
- debug("execute 'preAction' interceptor provided in login options");
232
- loginFrameOrPage = (await loginOptions.preAction()) || this.page;
158
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
159
+ getLoginOptions(_credentials) {
160
+ throw new Error(`getLoginOptions() is not created in ${this.options.companyId}`);
233
161
  }
234
- debug('fill login components input with relevant values');
235
- await this.fillInputs(loginFrameOrPage, loginOptions.fields);
236
- debug('click on login submit button');
237
- if (typeof loginOptions.submitButtonSelector === 'string') {
238
- await (0, _elementsInteractions.clickButton)(loginFrameOrPage, loginOptions.submitButtonSelector);
239
- } else {
240
- await loginOptions.submitButtonSelector();
162
+ async fillInputs(pageOrFrame, fields) {
163
+ const modified = [...fields];
164
+ const input = modified.shift();
165
+ if (!input) {
166
+ return;
167
+ }
168
+ await (0, elements_interactions_1.fillInput)(pageOrFrame, input.selector, input.value);
169
+ if (modified.length) {
170
+ await this.fillInputs(pageOrFrame, modified);
171
+ }
241
172
  }
242
- this.emitProgress(_definitions.ScraperProgressTypes.LoggingIn);
243
- if (loginOptions.postAction) {
244
- debug("execute 'postAction' interceptor provided in login options");
245
- await loginOptions.postAction();
246
- } else {
247
- debug('wait for page navigation');
248
- await (0, _navigation.waitForNavigation)(this.page);
173
+ async login(credentials) {
174
+ if (!credentials || !this.page) {
175
+ return createGeneralError();
176
+ }
177
+ debug('execute login process');
178
+ const loginOptions = this.getLoginOptions(credentials);
179
+ if (loginOptions.userAgent) {
180
+ debug('set custom user agent provided in options');
181
+ await this.page.setUserAgent(loginOptions.userAgent);
182
+ }
183
+ debug('navigate to login url');
184
+ await this.navigateTo(loginOptions.loginUrl, loginOptions.waitUntil);
185
+ if (loginOptions.checkReadiness) {
186
+ debug("execute 'checkReadiness' interceptor provided in login options");
187
+ await loginOptions.checkReadiness();
188
+ }
189
+ else if (typeof loginOptions.submitButtonSelector === 'string') {
190
+ debug('wait until submit button is available');
191
+ await (0, elements_interactions_1.waitUntilElementFound)(this.page, loginOptions.submitButtonSelector);
192
+ }
193
+ let loginFrameOrPage = this.page;
194
+ if (loginOptions.preAction) {
195
+ debug("execute 'preAction' interceptor provided in login options");
196
+ loginFrameOrPage = (await loginOptions.preAction()) || this.page;
197
+ }
198
+ debug('fill login components input with relevant values');
199
+ await this.fillInputs(loginFrameOrPage, loginOptions.fields);
200
+ debug('click on login submit button');
201
+ if (typeof loginOptions.submitButtonSelector === 'string') {
202
+ await (0, elements_interactions_1.clickButton)(loginFrameOrPage, loginOptions.submitButtonSelector);
203
+ }
204
+ else {
205
+ await loginOptions.submitButtonSelector();
206
+ }
207
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoggingIn);
208
+ if (loginOptions.postAction) {
209
+ debug("execute 'postAction' interceptor provided in login options");
210
+ await loginOptions.postAction();
211
+ }
212
+ else {
213
+ debug('wait for page navigation');
214
+ await (0, navigation_1.waitForNavigation)(this.page);
215
+ }
216
+ debug('check login result');
217
+ const current = await (0, navigation_1.getCurrentUrl)(this.page, true);
218
+ const loginResult = await getKeyByValue(loginOptions.possibleResults, current, this.page);
219
+ debug(`handle login results ${loginResult}`);
220
+ return this.handleLoginResult(loginResult);
249
221
  }
250
- debug('check login result');
251
- const current = await (0, _navigation.getCurrentUrl)(this.page, true);
252
- const loginResult = await getKeyByValue(loginOptions.possibleResults, current, this.page);
253
- debug(`handle login results ${loginResult}`);
254
- return this.handleLoginResult(loginResult);
255
- }
256
- async terminate(_success) {
257
- debug(`terminating browser with success = ${_success}`);
258
- this.emitProgress(_definitions.ScraperProgressTypes.Terminating);
259
- if (!_success && !!this.options.storeFailureScreenShotPath) {
260
- debug(`create a snapshot before terminated in ${this.options.storeFailureScreenShotPath}`);
261
- await this.page.screenshot({
262
- path: this.options.storeFailureScreenShotPath,
263
- fullPage: true
264
- });
222
+ async terminate(_success) {
223
+ debug(`terminating browser with success = ${_success}`);
224
+ this.emitProgress(definitions_1.ScraperProgressTypes.Terminating);
225
+ if (!_success && !!this.options.storeFailureScreenShotPath) {
226
+ debug(`create a snapshot before terminated in ${this.options.storeFailureScreenShotPath}`);
227
+ await this.page.screenshot({
228
+ path: this.options.storeFailureScreenShotPath,
229
+ fullPage: true,
230
+ });
231
+ }
232
+ await Promise.all(this.cleanups.reverse().map(cleanup => cleanup()));
233
+ this.cleanups = [];
265
234
  }
266
- await Promise.all(this.cleanups.reverse().map(cleanup => cleanup()));
267
- this.cleanups = [];
268
- }
269
- handleLoginResult(loginResult) {
270
- switch (loginResult) {
271
- case LoginResults.Success:
272
- this.emitProgress(_definitions.ScraperProgressTypes.LoginSuccess);
273
- return {
274
- success: true
275
- };
276
- case LoginResults.InvalidPassword:
277
- case LoginResults.UnknownError:
278
- this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
279
- return {
280
- success: false,
281
- errorType: loginResult === LoginResults.InvalidPassword ? _errors.ScraperErrorTypes.InvalidPassword : _errors.ScraperErrorTypes.General,
282
- errorMessage: `Login failed with ${loginResult} error`
283
- };
284
- case LoginResults.ChangePassword:
285
- this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
286
- return {
287
- success: false,
288
- errorType: _errors.ScraperErrorTypes.ChangePassword
289
- };
290
- default:
291
- throw new Error(`unexpected login result "${loginResult}"`);
235
+ handleLoginResult(loginResult) {
236
+ switch (loginResult) {
237
+ case exports.LoginResults.Success:
238
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoginSuccess);
239
+ return { success: true };
240
+ case exports.LoginResults.InvalidPassword:
241
+ case exports.LoginResults.UnknownError:
242
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoginFailed);
243
+ return {
244
+ success: false,
245
+ errorType: loginResult === exports.LoginResults.InvalidPassword
246
+ ? errors_1.ScraperErrorTypes.InvalidPassword
247
+ : errors_1.ScraperErrorTypes.General,
248
+ errorMessage: `Login failed with ${loginResult} error`,
249
+ };
250
+ case exports.LoginResults.ChangePassword:
251
+ this.emitProgress(definitions_1.ScraperProgressTypes.ChangePassword);
252
+ return {
253
+ success: false,
254
+ errorType: errors_1.ScraperErrorTypes.ChangePassword,
255
+ };
256
+ default:
257
+ throw new Error(`unexpected login result "${loginResult}"`);
258
+ }
292
259
  }
293
- }
294
260
  }
295
261
  exports.BaseScraperWithBrowser = BaseScraperWithBrowser;
296
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHVwcGV0ZWVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZGVmaW5pdGlvbnMiLCJfZGVidWciLCJfZWxlbWVudHNJbnRlcmFjdGlvbnMiLCJfbmF2aWdhdGlvbiIsIl9iYXNlU2NyYXBlciIsIl9lcnJvcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJvd25LZXlzIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJuIiwiaW5kZXhPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiaGFzT3duUHJvcGVydHkiLCJkZWJ1ZyIsImdldERlYnVnIiwiTG9naW5CYXNlUmVzdWx0cyIsIlRpbWVvdXQiLCJHZW5lcmljIiwiR2VuZXJhbCIsIlNjcmFwZXJFcnJvclR5cGVzIiwicmVzdCIsIkxvZ2luUmVzdWx0cyIsImV4cG9ydHMiLCJnZXRLZXlCeVZhbHVlIiwib2JqZWN0IiwicGFnZSIsImtleSIsImNvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJyZXN1bHQiLCJSZWdFeHAiLCJ0ZXN0IiwidG9Mb3dlckNhc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlVua25vd25FcnJvciIsImNyZWF0ZUdlbmVyYWxFcnJvciIsInN1Y2Nlc3MiLCJlcnJvclR5cGUiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiQmFzZVNjcmFwZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ3aWR0aCIsImhlaWdodCIsImdldFZpZXdQb3J0IiwiX3RoaXMkb3B0aW9ucyR2aWV3cG9yIiwib3B0aW9ucyIsInZpZXdwb3J0U2l6ZSIsImRlZmF1bHRWaWV3cG9ydFNpemUiLCJpbml0aWFsaXplIiwiZW1pdFByb2dyZXNzIiwiU2NyYXBlclByb2dyZXNzVHlwZXMiLCJJbml0aWFsaXppbmciLCJpbml0aWFsaXplUGFnZSIsInNldENhY2hlRW5hYmxlZCIsImNsZWFudXBzIiwiY2xvc2UiLCJkZWZhdWx0VGltZW91dCIsInNldERlZmF1bHRUaW1lb3V0IiwicHJlcGFyZVBhZ2UiLCJ2aWV3cG9ydCIsInNldFZpZXdwb3J0Iiwib24iLCJyZXF1ZXN0IiwiX3JlcXVlc3QkZmFpbHVyZSIsImZhaWx1cmUiLCJlcnJvclRleHQiLCJ1cmwiLCJicm93c2VyQ29udGV4dCIsIm5ld1BhZ2UiLCJicm93c2VyIiwic2tpcENsb3NlQnJvd3NlciIsInRpbWVvdXQiLCJleGVjdXRhYmxlUGF0aCIsInNob3dCcm93c2VyIiwiaGVhZGxlc3MiLCJwdXBwZXRlZXIiLCJsYXVuY2giLCJlbnYiLCJ2ZXJib3NlIiwiREVCVUciLCJwcm9jZXNzIiwidW5kZWZpbmVkIiwicHJlcGFyZUJyb3dzZXIiLCJuYXZpZ2F0ZVRvIiwid2FpdFVudGlsIiwicmV0cmllcyIsIl90aGlzJG9wdGlvbnMkbmF2aWdhdCIsIm5hdmlnYXRpb25SZXRyeUNvdW50IiwiX3RoaXMkcGFnZSIsInJlc3BvbnNlIiwiZ290byIsIkVycm9yIiwib2siLCJzdGF0dXMiLCJnZXRMb2dpbk9wdGlvbnMiLCJfY3JlZGVudGlhbHMiLCJjb21wYW55SWQiLCJmaWxsSW5wdXRzIiwicGFnZU9yRnJhbWUiLCJmaWVsZHMiLCJtb2RpZmllZCIsImlucHV0Iiwic2hpZnQiLCJmaWxsSW5wdXQiLCJzZWxlY3RvciIsImxvZ2luIiwiY3JlZGVudGlhbHMiLCJsb2dpbk9wdGlvbnMiLCJ1c2VyQWdlbnQiLCJzZXRVc2VyQWdlbnQiLCJsb2dpblVybCIsImNoZWNrUmVhZGluZXNzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJ3YWl0VW50aWxFbGVtZW50Rm91bmQiLCJsb2dpbkZyYW1lT3JQYWdlIiwicHJlQWN0aW9uIiwiY2xpY2tCdXR0b24iLCJMb2dnaW5nSW4iLCJwb3N0QWN0aW9uIiwid2FpdEZvck5hdmlnYXRpb24iLCJjdXJyZW50IiwiZ2V0Q3VycmVudFVybCIsImxvZ2luUmVzdWx0IiwicG9zc2libGVSZXN1bHRzIiwiaGFuZGxlTG9naW5SZXN1bHQiLCJ0ZXJtaW5hdGUiLCJfc3VjY2VzcyIsIlRlcm1pbmF0aW5nIiwic3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGgiLCJzY3JlZW5zaG90IiwicGF0aCIsImZ1bGxQYWdlIiwiYWxsIiwicmV2ZXJzZSIsIm1hcCIsImNsZWFudXAiLCJTdWNjZXNzIiwiTG9naW5TdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiTG9naW5GYWlsZWQiLCJlcnJvck1lc3NhZ2UiLCJDaGFuZ2VQYXNzd29yZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBGcmFtZSwgdHlwZSBQYWdlLCB0eXBlIFB1cHBldGVlckxpZmVDeWNsZUV2ZW50IH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBmaWxsSW5wdXQsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXInO1xuaW1wb3J0IHsgU2NyYXBlckVycm9yVHlwZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJDcmVkZW50aWFscywgdHlwZSBTY3JhcGVyU2NyYXBpbmdSZXN1bHQgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInKTtcblxuZW51bSBMb2dpbkJhc2VSZXN1bHRzIHtcbiAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgVW5rbm93bkVycm9yID0gJ1VOS05PV05fRVJST1InLFxufVxuXG5jb25zdCB7XG4gIFRpbWVvdXQsIEdlbmVyaWMsIEdlbmVyYWwsIC4uLnJlc3Rcbn0gPSBTY3JhcGVyRXJyb3JUeXBlcztcbmV4cG9ydCBjb25zdCBMb2dpblJlc3VsdHMgPSB7XG4gIC4uLnJlc3QsXG4gIC4uLkxvZ2luQmFzZVJlc3VsdHMsXG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZGVjbGFyZVxuZXhwb3J0IHR5cGUgTG9naW5SZXN1bHRzID1cbiAgfCBFeGNsdWRlPFNjcmFwZXJFcnJvclR5cGVzLCBTY3JhcGVyRXJyb3JUeXBlcy5UaW1lb3V0IHwgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJpYyB8IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWw+XG4gIHwgTG9naW5CYXNlUmVzdWx0cztcblxuZXhwb3J0IHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgPSB7XG4gIFtrZXkgaW4gTG9naW5SZXN1bHRzXT86IChzdHJpbmcgfCBSZWdFeHAgfCAoKG9wdGlvbnM/OiB7IHBhZ2U/OiBQYWdlIH0pID0+IFByb21pc2U8Ym9vbGVhbj4pKVtdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpbk9wdGlvbnMge1xuICBsb2dpblVybDogc3RyaW5nO1xuICBjaGVja1JlYWRpbmVzcz86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIGZpZWxkczogeyBzZWxlY3Rvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH1bXTtcbiAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHZvaWQ+KTtcbiAgcHJlQWN0aW9uPzogKCkgPT4gUHJvbWlzZTxGcmFtZSB8IHZvaWQ+O1xuICBwb3N0QWN0aW9uPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcG9zc2libGVSZXN1bHRzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICB3YWl0VW50aWw/OiBQdXBwZXRlZXJMaWZlQ3ljbGVFdmVudDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0S2V5QnlWYWx1ZShvYmplY3Q6IFBvc3NpYmxlTG9naW5SZXN1bHRzLCB2YWx1ZTogc3RyaW5nLCBwYWdlOiBQYWdlKTogUHJvbWlzZTxMb2dpblJlc3VsdHM+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IG9iamVjdFtrZXldO1xuXG4gICAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICBpZiAoY29uZGl0aW9uIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi50ZXN0KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBjb25kaXRpb24oeyBwYWdlLCB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IGNvbmRpdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoTG9naW5SZXN1bHRzLlVua25vd25FcnJvcik7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdlbmVyYWxFcnJvcigpOiBTY3JhcGVyU2NyYXBpbmdSZXN1bHQge1xuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuR2VuZXJhbCxcbiAgfTtcbn1cblxuY2xhc3MgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxUQ3JlZGVudGlhbHMgZXh0ZW5kcyBTY3JhcGVyQ3JlZGVudGlhbHM+IGV4dGVuZHMgQmFzZVNjcmFwZXI8VENyZWRlbnRpYWxzPiB7XG4gIHByaXZhdGUgY2xlYW51cHM6IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4+ID0gW107XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Vmlld3BvcnRTaXplID0ge1xuICAgIHdpZHRoOiAxMDI0LFxuICAgIGhlaWdodDogNzY4LFxuICB9O1xuXG4gIC8vIE5PVElDRSAtIGl0IGlzIGRpc2NvdXJhZ2VkIHRvIHVzZSBiYW5nICghKSBpbiBnZW5lcmFsLiBJdCBpcyB1c2VkIGhlcmUgYmVjYXVzZVxuICAvLyBhbGwgdGhlIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyBiYXNlIGFzc3VtZSBpcyBpdCBtYW5kYXRvcnkuXG4gIHByb3RlY3RlZCBwYWdlITogUGFnZTtcblxuICBwcm90ZWN0ZWQgZ2V0Vmlld1BvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy52aWV3cG9ydFNpemUgPz8gdGhpcy5kZWZhdWx0Vmlld3BvcnRTaXplO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgZGVidWcoJ2luaXRpYWxpemUgc2NyYXBlcicpO1xuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkluaXRpYWxpemluZyk7XG5cbiAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5pbml0aWFsaXplUGFnZSgpO1xuICAgIGF3YWl0IHBhZ2Uuc2V0Q2FjaGVFbmFibGVkKGZhbHNlKTsgLy8gQ2xlYXIgY2FjaGUgYW5kIGF2b2lkIDMwMCdzIHJlc3BvbnNlIHN0YXR1c1xuXG4gICAgaWYgKCFwYWdlKSB7XG4gICAgICBkZWJ1ZygnZmFpbGVkIHRvIGluaXRpYXRlIGEgYnJvd3NlciBwYWdlLCBleGl0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wYWdlID0gcGFnZTtcblxuICAgIHRoaXMuY2xlYW51cHMucHVzaCgoKSA9PiBwYWdlLmNsb3NlKCkpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWZhdWx0VGltZW91dCkge1xuICAgICAgdGhpcy5wYWdlLnNldERlZmF1bHRUaW1lb3V0KHRoaXMub3B0aW9ucy5kZWZhdWx0VGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlUGFnZSkge1xuICAgICAgZGVidWcoXCJleGVjdXRlICdwcmVwYXJlUGFnZScgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5wcmVwYXJlUGFnZSh0aGlzLnBhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3UG9ydCgpO1xuICAgIGRlYnVnKGBzZXQgdmlld3BvcnQgdG8gd2lkdGggJHt2aWV3cG9ydC53aWR0aH0sIGhlaWdodCAke3ZpZXdwb3J0LmhlaWdodH1gKTtcbiAgICBhd2FpdCB0aGlzLnBhZ2Uuc2V0Vmlld3BvcnQoe1xuICAgICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhZ2Uub24oJ3JlcXVlc3RmYWlsZWQnLCAocmVxdWVzdCkgPT4ge1xuICAgICAgZGVidWcoJ1JlcXVlc3QgZmFpbGVkOiAlcyAlcycsIHJlcXVlc3QuZmFpbHVyZSgpPy5lcnJvclRleHQsIHJlcXVlc3QudXJsKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUGFnZSgpIHtcbiAgICBkZWJ1ZygnaW5pdGlhbGl6ZSBicm93c2VyIHBhZ2UnKTtcbiAgICBpZiAoJ2Jyb3dzZXJDb250ZXh0JyBpbiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgIGRlYnVnKCdVc2luZyB0aGUgYnJvd3NlciBjb250ZXh0IHByb3ZpZGVkIGluIG9wdGlvbnMnKTtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYnJvd3NlckNvbnRleHQubmV3UGFnZSgpO1xuICAgIH1cblxuICAgIGlmICgnYnJvd3NlcicgaW4gdGhpcy5vcHRpb25zKSB7XG4gICAgICBkZWJ1ZygnVXNpbmcgdGhlIGJyb3dzZXIgaW5zdGFuY2UgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgY29uc3QgeyBicm93c2VyIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIC8qKlxuICAgICAgICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlIHdpbGwgY2xvc2UgdGhlIGJyb3dzZXIgZXZlbiBpZiB3ZSBkaWRuJ3QgY3JlYXRlIGl0XG4gICAgICAgKi9cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnNraXBDbG9zZUJyb3dzZXIpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwcy5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBkZWJ1ZygnY2xvc2luZyB0aGUgYnJvd3NlcicpO1xuICAgICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRpbWVvdXQsIGFyZ3MsIGV4ZWN1dGFibGVQYXRoLCBzaG93QnJvd3NlciB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgY29uc3QgaGVhZGxlc3MgPSAhc2hvd0Jyb3dzZXI7XG4gICAgZGVidWcoYGxhdW5jaCBhIGJyb3dzZXIgd2l0aCBoZWFkbGVzcyBtb2RlID0gJHtoZWFkbGVzc31gKTtcblxuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKHtcbiAgICAgIGVudjogdGhpcy5vcHRpb25zLnZlcmJvc2UgPyB7IERFQlVHOiAnKicsIC4uLnByb2Nlc3MuZW52IH0gOiB1bmRlZmluZWQsXG4gICAgICBoZWFkbGVzcyxcbiAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgYXJncyxcbiAgICAgIHRpbWVvdXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNsZWFudXBzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgZGVidWcoJ2Nsb3NpbmcgdGhlIGJyb3dzZXInKTtcbiAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJlcGFyZUJyb3dzZXIpIHtcbiAgICAgIGRlYnVnKFwiZXhlY3V0ZSAncHJlcGFyZUJyb3dzZXInIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIG9wdGlvbnNcIik7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZUJyb3dzZXIoYnJvd3Nlcik7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NyZWF0ZSBhIG5ldyBicm93c2VyIHBhZ2UnKTtcbiAgICByZXR1cm4gYnJvd3Nlci5uZXdQYWdlKCk7XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHdhaXRVbnRpbDogUHVwcGV0ZWVyTGlmZUN5Y2xlRXZlbnQgfCB1bmRlZmluZWQgPSAnbG9hZCcsXG4gICAgcmV0cmllcyA9IHRoaXMub3B0aW9ucy5uYXZpZ2F0aW9uUmV0cnlDb3VudCA/PyAwLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucGFnZT8uZ290byh1cmwsIHsgd2FpdFVudGlsIH0pO1xuICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgICAgLy8gbm90ZTogcmVzcG9uc2Ugd2lsbCBiZSBudWxsIHdoZW4gbmF2aWdhdGluZyB0byBzYW1lIHVybCB3aGlsZSBjaGFuZ2luZyB0aGUgaGFzaCBwYXJ0LlxuICAgICAgLy8gdGhlIGNvbmRpdGlvbiBiZWxvdyB3aWxsIGFsd2F5cyBhY2NlcHQgbnVsbCBhcyB2YWxpZCByZXN1bHQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIG5hdmlnYXRlIHRvIHVybCAke3VybH0sIHJlc3BvbnNlIGlzIHVuZGVmaW5lZGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2soKSkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzKCk7XG4gICAgICBpZiAocmV0cmllcyA+IDApIHtcbiAgICAgICAgZGVidWcoYEZhaWxlZCB0byBuYXZpZ2F0ZSB0byB1cmwgJHt1cmx9LCBzdGF0dXMgY29kZTogJHtzdGF0dXN9LCByZXRyeWluZyAke3JldHJpZXN9IG1vcmUgdGltZXNgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKHVybCwgd2FpdFVudGlsLCByZXRyaWVzIC0gMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIGBGYWlsZWQgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfSwgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0TG9naW5PcHRpb25zKF9jcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogTG9naW5PcHRpb25zIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdldExvZ2luT3B0aW9ucygpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGxJbnB1dHMocGFnZU9yRnJhbWU6IFBhZ2UgfCBGcmFtZSwgZmllbGRzOiB7IHNlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9kaWZpZWQgPSBbLi4uZmllbGRzXTtcbiAgICBjb25zdCBpbnB1dCA9IG1vZGlmaWVkLnNoaWZ0KCk7XG5cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZpbGxJbnB1dChwYWdlT3JGcmFtZSwgaW5wdXQuc2VsZWN0b3IsIGlucHV0LnZhbHVlKTtcbiAgICBpZiAobW9kaWZpZWQubGVuZ3RoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGxJbnB1dHMocGFnZU9yRnJhbWUsIG1vZGlmaWVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dpbihjcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogUHJvbWlzZTxTY3JhcGVyU2NyYXBpbmdSZXN1bHQ+IHtcbiAgICBpZiAoIWNyZWRlbnRpYWxzIHx8ICF0aGlzLnBhZ2UpIHtcbiAgICAgIHJldHVybiBjcmVhdGVHZW5lcmFsRXJyb3IoKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnZXhlY3V0ZSBsb2dpbiBwcm9jZXNzJyk7XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0gdGhpcy5nZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHMpO1xuXG4gICAgaWYgKGxvZ2luT3B0aW9ucy51c2VyQWdlbnQpIHtcbiAgICAgIGRlYnVnKCdzZXQgY3VzdG9tIHVzZXIgYWdlbnQgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5wYWdlLnNldFVzZXJBZ2VudChsb2dpbk9wdGlvbnMudXNlckFnZW50KTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnbmF2aWdhdGUgdG8gbG9naW4gdXJsJyk7XG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKGxvZ2luT3B0aW9ucy5sb2dpblVybCwgbG9naW5PcHRpb25zLndhaXRVbnRpbCk7XG4gICAgaWYgKGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcykge1xuICAgICAgZGVidWcoXCJleGVjdXRlICdjaGVja1JlYWRpbmVzcycgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcygpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlYnVnKCd3YWl0IHVudGlsIHN1Ym1pdCBidXR0b24gaXMgYXZhaWxhYmxlJyk7XG4gICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCBsb2dpbk9wdGlvbnMuc3VibWl0QnV0dG9uU2VsZWN0b3IpO1xuICAgIH1cblxuICAgIGxldCBsb2dpbkZyYW1lT3JQYWdlOiBQYWdlIHwgRnJhbWUgfCBudWxsID0gdGhpcy5wYWdlO1xuICAgIGlmIChsb2dpbk9wdGlvbnMucHJlQWN0aW9uKSB7XG4gICAgICBkZWJ1ZyhcImV4ZWN1dGUgJ3ByZUFjdGlvbicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGxvZ2luRnJhbWVPclBhZ2UgPSAoYXdhaXQgbG9naW5PcHRpb25zLnByZUFjdGlvbigpKSB8fCB0aGlzLnBhZ2U7XG4gICAgfVxuXG4gICAgZGVidWcoJ2ZpbGwgbG9naW4gY29tcG9uZW50cyBpbnB1dCB3aXRoIHJlbGV2YW50IHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhsb2dpbkZyYW1lT3JQYWdlLCBsb2dpbk9wdGlvbnMuZmllbGRzKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gbG9naW4gc3VibWl0IGJ1dHRvbicpO1xuICAgIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgYXdhaXQgY2xpY2tCdXR0b24obG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2dpbmdJbik7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnBvc3RBY3Rpb24pIHtcbiAgICAgIGRlYnVnKFwiZXhlY3V0ZSAncG9zdEFjdGlvbicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCd3YWl0IGZvciBwYWdlIG5hdmlnYXRpb24nKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NoZWNrIGxvZ2luIHJlc3VsdCcpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRDdXJyZW50VXJsKHRoaXMucGFnZSwgdHJ1ZSk7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBnZXRLZXlCeVZhbHVlKGxvZ2luT3B0aW9ucy5wb3NzaWJsZVJlc3VsdHMsIGN1cnJlbnQsIHRoaXMucGFnZSk7XG4gICAgZGVidWcoYGhhbmRsZSBsb2dpbiByZXN1bHRzICR7bG9naW5SZXN1bHR9YCk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9naW5SZXN1bHQobG9naW5SZXN1bHQpO1xuICB9XG5cbiAgYXN5bmMgdGVybWluYXRlKF9zdWNjZXNzOiBib29sZWFuKSB7XG4gICAgZGVidWcoYHRlcm1pbmF0aW5nIGJyb3dzZXIgd2l0aCBzdWNjZXNzID0gJHtfc3VjY2Vzc31gKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5UZXJtaW5hdGluZyk7XG5cbiAgICBpZiAoIV9zdWNjZXNzICYmICEhdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoKSB7XG4gICAgICBkZWJ1ZyhgY3JlYXRlIGEgc25hcHNob3QgYmVmb3JlIHRlcm1pbmF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGh9YCk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2NyZWVuc2hvdCh7XG4gICAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCxcbiAgICAgICAgZnVsbFBhZ2U6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmNsZWFudXBzLnJldmVyc2UoKS5tYXAoKGNsZWFudXApID0+IGNsZWFudXAoKSkpO1xuICAgIHRoaXMuY2xlYW51cHMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTG9naW5SZXN1bHQobG9naW5SZXN1bHQ6IExvZ2luUmVzdWx0cykge1xuICAgIHN3aXRjaCAobG9naW5SZXN1bHQpIHtcbiAgICAgIGNhc2UgTG9naW5SZXN1bHRzLlN1Y2Nlc3M6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luU3VjY2Vzcyk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIGNhc2UgTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZDpcbiAgICAgIGNhc2UgTG9naW5SZXN1bHRzLlVua25vd25FcnJvcjpcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5GYWlsZWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yVHlwZTpcbiAgICAgICAgICAgIGxvZ2luUmVzdWx0ID09PSBMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkID9cbiAgICAgICAgICAgICAgU2NyYXBlckVycm9yVHlwZXMuSW52YWxpZFBhc3N3b3JkIDpcbiAgICAgICAgICAgICAgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJhbCxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGBMb2dpbiBmYWlsZWQgd2l0aCAke2xvZ2luUmVzdWx0fSBlcnJvcmAsXG4gICAgICAgIH07XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZDpcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuQ2hhbmdlUGFzc3dvcmQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuQ2hhbmdlUGFzc3dvcmQsXG4gICAgICAgIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgbG9naW4gcmVzdWx0IFwiJHtsb2dpblJlc3VsdH1cImApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyIH07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
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUEyRjtBQUMzRixnREFBc0Q7QUFDdEQsNENBQTRDO0FBQzVDLDRFQUFpRztBQUNqRyxzREFBeUU7QUFDekUsaURBQTZDO0FBQzdDLHFDQUE2QztBQUc3QyxNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFRLEVBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUVwRCxJQUFLLGdCQUdKO0FBSEQsV0FBSyxnQkFBZ0I7SUFDbkIsdUNBQW1CLENBQUE7SUFDbkIsa0RBQThCLENBQUE7QUFDaEMsQ0FBQyxFQUhJLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHcEI7QUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRywwQkFBaUIsQ0FBQztBQUNwRCxRQUFBLFlBQVksR0FBRztJQUMxQixHQUFHLElBQUk7SUFDUCxHQUFHLGdCQUFnQjtDQUNwQixDQUFDO0FBdUJGLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBNEIsRUFBRSxLQUFhLEVBQUUsSUFBVTtJQUNsRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLGFBQWE7UUFDYixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0IsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7WUFDbEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBRW5CLElBQUksU0FBUyxZQUFZLE1BQU0sRUFBRTtnQkFDL0IsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFD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QU87b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsU0FBUyxFQUFFLDBCQUFpQixDQUFDLGNBQWM7aUJBQzVDLENBQUM7WUFDSjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztDQUNGO0FBRVEsd0RBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIEZyYW1lLCB0eXBlIFBhZ2UsIHR5cGUgUHVwcGV0ZWVyTGlmZUN5Y2xlRXZlbnQgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU2NyYXBlclByb2dyZXNzVHlwZXMgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBnZXREZWJ1ZyB9IGZyb20gJy4uL2hlbHBlcnMvZGVidWcnO1xuaW1wb3J0IHsgY2xpY2tCdXR0b24sIGZpbGxJbnB1dCwgd2FpdFVudGlsRWxlbWVudEZvdW5kIH0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVybCwgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXIgfSBmcm9tICcuL2Jhc2Utc2NyYXBlcic7XG5pbXBvcnQgeyBTY3JhcGVyRXJyb3JUeXBlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgU2NyYXBlckNyZWRlbnRpYWxzLCB0eXBlIFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3NlcicpO1xuXG5lbnVtIExvZ2luQmFzZVJlc3VsdHMge1xuICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICBVbmtub3duRXJyb3IgPSAnVU5LTk9XTl9FUlJPUicsXG59XG5cbmNvbnN0IHsgVGltZW91dCwgR2VuZXJpYywgR2VuZXJhbCwgLi4ucmVzdCB9ID0gU2NyYXBlckVycm9yVHlwZXM7XG5leHBvcnQgY29uc3QgTG9naW5SZXN1bHRzID0ge1xuICAuLi5yZXN0LFxuICAuLi5Mb2dpbkJhc2VSZXN1bHRzLFxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZWRlY2xhcmVcbmV4cG9ydCB0eXBlIExvZ2luUmVzdWx0cyA9XG4gIHwgRXhjbHVkZTxTY3JhcGVyRXJyb3JUeXBlcywgU2NyYXBlckVycm9yVHlwZXMuVGltZW91dCB8IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyaWMgfCBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsPlxuICB8IExvZ2luQmFzZVJlc3VsdHM7XG5cbmV4cG9ydCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge1xuICBba2V5IGluIExvZ2luUmVzdWx0c10/OiAoc3RyaW5nIHwgUmVnRXhwIHwgKChvcHRpb25zPzogeyBwYWdlPzogUGFnZSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+KSlbXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naW5PcHRpb25zIHtcbiAgbG9naW5Vcmw6IHN0cmluZztcbiAgY2hlY2tSZWFkaW5lc3M/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBmaWVsZHM6IHsgc2VsZWN0b3I6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG4gIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiBzdHJpbmcgfCAoKCkgPT4gUHJvbWlzZTx2b2lkPik7XG4gIHByZUFjdGlvbj86ICgpID0+IFByb21pc2U8RnJhbWUgfCB2b2lkPjtcbiAgcG9zdEFjdGlvbj86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHBvc3NpYmxlUmVzdWx0czogUG9zc2libGVMb2dpblJlc3VsdHM7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgd2FpdFVudGlsPzogUHVwcGV0ZWVyTGlmZUN5Y2xlRXZlbnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEtleUJ5VmFsdWUob2JqZWN0OiBQb3NzaWJsZUxvZ2luUmVzdWx0cywgdmFsdWU6IHN0cmluZywgcGFnZTogUGFnZSk6IFByb21pc2U8TG9naW5SZXN1bHRzPiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBvYmplY3Rba2V5XTtcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udGVzdCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29uZGl0aW9uKHsgcGFnZSwgdmFsdWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBjb25kaXRpb24udG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3IpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHZW5lcmFsRXJyb3IoKTogU2NyYXBlclNjcmFwaW5nUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gIH07XG59XG5cbmNsYXNzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8VENyZWRlbnRpYWxzIGV4dGVuZHMgU2NyYXBlckNyZWRlbnRpYWxzPiBleHRlbmRzIEJhc2VTY3JhcGVyPFRDcmVkZW50aWFscz4ge1xuICBwcml2YXRlIGNsZWFudXBzOiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gIHByaXZhdGUgZGVmYXVsdFZpZXdwb3J0U2l6ZSA9IHtcbiAgICB3aWR0aDogMTAyNCxcbiAgICBoZWlnaHQ6IDc2OCxcbiAgfTtcblxuICAvLyBOT1RJQ0UgLSBpdCBpcyBkaXNjb3VyYWdlZCB0byB1c2UgYmFuZyAoISkgaW4gZ2VuZXJhbC4gSXQgaXMgdXNlZCBoZXJlIGJlY2F1c2VcbiAgLy8gYWxsIHRoZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgYmFzZSBhc3N1bWUgaXMgaXQgbWFuZGF0b3J5LlxuICBwcm90ZWN0ZWQgcGFnZSE6IFBhZ2U7XG5cbiAgcHJvdGVjdGVkIGdldFZpZXdQb3J0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmlld3BvcnRTaXplID8/IHRoaXMuZGVmYXVsdFZpZXdwb3J0U2l6ZTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIGRlYnVnKCdpbml0aWFsaXplIHNjcmFwZXInKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Jbml0aWFsaXppbmcpO1xuXG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVBhZ2UoKTtcbiAgICBhd2FpdCBwYWdlLnNldENhY2hlRW5hYmxlZChmYWxzZSk7IC8vIENsZWFyIGNhY2hlIGFuZCBhdm9pZCAzMDAncyByZXNwb25zZSBzdGF0dXNcblxuICAgIGlmICghcGFnZSkge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byBpbml0aWF0ZSBhIGJyb3dzZXIgcGFnZSwgZXhpdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG5cbiAgICB0aGlzLmNsZWFudXBzLnB1c2goKCkgPT4gcGFnZS5jbG9zZSgpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVmYXVsdFRpbWVvdXQpIHtcbiAgICAgIHRoaXMucGFnZS5zZXREZWZhdWx0VGltZW91dCh0aGlzLm9wdGlvbnMuZGVmYXVsdFRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJlcGFyZVBhZ2UpIHtcbiAgICAgIGRlYnVnKFwiZXhlY3V0ZSAncHJlcGFyZVBhZ2UnIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIG9wdGlvbnNcIik7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZVBhZ2UodGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld1BvcnQoKTtcbiAgICBkZWJ1Zyhgc2V0IHZpZXdwb3J0IHRvIHdpZHRoICR7dmlld3BvcnQud2lkdGh9LCBoZWlnaHQgJHt2aWV3cG9ydC5oZWlnaHR9YCk7XG4gICAgYXdhaXQgdGhpcy5wYWdlLnNldFZpZXdwb3J0KHtcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWdlLm9uKCdyZXF1ZXN0ZmFpbGVkJywgcmVxdWVzdCA9PiB7XG4gICAgICBkZWJ1ZygnUmVxdWVzdCBmYWlsZWQ6ICVzICVzJywgcmVxdWVzdC5mYWlsdXJlKCk/LmVycm9yVGV4dCwgcmVxdWVzdC51cmwoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVQYWdlKCkge1xuICAgIGRlYnVnKCdpbml0aWFsaXplIGJyb3dzZXIgcGFnZScpO1xuICAgIGlmICgnYnJvd3NlckNvbnRleHQnIGluIHRoaXMub3B0aW9ucykge1xuICAgICAgZGVidWcoJ1VzaW5nIHRoZSBicm93c2VyIGNvbnRleHQgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5icm93c2VyQ29udGV4dC5uZXdQYWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKCdicm93c2VyJyBpbiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgIGRlYnVnKCdVc2luZyB0aGUgYnJvd3NlciBpbnN0YW5jZSBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBjb25zdCB7IGJyb3dzZXIgfSA9IHRoaXMub3B0aW9ucztcblxuICAgICAgLyoqXG4gICAgICAgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2Ugd2lsbCBjbG9zZSB0aGUgYnJvd3NlciBldmVuIGlmIHdlIGRpZG4ndCBjcmVhdGUgaXRcbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcENsb3NlQnJvd3Nlcikge1xuICAgICAgICB0aGlzLmNsZWFudXBzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGRlYnVnKCdjbG9zaW5nIHRoZSBicm93c2VyJyk7XG4gICAgICAgICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJyb3dzZXIubmV3UGFnZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGltZW91dCwgYXJncywgZXhlY3V0YWJsZVBhdGgsIHNob3dCcm93c2VyIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCBoZWFkbGVzcyA9ICFzaG93QnJvd3NlcjtcbiAgICBkZWJ1ZyhgbGF1bmNoIGEgYnJvd3NlciB3aXRoIGhlYWRsZXNzIG1vZGUgPSAke2hlYWRsZXNzfWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goe1xuICAgICAgZW52OiB0aGlzLm9wdGlvbnMudmVyYm9zZSA/IHsgREVCVUc6ICcqJywgLi4ucHJvY2Vzcy5lbnYgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgZXhlY3V0YWJsZVBhdGgsXG4gICAgICBhcmdzLFxuICAgICAgdGltZW91dCxcbiAgICB9KTtcblxuICAgIHRoaXMuY2xlYW51cHMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICBkZWJ1ZygnY2xvc2luZyB0aGUgYnJvd3NlcicpO1xuICAgICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlQnJvd3Nlcikge1xuICAgICAgZGVidWcoXCJleGVjdXRlICdwcmVwYXJlQnJvd3NlcicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5wcmVwYXJlQnJvd3Nlcihicm93c2VyKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnY3JlYXRlIGEgbmV3IGJyb3dzZXIgcGFnZScpO1xuICAgIHJldHVybiBicm93c2VyLm5ld1BhZ2UoKTtcbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG8oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgd2FpdFVudGlsOiBQdXBwZXRlZXJMaWZlQ3ljbGVFdmVudCB8IHVuZGVmaW5lZCA9ICdsb2FkJyxcbiAgICByZXRyaWVzID0gdGhpcy5vcHRpb25zLm5hdmlnYXRpb25SZXRyeUNvdW50ID8/IDAsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wYWdlPy5nb3RvKHVybCwgeyB3YWl0VW50aWwgfSk7XG4gICAgaWYgKHJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgICAvLyBub3RlOiByZXNwb25zZSB3aWxsIGJlIG51bGwgd2hlbiBuYXZpZ2F0aW5nIHRvIHNhbWUgdXJsIHdoaWxlIGNoYW5naW5nIHRoZSBoYXNoIHBhcnQuXG4gICAgICAvLyB0aGUgY29uZGl0aW9uIGJlbG93IHdpbGwgYWx3YXlzIGFjY2VwdCBudWxsIGFzIHZhbGlkIHJlc3VsdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIHRyeWluZyB0byBuYXZpZ2F0ZSB0byB1cmwgJHt1cmx9LCByZXNwb25zZSBpcyB1bmRlZmluZWRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKCkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cygpO1xuICAgICAgaWYgKHJldHJpZXMgPiAwKSB7XG4gICAgICAgIGRlYnVnKGBGYWlsZWQgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfSwgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfSwgcmV0cnlpbmcgJHtyZXRyaWVzfSBtb3JlIHRpbWVzYCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh1cmwsIHdhaXRVbnRpbCwgcmV0cmllcyAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfSwgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0TG9naW5PcHRpb25zKF9jcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogTG9naW5PcHRpb25zIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdldExvZ2luT3B0aW9ucygpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGxJbnB1dHMocGFnZU9yRnJhbWU6IFBhZ2UgfCBGcmFtZSwgZmllbGRzOiB7IHNlbGVjdG9yOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9kaWZpZWQgPSBbLi4uZmllbGRzXTtcbiAgICBjb25zdCBpbnB1dCA9IG1vZGlmaWVkLnNoaWZ0KCk7XG5cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZpbGxJbnB1dChwYWdlT3JGcmFtZSwgaW5wdXQuc2VsZWN0b3IsIGlucHV0LnZhbHVlKTtcbiAgICBpZiAobW9kaWZpZWQubGVuZ3RoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGxJbnB1dHMocGFnZU9yRnJhbWUsIG1vZGlmaWVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dpbihjcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogUHJvbWlzZTxTY3JhcGVyU2NyYXBpbmdSZXN1bHQ+IHtcbiAgICBpZiAoIWNyZWRlbnRpYWxzIHx8ICF0aGlzLnBhZ2UpIHtcbiAgICAgIHJldHVybiBjcmVhdGVHZW5lcmFsRXJyb3IoKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnZXhlY3V0ZSBsb2dpbiBwcm9jZXNzJyk7XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0gdGhpcy5nZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHMpO1xuXG4gICAgaWYgKGxvZ2luT3B0aW9ucy51c2VyQWdlbnQpIHtcbiAgICAgIGRlYnVnKCdzZXQgY3VzdG9tIHVzZXIgYWdlbnQgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5wYWdlLnNldFVzZXJBZ2VudChsb2dpbk9wdGlvbnMudXNlckFnZW50KTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnbmF2aWdhdGUgdG8gbG9naW4gdXJsJyk7XG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKGxvZ2luT3B0aW9ucy5sb2dpblVybCwgbG9naW5PcHRpb25zLndhaXRVbnRpbCk7XG4gICAgaWYgKGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcykge1xuICAgICAgZGVidWcoXCJleGVjdXRlICdjaGVja1JlYWRpbmVzcycgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcygpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlYnVnKCd3YWl0IHVudGlsIHN1Ym1pdCBidXR0b24gaXMgYXZhaWxhYmxlJyk7XG4gICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCBsb2dpbk9wdGlvbnMuc3VibWl0QnV0dG9uU2VsZWN0b3IpO1xuICAgIH1cblxuICAgIGxldCBsb2dpbkZyYW1lT3JQYWdlOiBQYWdlIHwgRnJhbWUgfCBudWxsID0gdGhpcy5wYWdlO1xuICAgIGlmIChsb2dpbk9wdGlvbnMucHJlQWN0aW9uKSB7XG4gICAgICBkZWJ1ZyhcImV4ZWN1dGUgJ3ByZUFjdGlvbicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGxvZ2luRnJhbWVPclBhZ2UgPSAoYXdhaXQgbG9naW5PcHRpb25zLnByZUFjdGlvbigpKSB8fCB0aGlzLnBhZ2U7XG4gICAgfVxuXG4gICAgZGVidWcoJ2ZpbGwgbG9naW4gY29tcG9uZW50cyBpbnB1dCB3aXRoIHJlbGV2YW50IHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhsb2dpbkZyYW1lT3JQYWdlLCBsb2dpbk9wdGlvbnMuZmllbGRzKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gbG9naW4gc3VibWl0IGJ1dHRvbicpO1xuICAgIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgYXdhaXQgY2xpY2tCdXR0b24obG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2dpbmdJbik7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnBvc3RBY3Rpb24pIHtcbiAgICAgIGRlYnVnKFwiZXhlY3V0ZSAncG9zdEFjdGlvbicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCd3YWl0IGZvciBwYWdlIG5hdmlnYXRpb24nKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NoZWNrIGxvZ2luIHJlc3VsdCcpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRDdXJyZW50VXJsKHRoaXMucGFnZSwgdHJ1ZSk7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBnZXRLZXlCeVZhbHVlKGxvZ2luT3B0aW9ucy5wb3NzaWJsZVJlc3VsdHMsIGN1cnJlbnQsIHRoaXMucGFnZSk7XG4gICAgZGVidWcoYGhhbmRsZSBsb2dpbiByZXN1bHRzICR7bG9naW5SZXN1bHR9YCk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9naW5SZXN1bHQobG9naW5SZXN1bHQpO1xuICB9XG5cbiAgYXN5bmMgdGVybWluYXRlKF9zdWNjZXNzOiBib29sZWFuKSB7XG4gICAgZGVidWcoYHRlcm1pbmF0aW5nIGJyb3dzZXIgd2l0aCBzdWNjZXNzID0gJHtfc3VjY2Vzc31gKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5UZXJtaW5hdGluZyk7XG5cbiAgICBpZiAoIV9zdWNjZXNzICYmICEhdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoKSB7XG4gICAgICBkZWJ1ZyhgY3JlYXRlIGEgc25hcHNob3QgYmVmb3JlIHRlcm1pbmF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGh9YCk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2NyZWVuc2hvdCh7XG4gICAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCxcbiAgICAgICAgZnVsbFBhZ2U6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmNsZWFudXBzLnJldmVyc2UoKS5tYXAoY2xlYW51cCA9PiBjbGVhbnVwKCkpKTtcbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvZ2luUmVzdWx0KGxvZ2luUmVzdWx0OiBMb2dpblJlc3VsdHMpIHtcbiAgICBzd2l0Y2ggKGxvZ2luUmVzdWx0KSB7XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5TdWNjZXNzOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpblN1Y2Nlc3MpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQ6XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3I6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6XG4gICAgICAgICAgICBsb2dpblJlc3VsdCA9PT0gTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZFxuICAgICAgICAgICAgICA/IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZFxuICAgICAgICAgICAgICA6IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBgTG9naW4gZmFpbGVkIHdpdGggJHtsb2dpblJlc3VsdH0gZXJyb3JgLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmQ6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkNoYW5nZVBhc3N3b3JkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGxvZ2luIHJlc3VsdCBcIiR7bG9naW5SZXN1bHR9XCJgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9O1xuIl19