@workflow/core 5.0.0-beta.37 → 5.0.0-beta.39

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 (84) hide show
  1. package/dist/capabilities.d.ts +5 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +20 -2
  4. package/dist/context-violation-error.d.ts.map +1 -1
  5. package/dist/context-violation-error.js +4 -2
  6. package/dist/private.d.ts +21 -5
  7. package/dist/private.d.ts.map +1 -1
  8. package/dist/private.js +67 -7
  9. package/dist/replay-payload-cache.d.ts +11 -0
  10. package/dist/replay-payload-cache.d.ts.map +1 -1
  11. package/dist/replay-payload-cache.js +21 -4
  12. package/dist/runtime/compute-instance.d.ts +12 -0
  13. package/dist/runtime/compute-instance.d.ts.map +1 -0
  14. package/dist/runtime/compute-instance.js +13 -0
  15. package/dist/runtime/constants.d.ts +18 -0
  16. package/dist/runtime/constants.d.ts.map +1 -1
  17. package/dist/runtime/constants.js +42 -1
  18. package/dist/runtime/helpers.d.ts +103 -31
  19. package/dist/runtime/helpers.d.ts.map +1 -1
  20. package/dist/runtime/helpers.js +138 -61
  21. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  22. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  23. package/dist/runtime/replay-recovery-reporter.js +64 -0
  24. package/dist/runtime/resume-hook.d.ts +22 -2
  25. package/dist/runtime/resume-hook.d.ts.map +1 -1
  26. package/dist/runtime/resume-hook.js +281 -47
  27. package/dist/runtime/start.d.ts.map +1 -1
  28. package/dist/runtime/start.js +50 -3
  29. package/dist/runtime/step-executor.d.ts +17 -13
  30. package/dist/runtime/step-executor.d.ts.map +1 -1
  31. package/dist/runtime/step-executor.js +36 -24
  32. package/dist/runtime/suspension-handler.d.ts +13 -8
  33. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  34. package/dist/runtime/suspension-handler.js +60 -18
  35. package/dist/runtime/world.d.ts +10 -5
  36. package/dist/runtime/world.d.ts.map +1 -1
  37. package/dist/runtime/world.js +128 -21
  38. package/dist/runtime.d.ts +1 -1
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +622 -67
  41. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  42. package/dist/serialization/codec-devalue.js +9 -2
  43. package/dist/serialization/codec.d.ts +17 -0
  44. package/dist/serialization/codec.d.ts.map +1 -1
  45. package/dist/serialization/codec.js +1 -1
  46. package/dist/serialization/hardened.d.ts +155 -0
  47. package/dist/serialization/hardened.d.ts.map +1 -0
  48. package/dist/serialization/hardened.js +523 -0
  49. package/dist/serialization/index.d.ts +2 -1
  50. package/dist/serialization/index.d.ts.map +1 -1
  51. package/dist/serialization/index.js +1 -1
  52. package/dist/serialization/reducers/class.d.ts.map +1 -1
  53. package/dist/serialization/reducers/class.js +11 -6
  54. package/dist/serialization/reducers/common.d.ts +1 -1
  55. package/dist/serialization/reducers/common.d.ts.map +1 -1
  56. package/dist/serialization/reducers/common.js +100 -61
  57. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  58. package/dist/serialization/reducers/step-function.js +25 -9
  59. package/dist/serialization.d.ts +13 -9
  60. package/dist/serialization.d.ts.map +1 -1
  61. package/dist/serialization.js +150 -49
  62. package/dist/set-attributes.d.ts.map +1 -1
  63. package/dist/set-attributes.js +5 -1
  64. package/dist/step/context-storage.d.ts +1 -1
  65. package/dist/step/context-storage.d.ts.map +1 -1
  66. package/dist/step/context-storage.js +6 -4
  67. package/dist/step/writable-stream.d.ts.map +1 -1
  68. package/dist/step/writable-stream.js +3 -2
  69. package/dist/step.d.ts.map +1 -1
  70. package/dist/step.js +9 -2
  71. package/dist/telemetry/semantic-conventions.d.ts +43 -2
  72. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  73. package/dist/telemetry/semantic-conventions.js +32 -1
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.js +2 -2
  76. package/dist/workflow/hook.d.ts.map +1 -1
  77. package/dist/workflow/hook.js +38 -1
  78. package/dist/workflow.d.ts +1 -1
  79. package/dist/workflow.d.ts.map +1 -1
  80. package/dist/workflow.js +6 -2
  81. package/package.json +7 -12
  82. package/dist/runtime/world-target.d.ts +0 -11
  83. package/dist/runtime/world-target.d.ts.map +0 -1
  84. package/dist/runtime/world-target.js +0 -15
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import { types } from 'node:util';
12
12
  import { FatalError, HookConflictError, RetryableError, RuntimeDecryptionError, } from '@workflow/errors';
13
+ import { arrayBufferByteLength, dateGetDate, dateGetTime, dateToISOString, hasProperty, headersToEntries, isInstanceOfPrototype, mapToEntries, readProperty, recordGuestCode, regExpFlags, regExpSource, setToValues, urlHref, urlSearchParamsToString, viewInfo, } from '../hardened.js';
13
14
  // ---- Base64 helpers ----
14
15
  function arrayBufferToBase64(value, offset, length) {
15
16
  // Avoid returning falsy value for zero-length buffers
@@ -20,7 +21,12 @@ function arrayBufferToBase64(value, offset, length) {
20
21
  return Buffer.from(uint8).toString('base64');
21
22
  }
22
23
  function viewToBase64(value) {
23
- return arrayBufferToBase64(value.buffer, value.byteOffset, value.byteLength);
24
+ // Read the view's range through internal-slot getters (see hardened.ts):
25
+ // own properties shadowing `buffer`/`byteOffset`/`byteLength` — or patched
26
+ // prototype getters in the sandbox realm — cannot change which bytes are
27
+ // serialized.
28
+ const info = viewInfo(value);
29
+ return arrayBufferToBase64(info.buffer, info.byteOffset, info.byteLength);
24
30
  }
25
31
  function reviveArrayBuffer(value, global) {
26
32
  const base64 = value === '.' ? '' : value;
@@ -50,12 +56,15 @@ function revive(str) {
50
56
  function reduceErrorBase(value) {
51
57
  if (!types.isNativeError(value))
52
58
  return false;
59
+ // `message`/`stack`/`cause` are own data properties on natural errors, so
60
+ // the descriptor-based reads cost nothing; a sandbox-defined accessor
61
+ // (e.g. a getter on an Error subclass) is still invoked but recorded.
53
62
  const reduced = {
54
- message: value.message,
55
- stack: value.stack,
63
+ message: readProperty(value, 'message'),
64
+ stack: readProperty(value, 'stack'),
56
65
  };
57
- if ('cause' in value)
58
- reduced.cause = value.cause;
66
+ if (hasProperty(value, 'cause'))
67
+ reduced.cause = readProperty(value, 'cause');
59
68
  return reduced;
60
69
  }
61
70
  /**
@@ -79,7 +88,7 @@ function reduceErrorBase(value) {
79
88
  function reduceNamedErrorSubclassBase(subclassName, value) {
80
89
  if (!types.isNativeError(value))
81
90
  return false;
82
- if (value.name !== subclassName)
91
+ if (readProperty(value, 'name') !== subclassName)
83
92
  return false;
84
93
  return reduceErrorBase(value);
85
94
  }
@@ -115,18 +124,30 @@ function makeErrorSubclassReviver(global, ctorName) {
115
124
  };
116
125
  }
117
126
  // ---- Reducers ----
118
- export function getCommonReducers(global = globalThis) {
127
+ export function getCommonReducers(
128
+ // The `global` parameter is retained for API compatibility, but the
129
+ // reducers no longer perform `instanceof global.X` checks: classification
130
+ // is done with engine-level brand checks (realm-agnostic, immune to
131
+ // reassigned sandbox globals and `Symbol.hasInstance`), and extraction
132
+ // goes through intrinsics captured at host boot. See ../hardened.ts.
133
+ _global = globalThis) {
119
134
  return {
120
- ArrayBuffer: (value) => value instanceof global.ArrayBuffer &&
121
- arrayBufferToBase64(value, 0, value.byteLength),
122
- BigInt: (value) => typeof value === 'bigint' && value.toString(),
123
- BigInt64Array: (value) => value instanceof global.BigInt64Array && viewToBase64(value),
124
- BigUint64Array: (value) => value instanceof global.BigUint64Array && viewToBase64(value),
135
+ ArrayBuffer: (value) => types.isArrayBuffer(value) &&
136
+ arrayBufferToBase64(value, 0, arrayBufferByteLength(value)),
137
+ BigInt: (value) =>
138
+ // String(bigint) is a spec-internal numeric conversion — unlike
139
+ // `value.toString()`, it never consults BigInt.prototype.
140
+ typeof value === 'bigint' && String(value),
141
+ BigInt64Array: (value) => types.isBigInt64Array(value) && viewToBase64(value),
142
+ BigUint64Array: (value) => types.isBigUint64Array(value) && viewToBase64(value),
125
143
  Date: (value) => {
126
- if (!(value instanceof global.Date))
144
+ // Brand check + captured intrinsics: a sandbox-side patch of
145
+ // `Date.prototype.toISOString` (e.g. a Temporal polyfill wrapping it)
146
+ // is never executed, and cannot perturb VM state during serialization.
147
+ if (!types.isDate(value))
127
148
  return false;
128
- const valid = !Number.isNaN(value.getDate());
129
- return valid ? value.toISOString() : '.';
149
+ const valid = !Number.isNaN(dateGetDate(value));
150
+ return valid ? dateToISOString(value) : '.';
130
151
  },
131
152
  // DOMException is a special case: it `instanceof Error` is true in Node,
132
153
  // but `types.isNativeError()` returns FALSE for it, so the generic Error
@@ -137,17 +158,17 @@ export function getCommonReducers(global = globalThis) {
137
158
  DOMException: (value) => {
138
159
  if (value === null || typeof value !== 'object')
139
160
  return false;
140
- if (value.constructor?.name !==
141
- 'DOMException')
161
+ const ctor = readProperty(value, 'constructor');
162
+ if (!ctor || readProperty(ctor, 'name') !== 'DOMException')
142
163
  return false;
143
- const e = value;
144
164
  const reduced = {
145
- message: e.message,
146
- name: e.name,
147
- stack: e.stack,
165
+ message: readProperty(value, 'message'),
166
+ name: readProperty(value, 'name'),
167
+ stack: readProperty(value, 'stack'),
148
168
  };
149
- if ('cause' in e)
150
- reduced.cause = e.cause;
169
+ if (hasProperty(value, 'cause')) {
170
+ reduced.cause = readProperty(value, 'cause');
171
+ }
151
172
  return reduced;
152
173
  },
153
174
  // Error subclass reducers are intentionally placed before the base Error
@@ -161,13 +182,13 @@ export function getCommonReducers(global = globalThis) {
161
182
  const base = reduceNamedErrorSubclassBase('HookConflictError', value);
162
183
  if (!base)
163
184
  return false;
164
- const error = value;
165
185
  const reduced = {
166
186
  ...base,
167
- token: error.token,
187
+ token: readProperty(value, 'token'),
168
188
  };
169
- if (error.conflictingRunId !== undefined) {
170
- reduced.conflictingRunId = error.conflictingRunId;
189
+ const conflictingRunId = readProperty(value, 'conflictingRunId');
190
+ if (conflictingRunId !== undefined) {
191
+ reduced.conflictingRunId = conflictingRunId;
171
192
  }
172
193
  return reduced;
173
194
  },
@@ -181,14 +202,25 @@ export function getCommonReducers(global = globalThis) {
181
202
  const base = reduceNamedErrorSubclassBase('RetryableError', value);
182
203
  if (!base)
183
204
  return false;
184
- const retryAfterRaw = value.retryAfter;
205
+ const retryAfterRaw = readProperty(value, 'retryAfter');
185
206
  let retryAfter;
186
- if (retryAfterRaw &&
187
- typeof retryAfterRaw === 'object' &&
188
- typeof retryAfterRaw.getTime === 'function') {
189
- const t = retryAfterRaw.getTime();
207
+ if (types.isDate(retryAfterRaw)) {
208
+ // Genuine Date (any realm): read the epoch through the intrinsic.
209
+ const t = dateGetTime(retryAfterRaw);
190
210
  retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
191
211
  }
212
+ else if (retryAfterRaw && typeof retryAfterRaw === 'object') {
213
+ // Duck-typed date-like: invoking its getTime() runs workflow code.
214
+ const getTime = readProperty(retryAfterRaw, 'getTime');
215
+ if (typeof getTime === 'function') {
216
+ recordGuestCode('method', 'getTime');
217
+ const t = getTime.call(retryAfterRaw);
218
+ retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
219
+ }
220
+ else {
221
+ retryAfter = Date.now() + 1000;
222
+ }
223
+ }
192
224
  else if (typeof retryAfterRaw === 'string' ||
193
225
  typeof retryAfterRaw === 'number') {
194
226
  const t = new Date(retryAfterRaw).getTime();
@@ -212,7 +244,7 @@ export function getCommonReducers(global = globalThis) {
212
244
  const reduced = {
213
245
  ...base,
214
246
  };
215
- const context = value.context;
247
+ const context = readProperty(value, 'context');
216
248
  if (context !== undefined) {
217
249
  reduced.context = context;
218
250
  }
@@ -229,7 +261,7 @@ export function getCommonReducers(global = globalThis) {
229
261
  return false;
230
262
  return {
231
263
  ...base,
232
- errors: value.errors,
264
+ errors: readProperty(value, 'errors'),
233
265
  };
234
266
  },
235
267
  // Base Error reducer — catch-all for any Error instance not matched by a
@@ -240,31 +272,38 @@ export function getCommonReducers(global = globalThis) {
240
272
  if (!types.isNativeError(value))
241
273
  return false;
242
274
  const reduced = {
243
- name: value.name,
244
- message: value.message,
245
- stack: value.stack,
275
+ name: readProperty(value, 'name'),
276
+ message: readProperty(value, 'message'),
277
+ stack: readProperty(value, 'stack'),
246
278
  };
247
- if ('cause' in value)
248
- reduced.cause = value.cause;
279
+ if (hasProperty(value, 'cause')) {
280
+ reduced.cause = readProperty(value, 'cause');
281
+ }
249
282
  return reduced;
250
283
  },
251
- Float32Array: (value) => value instanceof global.Float32Array && viewToBase64(value),
252
- Float64Array: (value) => value instanceof global.Float64Array && viewToBase64(value),
253
- Headers: (value) => value instanceof global.Headers && Array.from(value),
254
- Int8Array: (value) => value instanceof global.Int8Array && viewToBase64(value),
255
- Int16Array: (value) => value instanceof global.Int16Array && viewToBase64(value),
256
- Int32Array: (value) => value instanceof global.Int32Array && viewToBase64(value),
257
- Map: (value) => value instanceof global.Map && Array.from(value),
258
- RegExp: (value) => value instanceof global.RegExp && {
259
- source: value.source,
260
- flags: value.flags,
284
+ Float32Array: (value) => types.isFloat32Array(value) && viewToBase64(value),
285
+ Float64Array: (value) => types.isFloat64Array(value) && viewToBase64(value),
286
+ // Headers is a host class injected into the sandbox, so its (shared)
287
+ // prototype is reachable from workflow code — iterate through the
288
+ // boot-captured iterator instead of a live Symbol.iterator lookup.
289
+ Headers: (value) => isInstanceOfPrototype(value, Headers.prototype) &&
290
+ headersToEntries(value),
291
+ Int8Array: (value) => types.isInt8Array(value) && viewToBase64(value),
292
+ Int16Array: (value) => types.isInt16Array(value) && viewToBase64(value),
293
+ Int32Array: (value) => types.isInt32Array(value) && viewToBase64(value),
294
+ // Engine brand check + host-realm iteration: a patched
295
+ // `Map.prototype[Symbol.iterator]` in the sandbox is never consulted.
296
+ Map: (value) => types.isMap(value) && mapToEntries(value),
297
+ RegExp: (value) => types.isRegExp(value) && {
298
+ source: regExpSource(value),
299
+ flags: regExpFlags(value),
261
300
  },
262
301
  // Request and Response are intentionally NOT in common reducers.
263
302
  // They require mode-specific revivers (stream handling, etc.) and
264
303
  // including them here without matching revivers would cause them
265
304
  // to deserialize as plain objects.
266
- Set: (value) => value instanceof global.Set && Array.from(value),
267
- URL: (value) => value instanceof global.URL && value.href,
305
+ Set: (value) => types.isSet(value) && setToValues(value),
306
+ URL: (value) => isInstanceOfPrototype(value, URL.prototype) && urlHref(value),
268
307
  WorkflowFunction: (value) => {
269
308
  // Only match function references with a workflowId property (set by
270
309
  // the SWC compiler on workflow functions). Plain { workflowId } objects
@@ -272,22 +311,22 @@ export function getCommonReducers(global = globalThis) {
272
311
  // form { workflowId } is a plain object, not a function.
273
312
  if (typeof value !== 'function')
274
313
  return false;
275
- const workflowId = value.workflowId;
314
+ const workflowId = readProperty(value, 'workflowId');
276
315
  if (typeof workflowId !== 'string')
277
316
  return false;
278
317
  return { workflowId };
279
318
  },
280
319
  URLSearchParams: (value) => {
281
- if (!(value instanceof global.URLSearchParams))
320
+ if (!isInstanceOfPrototype(value, URLSearchParams.prototype)) {
282
321
  return false;
283
- if (value.size === 0)
284
- return '.';
285
- return String(value);
322
+ }
323
+ const text = urlSearchParamsToString(value);
324
+ return text === '' ? '.' : text;
286
325
  },
287
- Uint8Array: (value) => value instanceof global.Uint8Array && viewToBase64(value),
288
- Uint8ClampedArray: (value) => value instanceof global.Uint8ClampedArray && viewToBase64(value),
289
- Uint16Array: (value) => value instanceof global.Uint16Array && viewToBase64(value),
290
- Uint32Array: (value) => value instanceof global.Uint32Array && viewToBase64(value),
326
+ Uint8Array: (value) => types.isUint8Array(value) && viewToBase64(value),
327
+ Uint8ClampedArray: (value) => types.isUint8ClampedArray(value) && viewToBase64(value),
328
+ Uint16Array: (value) => types.isUint16Array(value) && viewToBase64(value),
329
+ Uint32Array: (value) => types.isUint32Array(value) && viewToBase64(value),
291
330
  };
292
331
  }
293
332
  // ---- Revivers ----
@@ -414,4 +453,4 @@ export function getCommonRevivers(global = globalThis) {
414
453
  }
415
454
  // Re-export for use in legacy compat
416
455
  export { revive };
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHNCQUFzQixHQUN2QixNQUFNLGtCQUFrQixDQUFDO0FBRzFCLDJCQUEyQjtBQUUzQixTQUFTLG1CQUFtQixDQUMxQixLQUFzQixFQUN0QixNQUFjLEVBQ2QsTUFBYztJQUVkLHNEQUFzRDtJQUN0RCxJQUFJLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDN0IsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBc0I7SUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixLQUFhLEVBQ2IsTUFBMkI7SUFFM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QixPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBVztJQUN6QixpRUFBaUU7SUFDakUsaUVBQWlFO0lBQ2pFLGtFQUFrRTtJQUNsRSxzRUFBc0U7SUFDdEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUE4QkQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBcUI7UUFDaEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztLQUNuQixDQUFDO0lBQ0YsSUFBSSxPQUFPLElBQUksS0FBSztRQUFFLE9BQU8sQ0FBQyxLQUFLLEdBQUksS0FBNEIsQ0FBQyxLQUFLLENBQUM7SUFDMUUsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsNEJBQTRCLENBQ25DLFlBQW9CLEVBQ3BCLEtBQWM7SUFFZCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlDLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsd0JBQXdCLENBQy9CLFlBQWU7SUFFZixPQUFPLENBQUMsS0FBYyxFQUFrQyxFQUFFO1FBQ3hELE1BQU0sSUFBSSxHQUFHLDRCQUE0QixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE9BQU8sSUFBOEIsQ0FBQztJQUN4QyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixNQUEyQixFQUMzQixRQUFnQjtJQUVoQixPQUFPLENBQUMsS0FBNkIsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEtBQXlCLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDakQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQscUJBQXFCO0FBRXJCLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsU0FBOEIsVUFBVTtJQUV4QyxPQUFPO1FBQ0wsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDckIsS0FBSyxZQUFZLE1BQU0sQ0FBQyxXQUFXO1lBQ25DLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNqRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ2hFLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3ZCLEtBQUssWUFBWSxNQUFNLENBQUMsYUFBYSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDOUQsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEIsS0FBSyxZQUFZLE1BQU0sQ0FBQyxjQUFjLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMvRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2xELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM3QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0MsQ0FBQztRQUNELHlFQUF5RTtRQUN6RSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsNENBQTRDO1FBQzVDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzlELElBQ0csS0FBNkMsQ0FBQyxXQUFXLEVBQUUsSUFBSTtnQkFDaEUsY0FBYztnQkFFZCxPQUFPLEtBQUssQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLEtBQW9DLENBQUM7WUFDL0MsTUFBTSxPQUFPLEdBQXdDO2dCQUNuRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87Z0JBQ2xCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7YUFDZixDQUFDO1lBQ0YsSUFBSSxPQUFPLElBQUksQ0FBQztnQkFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDMUMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELHlFQUF5RTtRQUN6RSw0RUFBNEU7UUFDNUUsOEVBQThFO1FBQzlFLDhEQUE4RDtRQUM5RCw2REFBNkQ7UUFDN0QsU0FBUyxFQUFFLHdCQUF3QixDQUFDLFdBQVcsQ0FBQztRQUNoRCxVQUFVLEVBQUUsd0JBQXdCLENBQUMsWUFBWSxDQUFDO1FBQ2xELGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEdBQUcsNEJBQTRCLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEIsTUFBTSxLQUFLLEdBQUcsS0FBMEIsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBNkM7Z0JBQ3hELEdBQUcsSUFBSTtnQkFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7YUFDbkIsQ0FBQztZQUNGLElBQUksS0FBSyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1lBQ3BELENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsVUFBVSxFQUFFLHdCQUF3QixDQUFDLFlBQVksQ0FBQztRQUNsRCxjQUFjLEVBQUUsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUM7UUFDMUQseUVBQXlFO1FBQ3pFLDZFQUE2RTtRQUM3RSxvRUFBb0U7UUFDcEUsK0JBQStCO1FBQy9CLGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLDRCQUE0QixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hCLE1BQU0sYUFBYSxHQUFJLEtBQXdCLENBQUMsVUFBcUIsQ0FBQztZQUN0RSxJQUFJLFVBQWtCLENBQUM7WUFDdkIsSUFDRSxhQUFhO2dCQUNiLE9BQU8sYUFBYSxLQUFLLFFBQVE7Z0JBQ2pDLE9BQVEsYUFBdUMsQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUN0RSxDQUFDO2dCQUNELE1BQU0sQ0FBQyxHQUFJLGFBQXNCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxJQUNMLE9BQU8sYUFBYSxLQUFLLFFBQVE7Z0JBQ2pDLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFDakMsQ0FBQztnQkFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDNUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDakMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsR0FBRyxJQUFJO2dCQUNQLFVBQVU7YUFDcUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FDdkMsd0JBQXdCLEVBQ3hCLEtBQUssQ0FDTixDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQWtEO2dCQUM3RCxHQUFHLElBQUk7YUFDUixDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUksS0FBZ0MsQ0FBQyxPQUFPLENBQUM7WUFDMUQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQzVCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsV0FBVyxFQUFFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQztRQUNwRCxTQUFTLEVBQUUsd0JBQXdCLENBQUMsV0FBVyxDQUFDO1FBQ2hELFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxVQUFVLENBQUM7UUFDOUMsdUVBQXVFO1FBQ3ZFLDJEQUEyRDtRQUMzRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixNQUFNLElBQUksR0FBRyw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxNQUFNLEVBQUcsS0FBd0IsQ0FBQyxNQUFNO2FBQ08sQ0FBQztRQUNwRCxDQUFDO1FBQ0QseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsdURBQXVEO1FBQ3ZELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFpQztnQkFDNUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSzthQUNuQixDQUFDO1lBQ0YsSUFBSSxPQUFPLElBQUksS0FBSztnQkFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3RCLEtBQUssWUFBWSxNQUFNLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDN0QsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDdEIsS0FBSyxZQUFZLE1BQU0sQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQztRQUM3RCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3hFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ25CLEtBQUssWUFBWSxNQUFNLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDMUQsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDcEIsS0FBSyxZQUFZLE1BQU0sQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzRCxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNwQixLQUFLLFlBQVksTUFBTSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzNELEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDaEUsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEIsS0FBSyxZQUFZLE1BQU0sQ0FBQyxNQUFNLElBQUk7WUFDaEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztTQUNuQjtRQUNILGlFQUFpRTtRQUNqRSxrRUFBa0U7UUFDbEUsaUVBQWlFO1FBQ2pFLG1DQUFtQztRQUNuQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2hFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUk7UUFDekQsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQixvRUFBb0U7WUFDcEUsd0VBQXdFO1lBQ3hFLHVFQUF1RTtZQUN2RSx5REFBeUQ7WUFDekQsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzlDLE1BQU0sVUFBVSxHQUFJLEtBQWEsQ0FBQyxVQUFVLENBQUM7WUFDN0MsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxlQUFlLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxHQUFHLENBQUM7WUFDakMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3BCLEtBQUssWUFBWSxNQUFNLENBQUMsVUFBVSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDM0QsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMzQixLQUFLLFlBQVksTUFBTSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDbEUsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDckIsS0FBSyxZQUFZLE1BQU0sQ0FBQyxXQUFXLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQztRQUM1RCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNyQixLQUFLLFlBQVksTUFBTSxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDO0tBQzdELENBQUM7QUFDSixDQUFDO0FBRUQscUJBQXFCO0FBRXJCLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsU0FBOEIsVUFBVTtJQUV4QyxPQUFPO1FBQ0wsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDL0MsYUFBYSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDL0IsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RCxjQUFjLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNoQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdELElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELCtEQUErRDtZQUMvRCwwREFBMEQ7WUFDMUQsSUFBSSxPQUFPLElBQUksS0FBSztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDaEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLDZEQUE2RDtRQUM3RCxTQUFTLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUN4RCwwRUFBMEU7UUFDMUUsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsa0VBQWtFO1FBQ2xFLHdEQUF3RDtRQUN4RCx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLHlCQUF5QjtRQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwQixNQUFNLElBQUksR0FDTixNQUFrQyxDQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQ1QsSUFBSSxVQUFVLENBQUM7WUFDcEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxJQUFJLE9BQU8sSUFBSSxLQUFLO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNoRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxpQkFBaUIsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNCLE1BQU0sSUFBSSxHQUNOLE1BQWtDLENBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FDVCxJQUFJLGlCQUFpQixDQUFDO1lBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELElBQUksT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNwQixLQUFxQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzdELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxVQUFVLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQztRQUMxRCxjQUFjLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDO1FBQ2xFLGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLGtFQUFrRTtZQUNsRSxnRUFBZ0U7WUFDaEUsc0VBQXNFO1lBQ3RFLGdFQUFnRTtZQUNoRSw0Q0FBNEM7WUFDNUMsTUFBTSxJQUFJLEdBQ04sTUFBa0MsQ0FDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUNULElBQUksY0FBYyxDQUFDO1lBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BDLFVBQVUsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUM5QyxDQUFDLENBQUM7WUFDSCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsSUFBSSxPQUFPLElBQUksS0FBSztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDaEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0Qsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQyxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLE1BQU0sSUFBSSxHQUNOLE1BQWtDLENBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FDVDtnQkFDL0Msc0JBQXNCLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQTRELEVBQUUsQ0FBQztZQUN6RSxJQUFJLE9BQU8sSUFBSSxLQUFLO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMvQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsV0FBVyxFQUFFLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7UUFDNUQsU0FBUyxFQUFFLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDeEQsUUFBUSxFQUFFLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7UUFDdEQsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUNyQyxLQUFLLENBQUMsTUFBTSxFQUNaLEtBQUssQ0FBQyxPQUFPLEVBQ2IsSUFBSSxDQUNMLENBQUM7WUFDRixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLDBFQUEwRTtRQUMxRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsWUFBWSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDOUIsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxZQUFZLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM5QixJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUM3QyxTQUFTLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUMzQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELFVBQVUsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzVCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekQsVUFBVSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDNUIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDckMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQy9ELEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNyQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDckMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtZQUNILE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLENBQzVFLENBQUM7UUFDSixDQUFDLEVBQ0QsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUNqQztRQUNILGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3pCLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RCxVQUFVLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM1QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELGlCQUFpQixFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDbkMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLFdBQVcsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzdCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUQsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMzRCxDQUFDO0FBQ0osQ0FBQztBQUVELHFDQUFxQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1vbiByZWR1Y2VycyBhbmQgcmV2aXZlcnMgZm9yIHR5cGVzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gbW9kZXMuXG4gKlxuICogSGFuZGxlczogQXJyYXlCdWZmZXIsIEJpZ0ludCwgdHlwZWQgYXJyYXlzLCBEYXRlLCBFcnJvciwgSGVhZGVycywgTWFwLCBTZXQsXG4gKiBSZWdFeHAsIFJlcXVlc3QsIFJlc3BvbnNlLCBVUkwsIFVSTFNlYXJjaFBhcmFtcy5cbiAqXG4gKiBOb3RlOiBVc2VzIE5vZGUuanMgQnVmZmVyIGZvciBiYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcuIEZvciBlbnZpcm9ubWVudHNcbiAqIHdpdGhvdXQgQnVmZmVyIChlLmcuIFF1aWNrSlMgVk0pLCBhIHBvbHlmaWxsIG9yIGFsdGVybmF0aXZlIGJhc2U2NFxuICogaW1wbGVtZW50YXRpb24gd2lsbCBiZSBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgSG9va0NvbmZsaWN0RXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUmVkdWNlcnMsIFJldml2ZXJzLCBTZXJpYWxpemFibGVTcGVjaWFsIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vLyAtLS0tIEJhc2U2NCBoZWxwZXJzIC0tLS1cblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChcbiAgdmFsdWU6IEFycmF5QnVmZmVyTGlrZSxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIGxlbmd0aDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICAvLyBBdm9pZCByZXR1cm5pbmcgZmFsc3kgdmFsdWUgZm9yIHplcm8tbGVuZ3RoIGJ1ZmZlcnNcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgLy8gQ3JlYXRlIGEgcHJvcGVyIGNvcHkgdG8gYXZvaWQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCBpc3N1ZXNcbiAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpO1xuICByZXR1cm4gQnVmZmVyLmZyb20odWludDgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZnVuY3Rpb24gdmlld1RvQmFzZTY0KHZhbHVlOiBBcnJheUJ1ZmZlclZpZXcpOiBzdHJpbmcge1xuICByZXR1cm4gYXJyYXlCdWZmZXJUb0Jhc2U2NCh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcihcbiAgdmFsdWU6IHN0cmluZyxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBBcnJheUJ1ZmZlciB7XG4gIGNvbnN0IGJhc2U2NCA9IHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlO1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKTtcbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgZ2xvYmFsLkFycmF5QnVmZmVyKGJ1ZmZlci5sZW5ndGgpO1xuICBjb25zdCB1aW50OEFycmF5ID0gbmV3IGdsb2JhbC5VaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgdWludDhBcnJheS5zZXQoYnVmZmVyKTtcbiAgcmV0dXJuIGFycmF5QnVmZmVyO1xufVxuXG5mdW5jdGlvbiByZXZpdmUoc3RyOiBzdHJpbmcpIHtcbiAgLy8gZGV2YWx1ZS5zdHJpbmdpZnkoKSBhbHdheXMgcHJvZHVjZXMgdmFsaWQgSlNPTjogc3BlY2lhbCB2YWx1ZXNcbiAgLy8gKHVuZGVmaW5lZCwgTmFOLCBJbmZpbml0eSwgLTApIGFyZSBlbmNvZGVkIGFzIG5lZ2F0aXZlIGludGVnZXJcbiAgLy8gc2VudGluZWxzIGFuZCB0aGUgcmVtYWluaW5nIHN0cnVjdHVyZSBpcyBvcmRpbmFyeSBKU09OLiBQYXJzaW5nXG4gIC8vIHdpdGggSlNPTi5wYXJzZSB5aWVsZHMgdGhlIGZsYXR0ZW5lZCBmb3JtIHRoYXQgdW5mbGF0dGVuKCkgZXhwZWN0cy5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuLy8gLS0tLSBFcnJvciBzdWJjbGFzcyBoZWxwZXJzIC0tLS1cblxuLyoqXG4gKiBUaGUgc2hhcmVkIHNoYXBlIHRoYXQgZXZlcnkgRXJyb3Itc3ViY2xhc3MgcmVkdWNlciBpbiB0aGlzIG1vZHVsZVxuICogcHJvZHVjZXMuIFNvbWUgc3ViY2xhc3NlcyAoZS5nLiBgQWdncmVnYXRlRXJyb3JgLCBgUmV0cnlhYmxlRXJyb3JgKSBleHRlbmRcbiAqIHRoaXMgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcyBieSBzcHJlYWRpbmcgdGhlIGJhc2UgcGF5bG9hZC5cbiAqL1xudHlwZSBCYXNlRXJyb3JQYXlsb2FkID0ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrPzogc3RyaW5nO1xuICBjYXVzZT86IHVua25vd247XG59O1xuXG4vKipcbiAqIFN1YnNldCBvZiBgU2VyaWFsaXphYmxlU3BlY2lhbGAga2V5cyB3aG9zZSBwYXlsb2FkIHNoYXBlIGlzIGV4YWN0bHkgdGhlXG4gKiBgQmFzZUVycm9yUGF5bG9hZGAuIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgIGlzIGNvbnN0cmFpbmVkIHRvIG9ubHlcbiAqIHRoZXNlIGtleXMgc28gaXRzIHJldHVybiB0eXBlIGlzIHNvdW5kIOKAlCBzdWJjbGFzc2VzIHRoYXQgbmVlZCBleHRyYVxuICogZmllbGRzIChsaWtlIGBBZ2dyZWdhdGVFcnJvci5lcnJvcnNgIG9yIGBSZXRyeWFibGVFcnJvci5yZXRyeUFmdGVyYCkgdXNlXG4gKiBgcmVkdWNlRXJyb3JCYXNlYCBkaXJlY3RseSBhbmQgZXh0ZW5kIHRoZSByZXN1bHQuXG4gKi9cbnR5cGUgU2ltcGxlRXJyb3JTdWJjbGFzc0tleSA9IHtcbiAgW0sgaW4ga2V5b2YgU2VyaWFsaXphYmxlU3BlY2lhbF06IFNlcmlhbGl6YWJsZVNwZWNpYWxbS10gZXh0ZW5kcyBCYXNlRXJyb3JQYXlsb2FkXG4gICAgPyBCYXNlRXJyb3JQYXlsb2FkIGV4dGVuZHMgU2VyaWFsaXphYmxlU3BlY2lhbFtLXVxuICAgICAgPyBLXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgU2VyaWFsaXphYmxlU3BlY2lhbF07XG5cbi8qKlxuICogUmVkdWNlcyBhbnkgbmF0aXZlIEVycm9yIGluc3RhbmNlIHRvIHRoZSBzaGFyZWQgYEJhc2VFcnJvclBheWxvYWRgIHNoYXBlLFxuICogcHJlc2VydmluZyBgY2F1c2VgIG9ubHkgd2hlbiBwcmVzZW50ICh0byBkaXN0aW5ndWlzaCBcIm5vIGNhdXNlXCIgZnJvbVxuICogXCJjYXVzZSBpcyB1bmRlZmluZWRcIikuIFVzZWQgZGlyZWN0bHkgYnkgcmVkdWNlcnMgZm9yIHN1YmNsYXNzZXMgdGhhdCBuZWVkXG4gKiB0byBleHRlbmQgdGhlIHNoYXBlIHdpdGggYWRkaXRpb25hbCBmaWVsZHMuXG4gKlxuICogYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgaXMgdXNlZCBpbnN0ZWFkIG9mIGBpbnN0YW5jZW9mYCBmb3IgY3Jvc3MtVk0gc2FmZXR5OlxuICogZXJyb3JzIG1heSBvcmlnaW5hdGUgZnJvbSBhIGRpZmZlcmVudCBWTSBjb250ZXh0LCBhbmQgYGluc3RhbmNlb2ZgIGZhaWxzXG4gKiBhY3Jvc3MgVk0gYm91bmRhcmllcyBzaW5jZSBlYWNoIGNvbnRleHQgaGFzIGl0cyBvd24gRXJyb3IgY29uc3RydWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUVycm9yQmFzZSh2YWx1ZTogdW5rbm93bik6IEJhc2VFcnJvclBheWxvYWQgfCBmYWxzZSB7XG4gIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVkdWNlZDogQmFzZUVycm9yUGF5bG9hZCA9IHtcbiAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgfTtcbiAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgeyBjYXVzZTogdW5rbm93biB9KS5jYXVzZTtcbiAgcmV0dXJuIHJlZHVjZWQ7XG59XG5cbi8qKlxuICogUmVkdWNlcyBhIG5hdGl2ZSBlcnJvciB0byB0aGUgc2hhcmVkIGBCYXNlRXJyb3JQYXlsb2FkYCwgYnV0IG9ubHkgd2hlbiBpdHNcbiAqIGBuYW1lYCBpbnN0YW5jZSBwcm9wZXJ0eSBtYXRjaGVzIGBzdWJjbGFzc05hbWVgLiBVc2VkIGJ5OlxuICogICAtIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgLCBmb3Igc3ViY2xhc3NlcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiAgICAgZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAuXG4gKiAgIC0gSW5saW5lIHJlZHVjZXJzIGZvciBzdWJjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoZSBzaGFwZSB3aXRoIGFkZGl0aW9uYWxcbiAqICAgICBmaWVsZHMgKGUuZy4gYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2AsIGBSZXRyeWFibGVFcnJvci5yZXRyeUFmdGVyYCkuXG4gKlxuICogTWF0Y2hpbmcgYnkgYHZhbHVlLm5hbWVgIChpbnN0ZWFkIG9mIGB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZWApIGlzIHJvYnVzdFxuICogdG8gYnVuZGxlcnMgdGhhdCBlbWl0IHRoZSBjbGFzcyBhcyBhbiBhbm9ueW1vdXMgZXhwcmVzc2lvbiDigJQgZS5nLiBUdXJib3BhY2tcbiAqIGNvbXBpbGVzIGBleHBvcnQgY2xhc3MgRmF0YWxFcnJvciBleHRlbmRzIEVycm9yIHvigKZ9YCB0byBhIHJlZ2lzdHJhdGlvbiBjYWxsXG4gKiBsaWtlIGBlLnMoW1wiRmF0YWxFcnJvclwiLCAwLCBjbGFzcyBleHRlbmRzIEVycm9yIHvigKZ9XSlgLCBhbmQgdGhlIHJlc3VsdGluZ1xuICogY29uc3RydWN0b3IgaGFzIGBuYW1lID09PSAnJ2AuIFNpbmNlIGV2ZXJ5IEVycm9yIHN1YmNsYXNzIHdlIGNhcmUgYWJvdXRcbiAqIHNldHMgYHRoaXMubmFtZWAgZXhwbGljaXRseSBpbiBpdHMgY29uc3RydWN0b3IgKGJ1aWx0LWluIHN1YmNsYXNzZXMgZG8gdGhpc1xuICogYXV0b21hdGljYWxseTsgYEZhdGFsRXJyb3JgL2BSZXRyeWFibGVFcnJvcmAgZG8gaXQgaW4gdXNlciBjb2RlKSwgdGhlXG4gKiBpbnN0YW5jZSBwcm9wZXJ0eSBpcyB0aGUgcmVsaWFibGUgaWRlbnRpdHkgbWFya2VyIGFjcm9zcyByZWFsbXMgYW5kXG4gKiBidW5kbGVycy5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShcbiAgc3ViY2xhc3NOYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiBCYXNlRXJyb3JQYXlsb2FkIHwgZmFsc2Uge1xuICBpZiAoIXR5cGVzLmlzTmF0aXZlRXJyb3IodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGlmICh2YWx1ZS5uYW1lICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJlZHVjZUVycm9yQmFzZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZHVjZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3Mgd2hvc2Ugc2VyaWFsaXplZCBzaGFwZSBpc1xuICogZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAgKG5vIGV4dHJhIGZpZWxkcykuIFRoZSByZWR1Y2VyIG1hdGNoZXMgYnlcbiAqIGNvbnN0cnVjdG9yIG5hbWUgKGFmdGVyIHRoZSBpc05hdGl2ZUVycm9yIGdhdGUpLCBzaW5jZSBgaW5zdGFuY2VvZmAgbWF5XG4gKiBmYWlsIGFjcm9zcyBWTSBib3VuZGFyaWVzLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXI8SyBleHRlbmRzIFNpbXBsZUVycm9yU3ViY2xhc3NLZXk+KFxuICBzdWJjbGFzc05hbWU6IEtcbikge1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSB8IGZhbHNlID0+IHtcbiAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShzdWJjbGFzc05hbWUsIHZhbHVlKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYmFzZSBhcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBSZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3RcbiAqIGJ1aWx0LWluIEVycm9yIHR5cGUgdXNpbmcgdGhlIGNvbnRleHQncyBjb25zdHJ1Y3Rvci4gVGhlIGBjYXVzZWAgb3B0aW9uIGlzXG4gKiBvbmx5IHBhc3NlZCB3aGVuIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5jbHVkZXMgaXQsIHByZXNlcnZpbmcgdGhlIGRpc3RpbmN0aW9uXG4gKiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyPEsgZXh0ZW5kcyBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsPihcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBjdG9yTmFtZTogc3RyaW5nXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSkgPT4ge1xuICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyBCYXNlRXJyb3JQYXlsb2FkO1xuICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHYgPyB7IGNhdXNlOiB2LmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgQ3RvciA9IGdsb2JhbFtjdG9yTmFtZV07XG4gICAgY29uc3QgZXJyb3I6IEVycm9yID0gbmV3IEN0b3Iodi5tZXNzYWdlLCBvcHRzKTtcbiAgICBpZiAodi5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHYuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQXJyYXlCdWZmZXI6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICYmXG4gICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLCAwLCB2YWx1ZS5ieXRlTGVuZ3RoKSxcbiAgICBCaWdJbnQ6ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyAmJiB2YWx1ZS50b1N0cmluZygpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkJpZ0ludDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQmlnVWludDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkRhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB2YWxpZCA9ICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgIHJldHVybiB2YWxpZCA/IHZhbHVlLnRvSVNPU3RyaW5nKCkgOiAnLic7XG4gICAgfSxcbiAgICAvLyBET01FeGNlcHRpb24gaXMgYSBzcGVjaWFsIGNhc2U6IGl0IGBpbnN0YW5jZW9mIEVycm9yYCBpcyB0cnVlIGluIE5vZGUsXG4gICAgLy8gYnV0IGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIHJldHVybnMgRkFMU0UgZm9yIGl0LCBzbyB0aGUgZ2VuZXJpYyBFcnJvclxuICAgIC8vIHJlZHVjZXIgKHdoaWNoIGdhdGVzIG9uIGlzTmF0aXZlRXJyb3IpIHdvbid0IG1hdGNoLiBDaGVjayBpdCBleHBsaWNpdGx5XG4gICAgLy8gYnkgY29uc3RydWN0b3IgbmFtZSArIEVycm9yIGluaGVyaXRhbmNlIHNvIHdlIGNhdGNoIERPTUV4Y2VwdGlvbnMgZnJvbVxuICAgIC8vIGFueSByZWFsbSAoY3Jvc3MtVk0gc2FmZXR5OiBpbnN0YW5jZW9mIGdsb2JhbC5ET01FeGNlcHRpb24gd291bGQgZmFpbFxuICAgIC8vIGZvciBpbnN0YW5jZXMgbWludGVkIGluIGFub3RoZXIgY29udGV4dCkuXG4gICAgRE9NRXhjZXB0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgICh2YWx1ZSBhcyB7IGNvbnN0cnVjdG9yPzogeyBuYW1lPzogc3RyaW5nIH0gfSkuY29uc3RydWN0b3I/Lm5hbWUgIT09XG4gICAgICAgICdET01FeGNlcHRpb24nXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGUgPSB2YWx1ZSBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH07XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydET01FeGNlcHRpb24nXSA9IHtcbiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICAgIHN0YWNrOiBlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIGUpIHJlZHVjZWQuY2F1c2UgPSBlLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBFcnJvciBzdWJjbGFzcyByZWR1Y2VycyBhcmUgaW50ZW50aW9uYWxseSBwbGFjZWQgYmVmb3JlIHRoZSBiYXNlIEVycm9yXG4gICAgLy8gcmVkdWNlciBiZWNhdXNlIGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zLiBTdWJjbGFzcy1zcGVjaWZpYyByZWR1Y2Vyc1xuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBmaXJzdCBzbyB0aGF0IGUuZy4gYSBUeXBlRXJyb3IgaXMgc2VyaWFsaXplZCBhcyBcIlR5cGVFcnJvclwiXG4gICAgLy8gcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIFwiRXJyb3JcIiByZWR1Y2VyLlxuICAgIC8vIFNlZSBgbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyYCBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbiAgICBFdmFsRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignRXZhbEVycm9yJyksXG4gICAgRmF0YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdGYXRhbEVycm9yJyksXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0hvb2tDb25mbGljdEVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbHVlIGFzIEhvb2tDb25mbGljdEVycm9yO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnSG9va0NvbmZsaWN0RXJyb3InXSA9IHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdG9rZW46IGVycm9yLnRva2VuLFxuICAgICAgfTtcbiAgICAgIGlmIChlcnJvci5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb25mbGljdGluZ1J1bklkID0gZXJyb3IuY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICAvLyBSZXRyeWFibGVFcnJvciBjYXJyaWVzIGFuIGV4dHJhIGByZXRyeUFmdGVyYCBEYXRlIHRoYXQgd2Ugc2VyaWFsaXplIGFzXG4gICAgLy8gYSBudW1lcmljIGVwb2NoIHRpbWVzdGFtcC4gVGhlIERhdGUgcmVkdWNlciB1c2VzIGBpbnN0YW5jZW9mIGdsb2JhbC5EYXRlYCxcbiAgICAvLyB3aGljaCBmYWlscyBmb3IgRGF0ZXMgZnJvbSBhIGRpZmZlcmVudCBWTSByZWFsbTsgc2VyaWFsaXppbmcgYXMgYVxuICAgIC8vIG51bWJlciBzaWRlc3RlcHMgdGhhdCBpc3N1ZS5cbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnUmV0cnlhYmxlRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJSYXcgPSAodmFsdWUgYXMgUmV0cnlhYmxlRXJyb3IpLnJldHJ5QWZ0ZXIgYXMgdW5rbm93bjtcbiAgICAgIGxldCByZXRyeUFmdGVyOiBudW1iZXI7XG4gICAgICBpZiAoXG4gICAgICAgIHJldHJ5QWZ0ZXJSYXcgJiZcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiAocmV0cnlBZnRlclJhdyBhcyB7IGdldFRpbWU/OiB1bmtub3duIH0pLmdldFRpbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0ID0gKHJldHJ5QWZ0ZXJSYXcgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZShyZXRyeUFmdGVyUmF3KS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRyeUFmdGVyID0gRGF0ZS5ub3coKSArIDEwMDA7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICByZXRyeUFmdGVyLFxuICAgICAgfSBzYXRpc2ZpZXMgU2VyaWFsaXphYmxlU3BlY2lhbFsnUmV0cnlhYmxlRXJyb3InXTtcbiAgICB9LFxuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgY2FycmllcyBhbiBleHRyYSBgY29udGV4dGAgb2JqZWN0IChvcGVyYXRpb24sXG4gICAgLy8gYnl0ZUxlbmd0aCwgZm9ybWF0UHJlZml4KSB0aGF0IHRoZSBnZW5lcmljIEVycm9yIHJlZHVjZXIgd291bGQgZHJvcC5cbiAgICAvLyBQcmVzZXJ2ZSBpdCBzbyB0aGUgZGlhZ25vc3RpYyBkYXRhIHN1cnZpdmVzIHRoZSBydW4tZXJyb3Igcm91bmQgdHJpcC5cbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICAgICAgICAnUnVudGltZURlY3J5cHRpb25FcnJvcicsXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSdW50aW1lRGVjcnlwdGlvbkVycm9yJ10gPSB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgY29udGV4dCA9ICh2YWx1ZSBhcyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKS5jb250ZXh0O1xuICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWR1Y2VkLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdTeW50YXhFcnJvcicpLFxuICAgIFR5cGVFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdVUklFcnJvcicpLFxuICAgIC8vIEFnZ3JlZ2F0ZUVycm9yIGlzIHNpbWlsYXIgdG8gb3RoZXIgc3ViY2xhc3NlcyBidXQgYWxzbyBwcmVzZXJ2ZXMgdGhlXG4gICAgLy8gYGVycm9yc2AgYXJyYXkuIFdlIGV4dGVuZCB0aGUgYmFzZSBoZWxwZXIncyBvdXRwdXQgaGVyZS5cbiAgICBBZ2dyZWdhdGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnQWdncmVnYXRlRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGVycm9yczogKHZhbHVlIGFzIEFnZ3JlZ2F0ZUVycm9yKS5lcnJvcnMsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydBZ2dyZWdhdGVFcnJvciddO1xuICAgIH0sXG4gICAgLy8gQmFzZSBFcnJvciByZWR1Y2VyIOKAlCBjYXRjaC1hbGwgZm9yIGFueSBFcnJvciBpbnN0YW5jZSBub3QgbWF0Y2hlZCBieSBhXG4gICAgLy8gc3BlY2lmaWMgc3ViY2xhc3MgcmVkdWNlciBhYm92ZSAoaW5jbHVkaW5nIHVzZXIgRXJyb3Igc3ViY2xhc3NlcyB3aXRob3V0XG4gICAgLy8gV09SS0ZMT1dfU0VSSUFMSVpFKS4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZFxuICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSBleGFjdCBjbGFzcyBjYW5ub3QgYmUgcmVjb25zdHJ1Y3RlZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXR5cGVzLmlzTmF0aXZlRXJyb3IodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydFcnJvciddID0ge1xuICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5GbG9hdDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkZsb2F0NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuSGVhZGVycyAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkludDhBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgTWFwOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLk1hcCAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlZ0V4cCAmJiB7XG4gICAgICAgIHNvdXJjZTogdmFsdWUuc291cmNlLFxuICAgICAgICBmbGFnczogdmFsdWUuZmxhZ3MsXG4gICAgICB9LFxuICAgIC8vIFJlcXVlc3QgYW5kIFJlc3BvbnNlIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBpbiBjb21tb24gcmVkdWNlcnMuXG4gICAgLy8gVGhleSByZXF1aXJlIG1vZGUtc3BlY2lmaWMgcmV2aXZlcnMgKHN0cmVhbSBoYW5kbGluZywgZXRjLikgYW5kXG4gICAgLy8gaW5jbHVkaW5nIHRoZW0gaGVyZSB3aXRob3V0IG1hdGNoaW5nIHJldml2ZXJzIHdvdWxkIGNhdXNlIHRoZW1cbiAgICAvLyB0byBkZXNlcmlhbGl6ZSBhcyBwbGFpbiBvYmplY3RzLlxuICAgIFNldDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5TZXQgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgVVJMOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlVSTCAmJiB2YWx1ZS5ocmVmLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gT25seSBtYXRjaCBmdW5jdGlvbiByZWZlcmVuY2VzIHdpdGggYSB3b3JrZmxvd0lkIHByb3BlcnR5IChzZXQgYnlcbiAgICAgIC8vIHRoZSBTV0MgY29tcGlsZXIgb24gd29ya2Zsb3cgZnVuY3Rpb25zKS4gUGxhaW4geyB3b3JrZmxvd0lkIH0gb2JqZWN0c1xuICAgICAgLy8gYXJlIE5PVCBtYXRjaGVkIOKAlCB0aGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB0aGUgcmVkdWNlZFxuICAgICAgLy8gZm9ybSB7IHdvcmtmbG93SWQgfSBpcyBhIHBsYWluIG9iamVjdCwgbm90IGEgZnVuY3Rpb24uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB3b3JrZmxvd0lkID0gKHZhbHVlIGFzIGFueSkud29ya2Zsb3dJZDtcbiAgICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dJZCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7IHdvcmtmbG93SWQgfTtcbiAgICB9LFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VUkxTZWFyY2hQYXJhbXMpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodmFsdWUuc2l6ZSA9PT0gMCkgcmV0dXJuICcuJztcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH0sXG4gICAgVWludDhBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDhBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VaW50OENsYW1wZWRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VaW50MTZBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQzMkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VaW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICB9O1xufVxuXG4vLyAtLS0tIFJldml2ZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQXJyYXlCdWZmZXI6ICh2YWx1ZTogc3RyaW5nKSA9PiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSxcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBnbG9iYWwuQmlnSW50KHZhbHVlKSxcbiAgICBCaWdJbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnSW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgQmlnVWludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5CaWdVaW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgRGF0ZTogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUpLFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAvLyBET01FeGNlcHRpb24ncyBjb25zdHJ1Y3RvciBkb2Vzbid0IGFjY2VwdCBhIGNhdXNlIG9wdGlvbiwgc29cbiAgICAgIC8vIHdlIHNldCBpdCBtYW51YWxseSB3aGVuIHByZXNlbnQgaW4gdGhlIHNlcmlhbGl6ZWQgZGF0YS5cbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gRXJyb3Igc3ViY2xhc3MgcmV2aXZlcnMgcmVjb25zdHJ1Y3QgdGhlIGNvcnJlY3QgYnVpbHQtaW4gRXJyb3IgdHlwZS5cbiAgICAvLyBTZWUgYG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcmAgZm9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG4gICAgRXZhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnRXZhbEVycm9yJyksXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW5zLCBzbyB3ZSByZXNvbHZlIHRoZW1cbiAgICAvLyBmcm9tIHRoZSBjb25zdW1lcidzIGBnbG9iYWxUaGlzYCB2aWEgYSBgU3ltYm9sLmZvciguLi4pYCBrZXkgcmVnaXN0ZXJlZFxuICAgIC8vIGJ5IGBAd29ya2Zsb3cvZXJyb3JzYCBvbiBsb2FkLiBUaGlzIG1ha2VzIGBpbnN0YW5jZW9mIEZhdGFsRXJyb3JgIHdvcmtcbiAgICAvLyBpbiB1c2VyIGNvZGUgdGhhdCBsaXZlcyBpbiBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoaXMgcmVkdWNlciBtb2R1bGVcbiAgICAvLyAoZS5nLiB3aGVuIHRoZSBob3N0IGh5ZHJhdGVzIGEgdmFsdWUgZGVzdGluZWQgZm9yIGEgd29ya2Zsb3cgVk1cbiAgICAvLyBjb250ZXh0KS4gU2VlIHRoZSByZWdpc3RyYXRpb24gYmxvY2sgYXQgdGhlIGJvdHRvbSBvZlxuICAgIC8vIGBwYWNrYWdlcy9lcnJvcnMvc3JjL2luZGV4LnRzYCBmb3IgZGV0YWlscy4gRmFsbHMgYmFjayB0byB0aGUgaW1wb3J0ZWRcbiAgICAvLyBjbGFzcyBmb3IgZW52aXJvbm1lbnRzIHdoZXJlIG5vIGJ1bmRsZWQgYEB3b3JrZmxvdy9lcnJvcnNgIGhhcyBsb2FkZWRcbiAgICAvLyBpbiB0aGUgY29uc3VtZXIgcmVhbG0uXG4gICAgRmF0YWxFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0ZhdGFsRXJyb3InKVxuICAgICAgICBdIGFzIHR5cGVvZiBGYXRhbEVycm9yIHwgdW5kZWZpbmVkKSA/PyBGYXRhbEVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBIb29rQ29uZmxpY3RFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0hvb2tDb25mbGljdEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgSG9va0NvbmZsaWN0RXJyb3IgfCB1bmRlZmluZWQpID8/IEhvb2tDb25mbGljdEVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS50b2tlbiwgdmFsdWUuY29uZmxpY3RpbmdSdW5JZCk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSYW5nZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnUmFuZ2VFcnJvcicpLFxuICAgIFJlZmVyZW5jZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnUmVmZXJlbmNlRXJyb3InKSxcbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBVc2UgdGhlIGNvbnRleHQncyBgRGF0ZWAgY29uc3RydWN0b3IgKG1hdGNoaW5nIHRoZSByZXN0IG9mIHRoaXNcbiAgICAgIC8vIG1vZHVsZSkgc28gdGhlIHJlc3VsdGluZyBgcmV0cnlBZnRlcmAgRGF0ZSBwYXNzZXMgYGluc3RhbmNlb2ZcbiAgICAgIC8vIGdsb2JhbC5EYXRlYCBjaGVja3MgaW4gdGhlIHRhcmdldCByZWFsbS4gU2VlIHRoZSBGYXRhbEVycm9yIHJldml2ZXJcbiAgICAgIC8vIGFib3ZlIGZvciB3aHkgd2UgcmVzb2x2ZSBgUmV0cnlhYmxlRXJyb3JgIGZyb20gdGhlIGNvbnN1bWVyJ3NcbiAgICAgIC8vIGdsb2JhbFRoaXMgaW5zdGVhZCBvZiB0aGUgaW1wb3J0ZWQgY2xhc3MuXG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1JldHJ5YWJsZUVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgUmV0cnlhYmxlRXJyb3IgfCB1bmRlZmluZWQpID8/IFJldHJ5YWJsZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCB7XG4gICAgICAgIHJldHJ5QWZ0ZXI6IG5ldyBnbG9iYWwuRGF0ZSh2YWx1ZS5yZXRyeUFmdGVyKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUmVzb2x2ZSBmcm9tIHRoZSBjb25zdW1lcidzIGdsb2JhbFRoaXMgKHNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSkgc28gYGluc3RhbmNlb2YgUnVudGltZURlY3J5cHRpb25FcnJvcmAgaG9sZHMgYWNyb3NzIHJlYWxtcy5cbiAgICAgIGNvbnN0IEN0b3IgPVxuICAgICAgICAoKGdsb2JhbCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgICAgICAgU3ltYm9sLmZvcignQHdvcmtmbG93L2Vycm9ycy8vUnVudGltZURlY3J5cHRpb25FcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgfCB1bmRlZmluZWQpID8/XG4gICAgICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I7XG4gICAgICBjb25zdCBvcHRzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I+WzFdID0ge307XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgb3B0cy5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgaWYgKHZhbHVlLmNvbnRleHQgIT09IHVuZGVmaW5lZCkgb3B0cy5jb250ZXh0ID0gdmFsdWUuY29udGV4dDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICB2YWx1ZS5lcnJvcnMsXG4gICAgICAgIHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIG9wdHNcbiAgICAgICk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmV2aXZlciDigJQgdXNlZCBmb3IgcGxhaW4gRXJyb3IgaW5zdGFuY2VzIGFuZCB1bnJlY29nbml6ZWRcbiAgICAvLyBFcnJvciBzdWJjbGFzc2VzLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5FcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSGVhZGVyczogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5NYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlJlZ0V4cCh2YWx1ZS5zb3VyY2UsIHZhbHVlLmZsYWdzKSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5TZXQodmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlVSTCh2YWx1ZSksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VUkxTZWFyY2hQYXJhbXModmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgfTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciB1c2UgaW4gbGVnYWN5IGNvbXBhdFxuZXhwb3J0IHsgcmV2aXZlIH07XG4iXX0=
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHNCQUFzQixHQUN2QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFdBQVcsRUFDWCxlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLFlBQVksRUFDWixlQUFlLEVBQ2YsV0FBVyxFQUNYLFlBQVksRUFDWixXQUFXLEVBQ1gsT0FBTyxFQUNQLHVCQUF1QixFQUN2QixRQUFRLEdBQ1QsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QiwyQkFBMkI7QUFFM0IsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxzREFBc0Q7SUFDdEQsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzdCLDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQXNCO0lBQzFDLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLGNBQWM7SUFDZCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxtQkFBbUIs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cUNBQXFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycyBmb3IgdHlwZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBtb2Rlcy5cbiAqXG4gKiBIYW5kbGVzOiBBcnJheUJ1ZmZlciwgQmlnSW50LCB0eXBlZCBhcnJheXMsIERhdGUsIEVycm9yLCBIZWFkZXJzLCBNYXAsIFNldCxcbiAqIFJlZ0V4cCwgUmVxdWVzdCwgUmVzcG9uc2UsIFVSTCwgVVJMU2VhcmNoUGFyYW1zLlxuICpcbiAqIE5vdGU6IFVzZXMgTm9kZS5qcyBCdWZmZXIgZm9yIGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZy4gRm9yIGVudmlyb25tZW50c1xuICogd2l0aG91dCBCdWZmZXIgKGUuZy4gUXVpY2tKUyBWTSksIGEgcG9seWZpbGwgb3IgYWx0ZXJuYXRpdmUgYmFzZTY0XG4gKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBGYXRhbEVycm9yLFxuICBIb29rQ29uZmxpY3RFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoLFxuICBkYXRlR2V0RGF0ZSxcbiAgZGF0ZUdldFRpbWUsXG4gIGRhdGVUb0lTT1N0cmluZyxcbiAgaGFzUHJvcGVydHksXG4gIGhlYWRlcnNUb0VudHJpZXMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgbWFwVG9FbnRyaWVzLFxuICByZWFkUHJvcGVydHksXG4gIHJlY29yZEd1ZXN0Q29kZSxcbiAgcmVnRXhwRmxhZ3MsXG4gIHJlZ0V4cFNvdXJjZSxcbiAgc2V0VG9WYWx1ZXMsXG4gIHVybEhyZWYsXG4gIHVybFNlYXJjaFBhcmFtc1RvU3RyaW5nLFxuICB2aWV3SW5mbyxcbn0gZnJvbSAnLi4vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIC8vIFJlYWQgdGhlIHZpZXcncyByYW5nZSB0aHJvdWdoIGludGVybmFsLXNsb3QgZ2V0dGVycyAoc2VlIGhhcmRlbmVkLnRzKTpcbiAgLy8gb3duIHByb3BlcnRpZXMgc2hhZG93aW5nIGBidWZmZXJgL2BieXRlT2Zmc2V0YC9gYnl0ZUxlbmd0aGAg4oCUIG9yIHBhdGNoZWRcbiAgLy8gcHJvdG90eXBlIGdldHRlcnMgaW4gdGhlIHNhbmRib3ggcmVhbG0g4oCUIGNhbm5vdCBjaGFuZ2Ugd2hpY2ggYnl0ZXMgYXJlXG4gIC8vIHNlcmlhbGl6ZWQuXG4gIGNvbnN0IGluZm8gPSB2aWV3SW5mbyh2YWx1ZSk7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KGluZm8uYnVmZmVyLCBpbmZvLmJ5dGVPZmZzZXQsIGluZm8uYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQg4oCUIHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWR1Y2VzIGFueSBuYXRpdmUgRXJyb3IgaW5zdGFuY2UgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAgc2hhcGUsXG4gKiBwcmVzZXJ2aW5nIGBjYXVzZWAgb25seSB3aGVuIHByZXNlbnQgKHRvIGRpc3Rpbmd1aXNoIFwibm8gY2F1c2VcIiBmcm9tXG4gKiBcImNhdXNlIGlzIHVuZGVmaW5lZFwiKS4gVXNlZCBkaXJlY3RseSBieSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWRcbiAqIHRvIGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAqXG4gKiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGZvciBjcm9zcy1WTSBzYWZldHk6XG4gKiBlcnJvcnMgbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IFZNIGNvbnRleHQsIGFuZCBgaW5zdGFuY2VvZmAgZmFpbHNcbiAqIGFjcm9zcyBWTSBib3VuZGFyaWVzIHNpbmNlIGVhY2ggY29udGV4dCBoYXMgaXRzIG93biBFcnJvciBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlRXJyb3JCYXNlKHZhbHVlOiB1bmtub3duKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBgbWVzc2FnZWAvYHN0YWNrYC9gY2F1c2VgIGFyZSBvd24gZGF0YSBwcm9wZXJ0aWVzIG9uIG5hdHVyYWwgZXJyb3JzLCBzb1xuICAvLyB0aGUgZGVzY3JpcHRvci1iYXNlZCByZWFkcyBjb3N0IG5vdGhpbmc7IGEgc2FuZGJveC1kZWZpbmVkIGFjY2Vzc29yXG4gIC8vIChlLmcuIGEgZ2V0dGVyIG9uIGFuIEVycm9yIHN1YmNsYXNzKSBpcyBzdGlsbCBpbnZva2VkIGJ1dCByZWNvcmRlZC5cbiAgY29uc3QgcmVkdWNlZDogQmFzZUVycm9yUGF5bG9hZCA9IHtcbiAgICBtZXNzYWdlOiByZWFkUHJvcGVydHkodmFsdWUsICdtZXNzYWdlJykgYXMgc3RyaW5nLFxuICAgIHN0YWNrOiByZWFkUHJvcGVydHkodmFsdWUsICdzdGFjaycpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgaWYgKGhhc1Byb3BlcnR5KHZhbHVlLCAnY2F1c2UnKSkgcmVkdWNlZC5jYXVzZSA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NhdXNlJyk7XG4gIHJldHVybiByZWR1Y2VkO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgYSBuYXRpdmUgZXJyb3IgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAsIGJ1dCBvbmx5IHdoZW4gaXRzXG4gKiBgbmFtZWAgaW5zdGFuY2UgcHJvcGVydHkgbWF0Y2hlcyBgc3ViY2xhc3NOYW1lYC4gVXNlZCBieTpcbiAqICAgLSBgbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyYCwgZm9yIHN1YmNsYXNzZXMgd2hvc2Ugc2VyaWFsaXplZCBzaGFwZSBpc1xuICogICAgIGV4YWN0bHkgYEJhc2VFcnJvclBheWxvYWRgLlxuICogICAtIElubGluZSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsXG4gKiAgICAgZmllbGRzIChlLmcuIGBBZ2dyZWdhdGVFcnJvci5lcnJvcnNgLCBgUmV0cnlhYmxlRXJyb3IucmV0cnlBZnRlcmApLlxuICpcbiAqIE1hdGNoaW5nIGJ5IGB2YWx1ZS5uYW1lYCAoaW5zdGVhZCBvZiBgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWVgKSBpcyByb2J1c3RcbiAqIHRvIGJ1bmRsZXJzIHRoYXQgZW1pdCB0aGUgY2xhc3MgYXMgYW4gYW5vbnltb3VzIGV4cHJlc3Npb24g4oCUIGUuZy4gVHVyYm9wYWNrXG4gKiBjb21waWxlcyBgZXhwb3J0IGNsYXNzIEZhdGFsRXJyb3IgZXh0ZW5kcyBFcnJvciB74oCmfWAgdG8gYSByZWdpc3RyYXRpb24gY2FsbFxuICogbGlrZSBgZS5zKFtcIkZhdGFsRXJyb3JcIiwgMCwgY2xhc3MgZXh0ZW5kcyBFcnJvciB74oCmfV0pYCwgYW5kIHRoZSByZXN1bHRpbmdcbiAqIGNvbnN0cnVjdG9yIGhhcyBgbmFtZSA9PT0gJydgLiBTaW5jZSBldmVyeSBFcnJvciBzdWJjbGFzcyB3ZSBjYXJlIGFib3V0XG4gKiBzZXRzIGB0aGlzLm5hbWVgIGV4cGxpY2l0bHkgaW4gaXRzIGNvbnN0cnVjdG9yIChidWlsdC1pbiBzdWJjbGFzc2VzIGRvIHRoaXNcbiAqIGF1dG9tYXRpY2FsbHk7IGBGYXRhbEVycm9yYC9gUmV0cnlhYmxlRXJyb3JgIGRvIGl0IGluIHVzZXIgY29kZSksIHRoZVxuICogaW5zdGFuY2UgcHJvcGVydHkgaXMgdGhlIHJlbGlhYmxlIGlkZW50aXR5IG1hcmtlciBhY3Jvc3MgcmVhbG1zIGFuZFxuICogYnVuZGxlcnMuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoXG4gIHN1YmNsYXNzTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93blxuKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocmVhZFByb3BlcnR5KHZhbHVlLCAnbmFtZScpICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJlZHVjZUVycm9yQmFzZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZHVjZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3Mgd2hvc2Ugc2VyaWFsaXplZCBzaGFwZSBpc1xuICogZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAgKG5vIGV4dHJhIGZpZWxkcykuIFRoZSByZWR1Y2VyIG1hdGNoZXMgYnlcbiAqIGNvbnN0cnVjdG9yIG5hbWUgKGFmdGVyIHRoZSBpc05hdGl2ZUVycm9yIGdhdGUpLCBzaW5jZSBgaW5zdGFuY2VvZmAgbWF5XG4gKiBmYWlsIGFjcm9zcyBWTSBib3VuZGFyaWVzLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXI8SyBleHRlbmRzIFNpbXBsZUVycm9yU3ViY2xhc3NLZXk+KFxuICBzdWJjbGFzc05hbWU6IEtcbikge1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSB8IGZhbHNlID0+IHtcbiAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShzdWJjbGFzc05hbWUsIHZhbHVlKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYmFzZSBhcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBSZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3RcbiAqIGJ1aWx0LWluIEVycm9yIHR5cGUgdXNpbmcgdGhlIGNvbnRleHQncyBjb25zdHJ1Y3Rvci4gVGhlIGBjYXVzZWAgb3B0aW9uIGlzXG4gKiBvbmx5IHBhc3NlZCB3aGVuIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5jbHVkZXMgaXQsIHByZXNlcnZpbmcgdGhlIGRpc3RpbmN0aW9uXG4gKiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyPEsgZXh0ZW5kcyBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsPihcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBjdG9yTmFtZTogc3RyaW5nXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSkgPT4ge1xuICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyBCYXNlRXJyb3JQYXlsb2FkO1xuICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHYgPyB7IGNhdXNlOiB2LmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgQ3RvciA9IGdsb2JhbFtjdG9yTmFtZV07XG4gICAgY29uc3QgZXJyb3I6IEVycm9yID0gbmV3IEN0b3Iodi5tZXNzYWdlLCBvcHRzKTtcbiAgICBpZiAodi5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHYuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKFxuICAvLyBUaGUgYGdsb2JhbGAgcGFyYW1ldGVyIGlzIHJldGFpbmVkIGZvciBBUEkgY29tcGF0aWJpbGl0eSwgYnV0IHRoZVxuICAvLyByZWR1Y2VycyBubyBsb25nZXIgcGVyZm9ybSBgaW5zdGFuY2VvZiBnbG9iYWwuWGAgY2hlY2tzOiBjbGFzc2lmaWNhdGlvblxuICAvLyBpcyBkb25lIHdpdGggZW5naW5lLWxldmVsIGJyYW5kIGNoZWNrcyAocmVhbG0tYWdub3N0aWMsIGltbXVuZSB0b1xuICAvLyByZWFzc2lnbmVkIHNhbmRib3ggZ2xvYmFscyBhbmQgYFN5bWJvbC5oYXNJbnN0YW5jZWApLCBhbmQgZXh0cmFjdGlvblxuICAvLyBnb2VzIHRocm91Z2ggaW50cmluc2ljcyBjYXB0dXJlZCBhdCBob3N0IGJvb3QuIFNlZSAuLi9oYXJkZW5lZC50cy5cbiAgX2dsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgJiZcbiAgICAgIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUsIDAsIGFycmF5QnVmZmVyQnl0ZUxlbmd0aCh2YWx1ZSkpLFxuICAgIEJpZ0ludDogKHZhbHVlKSA9PlxuICAgICAgLy8gU3RyaW5nKGJpZ2ludCkgaXMgYSBzcGVjLWludGVybmFsIG51bWVyaWMgY29udmVyc2lvbiDigJQgdW5saWtlXG4gICAgICAvLyBgdmFsdWUudG9TdHJpbmcoKWAsIGl0IG5ldmVyIGNvbnN1bHRzIEJpZ0ludC5wcm90b3R5cGUuXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmIFN0cmluZyh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNCaWdJbnQ2NEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc0JpZ1VpbnQ2NEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gQnJhbmQgY2hlY2sgKyBjYXB0dXJlZCBpbnRyaW5zaWNzOiBhIHNhbmRib3gtc2lkZSBwYXRjaCBvZlxuICAgICAgLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCAoZS5nLiBhIFRlbXBvcmFsIHBvbHlmaWxsIHdyYXBwaW5nIGl0KVxuICAgICAgLy8gaXMgbmV2ZXIgZXhlY3V0ZWQsIGFuZCBjYW5ub3QgcGVydHVyYiBWTSBzdGF0ZSBkdXJpbmcgc2VyaWFsaXphdGlvbi5cbiAgICAgIGlmICghdHlwZXMuaXNEYXRlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdmFsaWQgPSAhTnVtYmVyLmlzTmFOKGRhdGVHZXREYXRlKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsaWQgPyBkYXRlVG9JU09TdHJpbmcodmFsdWUpIDogJy4nO1xuICAgIH0sXG4gICAgLy8gRE9NRXhjZXB0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOiBpdCBgaW5zdGFuY2VvZiBFcnJvcmAgaXMgdHJ1ZSBpbiBOb2RlLFxuICAgIC8vIGJ1dCBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCByZXR1cm5zIEZBTFNFIGZvciBpdCwgc28gdGhlIGdlbmVyaWMgRXJyb3JcbiAgICAvLyByZWR1Y2VyICh3aGljaCBnYXRlcyBvbiBpc05hdGl2ZUVycm9yKSB3b24ndCBtYXRjaC4gQ2hlY2sgaXQgZXhwbGljaXRseVxuICAgIC8vIGJ5IGNvbnN0cnVjdG9yIG5hbWUgKyBFcnJvciBpbmhlcml0YW5jZSBzbyB3ZSBjYXRjaCBET01FeGNlcHRpb25zIGZyb21cbiAgICAvLyBhbnkgcmVhbG0gKGNyb3NzLVZNIHNhZmV0eTogaW5zdGFuY2VvZiBnbG9iYWwuRE9NRXhjZXB0aW9uIHdvdWxkIGZhaWxcbiAgICAvLyBmb3IgaW5zdGFuY2VzIG1pbnRlZCBpbiBhbm90aGVyIGNvbnRleHQpLlxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgY3RvciA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NvbnN0cnVjdG9yJyk7XG4gICAgICBpZiAoIWN0b3IgfHwgcmVhZFByb3BlcnR5KGN0b3IsICduYW1lJykgIT09ICdET01FeGNlcHRpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydET01FeGNlcHRpb24nXSA9IHtcbiAgICAgICAgbWVzc2FnZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWVzc2FnZScpIGFzIHN0cmluZyxcbiAgICAgICAgbmFtZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbmFtZScpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhY2s6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YWNrJykgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGlmIChoYXNQcm9wZXJ0eSh2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgcmVkdWNlZC5jYXVzZSA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NhdXNlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJlZHVjZXJzIGFyZSBpbnRlbnRpb25hbGx5IHBsYWNlZCBiZWZvcmUgdGhlIGJhc2UgRXJyb3JcbiAgICAvLyByZWR1Y2VyIGJlY2F1c2UgZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMuIFN1YmNsYXNzLXNwZWNpZmljIHJlZHVjZXJzXG4gICAgLy8gbXVzdCBiZSBjaGVja2VkIGZpcnN0IHNvIHRoYXQgZS5nLiBhIFR5cGVFcnJvciBpcyBzZXJpYWxpemVkIGFzIFwiVHlwZUVycm9yXCJcbiAgICAvLyByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIGdlbmVyaWMgXCJFcnJvclwiIHJlZHVjZXIuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0ZhdGFsRXJyb3InKSxcbiAgICBIb29rQ29uZmxpY3RFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnSG9va0NvbmZsaWN0RXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0hvb2tDb25mbGljdEVycm9yJ10gPSB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHRva2VuOiByZWFkUHJvcGVydHkodmFsdWUsICd0b2tlbicpIGFzIEhvb2tDb25mbGljdEVycm9yWyd0b2tlbiddLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbmZsaWN0aW5nUnVuSWQgPSByZWFkUHJvcGVydHkodmFsdWUsICdjb25mbGljdGluZ1J1bklkJykgYXNcbiAgICAgICAgfCBIb29rQ29uZmxpY3RFcnJvclsnY29uZmxpY3RpbmdSdW5JZCddXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWR1Y2VkLmNvbmZsaWN0aW5nUnVuSWQgPSBjb25mbGljdGluZ1J1bklkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBSYW5nZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIC8vIFJldHJ5YWJsZUVycm9yIGNhcnJpZXMgYW4gZXh0cmEgYHJldHJ5QWZ0ZXJgIERhdGUgdGhhdCB3ZSBzZXJpYWxpemUgYXNcbiAgICAvLyBhIG51bWVyaWMgZXBvY2ggdGltZXN0YW1wLiBUaGUgRGF0ZSByZWR1Y2VyIHVzZXMgYGluc3RhbmNlb2YgZ2xvYmFsLkRhdGVgLFxuICAgIC8vIHdoaWNoIGZhaWxzIGZvciBEYXRlcyBmcm9tIGEgZGlmZmVyZW50IFZNIHJlYWxtOyBzZXJpYWxpemluZyBhcyBhXG4gICAgLy8gbnVtYmVyIHNpZGVzdGVwcyB0aGF0IGlzc3VlLlxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKCdSZXRyeWFibGVFcnJvcicsIHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmV0cnlBZnRlclJhdyA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3JldHJ5QWZ0ZXInKTtcbiAgICAgIGxldCByZXRyeUFmdGVyOiBudW1iZXI7XG4gICAgICBpZiAodHlwZXMuaXNEYXRlKHJldHJ5QWZ0ZXJSYXcpKSB7XG4gICAgICAgIC8vIEdlbnVpbmUgRGF0ZSAoYW55IHJlYWxtKTogcmVhZCB0aGUgZXBvY2ggdGhyb3VnaCB0aGUgaW50cmluc2ljLlxuICAgICAgICBjb25zdCB0ID0gZGF0ZUdldFRpbWUocmV0cnlBZnRlclJhdyk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2UgaWYgKHJldHJ5QWZ0ZXJSYXcgJiYgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIER1Y2stdHlwZWQgZGF0ZS1saWtlOiBpbnZva2luZyBpdHMgZ2V0VGltZSgpIHJ1bnMgd29ya2Zsb3cgY29kZS5cbiAgICAgICAgY29uc3QgZ2V0VGltZSA9IHJlYWRQcm9wZXJ0eShyZXRyeUFmdGVyUmF3LCAnZ2V0VGltZScpO1xuICAgICAgICBpZiAodHlwZW9mIGdldFRpbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZWNvcmRHdWVzdENvZGUoJ21ldGhvZCcsICdnZXRUaW1lJyk7XG4gICAgICAgICAgY29uc3QgdCA9IChnZXRUaW1lIGFzICh0aGlzOiB1bmtub3duKSA9PiBudW1iZXIpLmNhbGwocmV0cnlBZnRlclJhdyk7XG4gICAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRyeUFmdGVyID0gRGF0ZS5ub3coKSArIDEwMDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ251bWJlcidcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0ID0gbmV3IERhdGUocmV0cnlBZnRlclJhdykuZ2V0VGltZSgpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0cnlBZnRlciA9IERhdGUubm93KCkgKyAxMDAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgcmV0cnlBZnRlcixcbiAgICAgIH0gc2F0aXNmaWVzIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JldHJ5YWJsZUVycm9yJ107XG4gICAgfSxcbiAgICAvLyBSdW50aW1lRGVjcnlwdGlvbkVycm9yIGNhcnJpZXMgYW4gZXh0cmEgYGNvbnRleHRgIG9iamVjdCAob3BlcmF0aW9uLFxuICAgIC8vIGJ5dGVMZW5ndGgsIGZvcm1hdFByZWZpeCkgdGhhdCB0aGUgZ2VuZXJpYyBFcnJvciByZWR1Y2VyIHdvdWxkIGRyb3AuXG4gICAgLy8gUHJlc2VydmUgaXQgc28gdGhlIGRpYWdub3N0aWMgZGF0YSBzdXJ2aXZlcyB0aGUgcnVuLWVycm9yIHJvdW5kIHRyaXAuXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShcbiAgICAgICAgJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InLFxuICAgICAgICB2YWx1ZVxuICAgICAgKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnUnVudGltZURlY3J5cHRpb25FcnJvciddID0ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSByZWFkUHJvcGVydHkodmFsdWUsICdjb250ZXh0JykgYXNcbiAgICAgICAgfCBSdW50aW1lRGVjcnlwdGlvbkVycm9yWydjb250ZXh0J11cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlZHVjZWQuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1VSSUVycm9yJyksXG4gICAgLy8gQWdncmVnYXRlRXJyb3IgaXMgc2ltaWxhciB0byBvdGhlciBzdWJjbGFzc2VzIGJ1dCBhbHNvIHByZXNlcnZlcyB0aGVcbiAgICAvLyBgZXJyb3JzYCBhcnJheS4gV2UgZXh0ZW5kIHRoZSBiYXNlIGhlbHBlcidzIG91dHB1dCBoZXJlLlxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKCdBZ2dyZWdhdGVFcnJvcicsIHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgZXJyb3JzOiByZWFkUHJvcGVydHkodmFsdWUsICdlcnJvcnMnKSBhcyBBZ2dyZWdhdGVFcnJvclsnZXJyb3JzJ10sXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydBZ2dyZWdhdGVFcnJvciddO1xuICAgIH0sXG4gICAgLy8gQmFzZSBFcnJvciByZWR1Y2VyIOKAlCBjYXRjaC1hbGwgZm9yIGFueSBFcnJvciBpbnN0YW5jZSBub3QgbWF0Y2hlZCBieSBhXG4gICAgLy8gc3BlY2lmaWMgc3ViY2xhc3MgcmVkdWNlciBhYm92ZSAoaW5jbHVkaW5nIHVzZXIgRXJyb3Igc3ViY2xhc3NlcyB3aXRob3V0XG4gICAgLy8gV09SS0ZMT1dfU0VSSUFMSVpFKS4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZFxuICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSBleGFjdCBjbGFzcyBjYW5ub3QgYmUgcmVjb25zdHJ1Y3RlZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXR5cGVzLmlzTmF0aXZlRXJyb3IodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydFcnJvciddID0ge1xuICAgICAgICBuYW1lOiByZWFkUHJvcGVydHkodmFsdWUsICduYW1lJykgYXMgc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiByZWFkUHJvcGVydHkodmFsdWUsICdtZXNzYWdlJykgYXMgc3RyaW5nLFxuICAgICAgICBzdGFjazogcmVhZFByb3BlcnR5KHZhbHVlLCAnc3RhY2snKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgaWYgKGhhc1Byb3BlcnR5KHZhbHVlLCAnY2F1c2UnKSkge1xuICAgICAgICByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzRmxvYXQzMkFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0Zsb2F0NjRBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICAvLyBIZWFkZXJzIGlzIGEgaG9zdCBjbGFzcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzbyBpdHMgKHNoYXJlZClcbiAgICAvLyBwcm90b3R5cGUgaXMgcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZSDigJQgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgIC8vIGJvb3QtY2FwdHVyZWQgaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGxpdmUgU3ltYm9sLml0ZXJhdG9yIGxvb2t1cC5cbiAgICBIZWFkZXJzOiAodmFsdWUpID0+XG4gICAgICBpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIEhlYWRlcnMucHJvdG90eXBlKSAmJlxuICAgICAgaGVhZGVyc1RvRW50cmllcyh2YWx1ZSBhcyBIZWFkZXJzKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNJbnQ4QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDMyQXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgLy8gRW5naW5lIGJyYW5kIGNoZWNrICsgaG9zdC1yZWFsbSBpdGVyYXRpb246IGEgcGF0Y2hlZFxuICAgIC8vIGBNYXAucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1gIGluIHRoZSBzYW5kYm94IGlzIG5ldmVyIGNvbnN1bHRlZC5cbiAgICBNYXA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzTWFwKHZhbHVlKSAmJiBtYXBUb0VudHJpZXModmFsdWUgYXMgTWFwPHVua25vd24sIHVua25vd24+KSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzUmVnRXhwKHZhbHVlKSAmJiB7XG4gICAgICAgIHNvdXJjZTogcmVnRXhwU291cmNlKHZhbHVlKSxcbiAgICAgICAgZmxhZ3M6IHJlZ0V4cEZsYWdzKHZhbHVlKSxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgYXJlIGludGVudGlvbmFsbHkgTk9UIGluIGNvbW1vbiByZWR1Y2Vycy5cbiAgICAvLyBUaGV5IHJlcXVpcmUgbW9kZS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtIGhhbmRsaW5nLCBldGMuKSBhbmRcbiAgICAvLyBpbmNsdWRpbmcgdGhlbSBoZXJlIHdpdGhvdXQgbWF0Y2hpbmcgcmV2aXZlcnMgd291bGQgY2F1c2UgdGhlbVxuICAgIC8vIHRvIGRlc2VyaWFsaXplIGFzIHBsYWluIG9iamVjdHMuXG4gICAgU2V0OiAodmFsdWUpID0+IHR5cGVzLmlzU2V0KHZhbHVlKSAmJiBzZXRUb1ZhbHVlcyh2YWx1ZSBhcyBTZXQ8dW5rbm93bj4pLFxuICAgIFVSTDogKHZhbHVlKSA9PlxuICAgICAgaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSAmJiB1cmxIcmVmKHZhbHVlIGFzIFVSTCksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQg4oCUIHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSByZWFkUHJvcGVydHkodmFsdWUsICd3b3JrZmxvd0lkJyk7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZSBhcyBVUkxTZWFyY2hQYXJhbXMpO1xuICAgICAgcmV0dXJuIHRleHQgPT09ICcnID8gJy4nIDogdGV4dDtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50OEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc1VpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzVWludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50MzJBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIEhvb2tDb25mbGljdEVycm9yIHwgdW5kZWZpbmVkKSA/PyBIb29rQ29uZmxpY3RFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUudG9rZW4sIHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkge1xuICAgICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJlc29sdmUgZnJvbSB0aGUgY29uc3VtZXIncyBnbG9iYWxUaGlzIChzZWUgdGhlIEZhdGFsRXJyb3IgcmV2aXZlclxuICAgICAgLy8gYWJvdmUpIHNvIGBpbnN0YW5jZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGhvbGRzIGFjcm9zcyByZWFsbXMuXG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgICBdIGFzIHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yO1xuICAgICAgY29uc3Qgb3B0czogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yPlsxXSA9IHt9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIG9wdHMuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIG9wdHMuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDdG9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdVUklFcnJvcicpLFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgdmFsdWUuZXJyb3JzLFxuICAgICAgICB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBvcHRzXG4gICAgICApO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJldml2ZXIg4oCUIHVzZWQgZm9yIHBsYWluIEVycm9yIGluc3RhbmNlcyBhbmQgdW5yZWNvZ25pemVkXG4gICAgLy8gRXJyb3Igc3ViY2xhc3Nlcy4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBlcnJvci5uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuSW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBnbG9iYWwuTWFwKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5SZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBnbG9iYWwuU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5VUkwodmFsdWUpLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT5cbiAgICAgIG5ldyBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gIH07XG59XG5cbi8vIFJlLWV4cG9ydCBmb3IgdXNlIGluIGxlZ2FjeSBjb21wYXRcbmV4cG9ydCB7IHJldml2ZSB9O1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"step-function.d.ts","sourceRoot":"","sources":["../../../src/serialization/reducers/step-function.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAuC1D;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAc,GACvC,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}
1
+ {"version":3,"file":"step-function.d.ts","sourceRoot":"","sources":["../../../src/serialization/reducers/step-function.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAuD1D;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAc,GACvC,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}
@@ -17,19 +17,33 @@
17
17
  * proxy so the caller's captured `this` (and prefilled args) survive the
18
18
  * round trip.
19
19
  */
20
+ import { hasProperty, isUseStepClosureFn, readProperty, recordGuestCode, } from '../hardened.js';
20
21
  // ---- Reducer ----
21
22
  export function getStepFunctionReducer() {
22
23
  return {
23
24
  StepFunction: (value) => {
24
25
  if (typeof value !== 'function')
25
26
  return false;
26
- const stepId = value.stepId;
27
+ const stepId = readProperty(value, 'stepId');
27
28
  if (typeof stepId !== 'string')
28
29
  return false;
29
- const closureVarsFn = value.__closureVarsFn;
30
- const closureVars = closureVarsFn && typeof closureVarsFn === 'function'
31
- ? closureVarsFn()
32
- : undefined;
30
+ const closureVarsFn = readProperty(value, '__closureVarsFn');
31
+ // The reducer has to invoke this to read the step's captured closure
32
+ // variables. The compiler-generated function is a sequence of lexical
33
+ // reads and cannot perturb observable VM state, so reporting it would
34
+ // flag every step that captures a variable — but the property is
35
+ // reachable from workflow code, which can replace it with anything.
36
+ // `step.ts` marks the function that came through `useStep` when it
37
+ // builds the proxy, so this is checked rather than assumed; anything
38
+ // unrecognized is reported like other guest code. See
39
+ // `markUseStepClosureFn` for what the mark does and does not prove.
40
+ let closureVars;
41
+ if (typeof closureVarsFn === 'function') {
42
+ if (!isUseStepClosureFn(closureVarsFn)) {
43
+ recordGuestCode('method', '__closureVarsFn');
44
+ }
45
+ closureVars = closureVarsFn();
46
+ }
33
47
  // `__boundThis` / `__boundArgs` are marker properties added by the
34
48
  // step proxy's overridden `.bind` (see step.ts) to record the
35
49
  // bound receiver and any prefilled arguments. Use `in` for
@@ -37,9 +51,11 @@ export function getStepFunctionReducer() {
37
51
  // `undefined`/`null`. `__boundArgs` is only set when the user
38
52
  // actually supplied prefilled args, so a missing property means
39
53
  // "no prefilled args".
40
- const hasBoundThis = '__boundThis' in value;
41
- const boundThis = hasBoundThis ? value.__boundThis : undefined;
42
- const boundArgs = value.__boundArgs;
54
+ const hasBoundThis = hasProperty(value, '__boundThis');
55
+ const boundThis = hasBoundThis
56
+ ? readProperty(value, '__boundThis')
57
+ : undefined;
58
+ const boundArgs = readProperty(value, '__boundArgs');
43
59
  const payload = { stepId };
44
60
  if (closureVars !== undefined)
45
61
  payload.closureVars = closureVars;
@@ -85,4 +101,4 @@ export function getStepFunctionReviver(global = globalThis) {
85
101
  },
86
102
  };
87
103
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL3N0ZXAtZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUlILG9CQUFvQjtBQUVwQixNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE9BQU87UUFDTCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDOUMsTUFBTSxNQUFNLEdBQUksS0FBYSxDQUFDLE1BQU0sQ0FBQztZQUNyQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFN0MsTUFBTSxhQUFhLEdBQUksS0FBYSxDQUFDLGVBQWUsQ0FBQztZQUNyRCxNQUFNLFdBQVcsR0FDZixhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssVUFBVTtnQkFDbEQsQ0FBQyxDQUFDLGFBQWEsRUFBRTtnQkFDakIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVoQixtRUFBbUU7WUFDbkUsOERBQThEO1lBQzlELDJEQUEyRDtZQUMzRCwrREFBK0Q7WUFDL0QsOERBQThEO1lBQzlELGdFQUFnRTtZQUNoRSx1QkFBdUI7WUFDdkIsTUFBTSxZQUFZLEdBQUcsYUFBYSxJQUFLLEtBQWEsQ0FBQztZQUNyRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFFLEtBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBSSxLQUFhLENBQUMsV0FBb0MsQ0FBQztZQUV0RSxNQUFNLE9BQU8sR0FLVCxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxXQUFXLEtBQUssU0FBUztnQkFBRSxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUNqRSxJQUFJLFlBQVk7Z0JBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxvQkFBb0I7QUFFcEI7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFNBQThCLFVBQVU7SUFFeEMsTUFBTSxPQUFPLEdBQUksTUFBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FLbEQsQ0FBQztJQUVkLE9BQU87UUFDTCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFFdEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0dBQStHLENBQ2hILENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsV0FBVztnQkFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBCLElBQUksV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxPQUFRLEtBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVkdWNlciBhbmQgcmV2aXZlciBmb3Igc3RlcCBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICpcbiAqIEluIHdvcmtmbG93IG1vZGUsIHN0ZXAgZnVuY3Rpb25zIGFyZSByZXBsYWNlZCBieSB0aGUgU1dDIHBsdWdpbiB3aXRoXG4gKiBwcm94aWVzIGNyZWF0ZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXBJZFwiKWAuXG4gKiBUaGVzZSBwcm94aWVzIGhhdmUgYSBgLnN0ZXBJZGAgcHJvcGVydHkgYW5kIG9wdGlvbmFsbHkgYSBgLl9fY2xvc3VyZVZhcnNGbmBcbiAqIGZvciBjYXB0dXJlZCBjbG9zdXJlIHZhcmlhYmxlcy4gVGhleSBtYXkgYWRkaXRpb25hbGx5IGhhdmUgYC5fX2JvdW5kVGhpc2BcbiAqIChhbmQgcmFyZWx5IGAuX19ib3VuZEFyZ3NgKSB3aGVuIHRoZSBTV0MgcGx1Z2luIGVtaXR0ZWRcbiAqIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgZm9yIGEgbmVzdGVkIGFycm93IHN0ZXAgdGhhdCBsZXhpY2FsbHlcbiAqIGNhcHR1cmVkIGB0aGlzYCAoc2VlIGBwYWNrYWdlcy9zd2MtcGx1Z2luLXdvcmtmbG93L3NwZWMubWRgIOKGkiBcIkxleGljYWxcbiAqIGB0aGlzYCBDYXB0dXJlIGluIE5lc3RlZCBBcnJvdyBTdGVwc1wiKS5cbiAqXG4gKiBUaGUgcmVkdWNlciBzZXJpYWxpemVzIHRoZW0gYXNcbiAqICAgYHsgc3RlcElkLCBjbG9zdXJlVmFycz8sIGJvdW5kVGhpcz8sIGJvdW5kQXJncz8gfWAuXG4gKiBUaGUgcmV2aXZlciByZWNvbnN0cnVjdHMgdGhlbSBieSBjYWxsaW5nIFdPUktGTE9XX1VTRV9TVEVQIGFuZCwgd2hlblxuICogYGJvdW5kVGhpc2AgKG9yIGBib3VuZEFyZ3NgKSBpcyBwcmVzZW50LCByZS1iaW5kaW5nIHRoZSByZXN1bHRpbmdcbiAqIHByb3h5IHNvIHRoZSBjYWxsZXIncyBjYXB0dXJlZCBgdGhpc2AgKGFuZCBwcmVmaWxsZWQgYXJncykgc3Vydml2ZSB0aGVcbiAqIHJvdW5kIHRyaXAuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gUmVkdWNlciAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCk6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgc3RlcElkID0gKHZhbHVlIGFzIGFueSkuc3RlcElkO1xuICAgICAgaWYgKHR5cGVvZiBzdGVwSWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzRm4gPSAodmFsdWUgYXMgYW55KS5fX2Nsb3N1cmVWYXJzRm47XG4gICAgICBjb25zdCBjbG9zdXJlVmFycyA9XG4gICAgICAgIGNsb3N1cmVWYXJzRm4gJiYgdHlwZW9mIGNsb3N1cmVWYXJzRm4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGNsb3N1cmVWYXJzRm4oKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBgX19ib3VuZFRoaXNgIC8gYF9fYm91bmRBcmdzYCBhcmUgbWFya2VyIHByb3BlcnRpZXMgYWRkZWQgYnkgdGhlXG4gICAgICAvLyBzdGVwIHByb3h5J3Mgb3ZlcnJpZGRlbiBgLmJpbmRgIChzZWUgc3RlcC50cykgdG8gcmVjb3JkIHRoZVxuICAgICAgLy8gYm91bmQgcmVjZWl2ZXIgYW5kIGFueSBwcmVmaWxsZWQgYXJndW1lbnRzLiBVc2UgYGluYCBmb3JcbiAgICAgIC8vIGBfX2JvdW5kVGhpc2Agc28gd2Ugcm91bmQtdHJpcCBldmVuIHdoZW4gdGhlIGJvdW5kIGB0aGlzYCBpc1xuICAgICAgLy8gYHVuZGVmaW5lZGAvYG51bGxgLiBgX19ib3VuZEFyZ3NgIGlzIG9ubHkgc2V0IHdoZW4gdGhlIHVzZXJcbiAgICAgIC8vIGFjdHVhbGx5IHN1cHBsaWVkIHByZWZpbGxlZCBhcmdzLCBzbyBhIG1pc3NpbmcgcHJvcGVydHkgbWVhbnNcbiAgICAgIC8vIFwibm8gcHJlZmlsbGVkIGFyZ3NcIi5cbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdfX2JvdW5kVGhpcycgaW4gKHZhbHVlIGFzIGFueSk7XG4gICAgICBjb25zdCBib3VuZFRoaXMgPSBoYXNCb3VuZFRoaXMgPyAodmFsdWUgYXMgYW55KS5fX2JvdW5kVGhpcyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJvdW5kQXJncyA9ICh2YWx1ZSBhcyBhbnkpLl9fYm91bmRBcmdzIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgcGF5bG9hZDoge1xuICAgICAgICBzdGVwSWQ6IHN0cmluZztcbiAgICAgICAgY2xvc3VyZVZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICBib3VuZFRoaXM/OiB1bmtub3duO1xuICAgICAgICBib3VuZEFyZ3M/OiB1bmtub3duW107XG4gICAgICB9ID0geyBzdGVwSWQgfTtcbiAgICAgIGlmIChjbG9zdXJlVmFycyAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLmNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnM7XG4gICAgICBpZiAoaGFzQm91bmRUaGlzKSBwYXlsb2FkLmJvdW5kVGhpcyA9IGJvdW5kVGhpcztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGJvdW5kQXJncykgJiYgYm91bmRBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGF5bG9hZC5ib3VuZEFyZ3MgPSBib3VuZEFyZ3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIC0tLS0gUmV2aXZlciAtLS0tXG5cbi8qKlxuICogQ3JlYXRlIHRoZSBTdGVwRnVuY3Rpb24gcmV2aXZlciBmb3Igd29ya2Zsb3cgY29udGV4dC5cbiAqXG4gKiBUaGUgcmV2aXZlciBjYWxscyBXT1JLRkxPV19VU0VfU1RFUCB0byBjcmVhdGUgdGhlIHN0ZXAgcHJveHksXG4gKiByZXN0b3JpbmcgdGhlIGFiaWxpdHkgdG8gY2FsbCB0aGUgc3RlcCBmcm9tIHdvcmtmbG93IGNvZGUuIElmIHRoZVxuICogc2VyaWFsaXplZCBwYXlsb2FkIGluY2x1ZGVzIGBib3VuZFRoaXNgIChhbmQgb3B0aW9uYWxseSBgYm91bmRBcmdzYCksXG4gKiB0aGUgcmV2aXZlciBhbHNvIHJlLWJpbmRzIHRoZSBmcmVzaGx5LWNyZWF0ZWQgcHJveHkgc28gYSBzdGVwIHByb3h5XG4gKiB0aGF0IHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGAuYmluZCh0aGlzLCDigKYpYCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlXG4gKiBjb250aW51ZXMgdG8gY2FycnkgdGhhdCByZWNlaXZlciBhbmQgYW55IHByZWZpbGxlZCBhcmd1bWVudHMgYWZ0ZXJcbiAqIGJlaW5nIGRlc2VyaWFsaXplZCBpbiBhbm90aGVyIGJ1bmRsZSAoZS5nLiB3aGVuIHBhc3NlZCBhcyBhIHN0ZXBcbiAqIGFyZ3VtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0ZXBGdW5jdGlvblJldml2ZXIoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgY29uc3QgdXNlU3RlcCA9IChnbG9iYWwgYXMgYW55KVtTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpXSBhc1xuICAgIHwgKChcbiAgICAgICAgc3RlcElkOiBzdHJpbmcsXG4gICAgICAgIGNsb3N1cmVWYXJzRm4/OiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgKSA9PiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+KVxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgU3RlcEZ1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHN0ZXBJZCA9IHZhbHVlLnN0ZXBJZDtcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gdmFsdWUuY2xvc3VyZVZhcnM7XG5cbiAgICAgIGlmICghdXNlU3RlcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1dPUktGTE9XX1VTRV9TVEVQIG5vdCBmb3VuZCBvbiBnbG9iYWwgb2JqZWN0LiBTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIG91dHNpZGUgd29ya2Zsb3cgY29udGV4dC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3h5ID0gY2xvc3VyZVZhcnNcbiAgICAgICAgPyB1c2VTdGVwKHN0ZXBJZCwgKCkgPT4gY2xvc3VyZVZhcnMpXG4gICAgICAgIDogdXNlU3RlcChzdGVwSWQpO1xuXG4gICAgICBpZiAoJ2JvdW5kVGhpcycgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG4gICAgICAgIHJldHVybiAocHJveHkgYXMgYW55KS5iaW5kKHZhbHVlLmJvdW5kVGhpcywgLi4uYm91bmRBcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm94eTtcbiAgICB9LFxuICB9O1xufVxuIl19
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL3N0ZXAtZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsb0JBQW9CO0FBRXBCLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTztRQUNMLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM5QyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUU3QyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDN0QscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUsaUVBQWlFO1lBQ2pFLG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUscUVBQXFFO1lBQ3JFLHNEQUFzRDtZQUN0RCxvRUFBb0U7WUFDcEUsSUFBSSxXQUFnRCxDQUFDO1lBQ3JELElBQUksT0FBTyxhQUFhLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO29CQUN2QyxlQUFlLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBQ0QsV0FBVyxHQUFJLGFBQStDLEVBQUUsQ0FBQztZQUNuRSxDQUFDO1lBRUQsbUVBQW1FO1lBQ25FLDhEQUE4RDtZQUM5RCwyREFBMkQ7WUFDM0QsK0RBQStEO1lBQy9ELDhEQUE4RDtZQUM5RCxnRUFBZ0U7WUFDaEUsdUJBQXVCO1lBQ3ZCLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDdkQsTUFBTSxTQUFTLEdBQUcsWUFBWTtnQkFDNUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDO2dCQUNwQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2QsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxhQUFhLENBRXRDLENBQUM7WUFFZCxNQUFNLE9BQU8sR0FLVCxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxXQUFXLEtBQUssU0FBUztnQkFBRSxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUNqRSxJQUFJLFlBQVk7Z0JBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxvQkFBb0I7QUFFcEI7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFNBQThCLFVBQVU7SUFFeEMsTUFBTSxPQUFPLEdBQUksTUFBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FLbEQsQ0FBQztJQUVkLE9BQU87UUFDTCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFFdEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0dBQStHLENBQ2hILENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsV0FBVztnQkFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBCLElBQUksV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxPQUFRLEtBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVkdWNlciBhbmQgcmV2aXZlciBmb3Igc3RlcCBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICpcbiAqIEluIHdvcmtmbG93IG1vZGUsIHN0ZXAgZnVuY3Rpb25zIGFyZSByZXBsYWNlZCBieSB0aGUgU1dDIHBsdWdpbiB3aXRoXG4gKiBwcm94aWVzIGNyZWF0ZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXBJZFwiKWAuXG4gKiBUaGVzZSBwcm94aWVzIGhhdmUgYSBgLnN0ZXBJZGAgcHJvcGVydHkgYW5kIG9wdGlvbmFsbHkgYSBgLl9fY2xvc3VyZVZhcnNGbmBcbiAqIGZvciBjYXB0dXJlZCBjbG9zdXJlIHZhcmlhYmxlcy4gVGhleSBtYXkgYWRkaXRpb25hbGx5IGhhdmUgYC5fX2JvdW5kVGhpc2BcbiAqIChhbmQgcmFyZWx5IGAuX19ib3VuZEFyZ3NgKSB3aGVuIHRoZSBTV0MgcGx1Z2luIGVtaXR0ZWRcbiAqIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgZm9yIGEgbmVzdGVkIGFycm93IHN0ZXAgdGhhdCBsZXhpY2FsbHlcbiAqIGNhcHR1cmVkIGB0aGlzYCAoc2VlIGBwYWNrYWdlcy9zd2MtcGx1Z2luLXdvcmtmbG93L3NwZWMubWRgIOKGkiBcIkxleGljYWxcbiAqIGB0aGlzYCBDYXB0dXJlIGluIE5lc3RlZCBBcnJvdyBTdGVwc1wiKS5cbiAqXG4gKiBUaGUgcmVkdWNlciBzZXJpYWxpemVzIHRoZW0gYXNcbiAqICAgYHsgc3RlcElkLCBjbG9zdXJlVmFycz8sIGJvdW5kVGhpcz8sIGJvdW5kQXJncz8gfWAuXG4gKiBUaGUgcmV2aXZlciByZWNvbnN0cnVjdHMgdGhlbSBieSBjYWxsaW5nIFdPUktGTE9XX1VTRV9TVEVQIGFuZCwgd2hlblxuICogYGJvdW5kVGhpc2AgKG9yIGBib3VuZEFyZ3NgKSBpcyBwcmVzZW50LCByZS1iaW5kaW5nIHRoZSByZXN1bHRpbmdcbiAqIHByb3h5IHNvIHRoZSBjYWxsZXIncyBjYXB0dXJlZCBgdGhpc2AgKGFuZCBwcmVmaWxsZWQgYXJncykgc3Vydml2ZSB0aGVcbiAqIHJvdW5kIHRyaXAuXG4gKi9cblxuaW1wb3J0IHtcbiAgaGFzUHJvcGVydHksXG4gIGlzVXNlU3RlcENsb3N1cmVGbixcbiAgcmVhZFByb3BlcnR5LFxuICByZWNvcmRHdWVzdENvZGUsXG59IGZyb20gJy4uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkdWNlcnMsIFJldml2ZXJzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vLyAtLS0tIFJlZHVjZXIgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgU3RlcEZ1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHN0ZXBJZCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0ZXBJZCcpO1xuICAgICAgaWYgKHR5cGVvZiBzdGVwSWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzRm4gPSByZWFkUHJvcGVydHkodmFsdWUsICdfX2Nsb3N1cmVWYXJzRm4nKTtcbiAgICAgIC8vIFRoZSByZWR1Y2VyIGhhcyB0byBpbnZva2UgdGhpcyB0byByZWFkIHRoZSBzdGVwJ3MgY2FwdHVyZWQgY2xvc3VyZVxuICAgICAgLy8gdmFyaWFibGVzLiBUaGUgY29tcGlsZXItZ2VuZXJhdGVkIGZ1bmN0aW9uIGlzIGEgc2VxdWVuY2Ugb2YgbGV4aWNhbFxuICAgICAgLy8gcmVhZHMgYW5kIGNhbm5vdCBwZXJ0dXJiIG9ic2VydmFibGUgVk0gc3RhdGUsIHNvIHJlcG9ydGluZyBpdCB3b3VsZFxuICAgICAgLy8gZmxhZyBldmVyeSBzdGVwIHRoYXQgY2FwdHVyZXMgYSB2YXJpYWJsZSDigJQgYnV0IHRoZSBwcm9wZXJ0eSBpc1xuICAgICAgLy8gcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZSwgd2hpY2ggY2FuIHJlcGxhY2UgaXQgd2l0aCBhbnl0aGluZy5cbiAgICAgIC8vIGBzdGVwLnRzYCBtYXJrcyB0aGUgZnVuY3Rpb24gdGhhdCBjYW1lIHRocm91Z2ggYHVzZVN0ZXBgIHdoZW4gaXRcbiAgICAgIC8vIGJ1aWxkcyB0aGUgcHJveHksIHNvIHRoaXMgaXMgY2hlY2tlZCByYXRoZXIgdGhhbiBhc3N1bWVkOyBhbnl0aGluZ1xuICAgICAgLy8gdW5yZWNvZ25pemVkIGlzIHJlcG9ydGVkIGxpa2Ugb3RoZXIgZ3Vlc3QgY29kZS4gU2VlXG4gICAgICAvLyBgbWFya1VzZVN0ZXBDbG9zdXJlRm5gIGZvciB3aGF0IHRoZSBtYXJrIGRvZXMgYW5kIGRvZXMgbm90IHByb3ZlLlxuICAgICAgbGV0IGNsb3N1cmVWYXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgY2xvc3VyZVZhcnNGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoIWlzVXNlU3RlcENsb3N1cmVGbihjbG9zdXJlVmFyc0ZuKSkge1xuICAgICAgICAgIHJlY29yZEd1ZXN0Q29kZSgnbWV0aG9kJywgJ19fY2xvc3VyZVZhcnNGbicpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3N1cmVWYXJzID0gKGNsb3N1cmVWYXJzRm4gYXMgKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGBfX2JvdW5kVGhpc2AgLyBgX19ib3VuZEFyZ3NgIGFyZSBtYXJrZXIgcHJvcGVydGllcyBhZGRlZCBieSB0aGVcbiAgICAgIC8vIHN0ZXAgcHJveHkncyBvdmVycmlkZGVuIGAuYmluZGAgKHNlZSBzdGVwLnRzKSB0byByZWNvcmQgdGhlXG4gICAgICAvLyBib3VuZCByZWNlaXZlciBhbmQgYW55IHByZWZpbGxlZCBhcmd1bWVudHMuIFVzZSBgaW5gIGZvclxuICAgICAgLy8gYF9fYm91bmRUaGlzYCBzbyB3ZSByb3VuZC10cmlwIGV2ZW4gd2hlbiB0aGUgYm91bmQgYHRoaXNgIGlzXG4gICAgICAvLyBgdW5kZWZpbmVkYC9gbnVsbGAuIGBfX2JvdW5kQXJnc2AgaXMgb25seSBzZXQgd2hlbiB0aGUgdXNlclxuICAgICAgLy8gYWN0dWFsbHkgc3VwcGxpZWQgcHJlZmlsbGVkIGFyZ3MsIHNvIGEgbWlzc2luZyBwcm9wZXJ0eSBtZWFuc1xuICAgICAgLy8gXCJubyBwcmVmaWxsZWQgYXJnc1wiLlxuICAgICAgY29uc3QgaGFzQm91bmRUaGlzID0gaGFzUHJvcGVydHkodmFsdWUsICdfX2JvdW5kVGhpcycpO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzXG4gICAgICAgID8gcmVhZFByb3BlcnR5KHZhbHVlLCAnX19ib3VuZFRoaXMnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJvdW5kQXJncyA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ19fYm91bmRBcmdzJykgYXNcbiAgICAgICAgfCB1bmtub3duW11cbiAgICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgc3RlcElkOiBzdHJpbmc7XG4gICAgICAgIGNsb3N1cmVWYXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgYm91bmRUaGlzPzogdW5rbm93bjtcbiAgICAgICAgYm91bmRBcmdzPzogdW5rbm93bltdO1xuICAgICAgfSA9IHsgc3RlcElkIH07XG4gICAgICBpZiAoY2xvc3VyZVZhcnMgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5jbG9zdXJlVmFycyA9IGNsb3N1cmVWYXJzO1xuICAgICAgaWYgKGhhc0JvdW5kVGhpcykgcGF5bG9hZC5ib3VuZFRoaXMgPSBib3VuZFRoaXM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShib3VuZEFyZ3MpICYmIGJvdW5kQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBheWxvYWQuYm91bmRBcmdzID0gYm91bmRBcmdzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9LFxuICB9O1xufVxuXG4vLyAtLS0tIFJldml2ZXIgLS0tLVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHdvcmtmbG93IGNvbnRleHQuXG4gKlxuICogVGhlIHJldml2ZXIgY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgdG8gY3JlYXRlIHRoZSBzdGVwIHByb3h5LFxuICogcmVzdG9yaW5nIHRoZSBhYmlsaXR5IHRvIGNhbGwgdGhlIHN0ZXAgZnJvbSB3b3JrZmxvdyBjb2RlLiBJZiB0aGVcbiAqIHNlcmlhbGl6ZWQgcGF5bG9hZCBpbmNsdWRlcyBgYm91bmRUaGlzYCAoYW5kIG9wdGlvbmFsbHkgYGJvdW5kQXJnc2ApLFxuICogdGhlIHJldml2ZXIgYWxzbyByZS1iaW5kcyB0aGUgZnJlc2hseS1jcmVhdGVkIHByb3h5IHNvIGEgc3RlcCBwcm94eVxuICogdGhhdCB3YXMgY29uc3RydWN0ZWQgd2l0aCBgLmJpbmQodGhpcywg4oCmKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZVxuICogY29udGludWVzIHRvIGNhcnJ5IHRoYXQgcmVjZWl2ZXIgYW5kIGFueSBwcmVmaWxsZWQgYXJndW1lbnRzIGFmdGVyXG4gKiBiZWluZyBkZXNlcmlhbGl6ZWQgaW4gYW5vdGhlciBidW5kbGUgKGUuZy4gd2hlbiBwYXNzZWQgYXMgYSBzdGVwXG4gKiBhcmd1bWVudCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIGNvbnN0IHVzZVN0ZXAgPSAoZ2xvYmFsIGFzIGFueSlbU3ltYm9sLmZvcignV09SS0ZMT1dfVVNFX1NURVAnKV0gYXNcbiAgICB8ICgoXG4gICAgICAgIHN0ZXBJZDogc3RyaW5nLFxuICAgICAgICBjbG9zdXJlVmFyc0ZuPzogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICkgPT4gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPilcbiAgICB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIFN0ZXBGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzdGVwSWQgPSB2YWx1ZS5zdGVwSWQ7XG4gICAgICBjb25zdCBjbG9zdXJlVmFycyA9IHZhbHVlLmNsb3N1cmVWYXJzO1xuXG4gICAgICBpZiAoIXVzZVN0ZXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdXT1JLRkxPV19VU0VfU1RFUCBub3QgZm91bmQgb24gZ2xvYmFsIG9iamVjdC4gU3RlcCBmdW5jdGlvbnMgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBvdXRzaWRlIHdvcmtmbG93IGNvbnRleHQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm94eSA9IGNsb3N1cmVWYXJzXG4gICAgICAgID8gdXNlU3RlcChzdGVwSWQsICgpID0+IGNsb3N1cmVWYXJzKVxuICAgICAgICA6IHVzZVN0ZXAoc3RlcElkKTtcblxuICAgICAgaWYgKCdib3VuZFRoaXMnIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kQXJncyA9IEFycmF5LmlzQXJyYXkodmFsdWUuYm91bmRBcmdzKSA/IHZhbHVlLmJvdW5kQXJncyA6IFtdO1xuICAgICAgICByZXR1cm4gKHByb3h5IGFzIGFueSkuYmluZCh2YWx1ZS5ib3VuZFRoaXMsIC4uLmJvdW5kQXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJveHk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==