appium-android-driver 5.4.3 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +32 -91
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/lib/commands/general.js +34 -15
  68. package/package.json +1 -1
@@ -1,38 +1,25 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.AndroidDriver = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _driver = require("appium/driver");
13
-
14
10
  var _desiredCaps = _interopRequireDefault(require("./desired-caps"));
15
-
16
11
  var _index = _interopRequireDefault(require("./commands/index"));
17
-
18
12
  var _androidHelpers = require("./android-helpers");
19
-
20
13
  var _lodash = _interopRequireDefault(require("lodash"));
21
-
22
14
  var _appiumAdb = require("appium-adb");
23
-
24
15
  var _support = require("appium/support");
25
-
26
16
  var _asyncbox = require("asyncbox");
27
-
28
17
  var _sharedPreferencesBuilder = require("shared-preferences-builder");
29
-
30
18
  var _bluebird = _interopRequireDefault(require("bluebird"));
31
-
32
19
  const APP_EXTENSION = '.apk';
33
20
  const DEVICE_PORT = 4724;
34
- const NO_PROXY = [['POST', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/network_connection')]];
35
21
 
22
+ const NO_PROXY = [['POST', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/network_connection')]];
36
23
  class AndroidDriver extends _driver.BaseDriver {
37
24
  constructor(opts = {}, shouldValidateCaps = true) {
38
25
  super(opts, shouldValidateCaps);
@@ -47,14 +34,12 @@ class AndroidDriver extends _driver.BaseDriver {
47
34
  this.chromedriver = null;
48
35
  this.apkStrings = {};
49
36
  this.unlocker = _androidHelpers.helpers.unlocker;
50
-
51
37
  for (let [cmd, fn] of _lodash.default.toPairs(_index.default)) {
52
38
  AndroidDriver.prototype[cmd] = fn;
53
39
  }
54
40
 
55
41
  this.curContext = this.defaultContextName();
56
42
  }
57
-
58
43
  async createSession(...args) {
59
44
  try {
60
45
  let [sessionId, caps] = await super.createSession(...args);
@@ -70,6 +55,7 @@ class AndroidDriver extends _driver.BaseDriver {
70
55
  desired: this.caps
71
56
  };
72
57
  this.caps = Object.assign(serverDetails, this.caps);
58
+
73
59
  let defaultOpts = {
74
60
  action: 'android.intent.action.MAIN',
75
61
  category: 'android.intent.category.LAUNCHER',
@@ -82,30 +68,23 @@ class AndroidDriver extends _driver.BaseDriver {
82
68
  bootstrapPort: DEVICE_PORT,
83
69
  androidInstallTimeout: 90000
84
70
  };
85
-
86
71
  _lodash.default.defaults(this.opts, defaultOpts);
87
-
88
72
  this.useUnlockHelperApp = _lodash.default.isUndefined(this.caps.unlockType);
89
73
 
90
74
  if (this.opts.noReset === true) {
91
75
  this.opts.fullReset = false;
92
76
  }
93
-
94
77
  if (this.opts.fullReset === true) {
95
78
  this.opts.noReset = false;
96
79
  }
97
-
98
80
  this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;
99
81
  this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;
100
-
101
82
  if (this.isChromeSession) {
102
83
  _androidHelpers.helpers.adjustBrowserSessionCaps(this.opts);
103
84
  }
104
-
105
85
  if (this.opts.nativeWebScreenshot) {
106
86
  this.jwpProxyAvoid.push(['GET', new RegExp('^/session/[^/]+/screenshot')]);
107
87
  }
108
-
109
88
  if (this.opts.reboot) {
110
89
  this.setAvdFromCapabilities(caps);
111
90
  }
@@ -116,6 +95,7 @@ class AndroidDriver extends _driver.BaseDriver {
116
95
  } = await _androidHelpers.helpers.getDeviceInfoFromCaps(this.opts);
117
96
  this.opts.udid = udid;
118
97
  this.opts.emPort = emPort;
98
+
119
99
  this.adb = await _androidHelpers.helpers.createADB({
120
100
  udid: this.opts.udid,
121
101
  emPort: this.opts.emPort,
@@ -126,16 +106,13 @@ class AndroidDriver extends _driver.BaseDriver {
126
106
  adbExecTimeout: this.opts.adbExecTimeout,
127
107
  allowOfflineDevices: this.opts.allowOfflineDevices
128
108
  });
129
-
130
109
  if ((await this.adb.getApiLevel()) >= 23) {
131
110
  this.log.warn("Consider setting 'automationName' capability to " + "'uiautomator2' on Android >= 6, since UIAutomator framework " + 'is not maintained anymore by the OS vendor.');
132
111
  }
133
-
134
112
  if (this.helpers.isPackageOrBundle(this.opts.app)) {
135
113
  this.opts.appPackage = this.opts.app;
136
114
  this.opts.app = null;
137
115
  }
138
-
139
116
  if (this.opts.app) {
140
117
  this.opts.app = await this.helpers.configureApp(this.opts.app, APP_EXTENSION);
141
118
  await this.checkAppPresent();
@@ -152,7 +129,6 @@ class AndroidDriver extends _driver.BaseDriver {
152
129
  await this.adb.networkSpeed(networkSpeed);
153
130
  }
154
131
  }
155
-
156
132
  if (_support.util.hasValue(this.opts.gpsEnabled)) {
157
133
  if (this.isEmulator()) {
158
134
  this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);
@@ -161,22 +137,18 @@ class AndroidDriver extends _driver.BaseDriver {
161
137
  this.log.warn('Sorry! gpsEnabled capability is only available for emulators');
162
138
  }
163
139
  }
164
-
165
140
  await this.startAndroidSession(this.opts);
166
141
  return [sessionId, this.caps];
167
142
  } catch (e) {
168
143
  try {
169
144
  await this.deleteSession();
170
145
  } catch (ign) {}
171
-
172
146
  throw e;
173
147
  }
174
148
  }
175
-
176
149
  isEmulator() {
177
150
  return _androidHelpers.helpers.isEmulator(this.adb, this.opts);
178
151
  }
179
-
180
152
  setAvdFromCapabilities(caps) {
181
153
  if (this.opts.avd) {
182
154
  this.log.info('avd name defined, ignoring device name and platform version');
@@ -184,47 +156,40 @@ class AndroidDriver extends _driver.BaseDriver {
184
156
  if (!caps.deviceName) {
185
157
  this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
186
158
  }
187
-
188
159
  if (!caps.platformVersion) {
189
160
  this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
190
161
  }
191
-
192
162
  let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');
193
163
  this.opts.avd = `${avdDevice}__${caps.platformVersion}`;
194
164
  }
195
165
  }
196
-
197
166
  get appOnDevice() {
198
167
  return this.helpers.isPackageOrBundle(this.opts.app) || !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);
199
168
  }
200
-
201
169
  get isChromeSession() {
202
170
  return _androidHelpers.helpers.isChromeBrowser(this.opts.browserName);
203
171
  }
204
-
205
172
  async onSettingsUpdate(key, value) {
206
173
  if (key === 'ignoreUnimportantViews') {
207
174
  await this.setCompressedLayoutHierarchy(value);
208
175
  }
209
176
  }
210
-
211
177
  async startAndroidSession() {
212
178
  this.log.info(`Starting Android session`);
213
179
  this.defaultIME = await _androidHelpers.helpers.initDevice(this.adb, this.opts);
180
+
214
181
  this.caps.deviceName = this.adb.curDeviceId;
215
182
  this.caps.deviceUDID = this.opts.udid;
216
183
  this.caps.platformVersion = await this.adb.getPlatformVersion();
217
184
  this.caps.deviceScreenSize = await this.adb.getScreenSize();
218
185
  this.caps.deviceModel = await this.adb.getModel();
219
186
  this.caps.deviceManufacturer = await this.adb.getManufacturer();
220
-
221
187
  if (this.opts.disableWindowAnimation) {
222
188
  if (await this.adb.isAnimationOn()) {
223
189
  if ((await this.adb.getApiLevel()) >= 28) {
224
190
  this.log.warn('Relaxing hidden api policy to manage animation scale');
225
191
  await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);
226
192
  }
227
-
228
193
  this.log.info('Disabling window animation as it is requested by "disableWindowAnimation" capability');
229
194
  await this.adb.setAnimationState(false);
230
195
  this._wasWindowAnimationDisabled = true;
@@ -234,9 +199,9 @@ class AndroidDriver extends _driver.BaseDriver {
234
199
  }
235
200
 
236
201
  await this.initAUT();
202
+
237
203
  this.bootstrap = new _androidHelpers.helpers.bootstrap(this.adb, this.opts.bootstrapPort, this.opts.websocket);
238
204
  await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);
239
-
240
205
  (async () => {
241
206
  try {
242
207
  await this.bootstrap.onUnexpectedShutdown;
@@ -246,7 +211,6 @@ class AndroidDriver extends _driver.BaseDriver {
246
211
  }
247
212
  }
248
213
  })();
249
-
250
214
  if (!this.opts.skipUnlock) {
251
215
  await _androidHelpers.helpers.unlock(this, this.adb, this.caps);
252
216
  }
@@ -256,7 +220,6 @@ class AndroidDriver extends _driver.BaseDriver {
256
220
  ignoreUnimportantViews: this.opts.ignoreUnimportantViews
257
221
  });
258
222
  }
259
-
260
223
  if (this.isChromeSession) {
261
224
  await this.startChromeSession();
262
225
  } else {
@@ -264,26 +227,23 @@ class AndroidDriver extends _driver.BaseDriver {
264
227
  await this.startAUT();
265
228
  }
266
229
  }
267
-
268
230
  if (_support.util.hasValue(this.opts.orientation)) {
269
231
  this.log.debug(`Setting initial orientation to '${this.opts.orientation}'`);
270
232
  await this.setOrientation(this.opts.orientation);
271
233
  }
272
-
273
234
  await this.initAutoWebview();
274
235
  }
275
-
276
236
  async initAutoWebview() {
277
237
  if (this.opts.autoWebview) {
278
238
  let viewName = this.defaultWebviewName();
279
239
  let timeout = this.opts.autoWebviewTimeout || 2000;
280
240
  this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);
241
+
281
242
  await (0, _asyncbox.retryInterval)(timeout / 500, 500, async () => {
282
243
  await this.setContext(viewName);
283
244
  });
284
245
  }
285
246
  }
286
-
287
247
  async initAUT() {
288
248
  let launchInfo = await _androidHelpers.helpers.getLaunchInfo(this.adb, this.opts);
289
249
  Object.assign(this.opts, launchInfo);
@@ -291,19 +251,16 @@ class AndroidDriver extends _driver.BaseDriver {
291
251
 
292
252
  if (this.opts.uninstallOtherPackages) {
293
253
  _androidHelpers.helpers.validateDesiredCaps(this.opts);
294
-
295
254
  await _androidHelpers.helpers.uninstallOtherPackages(this.adb, _androidHelpers.helpers.parseArray(this.opts.uninstallOtherPackages), [_androidHelpers.SETTINGS_HELPER_PKG_ID]);
296
255
  }
297
256
 
298
257
  if (this.opts.otherApps) {
299
258
  let otherApps;
300
-
301
259
  try {
302
260
  otherApps = _androidHelpers.helpers.parseArray(this.opts.otherApps);
303
261
  } catch (e) {
304
262
  this.log.errorAndThrow(`Could not parse "otherApps" capability: ${e.message}`);
305
263
  }
306
-
307
264
  otherApps = await _bluebird.default.all(otherApps.map(app => this.helpers.configureApp(app, APP_EXTENSION)));
308
265
  await _androidHelpers.helpers.installOtherApks(otherApps, this.adb, this.opts);
309
266
  }
@@ -312,23 +269,17 @@ class AndroidDriver extends _driver.BaseDriver {
312
269
  if (this.opts.fullReset) {
313
270
  this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
314
271
  }
315
-
316
272
  this.log.debug('No app capability. Assuming it is already on the device');
317
-
318
273
  if (this.opts.fastReset) {
319
274
  await _androidHelpers.helpers.resetApp(this.adb, this.opts);
320
275
  }
321
-
322
276
  return;
323
277
  }
324
-
325
278
  if (!this.opts.skipUninstall) {
326
279
  await this.adb.uninstallApk(this.opts.appPackage);
327
280
  }
328
-
329
281
  await _androidHelpers.helpers.installApk(this.adb, this.opts);
330
282
  const apkStringsForLanguage = await _androidHelpers.helpers.pushStrings(this.opts.language, this.adb, this.opts);
331
-
332
283
  if (this.opts.language) {
333
284
  this.apkStrings[this.opts.language] = apkStringsForLanguage;
334
285
  }
@@ -337,18 +288,14 @@ class AndroidDriver extends _driver.BaseDriver {
337
288
  await this.setSharedPreferences(this.opts);
338
289
  }
339
290
  }
340
-
341
291
  async checkAppPresent() {
342
292
  this.log.debug('Checking whether app is actually present');
343
-
344
293
  if (!(await _support.fs.exists(this.opts.app))) {
345
294
  this.log.errorAndThrow(`Could not find app apk at ${this.opts.app}`);
346
295
  }
347
296
  }
348
-
349
297
  async checkPackagePresent() {
350
298
  this.log.debug('Checking whether package is present on the device');
351
-
352
299
  if (!(await this.adb.shell(['pm', 'list', 'packages', this.opts.appPackage]))) {
353
300
  this.log.errorAndThrow(`Could not find package ${this.opts.appPackage} on the device`);
354
301
  }
@@ -359,95 +306,70 @@ class AndroidDriver extends _driver.BaseDriver {
359
306
  compressLayout: compress
360
307
  });
361
308
  }
362
-
363
309
  async deleteSession() {
364
310
  var _this$adb5;
365
-
366
311
  this.log.debug('Shutting down Android driver');
367
-
368
312
  try {
369
313
  if (!_lodash.default.isEmpty(this._screenRecordingProperties)) {
370
314
  await this.stopRecordingScreen();
371
315
  }
372
316
  } catch (ign) {}
373
-
374
317
  await _androidHelpers.helpers.removeAllSessionWebSocketHandlers(this.server, this.sessionId);
375
318
  await this.mobileStopScreenStreaming();
376
319
  await super.deleteSession();
377
-
378
320
  if (this.bootstrap) {
379
321
  var _this$adb3;
380
-
381
322
  await this.stopChromedriverProxies();
382
-
383
323
  if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {
384
324
  var _this$adb;
385
-
386
325
  this.log.debug(`Resetting IME to ${this.defaultIME}`);
387
326
  await ((_this$adb = this.adb) === null || _this$adb === void 0 ? void 0 : _this$adb.setIME(this.defaultIME));
388
327
  }
389
-
390
328
  if (!this.isChromeSession && !this.opts.dontStopAppOnReset) {
391
329
  var _this$adb2;
392
-
393
330
  await ((_this$adb2 = this.adb) === null || _this$adb2 === void 0 ? void 0 : _this$adb2.forceStop(this.opts.appPackage));
394
331
  }
395
-
396
332
  await ((_this$adb3 = this.adb) === null || _this$adb3 === void 0 ? void 0 : _this$adb3.goToHome());
397
-
398
333
  if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {
399
334
  var _this$adb4;
400
-
401
335
  await ((_this$adb4 = this.adb) === null || _this$adb4 === void 0 ? void 0 : _this$adb4.uninstallApk(this.opts.appPackage));
402
336
  }
403
-
404
337
  await this.bootstrap.shutdown();
405
338
  this.bootstrap = null;
406
339
  } else {
407
340
  this.log.debug("Called deleteSession but bootstrap wasn't active");
408
341
  }
409
-
410
342
  await ((_this$adb5 = this.adb) === null || _this$adb5 === void 0 ? void 0 : _this$adb5.stopLogcat());
411
-
412
343
  if (this.useUnlockHelperApp) {
413
344
  var _this$adb6;
414
-
415
345
  await ((_this$adb6 = this.adb) === null || _this$adb6 === void 0 ? void 0 : _this$adb6.forceStop('io.appium.unlock'));
416
346
  }
417
-
418
347
  if (this._wasWindowAnimationDisabled) {
419
348
  var _this$adb7, _this$adb8;
420
-
421
349
  this.log.info('Restoring window animation state');
422
350
  await ((_this$adb7 = this.adb) === null || _this$adb7 === void 0 ? void 0 : _this$adb7.setAnimationState(true));
423
351
 
424
352
  if ((await ((_this$adb8 = this.adb) === null || _this$adb8 === void 0 ? void 0 : _this$adb8.getApiLevel())) >= 28) {
425
353
  var _this$adb9;
426
-
427
354
  this.log.info('Restoring hidden api policy to the device default configuration');
428
355
  await ((_this$adb9 = this.adb) === null || _this$adb9 === void 0 ? void 0 : _this$adb9.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError));
429
356
  }
430
357
  }
431
-
432
358
  if (this.opts.reboot) {
433
359
  var _this$adb10;
434
-
435
360
  let avdName = this.opts.avd.replace('@', '');
436
361
  this.log.debug(`closing emulator '${avdName}'`);
437
362
  await ((_this$adb10 = this.adb) === null || _this$adb10 === void 0 ? void 0 : _this$adb10.killEmulator(avdName));
438
363
  }
439
364
  }
440
-
441
365
  async setSharedPreferences() {
442
366
  let sharedPrefs = this.opts.sharedPreferences;
443
367
  this.log.info('Trying to set shared preferences');
444
368
  let name = sharedPrefs.name;
445
-
446
369
  if (_lodash.default.isUndefined(name)) {
447
370
  this.log.warn(`Skipping setting Shared preferences, name is undefined: ${JSON.stringify(sharedPrefs)}`);
448
371
  return false;
449
372
  }
450
-
451
373
  let remotePath = `/data/data/${this.opts.appPackage}/shared_prefs`;
452
374
  let remoteFile = `${remotePath}/${name}.xml`;
453
375
  let localPath = `/tmp/${name}.xml`;
@@ -459,54 +381,43 @@ class AndroidDriver extends _driver.BaseDriver {
459
381
  await this.adb.shell(['mkdir', '-p', remotePath]);
460
382
  this.log.info(`Pushing shared_prefs to ${remoteFile}`);
461
383
  await this.adb.push(localPath, remoteFile);
462
-
463
384
  try {
464
385
  this.log.info(`Trying to remove shared preferences temporary file`);
465
-
466
386
  if (await _support.fs.exists(localPath)) {
467
387
  await _support.fs.unlink(localPath);
468
388
  }
469
389
  } catch (e) {
470
390
  this.log.warn(`Error trying to remove temporary file ${localPath}`);
471
391
  }
472
-
473
392
  return true;
474
393
  }
475
-
476
394
  getPrefsBuilder() {
477
395
  return new _sharedPreferencesBuilder.SharedPrefsBuilder();
478
396
  }
479
-
480
397
  validateDesiredCaps(caps) {
481
398
  if (!super.validateDesiredCaps(caps)) {
482
399
  return false;
483
400
  }
484
-
485
401
  if ((!caps.browserName || !_androidHelpers.helpers.isChromeBrowser(caps.browserName)) && !caps.app && !caps.appPackage) {
486
402
  this.log.errorAndThrow('The desired capabilities must include either an app, appPackage or browserName');
487
403
  }
488
-
489
404
  return _androidHelpers.helpers.validateDesiredCaps(caps);
490
405
  }
491
-
492
406
  proxyActive(sessionId) {
493
407
  super.proxyActive(sessionId);
494
408
  return this.jwpProxyActive;
495
409
  }
496
-
497
410
  getProxyAvoidList(sessionId) {
498
411
  super.getProxyAvoidList(sessionId);
499
412
  return this.jwpProxyAvoid;
500
413
  }
501
-
502
414
  canProxy(sessionId) {
503
415
  super.canProxy(sessionId);
416
+
504
417
  return _lodash.default.isFunction(this.proxyReqRes);
505
418
  }
506
-
507
419
  }
508
-
509
420
  exports.AndroidDriver = AndroidDriver;
510
421
  var _default = AndroidDriver;
511
422
  exports.default = _default;
512
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OIiwiREVWSUNFX1BPUlQiLCJOT19QUk9YWSIsIlJlZ0V4cCIsIkFuZHJvaWREcml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJkZXNpcmVkQ29uc3RyYWludHMiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImp3cFByb3h5QWN0aXZlIiwiandwUHJveHlBdm9pZCIsIl8iLCJjbG9uZSIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJhcGtTdHJpbmdzIiwidW5sb2NrZXIiLCJoZWxwZXJzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0T3B0cyIsImFjdGlvbiIsImNhdGVnb3J5IiwiZmxhZ3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwidG1wRGlyIiwidGVtcERpciIsInN0YXRpY0RpciIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImJvb3RzdHJhcFBvcnQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJkZWZhdWx0cyIsInVzZVVubG9ja0hlbHBlckFwcCIsImlzVW5kZWZpbmVkIiwidW5sb2NrVHlwZSIsIm5vUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiaXNDaHJvbWVTZXNzaW9uIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsInB1c2giLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsInN1cHByZXNzS2lsbFNlcnZlciIsInJlbW90ZUFkYkhvc3QiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0IiwiYWRiRXhlY1RpbWVvdXQiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZ2V0QXBpTGV2ZWwiLCJsb2ciLCJ3YXJuIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJhcHAiLCJhcHBQYWNrYWdlIiwiY29uZmlndXJlQXBwIiwiY2hlY2tBcHBQcmVzZW50IiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiY2hlY2tQYWNrYWdlUHJlc2VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5ldHdvcmtTcGVlZCIsImlzRW11bGF0b3IiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInN0YXJ0QW5kcm9pZFNlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsImlnbiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwia2V5IiwidmFsdWUiLCJzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IiwiZGVmYXVsdElNRSIsImluaXREZXZpY2UiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VTY3JlZW5TaXplIiwiZ2V0U2NyZWVuU2l6ZSIsImRldmljZU1vZGVsIiwiZ2V0TW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJnZXRNYW51ZmFjdHVyZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwiYm9vdHN0cmFwIiwid2Vic29ja2V0Iiwic3RhcnQiLCJhY2NlcHRTc2xDZXJ0cyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgaGVscGVycywgZW5zdXJlTmV0d29ya1NwZWVkLFxuICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELFxufSBmcm9tICcuL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU2hhcmVkUHJlZnNCdWlsZGVyIH0gZnJvbSAnc2hhcmVkLXByZWZlcmVuY2VzLWJ1aWxkZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OID0gJy5hcGsnO1xuY29uc3QgREVWSUNFX1BPUlQgPSA0NzI0O1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0b1xuLy8gQ2hyb21lZHJpdmVyXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuXTtcblxuY2xhc3MgQW5kcm9pZERyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENvbnN0cmFpbnRzO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5jbG9uZShOT19QUk9YWSk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTtcbiAgICB0aGlzLnVubG9ja2VyID0gaGVscGVycy51bmxvY2tlcjtcblxuICAgIGZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gICAgICBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuXG4gICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIGxpbmUgd2hpY2ggYXNzaWducyBjb21tYW5kcyB0byBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZSwgc28gdGhhdCBgdGhpcy5kZWZhdWx0Q29udGV4dE5hbWVgIGlzIGRlZmluZWQuXG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICAvLyB0aGUgd2hvbGUgY3JlYXRlU2Vzc2lvbiBmbG93IGlzIHN1cnJvdW5kZWQgaW4gYSB0cnktY2F0Y2ggc3RhdGVtZW50XG4gICAgLy8gaWYgY3JlYXRpbmcgYSBzZXNzaW9uIGZhaWxzIGF0IGFueSBwb2ludCwgd2UgdGVhcmRvd24gZXZlcnl0aGluZyB3ZVxuICAgIC8vIHNldCB1cCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLlxuICAgIHRyeSB7XG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHNcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgLy8gYXNzaWduaW5nIGRlZmF1bHRzXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGFjdGlvbjogJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAgIGZsYWdzOiAnMHgxMDIwMDAwMCcsXG4gICAgICAgIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnM6IGZhbHNlLFxuICAgICAgICB0bXBEaXI6IGF3YWl0IHRlbXBEaXIuc3RhdGljRGlyKCksXG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGJvb3RzdHJhcFBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwLFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG4gICAgICB0aGlzLnVzZVVubG9ja0hlbHBlckFwcCA9IF8uaXNVbmRlZmluZWQodGhpcy5jYXBzLnVubG9ja1R5cGUpO1xuXG4gICAgICAvLyBub3QgdXNlciB2aXNpYmxlIHZpYSBjYXBzXG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICBoZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhpcy5qd3BQcm94eUF2b2lkLnB1c2goWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgICAvLyBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgQURCXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQURCKHtcbiAgICAgICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgICAgIGVtUG9ydDogdGhpcy5vcHRzLmVtUG9ydCxcbiAgICAgICAgYWRiUG9ydDogdGhpcy5vcHRzLmFkYlBvcnQsXG4gICAgICAgIHN1cHByZXNzS2lsbFNlcnZlcjogdGhpcy5vcHRzLnN1cHByZXNzS2lsbFNlcnZlcixcbiAgICAgICAgcmVtb3RlQWRiSG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QsXG4gICAgICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHRoaXMub3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgICAgICBhZGJFeGVjVGltZW91dDogdGhpcy5vcHRzLmFkYkV4ZWNUaW1lb3V0LFxuICAgICAgICBhbGxvd09mZmxpbmVEZXZpY2VzOiB0aGlzLm9wdHMuYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiQ29uc2lkZXIgc2V0dGluZyAnYXV0b21hdGlvbk5hbWUnIGNhcGFiaWxpdHkgdG8gXCIgK1xuICAgICAgICAgIFwiJ3VpYXV0b21hdG9yMicgb24gQW5kcm9pZCA+PSA2LCBzaW5jZSBVSUF1dG9tYXRvciBmcmFtZXdvcmsgXCIgK1xuICAgICAgICAgICdpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlIGJ5IHRoZSBPUyB2ZW5kb3IuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkpIHtcbiAgICAgICAgLy8gdXNlciBwcm92aWRlZCBwYWNrYWdlIGluc3RlYWQgb2YgYXBwIGZvciAnYXBwJyBjYXBhYmlsaXR5LCBtYXNzYWdlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRzLmFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwO1xuICAgICAgICB0aGlzLm9wdHMuYXBwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBBUFBfRVhURU5TSU9OKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlUHJlc2VudCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21lIGNsb3VkIHNlcnZpY2VzIHVzaW5nIGFwcGl1bSBsYXVuY2ggdGhlIGF2ZCB0aGVtc2VsdmVzLCBzbyB3ZSBlbnN1cmUgbmV0c3BlZWRcbiAgICAgIC8vIGlzIHNldCBmb3IgZW11bGF0b3JzIGJ5IGNhbGxpbmcgYWRiLm5ldHdvcmtTcGVlZCBiZWZvcmUgcnVubmluZyB0aGUgYXBwXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMubmV0d29ya1NwZWVkKSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnksIG5ldHdvcmtTcGVlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrU3BlZWQgPSBlbnN1cmVOZXR3b3JrU3BlZWQodGhpcy5hZGIsIHRoaXMub3B0cy5uZXR3b3JrU3BlZWQpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKCdTb3JyeSEgZ3BzRW5hYmxlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0QW5kcm9pZFNlc3Npb24odGhpcy5vcHRzKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yaW5nIGRlbGV0ZSBzZXNzaW9uIGV4Y2VwdGlvbiBpZiBhbnkgYW5kIHRocm93IHRoZSByZWFsIGVycm9yXG4gICAgICAvLyB0aGF0IGhhcHBlbmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXNzaW9uLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSB8fCAoIXRoaXMub3B0cy5hcHAgJiZcbiAgICAgICAgICAgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKSk7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ID09PSAnaWdub3JlVW5pbXBvcnRhbnRWaWV3cycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBbmRyb2lkU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgQW5kcm9pZCBzZXNzaW9uYCk7XG4gICAgLy8gc2V0IHVwIHRoZSBkZXZpY2UgdG8gcnVuIG9uIChyZWFsIG9yIGVtdWxhdG9yLCBldGMpXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlscy5cbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IGF3YWl0IHRoaXMuYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IGF3YWl0IHRoaXMuYWRiLmdldE1vZGVsKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IGF3YWl0IHRoaXMuYWRiLmdldE1hbnVmYWN0dXJlcigpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFQSSBsZXZlbCAyOCBpcyBBbmRyb2lkIFBcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gcmVzZXQgdGhlIHJlbGF4aW5nIGluIGRlbGV0ZSBzZXNzaW9uXG4gICAgICAgICAgdGhpcy5sb2cud2FybignUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFuaW1hdGlvbiBzY2FsZScpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIGl0IGlzIHJlcXVlc3RlZCBieSBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBzdGFydCBVaUF1dG9tYXRvclxuICAgIHRoaXMuYm9vdHN0cmFwID0gbmV3IGhlbHBlcnMuYm9vdHN0cmFwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYm9vdHN0cmFwUG9ydCwgdGhpcy5vcHRzLndlYnNvY2tldCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICAgIC8vIGhhbmRsaW5nIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXAub25VbmV4cGVjdGVkU2h1dGRvd247XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuXG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyBMZXQncyB0cnkgdG8gdW5sb2NrIHRoZSBkZXZpY2VcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IG9uIHRoZSBkZXZpY2UgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncyBvYmplY3RcbiAgICAvLyB0aGlzIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBib290c3RyYXAgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0aGlzLm9wdHMuaWdub3JlVW5pbXBvcnRhbnRWaWV3c30pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvbiBhbmQgcHJveHkgdG8gaXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCkge1xuICAgICAgICAvLyBzdGFydCBhcHBcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmluaXRBdXRvV2VidmlldygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdEF1dG9XZWJ2aWV3ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBsZXQgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgbGV0IHRpbWVvdXQgPSAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCkgfHwgMjAwMDtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcblxuICAgICAgLy8gdHJ5IGV2ZXJ5IDUwMG1zIHVudGlsIHRpbWVvdXQgaXMgb3ZlclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHBvcHVsYXRlIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LFxuICAgIC8vIGFuZCB0aGUgZGV2aWNlIGJlaW5nIHVzZWRcbiAgICAvLyBpbiB0aGUgb3B0cyBhbmQgY2FwcyAoc28gaXQgZ2V0cyBiYWNrIHRvIHRoZSB1c2VyIG9uIHNlc3Npb24gY3JlYXRpb24pXG4gICAgbGV0IGxhdW5jaEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGxhdW5jaEluZm8pO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jYXBzLCBsYXVuY2hJbmZvKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHModGhpcy5vcHRzKTtcbiAgICAgIC8vIE9ubHkgU0VUVElOR1NfSEVMUEVSX1BLR19JRCBwYWNrYWdlIGlzIHVzZWQgYnkgVUlBMVxuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgQVBQX0VYVEVOU0lPTikpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbGwgYXBwXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgY29uc3QgYXBrU3RyaW5nc0Zvckxhbmd1YWdlID0gYXdhaXQgaGVscGVycy5wdXNoU3RyaW5ncyh0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGlmICh0aGlzLm9wdHMubGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXBrU3RyaW5nc0Zvckxhbmd1YWdlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbXVzdCBydW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBrLCBvdGhlcndpc2UgaXQgd291bGQgY2F1c2UgdGhlXG4gICAgLy8gaW5zdGFsbCB0byBmYWlsLiBBbmQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcC5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzLm9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICR7dGhpcy5vcHRzLmFwcH1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja1BhY2thZ2VQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZScpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsIHRoaXMub3B0cy5hcHBQYWNrYWdlXSkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBwYWNrYWdlICR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IG9uIHRoZSBkZXZpY2VgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlXG4gIGFzeW5jIHNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgKGNvbXByZXNzKSB7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignY29tcHJlc3NlZExheW91dEhpZXJhcmNoeScsIHtjb21wcmVzc0xheW91dDogY29tcHJlc3N9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdTaHV0dGluZyBkb3duIEFuZHJvaWQgZHJpdmVyJyk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuXG4gICAgYXdhaXQgaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuXG4gICAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgICAvLyBjZXJ0YWluIGNsZWFudXAgd2Ugb25seSBjYXJlIHRvIGRvIGlmIHRoZSBib290c3RyYXAgd2FzIGV2ZXIgcnVuXG4gICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJHt0aGlzLmRlZmF1bHRJTUV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uZ29Ub0hvbWUoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYj8udW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNodXRkb3duKCk7XG4gICAgICB0aGlzLmJvb3RzdHJhcCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYj8uc3RvcExvZ2NhdCgpO1xuICAgIGlmICh0aGlzLnVzZVVubG9ja0hlbHBlckFwcCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCgnaW8uYXBwaXVtLnVubG9jaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyB3aW5kb3cgYW5pbWF0aW9uIHN0YXRlJyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG5cbiAgICAgIC8vIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgYW5pbWF0aW9uIHNjYWxlIG92ZXIgQW5kcm9pZCBQLiBXZSBtdXN0IHJlc2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzZWN1cml0eS5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYj8uZ2V0QXBpTGV2ZWwoKSA+PSAyOCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBzZXQgc2hhcmVkIHByZWZlcmVuY2VzJyk7XG4gICAgbGV0IG5hbWUgPSBzaGFyZWRQcmVmcy5uYW1lO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBTa2lwcGluZyBzZXR0aW5nIFNoYXJlZCBwcmVmZXJlbmNlcywgbmFtZSBpcyB1bmRlZmluZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2hhcmVkUHJlZnMpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVtb3RlUGF0aCA9IGAvZGF0YS9kYXRhLyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9L3NoYXJlZF9wcmVmc2A7XG4gICAgbGV0IHJlbW90ZUZpbGUgPSBgJHtyZW1vdGVQYXRofS8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGxvY2FsUGF0aCA9IGAvdG1wLyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgYnVpbGRlciA9IHRoaXMuZ2V0UHJlZnNCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5idWlsZChzaGFyZWRQcmVmcy5wcmVmcyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDcmVhdGluZyBzaGFyZWRfcHJlZnMgcmVtb3RlIGZvbGRlcjogJHtyZW1vdGVQYXRofWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUHVzaGluZyBzaGFyZWRfcHJlZnMgdG8gJHtyZW1vdGVGaWxlfWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVGaWxlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlICR7bG9jYWxQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByZWZzQnVpbGRlciAoKSB7XG4gICAgLyogQWRkIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTaGFyZWRQcmVmc0J1aWxkZXIgaW5zdGVhZCBvZlxuICAgICAqIGRpcmVjdGx5IGNyZWF0aW5nIHRoZSBvYmplY3Qgb24gc2V0U2hhcmVkUHJlZmVyZW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAqL1xuICAgIHJldHVybiBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyKCk7XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgaWYgKCFzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoIWNhcHMuYnJvd3Nlck5hbWUgfHwgIWhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKGNhcHMuYnJvd3Nlck5hbWUpKSAmJiAhY2Fwcy5hcHAgJiYgIWNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIG11c3QgaW5jbHVkZSBlaXRoZXIgYW4gYXBwLCBhcHBQYWNrYWdlIG9yIGJyb3dzZXJOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiBDaHJvbWVEcml2ZXIgc3RhdHVzXG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih0aGlzLnByb3h5UmVxUmVzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxNQUF0QjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxJQUFwQjtBQUlBLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsTUFBRCxFQUFTLElBQUlDLE1BQUosQ0FBVyx5QkFBWCxDQUFULENBRGUsRUFFZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQUZlLEVBR2YsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLHdCQUFYLENBQVQsQ0FIZSxFQUlmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyx3QkFBWCxDQUFSLENBSmUsRUFLZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0JBQVgsQ0FBVCxDQUxlLEVBTWYsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLHFDQUFYLENBQVQsQ0FOZSxFQU9mLENBQUMsTUFBRCxFQUFTLElBQUlBLE1BQUosQ0FBVyw2QkFBWCxDQUFULENBUGUsRUFRZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENB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
423
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OIiwiREVWSUNFX1BPUlQiLCJOT19QUk9YWSIsIlJlZ0V4cCIsIkFuZHJvaWREcml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJkZXNpcmVkQ29uc3RyYWludHMiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImp3cFByb3h5QWN0aXZlIiwiandwUHJveHlBdm9pZCIsIl8iLCJjbG9uZSIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJhcGtTdHJpbmdzIiwidW5sb2NrZXIiLCJoZWxwZXJzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0T3B0cyIsImFjdGlvbiIsImNhdGVnb3J5IiwiZmxhZ3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwidG1wRGlyIiwidGVtcERpciIsInN0YXRpY0RpciIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImJvb3RzdHJhcFBvcnQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJkZWZhdWx0cyIsInVzZVVubG9ja0hlbHBlckFwcCIsImlzVW5kZWZpbmVkIiwidW5sb2NrVHlwZSIsIm5vUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiaXNDaHJvbWVTZXNzaW9uIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsInB1c2giLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsInN1cHByZXNzS2lsbFNlcnZlciIsInJlbW90ZUFkYkhvc3QiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0IiwiYWRiRXhlY1RpbWVvdXQiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZ2V0QXBpTGV2ZWwiLCJsb2ciLCJ3YXJuIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJhcHAiLCJhcHBQYWNrYWdlIiwiY29uZmlndXJlQXBwIiwiY2hlY2tBcHBQcmVzZW50IiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiY2hlY2tQYWNrYWdlUHJlc2VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5ldHdvcmtTcGVlZCIsImlzRW11bGF0b3IiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInN0YXJ0QW5kcm9pZFNlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsImlnbiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwia2V5IiwidmFsdWUiLCJzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IiwiZGVmYXVsdElNRSIsImluaXREZXZpY2UiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VTY3JlZW5TaXplIiwiZ2V0U2NyZWVuU2l6ZSIsImRldmljZU1vZGVsIiwiZ2V0TW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJnZXRNYW51ZmFjdHVyZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwiYm9vdHN0cmFwIiwid2Vic29ja2V0Iiwic3RhcnQiLCJhY2NlcHRTc2xDZXJ0cyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgaGVscGVycywgZW5zdXJlTmV0d29ya1NwZWVkLFxuICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELFxufSBmcm9tICcuL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU2hhcmVkUHJlZnNCdWlsZGVyIH0gZnJvbSAnc2hhcmVkLXByZWZlcmVuY2VzLWJ1aWxkZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OID0gJy5hcGsnO1xuY29uc3QgREVWSUNFX1BPUlQgPSA0NzI0O1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0b1xuLy8gQ2hyb21lZHJpdmVyXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuXTtcblxuY2xhc3MgQW5kcm9pZERyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENvbnN0cmFpbnRzO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5jbG9uZShOT19QUk9YWSk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTtcbiAgICB0aGlzLnVubG9ja2VyID0gaGVscGVycy51bmxvY2tlcjtcblxuICAgIGZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gICAgICBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuXG4gICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIGxpbmUgd2hpY2ggYXNzaWducyBjb21tYW5kcyB0byBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZSwgc28gdGhhdCBgdGhpcy5kZWZhdWx0Q29udGV4dE5hbWVgIGlzIGRlZmluZWQuXG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICAvLyB0aGUgd2hvbGUgY3JlYXRlU2Vzc2lvbiBmbG93IGlzIHN1cnJvdW5kZWQgaW4gYSB0cnktY2F0Y2ggc3RhdGVtZW50XG4gICAgLy8gaWYgY3JlYXRpbmcgYSBzZXNzaW9uIGZhaWxzIGF0IGFueSBwb2ludCwgd2UgdGVhcmRvd24gZXZlcnl0aGluZyB3ZVxuICAgIC8vIHNldCB1cCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLlxuICAgIHRyeSB7XG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHNcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgLy8gYXNzaWduaW5nIGRlZmF1bHRzXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGFjdGlvbjogJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAgIGZsYWdzOiAnMHgxMDIwMDAwMCcsXG4gICAgICAgIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnM6IGZhbHNlLFxuICAgICAgICB0bXBEaXI6IGF3YWl0IHRlbXBEaXIuc3RhdGljRGlyKCksXG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGJvb3RzdHJhcFBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwLFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG4gICAgICB0aGlzLnVzZVVubG9ja0hlbHBlckFwcCA9IF8uaXNVbmRlZmluZWQodGhpcy5jYXBzLnVubG9ja1R5cGUpO1xuXG4gICAgICAvLyBub3QgdXNlciB2aXNpYmxlIHZpYSBjYXBzXG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICBoZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhpcy5qd3BQcm94eUF2b2lkLnB1c2goWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgICAvLyBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgQURCXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQURCKHtcbiAgICAgICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgICAgIGVtUG9ydDogdGhpcy5vcHRzLmVtUG9ydCxcbiAgICAgICAgYWRiUG9ydDogdGhpcy5vcHRzLmFkYlBvcnQsXG4gICAgICAgIHN1cHByZXNzS2lsbFNlcnZlcjogdGhpcy5vcHRzLnN1cHByZXNzS2lsbFNlcnZlcixcbiAgICAgICAgcmVtb3RlQWRiSG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QsXG4gICAgICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHRoaXMub3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgICAgICBhZGJFeGVjVGltZW91dDogdGhpcy5vcHRzLmFkYkV4ZWNUaW1lb3V0LFxuICAgICAgICBhbGxvd09mZmxpbmVEZXZpY2VzOiB0aGlzLm9wdHMuYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiQ29uc2lkZXIgc2V0dGluZyAnYXV0b21hdGlvbk5hbWUnIGNhcGFiaWxpdHkgdG8gXCIgK1xuICAgICAgICAgIFwiJ3VpYXV0b21hdG9yMicgb24gQW5kcm9pZCA+PSA2LCBzaW5jZSBVSUF1dG9tYXRvciBmcmFtZXdvcmsgXCIgK1xuICAgICAgICAgICdpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlIGJ5IHRoZSBPUyB2ZW5kb3IuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkpIHtcbiAgICAgICAgLy8gdXNlciBwcm92aWRlZCBwYWNrYWdlIGluc3RlYWQgb2YgYXBwIGZvciAnYXBwJyBjYXBhYmlsaXR5LCBtYXNzYWdlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRzLmFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwO1xuICAgICAgICB0aGlzLm9wdHMuYXBwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBBUFBfRVhURU5TSU9OKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlUHJlc2VudCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21lIGNsb3VkIHNlcnZpY2VzIHVzaW5nIGFwcGl1bSBsYXVuY2ggdGhlIGF2ZCB0aGVtc2VsdmVzLCBzbyB3ZSBlbnN1cmUgbmV0c3BlZWRcbiAgICAgIC8vIGlzIHNldCBmb3IgZW11bGF0b3JzIGJ5IGNhbGxpbmcgYWRiLm5ldHdvcmtTcGVlZCBiZWZvcmUgcnVubmluZyB0aGUgYXBwXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMubmV0d29ya1NwZWVkKSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnksIG5ldHdvcmtTcGVlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrU3BlZWQgPSBlbnN1cmVOZXR3b3JrU3BlZWQodGhpcy5hZGIsIHRoaXMub3B0cy5uZXR3b3JrU3BlZWQpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKCdTb3JyeSEgZ3BzRW5hYmxlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0QW5kcm9pZFNlc3Npb24odGhpcy5vcHRzKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yaW5nIGRlbGV0ZSBzZXNzaW9uIGV4Y2VwdGlvbiBpZiBhbnkgYW5kIHRocm93IHRoZSByZWFsIGVycm9yXG4gICAgICAvLyB0aGF0IGhhcHBlbmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXNzaW9uLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSB8fCAoIXRoaXMub3B0cy5hcHAgJiZcbiAgICAgICAgICAgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKSk7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ID09PSAnaWdub3JlVW5pbXBvcnRhbnRWaWV3cycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBbmRyb2lkU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgQW5kcm9pZCBzZXNzaW9uYCk7XG4gICAgLy8gc2V0IHVwIHRoZSBkZXZpY2UgdG8gcnVuIG9uIChyZWFsIG9yIGVtdWxhdG9yLCBldGMpXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlscy5cbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IGF3YWl0IHRoaXMuYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IGF3YWl0IHRoaXMuYWRiLmdldE1vZGVsKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IGF3YWl0IHRoaXMuYWRiLmdldE1hbnVmYWN0dXJlcigpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFQSSBsZXZlbCAyOCBpcyBBbmRyb2lkIFBcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gcmVzZXQgdGhlIHJlbGF4aW5nIGluIGRlbGV0ZSBzZXNzaW9uXG4gICAgICAgICAgdGhpcy5sb2cud2FybignUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFuaW1hdGlvbiBzY2FsZScpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIGl0IGlzIHJlcXVlc3RlZCBieSBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBzdGFydCBVaUF1dG9tYXRvclxuICAgIHRoaXMuYm9vdHN0cmFwID0gbmV3IGhlbHBlcnMuYm9vdHN0cmFwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYm9vdHN0cmFwUG9ydCwgdGhpcy5vcHRzLndlYnNvY2tldCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICAgIC8vIGhhbmRsaW5nIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXAub25VbmV4cGVjdGVkU2h1dGRvd247XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuXG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyBMZXQncyB0cnkgdG8gdW5sb2NrIHRoZSBkZXZpY2VcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IG9uIHRoZSBkZXZpY2UgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncyBvYmplY3RcbiAgICAvLyB0aGlzIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBib290c3RyYXAgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0aGlzLm9wdHMuaWdub3JlVW5pbXBvcnRhbnRWaWV3c30pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvbiBhbmQgcHJveHkgdG8gaXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCkge1xuICAgICAgICAvLyBzdGFydCBhcHBcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmluaXRBdXRvV2VidmlldygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdEF1dG9XZWJ2aWV3ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBsZXQgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgbGV0IHRpbWVvdXQgPSAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCkgfHwgMjAwMDtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcblxuICAgICAgLy8gdHJ5IGV2ZXJ5IDUwMG1zIHVudGlsIHRpbWVvdXQgaXMgb3ZlclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHBvcHVsYXRlIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LFxuICAgIC8vIGFuZCB0aGUgZGV2aWNlIGJlaW5nIHVzZWRcbiAgICAvLyBpbiB0aGUgb3B0cyBhbmQgY2FwcyAoc28gaXQgZ2V0cyBiYWNrIHRvIHRoZSB1c2VyIG9uIHNlc3Npb24gY3JlYXRpb24pXG4gICAgbGV0IGxhdW5jaEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGxhdW5jaEluZm8pO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jYXBzLCBsYXVuY2hJbmZvKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHModGhpcy5vcHRzKTtcbiAgICAgIC8vIE9ubHkgU0VUVElOR1NfSEVMUEVSX1BLR19JRCBwYWNrYWdlIGlzIHVzZWQgYnkgVUlBMVxuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgQVBQX0VYVEVOU0lPTikpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbGwgYXBwXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgY29uc3QgYXBrU3RyaW5nc0Zvckxhbmd1YWdlID0gYXdhaXQgaGVscGVycy5wdXNoU3RyaW5ncyh0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGlmICh0aGlzLm9wdHMubGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXBrU3RyaW5nc0Zvckxhbmd1YWdlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbXVzdCBydW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBrLCBvdGhlcndpc2UgaXQgd291bGQgY2F1c2UgdGhlXG4gICAgLy8gaW5zdGFsbCB0byBmYWlsLiBBbmQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcC5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzLm9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICR7dGhpcy5vcHRzLmFwcH1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja1BhY2thZ2VQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZScpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsIHRoaXMub3B0cy5hcHBQYWNrYWdlXSkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBwYWNrYWdlICR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IG9uIHRoZSBkZXZpY2VgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlXG4gIGFzeW5jIHNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgKGNvbXByZXNzKSB7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignY29tcHJlc3NlZExheW91dEhpZXJhcmNoeScsIHtjb21wcmVzc0xheW91dDogY29tcHJlc3N9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdTaHV0dGluZyBkb3duIEFuZHJvaWQgZHJpdmVyJyk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuXG4gICAgYXdhaXQgaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuXG4gICAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgICAvLyBjZXJ0YWluIGNsZWFudXAgd2Ugb25seSBjYXJlIHRvIGRvIGlmIHRoZSBib290c3RyYXAgd2FzIGV2ZXIgcnVuXG4gICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJHt0aGlzLmRlZmF1bHRJTUV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uZ29Ub0hvbWUoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYj8udW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNodXRkb3duKCk7XG4gICAgICB0aGlzLmJvb3RzdHJhcCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYj8uc3RvcExvZ2NhdCgpO1xuICAgIGlmICh0aGlzLnVzZVVubG9ja0hlbHBlckFwcCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCgnaW8uYXBwaXVtLnVubG9jaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyB3aW5kb3cgYW5pbWF0aW9uIHN0YXRlJyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG5cbiAgICAgIC8vIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgYW5pbWF0aW9uIHNjYWxlIG92ZXIgQW5kcm9pZCBQLiBXZSBtdXN0IHJlc2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzZWN1cml0eS5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYj8uZ2V0QXBpTGV2ZWwoKSA+PSAyOCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBzZXQgc2hhcmVkIHByZWZlcmVuY2VzJyk7XG4gICAgbGV0IG5hbWUgPSBzaGFyZWRQcmVmcy5uYW1lO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBTa2lwcGluZyBzZXR0aW5nIFNoYXJlZCBwcmVmZXJlbmNlcywgbmFtZSBpcyB1bmRlZmluZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2hhcmVkUHJlZnMpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVtb3RlUGF0aCA9IGAvZGF0YS9kYXRhLyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9L3NoYXJlZF9wcmVmc2A7XG4gICAgbGV0IHJlbW90ZUZpbGUgPSBgJHtyZW1vdGVQYXRofS8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGxvY2FsUGF0aCA9IGAvdG1wLyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgYnVpbGRlciA9IHRoaXMuZ2V0UHJlZnNCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5idWlsZChzaGFyZWRQcmVmcy5wcmVmcyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDcmVhdGluZyBzaGFyZWRfcHJlZnMgcmVtb3RlIGZvbGRlcjogJHtyZW1vdGVQYXRofWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUHVzaGluZyBzaGFyZWRfcHJlZnMgdG8gJHtyZW1vdGVGaWxlfWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVGaWxlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlICR7bG9jYWxQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByZWZzQnVpbGRlciAoKSB7XG4gICAgLyogQWRkIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTaGFyZWRQcmVmc0J1aWxkZXIgaW5zdGVhZCBvZlxuICAgICAqIGRpcmVjdGx5IGNyZWF0aW5nIHRoZSBvYmplY3Qgb24gc2V0U2hhcmVkUHJlZmVyZW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAqL1xuICAgIHJldHVybiBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyKCk7XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgaWYgKCFzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoIWNhcHMuYnJvd3Nlck5hbWUgfHwgIWhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKGNhcHMuYnJvd3Nlck5hbWUpKSAmJiAhY2Fwcy5hcHAgJiYgIWNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIG11c3QgaW5jbHVkZSBlaXRoZXIgYW4gYXBwLCBhcHBQYWNrYWdlIG9yIGJyb3dzZXJOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiBDaHJvbWVEcml2ZXIgc3RhdHVzXG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih0aGlzLnByb3h5UmVxUmVzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsV0FBVyxHQUFHLElBQUk7O0FBSXhCLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsTUFBTSxFQUFFLElBQUlDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzdDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBQ3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzNELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ2xELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQ3BELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQ3pELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQzNEO0FBRUQsTUFBTUMsYUFBYSxTQUFTQyxrQkFBVSxDQUFDO0VBQ3JDQyxXQUFXLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsa0JBQWtCLEdBQUcsSUFBSSxFQUFFO0lBQ2pELEtBQUssQ0FBQ0QsSUFBSSxFQUFFQyxrQkFBa0IsQ0FBQztJQUUvQixJQUFJLENBQUNDLGlCQUFpQixHQUFHLENBQ3ZCLE9BQU8sRUFDUCxJQUFJLEVBQ0osWUFBWSxFQUNaLGtCQUFrQixFQUNsQixzQkFBc0IsQ0FDdkI7SUFDRCxJQUFJLENBQUNDLHFCQUFxQixHQUFHQyxvQkFBa0I7SUFDL0MsSUFBSSxDQUFDQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDQyxjQUFjLEdBQUcsS0FBSztJQUMzQixJQUFJLENBQUNDLGFBQWEsR0FBR0MsZUFBQyxDQUFDQyxLQUFLLENBQUNkLFFBQVEsQ0FBQztJQUN0QyxJQUFJLENBQUNlLFFBQVEsR0FBRyxJQUFJQyxzQkFBYyxDQUFDO01BQUNDLHNCQUFzQixFQUFFO0lBQUssQ0FBQyxFQUMvQixJQUFJLENBQUNDLGdCQUFnQixDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsSUFBSSxDQUFDQyxZQUFZLEdBQUcsSUFBSTtJQUN4QixJQUFJLENBQUNDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDcEIsSUFBSSxDQUFDQyxRQUFRLEdBQUdDLHVCQUFPLENBQUNELFFBQVE7SUFFaEMsS0FBSyxJQUFJLENBQUNFLEdBQUcsRUFBRUMsRUFBRSxDQUFDLElBQUlaLGVBQUMsQ0FBQ2EsT0FBTyxDQUFDQyxjQUFRLENBQUMsRUFBRTtNQUN6Q3pCLGFBQWEsQ0FBQzBCLFNBQVMsQ0FBQ0osR0FBRyxDQUFDLEdBQUdDLEVBQUU7SUFDbkM7O0lBR0EsSUFBSSxDQUFDSSxVQUFVLEdBQUcsSUFBSSxDQUFDQyxrQkFBa0IsRUFBRTtFQUM3QztFQUVBLE1BQU1DLGFBQWEsQ0FBRSxHQUFHQyxJQUFJLEVBQUU7SUFJNUIsSUFBSTtNQUNGLElBQUksQ0FBQ0MsU0FBUyxFQUFFQyxJQUFJLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQ0gsYUFBYSxDQUFDLEdBQUdDLElBQUksQ0FBQztNQUUxRCxJQUFJRyxhQUFhLEdBQUc7UUFDbEJDLFFBQVEsRUFBRSxPQUFPO1FBQ2pCQyxpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCQyxlQUFlLEVBQUUsSUFBSTtRQUNyQkMsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QkMsZUFBZSxFQUFFLEtBQUs7UUFDdEJDLHdCQUF3QixFQUFFLElBQUk7UUFDOUJDLHNCQUFzQixFQUFFLEtBQUs7UUFDN0JDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDWkMsT0FBTyxFQUFFLElBQUksQ0FBQ1Y7TUFDaEIsQ0FBQztNQUVELElBQUksQ0FBQ0EsSUFBSSxHQUFHVyxNQUFNLENBQUNDLE1BQU0sQ0FBQ1gsYUFBYSxFQUFFLElBQUksQ0FBQ0QsSUFBSSxDQUFDOztNQUduRCxJQUFJYSxXQUFXLEdBQUc7UUFDaEJDLE1BQU0sRUFBRSw0QkFBNEI7UUFDcENDLFFBQVEsRUFBRSxrQ0FBa0M7UUFDNUNDLEtBQUssRUFBRSxZQUFZO1FBQ25CQyxzQkFBc0IsRUFBRSxLQUFLO1FBQzdCQyxNQUFNLEVBQUUsTUFBTUMsZ0JBQU8sQ0FBQ0MsU0FBUyxFQUFFO1FBQ2pDQyxTQUFTLEVBQUUsS0FBSztRQUNoQkMsVUFBVSxFQUFFLElBQUk7UUFDaEJDLE9BQU8sRUFBRUMsMkJBQWdCO1FBQ3pCQyxhQUFhLEVBQUU1RCxXQUFXO1FBQzFCNkQscUJBQXFCLEVBQUU7TUFDekIsQ0FBQztNQUNEL0MsZUFBQyxDQUFDZ0QsUUFBUSxDQUFDLElBQUksQ0FBQ3hELElBQUksRUFBRTBDLFdBQVcsQ0FBQztNQUNsQyxJQUFJLENBQUNlLGtCQUFrQixHQUFHakQsZUFBQyxDQUFDa0QsV0FBVyxDQUFDLElBQUksQ0FBQzdCLElBQUksQ0FBQzhCLFVBQVUsQ0FBQzs7TUFHN0QsSUFBSSxJQUFJLENBQUMzRCxJQUFJLENBQUM0RCxPQUFPLEtBQUssSUFBSSxFQUFFO1FBQzlCLElBQUksQ0FBQzVELElBQUksQ0FBQ2tELFNBQVMsR0FBRyxLQUFLO01BQzdCO01BQ0EsSUFBSSxJQUFJLENBQUNsRCxJQUFJLENBQUNrRCxTQUFTLEtBQUssSUFBSSxFQUFFO1FBQ2hDLElBQUksQ0FBQ2xELElBQUksQ0FBQzRELE9BQU8sR0FBRyxLQUFLO01BQzNCO01BQ0EsSUFBSSxDQUFDNUQsSUFBSSxDQUFDNkQsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDN0QsSUFBSSxDQUFDa0QsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDbEQsSUFBSSxDQUFDNEQsT0FBTztNQUNoRSxJQUFJLENBQUM1RCxJQUFJLENBQUM4RCxhQUFhLEdBQUcsSUFBSSxDQUFDOUQsSUFBSSxDQUFDNkQsU0FBUyxJQUFJLElBQUksQ0FBQzdELElBQUksQ0FBQzRELE9BQU87TUFFbEUsSUFBSSxJQUFJLENBQUNHLGVBQWUsRUFBRTtRQUN4QjdDLHVCQUFPLENBQUM4Qyx3QkFBd0IsQ0FBQyxJQUFJLENBQUNoRSxJQUFJLENBQUM7TUFDN0M7TUFFQSxJQUFJLElBQUksQ0FBQ0EsSUFBSSxDQUFDaUUsbUJBQW1CLEVBQUU7UUFDakMsSUFBSSxDQUFDMUQsYUFBYSxDQUFDMkQsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUl0RSxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO01BQzVFO01BRUEsSUFBSSxJQUFJLENBQUNJLElBQUksQ0FBQ21FLE1BQU0sRUFBRTtRQUNwQixJQUFJLENBQUNDLHNCQUFzQixDQUFDdkMsSUFBSSxDQUFDO01BQ25DOztNQUdBLElBQUk7UUFBQ3dDLElBQUk7UUFBRUM7TUFBTSxDQUFDLEdBQUcsTUFBTXBELHVCQUFPLENBQUNxRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUN2RSxJQUFJLENBQUM7TUFDbkUsSUFBSSxDQUFDQSxJQUFJLENBQUNxRSxJQUFJLEdBQUdBLElBQUk7TUFDckIsSUFBSSxDQUFDckUsSUFBSSxDQUFDc0UsTUFBTSxHQUFHQSxNQUFNOztNQUd6QixJQUFJLENBQUNFLEdBQUcsR0FBRyxNQUFNdEQsdUJBQU8sQ0FBQ3VELFNBQVMsQ0FBQztRQUNqQ0osSUFBSSxFQUFFLElBQUksQ0FBQ3JFLElBQUksQ0FBQ3FFLElBQUk7UUFDcEJDLE1BQU0sRUFBRSxJQUFJLENBQUN0RSxJQUFJLENBQUNzRSxNQUFNO1FBQ3hCbEIsT0FBTyxFQUFFLElBQUksQ0FBQ3BELElBQUksQ0FBQ29ELE9BQU87UUFDMUJzQixrQkFBa0IsRUFBRSxJQUFJLENBQUMxRSxJQUFJLENBQUMwRSxrQkFBa0I7UUFDaERDLGFBQWEsRUFBRSxJQUFJLENBQUMzRSxJQUFJLENBQUMyRSxhQUFhO1FBQ3RDQyxzQkFBc0IsRUFBRSxJQUFJLENBQUM1RSxJQUFJLENBQUM0RSxzQkFBc0I7UUFDeERDLGNBQWMsRUFBRSxJQUFJLENBQUM3RSxJQUFJLENBQUM2RSxjQUFjO1FBQ3hDQyxtQkFBbUIsRUFBRSxJQUFJLENBQUM5RSxJQUFJLENBQUM4RTtNQUNqQyxDQUFDLENBQUM7TUFFRixJQUFJLE9BQU0sSUFBSSxDQUFDTixHQUFHLENBQUNPLFdBQVcsRUFBRSxLQUFJLEVBQUUsRUFBRTtRQUN0QyxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLGtEQUFrRCxHQUM5RCw4REFBOEQsR0FDOUQsNkNBQTZDLENBQUM7TUFDbEQ7TUFFQSxJQUFJLElBQUksQ0FBQy9ELE9BQU8sQ0FBQ2dFLGlCQUFpQixDQUFDLElBQUksQ0FBQ2xGLElBQUksQ0FBQ21GLEdBQUcsQ0FBQyxFQUFFO1FBRWpELElBQUksQ0FBQ25GLElBQUksQ0FBQ29GLFVBQVUsR0FBRyxJQUFJLENBQUNwRixJQUFJLENBQUNtRixHQUFHO1FBQ3BDLElBQUksQ0FBQ25GLElBQUksQ0FBQ21GLEdBQUcsR0FBRyxJQUFJO01BQ3RCO01BRUEsSUFBSSxJQUFJLENBQUNuRixJQUFJLENBQUNtRixHQUFHLEVBQUU7UUFFakIsSUFBSSxDQUFDbkYsSUFBSSxDQUFDbUYsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDakUsT0FBTyxDQUFDbUUsWUFBWSxDQUFDLElBQUksQ0FBQ3JGLElBQUksQ0FBQ21GLEdBQUcsRUFBRTFGLGFBQWEsQ0FBQztRQUM3RSxNQUFNLElBQUksQ0FBQzZGLGVBQWUsRUFBRTtNQUM5QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNDLFdBQVcsRUFBRTtRQUczQixJQUFJLENBQUNQLEdBQUcsQ0FBQ1EsSUFBSSxDQUFFLHNEQUFxRCxHQUNqRSxHQUFFLElBQUksQ0FBQ3hGLElBQUksQ0FBQ29GLFVBQVcseUJBQXdCLENBQUM7UUFDbkQsTUFBTSxJQUFJLENBQUNLLG1CQUFtQixFQUFFO01BQ2xDOztNQUlBLElBQUlDLGFBQUksQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQzNGLElBQUksQ0FBQzRGLFlBQVksQ0FBQyxFQUFFO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUNDLFVBQVUsRUFBRSxFQUFFO1VBQ3RCLElBQUksQ0FBQ2IsR0FBRyxDQUFDQyxJQUFJLENBQUMsZ0VBQWdFLENBQUM7UUFDakYsQ0FBQyxNQUFNO1VBQ0wsTUFBTVcsWUFBWSxHQUFHLElBQUFFLGtDQUFrQixFQUFDLElBQUksQ0FBQ3RCLEdBQUcsRUFBRSxJQUFJLENBQUN4RSxJQUFJLENBQUM0RixZQUFZLENBQUM7VUFDekUsTUFBTSxJQUFJLENBQUNwQixHQUFHLENBQUNvQixZQUFZLENBQUNBLFlBQVksQ0FBQztRQUMzQztNQUNGO01BRUEsSUFBSUYsYUFBSSxDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDM0YsSUFBSSxDQUFDK0YsVUFBVSxDQUFDLEVBQUU7UUFDdkMsSUFBSSxJQUFJLENBQUNGLFVBQVUsRUFBRSxFQUFFO1VBQ3JCLElBQUksQ0FBQ2IsR0FBRyxDQUFDUSxJQUFJLENBQUUsYUFBWSxJQUFJLENBQUN4RixJQUFJLENBQUMrRixVQUFVLEdBQUcsUUFBUSxHQUFHLFNBQVUsd0JBQXVCLENBQUM7VUFDL0YsTUFBTSxJQUFJLENBQUN2QixHQUFHLENBQUN3Qix5QkFBeUIsQ0FBQyxJQUFJLENBQUNoRyxJQUFJLENBQUMrRixVQUFVLENBQUM7UUFDaEUsQ0FBQyxNQUFNO1VBQ0wsSUFBSSxDQUFDZixHQUFHLENBQUNDLElBQUksQ0FBQyw4REFBOEQsQ0FBQztRQUMvRTtNQUNGO01BRUEsTUFBTSxJQUFJLENBQUNnQixtQkFBbUIsQ0FBQyxJQUFJLENBQUNqRyxJQUFJLENBQUM7TUFDekMsT0FBTyxDQUFDNEIsU0FBUyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0lBQy9CLENBQUMsQ0FBQyxPQUFPcUUsQ0FBQyxFQUFFO01BR1YsSUFBSTtRQUNGLE1BQU0sSUFBSSxDQUFDQyxhQUFhLEVBQUU7TUFDNUIsQ0FBQyxDQUFDLE9BQU9DLEdBQUcsRUFBRSxDQUFDO01BQ2YsTUFBTUYsQ0FBQztJQUNUO0VBQ0Y7RUFFQUwsVUFBVSxHQUFJO0lBQ1osT0FBTzNFLHVCQUFPLENBQUMyRSxVQUFVLENBQUMsSUFBSSxDQUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQ3hFLElBQUksQ0FBQztFQUNoRDtFQUVBb0Usc0JBQXNCLENBQUV2QyxJQUFJLEVBQUU7SUFDNUIsSUFBSSxJQUFJLENBQUM3QixJQUFJLENBQUNxRyxHQUFHLEVBQUU7TUFDakIsSUFBSSxDQUFDckIsR0FBRyxDQUFDUSxJQUFJLENBQUMsNkRBQTZELENBQUM7SUFDOUUsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDM0QsSUFBSSxDQUFDeUUsVUFBVSxFQUFFO1FBQ3BCLElBQUksQ0FBQ3RCLEdBQUcsQ0FBQ3VCLGFBQWEsQ0FBQyxxRUFBcUUsQ0FBQztNQUMvRjtNQUNBLElBQUksQ0FBQzFFLElBQUksQ0FBQzJFLGVBQWUsRUFBRTtRQUN6QixJQUFJLENBQUN4QixHQUFHLENBQUN1QixhQUFhLENBQUMsMEVBQTBFLENBQUM7TUFDcEc7TUFDQSxJQUFJRSxTQUFTLEdBQUc1RSxJQUFJLENBQUN5RSxVQUFVLENBQUNJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUM7TUFDL0QsSUFBSSxDQUFDMUcsSUFBSSxDQUFDcUcsR0FBRyxHQUFJLEdBQUVJLFNBQVUsS0FBSTVFLElBQUksQ0FBQzJFLGVBQWdCLEVBQUM7SUFDekQ7RUFDRjtFQUVBLElBQUlqQixXQUFXLEdBQUk7SUFDakIsT0FBTyxJQUFJLENBQUNyRSxPQUFPLENBQUNnRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUNsRixJQUFJLENBQUNtRixHQUFHLENBQUMsSUFBSyxDQUFDLElBQUksQ0FBQ25GLElBQUksQ0FBQ21GLEdBQUcsSUFDaEUsSUFBSSxDQUFDakUsT0FBTyxDQUFDZ0UsaUJBQWlCLENBQUMsSUFBSSxDQUFDbEYsSUFBSSxDQUFDb0YsVUFBVSxDQUFFO0VBQzlEO0VBRUEsSUFBSXJCLGVBQWUsR0FBSTtJQUNyQixPQUFPN0MsdUJBQU8sQ0FBQ3lGLGVBQWUsQ0FBQyxJQUFJLENBQUMzRyxJQUFJLENBQUM0RyxXQUFXLENBQUM7RUFDdkQ7RUFFQSxNQUFNL0YsZ0JBQWdCLENBQUVnRyxHQUFHLEVBQUVDLEtBQUssRUFBRTtJQUNsQyxJQUFJRCxHQUFHLEtBQUssd0JBQXdCLEVBQUU7TUFDcEMsTUFBTSxJQUFJLENBQUNFLDRCQUE0QixDQUFDRCxLQUFLLENBQUM7SUFDaEQ7RUFDRjtFQUVBLE1BQU1iLG1CQUFtQixHQUFJO0lBQzNCLElBQUksQ0FBQ2pCLEdBQUcsQ0FBQ1EsSUFBSSxDQUFFLDBCQUF5QixDQUFDO0lBRXpDLElBQUksQ0FBQ3dCLFVBQVUsR0FBRyxNQUFNOUYsdUJBQU8sQ0FBQytGLFVBQVUsQ0FBQyxJQUFJLENBQUN6QyxHQUFHLEVBQUUsSUFBSSxDQUFDeEUsSUFBSSxDQUFDOztJQUcvRCxJQUFJLENBQUM2QixJQUFJLENBQUN5RSxVQUFVLEdBQUcsSUFBSSxDQUFDOUIsR0FBRyxDQUFDMEMsV0FBVztJQUMzQyxJQUFJLENBQUNyRixJQUFJLENBQUNzRixVQUFVLEdBQUcsSUFBSSxDQUFDbkgsSUFBSSxDQUFDcUUsSUFBSTtJQUNyQyxJQUFJLENBQUN4QyxJQUFJLENBQUMyRSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUNoQyxHQUFHLENBQUM0QyxrQkFBa0IsRUFBRTtJQUMvRCxJQUFJLENBQUN2RixJQUFJLENBQUN3RixnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQzdDLEdBQUcsQ0FBQzhDLGFBQWEsRUFBRTtJQUMzRCxJQUFJLENBQUN6RixJQUFJLENBQUMwRixXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMvQyxHQUFHLENBQUNnRCxRQUFRLEVBQUU7SUFDakQsSUFBSSxDQUFDM0YsSUFBSSxDQUFDNEYsa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUNqRCxHQUFHLENBQUNrRCxlQUFlLEVBQUU7SUFFL0QsSUFBSSxJQUFJLENBQUMxSCxJQUFJLENBQUMySCxzQkFBc0IsRUFBRTtNQUNwQyxJQUFJLE1BQU0sSUFBSSxDQUFDbkQsR0FBRyxDQUFDb0QsYUFBYSxFQUFFLEVBQUU7UUFDbEMsSUFBSSxPQUFNLElBQUksQ0FBQ3BELEdBQUcsQ0FBQ08sV0FBVyxFQUFFLEtBQUksRUFBRSxFQUFFO1VBRXRDLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUMsc0RBQXNELENBQUM7VUFDckUsTUFBTSxJQUFJLENBQUNULEdBQUcsQ0FBQ3FELGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDN0gsSUFBSSxDQUFDOEgsMEJBQTBCLENBQUM7UUFDaEY7UUFFQSxJQUFJLENBQUM5QyxHQUFHLENBQUNRLElBQUksQ0FBQyxzRkFBc0YsQ0FBQztRQUNyRyxNQUFNLElBQUksQ0FBQ2hCLEdBQUcsQ0FBQ3VELGlCQUFpQixDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUNDLDJCQUEyQixHQUFHLElBQUk7TUFDekMsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDaEQsR0FBRyxDQUFDUSxJQUFJLENBQUMsc0NBQXNDLENBQUM7TUFDdkQ7SUFDRjs7SUFHQSxNQUFNLElBQUksQ0FBQ3lDLE9BQU8sRUFBRTs7SUFHcEIsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSWhILHVCQUFPLENBQUNnSCxTQUFTLENBQUMsSUFBSSxDQUFDMUQsR0FBRyxFQUFFLElBQUksQ0FBQ3hFLElBQUksQ0FBQ3NELGFBQWEsRUFBRSxJQUFJLENBQUN0RCxJQUFJLENBQUNtSSxTQUFTLENBQUM7SUFDOUYsTUFBTSxJQUFJLENBQUNELFNBQVMsQ0FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQ3BJLElBQUksQ0FBQ29GLFVBQVUsRUFBRSxJQUFJLENBQUNwRixJQUFJLENBQUM4QyxzQkFBc0IsRUFBRSxJQUFJLENBQUM5QyxJQUFJLENBQUNxSSxjQUFjLENBQUM7SUFFNUcsQ0FBQyxZQUFZO01BQ1gsSUFBSTtRQUNGLE1BQU0sSUFBSSxDQUFDSCxTQUFTLENBQUNJLG9CQUFvQjtNQUMzQyxDQUFDLENBQUMsT0FBT0MsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQ0wsU0FBUyxDQUFDTSx3QkFBd0IsRUFBRTtVQUM1QyxNQUFNLElBQUksQ0FBQ0MsdUJBQXVCLENBQUNGLEdBQUcsQ0FBQztRQUN6QztNQUNGO0lBQ0YsQ0FBQyxHQUFHO0lBR0osSUFBSSxDQUFDLElBQUksQ0FBQ3ZJLElBQUksQ0FBQzBJLFVBQVUsRUFBRTtNQUV6QixNQUFNeEgsdUJBQU8sQ0FBQ3lILE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDbkUsR0FBRyxFQUFFLElBQUksQ0FBQzNDLElBQUksQ0FBQztJQUNqRDs7SUFJQSxJQUFJLElBQUksQ0FBQzdCLElBQUksQ0FBQ1ksc0JBQXNCLEVBQUU7TUFDcEMsTUFBTSxJQUFJLENBQUNGLFFBQVEsQ0FBQ2tJLE1BQU0sQ0FBQztRQUFDaEksc0JBQXNCLEVBQUUsSUFBSSxDQUFDWixJQUFJLENBQUNZO01BQXNCLENBQUMsQ0FBQztJQUN4RjtJQUVBLElBQUksSUFBSSxDQUFDbUQsZUFBZSxFQUFFO01BRXhCLE1BQU0sSUFBSSxDQUFDOEUsa0JBQWtCLEVBQUU7SUFDakMsQ0FBQyxNQUFNO01BQ0wsSUFBSSxJQUFJLENBQUM3SSxJQUFJLENBQUNtRCxVQUFVLEVBQUU7UUFFeEIsTUFBTSxJQUFJLENBQUMyRixRQUFRLEVBQUU7TUFDdkI7SUFDRjtJQUVBLElBQUlwRCxhQUFJLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUMzRixJQUFJLENBQUMrSSxXQUFXLENBQUMsRUFBRTtNQUN4QyxJQUFJLENBQUMvRCxHQUFHLENBQUNnRSxLQUFLLENBQUUsbUNBQWtDLElBQUksQ0FBQ2hKLElBQUksQ0FBQytJLFdBQVksR0FBRSxDQUFDO01BQzNFLE1BQU0sSUFBSSxDQUFDRSxjQUFjLENBQUMsSUFBSSxDQUFDakosSUFBSSxDQUFDK0ksV0FBVyxDQUFDO0lBQ2xEO0lBRUEsTUFBTSxJQUFJLENBQUNHLGVBQWUsRUFBRTtFQUM5QjtFQUVBLE1BQU1BLGVBQWUsR0FBSTtJQUN2QixJQUFJLElBQUksQ0FBQ2xKLElBQUksQ0FBQ21KLFdBQVcsRUFBRTtNQUN6QixJQUFJQyxRQUFRLEdBQUcsSUFBSSxDQUFDQyxrQkFBa0IsRUFBRTtNQUN4QyxJQUFJQyxPQUFPLEdBQUksSUFBSSxDQUFDdEosSUFBSSxDQUFDdUosa0JBQWtCLElBQUssSUFBSTtNQUVwRCxJQUFJLENBQUN2RSxHQUFHLENBQUNRLElBQUksQ0FBRSxvQ0FBbUM0RCxRQUFTLGtCQUFpQkUsT0FBUSxJQUFHLENBQUM7O01BR3hGLE1BQU0sSUFBQUUsdUJBQWEsRUFBQ0YsT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWTtRQUNsRCxNQUFNLElBQUksQ0FBQ0csVUFBVSxDQUFDTCxRQUFRLENBQUM7TUFDakMsQ0FBQyxDQUFDO0lBQ0o7RUFDRjtFQUVBLE1BQU1uQixPQUFPLEdBQUk7SUFJZixJQUFJeUIsVUFBVSxHQUFHLE1BQU14SSx1QkFBTyxDQUFDeUksYUFBYSxDQUFDLElBQUksQ0FBQ25GLEdBQUcsRUFBRSxJQUFJLENBQUN4RSxJQUFJLENBQUM7SUFDakV3QyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUN6QyxJQUFJLEVBQUUwSixVQUFVLENBQUM7SUFDcENsSCxNQUFNLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUNaLElBQUksRUFBRTZILFVBQVUsQ0FBQzs7SUFHcEMsSUFBSSxJQUFJLENBQUMxSixJQUFJLENBQUM0SixzQkFBc0IsRUFBRTtNQUNwQzFJLHVCQUFPLENBQUMySSxtQkFBbUIsQ0FBQyxJQUFJLENBQUM3SixJQUFJLENBQUM7TUFFdEMsTUFBTWtCLHVCQUFPLENBQUMwSSxzQkFBc0IsQ0FDbEMsSUFBSSxDQUFDcEYsR0FBRyxFQUNSdEQsdUJBQU8sQ0FBQzRJLFVBQVUsQ0FBQyxJQUFJLENBQUM5SixJQUFJLENBQUM0SixzQkFBc0IsQ0FBQyxFQUNwRCxDQUFDRyxzQ0FBc0IsQ0FBQyxDQUN6QjtJQUNIOztJQUdBLElBQUksSUFBSSxDQUFDL0osSUFBSSxDQUFDZ0ssU0FBUyxFQUFFO01BQ3ZCLElBQUlBLFNBQVM7TUFDYixJQUFJO1FBQ0ZBLFNBQVMsR0FBRzlJLHVCQUFPLENBQUM0SSxVQUFVLENBQUMsSUFBSSxDQUFDOUosSUFBSSxDQUFDZ0ssU0FBUyxDQUFDO01BQ3JELENBQUMsQ0FBQyxPQUFPOUQsQ0FBQyxFQUFFO1FBQ1YsSUFBSSxDQUFDbEIsR0FBRyxDQUFDdUIsYUFBYSxDQUFFLDJDQUEwQ0wsQ0FBQyxDQUFDK0QsT0FBUSxFQUFDLENBQUM7TUFDaEY7TUFDQUQsU0FBUyxHQUFHLE1BQU1FLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ0gsU0FBUyxDQUFDSSxHQUFHLENBQUVqRixHQUFHLElBQUssSUFBSSxDQUFDakUsT0FBTyxDQUFDbUUsWUFBWSxDQUFDRixHQUFHLEVBQUUxRixhQUFhLENBQUMsQ0FBQyxDQUFDO01BQzlGLE1BQU15Qix1QkFBTyxDQUFDbUosZ0JBQWdCLENBQUNMLFNBQVMsRUFBRSxJQUFJLENBQUN4RixHQUFHLEVBQUUsSUFBSSxDQUFDeEUsSUFBSSxDQUFDO0lBQ2hFOztJQUdBLElBQUksQ0FBQyxJQUFJLENBQUNBLElBQUksQ0FBQ21GLEdBQUcsRUFBRTtNQUNsQixJQUFJLElBQUksQ0FBQ25GLElBQUksQ0FBQ2tELFNBQVMsRUFBRTtRQUN2QixJQUFJLENBQUM4QixHQUFHLENBQUN1QixhQUFhLENBQUMsNkVBQTZFLENBQUM7TUFDdkc7TUFDQSxJQUFJLENBQUN2QixHQUFHLENBQUNnRSxLQUFLLENBQUMseURBQXlELENBQUM7TUFDekUsSUFBSSxJQUFJLENBQUNoSixJQUFJLENBQUM2RCxTQUFTLEVBQUU7UUFDdkIsTUFBTTNDLHVCQUFPLENBQUNvSixRQUFRLENBQUMsSUFBSSxDQUFDOUYsR0FBRyxFQUFFLElBQUksQ0FBQ3hFLElBQUksQ0FBQztNQUM3QztNQUNBO0lBQ0Y7SUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDQSxJQUFJLENBQUM4RCxhQUFhLEVBQUU7TUFDNUIsTUFBTSxJQUFJLENBQUNVLEdBQUcsQ0FBQytGLFlBQVksQ0FBQyxJQUFJLENBQUN2SyxJQUFJLENBQUNvRixVQUFVLENBQUM7SUFDbkQ7SUFDQSxNQUFNbEUsdUJBQU8sQ0FBQ3NKLFVBQVUsQ0FBQyxJQUFJLENBQUNoRyxHQUFHLEVBQUUsSUFBSSxDQUFDeEUsSUFBSSxDQUFDO0lBQzdDLE1BQU15SyxxQkFBcUIsR0FBRyxNQUFNdkosdUJBQU8sQ0FBQ3dKLFdBQVcsQ0FBQyxJQUFJLENBQUMxSyxJQUFJLENBQUMySyxRQUFRLEVBQUUsSUFBSSxDQUFDbkcsR0FBRyxFQUFFLElBQUksQ0FBQ3hFLElBQUksQ0FBQztJQUNoRyxJQUFJLElBQUksQ0FBQ0EsSUFBSSxDQUFDMkssUUFBUSxFQUFFO01BQ3RCLElBQUksQ0FBQzNKLFVBQVUsQ0FBQyxJQUFJLENBQUNoQixJQUFJLENBQUMySyxRQUFRLENBQUMsR0FBR0YscUJBQXFCO0lBQzdEOztJQUlBLElBQUksQ0FBQ2pLLGVBQUMsQ0FBQ2tELFdBQVcsQ0FBQyxJQUFJLENBQUMxRCxJQUFJLENBQUM0SyxpQkFBaUIsQ0FBQyxFQUFFO01BQy9DLE1BQU0sSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM3SyxJQUFJLENBQUM7SUFDNUM7RUFDRjtFQUVBLE1BQU1zRixlQUFlLEdBQUk7SUFDdkIsSUFBSSxDQUFDTixHQUFHLENBQUNnRSxLQUFLLENBQUMsMENBQTBDLENBQUM7SUFDMUQsSUFBSSxFQUFFLE1BQU04QixXQUFFLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUMvSyxJQUFJLENBQUNtRixHQUFHLENBQUMsQ0FBQyxFQUFFO01BQ3JDLElBQUksQ0FBQ0gsR0FBRyxDQUFDdUIsYUFBYSxDQUFFLDZCQUE0QixJQUFJLENBQUN2RyxJQUFJLENBQUNtRixHQUFJLEVBQUMsQ0FBQztJQUN0RTtFQUNGO0VBRUEsTUFBTU0sbUJBQW1CLEdBQUk7SUFDM0IsSUFBSSxDQUFDVCxHQUFHLENBQUNnRSxLQUFLLENBQUMsbURBQW1ELENBQUM7SUFDbkUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDeEUsR0FBRyxDQUFDd0csS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDaEwsSUFBSSxDQUFDb0YsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQzdFLElBQUksQ0FBQ0osR0FBRyxDQUFDdUIsYUFBYSxDQUFFLDBCQUF5QixJQUFJLENBQUN2RyxJQUFJLENBQUNvRixVQUFXLGdCQUFlLENBQUM7SUFDeEY7RUFDRjs7RUFHQSxNQUFNMkIsNEJBQTRCLENBQUVrRSxRQUFRLEVBQUU7SUFDNUMsTUFBTSxJQUFJLENBQUMvQyxTQUFTLENBQUNnRCxVQUFVLENBQUMsMkJBQTJCLEVBQUU7TUFBQ0MsY0FBYyxFQUFFRjtJQUFRLENBQUMsQ0FBQztFQUMxRjtFQUVBLE1BQU05RSxhQUFhLEdBQUk7SUFBQTtJQUNyQixJQUFJLENBQUNuQixHQUFHLENBQUNnRSxLQUFLLENBQUMsOEJBQThCLENBQUM7SUFFOUMsSUFBSTtNQUNGLElBQUksQ0FBQ3hJLGVBQUMsQ0FBQzRLLE9BQU8sQ0FBQyxJQUFJLENBQUNDLDBCQUEwQixDQUFDLEVBQUU7UUFDL0MsTUFBTSxJQUFJLENBQUNDLG1CQUFtQixFQUFFO01BQ2xDO0lBQ0YsQ0FBQyxDQUFDLE9BQU9sRixHQUFHLEVBQUUsQ0FBQztJQUVmLE1BQU1sRix1QkFBTyxDQUFDcUssaUNBQWlDLENBQUMsSUFBSSxDQUFDQyxNQUFNLEVBQUUsSUFBSSxDQUFDNUosU0FBUyxDQUFDO0lBRTVFLE1BQU0sSUFBSSxDQUFDNkoseUJBQXlCLEVBQUU7SUFFdEMsTUFBTSxLQUFLLENBQUN0RixhQUFhLEVBQUU7SUFFM0IsSUFBSSxJQUFJLENBQUMrQixTQUFTLEVBQUU7TUFBQTtNQUVsQixNQUFNLElBQUksQ0FBQ3dELHVCQUF1QixFQUFFO01BQ3BDLElBQUksSUFBSSxDQUFDMUwsSUFBSSxDQUFDMkwsZUFBZSxJQUFJLElBQUksQ0FBQzNMLElBQUksQ0FBQzRMLGFBQWEsSUFBSSxJQUFJLENBQUM1RSxVQUFVLEVBQUU7UUFBQTtRQUMzRSxJQUFJLENBQUNoQyxHQUFHLENBQUNnRSxLQUFLLENBQUUsb0JBQW1CLElBQUksQ0FBQ2hDLFVBQVcsRUFBQyxDQUFDO1FBQ3JELG9CQUFNLElBQUksQ0FBQ3hDLEdBQUcsOENBQVIsVUFBVXFILE1BQU0sQ0FBQyxJQUFJLENBQUM3RSxVQUFVLENBQUM7TUFDekM7TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDakQsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDL0QsSUFBSSxDQUFDOEwsa0JBQWtCLEVBQUU7UUFBQTtRQUMxRCxxQkFBTSxJQUFJLENBQUN0SCxHQUFHLCtDQUFSLFdBQVV1SCxTQUFTLENBQUMsSUFBSSxDQUFDL0wsSUFBSSxDQUFDb0YsVUFBVSxDQUFDO01BQ2pEO01BQ0EscUJBQU0sSUFBSSxDQUFDWixHQUFHLCtDQUFSLFdBQVV3SCxRQUFRLEVBQUU7TUFDMUIsSUFBSSxJQUFJLENBQUNoTSxJQUFJLENBQUNrRCxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUNsRCxJQUFJLENBQUM4RCxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUN5QixXQUFXLEVBQUU7UUFBQTtRQUN4RSxxQkFBTSxJQUFJLENBQUNmLEdBQUcsK0NBQVIsV0FBVStGLFlBQVksQ0FBQyxJQUFJLENBQUN2SyxJQUFJLENBQUNvRixVQUFVLENBQUM7TUFDcEQ7TUFDQSxNQUFNLElBQUksQ0FBQzhDLFNBQVMsQ0FBQytELFFBQVEsRUFBRTtNQUMvQixJQUFJLENBQUMvRCxTQUFTLEdBQUcsSUFBSTtJQUN2QixDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNsRCxHQUFHLENBQUNnRSxLQUFLLENBQUMsa0RBQWtELENBQUM7SUFDcEU7SUFHQSxxQkFBTSxJQUFJLENBQUN4RSxHQUFHLCtDQUFSLFdBQVUwSCxVQUFVLEVBQUU7SUFDNUIsSUFBSSxJQUFJLENBQUN6SSxrQkFBa0IsRUFBRTtNQUFBO01BQzNCLHFCQUFNLElBQUksQ0FBQ2UsR0FBRywrQ0FBUixXQUFVdUgsU0FBUyxDQUFDLGtCQUFrQixDQUFDO0lBQy9DO0lBQ0EsSUFBSSxJQUFJLENBQUMvRCwyQkFBMkIsRUFBRTtNQUFBO01BQ3BDLElBQUksQ0FBQ2hELEdBQUcsQ0FBQ1EsSUFBSSxDQUFDLGtDQUFrQyxDQUFDO01BQ2pELHFCQUFNLElBQUksQ0FBQ2hCLEdBQUcsK0NBQVIsV0FBVXVELGlCQUFpQixDQUFDLElBQUksQ0FBQzs7TUFHdkMsSUFBSSxzQkFBTSxJQUFJLENBQUN2RCxHQUFHLCtDQUFSLFdBQVVPLFdBQVcsRUFBRSxNQUFJLEVBQUUsRUFBRTtRQUFBO1FBQ3ZDLElBQUksQ0FBQ0MsR0FBRyxDQUFDUSxJQUFJLENBQUMsaUVBQWlFLENBQUM7UUFDaEYscUJBQU0sSUFBSSxDQUFDaEIsR0FBRywrQ0FBUixXQUFVMkgseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQ25NLElBQUksQ0FBQzhILDBCQUEwQixDQUFDO01BQ25GO0lBQ0Y7SUFFQSxJQUFJLElBQUksQ0FBQzlILElBQUksQ0FBQ21FLE1BQU0sRUFBRTtNQUFBO01BQ3BCLElBQUlpSSxPQUFPLEdBQUcsSUFBSSxDQUFDcE0sSUFBSSxDQUFDcUcsR0FBRyxDQUFDSyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztNQUM1QyxJQUFJLENBQUMxQixHQUFHLENBQUNnRSxLQUFLLENBQUUscUJBQW9Cb0QsT0FBUSxHQUFFLENBQUM7TUFDL0Msc0JBQU0sSUFBSSxDQUFDNUgsR0FBRyxnREFBUixZQUFVNkgsWUFBWSxDQUFDRCxPQUFPLENBQUM7SUFDdkM7RUFDRjtFQUVBLE1BQU12QixvQkFBb0IsR0FBSTtJQUM1QixJQUFJeUIsV0FBVyxHQUFHLElBQUksQ0FBQ3RNLElBQUksQ0FBQzRLLGlCQUFpQjtJQUM3QyxJQUFJLENBQUM1RixHQUFHLENBQUNRLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztJQUNqRCxJQUFJK0csSUFBSSxHQUFHRCxXQUFXLENBQUNDLElBQUk7SUFDM0IsSUFBSS9MLGVBQUMsQ0FBQ2tELFdBQVcsQ0FBQzZJLElBQUksQ0FBQyxFQUFFO01BQ3ZCLElBQUksQ0FBQ3ZILEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLDJEQUEwRHVILElBQUksQ0FBQ0MsU0FBUyxDQUFDSCxXQUFXLENBQUUsRUFBQyxDQUFDO01BQ3ZHLE9BQU8sS0FBSztJQUNkO0lBQ0EsSUFBSUksVUFBVSxHQUFJLGNBQWEsSUFBSSxDQUFDMU0sSUFBSSxDQUFDb0YsVUFBVyxlQUFjO0lBQ2xFLElBQUl1SCxVQUFVLEdBQUksR0FBRUQsVUFBVyxJQUFHSCxJQUFLLE1BQUs7SUFDNUMsSUFBSUssU0FBUyxHQUFJLFFBQU9MLElBQUssTUFBSztJQUNsQyxJQUFJTSxPQUFPLEdBQUcsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDcENELE9BQU8sQ0FBQ0UsS0FBSyxDQUFDVCxXQUFXLENBQUNVLEtBQUssQ0FBQztJQUNoQyxJQUFJLENBQUNoSSxHQUFHLENBQUNRLElBQUksQ0FBRSwwQ0FBeUNvSCxTQUFVLEVBQUMsQ0FBQztJQUNwRUMsT0FBTyxDQUFDSSxNQUFNLENBQUNMLFNBQVMsQ0FBQztJQUN6QixJQUFJLENBQUM1SCxHQUFHLENBQUNRLElBQUksQ0FBRSx3Q0FBdUNrSCxVQUFXLEVBQUMsQ0FBQztJQUNuRSxNQUFNLElBQUksQ0FBQ2xJLEdBQUcsQ0FBQ3dHLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUwQixVQUFVLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUMxSCxHQUFHLENBQUNRLElBQUksQ0FBRSwyQkFBMEJtSCxVQUFXLEVBQUMsQ0FBQztJQUN0RCxNQUFNLElBQUksQ0FBQ25JLEdBQUcsQ0FBQ04sSUFBSSxDQUFDMEksU0FBUyxFQUFFRCxVQUFVLENBQUM7SUFDMUMsSUFBSTtNQUNGLElBQUksQ0FBQzNILEdBQUcsQ0FBQ1EsSUFBSSxDQUFFLG9EQUFtRCxDQUFDO01BQ25FLElBQUksTUFBTXNGLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDNkIsU0FBUyxDQUFDLEVBQUU7UUFDOUIsTUFBTTlCLFdBQUUsQ0FBQ29DLE1BQU0sQ0FBQ04sU0FBUyxDQUFDO01BQzVCO0lBQ0YsQ0FBQyxDQUFDLE9BQU8xRyxDQUFDLEVBQUU7TUFDVixJQUFJLENBQUNsQixHQUFHLENBQUNDLElBQUksQ0FBRSx5Q0FBd0MySCxTQUFVLEVBQUMsQ0FBQztJQUNyRTtJQUNBLE9BQU8sSUFBSTtFQUNiO0VBRUFFLGVBQWUsR0FBSTtJQUlqQixPQUFPLElBQUlLLDRDQUFrQixFQUFFO0VBQ2pDO0VBRUF0RCxtQkFBbUIsQ0FBRWhJLElBQUksRUFBRTtJQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDZ0ksbUJBQW1CLENBQUNoSSxJQUFJLENBQUMsRUFBRTtNQUNwQyxPQUFPLEtBQUs7SUFDZDtJQUNBLElBQUksQ0FBQyxDQUFDQSxJQUFJLENBQUMrRSxXQUFXLElBQUksQ0FBQzFGLHVCQUFPLENBQUN5RixlQUFlLENBQUM5RSxJQUFJLENBQUMrRSxXQUFXLENBQUMsS0FBSyxDQUFDL0UsSUFBSSxDQUFDc0QsR0FBRyxJQUFJLENBQUN0RCxJQUFJLENBQUN1RCxVQUFVLEVBQUU7TUFDdEcsSUFBSSxDQUFDSixHQUFHLENBQUN1QixhQUFhLENBQUMsZ0ZBQWdGLENBQUM7SUFDMUc7SUFDQSxPQUFPckYsdUJBQU8sQ0FBQzJJLG1CQUFtQixDQUFDaEksSUFBSSxDQUFDO0VBQzFDO0VBRUF1TCxXQUFXLENBQUV4TCxTQUFTLEVBQUU7SUFDdEIsS0FBSyxDQUFDd0wsV0FBVyxDQUFDeEwsU0FBUyxDQUFDO0lBRTVCLE9BQU8sSUFBSSxDQUFDdEIsY0FBYztFQUM1QjtFQUVBK00saUJBQWlCLENBQUV6TCxTQUFTLEVBQUU7SUFDNUIsS0FBSyxDQUFDeUwsaUJBQWlCLENBQUN6TCxTQUFTLENBQUM7SUFFbEMsT0FBTyxJQUFJLENBQUNyQixhQUFhO0VBQzNCO0VBRUErTSxRQUFRLENBQUUxTCxTQUFTLEVBQUU7SUFDbkIsS0FBSyxDQUFDMEwsUUFBUSxDQUFDMUwsU0FBUyxDQUFDOztJQUd6QixPQUFPcEIsZUFBQyxDQUFDK00sVUFBVSxDQUFDLElBQUksQ0FBQ0MsV0FBVyxDQUFDO0VBQ3ZDO0FBQ0Y7QUFBQztBQUFBLGVBR2MzTixhQUFhO0FBQUEifQ==