@mnaoumov/obsidian-lib 10.7.0 → 10.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/data-stores/data-store-locations/package.json +6 -0
  2. package/dist/lib/cjs/__merged.cjs +4 -1
  3. package/dist/lib/cjs/__merged.d.cts +1 -0
  4. package/dist/lib/cjs/data-stores/data-store-locations.cjs +248 -0
  5. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +60 -0
  6. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +2 -2
  7. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +1 -1
  8. package/dist/lib/cjs/data-stores/data-store-transport.cjs +126 -21
  9. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +38 -4
  10. package/dist/lib/cjs/data-stores/index.cjs +4 -1
  11. package/dist/lib/cjs/data-stores/index.d.cts +1 -0
  12. package/dist/lib/cjs/data-stores/shared-data-store.cjs +131 -19
  13. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +53 -1
  14. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  15. package/dist/lib/esm/__merged.d.mts +1 -0
  16. package/dist/lib/esm/__merged.mjs +3 -1
  17. package/dist/lib/esm/data-stores/data-store-locations.d.mts +60 -0
  18. package/dist/lib/esm/data-stores/data-store-locations.mjs +160 -0
  19. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +1 -1
  20. package/dist/lib/esm/data-stores/data-store-seeds.mjs +2 -2
  21. package/dist/lib/esm/data-stores/data-store-transport.d.mts +38 -4
  22. package/dist/lib/esm/data-stores/data-store-transport.mjs +126 -21
  23. package/dist/lib/esm/data-stores/index.d.mts +1 -0
  24. package/dist/lib/esm/data-stores/index.mjs +3 -1
  25. package/dist/lib/esm/data-stores/shared-data-store.d.mts +53 -1
  26. package/dist/lib/esm/data-stores/shared-data-store.mjs +131 -19
  27. package/dist/lib/esm/generated-during-build.mjs +1 -1
  28. package/package.json +1 -1
@@ -118,6 +118,7 @@ __export(shared_data_store_exports, {
118
118
  });
119
119
  module.exports = __toCommonJS(shared_data_store_exports);
120
120
  var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
121
+ var import_data_store_locations = require('./data-store-locations.cjs');
121
122
  var import_data_store_replica = require('./data-store-replica.cjs');
122
123
  var import_data_store_transport = require('./data-store-transport.cjs');
123
124
  const DEFAULT_ACTIVE_DEVICE_MILLISECONDS = 2592e6;
@@ -129,7 +130,8 @@ class SharedDataStore {
129
130
  constructor(params, device) {
130
131
  this.params = params;
131
132
  this.device = device;
132
- this.transport = new import_data_store_transport.DataStoreTransport(params);
133
+ this.locations = new import_data_store_locations.DataStoreLocations(params);
134
+ this.isSyncEnabled = params.isSyncEnabled ?? true;
133
135
  this.replica = new import_data_store_replica.DataStoreReplica(params.kind);
134
136
  this.activeDeviceMilliseconds = params.activeDeviceMilliseconds ?? DEFAULT_ACTIVE_DEVICE_MILLISECONDS;
135
137
  if (!Number.isFinite(this.activeDeviceMilliseconds) || this.activeDeviceMilliseconds <= 0) {
@@ -138,13 +140,27 @@ class SharedDataStore {
138
140
  }
139
141
  params;
140
142
  device;
143
+ /**
144
+ Configured and remembered reader roots, including retained migration sources while disabled.
145
+ *
146
+ * @returns Unique roots suitable for metadata exclusion without adapter access.
147
+ */
148
+ get transportRoots() {
149
+ return [.../* @__PURE__ */ new Set([...this.knownTransportRoots, ...this.locations.transports.map((transport) => transport.root)])];
150
+ }
141
151
  activeDeviceMilliseconds;
142
152
  counter = 0;
153
+ hasUnpublishedChanges = false;
154
+ isSyncEnabled;
155
+ knownTransportRoots = /* @__PURE__ */ new Set();
143
156
  localRecords = /* @__PURE__ */ new Map();
157
+ locations;
144
158
  replica;
145
159
  time = 0;
146
- transport;
147
160
  vector = /* @__PURE__ */ new Map();
161
+ get transport() {
162
+ return (0, import_type_guards.ensureNonNullable)(this.locations.transports.at(-1));
163
+ }
148
164
  /**
149
165
  * Opens and synchronizes a store, restoring its device identity exclusively from IndexedDB.
150
166
  *
@@ -171,6 +187,9 @@ class SharedDataStore {
171
187
  await this.loadLocal();
172
188
  await this.mergeFiles();
173
189
  await this.persist();
190
+ if (!this.isSyncEnabled) {
191
+ return;
192
+ }
174
193
  const files = await this.transport.list();
175
194
  const base = `${this.deviceRoot()}/snapshot-${window.crypto.randomUUID()}-manifest`;
176
195
  await this.transport.writeSnapshot({ base, payload: this.checkpoint() });
@@ -195,6 +214,15 @@ class SharedDataStore {
195
214
  }
196
215
  });
197
216
  }
217
+ /**
218
+ * Recognizes transport files, roots, and ancestor folder operations for consumer event filters.
219
+ *
220
+ * @param path - Vault-relative file or folder path.
221
+ * @returns Whether the path intersects an active or retained transport root.
222
+ */
223
+ containsTransportPath(path) {
224
+ return this.transportRoots.some((root) => path === root || path.startsWith(`${root}/`) || root.startsWith(`${path}/`));
225
+ }
198
226
  /**
199
227
  * Deletes a register or removes the currently observed additions of a set member.
200
228
  *
@@ -221,6 +249,24 @@ class SharedDataStore {
221
249
  get(key) {
222
250
  return this.replica.get(key);
223
251
  }
252
+ /**
253
+ * Relocates only this plugin/store subtree; keep opening with the original anchor parameters.
254
+ *
255
+ * @param location - New folder and document format.
256
+ * @returns A promise that resolves after history has been copied and verified.
257
+ */
258
+ async relocate(location) {
259
+ await this.params.local.exclusive(async () => {
260
+ await this.loadLocal();
261
+ if (!this.isSyncEnabled) {
262
+ throw new Error("Enable data-store synchronization before relocation");
263
+ }
264
+ await this.locations.relocate(location);
265
+ await this.mergeFiles();
266
+ this.hasUnpublishedChanges = true;
267
+ await this.persist();
268
+ });
269
+ }
224
270
  /**
225
271
  * Writes one register value, or adds a member to an observed-remove set.
226
272
  *
@@ -241,6 +287,21 @@ class SharedDataStore {
241
287
  async setMany(entries) {
242
288
  await this.change(entries.map(([key, value]) => ({ deleted: false, key, value })));
243
289
  }
290
+ /**
291
+ * Toggles transport without changing identity or causal state. Persist the preference in consumer settings.
292
+ * Enabling publishes a complete checkpoint so offline sequences cannot leave gaps.
293
+ *
294
+ * @param isEnabled - Whether to use vault transport for subsequent calls on this instance.
295
+ * @returns A promise that resolves after synchronization when enabling.
296
+ */
297
+ async setSyncEnabled(isEnabled) {
298
+ await this.params.local.exclusive(async () => {
299
+ await this.loadLocal();
300
+ this.isSyncEnabled = isEnabled;
301
+ await this.mergeFiles();
302
+ await this.persist();
303
+ });
304
+ }
244
305
  /**
245
306
  * Merges complete snapshots and contiguous journal history, then publishes its durable acknowledgement.
246
307
  * Partial deliveries remain pending; a later call retries them. No acknowledgement skips a missing sequence.
@@ -262,7 +323,7 @@ class SharedDataStore {
262
323
  if (device === this.device) {
263
324
  continue;
264
325
  }
265
- const have = await this.transport.read(`${this.transport.root}/devices/${device}/have.md`);
326
+ const have = await this.transport.read(`${this.transport.root}/devices/${device}/have${this.transport.extension}`);
266
327
  if (!isObject(have) || !isVector(have["vector"]) || typeof have["time"] !== "number") {
267
328
  acknowledgements.push(/* @__PURE__ */ new Map());
268
329
  } else if (Date.now() - have["time"] <= this.activeDeviceMilliseconds) {
@@ -301,9 +362,17 @@ class SharedDataStore {
301
362
  candidate.apply(operation);
302
363
  operations.push(operation);
303
364
  }
365
+ if (!this.isSyncEnabled) {
366
+ for (const operation of operations) {
367
+ this.apply(operation);
368
+ }
369
+ this.hasUnpublishedChanges = true;
370
+ await this.persist();
371
+ return;
372
+ }
304
373
  for (const operation of operations) {
305
374
  if (!this.transport.fits([operation])) {
306
- await this.transport.write(`${this.deviceRoot()}/log-${String(operation.sequence)}.md`, [operation]);
375
+ await this.transport.write(`${this.deviceRoot()}/log-${String(operation.sequence)}${this.transport.extension}`, [operation]);
307
376
  }
308
377
  }
309
378
  let batch = [];
@@ -332,13 +401,39 @@ class SharedDataStore {
332
401
  this.time = 0;
333
402
  this.counter = 0;
334
403
  this.localRecords.clear();
404
+ this.knownTransportRoots.clear();
405
+ this.hasUnpublishedChanges = false;
335
406
  const records = await this.params.local.entries();
336
407
  for (const [key, value] of records) {
337
- if (key === "shared-checkpoint-v1") {
338
- this.mergeCheckpoint(value);
339
- } else if (key.startsWith(RECORD_PREFIX)) {
340
- this.replica.apply(value);
341
- this.localRecords.set(key, (0, import_type_guards.ensureNonNullable)(JSON.stringify(value)));
408
+ switch (key) {
409
+ case "shared-checkpoint-v1": {
410
+ this.mergeCheckpoint(value);
411
+ break;
412
+ }
413
+ case "shared-transport-roots-v1": {
414
+ if (!Array.isArray(value)) {
415
+ throw new TypeError("Invalid local data-store transport roots");
416
+ }
417
+ const suffix = `/${this.params.pluginId}/${this.params.storeId}`;
418
+ for (const root of value) {
419
+ if (typeof root !== "string" || !root.endsWith(suffix)) {
420
+ throw new Error("Invalid local data-store transport roots");
421
+ }
422
+ const transport = new import_data_store_transport.DataStoreTransport({ ...this.params, folder: root.slice(0, -suffix.length) });
423
+ this.knownTransportRoots.add(transport.root);
424
+ }
425
+ break;
426
+ }
427
+ case "shared-unpublished-v1": {
428
+ this.hasUnpublishedChanges = value === true;
429
+ break;
430
+ }
431
+ default: {
432
+ if (key.startsWith(RECORD_PREFIX)) {
433
+ this.replica.apply(value);
434
+ this.localRecords.set(key, (0, import_type_guards.ensureNonNullable)(JSON.stringify(value)));
435
+ }
436
+ }
342
437
  }
343
438
  }
344
439
  }
@@ -355,19 +450,28 @@ class SharedDataStore {
355
450
  this.observeClock(Number(value["time"]), Number(value["counter"]));
356
451
  }
357
452
  async mergeFiles() {
358
- const allFiles = await this.transport.list();
359
- const files = allFiles.filter((path) => path.startsWith(`${this.transport.root}/devices/`));
360
- const manifests = files.filter((file) => /\/snapshot-[\w-]+-manifest\.md$/.test(file));
453
+ if (!this.isSyncEnabled) {
454
+ return;
455
+ }
456
+ await this.locations.refresh();
457
+ for (const transport of this.locations.transports) {
458
+ await this.mergeTransport(transport);
459
+ }
460
+ }
461
+ async mergeTransport(transport) {
462
+ const allFiles = await transport.list();
463
+ const files = allFiles.filter((path) => path.startsWith(`${transport.root}/devices/`));
464
+ const manifests = files.filter((file) => /\/snapshot-[\w-]+-manifest\.(?:md|json)$/.test(file));
361
465
  for (const path of manifests) {
362
- const snapshot = await this.transport.readSnapshot(path);
466
+ const snapshot = await transport.readSnapshot(path);
363
467
  if (snapshot !== void 0) {
364
468
  this.mergeCheckpoint(snapshot);
365
469
  }
366
470
  }
367
471
  const operations = [];
368
- const segments = files.filter((file) => /\/log-\d+\.md$/.test(file));
472
+ const segments = files.filter((file) => /\/log-\d+\.(?:md|json)$/.test(file));
369
473
  for (const path of segments) {
370
- const segment = await this.transport.read(path);
474
+ const segment = await transport.read(path);
371
475
  if (segment === void 0) {
372
476
  continue;
373
477
  }
@@ -404,13 +508,21 @@ class SharedDataStore {
404
508
  }
405
509
  const entries = [...records].filter(([key, value]) => this.localRecords.get(key) !== JSON.stringify(value));
406
510
  const removedKeys = [...this.localRecords.keys()].filter((key) => !records.has(key));
407
- entries.push(["shared-checkpoint-v1", { ...checkpoint, operations: [] }]);
511
+ entries.push(["shared-checkpoint-v1", { ...checkpoint, operations: [] }], ["shared-unpublished-v1", this.hasUnpublishedChanges], ["shared-transport-roots-v1", this.transportRoots]);
408
512
  await this.params.local.commit({ entries, removedKeys });
409
- await this.transport.write(`${this.deviceRoot()}/have.md`, { format: 1, time: Date.now(), vector: [...this.vector] });
513
+ if (!this.isSyncEnabled) {
514
+ return;
515
+ }
516
+ if (this.hasUnpublishedChanges) {
517
+ await this.transport.writeSnapshot({ base: `${this.deviceRoot()}/snapshot-${window.crypto.randomUUID()}-manifest`, payload: checkpoint });
518
+ await this.params.local.set("shared-unpublished-v1", false);
519
+ this.hasUnpublishedChanges = false;
520
+ }
521
+ await this.transport.write(`${this.deviceRoot()}/have${this.transport.extension}`, { format: 1, time: Date.now(), vector: [...this.vector] });
410
522
  }
411
523
  async publish(operations) {
412
524
  const first = (0, import_type_guards.ensureNonNullable)(operations[0]);
413
- await this.transport.write(`${this.deviceRoot()}/log-${String(first.sequence)}.md`, operations);
525
+ await this.transport.writeImmutable(`${this.deviceRoot()}/log-${String(first.sequence)}${this.transport.extension}`, operations);
414
526
  for (const operation of operations) {
415
527
  this.apply(operation);
416
528
  }
@@ -428,4 +540,4 @@ function isVector(value) {
428
540
  0 && (module.exports = {
429
541
  SharedDataStore
430
542
  });
431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQge1xuICBEYXRhU3RvcmVSZXBsaWNhLFxuICBpc0RhdGFTdG9yZU9wZXJhdGlvblxufSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgeyBEYXRhU3RvcmVUcmFuc3BvcnQgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuY29uc3QgREVGQVVMVF9BQ1RJVkVfREVWSUNFX01JTExJU0VDT05EUyA9IDJfNTkyXzAwMF8wMDA7XG5cbmNvbnN0IE9XTkVSX1BBVEhfSU5ERVggPSAtMjtcblxuY29uc3QgVkVDVE9SX0VOVFJZX0xFTkdUSCA9IDI7XG5jb25zdCBERVZJQ0VfUEFUSF9QQVJUUyA9IDI7XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogSW1tdXRhYmxlIG1lcmdlIHJ1bGU7IGNoYW5naW5nIGl0IHJlcXVpcmVzIGEgbmV3IHN0b3JlIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kO1xuICAvKipcbiAgICogRGVkaWNhdGVkIGxvY2FsIHN0b3JlIHNjb3BlZCB0byBUSElTIHZhdWx0LCBwbHVnaW4gYW5kIHNoYXJlZC1zdG9yZSBzY2hlbWEuIFRoZSBjYWxsZXIgb3ducyBpdHMgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsOiBMb2NhbERhdGFTdG9yZTtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgcGVyIGZpbGUsIHdyYXBwZXIgaW5jbHVkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4RmlsZUJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogUGx1Z2luIG1hbmlmZXN0IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JlIGlkIGluY2x1ZGluZyB0aGUgY29uc3VtZXIncyBzY2hlbWEgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENoYW5nZSB7XG4gIHJlYWRvbmx5IGRlbGV0ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogSnNvblZhbHVlO1xufVxuXG5pbnRlcmZhY2UgQ2hlY2twb2ludCB7XG4gIHJlYWRvbmx5IGNvdW50ZXI6IG51bWJlcjtcbiAgcmVhZG9ubHkgZm9ybWF0OiAxO1xuICByZWFkb25seSBraW5kOiBEYXRhU3RvcmVNZXJnZUtpbmQ7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbnM6IERhdGFTdG9yZU9wZXJhdGlvbltdO1xuICByZWFkb25seSB0aW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHZlY3RvcjogVmVyc2lvblZlY3Rvcjtcbn1cblxudHlwZSBWZXJzaW9uVmVjdG9yID0gW3N0cmluZywgbnVtYmVyXVtdO1xuXG4vKipcbiAqIEEgZGV2aWNlLWxvY2FsIHF1ZXJ5IHJlcGxpY2EgYmFja2VkIGJ5IHZhdWx0IGZpbGVzLiBDYWxsIGBzeW5jaHJvbml6ZWAgYWZ0ZXIgdHJhbnNwb3J0IGNoYW5nZXMgb3IgcGVyaW9kaWNhbGx5LlxuICogTm8gdGltZXIgb3IgZXZlbnQgaGFuZGxlciBvdXRsaXZlcyB0aGUgY29uc3VtZXI6IHRoZSBjb25zdW1lciBzY2hlZHVsZXMgc3luY2hyb25pemF0aW9uIGFuZCBvd25zIHVubG9hZGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXJlZERhdGFTdG9yZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgY291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxSZWNvcmRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZXBsaWNhOiBEYXRhU3RvcmVSZXBsaWNhO1xuICBwcml2YXRlIHRpbWUgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydDogRGF0YVN0b3JlVHJhbnNwb3J0O1xuICBwcml2YXRlIHJlYWRvbmx5IHZlY3RvciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBTaGFyZWREYXRhU3RvcmVPcGVuUGFyYW1zLCBwcm90ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQocGFyYW1zKTtcbiAgICB0aGlzLnJlcGxpY2EgPSBuZXcgRGF0YVN0b3JlUmVwbGljYShwYXJhbXMua2luZCk7XG4gICAgdGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMgPSBwYXJhbXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQUNUSVZFX0RFVklDRV9NSUxMSVNFQ09ORFM7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMpIHx8IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbmQgc3luY2hyb25pemVzIGEgc3RvcmUsIHJlc3RvcmluZyBpdHMgZGV2aWNlIGlkZW50aXR5IGV4Y2x1c2l2ZWx5IGZyb20gSW5kZXhlZERCLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGVyc2lzdGVuY2UsIHRyYW5zcG9ydCBhbmQgbWVyZ2UgcG9saWN5LlxuICAgKiBAcmV0dXJucyBBIHN5bmNocm9uaXplZCBxdWVyeSByZXBsaWNhLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcyk6IFByb21pc2U8U2hhcmVkRGF0YVN0b3JlPiB7XG4gICAgY29uc3QgZGV2aWNlID0gYXdhaXQgcGFyYW1zLmxvY2FsLmdldE9yQ3JlYXRlKCdzaGFyZWQtZGV2aWNlLXYxJywgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCkpO1xuICAgIGlmICh0eXBlb2YgZGV2aWNlICE9PSAnc3RyaW5nJyB8fCAhL15bXFx3LV0rJC8udGVzdChkZXZpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSBpZGVudGl0eScpO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZSA9IG5ldyBTaGFyZWREYXRhU3RvcmUocGFyYW1zLCBkZXZpY2UpO1xuICAgIGF3YWl0IHN0b3JlLnN5bmNocm9uaXplKCk7XG4gICAgcmV0dXJuIHN0b3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGNvbXBsZXRlIGNodW5rZWQgc25hcHNob3QgYW5kIHRyaW1zIG9ubHkgdGhpcyBkZXZpY2UncyBhY2tub3dsZWRnZWQgam91cm5hbCBzZWdtZW50cy5cbiAgICogUmV0aXJlZCBkZXZpY2VzIHJlam9pbiBieSBtZXJnaW5nIHNuYXBzaG90czsgdG9tYnN0b25lcyByZW1haW4gaW4gc25hcHNob3RzIHRvIHByZXZlbnQgcmVzdXJyZWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNvbXBhY3Rpb24gZmluaXNoZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmxpc3QoKTtcbiAgICAgIGNvbnN0IGJhc2UgPSBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgO1xuICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGVTbmFwc2hvdCh7IGJhc2UsIHBheWxvYWQ6IHRoaXMuY2hlY2twb2ludCgpIH0pO1xuICAgICAgY29uc3QgYWNrbm93bGVkZ2VtZW50cyA9IGF3YWl0IHRoaXMuYWNrbm93bGVkZ2VtZW50cyhmaWxlcyk7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy1gKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3BlcmF0aW9ucykgfHwgIW9wZXJhdGlvbnMuZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdCA9IE1hdGgubWF4KC4uLm9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5zZXF1ZW5jZSkpO1xuICAgICAgICBpZiAoYWNrbm93bGVkZ2VtZW50cy5ldmVyeSgodmVjdG9yKSA9PiAodmVjdG9yLmdldCh0aGlzLmRldmljZSkgPz8gMCkgPj0gbGFzdCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBjb21wbGV0ZSBuZXcgc25hcHNob3QgY292ZXJzIGV2ZXJ5IGVhcmxpZXIgc25hcHNob3QgZnJvbSB0aGlzIHdyaXRlci5cbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9zbmFwc2hvdC1gKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlbW92ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWdpc3RlciBvciByZW1vdmVzIHRoZSBjdXJyZW50bHkgb2JzZXJ2ZWQgYWRkaXRpb25zIG9mIGEgc2V0IG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci4gTWluL21heCByZWdpc3RlcnMgZGVsaWJlcmF0ZWx5IGNhbm5vdCBiZSBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoW3sgZGVsZXRlZDogdHJ1ZSwga2V5LCB2YWx1ZTogbnVsbCB9XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZW50cmllcygpOiBbc3RyaW5nLCB1bmtub3duXVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIGZyb20gdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgcmVnaXN0ZXIgdmFsdWUsIG9yIGFkZHMgYSBtZW1iZXIgdG8gYW4gb2JzZXJ2ZWQtcmVtb3ZlIHNldC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTi1jb21wYXRpYmxlIHZhbHVlICh1c2UgYHRydWVgIGZvciBhIHNldCkuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBKc29uVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNldE1hbnkoW1trZXksIHZhbHVlXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJhdGNoIG9mIHJlZ2lzdGVyIHdyaXRlcywgc3BsaXQgaW50byBib3VuZGVkIGltbXV0YWJsZSBzZWdtZW50cy5cbiAgICogU2VnbWVudHMgYXJlIGluZGl2aWR1YWxseSBkdXJhYmxlOyBhIGZhaWxlZCBiYXRjaCBjYW4gaGF2ZSBhIHB1Ymxpc2hlZCBwcmVmaXggYW5kIGNhbiBiZSByZXRyaWVkIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtIGVudHJpZXMgLSBSZWdpc3RlciB3cml0ZXMgb3Igc2V0IGFkZGl0aW9ucy5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgam91cm5hbCBwdWJsaWNhdGlvbiBhbmQgbG9jYWwgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldE1hbnkoZW50cmllczogcmVhZG9ubHkgKHJlYWRvbmx5IFtzdHJpbmcsIEpzb25WYWx1ZV0pW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNoYW5nZShlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBkZWxldGVkOiBmYWxzZSwga2V5LCB2YWx1ZSB9KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBjb21wbGV0ZSBzbmFwc2hvdHMgYW5kIGNvbnRpZ3VvdXMgam91cm5hbCBoaXN0b3J5LCB0aGVuIHB1Ymxpc2hlcyBpdHMgZHVyYWJsZSBhY2tub3dsZWRnZW1lbnQuXG4gICAqIFBhcnRpYWwgZGVsaXZlcmllcyByZW1haW4gcGVuZGluZzsgYSBsYXRlciBjYWxsIHJldHJpZXMgdGhlbS4gTm8gYWNrbm93bGVkZ2VtZW50IHNraXBzIGEgbWlzc2luZyBzZXF1ZW5jZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGxvY2FsIGNoZWNrcG9pbnQgYW5kIGFja25vd2xlZGdlbWVudCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY2hyb25pemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY2tub3dsZWRnZW1lbnRzKGZpbGVzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPltdPiB7XG4gICAgY29uc3QgYWNrbm93bGVkZ2VtZW50cyA9IFtuZXcgTWFwKHRoaXMudmVjdG9yKV07XG4gICAgY29uc3QgZGV2aWNlRmlsZXMgPSBmaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzL2ApKTtcbiAgICBjb25zdCBkZXZpY2VzID0gbmV3IFNldChkZXZpY2VGaWxlcy5tYXAoKHBhdGgpID0+IHBhdGguc2xpY2UodGhpcy50cmFuc3BvcnQucm9vdC5sZW5ndGggKyAxKS5zcGxpdCgnLycsIERFVklDRV9QQVRIX1BBUlRTKVsxXSkuZmlsdGVyKChkZXZpY2UpID0+IGRldmljZSAhPT0gdW5kZWZpbmVkKSk7XG4gICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgZGV2aWNlcykge1xuICAgICAgaWYgKGRldmljZSA9PT0gdGhpcy5kZXZpY2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXZlID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7ZGV2aWNlfS9oYXZlLm1kYCk7XG4gICAgICBpZiAoIWlzT2JqZWN0KGhhdmUpIHx8ICFpc1ZlY3RvcihoYXZlWyd2ZWN0b3InXSkgfHwgdHlwZW9mIGhhdmVbJ3RpbWUnXSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgYWNrbm93bGVkZ2VtZW50cy5wdXNoKG5ldyBNYXAoKSk7XG4gICAgICB9IGVsc2UgaWYgKERhdGUubm93KCkgLSBoYXZlWyd0aW1lJ10gPD0gdGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgYWNrbm93bGVkZ2VtZW50cy5wdXNoKG5ldyBNYXAoaGF2ZVsndmVjdG9yJ10pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFja25vd2xlZGdlbWVudHM7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5KG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZXBsaWNhLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgdGhpcy52ZWN0b3Iuc2V0KG9wZXJhdGlvbi5kZXZpY2UsIG9wZXJhdGlvbi5zZXF1ZW5jZSk7XG4gICAgdGhpcy5vYnNlcnZlQ2xvY2sob3BlcmF0aW9uLnRpbWUsIG9wZXJhdGlvbi5jb3VudGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hhbmdlKGNoYW5nZXM6IHJlYWRvbmx5IENoYW5nZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IERhdGFTdG9yZU9wZXJhdGlvbltdID0gW107XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBuZXcgRGF0YVN0b3JlUmVwbGljYSh0aGlzLnBhcmFtcy5raW5kKTtcbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHRoaXMucmVwbGljYS5leHBvcnQoKSkge1xuICAgICAgICBjYW5kaWRhdGUuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIGxldCBzZXF1ZW5jZSA9IHRoaXMudmVjdG9yLmdldCh0aGlzLmRldmljZSkgPz8gMDtcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5jb3VudGVyID0gbm93ID4gdGhpcy50aW1lID8gMCA6IHRoaXMuY291bnRlciArIDE7XG4gICAgICAgIHRoaXMudGltZSA9IE1hdGgubWF4KG5vdywgdGhpcy50aW1lKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24gPSB7XG4gICAgICAgICAgLi4uY2hhbmdlLFxuICAgICAgICAgIGNvdW50ZXI6IHRoaXMuY291bnRlcixcbiAgICAgICAgICBkZXZpY2U6IHRoaXMuZGV2aWNlLFxuICAgICAgICAgIHNlcXVlbmNlOiArK3NlcXVlbmNlLFxuICAgICAgICAgIHRhZ3M6IGNhbmRpZGF0ZS5vYnNlcnZlZFRhZ3MoY2hhbmdlLmtleSksXG4gICAgICAgICAgdGltZTogdGhpcy50aW1lXG4gICAgICAgIH07XG4gICAgICAgIGNhbmRpZGF0ZS5hcHBseShvcGVyYXRpb24pO1xuICAgICAgICBvcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGV2ZXJ5IHNpbmdsZSBvcGVyYXRpb24gYmVmb3JlIHB1Ymxpc2hpbmcgYW55IHByZWZpeCBvZiBhIGJhdGNoLlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoW29wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfS5tZGAsIFtvcGVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGJhdGNoOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoWy4uLmJhdGNoLCBvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1Ymxpc2goYmF0Y2gpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnQoKTogQ2hlY2twb2ludCB7XG4gICAgcmV0dXJuIHsgY291bnRlcjogdGhpcy5jb3VudGVyLCBmb3JtYXQ6IDEsIGtpbmQ6IHRoaXMucGFyYW1zLmtpbmQsIG9wZXJhdGlvbnM6IHRoaXMucmVwbGljYS5leHBvcnQoKSwgdGltZTogdGhpcy50aW1lLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2aWNlUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7dGhpcy5kZXZpY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZExvY2FsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgIHRoaXMudmVjdG9yLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMubG9jYWxSZWNvcmRzLmNsZWFyKCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmVudHJpZXMoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZWNvcmRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAnc2hhcmVkLWNoZWNrcG9pbnQtdjEnKSB7XG4gICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoUkVDT1JEX1BSRUZJWCkpIHtcbiAgICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5sb2NhbFJlY29yZHMuc2V0KGtleSwgZW5zdXJlTm9uTnVsbGFibGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNoZWNrcG9pbnQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlWydmb3JtYXQnXSAhPT0gMSB8fCB2YWx1ZVsna2luZCddICE9PSB0aGlzLnBhcmFtcy5raW5kXG4gICAgICB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZVsnb3BlcmF0aW9ucyddKSB8fCAhdmFsdWVbJ29wZXJhdGlvbnMnXS5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbilcbiAgICAgIHx8ICFpc1ZlY3Rvcih2YWx1ZVsndmVjdG9yJ10pIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZVsndGltZSddKSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWVbJ2NvdW50ZXInXSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhLXN0b3JlIGNoZWNrcG9pbnQgb3IgaW5jb21wYXRpYmxlIG1lcmdlIHJ1bGUnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdmFsdWVbJ29wZXJhdGlvbnMnXSkge1xuICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2RldmljZSwgc2VxdWVuY2VdIG9mIHZhbHVlWyd2ZWN0b3InXSkge1xuICAgICAgdGhpcy52ZWN0b3Iuc2V0KGRldmljZSwgTWF0aC5tYXgoc2VxdWVuY2UsIHRoaXMudmVjdG9yLmdldChkZXZpY2UpID8/IDApKTtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlQ2xvY2soTnVtYmVyKHZhbHVlWyd0aW1lJ10pLCBOdW1iZXIodmFsdWVbJ2NvdW50ZXInXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBtZXJnZUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbEZpbGVzID0gYXdhaXQgdGhpcy50cmFuc3BvcnQubGlzdCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYWxsRmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgbWFuaWZlc3RzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvc25hcHNob3QtW1xcdy1dKy1tYW5pZmVzdFxcLm1kJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG1hbmlmZXN0cykge1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkU25hcHNob3QocGF0aCk7XG4gICAgICBpZiAoc25hcHNob3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1lcmdlQ2hlY2twb2ludChzbmFwc2hvdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbnM6IERhdGFTdG9yZU9wZXJhdGlvbltdID0gW107XG4gICAgY29uc3Qgc2VnbWVudHMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IC9cXC9sb2ctXFxkK1xcLm1kJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChwYXRoKTtcbiAgICAgIGlmIChzZWdtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VnbWVudCkgfHwgIXNlZ21lbnQuZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhLXN0b3JlIGpvdXJuYWwgc2VnbWVudCcpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3duZXIgPSBwYXRoLnNwbGl0KCcvJykuYXQoT1dORVJfUEFUSF9JTkRFWCk7XG4gICAgICBpZiAoc2VnbWVudC5zb21lKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5kZXZpY2UgIT09IG93bmVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pvdXJuYWwgc2VnbWVudCBoYXMgYSBkaWZmZXJlbnQgd3JpdGVyJyk7XG4gICAgICB9XG4gICAgICBvcGVyYXRpb25zLnB1c2goLi4uc2VnbWVudCk7XG4gICAgfVxuICAgIG9wZXJhdGlvbnMuc29ydCgoZmlyc3QsIHNlY29uZCkgPT4gZmlyc3QuZGV2aWNlLmxvY2FsZUNvbXBhcmUoc2Vjb25kLmRldmljZSkgfHwgZmlyc3Quc2VxdWVuY2UgLSBzZWNvbmQuc2VxdWVuY2UpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIGlmIChvcGVyYXRpb24uc2VxdWVuY2UgPT09ICh0aGlzLnZlY3Rvci5nZXQob3BlcmF0aW9uLmRldmljZSkgPz8gMCkgKyAxKSB7XG4gICAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVDbG9jayh0aW1lOiBudW1iZXIsIGNvdW50ZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aW1lID4gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgdGhpcy5jb3VudGVyID0gY291bnRlcjtcbiAgICB9IGVsc2UgaWYgKHRpbWUgPT09IHRoaXMudGltZSkge1xuICAgICAgdGhpcy5jb3VudGVyID0gTWF0aC5tYXgodGhpcy5jb3VudGVyLCBjb3VudGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHRoaXMuY2hlY2twb2ludCgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIGNoZWNrcG9pbnQub3BlcmF0aW9ucykge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLnBhcmFtcy5raW5kID09PSAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCcgPyBgJHtvcGVyYXRpb24uZGV2aWNlfToke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfWAgOiBvcGVyYXRpb24ua2V5O1xuICAgICAgcmVjb3Jkcy5zZXQoYCR7UkVDT1JEX1BSRUZJWH0ke2lkZW50aXR5fWAsIG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbLi4ucmVjb3Jkc10uZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHRoaXMubG9jYWxSZWNvcmRzLmdldChrZXkpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIGNvbnN0IHJlbW92ZWRLZXlzID0gWy4uLnRoaXMubG9jYWxSZWNvcmRzLmtleXMoKV0uZmlsdGVyKChrZXkpID0+ICFyZWNvcmRzLmhhcyhrZXkpKTtcbiAgICBlbnRyaWVzLnB1c2goWydzaGFyZWQtY2hlY2twb2ludC12MScsIHsgLi4uY2hlY2twb2ludCwgb3BlcmF0aW9uczogW10gfV0pO1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmNvbW1pdCh7IGVudHJpZXMsIHJlbW92ZWRLZXlzIH0pO1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9oYXZlLm1kYCwgeyBmb3JtYXQ6IDEsIHRpbWU6IERhdGUubm93KCksIHZlY3RvcjogWy4uLnRoaXMudmVjdG9yXSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHVibGlzaChvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpcnN0ID0gZW5zdXJlTm9uTnVsbGFibGUob3BlcmF0aW9uc1swXSk7XG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhmaXJzdC5zZXF1ZW5jZSl9Lm1kYCwgb3BlcmF0aW9ucyk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1ZlY3Rvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFZlcnNpb25WZWN0b3Ige1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGVudHJ5OiB1bmtub3duKSA9PlxuICAgIEFycmF5LmlzQXJyYXkoZW50cnkpICYmIGVudHJ5Lmxlbmd0aCA9PT0gVkVDVE9SX0VOVFJZX0xFTkdUSFxuICAgICYmIHR5cGVvZiBlbnRyeVswXSA9PT0gJ3N0cmluZycgJiYgL15bXFx3LV0rJC8udGVzdChlbnRyeVswXSkgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIoZW50cnlbMV0pICYmIE51bWJlcihlbnRyeVsxXSkgPj0gMFxuICApO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEseUJBQWtDO0FBUWxDLGdDQUdPO0FBQ1Asa0NBQW1DO0FBRW5DLE1BQU0scUNBQXFDO0FBRTNDLE1BQU0sbUJBQW1CO0FBRXpCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sZ0JBQWdCO0FBbUVmLE1BQU0sZ0JBQWdCO0FBQUEsRUFTbkIsWUFBK0IsUUFBc0QsUUFBZ0I7QUFBdEU7QUFBc0Q7QUFDM0YsU0FBSyxZQUFZLElBQUksK0NBQW1CLE1BQU07QUFDOUMsU0FBSyxVQUFVLElBQUksMkNBQWlCLE9BQU8sSUFBSTtBQUMvQyxTQUFLLDJCQUEyQixPQUFPLDRCQUE0QjtBQUNuRSxRQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssd0JBQXdCLEtBQUssS0FBSyw0QkFBNEIsR0FBRztBQUN6RixZQUFNLElBQUksTUFBTSw2Q0FBNkM7QUFBQSxJQUMvRDtBQUFBLEVBQ0Y7QUFBQSxFQVB1QztBQUFBLEVBQXNEO0FBQUEsRUFSNUU7QUFBQSxFQUNULFVBQVU7QUFBQSxFQUNELGVBQWUsb0JBQUksSUFBb0I7QUFBQSxFQUNoRDtBQUFBLEVBQ0EsT0FBTztBQUFBLEVBQ0U7QUFBQSxFQUNBLFNBQVMsb0JBQUksSUFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCbEQsYUFBb0IsS0FBSyxR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
543
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZUxvY2F0aW9uIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBEYXRhU3RvcmVMb2NhdGlvbnMgfSBmcm9tICcuL2RhdGEtc3RvcmUtbG9jYXRpb25zLnRzJztcbmltcG9ydCB7XG4gIERhdGFTdG9yZVJlcGxpY2EsXG4gIGlzRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTID0gMl81OTJfMDAwXzAwMDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IFJFQ09SRF9QUkVGSVggPSAnc2hhcmVkLXJlY29yZC12MTonO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIG9wZW5pbmcgYSBzaGFyZWQgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcyB7XG4gIC8qKlxuICAgKiBEZXZpY2UgcmV0aXJlbWVudCBpbnRlcnZhbCwgbWVhc3VyZWQgZnJvbSBpdHMgbGFzdCBhY2tub3dsZWRnZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyNTkyMDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVmF1bHQgYWRhcHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgZm9sZGVyLiBIaWRkZW4gc2VnbWVudHMgYXJlIGFsbG93ZWQ7IGNhbGxlcnMgbXVzdCBhcnJhbmdlIHRoZWlyIHN5bmNocm9uaXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOZXcgZG9jdW1lbnQgZW5jb2RpbmcgYXQgdGhlIHBlcm1hbmVudCBkaXNjb3ZlcnkgYW5jaG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ21hcmtkb3duJ2BcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdD86ICdqc29uJyB8ICdtYXJrZG93bic7XG4gIC8qKlxuICAgKiBFbmFibGVzIHZhdWx0IHRyYW5zcG9ydC4gRGlzYWJsZWQgc3RvcmVzIG1ha2Ugbm8gYWRhcHRlciBjYWxscywgaW5jbHVkaW5nIGR1cmluZyBjb21wYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU3luY0VuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogSW1tdXRhYmxlIG1lcmdlIHJ1bGU7IGNoYW5naW5nIGl0IHJlcXVpcmVzIGEgbmV3IHN0b3JlIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kO1xuICAvKipcbiAgICogRGVkaWNhdGVkIGxvY2FsIHN0b3JlIHNjb3BlZCB0byBUSElTIHZhdWx0LCBwbHVnaW4gYW5kIHNoYXJlZC1zdG9yZSBzY2hlbWEuIFRoZSBjYWxsZXIgb3ducyBpdHMgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsOiBMb2NhbERhdGFTdG9yZTtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgcGVyIGZpbGUsIHdyYXBwZXIgaW5jbHVkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4RmlsZUJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBVVEYtOCBieXRlcyBpbiBhIHJlY29uc3RydWN0ZWQgc25hcHNob3QgYmVmb3JlIEpTT04gcGFyc2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDY0MDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4U25hcHNob3RCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBsdWdpbiBtYW5pZmVzdCBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yZSBpZCBpbmNsdWRpbmcgdGhlIGNvbnN1bWVyJ3Mgc2NoZW1hIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBzdG9yZUlkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDaGFuZ2Uge1xuICByZWFkb25seSBkZWxldGVkOiBib29sZWFuO1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENoZWNrcG9pbnQge1xuICByZWFkb25seSBjb3VudGVyOiBudW1iZXI7XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kO1xuICByZWFkb25seSBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXTtcbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xuICByZWFkb25seSB2ZWN0b3I6IFZlcnNpb25WZWN0b3I7XG59XG5cbnR5cGUgVmVyc2lvblZlY3RvciA9IFtzdHJpbmcsIG51bWJlcl1bXTtcblxuLyoqXG4gKiBBIGRldmljZS1sb2NhbCBxdWVyeSByZXBsaWNhIGJhY2tlZCBieSB2YXVsdCBmaWxlcy4gQ2FsbCBgc3luY2hyb25pemVgIGFmdGVyIHRyYW5zcG9ydCBjaGFuZ2VzIG9yIHBlcmlvZGljYWxseS5cbiAqIE5vIHRpbWVyIG9yIGV2ZW50IGhhbmRsZXIgb3V0bGl2ZXMgdGhlIGNvbnN1bWVyOiB0aGUgY29uc3VtZXIgc2NoZWR1bGVzIHN5bmNocm9uaXphdGlvbiBhbmQgb3ducyB1bmxvYWRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFyZWREYXRhU3RvcmUge1xuICAvKipcbiAgQ29uZmlndXJlZCBhbmQgcmVtZW1iZXJlZCByZWFkZXIgcm9vdHMsIGluY2x1ZGluZyByZXRhaW5lZCBtaWdyYXRpb24gc291cmNlcyB3aGlsZSBkaXNhYmxlZC5cbiAgICpcbiAgICogQHJldHVybnMgVW5pcXVlIHJvb3RzIHN1aXRhYmxlIGZvciBtZXRhZGF0YSBleGNsdXNpb24gd2l0aG91dCBhZGFwdGVyIGFjY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhbnNwb3J0Um9vdHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldChbLi4udGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLCAuLi50aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLm1hcCgodHJhbnNwb3J0KSA9PiB0cmFuc3BvcnQucm9vdCldKV07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIGNvdW50ZXIgPSAwO1xuICBwcml2YXRlIGhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICBwcml2YXRlIGlzU3luY0VuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkga25vd25UcmFuc3BvcnRSb290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsUmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb25zOiBEYXRhU3RvcmVMb2NhdGlvbnM7XG4gIHByaXZhdGUgcmVwbGljYTogRGF0YVN0b3JlUmVwbGljYTtcbiAgcHJpdmF0ZSB0aW1lID0gMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZlY3RvciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBnZXQgdHJhbnNwb3J0KCk6IERhdGFTdG9yZVRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMubG9jYXRpb25zLnRyYW5zcG9ydHMuYXQoLTEpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcywgcHJvdGVjdGVkIHJlYWRvbmx5IGRldmljZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NhdGlvbnMgPSBuZXcgRGF0YVN0b3JlTG9jYXRpb25zKHBhcmFtcyk7XG4gICAgdGhpcy5pc1N5bmNFbmFibGVkID0gcGFyYW1zLmlzU3luY0VuYWJsZWQgPz8gdHJ1ZTtcbiAgICB0aGlzLnJlcGxpY2EgPSBuZXcgRGF0YVN0b3JlUmVwbGljYShwYXJhbXMua2luZCk7XG4gICAgdGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMgPSBwYXJhbXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQUNUSVZFX0RFVklDRV9NSUxMSVNFQ09ORFM7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMpIHx8IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbmQgc3luY2hyb25pemVzIGEgc3RvcmUsIHJlc3RvcmluZyBpdHMgZGV2aWNlIGlkZW50aXR5IGV4Y2x1c2l2ZWx5IGZyb20gSW5kZXhlZERCLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGVyc2lzdGVuY2UsIHRyYW5zcG9ydCBhbmQgbWVyZ2UgcG9saWN5LlxuICAgKiBAcmV0dXJucyBBIHN5bmNocm9uaXplZCBxdWVyeSByZXBsaWNhLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogU2hhcmVkRGF0YVN0b3JlT3BlblBhcmFtcyk6IFByb21pc2U8U2hhcmVkRGF0YVN0b3JlPiB7XG4gICAgY29uc3QgZGV2aWNlID0gYXdhaXQgcGFyYW1zLmxvY2FsLmdldE9yQ3JlYXRlKCdzaGFyZWQtZGV2aWNlLXYxJywgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCkpO1xuICAgIGlmICh0eXBlb2YgZGV2aWNlICE9PSAnc3RyaW5nJyB8fCAhL15bXFx3LV0rJC8udGVzdChkZXZpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSBpZGVudGl0eScpO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZSA9IG5ldyBTaGFyZWREYXRhU3RvcmUocGFyYW1zLCBkZXZpY2UpO1xuICAgIGF3YWl0IHN0b3JlLnN5bmNocm9uaXplKCk7XG4gICAgcmV0dXJuIHN0b3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGNvbXBsZXRlIGNodW5rZWQgc25hcHNob3QgYW5kIHRyaW1zIG9ubHkgdGhpcyBkZXZpY2UncyBhY2tub3dsZWRnZWQgam91cm5hbCBzZWdtZW50cy5cbiAgICogUmV0aXJlZCBkZXZpY2VzIHJlam9pbiBieSBtZXJnaW5nIHNuYXBzaG90czsgdG9tYnN0b25lcyByZW1haW4gaW4gc25hcHNob3RzIHRvIHByZXZlbnQgcmVzdXJyZWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNvbXBhY3Rpb24gZmluaXNoZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmxpc3QoKTtcbiAgICAgIGNvbnN0IGJhc2UgPSBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgO1xuICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGVTbmFwc2hvdCh7IGJhc2UsIHBheWxvYWQ6IHRoaXMuY2hlY2twb2ludCgpIH0pO1xuICAgICAgY29uc3QgYWNrbm93bGVkZ2VtZW50cyA9IGF3YWl0IHRoaXMuYWNrbm93bGVkZ2VtZW50cyhmaWxlcyk7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy1gKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3BlcmF0aW9ucykgfHwgIW9wZXJhdGlvbnMuZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdCA9IE1hdGgubWF4KC4uLm9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5zZXF1ZW5jZSkpO1xuICAgICAgICBpZiAoYWNrbm93bGVkZ2VtZW50cy5ldmVyeSgodmVjdG9yKSA9PiAodmVjdG9yLmdldCh0aGlzLmRldmljZSkgPz8gMCkgPj0gbGFzdCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBjb21wbGV0ZSBuZXcgc25hcHNob3QgY292ZXJzIGV2ZXJ5IGVhcmxpZXIgc25hcHNob3QgZnJvbSB0aGlzIHdyaXRlci5cbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9zbmFwc2hvdC1gKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlbW92ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29nbml6ZXMgdHJhbnNwb3J0IGZpbGVzLCByb290cywgYW5kIGFuY2VzdG9yIGZvbGRlciBvcGVyYXRpb25zIGZvciBjb25zdW1lciBldmVudCBmaWx0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgb3IgZm9sZGVyIHBhdGguXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBhdGggaW50ZXJzZWN0cyBhbiBhY3RpdmUgb3IgcmV0YWluZWQgdHJhbnNwb3J0IHJvb3QuXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNUcmFuc3BvcnRQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydFJvb3RzLnNvbWUoKHJvb3QpID0+IHBhdGggPT09IHJvb3QgfHwgcGF0aC5zdGFydHNXaXRoKGAke3Jvb3R9L2ApIHx8IHJvb3Quc3RhcnRzV2l0aChgJHtwYXRofS9gKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHJlZ2lzdGVyIG9yIHJlbW92ZXMgdGhlIGN1cnJlbnRseSBvYnNlcnZlZCBhZGRpdGlvbnMgb2YgYSBzZXQgbWVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLiBNaW4vbWF4IHJlZ2lzdGVycyBkZWxpYmVyYXRlbHkgY2Fubm90IGJlIGRlbGV0ZWQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNoYW5nZShbeyBkZWxldGVkOiB0cnVlLCBrZXksIHZhbHVlOiBudWxsIH1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY3VycmVudCBsb2NhbCBxdWVyeSByZXBsaWNhLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXRhY2hlZCBrZXkvdmFsdWUgcGFpcnMgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzKCk6IFtzdHJpbmcsIHVua25vd25dW10ge1xuICAgIHJldHVybiB0aGlzLnJlcGxpY2EuZW50cmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVnaXN0ZXIgb3Igc2V0IG1lbWJlcnNoaXAgZnJvbSB0aGUgY3VycmVudCBsb2NhbCBxdWVyeSByZXBsaWNhLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcmV0dXJucyBBIGRldGFjaGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudCBvciBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlcGxpY2EuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2NhdGVzIG9ubHkgdGhpcyBwbHVnaW4vc3RvcmUgc3VidHJlZTsga2VlcCBvcGVuaW5nIHdpdGggdGhlIG9yaWdpbmFsIGFuY2hvciBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYXRpb24gLSBOZXcgZm9sZGVyIGFuZCBkb2N1bWVudCBmb3JtYXQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGhpc3RvcnkgaGFzIGJlZW4gY29waWVkIGFuZCB2ZXJpZmllZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWxvY2F0ZShsb2NhdGlvbjogRGF0YVN0b3JlTG9jYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGlmICghdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5hYmxlIGRhdGEtc3RvcmUgc3luY2hyb25pemF0aW9uIGJlZm9yZSByZWxvY2F0aW9uJyk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWxvY2F0ZShsb2NhdGlvbik7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgcmVnaXN0ZXIgdmFsdWUsIG9yIGFkZHMgYSBtZW1iZXIgdG8gYW4gb2JzZXJ2ZWQtcmVtb3ZlIHNldC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTi1jb21wYXRpYmxlIHZhbHVlICh1c2UgYHRydWVgIGZvciBhIHNldCkuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBKc29uVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNldE1hbnkoW1trZXksIHZhbHVlXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJhdGNoIG9mIHJlZ2lzdGVyIHdyaXRlcywgc3BsaXQgaW50byBib3VuZGVkIGltbXV0YWJsZSBzZWdtZW50cy5cbiAgICogU2VnbWVudHMgYXJlIGluZGl2aWR1YWxseSBkdXJhYmxlOyBhIGZhaWxlZCBiYXRjaCBjYW4gaGF2ZSBhIHB1Ymxpc2hlZCBwcmVmaXggYW5kIGNhbiBiZSByZXRyaWVkIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtIGVudHJpZXMgLSBSZWdpc3RlciB3cml0ZXMgb3Igc2V0IGFkZGl0aW9ucy5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgam91cm5hbCBwdWJsaWNhdGlvbiBhbmQgbG9jYWwgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldE1hbnkoZW50cmllczogcmVhZG9ubHkgKHJlYWRvbmx5IFtzdHJpbmcsIEpzb25WYWx1ZV0pW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNoYW5nZShlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBkZWxldGVkOiBmYWxzZSwga2V5LCB2YWx1ZSB9KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdHJhbnNwb3J0IHdpdGhvdXQgY2hhbmdpbmcgaWRlbnRpdHkgb3IgY2F1c2FsIHN0YXRlLiBQZXJzaXN0IHRoZSBwcmVmZXJlbmNlIGluIGNvbnN1bWVyIHNldHRpbmdzLlxuICAgKiBFbmFibGluZyBwdWJsaXNoZXMgYSBjb21wbGV0ZSBjaGVja3BvaW50IHNvIG9mZmxpbmUgc2VxdWVuY2VzIGNhbm5vdCBsZWF2ZSBnYXBzLlxuICAgKlxuICAgKiBAcGFyYW0gaXNFbmFibGVkIC0gV2hldGhlciB0byB1c2UgdmF1bHQgdHJhbnNwb3J0IGZvciBzdWJzZXF1ZW50IGNhbGxzIG9uIHRoaXMgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHN5bmNocm9uaXphdGlvbiB3aGVuIGVuYWJsaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldFN5bmNFbmFibGVkKGlzRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgdGhpcy5pc1N5bmNFbmFibGVkID0gaXNFbmFibGVkO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgY29tcGxldGUgc25hcHNob3RzIGFuZCBjb250aWd1b3VzIGpvdXJuYWwgaGlzdG9yeSwgdGhlbiBwdWJsaXNoZXMgaXRzIGR1cmFibGUgYWNrbm93bGVkZ2VtZW50LlxuICAgKiBQYXJ0aWFsIGRlbGl2ZXJpZXMgcmVtYWluIHBlbmRpbmc7IGEgbGF0ZXIgY2FsbCByZXRyaWVzIHRoZW0uIE5vIGFja25vd2xlZGdlbWVudCBza2lwcyBhIG1pc3Npbmcgc2VxdWVuY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBsb2NhbCBjaGVja3BvaW50IGFuZCBhY2tub3dsZWRnZW1lbnQgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bmNocm9uaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWNrbm93bGVkZ2VtZW50cyhmaWxlczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj5bXT4ge1xuICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBbbmV3IE1hcCh0aGlzLnZlY3RvcildO1xuICAgIGNvbnN0IGRldmljZUZpbGVzID0gZmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgZGV2aWNlcyA9IG5ldyBTZXQoZGV2aWNlRmlsZXMubWFwKChwYXRoKSA9PiBwYXRoLnNsaWNlKHRoaXMudHJhbnNwb3J0LnJvb3QubGVuZ3RoICsgMSkuc3BsaXQoJy8nLCBERVZJQ0VfUEFUSF9QQVJUUylbMV0pLmZpbHRlcigoZGV2aWNlKSA9PiBkZXZpY2UgIT09IHVuZGVmaW5lZCkpO1xuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgIGlmIChkZXZpY2UgPT09IHRoaXMuZGV2aWNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaGF2ZSA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke2RldmljZX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKCFpc09iamVjdChoYXZlKSB8fCAhaXNWZWN0b3IoaGF2ZVsndmVjdG9yJ10pIHx8IHR5cGVvZiBoYXZlWyd0aW1lJ10gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKCkpO1xuICAgICAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gaGF2ZVsndGltZSddIDw9IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKGhhdmVbJ3ZlY3RvciddKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2tub3dsZWRnZW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseShvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIHRoaXMudmVjdG9yLnNldChvcGVyYXRpb24uZGV2aWNlLCBvcGVyYXRpb24uc2VxdWVuY2UpO1xuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKG9wZXJhdGlvbi50aW1lLCBvcGVyYXRpb24uY291bnRlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoYW5nZShjaGFuZ2VzOiByZWFkb25seSBDaGFuZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IERhdGFTdG9yZVJlcGxpY2EodGhpcy5wYXJhbXMua2luZCk7XG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB0aGlzLnJlcGxpY2EuZXhwb3J0KCkpIHtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBsZXQgc2VxdWVuY2UgPSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY291bnRlciA9IG5vdyA+IHRoaXMudGltZSA/IDAgOiB0aGlzLmNvdW50ZXIgKyAxO1xuICAgICAgICB0aGlzLnRpbWUgPSBNYXRoLm1heChub3csIHRoaXMudGltZSk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uID0ge1xuICAgICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgICBjb3VudGVyOiB0aGlzLmNvdW50ZXIsXG4gICAgICAgICAgZGV2aWNlOiB0aGlzLmRldmljZSxcbiAgICAgICAgICBzZXF1ZW5jZTogKytzZXF1ZW5jZSxcbiAgICAgICAgICB0YWdzOiBjYW5kaWRhdGUub2JzZXJ2ZWRUYWdzKGNoYW5nZS5rZXkpLFxuICAgICAgICAgIHRpbWU6IHRoaXMudGltZVxuICAgICAgICB9O1xuICAgICAgICBjYW5kaWRhdGUuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGV2ZXJ5IHNpbmdsZSBvcGVyYXRpb24gYmVmb3JlIHB1Ymxpc2hpbmcgYW55IHByZWZpeCBvZiBhIGJhdGNoLlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoW29wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIFtvcGVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGJhdGNoOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoWy4uLmJhdGNoLCBvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1Ymxpc2goYmF0Y2gpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnQoKTogQ2hlY2twb2ludCB7XG4gICAgcmV0dXJuIHsgY291bnRlcjogdGhpcy5jb3VudGVyLCBmb3JtYXQ6IDEsIGtpbmQ6IHRoaXMucGFyYW1zLmtpbmQsIG9wZXJhdGlvbnM6IHRoaXMucmVwbGljYS5leHBvcnQoKSwgdGltZTogdGhpcy50aW1lLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2aWNlUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7dGhpcy5kZXZpY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZExvY2FsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgIHRoaXMudmVjdG9yLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMubG9jYWxSZWNvcmRzLmNsZWFyKCk7XG4gICAgdGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLmNsZWFyKCk7XG4gICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZW50cmllcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlY29yZHMpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3NoYXJlZC1jaGVja3BvaW50LXYxJzoge1xuICAgICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHZhbHVlKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnOiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBgLyR7dGhpcy5wYXJhbXMucGx1Z2luSWR9LyR7dGhpcy5wYXJhbXMuc3RvcmVJZH1gO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJyB8fCAhcm9vdC5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVtZW1iZXJlZCBwYXRocyB3aXRob3V0IHJlYWRpbmcgdGhlIGFkYXB0ZXIgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiByb290LnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSB9KTtcbiAgICAgICAgICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5hZGQodHJhbnNwb3J0LnJvb3QpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC11bnB1Ymxpc2hlZC12MSc6IHtcbiAgICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHZhbHVlID09PSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSRUNPUkRfUFJFRklYKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxSZWNvcmRzLnNldChrZXksIGVuc3VyZU5vbk51bGxhYmxlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDaGVja3BvaW50KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVsnZm9ybWF0J10gIT09IDEgfHwgdmFsdWVbJ2tpbmQnXSAhPT0gdGhpcy5wYXJhbXMua2luZFxuICAgICAgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVbJ29wZXJhdGlvbnMnXSkgfHwgIXZhbHVlWydvcGVyYXRpb25zJ10uZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pXG4gICAgICB8fCAhaXNWZWN0b3IodmFsdWVbJ3ZlY3RvciddKSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWVbJ3RpbWUnXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWydjb3VudGVyJ10pXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBjaGVja3BvaW50IG9yIGluY29tcGF0aWJsZSBtZXJnZSBydWxlJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHZhbHVlWydvcGVyYXRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkZXZpY2UsIHNlcXVlbmNlXSBvZiB2YWx1ZVsndmVjdG9yJ10pIHtcbiAgICAgIHRoaXMudmVjdG9yLnNldChkZXZpY2UsIE1hdGgubWF4KHNlcXVlbmNlLCB0aGlzLnZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gICAgfVxuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKE51bWJlcih2YWx1ZVsndGltZSddKSwgTnVtYmVyKHZhbHVlWydjb3VudGVyJ10pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWZyZXNoKCk7XG4gICAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cykge1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZVRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRyYW5zcG9ydC5saXN0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgbWFuaWZlc3RzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvc25hcHNob3QtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG1hbmlmZXN0cykge1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc3BvcnQucmVhZFNuYXBzaG90KHBhdGgpO1xuICAgICAgaWYgKHNuYXBzaG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tZXJnZUNoZWNrcG9pbnQoc25hcHNob3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvbG9nLVxcZCtcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IHRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWdtZW50KSB8fCAhc2VnbWVudC5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgam91cm5hbCBzZWdtZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHBhdGguc3BsaXQoJy8nKS5hdChPV05FUl9QQVRIX0lOREVYKTtcbiAgICAgIGlmIChzZWdtZW50LnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmRldmljZSAhPT0gb3duZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSm91cm5hbCBzZWdtZW50IGhhcyBhIGRpZmZlcmVudCB3cml0ZXInKTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdGlvbnMucHVzaCguLi5zZWdtZW50KTtcbiAgICB9XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdGhpcy5jaGVja3BvaW50KCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY2hlY2twb2ludC5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucGFyYW1zLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0JyA/IGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YCA6IG9wZXJhdGlvbi5rZXk7XG4gICAgICByZWNvcmRzLnNldChgJHtSRUNPUkRfUFJFRklYfSR7aWRlbnRpdHl9YCwgb3BlcmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFsuLi5yZWNvcmRzXS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5sb2NhbFJlY29yZHMuZ2V0KGtleSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSBbLi4udGhpcy5sb2NhbFJlY29yZHMua2V5cygpXS5maWx0ZXIoKGtleSkgPT4gIXJlY29yZHMuaGFzKGtleSkpO1xuICAgIGVudHJpZXMucHVzaChbJ3NoYXJlZC1jaGVja3BvaW50LXYxJywgeyAuLi5jaGVja3BvaW50LCBvcGVyYXRpb25zOiBbXSB9XSwgWydzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlc10sIFsnc2hhcmVkLXRyYW5zcG9ydC1yb290cy12MScsIHRoaXMudHJhbnNwb3J0Um9vdHNdKTtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5jb21taXQoeyBlbnRyaWVzLCByZW1vdmVkS2V5cyB9KTtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlOiBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgLCBwYXlsb2FkOiBjaGVja3BvaW50IH0pO1xuICAgICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuc2V0KCdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCBmYWxzZSk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIHsgZm9ybWF0OiAxLCB0aW1lOiBEYXRlLm5vdygpLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2gob3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdCA9IGVuc3VyZU5vbk51bGxhYmxlKG9wZXJhdGlvbnNbMF0pO1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlSW1tdXRhYmxlKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctJHtTdHJpbmcoZmlyc3Quc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIG9wZXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNWZWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJzaW9uVmVjdG9yIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICBBcnJheS5pc0FycmF5KGVudHJ5KSAmJiBlbnRyeS5sZW5ndGggPT09IFZFQ1RPUl9FTlRSWV9MRU5HVEhcbiAgICAmJiB0eXBlb2YgZW50cnlbMF0gPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QoZW50cnlbMF0pICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGVudHJ5WzFdKSAmJiBOdW1iZXIoZW50cnlbMV0pID49IDBcbiAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLHlCQUFrQztBQVNsQyxrQ0FBbUM7QUFDbkMsZ0NBR087QUFDUCxrQ0FBbUM7QUFFbkMsTUFBTSxxQ0FBcUM7QUFFM0MsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxnQkFBZ0I7QUFxRmYsTUFBTSxnQkFBZ0I7QUFBQSxFQTBCbkIsWUFBK0IsUUFBc0QsUUFBZ0I7QUFBdEU7QUFBc0Q7QUFDM0YsU0FBSyxZQUFZLElBQUksK0NBQW1CLE1BQU07QUFDOUMsU0FBSyxnQkFBZ0IsT0FBTyxpQkFBaUI7QUFDN0MsU0FBSyxVQUFVLElBQUksMkNBQWlCLE9BQU8sSUFBSTtBQUMvQyxTQUFLLDJCQUEyQixPQUFPLDRCQUE0QjtBQUNuRSxRQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssd0JBQXdCLEtBQUssS0FBSyw0QkFBNEIsR0FBRztBQUN6RixZQUFNLElBQUksTUFBTSw2Q0FBNkM7QUFBQSxJQUMvRDtBQUFBLEVBQ0Y7QUFBQSxFQVJ1QztBQUFBLEVBQXNEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBcEI3RixJQUFXLGlCQUEyQjtBQUNwQyxXQUFPLENBQUMsR0FBRyxvQkFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLHFCQUFxQixHQUFHLEtBQUssVUFBVSxXQUFXLElBQUksQ0FBQyxjQUFjLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUFBLEVBQ3BIO0FBQUEsRUFFaUI7QUFBQSxF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
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import type { DataAdapter } from 'obsidian' with { 'resolution-mode': 'import' };
8
8
  import type { JsonValue } from 'type-fest' with { 'resolution-mode': 'import' };
9
+ import type { DataStoreLocation } from './data-store-locations.cjs';
9
10
  import type { DataStoreMergeKind } from './data-store-replica.cjs';
10
11
  import type { LocalDataStore } from './local-data-store.cjs';
11
12
  /**
@@ -28,6 +29,18 @@ export interface SharedDataStoreOpenParams {
28
29
  * @default `'Plugin data'`
29
30
  */
30
31
  readonly folder?: string;
32
+ /**
33
+ * New document encoding at the permanent discovery anchor.
34
+ *
35
+ * @default `'markdown'`
36
+ */
37
+ readonly format?: 'json' | 'markdown';
38
+ /**
39
+ * Enables vault transport. Disabled stores make no adapter calls, including during compaction.
40
+ *
41
+ * @default `true`
42
+ */
43
+ readonly isSyncEnabled?: boolean;
31
44
  /**
32
45
  * Immutable merge rule; changing it requires a new store id.
33
46
  */
@@ -42,6 +55,12 @@ export interface SharedDataStoreOpenParams {
42
55
  * @default `1000000`
43
56
  */
44
57
  readonly maxFileBytes?: number;
58
+ /**
59
+ * Maximum UTF-8 bytes in a reconstructed snapshot before JSON parsing.
60
+ *
61
+ * @default `64000000`
62
+ */
63
+ readonly maxSnapshotBytes?: number;
45
64
  /**
46
65
  * Plugin manifest id.
47
66
  */
@@ -58,13 +77,23 @@ export interface SharedDataStoreOpenParams {
58
77
  export declare class SharedDataStore {
59
78
  protected readonly params: SharedDataStoreOpenParams;
60
79
  protected readonly device: string;
80
+ /**
81
+ Configured and remembered reader roots, including retained migration sources while disabled.
82
+ *
83
+ * @returns Unique roots suitable for metadata exclusion without adapter access.
84
+ */
85
+ get transportRoots(): string[];
61
86
  private readonly activeDeviceMilliseconds;
62
87
  private counter;
88
+ private hasUnpublishedChanges;
89
+ private isSyncEnabled;
90
+ private readonly knownTransportRoots;
63
91
  private readonly localRecords;
92
+ private readonly locations;
64
93
  private replica;
65
94
  private time;
66
- private readonly transport;
67
95
  private readonly vector;
96
+ private get transport();
68
97
  private constructor();
69
98
  /**
70
99
  * Opens and synchronizes a store, restoring its device identity exclusively from IndexedDB.
@@ -80,6 +109,13 @@ export declare class SharedDataStore {
80
109
  * @returns A promise that resolves when compaction finishes.
81
110
  */
82
111
  compact(): Promise<void>;
112
+ /**
113
+ * Recognizes transport files, roots, and ancestor folder operations for consumer event filters.
114
+ *
115
+ * @param path - Vault-relative file or folder path.
116
+ * @returns Whether the path intersects an active or retained transport root.
117
+ */
118
+ containsTransportPath(path: string): boolean;
83
119
  /**
84
120
  * Deletes a register or removes the currently observed additions of a set member.
85
121
  *
@@ -100,6 +136,13 @@ export declare class SharedDataStore {
100
136
  * @returns A detached value, or `undefined` when absent or deleted.
101
137
  */
102
138
  get(key: string): unknown;
139
+ /**
140
+ * Relocates only this plugin/store subtree; keep opening with the original anchor parameters.
141
+ *
142
+ * @param location - New folder and document format.
143
+ * @returns A promise that resolves after history has been copied and verified.
144
+ */
145
+ relocate(location: DataStoreLocation): Promise<void>;
103
146
  /**
104
147
  * Writes one register value, or adds a member to an observed-remove set.
105
148
  *
@@ -116,6 +159,14 @@ export declare class SharedDataStore {
116
159
  * @returns A promise that resolves after journal publication and local commit.
117
160
  */
118
161
  setMany(entries: readonly (readonly [string, JsonValue])[]): Promise<void>;
162
+ /**
163
+ * Toggles transport without changing identity or causal state. Persist the preference in consumer settings.
164
+ * Enabling publishes a complete checkpoint so offline sequences cannot leave gaps.
165
+ *
166
+ * @param isEnabled - Whether to use vault transport for subsequent calls on this instance.
167
+ * @returns A promise that resolves after synchronization when enabling.
168
+ */
169
+ setSyncEnabled(isEnabled: boolean): Promise<void>;
119
170
  /**
120
171
  * Merges complete snapshots and contiguous journal history, then publishes its durable acknowledgement.
121
172
  * Partial deliveries remain pending; a later call retries them. No acknowledgement skips a missing sequence.
@@ -131,6 +182,7 @@ export declare class SharedDataStore {
131
182
  private loadLocal;
132
183
  private mergeCheckpoint;
133
184
  private mergeFiles;
185
+ private mergeTransport;
134
186
  private observeClock;
135
187
  private persist;
136
188
  private publish;