@archont561/qgis-sdk 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/testing.js CHANGED
@@ -1,6 +1,10 @@
1
+ import {
2
+ HOST_SCHEMA_VERSION2,
3
+ HOST_OPERATIONS2
4
+ } from "./shared/chunk-stre69mw.js";
1
5
  import {
2
6
  QgisSdkError2
3
- } from "./shared/chunk-0fknax6w.js";
7
+ } from "./shared/chunk-2hwva3a3.js";
4
8
 
5
9
  // src/testing.ts
6
10
  var PROTOCOL = 1;
@@ -20,6 +24,9 @@ class QgisSdkBridgeHarnessError extends QgisSdkError2 {
20
24
  }
21
25
 
22
26
  class Harness {
27
+ granted;
28
+ theme;
29
+ plugin;
23
30
  listenerSet = new Set;
24
31
  expectations = [];
25
32
  recorded = [];
@@ -29,6 +36,11 @@ class Harness {
29
36
  outbox = [];
30
37
  draining = null;
31
38
  streamCounter = 0;
39
+ constructor(options, plugin) {
40
+ this.granted = Object.freeze([...options.granted ?? HOST_OPERATIONS2]);
41
+ this.theme = options.theme;
42
+ this.plugin = plugin;
43
+ }
32
44
  get calls() {
33
45
  return [...this.recorded];
34
46
  }
@@ -58,6 +70,10 @@ class Harness {
58
70
  this.closeFromPage(envelope);
59
71
  return;
60
72
  }
73
+ if (envelope.kind === "handshake") {
74
+ this.answerHandshake(envelope);
75
+ return;
76
+ }
61
77
  const expectation = this.take(envelope.kind, envelope.operation);
62
78
  if (expectation === undefined) {
63
79
  this.unexpectedCalls.push(envelope);
@@ -110,6 +126,28 @@ class Harness {
110
126
  throw new QgisSdkBridgeHarnessError(problems.join("; "));
111
127
  }
112
128
  }
129
+ answerHandshake(call) {
130
+ const declared = [
131
+ ...(this.plugin?.actions ?? []).map((action) => action.id),
132
+ ...(this.plugin?.streams ?? []).map((stream) => stream.id)
133
+ ];
134
+ this.deliver({
135
+ protocol: PROTOCOL,
136
+ call_id: call.callId,
137
+ ok: true,
138
+ value: {
139
+ protocol: PROTOCOL,
140
+ generation: 0,
141
+ plugin: this.plugin,
142
+ host_schema_version: HOST_SCHEMA_VERSION2,
143
+ operations: [...declared, ...this.granted].map((id) => ({
144
+ id,
145
+ title: id
146
+ })),
147
+ ...this.theme === undefined ? {} : { theme: this.theme }
148
+ }
149
+ });
150
+ }
113
151
  answerInvoke(call, expectation) {
114
152
  this.resolveHandler(call, () => expectation.handler(call.payload ?? {})).then((reply) => {
115
153
  if (reply === SILENCE) {
@@ -292,6 +330,11 @@ class Harness {
292
330
  this.recorded.push(call);
293
331
  return call;
294
332
  }
333
+ if (raw.kind === "handshake") {
334
+ const call = { callId, kind: "handshake", operation: "" };
335
+ this.recorded.push(call);
336
+ return call;
337
+ }
295
338
  if (raw.kind !== "invoke" && raw.kind !== "subscribe") {
296
339
  throw new QgisSdkBridgeHarnessError(`${callId}: ${String(raw.kind)} is not a bridge envelope kind`);
297
340
  }
@@ -309,8 +352,11 @@ class Harness {
309
352
  return call;
310
353
  }
311
354
  }
312
- function createBridgeHarness() {
313
- return new Harness;
355
+ function createBridgeHarness(first = {}, second = {}) {
356
+ if ("schema_version" in first) {
357
+ return new Harness(second, first);
358
+ }
359
+ return new Harness(first, null);
314
360
  }
315
361
  export {
316
362
  QgisSdkBridgeHarnessError,
@@ -319,5 +365,5 @@ export {
319
365
  fault
320
366
  };
321
367
 
322
- //# debugId=8E66F11E152CD67C64756E2164756E21
323
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3RpbmcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBBbiBpbmplY3RlZCBwZXItY2xpZW50IGhhcm5lc3MgZm9yIHRoZSBicmlkZ2UgKFRBU0stMTgsIGRlY2lzaW9uLTIzKS5cbiAqXG4gKiBUaGUgaGFybmVzcyBpcyBhIHtAbGluayBXaXJlVHJhbnNwb3J0fTogYSBwYWdlJ3Mgb3duIGBCcmlkZ2VDbGllbnRgIHNwZWFrcyB0b1xuICogaXQgZXhhY3RseSBhcyBpdCB3b3VsZCB0byBhIFFXZWJDaGFubmVsLCBhbmQgYSB0ZXN0IHNjcmlwdHMgd2hhdCB0aGUgaG9zdFxuICogYW5zd2VycyAtIHR5cGVkIHJlcGxpZXMsIGZhdWx0cywgc2lsZW5jZSwgc3RyZWFtIGV2ZW50cywgdGVybWluYWxzLCBnYXBzIC1cbiAqIHdpdGhvdXQgdG91Y2hpbmcgYSBicm93c2VyIGdsb2JhbCBvciBhIHJ1bm5pbmcgUUdJUy4gVHdvIGhhcm5lc3NlcyBhcmUgdHdvXG4gKiBob3N0cywgc28gaXNvbGF0aW9uIGJldHdlZW4gY2xpZW50cyBpcyBhIGZhY3QgYSB0ZXN0IGNhbiBwcm92ZS5cbiAqXG4gKiBXaGF0IGl0IHByb3ZlcyBpcyBib3VuZGVkLiBBIGdyZWVuIHRlc3QgaGVyZSBzYXlzIHRoZSBwYWdlIGhhbmRsZXMgdGhlXG4gKiBmcmFtZXMgYSBob3N0ICpjb3VsZCogc2VuZDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgYSBRV2ViRW5naW5lVmlldyBvclxuICogYSByZWFsIGhvc3QgZG9lcy4gVGhhdCBldmlkZW5jZSBsaXZlcyBpbiB0aGUgUHl0aG9uIHN1aXRlIGFuZCBpbiB0aGVcbiAqIHF1YWxpZmljYXRpb24gaGFybmVzc2VzIHJlY29yZGVkIGluIGRvYy0xNC4gS2VlcCB0aGUgdHdvIGFwYXJ0IGluIHJlcG9ydHMuXG4gKlxuICogRXZlcnl0aGluZyB0aGUgaGFybmVzcyBzZW5kcyBpcyBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHksIG9uZSBtZXNzYWdlIHBlclxuICogbWljcm90YXNrLCBzbyBhIHJlcGx5IG5ldmVyIHJlLWVudGVycyB0aGUgY2xpZW50IGluc2lkZSBpdHMgb3duIGBzZW5kYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHRTdHJlYW1FdmVudEtpbmQsXG5cdFdpcmVUcmFuc3BvcnQsXG59IGZyb20gXCIuL2JyaWRnZVwiO1xuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuY29uc3QgUFJPVE9DT0wgPSAxO1xuY29uc3QgU1VCU0NSSVBUSU9OX0NBUEFDSVRZID0gNjQ7XG5cbi8qKiBBIHNjcmlwdGVkIGhvc3QgZmFpbHVyZSwgcmV0dXJuZWQgZnJvbSBhbiBleHBlY3RhdGlvbidzIGhhbmRsZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkRmF1bHQge1xuXHRyZWFkb25seSBmYXVsdDogeyByZWFkb25seSBjb2RlOiBzdHJpbmc7IHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB9O1xufVxuXG4vKiogU2NyaXB0IGEgZmFpbHVyZSByZXBseSB3aXRoIHRoaXMgY29kZSBhbmQgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXVsdChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGZhdWx0OiBPYmplY3QuZnJlZXplKHsgY29kZSwgbWVzc2FnZSB9KSB9KTtcbn1cblxuZnVuY3Rpb24gaXNGYXVsdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XCJmYXVsdFwiIGluIHZhbHVlICYmXG5cdFx0dHlwZW9mICh2YWx1ZSBhcyBTY3JpcHRlZEZhdWx0KS5mYXVsdCA9PT0gXCJvYmplY3RcIlxuXHQpO1xufVxuXG4vKiogUmV0dXJuIHRoaXMgZnJvbSBhIGhhbmRsZXIgdG8gbmV2ZXIgYW5zd2VyLCBzbyB0aGUgY2xpZW50J3MgdGltZW91dCBzcGVha3MuICovXG5leHBvcnQgY29uc3QgU0lMRU5DRTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbChcInFnaXMtc2RrLWhhcm5lc3Mtc2lsZW5jZVwiKTtcblxuLyoqIEEgc3Vic2NyaXB0aW9uIHRoZSBzY3JpcHQgdHVybnMgZG93bjogYSBmYXVsdCByZXBseSwgb3Igbm8gcmVwbHkgYXQgYWxsLiAqL1xuZXhwb3J0IHR5cGUgU2NyaXB0ZWRSZWZ1c2FsID0gU2NyaXB0ZWRGYXVsdCB8IHR5cGVvZiBTSUxFTkNFO1xuXG4vKipcbiAqIEEgc3Vic2NyaWJlIGV4cGVjdGF0aW9uJ3Mgc2NyaXB0OiBlbWl0IG9uIGBzdHJlYW1gIG5vdyBvciBsYXRlciwgb3IgcmV0dXJuXG4gKiBhIHJlZnVzYWwgaW5zdGVhZCBvZiBhY2tub3dsZWRnaW5nLlxuICovXG5leHBvcnQgdHlwZSBTdWJzY3JpYmVTY3JpcHQ8UmVxIGV4dGVuZHMgb2JqZWN0PiA9IChcblx0cGF5bG9hZDogUmVxLFxuXHRzdHJlYW06IFNjcmlwdGVkU3RyZWFtLFxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQ29uZnVzaW5nVm9pZFR5cGU6IGEgc2NyaXB0IHRoYXQgb25seSBlbWl0cyByZXR1cm5zIG5vdGhpbmdcbikgPT4gU2NyaXB0ZWRSZWZ1c2FsIHwgdm9pZDtcblxuLyoqIFdoYXQgYW4gaW52b2tlIGV4cGVjdGF0aW9uIG1heSBhbnN3ZXIgd2l0aC4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdGVkUmVwbHk8UmVzPiA9XG5cdHwgUmVzXG5cdHwgU2NyaXB0ZWRGYXVsdFxuXHR8IHR5cGVvZiBTSUxFTkNFXG5cdHwgUHJvbWlzZTxSZXMgfCBTY3JpcHRlZEZhdWx0IHwgdHlwZW9mIFNJTEVOQ0U+O1xuXG4vKiogQSBtZXNzYWdlIHRoZSBjbGllbnQgc2VudCwgYXMgdGhlIGhhcm5lc3MgcmVjb3JkZWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVkQ2FsbCB7XG5cdHJlYWRvbmx5IGNhbGxJZDogc3RyaW5nO1xuXHRyZWFkb25seSBraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIiB8IFwidW5zdWJzY3JpYmVcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHBheWxvYWQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cdHJlYWRvbmx5IHN1YnNjcmlwdGlvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBzY3JpcHRlZCBzdWJzY3JpcHRpb24uIEZyYW1lcyBjYXJyeSB0aGUgc2VxdWVuY2UgdGhlIGtlcm5lbCBjaGVja3MsIHNvXG4gKiBgc2tpcGAgaXMgdGhlIG9uZSB3YXkgdG8gc2NyaXB0IGEgZ2FwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkU3RyZWFtIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBgZmFsc2VgIG9uY2UgdGhlIGhvc3QgZW5kZWQgaXQgb3IgdGhlIHBhZ2UgY2xvc2VkIGl0LiAqL1xuXHRyZWFkb25seSBvcGVuOiBib29sZWFuO1xuXHRlbWl0KGtpbmQ6IFN0cmVhbUV2ZW50S2luZCwgcGF5bG9hZDogdW5rbm93bik6IHZvaWQ7XG5cdGVuZCh0ZXJtaW5hbDogQnJpZGdlU3RyZWFtVGVybWluYWwpOiB2b2lkO1xuXHQvKiogQWR2YW5jZSB0aGUgc2VxdWVuY2Ugd2l0aG91dCBzZW5kaW5nLCBzbyB0aGUgbmV4dCBmcmFtZSBpcyBhIGdhcC4gKi9cblx0c2tpcChmcmFtZXM6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhIHN1YnNjcmliZSBleHBlY3RhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlT3B0aW9ucyB7XG5cdC8qKiBEZWxheSB0aGUgYWNrbm93bGVkZ2VtZW50IHVudGlsIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiAqL1xuXHRyZWFkb25seSBhY2s/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgdGVzdCdzIHNjcmlwdCB3ZW50IHdyb25nOiBhbiB1bm1ldCBvciB1bmV4cGVjdGVkIGNhbGwsIGEgbGVha2VkXG4gKiBzdWJzY3JpcHRpb24sIGEgaGFuZGxlciB0aGF0IHRocmV3LCBvciBhbiBlbnZlbG9wZSB0aGF0IGlzIG5vdCBwcm90b2NvbCAxLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcImhhcm5lc3NfZXJyb3JcIik7XG5cdH1cbn1cblxuaW50ZXJmYWNlIEludm9rZUV4cGVjdGF0aW9uIHtcblx0cmVhZG9ubHkga2luZDogXCJpbnZva2VcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhhbmRsZXI6IChwYXlsb2FkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pID0+IHVua25vd247XG59XG5cbmludGVyZmFjZSBTdWJzY3JpYmVFeHBlY3RhdGlvbiB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwic3Vic2NyaWJlXCI7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+O1xuXHRyZWFkb25seSBvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zO1xufVxuXG50eXBlIEV4cGVjdGF0aW9uID0gSW52b2tlRXhwZWN0YXRpb24gfCBTdWJzY3JpYmVFeHBlY3RhdGlvbjtcblxuaW50ZXJmYWNlIE9wZW5TdHJlYW0ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0c2VxOiBudW1iZXI7XG5cdG9wZW46IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgaGFybmVzcyBhIHRlc3QgaG9sZHM7IGFsc28gdGhlIHRyYW5zcG9ydCBpdHMgY2xpZW50IGlzIGJ1aWx0IG9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VIYXJuZXNzPE9wIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPlxuXHRleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogRXZlcnkgbWVzc2FnZSB0aGUgY2xpZW50IHNlbnQsIGluIG9yZGVyLiAqL1xuXHRyZWFkb25seSBjYWxsczogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBDYWxscyBubyBleHBlY3RhdGlvbiBjb3ZlcmVkOyBlYWNoIHdhcyBhbnN3ZXJlZCBgdW5leHBlY3RlZF9jYWxsYC4gKi9cblx0cmVhZG9ubHkgdW5leHBlY3RlZDogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBTdWJzY3JpcHRpb25zIG5laXRoZXIgZW5kZWQgYnkgYSBzY3JpcHQgbm9yIGNsb3NlZCBieSB0aGUgcGFnZS4gKi9cblx0cmVhZG9ubHkgb3BlblN1YnNjcmlwdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKiogQ2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQuICovXG5cdHJlYWRvbmx5IGxpc3RlbmVyczogbnVtYmVyO1xuXHQvKiogQW5zd2VyIHRoZSBuZXh0IGBvcGVyYXRpb25gIGNhbGwgd2l0aCB3aGF0IGBoYW5kbGVyYCByZXR1cm5zLiAqL1xuXHRleHBlY3RJbnZva2U8XG5cdFx0UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdFJlcyA9IHVua25vd24sXG5cdD4ob3BlcmF0aW9uOiBPcCwgaGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+KTogdm9pZDtcblx0LyoqXG5cdCAqIEFja25vd2xlZGdlIHRoZSBuZXh0IGBvcGVyYXRpb25gIHN1YnNjcmlwdGlvbiBhbmQgaGFuZCBgc2NyaXB0YCB0aGVcblx0ICogc3RyZWFtOyByZXR1cm4gYSBmYXVsdCBvciB7QGxpbmsgU0lMRU5DRX0gZnJvbSBpdCB0byByZWZ1c2UgaW5zdGVhZC5cblx0ICovXG5cdGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3QgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyxcblx0KTogdm9pZDtcblx0LyoqIFB1c2ggYW55IHJhdyBtZXNzYWdlLCBmb3Igd2hhdCBubyBleHBlY3RhdGlvbiBjYW4gc2NyaXB0LiAqL1xuXHRkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQ7XG5cdC8qKiBSZXNvbHZlIG9uY2UgZXZlcnl0aGluZyBxdWV1ZWQgc28gZmFyIGhhcyBiZWVuIGRlbGl2ZXJlZC4gKi9cblx0c2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogVGhyb3cgdW5sZXNzIGV2ZXJ5IGV4cGVjdGF0aW9uIHdhcyBtZXQgYW5kIG5vdGhpbmcgbGVha2VkLiAqL1xuXHRhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZDtcbn1cblxuY2xhc3MgSGFybmVzczxPcCBleHRlbmRzIHN0cmluZz4gaW1wbGVtZW50cyBCcmlkZ2VIYXJuZXNzPE9wPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJTZXQgPSBuZXcgU2V0PChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGV4cGVjdGF0aW9uczogRXhwZWN0YXRpb25bXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlY29yZGVkOiBSZWNvcmRlZENhbGxbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHVuZXhwZWN0ZWRDYWxsczogUmVjb3JkZWRDYWxsW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBzdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIE9wZW5TdHJlYW0+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgb3V0Ym94OiB1bmtub3duW10gPSBbXTtcblx0cHJpdmF0ZSBkcmFpbmluZzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN0cmVhbUNvdW50ZXIgPSAwO1xuXG5cdHB1YmxpYyBnZXQgY2FsbHMoKTogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5yZWNvcmRlZF07XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHVuZXhwZWN0ZWQoKTogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy51bmV4cGVjdGVkQ2FsbHNdO1xuXHR9XG5cblx0cHVibGljIGdldCBvcGVuU3Vic2NyaXB0aW9ucygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnN0cmVhbXMudmFsdWVzKCldXG5cdFx0XHQuZmlsdGVyKChzdHJlYW0pID0+IHN0cmVhbS5vcGVuKVxuXHRcdFx0Lm1hcCgoc3RyZWFtKSA9PiBzdHJlYW0uaWQpO1xuXHR9XG5cblx0cHVibGljIGdldCBsaXN0ZW5lcnMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5saXN0ZW5lclNldC5zaXplO1xuXHR9XG5cblx0cHVibGljIHN1YnNjcmliZShsaXN0ZW5lcjogKG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHR0aGlzLmxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lcik7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMubGlzdGVuZXJTZXQuZGVsZXRlKGxpc3RlbmVyKTtcblx0XHRcdGlmICh0aGlzLmxpc3RlbmVyU2V0LnNpemUgPT09IDApIHtcblx0XHRcdFx0Ly8gVGhlIGxhc3QgY2xpZW50IGRldGFjaGVkOiB0aGUgdmlldyBpcyBnb25lLCBhbmQgYSBob3N0IGRpc3Bvc2VzXG5cdFx0XHRcdC8vIHRoZSBzdWJzY3JpcHRpb25zIG9mIGEgdmlldyBpdCBsb3N0IChkZWNpc2lvbi0yMyksIHNvIHRoZXkgYXJlXG5cdFx0XHRcdC8vIG5vIGxvbmdlciBsZWFrcy5cblx0XHRcdFx0Zm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5zdHJlYW1zLnZhbHVlcygpKSB7XG5cdFx0XHRcdFx0c3RyZWFtLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgc2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0Y29uc3QgZW52ZWxvcGUgPSB0aGlzLnBhcnNlRW52ZWxvcGUobWVzc2FnZSk7XG5cdFx0aWYgKGVudmVsb3BlLmtpbmQgPT09IFwidW5zdWJzY3JpYmVcIikge1xuXHRcdFx0dGhpcy5jbG9zZUZyb21QYWdlKGVudmVsb3BlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZXhwZWN0YXRpb24gPSB0aGlzLnRha2UoZW52ZWxvcGUua2luZCwgZW52ZWxvcGUub3BlcmF0aW9uKTtcblx0XHRpZiAoZXhwZWN0YXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy51bmV4cGVjdGVkQ2FsbHMucHVzaChlbnZlbG9wZSk7XG5cdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKFxuXHRcdFx0XHRlbnZlbG9wZS5jYWxsSWQsXG5cdFx0XHRcdFwidW5leHBlY3RlZF9jYWxsXCIsXG5cdFx0XHRcdGBubyBleHBlY3RhdGlvbiBjb3ZlcnMgJHtlbnZlbG9wZS5raW5kfSAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLm9wZXJhdGlvbil9YCxcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChleHBlY3RhdGlvbi5raW5kID09PSBcImludm9rZVwiKSB7XG5cdFx0XHR0aGlzLmFuc3dlckludm9rZShlbnZlbG9wZSwgZXhwZWN0YXRpb24pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmFuc3dlclN1YnNjcmliZShlbnZlbG9wZSwgZXhwZWN0YXRpb24pO1xuXHR9XG5cblx0cHVibGljIGV4cGVjdEludm9rZTxSZXEgZXh0ZW5kcyBvYmplY3QsIFJlcz4oXG5cdFx0b3BlcmF0aW9uOiBPcCxcblx0XHRoYW5kbGVyOiAocGF5bG9hZDogUmVxKSA9PiBTY3JpcHRlZFJlcGx5PFJlcz4sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuZXhwZWN0YXRpb25zLnB1c2goe1xuXHRcdFx0a2luZDogXCJpbnZva2VcIixcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdGhhbmRsZXI6IGhhbmRsZXIgYXMgSW52b2tlRXhwZWN0YXRpb25bXCJoYW5kbGVyXCJdLFxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zID0ge30sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuZXhwZWN0YXRpb25zLnB1c2goe1xuXHRcdFx0a2luZDogXCJzdWJzY3JpYmVcIixcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdHNjcmlwdDogc2NyaXB0IGFzIFN1YnNjcmliZUV4cGVjdGF0aW9uW1wic2NyaXB0XCJdLFxuXHRcdFx0b3B0aW9ucyxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMub3V0Ym94LnB1c2gocmF3KTtcblx0XHR0aGlzLmRyYWluKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5kcmFpbmluZyA/PyBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcHJvYmxlbXMgPSBbLi4udGhpcy5wcm9ibGVtc107XG5cdFx0aWYgKHRoaXMuZXhwZWN0YXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHVubWV0ID0gdGhpcy5leHBlY3RhdGlvbnMubWFwKFxuXHRcdFx0XHQoZXhwZWN0YXRpb24pID0+IGAke2V4cGVjdGF0aW9uLmtpbmR9ICR7ZXhwZWN0YXRpb24ub3BlcmF0aW9ufWAsXG5cdFx0XHQpO1xuXHRcdFx0cHJvYmxlbXMucHVzaChgdW5tZXQgZXhwZWN0YXRpb25zOiAke3VubWV0LmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMudW5leHBlY3RlZENhbGxzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHVuZXhwZWN0ZWQgPSB0aGlzLnVuZXhwZWN0ZWRDYWxscy5tYXAoXG5cdFx0XHRcdChjYWxsKSA9PiBgJHtjYWxsLmtpbmR9ICR7Y2FsbC5vcGVyYXRpb259YCxcblx0XHRcdCk7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGB1bmV4cGVjdGVkIGNhbGxzOiAke3VuZXhwZWN0ZWQuam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0XHRjb25zdCBvcGVuID0gdGhpcy5vcGVuU3Vic2NyaXB0aW9ucztcblx0XHRpZiAob3Blbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGBvcGVuIHN1YnNjcmlwdGlvbnM6ICR7b3Blbi5qb2luKFwiLCBcIil9YCk7XG5cdFx0fVxuXHRcdGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihwcm9ibGVtcy5qb2luKFwiOyBcIikpO1xuXHRcdH1cblx0fVxuXG5cdC8vIC0tIGFuc3dlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIGFuc3dlckludm9rZShcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0ZXhwZWN0YXRpb246IEludm9rZUV4cGVjdGF0aW9uLFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+XG5cdFx0XHRleHBlY3RhdGlvbi5oYW5kbGVyKGNhbGwucGF5bG9hZCA/PyB7fSksXG5cdFx0KS50aGVuKChyZXBseSkgPT4ge1xuXHRcdFx0aWYgKHJlcGx5ID09PSBTSUxFTkNFKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChpc0ZhdWx0KHJlcGx5KSkge1xuXHRcdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKGNhbGwuY2FsbElkLCByZXBseS5mYXVsdC5jb2RlLCByZXBseS5mYXVsdC5tZXNzYWdlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdHZhbHVlOiByZXBseSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhbnN3ZXJTdWJzY3JpYmUoXG5cdFx0Y2FsbDogUmVjb3JkZWRDYWxsLFxuXHRcdGV4cGVjdGF0aW9uOiBTdWJzY3JpYmVFeHBlY3RhdGlvbixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zdHJlYW1Db3VudGVyICs9IDE7XG5cdFx0Y29uc3Qgb3BlbjogT3BlblN0cmVhbSA9IHtcblx0XHRcdGlkOiBgcyR7dGhpcy5zdHJlYW1Db3VudGVyfWAsXG5cdFx0XHRvcGVyYXRpb246IGNhbGwub3BlcmF0aW9uLFxuXHRcdFx0c2VxOiAwLFxuXHRcdFx0b3BlbjogZmFsc2UsXG5cdFx0fTtcblx0XHQvLyBGcmFtZXMgdGhlIHNjcmlwdCBlbWl0cyBiZWZvcmUgdGhlIGFja25vd2xlZGdlbWVudCBpcyBkZWNpZGVkIGFyZSBoZWxkXG5cdFx0Ly8gYmFjazogYSByZWZ1c2VkIHN1YnNjcmlwdGlvbiBzZW5kcyBub25lLCBhbiBhY2NlcHRlZCBvbmUgc2VuZHMgdGhlbVxuXHRcdC8vIGFmdGVyIHRoZSBhY2tub3dsZWRnZW1lbnQsIHNvIHRoZSBrZXJuZWwgaGFzIHJlZ2lzdGVyZWQgdGhlXG5cdFx0Ly8gc3Vic2NyaXB0aW9uIGJ5IHRoZSB0aW1lIHRoZSBmaXJzdCBmcmFtZSByZWFjaGVzIGl0LlxuXHRcdGNvbnN0IGhlbGQ6IHVua25vd25bXSA9IFtdO1xuXHRcdGxldCBzaW5rID0gKGZyYW1lOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRoZWxkLnB1c2goZnJhbWUpO1xuXHRcdH07XG5cdFx0Y29uc3Qgc3RyZWFtID0gdGhpcy5zY3JpcHRlZChvcGVuLCAoZnJhbWUpID0+IHNpbmsoZnJhbWUpKTtcblx0XHRjb25zdCBhY2sgPSBleHBlY3RhdGlvbi5vcHRpb25zLmFjayA/PyAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHRcdGFjaygpXG5cdFx0XHQudGhlbigoKSA9PlxuXHRcdFx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+IHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBleHBlY3RhdGlvbi5zY3JpcHQoY2FsbC5wYXlsb2FkID8/IHt9LCBzdHJlYW0pO1xuXHRcdFx0XHR9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKChvdXRjb21lKSA9PiB7XG5cdFx0XHRcdGlmIChvdXRjb21lID09PSBTSUxFTkNFIHx8IGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRoZWxkLmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0aWYgKGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuZGVsaXZlckZhaWx1cmUoXG5cdFx0XHRcdFx0XHRcdGNhbGwuY2FsbElkLFxuXHRcdFx0XHRcdFx0XHRvdXRjb21lLmZhdWx0LmNvZGUsXG5cdFx0XHRcdFx0XHRcdG91dGNvbWUuZmF1bHQubWVzc2FnZSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5saXN0ZW5lclNldC5zaXplID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgZGV0YWNoZWQgd2hpbGUgdGhlIGhvc3Qgd2FzIGRlY2lkaW5nOiBub3RoaW5nIHRvXG5cdFx0XHRcdFx0Ly8gYWNrbm93bGVkZ2UgdG8sIG5vdGhpbmcgdG8ga2VlcCBvcGVuLlxuXHRcdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zdHJlYW1zLnNldChvcGVuLmlkLCBvcGVuKTtcblx0XHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0Y2FsbF9pZDogY2FsbC5jYWxsSWQsXG5cdFx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRcdGNhcGFjaXR5OiBTVUJTQ1JJUFRJT05fQ0FQQUNJVFksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNpbmsgPSAoZnJhbWUpID0+IHRoaXMuZGVsaXZlcihmcmFtZSk7XG5cdFx0XHRcdGZvciAoY29uc3QgZnJhbWUgb2YgaGVsZCkge1xuXHRcdFx0XHRcdHNpbmsoZnJhbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlSGFuZGxlcihcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0cnVuOiAoKSA9PiB1bmtub3duLFxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dW5rbm93bj4oKHJlc29sdmUpID0+IHtcblx0XHRcdHJlc29sdmUocnVuKCkpO1xuXHRcdH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdHRoaXMucHJvYmxlbXMucHVzaChcblx0XHRcdFx0YGhhbmRsZXIgZm9yICR7Y2FsbC5raW5kfSAke2NhbGwub3BlcmF0aW9ufSB0aHJldzogJHttZXNzYWdlfWAsXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZhdWx0KFwiaGFybmVzc19lcnJvclwiLCBtZXNzYWdlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2NyaXB0ZWQoXG5cdFx0b3BlbjogT3BlblN0cmVhbSxcblx0XHRzaW5rOiAoZnJhbWU6IHVua25vd24pID0+IHZvaWQsXG5cdCk6IFNjcmlwdGVkU3RyZWFtIHtcblx0XHRjb25zdCByZXF1aXJlT3BlbiA9ICh2ZXJiOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdGlmICghb3Blbi5vcGVuKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGBjYW5ub3QgJHt2ZXJifSBvbiBzdWJzY3JpcHRpb24gJHtvcGVuLmlkfTogaXQgaXMgbm90IG9wZW5gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBvcGVuLmlkLFxuXHRcdFx0b3BlcmF0aW9uOiBvcGVuLm9wZXJhdGlvbixcblx0XHRcdGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRyZXR1cm4gb3Blbi5vcGVuO1xuXHRcdFx0fSxcblx0XHRcdGVtaXQ6IChraW5kLCBwYXlsb2FkKSA9PiB7XG5cdFx0XHRcdHJlcXVpcmVPcGVuKFwiZW1pdFwiKTtcblx0XHRcdFx0c2luayh7XG5cdFx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRzZXE6IG9wZW4uc2VxLFxuXHRcdFx0XHRcdGV2ZW50OiB7IGtpbmQsIHBheWxvYWQgfSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9wZW4uc2VxICs9IDE7XG5cdFx0XHR9LFxuXHRcdFx0ZW5kOiAodGVybWluYWwpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJlbmRcIik7XG5cdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRzaW5rKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBvcGVuLmlkLFxuXHRcdFx0XHRcdHNlcTogb3Blbi5zZXEsXG5cdFx0XHRcdFx0dGVybWluYWwsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvcGVuLnNlcSArPSAxO1xuXHRcdFx0fSxcblx0XHRcdHNraXA6IChmcmFtZXMpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJza2lwXCIpO1xuXHRcdFx0XHRvcGVuLnNlcSArPSBmcmFtZXM7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGNsb3NlRnJvbVBhZ2UoY2FsbDogUmVjb3JkZWRDYWxsKTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BlbiA9XG5cdFx0XHRjYWxsLnN1YnNjcmlwdGlvbklkID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdFx0OiB0aGlzLnN0cmVhbXMuZ2V0KGNhbGwuc3Vic2NyaXB0aW9uSWQpO1xuXHRcdGNvbnN0IGRpc3Bvc2VkID0gb3Blbj8ub3BlbiA9PT0gdHJ1ZTtcblx0XHRpZiAob3BlbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0b2s6IHRydWUsXG5cdFx0XHR2YWx1ZTogeyBkaXNwb3NlZCB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxpdmVyRmFpbHVyZShjYWxsSWQ6IHN0cmluZywgY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0b2s6IGZhbHNlLFxuXHRcdFx0ZXJyb3I6IHsgY29kZSwgbWVzc2FnZSB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkcmFpbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5kcmFpbmluZyAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRyYWluaW5nID0gKGFzeW5jICgpID0+IHtcblx0XHRcdHdoaWxlICh0aGlzLm91dGJveC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5vdXRib3guc2hpZnQoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lclNldF0pIHtcblx0XHRcdFx0XHRsaXN0ZW5lcihtZXNzYWdlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kcmFpbmluZyA9IG51bGw7XG5cdFx0fSkoKTtcblx0fVxuXG5cdC8vIC0tIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHByaXZhdGUgdGFrZShcblx0XHRraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIixcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0KTogRXhwZWN0YXRpb24gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5leHBlY3RhdGlvbnMuZmluZEluZGV4KFxuXHRcdFx0KGV4cGVjdGF0aW9uKSA9PlxuXHRcdFx0XHRleHBlY3RhdGlvbi5raW5kID09PSBraW5kICYmIGV4cGVjdGF0aW9uLm9wZXJhdGlvbiA9PT0gb3BlcmF0aW9uLFxuXHRcdCk7XG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXhwZWN0YXRpb25zLnNwbGljZShpbmRleCwgMSlbMF07XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlRW52ZWxvcGUobWVzc2FnZTogdW5rbm93bik6IFJlY29yZGVkQ2FsbCB7XG5cdFx0aWYgKHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiIHx8IG1lc3NhZ2UgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IGEgbm9uLW9iamVjdFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmF3ID0gbWVzc2FnZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRpZiAocmF3LnByb3RvY29sICE9PSBQUk9UT0NPTCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGB0aGUgY2xpZW50IHNwZWFrcyBwcm90b2NvbCAke1N0cmluZyhyYXcucHJvdG9jb2wpfTsgdGhlIGhhcm5lc3MgZmFrZXMgJHtQUk9UT0NPTH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcuY2FsbF9pZCAhPT0gXCJzdHJpbmdcIiB8fCByYXcuY2FsbF9pZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IG5vIGNhbGxfaWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbGxJZCA9IHJhdy5jYWxsX2lkO1xuXHRcdGlmIChyYXcua2luZCA9PT0gXCJ1bnN1YnNjcmliZVwiKSB7XG5cdFx0XHRjb25zdCBzdWJzY3JpcHRpb25JZCA9IHJhdy5zdWJzY3JpcHRpb25faWQ7XG5cdFx0XHRpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGAke2NhbGxJZH06IHVuc3Vic2NyaWJlIG5hbWVzIG5vIHN1YnNjcmlwdGlvbl9pZGAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjYWxsOiBSZWNvcmRlZENhbGwgPSB7XG5cdFx0XHRcdGNhbGxJZCxcblx0XHRcdFx0a2luZDogXCJ1bnN1YnNjcmliZVwiLFxuXHRcdFx0XHRvcGVyYXRpb246IHRoaXMuc3RyZWFtcy5nZXQoc3Vic2NyaXB0aW9uSWQpPy5vcGVyYXRpb24gPz8gXCJcIixcblx0XHRcdFx0c3Vic2NyaXB0aW9uSWQsXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWNvcmRlZC5wdXNoKGNhbGwpO1xuXHRcdFx0cmV0dXJuIGNhbGw7XG5cdFx0fVxuXHRcdGlmIChyYXcua2luZCAhPT0gXCJpbnZva2VcIiAmJiByYXcua2luZCAhPT0gXCJzdWJzY3JpYmVcIikge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGAke2NhbGxJZH06ICR7U3RyaW5nKHJhdy5raW5kKX0gaXMgbm90IGEgYnJpZGdlIGVudmVsb3BlIGtpbmRgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcub3BlcmF0aW9uICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0YCR7Y2FsbElkfTogb3BlcmF0aW9uIG11c3QgYmUgYSBzdHJpbmdgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y29uc3QgcGF5bG9hZCA9XG5cdFx0XHR0eXBlb2YgcmF3LnBheWxvYWQgPT09IFwib2JqZWN0XCIgJiYgcmF3LnBheWxvYWQgIT09IG51bGxcblx0XHRcdFx0PyAocmF3LnBheWxvYWQgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuXHRcdFx0XHQ6IHt9O1xuXHRcdGNvbnN0IGNhbGw6IFJlY29yZGVkQ2FsbCA9IHtcblx0XHRcdGNhbGxJZCxcblx0XHRcdGtpbmQ6IHJhdy5raW5kLFxuXHRcdFx0b3BlcmF0aW9uOiByYXcub3BlcmF0aW9uLFxuXHRcdFx0cGF5bG9hZCxcblx0XHR9O1xuXHRcdHRoaXMucmVjb3JkZWQucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gY2FsbDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGhhcm5lc3M7IGBPcGAgbmFycm93cyB0aGUgb3BlcmF0aW9ucyBhIHRlc3QgbWF5IGV4cGVjdCwgdHlwaWNhbGx5XG4gKiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSdzIGBPcGVyYXRpb25JZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcmlkZ2VIYXJuZXNzPFxuXHRPcCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4oKTogQnJpZGdlSGFybmVzczxPcD4ge1xuXHRyZXR1cm4gbmV3IEhhcm5lc3M8T3A+KCk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQXlCQSxJQUFNLFdBQVc7QUFDakIsSUFBTSx3QkFBd0I7QUFRdkIsU0FBUyxLQUFLLENBQUMsTUFBYyxTQUFnQztBQUFBLEVBQ25FLE9BQU8sT0FBTyxPQUFPLEVBQUUsT0FBTyxPQUFPLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFBQTtBQUdqRSxTQUFTLE9B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
368
+ //# debugId=8C3CD16BB44B1EC464756E2164756E21
369
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3RpbmcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBBbiBpbmplY3RlZCBwZXItY2xpZW50IGhhcm5lc3MgZm9yIHRoZSBicmlkZ2UgKGRlY2lzaW9uLTIzKS5cbiAqXG4gKiBUaGUgaGFybmVzcyBpcyBhIHtAbGluayBXaXJlVHJhbnNwb3J0fTogYSBwYWdlJ3Mgb3duIGBCcmlkZ2VDbGllbnRgIHNwZWFrcyB0b1xuICogaXQgZXhhY3RseSBhcyBpdCB3b3VsZCB0byBhIFFXZWJDaGFubmVsLCBhbmQgYSB0ZXN0IHNjcmlwdHMgd2hhdCB0aGUgaG9zdFxuICogYW5zd2VycyAtIHR5cGVkIHJlcGxpZXMsIGZhdWx0cywgc2lsZW5jZSwgc3RyZWFtIGV2ZW50cywgdGVybWluYWxzLCBnYXBzIC1cbiAqIHdpdGhvdXQgdG91Y2hpbmcgYSBicm93c2VyIGdsb2JhbCBvciBhIHJ1bm5pbmcgUUdJUy4gVHdvIGhhcm5lc3NlcyBhcmUgdHdvXG4gKiBob3N0cywgc28gaXNvbGF0aW9uIGJldHdlZW4gY2xpZW50cyBpcyBhIGZhY3QgYSB0ZXN0IGNhbiBwcm92ZS5cbiAqXG4gKiBXaGF0IGl0IHByb3ZlcyBpcyBib3VuZGVkLiBBIGdyZWVuIHRlc3QgaGVyZSBzYXlzIHRoZSBwYWdlIGhhbmRsZXMgdGhlXG4gKiBmcmFtZXMgYSBob3N0ICpjb3VsZCogc2VuZDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgYSBRV2ViRW5naW5lVmlldyBvclxuICogYSByZWFsIGhvc3QgZG9lcy4gVGhhdCBldmlkZW5jZSBsaXZlcyBpbiB0aGUgUHl0aG9uIHN1aXRlIGFuZCBpbiB0aGVcbiAqIHF1YWxpZmljYXRpb24gaGFybmVzc2VzIHJlY29yZGVkIGluIHRoZSB3b3Jrc3BhY2UgZ3VpZGUuIEtlZXAgdGhlIHR3byBhcGFydCBpbiByZXBvcnRzLlxuICpcbiAqIEV2ZXJ5dGhpbmcgdGhlIGhhcm5lc3Mgc2VuZHMgaXMgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5LCBvbmUgbWVzc2FnZSBwZXJcbiAqIG1pY3JvdGFzaywgc28gYSByZXBseSBuZXZlciByZS1lbnRlcnMgdGhlIGNsaWVudCBpbnNpZGUgaXRzIG93biBgc2VuZGAuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuXHRCcmlkZ2VTdHJlYW1UZXJtaW5hbCxcblx0U3RyZWFtRXZlbnRLaW5kLFxuXHRXaXJlVHJhbnNwb3J0LFxufSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtcblx0SE9TVF9PUEVSQVRJT05TLFxuXHRIT1NUX1NDSEVNQV9WRVJTSU9OLFxuXHR0eXBlIEhvc3RPcGVyYXRpb25JZCxcbn0gZnJvbSBcIi4vZ2VuZXJhdGVkL2hvc3RcIjtcbmltcG9ydCB0eXBlIHsgUWdpc1Nka0hvc3RUaGVtZSB9IGZyb20gXCIuL3FnaXMtc2RrXCI7XG5pbXBvcnQgdHlwZSB7IEJyaWRnZVNjaGVtYSwgT3BlcmF0aW9uU2hhcGUsIFN0cmVhbVNoYXBlIH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbmNvbnN0IFBST1RPQ09MID0gMTtcbmNvbnN0IFNVQlNDUklQVElPTl9DQVBBQ0lUWSA9IDY0O1xuXG4vKiogQSBzY3JpcHRlZCBob3N0IGZhaWx1cmUsIHJldHVybmVkIGZyb20gYW4gZXhwZWN0YXRpb24ncyBoYW5kbGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRlZEZhdWx0IHtcblx0cmVhZG9ubHkgZmF1bHQ6IHsgcmVhZG9ubHkgY29kZTogc3RyaW5nOyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcgfTtcbn1cblxuLyoqIFNjcmlwdCBhIGZhaWx1cmUgcmVwbHkgd2l0aCB0aGlzIGNvZGUgYW5kIG1lc3NhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gZmF1bHQoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBTY3JpcHRlZEZhdWx0IHtcblx0cmV0dXJuIE9iamVjdC5mcmVlemUoeyBmYXVsdDogT2JqZWN0LmZyZWV6ZSh7IGNvZGUsIG1lc3NhZ2UgfSkgfSk7XG59XG5cbmZ1bmN0aW9uIGlzRmF1bHQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTY3JpcHRlZEZhdWx0IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcblx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFwiZmF1bHRcIiBpbiB2YWx1ZSAmJlxuXHRcdHR5cGVvZiAodmFsdWUgYXMgU2NyaXB0ZWRGYXVsdCkuZmF1bHQgPT09IFwib2JqZWN0XCJcblx0KTtcbn1cblxuLyoqIFJldHVybiB0aGlzIGZyb20gYSBoYW5kbGVyIHRvIG5ldmVyIGFuc3dlciwgc28gdGhlIGNsaWVudCdzIHRpbWVvdXQgc3BlYWtzLiAqL1xuZXhwb3J0IGNvbnN0IFNJTEVOQ0U6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woXCJxZ2lzLXNkay1oYXJuZXNzLXNpbGVuY2VcIik7XG5cbi8qKiBBIHN1YnNjcmlwdGlvbiB0aGUgc2NyaXB0IHR1cm5zIGRvd246IGEgZmF1bHQgcmVwbHksIG9yIG5vIHJlcGx5IGF0IGFsbC4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdGVkUmVmdXNhbCA9IFNjcmlwdGVkRmF1bHQgfCB0eXBlb2YgU0lMRU5DRTtcblxuLyoqXG4gKiBBIHN1YnNjcmliZSBleHBlY3RhdGlvbidzIHNjcmlwdDogZW1pdCBvbiBgc3RyZWFtYCBub3cgb3IgbGF0ZXIsIG9yIHJldHVyblxuICogYSByZWZ1c2FsIGluc3RlYWQgb2YgYWNrbm93bGVkZ2luZy5cbiAqL1xuZXhwb3J0IHR5cGUgU3Vic2NyaWJlU2NyaXB0PFJlcSBleHRlbmRzIG9iamVjdD4gPSAoXG5cdHBheWxvYWQ6IFJlcSxcblx0c3RyZWFtOiBTY3JpcHRlZFN0cmVhbSxcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbmZ1c2luZ1ZvaWRUeXBlOiBhIHNjcmlwdCB0aGF0IG9ubHkgZW1pdHMgcmV0dXJucyBub3RoaW5nXG4pID0+IFNjcmlwdGVkUmVmdXNhbCB8IHZvaWQ7XG5cbi8qKiBXaGF0IGFuIGludm9rZSBleHBlY3RhdGlvbiBtYXkgYW5zd2VyIHdpdGguICovXG5leHBvcnQgdHlwZSBTY3JpcHRlZFJlcGx5PFJlcz4gPVxuXHR8IFJlc1xuXHR8IFNjcmlwdGVkRmF1bHRcblx0fCB0eXBlb2YgU0lMRU5DRVxuXHR8IFByb21pc2U8UmVzIHwgU2NyaXB0ZWRGYXVsdCB8IHR5cGVvZiBTSUxFTkNFPjtcblxuLyoqIEEgbWVzc2FnZSB0aGUgY2xpZW50IHNlbnQsIGFzIHRoZSBoYXJuZXNzIHJlY29yZGVkIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlZENhbGwge1xuXHRyZWFkb25seSBjYWxsSWQ6IHN0cmluZztcblx0cmVhZG9ubHkga2luZDogXCJpbnZva2VcIiB8IFwic3Vic2NyaWJlXCIgfCBcInVuc3Vic2NyaWJlXCIgfCBcImhhbmRzaGFrZVwiO1xuXHQvKiogRW1wdHkgZm9yIGEgaGFuZHNoYWtlLCB3aGljaCBuYW1lcyBubyBvcGVyYXRpb24uICovXG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXHRyZWFkb25seSBzdWJzY3JpcHRpb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgc2NyaXB0ZWQgc3Vic2NyaXB0aW9uLiBGcmFtZXMgY2FycnkgdGhlIHNlcXVlbmNlIHRoZSBrZXJuZWwgY2hlY2tzLCBzb1xuICogYHNraXBgIGlzIHRoZSBvbmUgd2F5IHRvIHNjcmlwdCBhIGdhcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRlZFN0cmVhbSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHQvKiogYGZhbHNlYCBvbmNlIHRoZSBob3N0IGVuZGVkIGl0IG9yIHRoZSBwYWdlIGNsb3NlZCBpdC4gKi9cblx0cmVhZG9ubHkgb3BlbjogYm9vbGVhbjtcblx0ZW1pdChraW5kOiBTdHJlYW1FdmVudEtpbmQsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkO1xuXHRlbmQodGVybWluYWw6IEJyaWRnZVN0cmVhbVRlcm1pbmFsKTogdm9pZDtcblx0LyoqIEFkdmFuY2UgdGhlIHNlcXVlbmNlIHdpdGhvdXQgc2VuZGluZywgc28gdGhlIG5leHQgZnJhbWUgaXMgYSBnYXAuICovXG5cdHNraXAoZnJhbWVzOiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYSBzdWJzY3JpYmUgZXhwZWN0YXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZU9wdGlvbnMge1xuXHQvKiogRGVsYXkgdGhlIGFja25vd2xlZGdlbWVudCB1bnRpbCB0aGlzIHByb21pc2Ugc2V0dGxlcy4gKi9cblx0cmVhZG9ubHkgYWNrPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVCcmlkZ2VIYXJuZXNzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFybmVzc09wdGlvbnMge1xuXHQvKipcblx0ICogVGhlIGhvc3Qgb3BlcmF0aW9uIGlkcyB0aGUgc2NyaXB0ZWQgaGFuZHNoYWtlIGFkdmVydGlzZXM7IGV2ZXJ5IGN1cmF0ZWRcblx0ICogaWQgYnkgZGVmYXVsdC4gQSBuYXJyb3dlZCBsaXN0IGlzIGhvdyBhIHRlc3QgcHJvdmVzIGEgcGFnZSByZXNwZWN0c1xuXHQgKiBgcWdpcy5ob3N0LmdyYW50ZWRgLiBBIGNhbGwgb3V0c2lkZSBpdCBpcyBzdGlsbCBhbnN3ZXJlZFxuXHQgKiBieSB3aGF0ZXZlciB0aGUgdGVzdCBzY3JpcHRlZCAtIHR5cGljYWxseSBgZmF1bHQoXCJub3RfYXV0aG9yaXplZFwiLCAuLi4pYCAtXG5cdCAqIGJlY2F1c2UgdGhhdCByZWZ1c2FsIGlzIHRoZSBob3N0J3MsIG5vdCB0aGUgaGFybmVzcydzLlxuXHQgKi9cblx0cmVhZG9ubHkgZ3JhbnRlZD86IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHQvKipcblx0ICogVGhlIHBhbGV0dGUgdGhlIHNjcmlwdGVkIGhhbmRzaGFrZSBjYXJyaWVzIGFzIGB0aGVtZWA7IG5vbmUgYnkgZGVmYXVsdCxcblx0ICogd2hpY2ggaXMgd2hhdCBhIHBhZ2Ugb3V0c2lkZSBRR0lTIHNlZXMuIFRoZSBzYW1lIHNoYXBlIHRoZSBXZWJFbmdpbmVcblx0ICogYWRhcHRlciBzZW5kcywgc28gYSB0ZXN0IGNhbiBwcm92ZSBhIHBhZ2UgdGFrZXMgdGhlIGhvc3QncyBjb2xvdXJzLlxuXHQgKi9cblx0cmVhZG9ubHkgdGhlbWU/OiBRZ2lzU2RrSG9zdFRoZW1lO1xufVxuXG4vKipcbiAqIEEgdGVzdCdzIHNjcmlwdCB3ZW50IHdyb25nOiBhbiB1bm1ldCBvciB1bmV4cGVjdGVkIGNhbGwsIGEgbGVha2VkXG4gKiBzdWJzY3JpcHRpb24sIGEgaGFuZGxlciB0aGF0IHRocmV3LCBvciBhbiBlbnZlbG9wZSB0aGF0IGlzIG5vdCBwcm90b2NvbCAxLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcImhhcm5lc3NfZXJyb3JcIik7XG5cdH1cbn1cblxuaW50ZXJmYWNlIEludm9rZUV4cGVjdGF0aW9uIHtcblx0cmVhZG9ubHkga2luZDogXCJpbnZva2VcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhhbmRsZXI6IChwYXlsb2FkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pID0+IHVua25vd247XG59XG5cbmludGVyZmFjZSBTdWJzY3JpYmVFeHBlY3RhdGlvbiB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwic3Vic2NyaWJlXCI7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+O1xuXHRyZWFkb25seSBvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zO1xufVxuXG50eXBlIEV4cGVjdGF0aW9uID0gSW52b2tlRXhwZWN0YXRpb24gfCBTdWJzY3JpYmVFeHBlY3RhdGlvbjtcblxuaW50ZXJmYWNlIE9wZW5TdHJlYW0ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0c2VxOiBudW1iZXI7XG5cdG9wZW46IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgaGFybmVzcyBhIHRlc3QgaG9sZHM7IGFsc28gdGhlIHRyYW5zcG9ydCBpdHMgY2xpZW50IGlzIGJ1aWx0IG9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VIYXJuZXNzPE9wIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPlxuXHRleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogRXZlcnkgbWVzc2FnZSB0aGUgY2xpZW50IHNlbnQsIGluIG9yZGVyLiAqL1xuXHRyZWFkb25seSBjYWxsczogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBDYWxscyBubyBleHBlY3RhdGlvbiBjb3ZlcmVkOyBlYWNoIHdhcyBhbnN3ZXJlZCBgdW5leHBlY3RlZF9jYWxsYC4gKi9cblx0cmVhZG9ubHkgdW5leHBlY3RlZDogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBTdWJzY3JpcHRpb25zIG5laXRoZXIgZW5kZWQgYnkgYSBzY3JpcHQgbm9yIGNsb3NlZCBieSB0aGUgcGFnZS4gKi9cblx0cmVhZG9ubHkgb3BlblN1YnNjcmlwdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKiogQ2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQuICovXG5cdHJlYWRvbmx5IGxpc3RlbmVyczogbnVtYmVyO1xuXHQvKiogQW5zd2VyIHRoZSBuZXh0IGBvcGVyYXRpb25gIGNhbGwgd2l0aCB3aGF0IGBoYW5kbGVyYCByZXR1cm5zLiAqL1xuXHRleHBlY3RJbnZva2U8XG5cdFx0UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdFJlcyA9IHVua25vd24sXG5cdD4ob3BlcmF0aW9uOiBPcCwgaGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+KTogdm9pZDtcblx0LyoqXG5cdCAqIEFja25vd2xlZGdlIHRoZSBuZXh0IGBvcGVyYXRpb25gIHN1YnNjcmlwdGlvbiBhbmQgaGFuZCBgc2NyaXB0YCB0aGVcblx0ICogc3RyZWFtOyByZXR1cm4gYSBmYXVsdCBvciB7QGxpbmsgU0lMRU5DRX0gZnJvbSBpdCB0byByZWZ1c2UgaW5zdGVhZC5cblx0ICovXG5cdGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3QgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyxcblx0KTogdm9pZDtcblx0LyoqIFB1c2ggYW55IHJhdyBtZXNzYWdlLCBmb3Igd2hhdCBubyBleHBlY3RhdGlvbiBjYW4gc2NyaXB0LiAqL1xuXHRkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQ7XG5cdC8qKiBSZXNvbHZlIG9uY2UgZXZlcnl0aGluZyBxdWV1ZWQgc28gZmFyIGhhcyBiZWVuIGRlbGl2ZXJlZC4gKi9cblx0c2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogVGhyb3cgdW5sZXNzIGV2ZXJ5IGV4cGVjdGF0aW9uIHdhcyBtZXQgYW5kIG5vdGhpbmcgbGVha2VkLiAqL1xuXHRhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaGFybmVzcyB7QGxpbmsgY3JlYXRlQnJpZGdlSGFybmVzc30gcmV0dXJucyBmb3IgYSBzY2hlbWE6IHRoZSBzYW1lXG4gKiBoYXJuZXNzLCB3aXRoIGBleHBlY3RJbnZva2VgIGFuZCBgZXhwZWN0U3Vic2NyaWJlYCB0eXBlZCBieSB0aGUgc2NoZW1hJ3NcbiAqIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgIC0gYSBwYXlsb2FkIGlzIHRoZSBkZWNsYXJlZCByZXF1ZXN0LCBhIHJlcGx5IHRoZVxuICogZGVjbGFyZWQgcmVzdWx0IC0gYW5kIGJ5IHRoZSBjdXJhdGVkIGhvc3QgaWRzLCB3aG9zZSBzaGFwZXMgdGhlIGhvc3QgbW9kdWxlXG4gKiBvd25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYUJyaWRnZUhhcm5lc3M8TywgUz5cblx0ZXh0ZW5kcyBPbWl0PFxuXHRcdEJyaWRnZUhhcm5lc3M8RXh0cmFjdDxrZXlvZiBPIHwga2V5b2YgUywgc3RyaW5nPiB8IEhvc3RPcGVyYXRpb25JZD4sXG5cdFx0XCJleHBlY3RJbnZva2VcIiB8IFwiZXhwZWN0U3Vic2NyaWJlXCJcblx0PiB7XG5cdGV4cGVjdEludm9rZTxLIGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBPLCBzdHJpbmc+Pihcblx0XHRvcGVyYXRpb246IEssXG5cdFx0aGFuZGxlcjogKFxuXHRcdFx0cGF5bG9hZDogT1tLXSBleHRlbmRzIE9wZXJhdGlvblNoYXBlID8gT1tLXVtcInJlcXVlc3RcIl0gOiBuZXZlcixcblx0XHQpID0+IFNjcmlwdGVkUmVwbHk8T1tLXSBleHRlbmRzIE9wZXJhdGlvblNoYXBlID8gT1tLXVtcInJlc3VsdFwiXSA6IG5ldmVyPixcblx0KTogdm9pZDtcblx0ZXhwZWN0SW52b2tlPFxuXHRcdFJlcSBleHRlbmRzIG9iamVjdCA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHRSZXMgPSB1bmtub3duLFxuXHQ+KFxuXHRcdG9wZXJhdGlvbjogSG9zdE9wZXJhdGlvbklkLFxuXHRcdGhhbmRsZXI6IChwYXlsb2FkOiBSZXEpID0+IFNjcmlwdGVkUmVwbHk8UmVzPixcblx0KTogdm9pZDtcblx0ZXhwZWN0U3Vic2NyaWJlPEsgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIFMsIHN0cmluZz4+KFxuXHRcdG9wZXJhdGlvbjogSyxcblx0XHRzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxTW0tdIGV4dGVuZHMgU3RyZWFtU2hhcGUgPyBTW0tdW1wicmVxdWVzdFwiXSA6IG5ldmVyPixcblx0XHRvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyxcblx0KTogdm9pZDtcblx0ZXhwZWN0U3Vic2NyaWJlPFJlcSBleHRlbmRzIG9iamVjdCA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4oXG5cdFx0b3BlcmF0aW9uOiBIb3N0T3BlcmF0aW9uSWQsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyxcblx0KTogdm9pZDtcbn1cblxuY2xhc3MgSGFybmVzczxPcCBleHRlbmRzIHN0cmluZz4gaW1wbGVtZW50cyBCcmlkZ2VIYXJuZXNzPE9wPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgZ3JhbnRlZDogcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW107XG5cdHByaXZhdGUgcmVhZG9ubHkgdGhlbWU6IFFnaXNTZGtIb3N0VGhlbWUgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBCcmlkZ2VTY2hlbWEgfCBudWxsO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyU2V0ID0gbmV3IFNldDwobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZD4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBleHBlY3RhdGlvbnM6IEV4cGVjdGF0aW9uW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSByZWNvcmRlZDogUmVjb3JkZWRDYWxsW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSB1bmV4cGVjdGVkQ2FsbHM6IFJlY29yZGVkQ2FsbFtdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBPcGVuU3RyZWFtPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IG91dGJveDogdW5rbm93bltdID0gW107XG5cdHByaXZhdGUgZHJhaW5pbmc6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBzdHJlYW1Db3VudGVyID0gMDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSGFybmVzc09wdGlvbnMsIHBsdWdpbjogQnJpZGdlU2NoZW1hIHwgbnVsbCkge1xuXHRcdHRoaXMuZ3JhbnRlZCA9IE9iamVjdC5mcmVlemUoWy4uLihvcHRpb25zLmdyYW50ZWQgPz8gSE9TVF9PUEVSQVRJT05TKV0pO1xuXHRcdHRoaXMudGhlbWUgPSBvcHRpb25zLnRoZW1lO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0cHVibGljIGdldCBjYWxscygpOiByZWFkb25seSBSZWNvcmRlZENhbGxbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnJlY29yZGVkXTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgdW5leHBlY3RlZCgpOiByZWFkb25seSBSZWNvcmRlZENhbGxbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnVuZXhwZWN0ZWRDYWxsc107XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG9wZW5TdWJzY3JpcHRpb25zKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMuc3RyZWFtcy52YWx1ZXMoKV1cblx0XHRcdC5maWx0ZXIoKHN0cmVhbSkgPT4gc3RyZWFtLm9wZW4pXG5cdFx0XHQubWFwKChzdHJlYW0pID0+IHN0cmVhbS5pZCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGxpc3RlbmVycygpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmxpc3RlbmVyU2V0LnNpemU7XG5cdH1cblxuXHRwdWJsaWMgc3Vic2NyaWJlKGxpc3RlbmVyOiAobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuXHRcdHRoaXMubGlzdGVuZXJTZXQuYWRkKGxpc3RlbmVyKTtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dGhpcy5saXN0ZW5lclNldC5kZWxldGUobGlzdGVuZXIpO1xuXHRcdFx0aWYgKHRoaXMubGlzdGVuZXJTZXQuc2l6ZSA9PT0gMCkge1xuXHRcdFx0XHQvLyBUaGUgbGFzdCBjbGllbnQgZGV0YWNoZWQ6IHRoZSB2aWV3IGlzIGdvbmUsIGFuZCBhIGhvc3QgZGlzcG9zZXNcblx0XHRcdFx0Ly8gdGhlIHN1YnNjcmlwdGlvbnMgb2YgYSB2aWV3IGl0IGxvc3QgKGRlY2lzaW9uLTIzKSwgc28gdGhleSBhcmVcblx0XHRcdFx0Ly8gbm8gbG9uZ2VyIGxlYWtzLlxuXHRcdFx0XHRmb3IgKGNvbnN0IHN0cmVhbSBvZiB0aGlzLnN0cmVhbXMudmFsdWVzKCkpIHtcblx0XHRcdFx0XHRzdHJlYW0ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBzZW5kKG1lc3NhZ2U6IHVua25vd24pOiB2b2lkIHtcblx0XHRjb25zdCBlbnZlbG9wZSA9IHRoaXMucGFyc2VFbnZlbG9wZShtZXNzYWdlKTtcblx0XHRpZiAoZW52ZWxvcGUua2luZCA9PT0gXCJ1bnN1YnNjcmliZVwiKSB7XG5cdFx0XHR0aGlzLmNsb3NlRnJvbVBhZ2UoZW52ZWxvcGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZW52ZWxvcGUua2luZCA9PT0gXCJoYW5kc2hha2VcIikge1xuXHRcdFx0dGhpcy5hbnN3ZXJIYW5kc2hha2UoZW52ZWxvcGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBleHBlY3RhdGlvbiA9IHRoaXMudGFrZShlbnZlbG9wZS5raW5kLCBlbnZlbG9wZS5vcGVyYXRpb24pO1xuXHRcdGlmIChleHBlY3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnVuZXhwZWN0ZWRDYWxscy5wdXNoKGVudmVsb3BlKTtcblx0XHRcdHRoaXMuZGVsaXZlckZhaWx1cmUoXG5cdFx0XHRcdGVudmVsb3BlLmNhbGxJZCxcblx0XHRcdFx0XCJ1bmV4cGVjdGVkX2NhbGxcIixcblx0XHRcdFx0YG5vIGV4cGVjdGF0aW9uIGNvdmVycyAke2VudmVsb3BlLmtpbmR9ICR7SlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUub3BlcmF0aW9uKX1gLFxuXHRcdFx0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGV4cGVjdGF0aW9uLmtpbmQgPT09IFwiaW52b2tlXCIpIHtcblx0XHRcdHRoaXMuYW5zd2VySW52b2tlKGVudmVsb3BlLCBleHBlY3RhdGlvbik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuYW5zd2VyU3Vic2NyaWJlKGVudmVsb3BlLCBleHBlY3RhdGlvbik7XG5cdH1cblxuXHRwdWJsaWMgZXhwZWN0SW52b2tlPFJlcSBleHRlbmRzIG9iamVjdCwgUmVzPihcblx0XHRvcGVyYXRpb246IE9wLFxuXHRcdGhhbmRsZXI6IChwYXlsb2FkOiBSZXEpID0+IFNjcmlwdGVkUmVwbHk8UmVzPixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5leHBlY3RhdGlvbnMucHVzaCh7XG5cdFx0XHRraW5kOiBcImludm9rZVwiLFxuXHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0aGFuZGxlcjogaGFuZGxlciBhcyBJbnZva2VFeHBlY3RhdGlvbltcImhhbmRsZXJcIl0sXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgZXhwZWN0U3Vic2NyaWJlPFJlcSBleHRlbmRzIG9iamVjdD4oXG5cdFx0b3BlcmF0aW9uOiBPcCxcblx0XHRzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZXE+LFxuXHRcdG9wdGlvbnM6IFN1YnNjcmliZU9wdGlvbnMgPSB7fSxcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5leHBlY3RhdGlvbnMucHVzaCh7XG5cdFx0XHRraW5kOiBcInN1YnNjcmliZVwiLFxuXHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0c2NyaXB0OiBzY3JpcHQgYXMgU3Vic2NyaWJlRXhwZWN0YXRpb25bXCJzY3JpcHRcIl0sXG5cdFx0XHRvcHRpb25zLFxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGRlbGl2ZXIocmF3OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vdXRib3gucHVzaChyYXcpO1xuXHRcdHRoaXMuZHJhaW4oKTtcblx0fVxuXG5cdHB1YmxpYyBzZXR0bGVkKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmRyYWluaW5nID8/IFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0cHVibGljIGFzc2VydFNhdGlzZmllZCgpOiB2b2lkIHtcblx0XHRjb25zdCBwcm9ibGVtcyA9IFsuLi50aGlzLnByb2JsZW1zXTtcblx0XHRpZiAodGhpcy5leHBlY3RhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgdW5tZXQgPSB0aGlzLmV4cGVjdGF0aW9ucy5tYXAoXG5cdFx0XHRcdChleHBlY3RhdGlvbikgPT4gYCR7ZXhwZWN0YXRpb24ua2luZH0gJHtleHBlY3RhdGlvbi5vcGVyYXRpb259YCxcblx0XHRcdCk7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGB1bm1ldCBleHBlY3RhdGlvbnM6ICR7dW5tZXQuam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0XHRpZiAodGhpcy51bmV4cGVjdGVkQ2FsbHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgdW5leHBlY3RlZCA9IHRoaXMudW5leHBlY3RlZENhbGxzLm1hcChcblx0XHRcdFx0KGNhbGwpID0+IGAke2NhbGwua2luZH0gJHtjYWxsLm9wZXJhdGlvbn1gLFxuXHRcdFx0KTtcblx0XHRcdHByb2JsZW1zLnB1c2goYHVuZXhwZWN0ZWQgY2FsbHM6ICR7dW5leHBlY3RlZC5qb2luKFwiLCBcIil9YCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wZW4gPSB0aGlzLm9wZW5TdWJzY3JpcHRpb25zO1xuXHRcdGlmIChvcGVuLmxlbmd0aCA+IDApIHtcblx0XHRcdHByb2JsZW1zLnB1c2goYG9wZW4gc3Vic2NyaXB0aW9uczogJHtvcGVuLmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9XG5cdFx0aWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKHByb2JsZW1zLmpvaW4oXCI7IFwiKSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gLS0gYW5zd2VyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdC8qKlxuXHQgKiBBbnN3ZXIgdGhlIGhhbmRzaGFrZSB0aGUgd2F5IGBEaXNwYXRjaGVyYCBkb2VzOiB0aGUgcGx1Z2luIGRlc2NyaXB0aW9uXG5cdCAqIHRoZSBoYXJuZXNzIHdhcyBidWlsdCBmcm9tIChvciBub25lKSBhbmQgdGhlIGFkdmVydGlzZWQgb3BlcmF0aW9uIGlkcyAtXG5cdCAqIHRoZSBwbHVnaW4ncywgdGhlbiB0aGUgZ3JhbnRlZCBob3N0IGlkcy4gTm8gZXhwZWN0YXRpb24gaXMgY29uc3VtZWQ6IGFcblx0ICogaGFuZHNoYWtlIGlzIHRoZSBTREsncyBmaXJzdCBtZXNzYWdlLCBub3Qgc29tZXRoaW5nIGEgdGVzdCBzY3JpcHRzLlxuXHQgKi9cblx0cHJpdmF0ZSBhbnN3ZXJIYW5kc2hha2UoY2FsbDogUmVjb3JkZWRDYWxsKTogdm9pZCB7XG5cdFx0Y29uc3QgZGVjbGFyZWQgPSBbXG5cdFx0XHQuLi4odGhpcy5wbHVnaW4/LmFjdGlvbnMgPz8gW10pLm1hcCgoYWN0aW9uKSA9PiBhY3Rpb24uaWQpLFxuXHRcdFx0Li4uKHRoaXMucGx1Z2luPy5zdHJlYW1zID8/IFtdKS5tYXAoKHN0cmVhbSkgPT4gc3RyZWFtLmlkKSxcblx0XHRdO1xuXHRcdHRoaXMuZGVsaXZlcih7XG5cdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdG9rOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRnZW5lcmF0aW9uOiAwLFxuXHRcdFx0XHRwbHVnaW46IHRoaXMucGx1Z2luLFxuXHRcdFx0XHRob3N0X3NjaGVtYV92ZXJzaW9uOiBIT1NUX1NDSEVNQV9WRVJTSU9OLFxuXHRcdFx0XHRvcGVyYXRpb25zOiBbLi4uZGVjbGFyZWQsIC4uLnRoaXMuZ3JhbnRlZF0ubWFwKChpZCkgPT4gKHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHR0aXRsZTogaWQsXG5cdFx0XHRcdH0pKSxcblx0XHRcdFx0Li4uKHRoaXMudGhlbWUgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0aGVtZTogdGhpcy50aGVtZSB9KSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFuc3dlckludm9rZShcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0ZXhwZWN0YXRpb246IEludm9rZUV4cGVjdGF0aW9uLFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+XG5cdFx0XHRleHBlY3RhdGlvbi5oYW5kbGVyKGNhbGwucGF5bG9hZCA/PyB7fSksXG5cdFx0KS50aGVuKChyZXBseSkgPT4ge1xuXHRcdFx0aWYgKHJlcGx5ID09PSBTSUxFTkNFKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChpc0ZhdWx0KHJlcGx5KSkge1xuXHRcdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKGNhbGwuY2FsbElkLCByZXBseS5mYXVsdC5jb2RlLCByZXBseS5mYXVsdC5tZXNzYWdlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdHZhbHVlOiByZXBseSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhbnN3ZXJTdWJzY3JpYmUoXG5cdFx0Y2FsbDogUmVjb3JkZWRDYWxsLFxuXHRcdGV4cGVjdGF0aW9uOiBTdWJzY3JpYmVFeHBlY3RhdGlvbixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zdHJlYW1Db3VudGVyICs9IDE7XG5cdFx0Y29uc3Qgb3BlbjogT3BlblN0cmVhbSA9IHtcblx0XHRcdGlkOiBgcyR7dGhpcy5zdHJlYW1Db3VudGVyfWAsXG5cdFx0XHRvcGVyYXRpb246IGNhbGwub3BlcmF0aW9uLFxuXHRcdFx0c2VxOiAwLFxuXHRcdFx0b3BlbjogZmFsc2UsXG5cdFx0fTtcblx0XHQvLyBGcmFtZXMgdGhlIHNjcmlwdCBlbWl0cyBiZWZvcmUgdGhlIGFja25vd2xlZGdlbWVudCBpcyBkZWNpZGVkIGFyZSBoZWxkXG5cdFx0Ly8gYmFjazogYSByZWZ1c2VkIHN1YnNjcmlwdGlvbiBzZW5kcyBub25lLCBhbiBhY2NlcHRlZCBvbmUgc2VuZHMgdGhlbVxuXHRcdC8vIGFmdGVyIHRoZSBhY2tub3dsZWRnZW1lbnQsIHNvIHRoZSBrZXJuZWwgaGFzIHJlZ2lzdGVyZWQgdGhlXG5cdFx0Ly8gc3Vic2NyaXB0aW9uIGJ5IHRoZSB0aW1lIHRoZSBmaXJzdCBmcmFtZSByZWFjaGVzIGl0LlxuXHRcdGNvbnN0IGhlbGQ6IHVua25vd25bXSA9IFtdO1xuXHRcdGxldCBzaW5rID0gKGZyYW1lOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRoZWxkLnB1c2goZnJhbWUpO1xuXHRcdH07XG5cdFx0Y29uc3Qgc3RyZWFtID0gdGhpcy5zY3JpcHRlZChvcGVuLCAoZnJhbWUpID0+IHNpbmsoZnJhbWUpKTtcblx0XHRjb25zdCBhY2sgPSBleHBlY3RhdGlvbi5vcHRpb25zLmFjayA/PyAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHRcdGFjaygpXG5cdFx0XHQudGhlbigoKSA9PlxuXHRcdFx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+IHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBleHBlY3RhdGlvbi5zY3JpcHQoY2FsbC5wYXlsb2FkID8/IHt9LCBzdHJlYW0pO1xuXHRcdFx0XHR9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKChvdXRjb21lKSA9PiB7XG5cdFx0XHRcdGlmIChvdXRjb21lID09PSBTSUxFTkNFIHx8IGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRoZWxkLmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0aWYgKGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuZGVsaXZlckZhaWx1cmUoXG5cdFx0XHRcdFx0XHRcdGNhbGwuY2FsbElkLFxuXHRcdFx0XHRcdFx0XHRvdXRjb21lLmZhdWx0LmNvZGUsXG5cdFx0XHRcdFx0XHRcdG91dGNvbWUuZmF1bHQubWVzc2FnZSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5saXN0ZW5lclNldC5zaXplID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgZGV0YWNoZWQgd2hpbGUgdGhlIGhvc3Qgd2FzIGRlY2lkaW5nOiBub3RoaW5nIHRvXG5cdFx0XHRcdFx0Ly8gYWNrbm93bGVkZ2UgdG8sIG5vdGhpbmcgdG8ga2VlcCBvcGVuLlxuXHRcdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zdHJlYW1zLnNldChvcGVuLmlkLCBvcGVuKTtcblx0XHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0Y2FsbF9pZDogY2FsbC5jYWxsSWQsXG5cdFx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRcdGNhcGFjaXR5OiBTVUJTQ1JJUFRJT05fQ0FQQUNJVFksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNpbmsgPSAoZnJhbWUpID0+IHRoaXMuZGVsaXZlcihmcmFtZSk7XG5cdFx0XHRcdGZvciAoY29uc3QgZnJhbWUgb2YgaGVsZCkge1xuXHRcdFx0XHRcdHNpbmsoZnJhbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlSGFuZGxlcihcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0cnVuOiAoKSA9PiB1bmtub3duLFxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dW5rbm93bj4oKHJlc29sdmUpID0+IHtcblx0XHRcdHJlc29sdmUocnVuKCkpO1xuXHRcdH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdHRoaXMucHJvYmxlbXMucHVzaChcblx0XHRcdFx0YGhhbmRsZXIgZm9yICR7Y2FsbC5raW5kfSAke2NhbGwub3BlcmF0aW9ufSB0aHJldzogJHttZXNzYWdlfWAsXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZhdWx0KFwiaGFybmVzc19lcnJvclwiLCBtZXNzYWdlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2NyaXB0ZWQoXG5cdFx0b3BlbjogT3BlblN0cmVhbSxcblx0XHRzaW5rOiAoZnJhbWU6IHVua25vd24pID0+IHZvaWQsXG5cdCk6IFNjcmlwdGVkU3RyZWFtIHtcblx0XHRjb25zdCByZXF1aXJlT3BlbiA9ICh2ZXJiOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdGlmICghb3Blbi5vcGVuKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGBjYW5ub3QgJHt2ZXJifSBvbiBzdWJzY3JpcHRpb24gJHtvcGVuLmlkfTogaXQgaXMgbm90IG9wZW5gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBvcGVuLmlkLFxuXHRcdFx0b3BlcmF0aW9uOiBvcGVuLm9wZXJhdGlvbixcblx0XHRcdGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRyZXR1cm4gb3Blbi5vcGVuO1xuXHRcdFx0fSxcblx0XHRcdGVtaXQ6IChraW5kLCBwYXlsb2FkKSA9PiB7XG5cdFx0XHRcdHJlcXVpcmVPcGVuKFwiZW1pdFwiKTtcblx0XHRcdFx0c2luayh7XG5cdFx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRzZXE6IG9wZW4uc2VxLFxuXHRcdFx0XHRcdGV2ZW50OiB7IGtpbmQsIHBheWxvYWQgfSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9wZW4uc2VxICs9IDE7XG5cdFx0XHR9LFxuXHRcdFx0ZW5kOiAodGVybWluYWwpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJlbmRcIik7XG5cdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRzaW5rKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBvcGVuLmlkLFxuXHRcdFx0XHRcdHNlcTogb3Blbi5zZXEsXG5cdFx0XHRcdFx0dGVybWluYWwsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvcGVuLnNlcSArPSAxO1xuXHRcdFx0fSxcblx0XHRcdHNraXA6IChmcmFtZXMpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJza2lwXCIpO1xuXHRcdFx0XHRvcGVuLnNlcSArPSBmcmFtZXM7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGNsb3NlRnJvbVBhZ2UoY2FsbDogUmVjb3JkZWRDYWxsKTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BlbiA9XG5cdFx0XHRjYWxsLnN1YnNjcmlwdGlvbklkID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdFx0OiB0aGlzLnN0cmVhbXMuZ2V0KGNhbGwuc3Vic2NyaXB0aW9uSWQpO1xuXHRcdGNvbnN0IGRpc3Bvc2VkID0gb3Blbj8ub3BlbiA9PT0gdHJ1ZTtcblx0XHRpZiAob3BlbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0b2s6IHRydWUsXG5cdFx0XHR2YWx1ZTogeyBkaXNwb3NlZCB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxpdmVyRmFpbHVyZShjYWxsSWQ6IHN0cmluZywgY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0b2s6IGZhbHNlLFxuXHRcdFx0ZXJyb3I6IHsgY29kZSwgbWVzc2FnZSB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkcmFpbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5kcmFpbmluZyAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRyYWluaW5nID0gKGFzeW5jICgpID0+IHtcblx0XHRcdHdoaWxlICh0aGlzLm91dGJveC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5vdXRib3guc2hpZnQoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lclNldF0pIHtcblx0XHRcdFx0XHRsaXN0ZW5lcihtZXNzYWdlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kcmFpbmluZyA9IG51bGw7XG5cdFx0fSkoKTtcblx0fVxuXG5cdC8vIC0tIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHByaXZhdGUgdGFrZShcblx0XHRraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIixcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0KTogRXhwZWN0YXRpb24gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5leHBlY3RhdGlvbnMuZmluZEluZGV4KFxuXHRcdFx0KGV4cGVjdGF0aW9uKSA9PlxuXHRcdFx0XHRleHBlY3RhdGlvbi5raW5kID09PSBraW5kICYmIGV4cGVjdGF0aW9uLm9wZXJhdGlvbiA9PT0gb3BlcmF0aW9uLFxuXHRcdCk7XG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXhwZWN0YXRpb25zLnNwbGljZShpbmRleCwgMSlbMF07XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlRW52ZWxvcGUobWVzc2FnZTogdW5rbm93bik6IFJlY29yZGVkQ2FsbCB7XG5cdFx0aWYgKHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiIHx8IG1lc3NhZ2UgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IGEgbm9uLW9iamVjdFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmF3ID0gbWVzc2FnZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRpZiAocmF3LnByb3RvY29sICE9PSBQUk9UT0NPTCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGB0aGUgY2xpZW50IHNwZWFrcyBwcm90b2NvbCAke1N0cmluZyhyYXcucHJvdG9jb2wpfTsgdGhlIGhhcm5lc3MgZmFrZXMgJHtQUk9UT0NPTH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcuY2FsbF9pZCAhPT0gXCJzdHJpbmdcIiB8fCByYXcuY2FsbF9pZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IG5vIGNhbGxfaWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbGxJZCA9IHJhdy5jYWxsX2lkO1xuXHRcdGlmIChyYXcua2luZCA9PT0gXCJ1bnN1YnNjcmliZVwiKSB7XG5cdFx0XHRjb25zdCBzdWJzY3JpcHRpb25JZCA9IHJhdy5zdWJzY3JpcHRpb25faWQ7XG5cdFx0XHRpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGAke2NhbGxJZH06IHVuc3Vic2NyaWJlIG5hbWVzIG5vIHN1YnNjcmlwdGlvbl9pZGAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjYWxsOiBSZWNvcmRlZENhbGwgPSB7XG5cdFx0XHRcdGNhbGxJZCxcblx0XHRcdFx0a2luZDogXCJ1bnN1YnNjcmliZVwiLFxuXHRcdFx0XHRvcGVyYXRpb246IHRoaXMuc3RyZWFtcy5nZXQoc3Vic2NyaXB0aW9uSWQpPy5vcGVyYXRpb24gPz8gXCJcIixcblx0XHRcdFx0c3Vic2NyaXB0aW9uSWQsXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWNvcmRlZC5wdXNoKGNhbGwpO1xuXHRcdFx0cmV0dXJuIGNhbGw7XG5cdFx0fVxuXHRcdGlmIChyYXcua2luZCA9PT0gXCJoYW5kc2hha2VcIikge1xuXHRcdFx0Y29uc3QgY2FsbDogUmVjb3JkZWRDYWxsID0geyBjYWxsSWQsIGtpbmQ6IFwiaGFuZHNoYWtlXCIsIG9wZXJhdGlvbjogXCJcIiB9O1xuXHRcdFx0dGhpcy5yZWNvcmRlZC5wdXNoKGNhbGwpO1xuXHRcdFx0cmV0dXJuIGNhbGw7XG5cdFx0fVxuXHRcdGlmIChyYXcua2luZCAhPT0gXCJpbnZva2VcIiAmJiByYXcua2luZCAhPT0gXCJzdWJzY3JpYmVcIikge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGAke2NhbGxJZH06ICR7U3RyaW5nKHJhdy5raW5kKX0gaXMgbm90IGEgYnJpZGdlIGVudmVsb3BlIGtpbmRgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcub3BlcmF0aW9uICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0YCR7Y2FsbElkfTogb3BlcmF0aW9uIG11c3QgYmUgYSBzdHJpbmdgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y29uc3QgcGF5bG9hZCA9XG5cdFx0XHR0eXBlb2YgcmF3LnBheWxvYWQgPT09IFwib2JqZWN0XCIgJiYgcmF3LnBheWxvYWQgIT09IG51bGxcblx0XHRcdFx0PyAocmF3LnBheWxvYWQgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuXHRcdFx0XHQ6IHt9O1xuXHRcdGNvbnN0IGNhbGw6IFJlY29yZGVkQ2FsbCA9IHtcblx0XHRcdGNhbGxJZCxcblx0XHRcdGtpbmQ6IHJhdy5raW5kLFxuXHRcdFx0b3BlcmF0aW9uOiByYXcub3BlcmF0aW9uLFxuXHRcdFx0cGF5bG9hZCxcblx0XHR9O1xuXHRcdHRoaXMucmVjb3JkZWQucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gY2FsbDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGhhcm5lc3MuXG4gKlxuICogR2l2ZW4gdGhlIGdlbmVyYXRlZCBgYnJpZGdlLnNjaGVtYS50c2AgZGVmYXVsdCBleHBvcnQsIHRoZSBoYXJuZXNzIGlzIHR5cGVkXG4gKiBieSBpdDogYGV4cGVjdEludm9rZShcInNpdGVzLnN1bW1hcnlcIiwgKHBheWxvYWQpID0+IC4uLilgIHNlZXMgdGhlIGRlY2xhcmVkXG4gKiByZXF1ZXN0IGFuZCBtdXN0IGFuc3dlciB3aXRoIHRoZSBkZWNsYXJlZCByZXN1bHQsIGFuZCB0aGUgaGFuZHNoYWtlIGl0XG4gKiBhbnN3ZXJzIGFkdmVydGlzZXMgdGhlIHNjaGVtYSdzIG9wZXJhdGlvbnMuIFdpdGhvdXQgb25lLCBgT3BgIG5hcnJvd3MgdGhlXG4gKiBvcGVyYXRpb25zIGEgdGVzdCBtYXkgZXhwZWN0LCB0eXBpY2FsbHkgYSBnZW5lcmF0ZWQgYE9wZXJhdGlvbklkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJyaWRnZUhhcm5lc3M8T3AgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuXHRvcHRpb25zPzogSGFybmVzc09wdGlvbnMsXG4pOiBCcmlkZ2VIYXJuZXNzPE9wPjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcmlkZ2VIYXJuZXNzPE8sIFM+KFxuXHRzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPixcblx0b3B0aW9ucz86IEhhcm5lc3NPcHRpb25zLFxuKTogU2NoZW1hQnJpZGdlSGFybmVzczxPLCBTPjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcmlkZ2VIYXJuZXNzKFxuXHRmaXJzdDogSGFybmVzc09wdGlvbnMgfCBCcmlkZ2VTY2hlbWEgPSB7fSxcblx0c2Vjb25kOiBIYXJuZXNzT3B0aW9ucyA9IHt9LFxuKTogQnJpZGdlSGFybmVzcyB8IFNjaGVtYUJyaWRnZUhhcm5lc3M8dW5rbm93biwgdW5rbm93bj4ge1xuXHRpZiAoXCJzY2hlbWFfdmVyc2lvblwiIGluIGZpcnN0KSB7XG5cdFx0cmV0dXJuIG5ldyBIYXJuZXNzPHN0cmluZz4oc2Vjb25kLCBmaXJzdCkgYXMgU2NoZW1hQnJpZGdlSGFybmVzczxcblx0XHRcdHVua25vd24sXG5cdFx0XHR1bmtub3duXG5cdFx0Pjtcblx0fVxuXHRyZXR1cm4gbmV3IEhhcm5lc3M8c3RyaW5nPihmaXJzdCwgbnVsbCk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7QUFnQ0EsSUFBTSxXQUFXO0FBQ2pCLElBQU0sd0JBQXdCO0FBUXZCLFNBQVMsS0FBSyxDQUFDLE1BQWMsU0FBZ0M7QUFBQSxFQUNuRSxPQUFPLE9BQU8sT0FBTyxFQUFFLE9BQU8sT0FBTyxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQUE7QUFHakUsU0FBUyxPQUFPLENBQUMsT0FBd0M7QUFBQSxFQUN4RCxPQUNDLE9BQU8sVUFBVSxZQUNqQixVQUFVLFFBQ1YsV0FBVyxTQUNYLE9BQVEsTUFBd0IsVUFBVTtBQUFBO0FBS3JDLElBQU0sVUFBeUIsT0FBTywwQkFBMEI7QUFBQTtBQTJFaEUsTUFBTSxrQ0FBa0MsY0FBYTtBQUFBLEVBQ3BELFdBQVcsQ0FBQyxTQUFpQjtBQUFBLElBQ25DLE1BQU0sU0FBUyxlQUFlO0FBQUE7QUFFaEM7QUFBQTtBQThGQSxNQUFNLFFBQXdEO0FBQUEsRUFDNUM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsY0FBYyxJQUFJO0FBQUEsRUFDbEIsZUFBOEIsQ0FBQztBQUFBLEVBQy9CLFdBQTJCLENBQUM7QUFBQSxFQUM1QixrQkFBa0MsQ0FBQztBQUFBLEVBQ25DLFVBQVUsSUFBSTtBQUFBLEVBQ2QsV0FBcUIsQ0FBQztBQUFBLEVBQ3RCLFNBQW9CLENBQUM7QUFBQSxFQUM5QixXQUFpQztBQUFBLEVBQ2pDLGdCQUFnQjtB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LEdBQUcsV0FBVyxPQUFPLElBQUksSUFBSSxpQ0FDOUI7QUFBQSxJQUNEO0FBQUEsSUFDQSxJQUFJLE9BQU8sSUFBSSxjQUFjLFVBQVU7QUFBQSxNQUN0QyxNQUFNLElBQUksMEJBQ1QsR0FBRyxvQ0FDSjtBQUFBLElBQ0Q7QUFBQSxJQUNBLE1BQU0sVUFDTCxPQUFPLElBQUksWUFBWSxZQUFZLElBQUksWUFBWSxPQUMvQyxJQUFJLFVBQ0wsQ0FBQztBQUFBLElBQ0wsTUFBTSxPQUFxQjtBQUFBLE1BQzFCO0FBQUEsTUFDQSxNQUFNLElBQUk7QUFBQSxNQUNWLFdBQVcsSUFBSTtBQUFBLE1BQ2Y7QUFBQSxJQUNEO0FBQUEsSUFDQSxLQUFLLFNBQVMsS0FBSyxJQUFJO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBRVQ7QUFrQk8sU0FBUyxtQkFBbUIsQ0FDbEMsUUFBdUMsQ0FBQyxHQUN4QyxTQUF5QixDQUFDLEdBQzhCO0FBQUEsRUFDeEQsSUFBSSxvQkFBb0IsT0FBTztBQUFBLElBQzlCLE9BQU8sSUFBSSxRQUFnQixRQUFRLEtBQUs7QUFBQSxFQUl6QztBQUFBLEVBQ0EsT0FBTyxJQUFJLFFBQWdCLE9BQU8sSUFBSTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiOEMzQ0QxNkJCNDRCMUVDNDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/dist/vue.d.ts ADDED
@@ -0,0 +1,106 @@
1
+ import "./shared/chunk-wtv4vt4q.js";
2
+ import "./shared/chunk-7tgzmz0m.js";
3
+ import { OperationMap2, StreamMap2, QgisSdkCore2, QgisSdk2 } from "./shared/chunk-a33y575v.js";
4
+ import { Store2, OperationState2, Operation2, OperationStore2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2, StreamStore2, FormState2, FormOptions2, FormStore2, HostQueryState2, HostQueryStore2 } from "./shared/chunk-3zscfm3y.js";
5
+ import { QgisSdkError2 } from "./shared/chunk-pdj2fxjb.js";
6
+ import { InjectionKey, MaybeRefOrGetter, ShallowRef } from "vue";
7
+ /** A composable was used outside the shape it needs. */
8
+ declare class QgisSdkBridgeVueError extends QgisSdkError2 {
9
+ constructor(message: string);
10
+ }
11
+ /** The injection key `provideQgisSdk` writes and `useQgisSdk` reads. */
12
+ declare const QGIS_SDK_KEY: InjectionKey<QgisSdkCore2<unknown, unknown>>;
13
+ /**
14
+ * Share a `QgisSdk` with the component subtree; call in `setup()`.
15
+ *
16
+ * The SDK is shared as given, whatever its schema, and never closed here:
17
+ * the page that built it closes it.
18
+ */
19
+ declare function provideQgisSdk(qgis: QgisSdkCore2<unknown, unknown>): void;
20
+ /**
21
+ * The `QgisSdk` the nearest `provideQgisSdk` shared.
22
+ *
23
+ * The type parameters name the generated `Operations` and `Streams`; they are
24
+ * the caller's claim, the same way the provider's argument was the page's.
25
+ */
26
+ declare function useQgisSdk<
27
+ O = OperationMap2,
28
+ S = StreamMap2
29
+ >(): QgisSdk2<O, S>;
30
+ /**
31
+ * Follow any store as a shallow ref; the subscription ends with the scope.
32
+ */
33
+ declare function useStore<T>(store: Store2<T>): Readonly<ShallowRef<T>>;
34
+ /** What {@link useOperation} returns. */
35
+ interface UseOperation<
36
+ I,
37
+ R
38
+ > {
39
+ readonly state: Readonly<ShallowRef<OperationState2<R>>>;
40
+ /** Resolves with the value, or `undefined` when the state carries why not. */
41
+ run(input: I): Promise<R | undefined>;
42
+ /** Abort the in-flight call locally; the host may still run it. */
43
+ abort(): void;
44
+ /** Back to `idle`, aborting anything in flight. */
45
+ reset(): void;
46
+ readonly store: OperationStore2<I, R>;
47
+ }
48
+ /**
49
+ * Run a generated operation from a component; disposing the scope aborts
50
+ * whatever is in flight.
51
+ */
52
+ declare function useOperation<
53
+ I,
54
+ R
55
+ >(operation: Operation2<I, R>): UseOperation<I, R>;
56
+ /** A value, a ref or a getter: what `useStream` accepts as its input. */
57
+ type StreamInput<I> = MaybeRefOrGetter<I | null>;
58
+ /**
59
+ * Hold a generated stream open while the scope lives.
60
+ *
61
+ * `input` may be a value, a ref or a getter; the subscription follows its
62
+ * *content* - a new object with the same fields reopens nothing, a different
63
+ * one closes and reopens, `null` closes. Disposing the scope closes the
64
+ * stream, even before the host acknowledged it.
65
+ */
66
+ declare function useStream<
67
+ I,
68
+ E
69
+ >(open: Stream2<I, E>, input: StreamInput<I>, handlers?: StreamHandlersLike2<E>): Readonly<ShallowRef<StreamState2<E>>> & {
70
+ readonly store: StreamStore2<I, E>;
71
+ };
72
+ type RequestOf<
73
+ O,
74
+ K extends keyof O
75
+ > = O[K] extends {
76
+ readonly request: infer Req;
77
+ } ? Req : never;
78
+ type ResultOf<
79
+ O,
80
+ K extends keyof O
81
+ > = O[K] extends {
82
+ readonly result: infer Res;
83
+ } ? Res : never;
84
+ /**
85
+ * The form of one declared action: `qgis.<id>` with its fields, values,
86
+ * issues and submission; disposing the scope aborts a submission in flight.
87
+ */
88
+ declare function useForm<
89
+ O,
90
+ K extends keyof O & string
91
+ >(qgis: QgisSdkCore2<O, unknown>, id: K, options?: FormOptions2): {
92
+ readonly state: Readonly<ShallowRef<FormState2<ResultOf<O, K>>>>;
93
+ readonly form: FormStore2<RequestOf<O, K> & object, ResultOf<O, K>>;
94
+ };
95
+ /**
96
+ * Follow a host query store: `useHostQuery(layersQuery(qgis))` for a layer
97
+ * picker. `refresh` runs at once unless `auto` is `false`; disposing the
98
+ * scope aborts a load in flight.
99
+ */
100
+ declare function useHostQuery<T>(store: HostQueryStore2<T>, options?: {
101
+ readonly auto?: boolean;
102
+ }): {
103
+ readonly state: Readonly<ShallowRef<HostQueryState2<T>>>;
104
+ readonly query: HostQueryStore2<T>;
105
+ };
106
+ export { Operation2 as Operation, OperationState2 as OperationState, QGIS_SDK_KEY, QgisSdkBridgeVueError, Stream2 as Stream, StreamHandleLike2 as StreamHandleLike, StreamHandlersLike2 as StreamHandlersLike, StreamInput, StreamState2 as StreamState, StreamTerminalLike2 as StreamTerminalLike, UseOperation, provideQgisSdk, useForm, useHostQuery, useOperation, useQgisSdk, useStore, useStream };
package/dist/vue.js ADDED
@@ -0,0 +1,91 @@
1
+ import"./shared/chunk-8gawbn19.js";
2
+ import {
3
+ OperationStore2,
4
+ StreamStore2,
5
+ FormStore2
6
+ } from "./shared/chunk-t1vpt5yq.js";
7
+ import {
8
+ QgisSdkError2
9
+ } from "./shared/chunk-2hwva3a3.js";
10
+
11
+ // src/vue.ts
12
+ import {
13
+ inject,
14
+ onScopeDispose,
15
+ provide,
16
+ shallowRef,
17
+ toValue,
18
+ watch
19
+ } from "vue";
20
+ class QgisSdkBridgeVueError extends QgisSdkError2 {
21
+ constructor(message) {
22
+ super(message, "vue_binding");
23
+ }
24
+ }
25
+ var QGIS_SDK_KEY = Symbol("qgis-sdk");
26
+ function provideQgisSdk(qgis) {
27
+ provide(QGIS_SDK_KEY, qgis);
28
+ }
29
+ function useQgisSdk() {
30
+ const qgis = inject(QGIS_SDK_KEY, null) ?? null;
31
+ if (qgis === null) {
32
+ throw new QgisSdkBridgeVueError("useQgisSdk needs provideQgisSdk in an ancestor's setup()");
33
+ }
34
+ return qgis;
35
+ }
36
+ function useStore(store) {
37
+ const state = shallowRef(store.getSnapshot());
38
+ const stop = store.subscribe((snapshot) => {
39
+ state.value = snapshot;
40
+ });
41
+ onScopeDispose(stop);
42
+ return state;
43
+ }
44
+ function useOperation(operation) {
45
+ const store = new OperationStore2(operation);
46
+ onScopeDispose(store.abort);
47
+ return {
48
+ state: useStore(store),
49
+ run: store.run,
50
+ abort: store.abort,
51
+ reset: store.reset,
52
+ store
53
+ };
54
+ }
55
+ function useStream(open, input, handlers = {}) {
56
+ const store = new StreamStore2(open, handlers);
57
+ const state = useStore(store);
58
+ watch(() => toValue(input), (value) => store.setInput(value), {
59
+ immediate: true,
60
+ deep: true
61
+ });
62
+ onScopeDispose(store.close);
63
+ return Object.assign(state, { store });
64
+ }
65
+ function useForm(qgis, id, options) {
66
+ const form = new FormStore2(qgis, id, options);
67
+ onScopeDispose(() => form.dispose());
68
+ return { state: useStore(form), form };
69
+ }
70
+ function useHostQuery(store, options = {}) {
71
+ const state = useStore(store);
72
+ if (options.auto !== false) {
73
+ store.refresh();
74
+ }
75
+ onScopeDispose(store.abort);
76
+ return { state, query: store };
77
+ }
78
+ export {
79
+ QGIS_SDK_KEY,
80
+ QgisSdkBridgeVueError,
81
+ provideQgisSdk,
82
+ useForm,
83
+ useHostQuery,
84
+ useOperation,
85
+ useQgisSdk,
86
+ useStore,
87
+ useStream
88
+ };
89
+
90
+ //# debugId=A81518D4B333BE6C64756E2164756E21
91
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Z1ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKipcbiAqIFRoaW4gVnVlIDMgYmluZGluZ3Mgb3ZlciB0aGUgc3RvcmUgY29yZSAoZGVjaXNpb24tNDcpLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGltcG9ydHMgVnVlLiBJdCBhZGRzXG4gKiBubyBiZWhhdmlvdXI6IGV2ZXJ5IGNvbXBvc2FibGUgd3JhcHMgb25lIHN0b3JlIGZyb20gYC4vc3RvcmVzYCBpbiBhXG4gKiBgc2hhbGxvd1JlZmAgdGhhdCBmb2xsb3dzIHRoZSBzdG9yZSdzIHNuYXBzaG90cyBhbmQgc3RvcHMgZm9sbG93aW5nIHdoZW5cbiAqIHRoZSBlZmZlY3Qgc2NvcGUgdGhhdCBjcmVhdGVkIGl0IGlzIGRpc3Bvc2VkLiBUaGUgY29tcG9zYWJsZXMgdGFrZSB0aGVcbiAqIG1ldGhvZHMgYSBgUWdpc1Nka2AgYWxyZWFkeSBoYXMgLSBgcWdpcy5zaXRlcy5zdW1tYXJ5YCwgYHFnaXMuc2l0ZXMud2F0Y2hgXG4gKiAtIHNvIHRoZSB0eXBlZCBjb250cmFjdCBpcyB0aGUgZ2VuZXJhdGVkIG9uZSwgbm90IGEgVnVlIGNvcHkgb2YgaXQuXG4gKlxuICogYHByb3ZpZGVRZ2lzU2RrKHFnaXMpYCBpbiBgc2V0dXAoKWAgb2YgYW4gYW5jZXN0b3Igc2hhcmVzIG9uZSBgUWdpc1Nka2BcbiAqIHdpdGggYSBzdWJ0cmVlOyBgdXNlUWdpc1NkaygpYCBoYW5kcyBpdCBiYWNrIHVuZGVyIHRoZSBwYWdlJ3MgdHlwZXMuIFRoZVxuICogcHJvdmlkZXIgbmV2ZXIgY2xvc2VzIHdoYXQgaXQgd2FzIGdpdmVuLlxuICovXG5cbmltcG9ydCB7XG5cdHR5cGUgSW5qZWN0aW9uS2V5LFxuXHRpbmplY3QsXG5cdHR5cGUgTWF5YmVSZWZPckdldHRlcixcblx0b25TY29wZURpc3Bvc2UsXG5cdHByb3ZpZGUsXG5cdHR5cGUgU2hhbGxvd1JlZixcblx0c2hhbGxvd1JlZixcblx0dG9WYWx1ZSxcblx0d2F0Y2gsXG59IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBRZ2lzU2RrLCBRZ2lzU2RrQ29yZSB9IGZyb20gXCIuL3FnaXMtc2RrXCI7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvbk1hcCwgU3RyZWFtTWFwIH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5pbXBvcnQge1xuXHR0eXBlIEZvcm1PcHRpb25zLFxuXHR0eXBlIEZvcm1TdGF0ZSxcblx0Rm9ybVN0b3JlLFxuXHR0eXBlIEhvc3RRdWVyeVN0YXRlLFxuXHR0eXBlIEhvc3RRdWVyeVN0b3JlLFxuXHR0eXBlIE9wZXJhdGlvbixcblx0dHlwZSBPcGVyYXRpb25TdGF0ZSxcblx0T3BlcmF0aW9uU3RvcmUsXG5cdHR5cGUgU3RvcmUsXG5cdHR5cGUgU3RyZWFtLFxuXHR0eXBlIFN0cmVhbUhhbmRsZXJzTGlrZSxcblx0dHlwZSBTdHJlYW1TdGF0ZSxcblx0U3RyZWFtU3RvcmUsXG59IGZyb20gXCIuL3N0b3Jlc1wiO1xuXG5leHBvcnQgdHlwZSB7XG5cdE9wZXJhdGlvbixcblx0T3BlcmF0aW9uU3RhdGUsXG5cdFN0cmVhbSxcblx0U3RyZWFtSGFuZGxlTGlrZSxcblx0U3RyZWFtSGFuZGxlcnNMaWtlLFxuXHRTdHJlYW1TdGF0ZSxcblx0U3RyZWFtVGVybWluYWxMaWtlLFxufSBmcm9tIFwiLi9zdG9yZXNcIjtcblxuLyoqIEEgY29tcG9zYWJsZSB3YXMgdXNlZCBvdXRzaWRlIHRoZSBzaGFwZSBpdCBuZWVkcy4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlVnVlRXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJ2dWVfYmluZGluZ1wiKTtcblx0fVxufVxuXG4vKiogVGhlIGluamVjdGlvbiBrZXkgYHByb3ZpZGVRZ2lzU2RrYCB3cml0ZXMgYW5kIGB1c2VRZ2lzU2RrYCByZWFkcy4gKi9cbmV4cG9ydCBjb25zdCBRR0lTX1NES19LRVk6IEluamVjdGlvbktleTxRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPj4gPVxuXHRTeW1ib2woXCJxZ2lzLXNka1wiKTtcblxuLyoqXG4gKiBTaGFyZSBhIGBRZ2lzU2RrYCB3aXRoIHRoZSBjb21wb25lbnQgc3VidHJlZTsgY2FsbCBpbiBgc2V0dXAoKWAuXG4gKlxuICogVGhlIFNESyBpcyBzaGFyZWQgYXMgZ2l2ZW4sIHdoYXRldmVyIGl0cyBzY2hlbWEsIGFuZCBuZXZlciBjbG9zZWQgaGVyZTpcbiAqIHRoZSBwYWdlIHRoYXQgYnVpbHQgaXQgY2xvc2VzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVFnaXNTZGsocWdpczogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj4pOiB2b2lkIHtcblx0cHJvdmlkZShRR0lTX1NES19LRVksIHFnaXMpO1xufVxuXG4vKipcbiAqIFRoZSBgUWdpc1Nka2AgdGhlIG5lYXJlc3QgYHByb3ZpZGVRZ2lzU2RrYCBzaGFyZWQuXG4gKlxuICogVGhlIHR5cGUgcGFyYW1ldGVycyBuYW1lIHRoZSBnZW5lcmF0ZWQgYE9wZXJhdGlvbnNgIGFuZCBgU3RyZWFtc2A7IHRoZXkgYXJlXG4gKiB0aGUgY2FsbGVyJ3MgY2xhaW0sIHRoZSBzYW1lIHdheSB0aGUgcHJvdmlkZXIncyBhcmd1bWVudCB3YXMgdGhlIHBhZ2Uncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVFnaXNTZGs8TyA9IE9wZXJhdGlvbk1hcCwgUyA9IFN0cmVhbU1hcD4oKTogUWdpc1NkazxPLCBTPiB7XG5cdC8vIE91dHNpZGUgYHNldHVwKClgIFZ1ZSB3YXJucyBhbmQgcmV0dXJucyB1bmRlZmluZWQ7IGluc2lkZSwgdGhlIGRlZmF1bHQuXG5cdGNvbnN0IHFnaXMgPSBpbmplY3QoUUdJU19TREtfS0VZLCBudWxsKSA/PyBudWxsO1xuXHRpZiAocWdpcyA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlVnVlRXJyb3IoXG5cdFx0XHRcInVzZVFnaXNTZGsgbmVlZHMgcHJvdmlkZVFnaXNTZGsgaW4gYW4gYW5jZXN0b3IncyBzZXR1cCgpXCIsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gcWdpcyBhcyB1bmtub3duIGFzIFFnaXNTZGs8TywgUz47XG59XG5cbi8qKlxuICogRm9sbG93IGFueSBzdG9yZSBhcyBhIHNoYWxsb3cgcmVmOyB0aGUgc3Vic2NyaXB0aW9uIGVuZHMgd2l0aCB0aGUgc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdG9yZTxUPihzdG9yZTogU3RvcmU8VD4pOiBSZWFkb25seTxTaGFsbG93UmVmPFQ+PiB7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihzdG9yZS5nZXRTbmFwc2hvdCgpKTtcblx0Y29uc3Qgc3RvcCA9IHN0b3JlLnN1YnNjcmliZSgoc25hcHNob3QpID0+IHtcblx0XHRzdGF0ZS52YWx1ZSA9IHNuYXBzaG90O1xuXHR9KTtcblx0b25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLyoqIFdoYXQge0BsaW5rIHVzZU9wZXJhdGlvbn0gcmV0dXJucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlT3BlcmF0aW9uPEksIFI+IHtcblx0cmVhZG9ubHkgc3RhdGU6IFJlYWRvbmx5PFNoYWxsb3dSZWY8T3BlcmF0aW9uU3RhdGU8Uj4+Pjtcblx0LyoqIFJlc29sdmVzIHdpdGggdGhlIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGF0ZSBjYXJyaWVzIHdoeSBub3QuICovXG5cdHJ1bihpbnB1dDogSSk6IFByb21pc2U8UiB8IHVuZGVmaW5lZD47XG5cdC8qKiBBYm9ydCB0aGUgaW4tZmxpZ2h0IGNhbGwgbG9jYWxseTsgdGhlIGhvc3QgbWF5IHN0aWxsIHJ1biBpdC4gKi9cblx0YWJvcnQoKTogdm9pZDtcblx0LyoqIEJhY2sgdG8gYGlkbGVgLCBhYm9ydGluZyBhbnl0aGluZyBpbiBmbGlnaHQuICovXG5cdHJlc2V0KCk6IHZvaWQ7XG5cdHJlYWRvbmx5IHN0b3JlOiBPcGVyYXRpb25TdG9yZTxJLCBSPjtcbn1cblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQ7IGRpc3Bvc2luZyB0aGUgc2NvcGUgYWJvcnRzXG4gKiB3aGF0ZXZlciBpcyBpbiBmbGlnaHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VPcGVyYXRpb248SSwgUj4oXG5cdG9wZXJhdGlvbjogT3BlcmF0aW9uPEksIFI+LFxuKTogVXNlT3BlcmF0aW9uPEksIFI+IHtcblx0Y29uc3Qgc3RvcmUgPSBuZXcgT3BlcmF0aW9uU3RvcmUob3BlcmF0aW9uKTtcblx0b25TY29wZURpc3Bvc2Uoc3RvcmUuYWJvcnQpO1xuXHRyZXR1cm4ge1xuXHRcdHN0YXRlOiB1c2VTdG9yZShzdG9yZSksXG5cdFx0cnVuOiBzdG9yZS5ydW4sXG5cdFx0YWJvcnQ6IHN0b3JlLmFib3J0LFxuXHRcdHJlc2V0OiBzdG9yZS5yZXNldCxcblx0XHRzdG9yZSxcblx0fTtcbn1cblxuLyoqIEEgdmFsdWUsIGEgcmVmIG9yIGEgZ2V0dGVyOiB3aGF0IGB1c2VTdHJlYW1gIGFjY2VwdHMgYXMgaXRzIGlucHV0LiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtSW5wdXQ8ST4gPSBNYXliZVJlZk9yR2V0dGVyPEkgfCBudWxsPjtcblxuLyoqXG4gKiBIb2xkIGEgZ2VuZXJhdGVkIHN0cmVhbSBvcGVuIHdoaWxlIHRoZSBzY29wZSBsaXZlcy5cbiAqXG4gKiBgaW5wdXRgIG1heSBiZSBhIHZhbHVlLCBhIHJlZiBvciBhIGdldHRlcjsgdGhlIHN1YnNjcmlwdGlvbiBmb2xsb3dzIGl0c1xuICogKmNvbnRlbnQqIC0gYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgZmllbGRzIHJlb3BlbnMgbm90aGluZywgYSBkaWZmZXJlbnRcbiAqIG9uZSBjbG9zZXMgYW5kIHJlb3BlbnMsIGBudWxsYCBjbG9zZXMuIERpc3Bvc2luZyB0aGUgc2NvcGUgY2xvc2VzIHRoZVxuICogc3RyZWFtLCBldmVuIGJlZm9yZSB0aGUgaG9zdCBhY2tub3dsZWRnZWQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdHJlYW08SSwgRT4oXG5cdG9wZW46IFN0cmVhbTxJLCBFPixcblx0aW5wdXQ6IFN0cmVhbUlucHV0PEk+LFxuXHRoYW5kbGVyczogU3RyZWFtSGFuZGxlcnNMaWtlPEU+ID0ge30sXG4pOiBSZWFkb25seTxTaGFsbG93UmVmPFN0cmVhbVN0YXRlPEU+Pj4gJiB7XG5cdHJlYWRvbmx5IHN0b3JlOiBTdHJlYW1TdG9yZTxJLCBFPjtcbn0ge1xuXHRjb25zdCBzdG9yZSA9IG5ldyBTdHJlYW1TdG9yZShvcGVuLCBoYW5kbGVycyk7XG5cdGNvbnN0IHN0YXRlID0gdXNlU3RvcmUoc3RvcmUpO1xuXHR3YXRjaChcblx0XHQoKSA9PiB0b1ZhbHVlKGlucHV0KSxcblx0XHQodmFsdWUpID0+IHN0b3JlLnNldElucHV0KHZhbHVlKSxcblx0XHR7XG5cdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRkZWVwOiB0cnVlLFxuXHRcdH0sXG5cdCk7XG5cdG9uU2NvcGVEaXNwb3NlKHN0b3JlLmNsb3NlKTtcblx0cmV0dXJuIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc3RvcmUgfSk7XG59XG5cbnR5cGUgUmVxdWVzdE9mPE8sIEsgZXh0ZW5kcyBrZXlvZiBPPiA9IE9bS10gZXh0ZW5kcyB7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IGluZmVyIFJlcTtcbn1cblx0PyBSZXFcblx0OiBuZXZlcjtcbnR5cGUgUmVzdWx0T2Y8TywgSyBleHRlbmRzIGtleW9mIE8+ID0gT1tLXSBleHRlbmRzIHtcblx0cmVhZG9ubHkgcmVzdWx0OiBpbmZlciBSZXM7XG59XG5cdD8gUmVzXG5cdDogbmV2ZXI7XG5cbi8qKlxuICogVGhlIGZvcm0gb2Ygb25lIGRlY2xhcmVkIGFjdGlvbjogYHFnaXMuPGlkPmAgd2l0aCBpdHMgZmllbGRzLCB2YWx1ZXMsXG4gKiBpc3N1ZXMgYW5kIHN1Ym1pc3Npb247IGRpc3Bvc2luZyB0aGUgc2NvcGUgYWJvcnRzIGEgc3VibWlzc2lvbiBpbiBmbGlnaHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JtPE8sIEsgZXh0ZW5kcyBrZXlvZiBPICYgc3RyaW5nPihcblx0cWdpczogUWdpc1Nka0NvcmU8TywgdW5rbm93bj4sXG5cdGlkOiBLLFxuXHRvcHRpb25zPzogRm9ybU9wdGlvbnMsXG4pOiB7XG5cdHJlYWRvbmx5IHN0YXRlOiBSZWFkb25seTxTaGFsbG93UmVmPEZvcm1TdGF0ZTxSZXN1bHRPZjxPLCBLPj4+Pjtcblx0cmVhZG9ubHkgZm9ybTogRm9ybVN0b3JlPFJlcXVlc3RPZjxPLCBLPiAmIG9iamVjdCwgUmVzdWx0T2Y8TywgSz4+O1xufSB7XG5cdGNvbnN0IGZvcm0gPSBuZXcgRm9ybVN0b3JlPFJlcXVlc3RPZjxPLCBLPiAmIG9iamVjdCwgUmVzdWx0T2Y8TywgSz4+KFxuXHRcdHFnaXMgYXMgUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj4sXG5cdFx0aWQsXG5cdFx0b3B0aW9ucyxcblx0KTtcblx0b25TY29wZURpc3Bvc2UoKCkgPT4gZm9ybS5kaXNwb3NlKCkpO1xuXHRyZXR1cm4geyBzdGF0ZTogdXNlU3RvcmUoZm9ybSksIGZvcm0gfTtcbn1cblxuLyoqXG4gKiBGb2xsb3cgYSBob3N0IHF1ZXJ5IHN0b3JlOiBgdXNlSG9zdFF1ZXJ5KGxheWVyc1F1ZXJ5KHFnaXMpKWAgZm9yIGEgbGF5ZXJcbiAqIHBpY2tlci4gYHJlZnJlc2hgIHJ1bnMgYXQgb25jZSB1bmxlc3MgYGF1dG9gIGlzIGBmYWxzZWA7IGRpc3Bvc2luZyB0aGVcbiAqIHNjb3BlIGFib3J0cyBhIGxvYWQgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9zdFF1ZXJ5PFQ+KFxuXHRzdG9yZTogSG9zdFF1ZXJ5U3RvcmU8VD4sXG5cdG9wdGlvbnM6IHsgcmVhZG9ubHkgYXV0bz86IGJvb2xlYW4gfSA9IHt9LFxuKToge1xuXHRyZWFkb25seSBzdGF0ZTogUmVhZG9ubHk8U2hhbGxvd1JlZjxIb3N0UXVlcnlTdGF0ZTxUPj4+O1xuXHRyZWFkb25seSBxdWVyeTogSG9zdFF1ZXJ5U3RvcmU8VD47XG59IHtcblx0Y29uc3Qgc3RhdGUgPSB1c2VTdG9yZShzdG9yZSk7XG5cdGlmIChvcHRpb25zLmF1dG8gIT09IGZhbHNlKSB7XG5cdFx0dm9pZCBzdG9yZS5yZWZyZXNoKCk7XG5cdH1cblx0b25TY29wZURpc3Bvc2Uoc3RvcmUuYWJvcnQpO1xuXHRyZXR1cm4geyBzdGF0ZSwgcXVlcnk6IHN0b3JlIH07XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7OztBQWVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5Q08sTUFBTSw4QkFBOEIsY0FBYTtBQUFBLEVBQ2hELFdBQVcsQ0FBQyxTQUFpQjtBQUFBLElBQ25DLE1BQU0sU0FBUyxhQUFhO0FBQUE7QUFFOUI7QUFHTyxJQUFNLGVBQ1osT0FBTyxVQUFVO0FBUVgsU0FBUyxjQUFjLENBQUMsTUFBMkM7QUFBQSxFQUN6RSxRQUFRLGNBQWMsSUFBSTtBQUFBO0FBU3BCLFNBQVMsVUFBMkMsR0FBa0I7QUFBQSxFQUU1RSxNQUFNLE9BQU8sT0FBTyxjQUFjLElBQUksS0FBSztBQUFBLEVBQzNDLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDbEIsTUFBTSxJQUFJLHNCQUNULDBEQUNEO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBTUQsU0FBUyxRQUFXLENBQUMsT0FBMEM7QUFBQSxFQUNyRSxNQUFNLFFBQVEsV0FBVyxNQUFNLFlBQVksQ0FBQztBQUFBLEVBQzVDLE1BQU0sT0FBTyxNQUFNLFVBQVUsQ0FBQyxhQUFhO0FBQUEsSUFDMUMsTUFBTSxRQUFRO0FBQUEsR0FDZDtBQUFBLEVBQ0QsZUFBZSxJQUFJO0FBQUEsRUFDbkIsT0FBTztBQUFBO0FBbUJELFNBQVMsWUFBa0IsQ0FDakMsV0FDcUI7QUFBQSxFQUNyQixNQUFNLFFBQVEsSUFBSSxnQkFBZSxTQUFTO0FBQUEsRUFDMUMsZUFBZSxNQUFNLEtBQUs7QUFBQSxFQUMxQixPQUFPO0FBQUEsSUFDTixPQUFPLFNBQVMsS0FBSztBQUFBLElBQ3JCLEtBQUssTUFBTTtBQUFBLElBQ1gsT0FBTyxNQUFNO0FBQUEsSUFDYixPQUFPLE1BQU07QUFBQSxJQUNiO0FBQUEsRUFDRDtBQUFBO0FBY00sU0FBUyxTQUFlLENBQzlCLE1BQ0EsT0FDQSxXQUFrQyxDQUFDLEdBR2xDO0FBQUEsRUFDRCxNQUFNLFFBQVEsSUFBSSxhQUFZLE1BQU0sUUFBUTtBQUFBLEVBQzVDLE1BQU0sUUFBUSxTQUFTLEtBQUs7QUFBQSxFQUM1QixNQUNDLE1BQU0sUUFBUSxLQUFLLEdBQ25CLENBQUMsVUFBVSxNQUFNLFNBQVMsS0FBSyxHQUMvQjtBQUFBLElBQ0MsV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLEVBQ1AsQ0FDRDtBQUFBLEVBQ0EsZUFBZSxNQUFNLEtBQUs7QUFBQSxFQUMxQixPQUFPLE9BQU8sT0FBTyxPQUFPLEVBQUUsTUFBTSxDQUFDO0FBQUE7QUFrQi9CLFNBQVMsT0FBc0MsQ0FDckQsTUFDQSxJQUNBLFNBSUM7QUFBQSxFQUNELE1BQU0sT0FBTyxJQUFJLFdBQ2hCLE1BQ0EsSUFDQSxPQUNEO0FBQUEsRUFDQSxlQUFlLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFBQSxFQUNuQyxPQUFPLEVBQUUsT0FBTyxTQUFTLElBQUksR0FBRyxLQUFLO0FBQUE7QUFRL0IsU0FBUyxZQUFlLENBQzlCLE9BQ0EsVUFBdUMsQ0FBQyxHQUl2QztBQUFBLEVBQ0QsTUFBTSxRQUFRLFNBQVMsS0FBSztBQUFBLEVBQzVCLElBQUksUUFBUSxTQUFTLE9BQU87QUFBQSxJQUN0QixNQUFNLFFBQVE7QUFBQSxFQUNwQjtBQUFBLEVBQ0EsZUFBZSxNQUFNLEtBQUs7QUFBQSxFQUMxQixPQUFPLEVBQUUsT0FBTyxPQUFPLE1BQU07QUFBQTsiLAogICJkZWJ1Z0lkIjogIkE4MTUxOEQ0QjMzM0JFNkM2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@archont561/qgis-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "TypeScript bridge contracts and error primitives for QGIS SDK WebEngine plugin interfaces.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,6 +27,16 @@
27
27
  "import": "./dist/react.js",
28
28
  "default": "./dist/react.js"
29
29
  },
30
+ "./vue": {
31
+ "types": "./dist/vue.d.ts",
32
+ "import": "./dist/vue.js",
33
+ "default": "./dist/vue.js"
34
+ },
35
+ "./svelte": {
36
+ "types": "./dist/svelte.d.ts",
37
+ "import": "./dist/svelte.js",
38
+ "default": "./dist/svelte.js"
39
+ },
30
40
  "./testing": {
31
41
  "types": "./dist/testing.d.ts",
32
42
  "import": "./dist/testing.js",
@@ -47,18 +57,26 @@
47
57
  "access": "public"
48
58
  },
49
59
  "scripts": {
50
- "build": "bunup",
60
+ "build": "bunup && bun tests/consumer/isolation.ts && tsc -p tsconfig.dist.json",
51
61
  "test": "bun test",
52
62
  "coverage": "bun --cwd=../.. --config=bunfig.toml test --coverage packages/qgis-sdk-typescript/tests",
53
63
  "typecheck": "tsc --noEmit",
54
64
  "generate:contract-types": "json2ts -i 'tests/contracts/generated/schemas/*.json' -o tests/contracts/generated/types/ && json2ts -i 'tests/contracts/pydantic/generated/schemas/*.json' -o tests/contracts/pydantic/generated/types/"
55
65
  },
56
66
  "peerDependencies": {
57
- "react": ">=18"
67
+ "react": ">=18",
68
+ "svelte": ">=5",
69
+ "vue": ">=3.4"
58
70
  },
59
71
  "peerDependenciesMeta": {
60
72
  "react": {
61
73
  "optional": true
74
+ },
75
+ "svelte": {
76
+ "optional": true
77
+ },
78
+ "vue": {
79
+ "optional": true
62
80
  }
63
81
  }
64
82
  }