obsidian-integration-testing 2.0.3 → 2.0.5

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.
@@ -53,6 +53,8 @@ const CDP_DEFAULT_PORT = 8315;
53
53
  const COMMAND_TIMEOUT_IN_MILLISECONDS = 300;
54
54
  const EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
55
55
  const EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS = 12e4;
56
+ const KEYCODE_MENU = 82;
57
+ const KEYCODE_WAKEUP = 224;
56
58
  const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 3e4;
57
59
  let cachedTransport;
58
60
  async function createTransportFromOptions(options) {
@@ -127,27 +129,19 @@ async function createAppiumTransport(options) {
127
129
  throw new Error(`Invalid port in appiumUrl: ${url.port}`);
128
130
  }
129
131
  const appId = options.appId ?? APP_PACKAGE;
130
- (0, import_log.log)(`[transport-factory] Checking Appium server at ${options.appiumUrl}...`);
131
132
  let appiumProcess;
132
- try {
133
- await checkAppiumReachable(url);
134
- (0, import_log.log)("[transport-factory] Appium server is reachable.");
135
- } catch (error) {
136
- if (options.shouldAutoStartAppium === false) {
137
- throw error;
138
- }
139
- (0, import_log.log)(`[transport-factory] Appium not reachable, auto-starting on port ${String(port)}...`);
140
- appiumProcess = startAppiumServer(port);
141
- await waitForAppiumReady(url);
142
- (0, import_log.log)("[transport-factory] Auto-started Appium server is ready.");
143
- }
144
133
  let emulatorProcess;
145
134
  try {
146
- emulatorProcess = await ensureDeviceConnected({
135
+ [appiumProcess, emulatorProcess] = await startAppiumAndEmulator({
136
+ appiumUrl: url,
147
137
  avdName: options.avdName,
148
- deviceId: options.deviceId
138
+ deviceId: options.deviceId,
139
+ port,
140
+ shouldAutoStartAppium: options.shouldAutoStartAppium
149
141
  });
150
- (0, import_log.log)(`[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId})...`);
142
+ (0, import_log.log)(
143
+ `[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId}, retryTimeout: ${String(APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
144
+ );
151
145
  const browser = await (0, import_webdriverio.remote)({
152
146
  capabilities: {
153
147
  "appium:appActivity": APP_ACTIVITY,
@@ -229,6 +223,49 @@ function resolveEmulatorBinary() {
229
223
  }
230
224
  return (0, import_node_path.join)(sdkRoot, "emulator", "emulator");
231
225
  }
226
+ async function sendKeyEvent(deviceId, keyCode, description) {
227
+ await new Promise((resolve) => {
228
+ (0, import_node_child_process.execFile)(
229
+ "adb",
230
+ ["-s", deviceId, "shell", "input", "keyevent", String(keyCode)],
231
+ { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS },
232
+ (error) => {
233
+ if (error) {
234
+ (0, import_log.log)(
235
+ `[transport-factory] Warning: failed to ${description} (keyevent ${String(keyCode)}): ${error instanceof Error ? error.message : "unknown error"}`
236
+ );
237
+ }
238
+ resolve();
239
+ }
240
+ );
241
+ });
242
+ }
243
+ async function startAppiumAndEmulator(params) {
244
+ const { appiumUrl, avdName, deviceId, port, shouldAutoStartAppium } = params;
245
+ let needsAppiumStart = false;
246
+ (0, import_log.log)(`[transport-factory] Checking Appium server at ${appiumUrl.href}...`);
247
+ try {
248
+ await checkAppiumReachable(appiumUrl);
249
+ (0, import_log.log)("[transport-factory] Appium server is reachable.");
250
+ } catch (error) {
251
+ if (shouldAutoStartAppium === false) {
252
+ throw error;
253
+ }
254
+ needsAppiumStart = true;
255
+ }
256
+ let appiumProcess;
257
+ if (needsAppiumStart) {
258
+ (0, import_log.log)(`[transport-factory] Appium not reachable, auto-starting on port ${String(port)}...`);
259
+ appiumProcess = startAppiumServer(port);
260
+ }
261
+ const [, emulatorProcess] = await Promise.all([
262
+ needsAppiumStart ? waitForAppiumReady(appiumUrl).then(() => {
263
+ (0, import_log.log)("[transport-factory] Auto-started Appium server is ready.");
264
+ }) : Promise.resolve(),
265
+ ensureDeviceConnected({ avdName, deviceId })
266
+ ]);
267
+ return [appiumProcess, emulatorProcess];
268
+ }
232
269
  function startAppiumServer(port) {
233
270
  const child = (0, import_node_child_process.spawn)(`npx appium --log-timestamp --port ${String(port)}`, {
234
271
  detached: true,
@@ -249,6 +286,9 @@ function startEmulator(avdName) {
249
286
  return child;
250
287
  }
251
288
  async function waitForAppiumReady(url) {
289
+ (0, import_log.log)(
290
+ `[transport-factory] Waiting for Appium at ${url.href} (timeout: ${String(APPIUM_START_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
291
+ );
252
292
  const deadline = Date.now() + APPIUM_START_TIMEOUT_IN_MILLISECONDS;
253
293
  while (Date.now() < deadline) {
254
294
  try {
@@ -265,6 +305,10 @@ async function waitForAppiumReady(url) {
265
305
  );
266
306
  }
267
307
  async function waitForBoot(deviceId, deadline) {
308
+ const remainingMs = Math.max(0, deadline - Date.now());
309
+ (0, import_log.log)(
310
+ `[transport-factory] Waiting for device ${deviceId} to finish booting (remaining: ${String(remainingMs)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
311
+ );
268
312
  while (Date.now() < deadline) {
269
313
  const isBooted = await new Promise((resolve) => {
270
314
  (0, import_node_child_process.execFile)(
@@ -289,11 +333,15 @@ async function waitForBoot(deviceId, deadline) {
289
333
  );
290
334
  }
291
335
  async function waitForDevice(deviceId) {
336
+ (0, import_log.log)(
337
+ `[transport-factory] Waiting for device ${deviceId} to appear in ADB (timeout: ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
338
+ );
292
339
  const deadline = Date.now() + EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS;
293
340
  while (Date.now() < deadline) {
294
341
  if (await checkDeviceConnected(deviceId)) {
295
342
  (0, import_log.log)(`[transport-factory] Device ${deviceId} appeared in ADB, waiting for boot to complete...`);
296
343
  await waitForBoot(deviceId, deadline);
344
+ await wakeScreen(deviceId);
297
345
  return;
298
346
  }
299
347
  await new Promise((resolve) => {
@@ -304,9 +352,15 @@ async function waitForDevice(deviceId) {
304
352
  `Emulator device "${deviceId}" did not appear within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
305
353
  );
306
354
  }
355
+ async function wakeScreen(deviceId) {
356
+ (0, import_log.log)(`[transport-factory] Waking screen on device ${deviceId}...`);
357
+ await sendKeyEvent(deviceId, KEYCODE_WAKEUP, "wake screen");
358
+ await sendKeyEvent(deviceId, KEYCODE_MENU, "dismiss lock screen");
359
+ (0, import_log.log)(`[transport-factory] Screen wake complete on device ${deviceId}.`);
360
+ }
307
361
  // Annotate the CommonJS export names for ESM import in node:
308
362
  0 && (module.exports = {
309
363
  createTransportFromOptions,
310
364
  getOrCreateTransport
311
365
  });
312
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbnN1cmVEZXZpY2VDb25uZWN0ZWR9LlxuICovXG5pbnRlcmZhY2UgRW5zdXJlRGV2aWNlQ29ubmVjdGVkUGFyYW1zIHtcbiAgLyoqIEFWRCBuYW1lIHRvIGF1dG8tc3RhcnQgaWYgdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkLiAqL1xuICBhdmROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBEZXZpY2UgVURJRCB0byBjaGVjayAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuICovXG4gIGRldmljZUlkOiBzdHJpbmc7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jbGknKSB7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDbGlUcmFuc3BvcnQgKG5vIG9wdGlvbnMgb3IgdHlwZT1vYnNpZGlhbi1jbGkpJyk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2xpVHJhbnNwb3J0KCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBEZXNrdG9wQ2RwVHJhbnNwb3J0IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQgPz8gQ0RQX0RFRkFVTFRfUE9SVCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICAuLi4ob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBQb3J0OiBvcHRpb25zLnBvcnQgfSksXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgZGV2aWNlPSR7b3B0aW9ucy5kZXZpY2VJZH0pYCk7XG4gIHJldHVybiBjcmVhdGVBcHBpdW1UcmFuc3BvcnQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBxdWljayBIVFRQIGNoZWNrIGFnYWluc3QgdGhlIEFwcGl1bSBzZXJ2ZXIncyBzdGF0dXMgZW5kcG9pbnQuXG4gKlxuICogRmFpbHMgZmFzdCAod2l0aGluIHtAbGluayBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTfSkgd2l0aFxuICogYSBjbGVhciBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgbGV0dGluZyBXZWJEcml2ZXJJTyByZXRyeSBzaWxlbnRseSBmb3IgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIHBhcnNlZCBBcHBpdW0gVVJMLlxuICovXG5mdW5jdGlvbiBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkIHZpYSBBREIuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIGNoZWNrIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCBhbmQgaW4gdGhlIGBkZXZpY2VgIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gIGNvbnN0IGRldmljZUxpbmUgPSBsaW5lcy5maW5kKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoZGV2aWNlSWQpKTtcbiAgcmV0dXJuIGRldmljZUxpbmU/LmluY2x1ZGVzKCdcXHRkZXZpY2UnKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxBcHBpdW1UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gIGlmIChpc05hTihwb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgfVxuXG4gIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke29wdGlvbnMuYXBwaXVtVXJsfS4uLmApO1xuICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUuJyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgYXBwaXVtUHJvY2VzcyA9IHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQpO1xuICAgIGF3YWl0IHdhaXRGb3JBcHBpdW1SZWFkeSh1cmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgfVxuXG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGVtdWxhdG9yUHJvY2VzcyA9IGF3YWl0IGVuc3VyZURldmljZUNvbm5lY3RlZCh7XG4gICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICBkZXZpY2VJZDogb3B0aW9ucy5kZXZpY2VJZFxuICAgIH0pO1xuXG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSwgYXBwPSR7YXBwSWR9KS4uLmApO1xuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICdhcHBpdW06YXBwQWN0aXZpdHknOiBBUFBfQUNUSVZJVFksXG4gICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTphdXRvbWF0aW9uTmFtZSc6ICdVaUF1dG9tYXRvcjInLFxuICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTpzZXR0aW5ncyc6IHtcbiAgICAgICAgICAnYXBwaXVtOmNocm9tZWRyaXZlckF1dG9kb3dubG9hZCc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2FwcGl1bTpza2lwU2VydmVySW5zdGFsbGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnRcbiAgICB9KTtcblxuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IHRyYW5zcG9ydC5kaXNwb3NlLmJpbmQodHJhbnNwb3J0KTtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgYXBwaXVtUHJvY2Vzcy5raWxsKCk7XG4gICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIGVtdWxhdG9yIHN0b3BwZWQuJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0cmFuc3BvcnQ7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgfVxuICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgIGVtdWxhdG9yUHJvY2Vzcy5raWxsKCk7XG4gICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQsIG9wdGlvbmFsbHkgYXV0by1zdGFydGluZyBhblxuICogZW11bGF0b3IgaWYgYW4gQVZEIG5hbWUgaXMgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIERldmljZSBhbmQgb3B0aW9uYWwgQVZEIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gcGFyYW1zLmF2ZE5hbWUgLSBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC5cbiAqIEBwYXJhbSBwYXJhbXMuZGV2aWNlSWQgLSBEZXZpY2UgVURJRCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBlbXVsYXRvciBjaGlsZCBwcm9jZXNzIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHBhcmFtczogRW5zdXJlRGV2aWNlQ29ubmVjdGVkUGFyYW1zKTogUHJvbWlzZTxDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyBhdmROYW1lLCBkZXZpY2VJZCB9ID0gcGFyYW1zO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ2hlY2tpbmcgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZCB2aWEgQURCLi4uYCk7XG5cbiAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBEZXZpY2UgJHtkZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWF2ZE5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBpcyBub3QgY29ubmVjdGVkLiBTdGFydCB0aGUgZW11bGF0b3IgYmVmb3JlIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMsYFxuICAgICAgICArICcgb3Igc2V0IGF2ZE5hbWUgaW4gdHJhbnNwb3J0IG9wdGlvbnMgdG8gYXV0by1zdGFydCBpdC4nXG4gICAgKTtcbiAgfVxuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBEZXZpY2UgJHtkZXZpY2VJZH0gbm90IGZvdW5kLCBzdGFydGluZyBlbXVsYXRvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi5gKTtcbiAgY29uc3QgZW11bGF0b3JQcm9jZXNzID0gc3RhcnRFbXVsYXRvcihhdmROYW1lKTtcbiAgYXdhaXQgd2FpdEZvckRldmljZShkZXZpY2VJZCk7XG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHtkZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICByZXR1cm4gZW11bGF0b3JQcm9jZXNzO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwYXRoIHRvIHRoZSBBbmRyb2lkIGVtdWxhdG9yIGJpbmFyeS5cbiAqXG4gKiBVc2VzIGBBTkRST0lEX0hPTUVgIG9yIGBBTkRST0lEX1NES19ST09UYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBzZXQsXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBgZW11bGF0b3JgIChhc3N1bWVzIGl0J3MgaW4gUEFUSCkuXG4gKlxuICogQHJldHVybnMgVGhlIHBhdGggdG8gdGhlIGVtdWxhdG9yIGJpbmFyeS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gIGNvbnN0IHNka1Jvb3QgPSBwcm9jZXNzLmVudlsnQU5EUk9JRF9IT01FJ10gPz8gcHJvY2Vzcy5lbnZbJ0FORFJPSURfU0RLX1JPT1QnXTtcbiAgaWYgKCFzZGtSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBmaW5kIEFuZHJvaWQgZW11bGF0b3I6IG5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gam9pbihzZGtSb290LCAnZW11bGF0b3InLCAnZW11bGF0b3InKTtcbn1cblxuLyoqXG4gKiBTcGF3bnMgYW4gQXBwaXVtIHNlcnZlciBhcyBhIGRldGFjaGVkIGJhY2tncm91bmQgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IHRvIHN0YXJ0IEFwcGl1bSBvbi5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oYG5weCBhcHBpdW0gLS1sb2ctdGltZXN0YW1wIC0tcG9ydCAke1N0cmluZyhwb3J0KX1gLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddXG4gIH0pO1xuXG4gIGNoaWxkLnVucmVmKCk7XG4gIHJldHVybiBjaGlsZDtcbn1cblxuLyoqXG4gKiBTcGF3bnMgYW4gQW5kcm9pZCBlbXVsYXRvciBhcyBhIGJhY2tncm91bmQgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSBBVkQgbmFtZSB0byBzdGFydC5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0RW11bGF0b3IoYXZkTmFtZTogc3RyaW5nKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9IC1hdmQgJHthdmROYW1lfSAtbm8tc25hcHNob3Qtc2F2ZWApO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBbJy1hdmQnLCBhdmROYW1lLCAnLW5vLXNuYXBzaG90LXNhdmUnXSwge1xuICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBBcHBpdW0gc2VydmVyIHVudGlsIGl0IHJlc3BvbmRzIHRvIGAvc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICk7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIHRoZSBkZXZpY2UgdG8gZmluaXNoIGJvb3RpbmcgYnkgcG9sbGluZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0gZGVhZGxpbmUgLSBBYnNvbHV0ZSB0aW1lc3RhbXAgZGVhZGxpbmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBQb2xscyBgYWRiIGRldmljZXNgIHVudGlsIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGFwcGVhcnMgaW4gdGhlIGBkZXZpY2VgIHN0YXRlLlxuICpcbiAqIEFsc28gd2FpdHMgZm9yIHRoZSBkZXZpY2UgdG8gZmluaXNoIGJvb3RpbmcgYnkgY2hlY2tpbmcgYHN5cy5ib290X2NvbXBsZXRlZGAuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIHdhaXQgZm9yLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRGV2aWNlKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEVtdWxhdG9yIGRldmljZSBcIiR7ZGV2aWNlSWR9XCIgZGlkIG5vdCBhcHBlYXIgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FHTztBQUNQLHVCQUFpQjtBQUNqQix1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLHlCQUF1QjtBQVF2QixpQkFBb0I7QUFDcEIsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBb0M7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFD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
366
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPEFwcGl1bVRyYW5zcG9ydD4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICB9XG5cbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBvcHRpb25zLmRldmljZUlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICB9KTtcblxuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3RvcnldIENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSwgYXBwPSR7YXBwSWR9LCByZXRyeVRpbWVvdXQ6ICR7XG4gICAgICAgIFN0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcywgcmV0cmllczogJHtTdHJpbmcoQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQpfSkuLi5gXG4gICAgKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06c2V0dGluZ3MnOiB7XG4gICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgICdhcHBpdW06c2tpcFNlcnZlckluc3RhbGxhdGlvbic6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0XG4gICAgfSk7XG5cbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSB0cmFuc3BvcnQuZGlzcG9zZS5iaW5kKHRyYW5zcG9ydCk7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBrZXkgZXZlbnQgdG8gYSBkZXZpY2UgdmlhIEFEQi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyB3YXJuaW5nc1xuICogaW5zdGVhZCBvZiB0aHJvd2luZywgc2luY2Uga2V5IGV2ZW50cyBhcmUgYmVzdC1lZmZvcnQgKGUuZy4sIHRoZSBzY3JlZW5cbiAqIG1heSBhbHJlYWR5IGJlIG9uKS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ga2V5Q29kZSAtIFRoZSBBbmRyb2lkIGtleWNvZGUgdG8gc2VuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBsb2cgbWVzc2FnZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBleGVjRmlsZShcbiAgICAgICdhZGInLFxuICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgbG9nKFxuICAgICAgICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlciBhbmQgZW11bGF0b3IgaW4gcGFyYWxsZWwgd2hlbiBib3RoIG5lZWQgYXV0by1zdGFydGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gQ29uZmlndXJhdGlvbiBmb3IgQXBwaXVtIGFuZCBlbXVsYXRvciBzdGFydHVwLlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc11gLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIGB1bmRlZmluZWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWQsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgfVxuXG4gIGNvbnN0IFssIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgPyB3YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWQgfSlcbiAgXSk7XG5cbiAgcmV0dXJuIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBcHBpdW0gc2VydmVyIGFzIGEgZGV0YWNoZWQgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gc3RhcnQgQXBwaXVtIG9uLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBbmRyb2lkIGVtdWxhdG9yIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBuYW1lIHRvIHN0YXJ0LlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gLWF2ZCAke2F2ZE5hbWV9IC1uby1zbmFwc2hvdC1zYXZlYCk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIFsnLWF2ZCcsIGF2ZE5hbWUsICctbm8tc25hcHNob3Qtc2F2ZSddLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdW50aWwgaXQgcmVzcG9uZHMgdG8gYC9zdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICB9bXMpLi4uYFxuICApO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBwb2xsaW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSBkZWFkbGluZSAtIEFic29sdXRlIHRpbWVzdGFtcCBkZWFkbGluZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gIGxvZyhcbiAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGBhZGIgZGV2aWNlc2AgdW50aWwgdGhlIHNwZWNpZmllZCBkZXZpY2UgYXBwZWFycyBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKlxuICogQWxzbyB3YWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBjaGVja2luZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gd2FpdCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICBhd2FpdCB3YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRW11bGF0b3IgZGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBkaWQgbm90IGFwcGVhciB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFdha2VzIHRoZSBlbXVsYXRvciBzY3JlZW4gYW5kIGRpc21pc3NlcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQWZ0ZXIgYm9vdCwgdGhlIGVtdWxhdG9yIHNjcmVlbiBtYXkgYmUgb2ZmLiBTZW5kcyBgS0VZQ09ERV9XQUtFVVBgIHRvIHR1cm5cbiAqIG9uIHRoZSBkaXNwbGF5IGFuZCBgS0VZQ09ERV9NRU5VYCB0byBkaXNtaXNzIHRoZSBsb2NrIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICBhd2FpdCBzZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgYXdhaXQgc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FHTztBQUNQLHVCQUFpQjtBQUNqQix1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLHlCQUF1QjtBQVF2QixpQkFBb0I7QUFDcEIsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBb0M7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSxlQUFlO0FBQ3JCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sd0NBQXdDO0FBaUM5QyxJQUFJO0FBUUosZUFBc0IsMkJBQTJCLFNBQWdFO0FBQy9HLE1BQUksQ0FBQyxXQUFXLFFBQVEsU0FBUyxnQkFBZ0I7QUFDL0Msd0JBQUksb0ZBQW9GO0FBQ3hGLFdBQU8sSUFBSSxpREFBb0I7QUFBQSxFQUNqQztBQUVBLE1BQUksUUFBUSxTQUFTLGdCQUFnQjtBQUNuQyx3QkFBSSwwREFBMEQsUUFBUSxRQUFRLFdBQVcsVUFBVSxPQUFPLFFBQVEsUUFBUSxnQkFBZ0IsQ0FBQyxHQUFHO0FBQzlJLFdBQU8sSUFBSSxpREFBb0I7QUFBQSxNQUM3QixHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsaUNBQWlDLFVBQWEsRUFBRSw4QkFBOEIsUUFBUSw2QkFBNkI7QUFBQSxJQUNqSSxDQUFDO0FBQUEsRUFDSDtBQUVBLHNCQUFJLHFEQUFxRCxRQUFRLFNBQVMsWUFBWSxRQUFRLFFBQVEsR0FBRztBQUN6RyxTQUFPLHNCQUFzQixPQUFPO0FBQ3RDO0FBWUEsZUFBc0IscUJBQXFCLFNBQWdFO0FBQ3pHLE1BQUksaUJBQWlCO0FBQ25CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxTQUFTLE1BQU0sMkJBQTJCLE9BQU87QUFFdkQsb0JBQWtCO0FBQ2xCLFNBQU87QUFDVDtBQVVBLFNBQVMscUJBQXFCLEtBQXlCO0FBQ3JELFNBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3RDLFVBQU0sWUFBWSxJQUFJLElBQUksV0FBVyxHQUFHO0FBQ3hDLFVBQU0sTUFBTSxpQkFBQUEsUUFBSyxJQUFJLFdBQVcsRUFBRSxTQUFTLHlDQUF5QyxHQUFHLENBQUMsUUFBUTtBQUM5RixVQUFJLE9BQU87QUFDWCxjQUFRO0FBQUEsSUFDVixDQUFDO0FBQ0QsUUFBSSxHQUFHLFdBQVcsTUFBTTtBQUN0QixVQUFJLFFBQVE7QUFDWjtBQUFBLFFBQ0UsSUFBSTtBQUFBLFVBQ0Ysb0JBQW9CLElBQUksTUFBTSwyQkFBMkIsT0FBTyx3Q0FBd0MsQ0FBQztBQUFBLFFBQzNHO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNELFFBQUksR0FBRyxTQUFTLENBQUMsUUFBUTtBQUN2QjtBQUFBLFFBQ0UsSUFBSTtBQUFBLFVBQ0YsaUNBQWlDLElBQUksTUFBTSxLQUFLLElBQUksT0FBTztBQUFBLFFBQzdEO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBUUEsZUFBZSxxQkFBcUIsVUFBb0M7QUFDdEUsUUFBTSxTQUFTLE1BQU0sSUFBSSxRQUFnQixDQUFDLFNBQVMsV0FBVztBQUM1RCw0Q0FBUyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsU0FBUyx5Q0FBeUMsR0FBRyxDQUFDLE9BQU8sUUFBUSxXQUFXO0FBQzdHLFVBQUksT0FBTztBQUNULGVBQU8sSUFBSSxNQUFNLGdDQUFnQyxNQUFNLE9BQU8saUNBQWlDLENBQUM7QUFDaEc7QUFBQSxNQUNGO0FBQ0EsVUFBSSxRQUFRO0FBQ1YsNEJBQUksbUNBQW1DLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUN4RDtBQUNBLGNBQVEsTUFBTTtBQUFBLElBQ2hCLENBQUM7QUFBQSxFQUNILENBQUM7QUFFRCxRQUFNLFFBQVEsT0FBTyxNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO0FBQzVGLFFBQU0sYUFBYSxNQUFNLEtBQUssQ0FBQyxTQUFTLEtBQUssV0FBVyxRQUFRLENBQUM7QUFDakUsU0FBTyxZQUFZLFNBQVMsU0FBVSxLQUFLO0FBQzdDO0FBUUEsZUFBZSxzQkFBc0IsU0FBMEU7QUFDN0csUUFBTSxNQUFNLElBQUksSUFBSSxRQUFRLFNBQVM7QUFFckMsUUFBTSxPQUFPLE9BQU8sSUFBSSxJQUFJO0FBQzVCLE1BQUksTUFBTSxJQUFJLEdBQUc7QUFDZixVQUFNLElBQUksTUFBTSw4QkFBOEIsSUFBSSxJQUFJLEVBQUU7QUFBQSxFQUMxRDtBQUVBLFFBQU0sUUFBUSxRQUFRLFNBQVM7QUFFL0IsTUFBSTtBQUNKLE1BQUk7QUFFSixNQUFJO0FBQ0YsS0FBQyxlQUFlLGVBQWUsSUFBSSxNQUFNLHVCQUF1QjtBQUFBLE1BQzlELFdBQVc7QUFBQSxNQUNYLFNBQVMsUUFBUTtBQUFBLE1BQ2pCLFVBQVUsUUFBUTtBQUFBLE1BQ2xCO0FBQUEsTUFDQSx1QkFBdUIsUUFBUTtBQUFBLElBQ2pDLENBQUM7QUFFRDtBQUFBLE1BQ0Usb0RBQW9ELFFBQVEsUUFBUSxTQUFTLEtBQUssbUJBQ2hGLE9BQU8sK0NBQStDLENBQ3hELGdCQUFnQixPQUFPLDZCQUE2QixDQUFDO0FBQUEsSUFDdkQ7QUFDQSxVQUFNLFVBQVUsVUFBTSwyQkFBTztBQUFBLE1BQzNCLGNBQWM7QUFBQSxRQUNaLHNCQUFzQjtBQUFBLFFBQ3RCLHFCQUFxQjtBQUFBLFFBQ3JCLCtCQUErQjtBQUFBLFFBQy9CLHlCQUF5QjtBQUFBLFFBQ3pCLDRCQUE0QjtBQUFBLFFBQzVCLGtCQUFrQjtBQUFBLFFBQ2xCLG1CQUFtQjtBQUFBLFVBQ2pCLG1DQUFtQztBQUFBLFFBQ3JDO0FBQUEsUUFDQSxpQ0FBaUM7QUFBQSxRQUNqQyxlQUFlLFFBQVE7QUFBQSxRQUN2QiwwQ0FBMEM7QUFBQSxRQUMxQyxnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLE1BQ0Esc0JBQXNCO0FBQUEsTUFDdEIsd0JBQXdCO0FBQUEsTUFDeEIsVUFBVSxJQUFJO0FBQUEsTUFDZCxNQUFNLElBQUk7QUFBQSxNQUNWO0FBQUEsSUFDRixDQUFDO0FBRUQsd0JBQUksaURBQWlEO0FBQ3JELFVBQU0sWUFBWSxJQUFJLHdDQUFnQjtBQUFBLE1BQ3BDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsR0FBSSxRQUFRLGtCQUFrQixVQUFhLEVBQUUsZUFBZSxRQUFRLGNBQWM7QUFBQSxJQUNwRixDQUFDO0FBRUQsVUFBTSxrQkFBa0IsVUFBVSxRQUFRLEtBQUssU0FBUztBQUN4RCxjQUFVLFVBQVUsWUFBMkI7QUFDN0MsWUFBTSxnQkFBZ0I7QUFDdEIsVUFBSSxlQUFlO0FBQ2pCLHNCQUFjLEtBQUs7QUFDbkIsNEJBQUkseURBQXlEO0FBQUEsTUFDL0Q7QUFDQSxVQUFJLGlCQUFpQjtBQUNuQix3QkFBZ0IsS0FBSztBQUNyQiw0QkFBSSxvREFBb0Q7QUFBQSxNQUMxRDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVCxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksZUFBZTtBQUNqQixvQkFBYyxLQUFLO0FBQ25CLDBCQUFJLGlGQUFpRjtBQUFBLElBQ3ZGO0FBQ0EsUUFBSSxpQkFBaUI7QUFDbkIsc0JBQWdCLEtBQUs7QUFDckIsMEJBQUksNEVBQTRFO0FBQUEsSUFDbEY7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBV0EsZUFBZSxzQkFBc0IsUUFBd0U7QUFDM0csUUFBTSxFQUFFLFNBQVMsU0FBUyxJQUFJO0FBQzlCLHNCQUFJLHVDQUF1QyxRQUFRLDBCQUEwQjtBQUU3RSxNQUFJLE1BQU0scUJBQXFCLFFBQVEsR0FBRztBQUN4Qyx3QkFBSSw4QkFBOEIsUUFBUSxnQkFBZ0I7QUFDMUQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsU0FBUztBQUNaLFVBQU0sSUFBSTtBQUFBLE1BQ1IsV0FBVyxRQUFRO0FBQUEsSUFFckI7QUFBQSxFQUNGO0FBRUEsc0JBQUksOEJBQThCLFFBQVEsc0NBQXNDLE9BQU8sTUFBTTtBQUM3RixRQUFNLGtCQUFrQixjQUFjLE9BQU87QUFDN0MsUUFBTSxjQUFjLFFBQVE7QUFDNUIsc0JBQUksaUNBQWlDLE9BQU8scUJBQXFCLFFBQVEsZ0JBQWdCO0FBQ3pGLFNBQU87QUFDVDtBQVVBLFNBQVMsd0JBQWdDO0FBQ3ZDLFFBQU0sVUFBVSxvQkFBQUMsUUFBUSxJQUFJLGNBQWMsS0FBSyxvQkFBQUEsUUFBUSxJQUFJLGtCQUFrQjtBQUM3RSxNQUFJLENBQUMsU0FBUztBQUNaLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLGFBQU8sdUJBQUssU0FBUyxZQUFZLFVBQVU7QUFDN0M7QUFXQSxlQUFlLGFBQWEsVUFBa0IsU0FBaUIsYUFBb0M7QUFDakcsUUFBTSxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQ25DO0FBQUEsTUFDRTtBQUFBLE1BQ0EsQ0FBQyxNQUFNLFVBQVUsU0FBUyxTQUFTLFlBQVksT0FBTyxPQUFPLENBQUM7QUFBQSxNQUM5RCxFQUFFLFNBQVMseUNBQXlDO0FBQUEsTUFDcEQsQ0FBQyxVQUFVO0FBQ1QsWUFBSSxPQUFPO0FBQ1Q7QUFBQSxZQUNFLDBDQUEwQyxXQUFXLGNBQWMsT0FBTyxPQUFPLENBQUMsTUFBTSxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsZUFBZTtBQUFBLFVBQ2xKO0FBQUEsUUFDRjtBQUVBLGdCQUFRO0FBQUEsTUFDVjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVFBLGVBQWUsdUJBQXVCLFFBQXFHO0FBQ3pJLFFBQU0sRUFBRSxXQUFXLFNBQVMsVUFBVSxNQUFNLHNCQUFzQixJQUFJO0FBRXRFLE1BQUksbUJBQW1CO0FBRXZCLHNCQUFJLGlEQUFpRCxVQUFVLElBQUksS0FBSztBQUN4RSxNQUFJO0FBQ0YsVUFBTSxxQkFBcUIsU0FBUztBQUNwQyx3QkFBSSxpREFBaUQ7QUFBQSxFQUN2RCxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksMEJBQTBCLE9BQU87QUFDbkMsWUFBTTtBQUFBLElBQ1I7QUFDQSx1QkFBbUI7QUFBQSxFQUNyQjtBQUVBLE1BQUk7QUFFSixNQUFJLGtCQUFrQjtBQUNwQix3QkFBSSxtRUFBbUUsT0FBTyxJQUFJLENBQUMsS0FBSztBQUN4RixvQkFBZ0Isa0JBQWtCLElBQUk7QUFBQSxFQUN4QztBQUVBLFFBQU0sQ0FBQyxFQUFFLGVBQWUsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQzVDLG1CQUNJLG1CQUFtQixTQUFTLEVBQUUsS0FBSyxNQUFNO0FBQ3pDLDBCQUFJLDBEQUEwRDtBQUFBLElBQ2hFLENBQUMsSUFDQyxRQUFRLFFBQVE7QUFBQSxJQUNwQixzQkFBc0IsRUFBRSxTQUFTLFNBQVMsQ0FBQztBQUFBLEVBQzdDLENBQUM7QUFFRCxTQUFPLENBQUMsZUFBZSxlQUFlO0FBQ3hDO0FBUUEsU0FBUyxrQkFBa0IsTUFBNEI7QUFDckQsUUFBTSxZQUFRLGlDQUFNLHFDQUFxQyxPQUFPLElBQUksQ0FBQyxJQUFJO0FBQUEsSUFDdkUsVUFBVTtBQUFBLElBQ1YsT0FBTztBQUFBLElBQ1AsT0FBTyxDQUFDLFVBQVUsV0FBVyxTQUFTO0FBQUEsRUFDeEMsQ0FBQztBQUVELFFBQU0sTUFBTTtBQUNaLFNBQU87QUFDVDtBQVFBLFNBQVMsY0FBYyxTQUErQjtBQUNwRCxRQUFNLGlCQUFpQixzQkFBc0I7QUFDN0Msc0JBQUksZ0NBQWdDLGNBQWMsU0FBUyxPQUFPLG9CQUFvQjtBQUN0RixRQUFNLFlBQVEsaUNBQU0sZ0JBQWdCLENBQUMsUUFBUSxTQUFTLG1CQUFtQixHQUFHO0FBQUEsSUFDMUUsVUFBVTtBQUFBLElBQ1YsT0FBTyxDQUFDLFVBQVUsVUFBVSxRQUFRO0FBQUEsRUFDdEMsQ0FBQztBQUVELFFBQU0sTUFBTTtBQUNaLFNBQU87QUFDVDtBQU9BLGVBQWUsbUJBQW1CLEtBQXlCO0FBQ3pEO0FBQUEsSUFDRSw2Q0FBNkMsSUFBSSxJQUFJLGNBQWMsT0FBTyxvQ0FBb0MsQ0FBQyxhQUM3RyxPQUFPLDBDQUEwQyxDQUNuRDtBQUFBLEVBQ0Y7QUFDQSxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFFOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUk7QUFDRixZQUFNLHFCQUFxQixHQUFHO0FBQzlCO0FBQUEsSUFDRixRQUFRO0FBQ04sWUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLG1CQUFXLFNBQVMsMENBQTBDO0FBQUEsTUFDaEUsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBRUEsUUFBTSxJQUFJO0FBQUEsSUFDUiwwREFBMEQsT0FBTyxvQ0FBb0MsQ0FBQztBQUFBLEVBQ3hHO0FBQ0Y7QUFRQSxlQUFlLFlBQVksVUFBa0IsVUFBaUM7QUFDNUUsUUFBTSxjQUFjLEtBQUssSUFBSSxHQUFHLFdBQVcsS0FBSyxJQUFJLENBQUM7QUFDckQ7QUFBQSxJQUNFLDBDQUEwQyxRQUFRLGtDQUFrQyxPQUFPLFdBQVcsQ0FBQyxhQUNyRyxPQUFPLDJDQUEyQyxDQUNwRDtBQUFBLEVBQ0Y7QUFFQSxTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsVUFBTSxXQUFXLE1BQU0sSUFBSSxRQUFpQixDQUFDLFlBQVk7QUFDdkQ7QUFBQSxRQUNFO0FBQUEsUUFDQSxDQUFDLE1BQU0sVUFBVSxTQUFTLFdBQVcsb0JBQW9CO0FBQUEsUUFDekQsRUFBRSxTQUFTLHlDQUF5QztBQUFBLFFBQ3BELENBQUMsUUFBUSxXQUFXO0FBQ2xCLGtCQUFRLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFBQSxRQUMvQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFFRCxRQUFJLFVBQVU7QUFDWiwwQkFBSSw4QkFBOEIsUUFBUSxrQkFBa0I7QUFDNUQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLGlCQUFXLFNBQVMsMkNBQTJDO0FBQUEsSUFDakUsQ0FBQztBQUFBLEVBQ0g7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLFdBQVcsUUFBUSxpREFBaUQsT0FBTyxxQ0FBcUMsQ0FBQztBQUFBLEVBQ25IO0FBQ0Y7QUFTQSxlQUFlLGNBQWMsVUFBaUM7QUFDNUQ7QUFBQSxJQUNFLDBDQUEwQyxRQUFRLCtCQUErQixPQUFPLHFDQUFxQyxDQUFDLGFBQzVILE9BQU8sMkNBQTJDLENBQ3BEO0FBQUEsRUFDRjtBQUNBLFFBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUU5QixTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSSxNQUFNLHFCQUFxQixRQUFRLEdBQUc7QUFDeEMsMEJBQUksOEJBQThCLFFBQVEsbURBQW1EO0FBQzdGLFlBQU0sWUFBWSxVQUFVLFFBQVE7QUFDcEMsWUFBTSxXQUFXLFFBQVE7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLGlCQUFXLFNBQVMsMkNBQTJDO0FBQUEsSUFDakUsQ0FBQztBQUFBLEVBQ0g7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLG9CQUFvQixRQUFRLDJCQUEyQixPQUFPLHFDQUFxQyxDQUFDO0FBQUEsRUFDdEc7QUFDRjtBQVVBLGVBQWUsV0FBVyxVQUFpQztBQUN6RCxzQkFBSSwrQ0FBK0MsUUFBUSxLQUFLO0FBRWhFLFFBQU0sYUFBYSxVQUFVLGdCQUFnQixhQUFhO0FBQzFELFFBQU0sYUFBYSxVQUFVLGNBQWMscUJBQXFCO0FBRWhFLHNCQUFJLHNEQUFzRCxRQUFRLEdBQUc7QUFDdkU7IiwKICAibmFtZXMiOiBbImh0dHAiLCAicHJvY2VzcyJdCn0K
@@ -22,6 +22,8 @@ const CDP_DEFAULT_PORT = 8315;
22
22
  const COMMAND_TIMEOUT_IN_MILLISECONDS = 300;
23
23
  const EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
24
24
  const EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS = 12e4;
25
+ const KEYCODE_MENU = 82;
26
+ const KEYCODE_WAKEUP = 224;
25
27
  const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 3e4;
26
28
  let cachedTransport;
27
29
  async function createTransportFromOptions(options) {
@@ -96,27 +98,19 @@ async function createAppiumTransport(options) {
96
98
  throw new Error(`Invalid port in appiumUrl: ${url.port}`);
97
99
  }
98
100
  const appId = options.appId ?? APP_PACKAGE;
99
- log(`[transport-factory] Checking Appium server at ${options.appiumUrl}...`);
100
101
  let appiumProcess;
101
- try {
102
- await checkAppiumReachable(url);
103
- log("[transport-factory] Appium server is reachable.");
104
- } catch (error) {
105
- if (options.shouldAutoStartAppium === false) {
106
- throw error;
107
- }
108
- log(`[transport-factory] Appium not reachable, auto-starting on port ${String(port)}...`);
109
- appiumProcess = startAppiumServer(port);
110
- await waitForAppiumReady(url);
111
- log("[transport-factory] Auto-started Appium server is ready.");
112
- }
113
102
  let emulatorProcess;
114
103
  try {
115
- emulatorProcess = await ensureDeviceConnected({
104
+ [appiumProcess, emulatorProcess] = await startAppiumAndEmulator({
105
+ appiumUrl: url,
116
106
  avdName: options.avdName,
117
- deviceId: options.deviceId
107
+ deviceId: options.deviceId,
108
+ port,
109
+ shouldAutoStartAppium: options.shouldAutoStartAppium
118
110
  });
119
- log(`[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId})...`);
111
+ log(
112
+ `[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId}, retryTimeout: ${String(APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
113
+ );
120
114
  const browser = await remote({
121
115
  capabilities: {
122
116
  "appium:appActivity": APP_ACTIVITY,
@@ -198,6 +192,49 @@ function resolveEmulatorBinary() {
198
192
  }
199
193
  return join(sdkRoot, "emulator", "emulator");
200
194
  }
195
+ async function sendKeyEvent(deviceId, keyCode, description) {
196
+ await new Promise((resolve) => {
197
+ execFile(
198
+ "adb",
199
+ ["-s", deviceId, "shell", "input", "keyevent", String(keyCode)],
200
+ { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS },
201
+ (error) => {
202
+ if (error) {
203
+ log(
204
+ `[transport-factory] Warning: failed to ${description} (keyevent ${String(keyCode)}): ${error instanceof Error ? error.message : "unknown error"}`
205
+ );
206
+ }
207
+ resolve();
208
+ }
209
+ );
210
+ });
211
+ }
212
+ async function startAppiumAndEmulator(params) {
213
+ const { appiumUrl, avdName, deviceId, port, shouldAutoStartAppium } = params;
214
+ let needsAppiumStart = false;
215
+ log(`[transport-factory] Checking Appium server at ${appiumUrl.href}...`);
216
+ try {
217
+ await checkAppiumReachable(appiumUrl);
218
+ log("[transport-factory] Appium server is reachable.");
219
+ } catch (error) {
220
+ if (shouldAutoStartAppium === false) {
221
+ throw error;
222
+ }
223
+ needsAppiumStart = true;
224
+ }
225
+ let appiumProcess;
226
+ if (needsAppiumStart) {
227
+ log(`[transport-factory] Appium not reachable, auto-starting on port ${String(port)}...`);
228
+ appiumProcess = startAppiumServer(port);
229
+ }
230
+ const [, emulatorProcess] = await Promise.all([
231
+ needsAppiumStart ? waitForAppiumReady(appiumUrl).then(() => {
232
+ log("[transport-factory] Auto-started Appium server is ready.");
233
+ }) : Promise.resolve(),
234
+ ensureDeviceConnected({ avdName, deviceId })
235
+ ]);
236
+ return [appiumProcess, emulatorProcess];
237
+ }
201
238
  function startAppiumServer(port) {
202
239
  const child = spawn(`npx appium --log-timestamp --port ${String(port)}`, {
203
240
  detached: true,
@@ -218,6 +255,9 @@ function startEmulator(avdName) {
218
255
  return child;
219
256
  }
220
257
  async function waitForAppiumReady(url) {
258
+ log(
259
+ `[transport-factory] Waiting for Appium at ${url.href} (timeout: ${String(APPIUM_START_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
260
+ );
221
261
  const deadline = Date.now() + APPIUM_START_TIMEOUT_IN_MILLISECONDS;
222
262
  while (Date.now() < deadline) {
223
263
  try {
@@ -234,6 +274,10 @@ async function waitForAppiumReady(url) {
234
274
  );
235
275
  }
236
276
  async function waitForBoot(deviceId, deadline) {
277
+ const remainingMs = Math.max(0, deadline - Date.now());
278
+ log(
279
+ `[transport-factory] Waiting for device ${deviceId} to finish booting (remaining: ${String(remainingMs)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
280
+ );
237
281
  while (Date.now() < deadline) {
238
282
  const isBooted = await new Promise((resolve) => {
239
283
  execFile(
@@ -258,11 +302,15 @@ async function waitForBoot(deviceId, deadline) {
258
302
  );
259
303
  }
260
304
  async function waitForDevice(deviceId) {
305
+ log(
306
+ `[transport-factory] Waiting for device ${deviceId} to appear in ADB (timeout: ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
307
+ );
261
308
  const deadline = Date.now() + EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS;
262
309
  while (Date.now() < deadline) {
263
310
  if (await checkDeviceConnected(deviceId)) {
264
311
  log(`[transport-factory] Device ${deviceId} appeared in ADB, waiting for boot to complete...`);
265
312
  await waitForBoot(deviceId, deadline);
313
+ await wakeScreen(deviceId);
266
314
  return;
267
315
  }
268
316
  await new Promise((resolve) => {
@@ -273,8 +321,14 @@ async function waitForDevice(deviceId) {
273
321
  `Emulator device "${deviceId}" did not appear within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
274
322
  );
275
323
  }
324
+ async function wakeScreen(deviceId) {
325
+ log(`[transport-factory] Waking screen on device ${deviceId}...`);
326
+ await sendKeyEvent(deviceId, KEYCODE_WAKEUP, "wake screen");
327
+ await sendKeyEvent(deviceId, KEYCODE_MENU, "dismiss lock screen");
328
+ log(`[transport-factory] Screen wake complete on device ${deviceId}.`);
329
+ }
276
330
  export {
277
331
  createTransportFromOptions,
278
332
  getOrCreateTransport
279
333
  };
280
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbnN1cmVEZXZpY2VDb25uZWN0ZWR9LlxuICovXG5pbnRlcmZhY2UgRW5zdXJlRGV2aWNlQ29ubmVjdGVkUGFyYW1zIHtcbiAgLyoqIEFWRCBuYW1lIHRvIGF1dG8tc3RhcnQgaWYgdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkLiAqL1xuICBhdmROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBEZXZpY2UgVURJRCB0byBjaGVjayAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuICovXG4gIGRldmljZUlkOiBzdHJpbmc7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jbGknKSB7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDbGlUcmFuc3BvcnQgKG5vIG9wdGlvbnMgb3IgdHlwZT1vYnNpZGlhbi1jbGkpJyk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2xpVHJhbnNwb3J0KCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBEZXNrdG9wQ2RwVHJhbnNwb3J0IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQgPz8gQ0RQX0RFRkFVTFRfUE9SVCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICAuLi4ob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBQb3J0OiBvcHRpb25zLnBvcnQgfSksXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgZGV2aWNlPSR7b3B0aW9ucy5kZXZpY2VJZH0pYCk7XG4gIHJldHVybiBjcmVhdGVBcHBpdW1UcmFuc3BvcnQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBxdWljayBIVFRQIGNoZWNrIGFnYWluc3QgdGhlIEFwcGl1bSBzZXJ2ZXIncyBzdGF0dXMgZW5kcG9pbnQuXG4gKlxuICogRmFpbHMgZmFzdCAod2l0aGluIHtAbGluayBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTfSkgd2l0aFxuICogYSBjbGVhciBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgbGV0dGluZyBXZWJEcml2ZXJJTyByZXRyeSBzaWxlbnRseSBmb3IgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIHBhcnNlZCBBcHBpdW0gVVJMLlxuICovXG5mdW5jdGlvbiBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkIHZpYSBBREIuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIGNoZWNrIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCBhbmQgaW4gdGhlIGBkZXZpY2VgIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gIGNvbnN0IGRldmljZUxpbmUgPSBsaW5lcy5maW5kKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoZGV2aWNlSWQpKTtcbiAgcmV0dXJuIGRldmljZUxpbmU/LmluY2x1ZGVzKCdcXHRkZXZpY2UnKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxBcHBpdW1UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gIGlmIChpc05hTihwb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgfVxuXG4gIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke29wdGlvbnMuYXBwaXVtVXJsfS4uLmApO1xuICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUuJyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgYXBwaXVtUHJvY2VzcyA9IHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQpO1xuICAgIGF3YWl0IHdhaXRGb3JBcHBpdW1SZWFkeSh1cmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgfVxuXG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGVtdWxhdG9yUHJvY2VzcyA9IGF3YWl0IGVuc3VyZURldmljZUNvbm5lY3RlZCh7XG4gICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICBkZXZpY2VJZDogb3B0aW9ucy5kZXZpY2VJZFxuICAgIH0pO1xuXG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSwgYXBwPSR7YXBwSWR9KS4uLmApO1xuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICdhcHBpdW06YXBwQWN0aXZpdHknOiBBUFBfQUNUSVZJVFksXG4gICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTphdXRvbWF0aW9uTmFtZSc6ICdVaUF1dG9tYXRvcjInLFxuICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTpzZXR0aW5ncyc6IHtcbiAgICAgICAgICAnYXBwaXVtOmNocm9tZWRyaXZlckF1dG9kb3dubG9hZCc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2FwcGl1bTpza2lwU2VydmVySW5zdGFsbGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnRcbiAgICB9KTtcblxuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IHRyYW5zcG9ydC5kaXNwb3NlLmJpbmQodHJhbnNwb3J0KTtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgYXBwaXVtUHJvY2Vzcy5raWxsKCk7XG4gICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIGVtdWxhdG9yIHN0b3BwZWQuJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0cmFuc3BvcnQ7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgfVxuICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgIGVtdWxhdG9yUHJvY2Vzcy5raWxsKCk7XG4gICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQsIG9wdGlvbmFsbHkgYXV0by1zdGFydGluZyBhblxuICogZW11bGF0b3IgaWYgYW4gQVZEIG5hbWUgaXMgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIERldmljZSBhbmQgb3B0aW9uYWwgQVZEIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gcGFyYW1zLmF2ZE5hbWUgLSBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC5cbiAqIEBwYXJhbSBwYXJhbXMuZGV2aWNlSWQgLSBEZXZpY2UgVURJRCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBlbXVsYXRvciBjaGlsZCBwcm9jZXNzIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHBhcmFtczogRW5zdXJlRGV2aWNlQ29ubmVjdGVkUGFyYW1zKTogUHJvbWlzZTxDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyBhdmROYW1lLCBkZXZpY2VJZCB9ID0gcGFyYW1zO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ2hlY2tpbmcgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZCB2aWEgQURCLi4uYCk7XG5cbiAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBEZXZpY2UgJHtkZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWF2ZE5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBpcyBub3QgY29ubmVjdGVkLiBTdGFydCB0aGUgZW11bGF0b3IgYmVmb3JlIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMsYFxuICAgICAgICArICcgb3Igc2V0IGF2ZE5hbWUgaW4gdHJhbnNwb3J0IG9wdGlvbnMgdG8gYXV0by1zdGFydCBpdC4nXG4gICAgKTtcbiAgfVxuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBEZXZpY2UgJHtkZXZpY2VJZH0gbm90IGZvdW5kLCBzdGFydGluZyBlbXVsYXRvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi5gKTtcbiAgY29uc3QgZW11bGF0b3JQcm9jZXNzID0gc3RhcnRFbXVsYXRvcihhdmROYW1lKTtcbiAgYXdhaXQgd2FpdEZvckRldmljZShkZXZpY2VJZCk7XG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHtkZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICByZXR1cm4gZW11bGF0b3JQcm9jZXNzO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwYXRoIHRvIHRoZSBBbmRyb2lkIGVtdWxhdG9yIGJpbmFyeS5cbiAqXG4gKiBVc2VzIGBBTkRST0lEX0hPTUVgIG9yIGBBTkRST0lEX1NES19ST09UYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBzZXQsXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBgZW11bGF0b3JgIChhc3N1bWVzIGl0J3MgaW4gUEFUSCkuXG4gKlxuICogQHJldHVybnMgVGhlIHBhdGggdG8gdGhlIGVtdWxhdG9yIGJpbmFyeS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gIGNvbnN0IHNka1Jvb3QgPSBwcm9jZXNzLmVudlsnQU5EUk9JRF9IT01FJ10gPz8gcHJvY2Vzcy5lbnZbJ0FORFJPSURfU0RLX1JPT1QnXTtcbiAgaWYgKCFzZGtSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBmaW5kIEFuZHJvaWQgZW11bGF0b3I6IG5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gam9pbihzZGtSb290LCAnZW11bGF0b3InLCAnZW11bGF0b3InKTtcbn1cblxuLyoqXG4gKiBTcGF3bnMgYW4gQXBwaXVtIHNlcnZlciBhcyBhIGRldGFjaGVkIGJhY2tncm91bmQgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IHRvIHN0YXJ0IEFwcGl1bSBvbi5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oYG5weCBhcHBpdW0gLS1sb2ctdGltZXN0YW1wIC0tcG9ydCAke1N0cmluZyhwb3J0KX1gLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddXG4gIH0pO1xuXG4gIGNoaWxkLnVucmVmKCk7XG4gIHJldHVybiBjaGlsZDtcbn1cblxuLyoqXG4gKiBTcGF3bnMgYW4gQW5kcm9pZCBlbXVsYXRvciBhcyBhIGJhY2tncm91bmQgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSBBVkQgbmFtZSB0byBzdGFydC5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0RW11bGF0b3IoYXZkTmFtZTogc3RyaW5nKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9IC1hdmQgJHthdmROYW1lfSAtbm8tc25hcHNob3Qtc2F2ZWApO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBbJy1hdmQnLCBhdmROYW1lLCAnLW5vLXNuYXBzaG90LXNhdmUnXSwge1xuICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBBcHBpdW0gc2VydmVyIHVudGlsIGl0IHJlc3BvbmRzIHRvIGAvc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICk7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIHRoZSBkZXZpY2UgdG8gZmluaXNoIGJvb3RpbmcgYnkgcG9sbGluZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0gZGVhZGxpbmUgLSBBYnNvbHV0ZSB0aW1lc3RhbXAgZGVhZGxpbmUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBQb2xscyBgYWRiIGRldmljZXNgIHVudGlsIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGFwcGVhcnMgaW4gdGhlIGBkZXZpY2VgIHN0YXRlLlxuICpcbiAqIEFsc28gd2FpdHMgZm9yIHRoZSBkZXZpY2UgdG8gZmluaXNoIGJvb3RpbmcgYnkgY2hlY2tpbmcgYHN5cy5ib290X2NvbXBsZXRlZGAuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIHdhaXQgZm9yLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRGV2aWNlKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEVtdWxhdG9yIGRldmljZSBcIiR7ZGV2aWNlSWR9XCIgZGlkIG5vdCBhcHBlYXIgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxjQUFjO0FBUXZCLFNBQVMsV0FBVztBQUNwQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsV0FBVztBQUNuQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGtEQUFrRDtBQUN4RCxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtDQUFrQztBQUN4QyxN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
334
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPEFwcGl1bVRyYW5zcG9ydD4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICB9XG5cbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBvcHRpb25zLmRldmljZUlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICB9KTtcblxuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3RvcnldIENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSwgYXBwPSR7YXBwSWR9LCByZXRyeVRpbWVvdXQ6ICR7XG4gICAgICAgIFN0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcywgcmV0cmllczogJHtTdHJpbmcoQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQpfSkuLi5gXG4gICAgKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06c2V0dGluZ3MnOiB7XG4gICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgICdhcHBpdW06c2tpcFNlcnZlckluc3RhbGxhdGlvbic6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0XG4gICAgfSk7XG5cbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSB0cmFuc3BvcnQuZGlzcG9zZS5iaW5kKHRyYW5zcG9ydCk7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBrZXkgZXZlbnQgdG8gYSBkZXZpY2UgdmlhIEFEQi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyB3YXJuaW5nc1xuICogaW5zdGVhZCBvZiB0aHJvd2luZywgc2luY2Uga2V5IGV2ZW50cyBhcmUgYmVzdC1lZmZvcnQgKGUuZy4sIHRoZSBzY3JlZW5cbiAqIG1heSBhbHJlYWR5IGJlIG9uKS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ga2V5Q29kZSAtIFRoZSBBbmRyb2lkIGtleWNvZGUgdG8gc2VuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBsb2cgbWVzc2FnZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBleGVjRmlsZShcbiAgICAgICdhZGInLFxuICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgbG9nKFxuICAgICAgICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlciBhbmQgZW11bGF0b3IgaW4gcGFyYWxsZWwgd2hlbiBib3RoIG5lZWQgYXV0by1zdGFydGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gQ29uZmlndXJhdGlvbiBmb3IgQXBwaXVtIGFuZCBlbXVsYXRvciBzdGFydHVwLlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc11gLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIGB1bmRlZmluZWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWQsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgfVxuXG4gIGNvbnN0IFssIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgPyB3YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWQgfSlcbiAgXSk7XG5cbiAgcmV0dXJuIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBcHBpdW0gc2VydmVyIGFzIGEgZGV0YWNoZWQgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gc3RhcnQgQXBwaXVtIG9uLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBbmRyb2lkIGVtdWxhdG9yIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBuYW1lIHRvIHN0YXJ0LlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gLWF2ZCAke2F2ZE5hbWV9IC1uby1zbmFwc2hvdC1zYXZlYCk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIFsnLWF2ZCcsIGF2ZE5hbWUsICctbm8tc25hcHNob3Qtc2F2ZSddLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdW50aWwgaXQgcmVzcG9uZHMgdG8gYC9zdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICB9bXMpLi4uYFxuICApO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBwb2xsaW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSBkZWFkbGluZSAtIEFic29sdXRlIHRpbWVzdGFtcCBkZWFkbGluZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gIGxvZyhcbiAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGBhZGIgZGV2aWNlc2AgdW50aWwgdGhlIHNwZWNpZmllZCBkZXZpY2UgYXBwZWFycyBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKlxuICogQWxzbyB3YWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBjaGVja2luZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gd2FpdCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICBhd2FpdCB3YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRW11bGF0b3IgZGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBkaWQgbm90IGFwcGVhciB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFdha2VzIHRoZSBlbXVsYXRvciBzY3JlZW4gYW5kIGRpc21pc3NlcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQWZ0ZXIgYm9vdCwgdGhlIGVtdWxhdG9yIHNjcmVlbiBtYXkgYmUgb2ZmLiBTZW5kcyBgS0VZQ09ERV9XQUtFVVBgIHRvIHR1cm5cbiAqIG9uIHRoZSBkaXNwbGF5IGFuZCBgS0VZQ09ERV9NRU5VYCB0byBkaXNtaXNzIHRoZSBsb2NrIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICBhd2FpdCBzZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgYXdhaXQgc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5n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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",