@workflow/web-shared 5.0.0-beta.17 → 5.0.0-beta.18

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 (37) hide show
  1. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  2. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  3. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  4. package/dist/components/new-trace-viewer/components/timeline.d.ts +3 -1
  5. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  6. package/dist/components/new-trace-viewer/components/timeline.js +34 -51
  7. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +14 -0
  8. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -1
  9. package/dist/components/new-trace-viewer/components/use-row-window.js +39 -1
  10. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  11. package/dist/components/new-trace-viewer/trace-viewer.js +87 -23
  12. package/dist/components/new-trace-viewer/utils.d.ts +15 -0
  13. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  14. package/dist/components/new-trace-viewer/utils.js +37 -31
  15. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  16. package/dist/components/sidebar/attribute-panel.js +3 -25
  17. package/dist/components/sidebar/attributes-block.d.ts +1 -1
  18. package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
  19. package/dist/components/sidebar/attributes-block.js +5 -7
  20. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  21. package/dist/lib/hydration.d.ts.map +1 -1
  22. package/dist/lib/hydration.js +6 -1
  23. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  24. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  25. package/dist/lib/zstd-browser-decoder.js +41 -0
  26. package/package.json +4 -3
  27. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  28. package/src/components/new-trace-viewer/components/timeline.tsx +142 -95
  29. package/src/components/new-trace-viewer/components/use-row-window.ts +47 -0
  30. package/src/components/new-trace-viewer/trace-viewer.tsx +108 -23
  31. package/src/components/new-trace-viewer/utils.test.ts +150 -0
  32. package/src/components/new-trace-viewer/utils.ts +61 -34
  33. package/src/components/sidebar/attribute-panel.tsx +5 -43
  34. package/src/components/sidebar/attributes-block.tsx +9 -18
  35. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  36. package/src/lib/hydration.ts +7 -0
  37. package/src/lib/zstd-browser-decoder.ts +42 -0
@@ -392,6 +392,11 @@ function replaceEncryptedAndExpiredWithMarkers(resource) {
392
392
  export async function hydrateResourceIOWithKey(resource, key) {
393
393
  const { hydrateDataWithKey } = await import('@workflow/core/serialization-format');
394
394
  const { importKey } = await import('@workflow/core/encryption');
395
+ // Payloads may be zstd-compressed (the Web DecompressionStream has no zstd);
396
+ // register the WASM-backed browser decoder before hydrating. Idempotent and
397
+ // lazy — the WASM is only compiled when a zstd payload is actually decoded.
398
+ const { ensureZstdDecoderRegistered } = await import('./zstd-browser-decoder.js');
399
+ ensureZstdDecoderRegistered();
395
400
  const cryptoKey = await importKey(key);
396
401
  const revivers = getRevivers();
397
402
  /** Extract original encrypted bytes from a marker or raw Uint8Array, then decrypt + hydrate */
@@ -455,4 +460,4 @@ export function hasEncryptedFields(resource) {
455
460
  }
456
461
  return false;
457
462
  }
458
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oeWRyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsSUFBSSx3QkFBd0IsRUFDN0MsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLEVBQ1IscUJBQXFCLEVBRXJCLHVCQUF1QixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELG9EQUFvRDtBQUNwRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsWUFBWSxFQUVaLGVBQWUsRUFFZix1QkFBdUIsRUFDdkIsVUFBVSxHQUNYLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsOEVBQThFO0FBQzlFLDZCQUE2QjtBQUM3Qiw4RUFBOEU7QUFFOUUsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjO0lBQ3pDLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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TUFBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxRQUFpQjtJQUNsRCxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1RCxNQUFNLENBQUMsR0FBRyxRQUFtQyxDQUFDO0lBRTlDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBb0MsQ0FBQztRQUNsRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdlYi1zcGVjaWZpYyBoeWRyYXRpb24gZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBCcm93c2VyLXNhZmUgcmV2aXZlcnMgdGhhdCB1c2UgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qc1xuICogYEJ1ZmZlcmAgZGVwZW5kZW5jeSkuIFByb2R1Y2VzIGBDbGFzc0luc3RhbmNlUmVmYCBvYmplY3RzIGFuZCBgU3RyZWFtUmVmYFxuICogb2JqZWN0cyBmb3IgVUkgcmVuZGVyaW5nLlxuICovXG5cbmltcG9ydCB7XG4gIGV4dHJhY3RDbGFzc05hbWUsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPIGFzIGh5ZHJhdGVSZXNvdXJjZUlPR2VuZXJpYyxcbiAgaXNFbmNyeXB0ZWREYXRhLFxuICBpc0V4cGlyZWRTdHViLFxuICBpc1J1blJlZixcbiAgb2JzZXJ2YWJpbGl0eVJldml2ZXJzLFxuICB0eXBlIFJldml2ZXJzLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuaW1wb3J0IHsgRVZFTlRfREFUQV9SRUZfRklFTERTIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCB1dGlsaXRpZXMgdGhhdCBjb25zdW1lcnMgbmVlZFxuZXhwb3J0IHtcbiAgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUsXG4gIENsYXNzSW5zdGFuY2VSZWYsXG4gIEVOQ1JZUFRFRF9QTEFDRUhPTERFUixcbiAgZXh0cmFjdFN0cmVhbUlkcyxcbiAgaXNDbGFzc0luc3RhbmNlUmVmLFxuICBpc0VuY3J5cHRlZERhdGEsXG4gIGlzUnVuUmVmLFxuICBpc1N0cmVhbUlkLFxuICBpc1N0cmVhbVJlZixcbiAgdHlwZSBSZXZpdmVycyxcbiAgUlVOX1JFRl9UWVBFLFxuICB0eXBlIFJ1blJlZixcbiAgU1RSRUFNX1JFRl9UWVBFLFxuICB0eXBlIFN0cmVhbVJlZixcbiAgc2VyaWFsaXplZEluc3RhbmNlVG9SZWYsXG4gIHRydW5jYXRlSWQsXG59IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24tZm9ybWF0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCcm93c2VyLXNhZmUgYmFzZTY0IGRlY29kZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0OiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gIGlmIChiYXNlNjQgPT09ICcnIHx8IGJhc2U2NCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgfVxuICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NCk7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5U3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdlYiByZXZpdmVycyAoYnJvd3Nlci1zYWZlLCBubyBCdWZmZXIgZGVwZW5kZW5jeSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1aWxkIGEgcmV2aXZlciBmb3Igb25lIG9mIHRoZSBidWlsdC1pbiBgRXJyb3JgIHN1YmNsYXNzZXMgKGUuZy5cbiAqIGBUeXBlRXJyb3JgLCBgUmFuZ2VFcnJvcmApLiBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBuYW1lZCBzdWJjbGFzcyBpc1xuICogcmVzb2x2ZWQgb2ZmIGBnbG9iYWxUaGlzYCBhdCBjYWxsIHRpbWUgc28gdGhlIHByb2R1Y2VkIGluc3RhbmNlIGhhcyB0aGVcbiAqIGNvcnJlY3QgcHJvdG90eXBlIGNoYWluIGluIHRoZSBjb25zdW1lciByZWFsbS4gRmFsbHMgYmFjayB0byBhIGdlbmVyaWNcbiAqIGBFcnJvcmAgKHdpdGggYG5hbWVgIHNldCkgaWYgdGhlIGdsb2JhbCBpc24ndCBhdmFpbGFibGUsIHdoaWNoIGtlZXBzIHRoZVxuICogbzExeSBVSSByZW5kZXJpbmcgZXZlbiBvbiBleG90aWMgYnJvd3NlcnMuXG4gKlxuICogYGNhdXNlYCBpcyBwYXNzZWQgdGhyb3VnaCBgRXJyb3JPcHRpb25zYCB0byB0aGUgY29uc3RydWN0b3Igd2hlbiBwcmVzZW50LFxuICogbWF0Y2hpbmcgYGdldENvbW1vblJldml2ZXJzYCBpbiBgQHdvcmtmbG93L2NvcmVgIHNvIHRoZSByZXN1bHRpbmcgYGNhdXNlYFxuICogcHJvcGVydHkgaGFzIHRoZSBzYW1lIHNlbWFudGljcyAobm9uLWVudW1lcmFibGUsIHNldCBieSB0aGUgZW5naW5lKSBhcyBhXG4gKiBmcmVzaGx5IHRocm93biBFcnJvciBpbiB0aGUgY29uc3VtZXIgcmVhbG0uIFRoZSBgJ2NhdXNlJyBpbiB2YWx1ZWAgY2hlY2tcbiAqIHByZXNlcnZlcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBcIm5vIGNhdXNlXCIgYW5kIFwiY2F1c2UgaXMgdW5kZWZpbmVkXCIuXG4gKi9cbmZ1bmN0aW9uIG1ha2VXZWJFcnJvclN1YmNsYXNzUmV2aXZlcihcbiAgbmFtZTpcbiAgICB8ICdFdmFsRXJyb3InXG4gICAgfCAnUmFuZ2VFcnJvcidcbiAgICB8ICdSZWZlcmVuY2VFcnJvcidcbiAgICB8ICdTeW50YXhFcnJvcidcbiAgICB8ICdUeXBlRXJyb3InXG4gICAgfCAnVVJJRXJyb3InXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfSkgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBDdG9yID0gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN0cmluZywgYW55PilbbmFtZV0gYXNcbiAgICAgIHwgRXJyb3JDb25zdHJ1Y3RvclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVycm9yOiBFcnJvcjtcbiAgICBpZiAodHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrIHBhdGg6IG5vIGJ1aWx0LWluIHN1YmNsYXNzIGF2YWlsYWJsZSAoZXhvdGljIGVudikuIENvbnN0cnVjdFxuICAgICAgLy8gYSBwbGFpbiBFcnJvciB3aXRoIHRoZSByaWdodCBgbmFtZWAgYW5kIGNvcHkgYGNhdXNlYCBtYW51YWxseSBzaW5jZVxuICAgICAgLy8gdGhlIGJhc2UgRXJyb3IgY29uc3RydWN0b3IgaXMgd2hhdCB3ZSBhY3R1YWxseSBjYWxsZWQuXG4gICAgICBlcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpLCB7IG5hbWUgfSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdlYi1zcGVjaWZpYyByZXZpdmVycyBmb3IgaHlkcmF0aW5nIHNlcmlhbGl6ZWQgZGF0YS5cbiAqXG4gKiBVc2VzIGBhdG9iKClgIGZvciBiYXNlNjQgZGVjb2RpbmcgKG5vIE5vZGUuanMgQnVmZmVyIGRlcGVuZGVuY3kpLlxuICogQWxsIHR5cGVzIGFyZSByZXZpdmVkIGFzIHJlYWwgaW5zdGFuY2VzIChEYXRlLCBNYXAsIFNldCwgVVJMLFxuICogVVJMU2VhcmNoUGFyYW1zLCBIZWFkZXJzLCBFcnJvciwgZXRjLikuXG4gKlxuICogTk9URTogdGhpcyBzZXQgbXVzdCBtaXJyb3IgdGhlIGtleXMgaW4gYFNlcmlhbGl6YWJsZVNwZWNpYWxgIChzZWVcbiAqIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uL3R5cGVzYCkuIEFueSByZWR1Y2VyIGtleSBhZGRlZCBvbiB0aGVcbiAqIHNlcmlhbGl6YXRpb24gc2lkZSB0aGF0IGlzbid0IGNvdmVyZWQgaGVyZSB3aWxsIGNhdXNlIGBkZXZhbHVlLnVuZmxhdHRlbmBcbiAqIHRvIHRocm93IGBVbmtub3duIHR5cGUgWGAsIHdoaWNoIGBoeWRyYXRlUmVzb3VyY2VJT2Agc3dhbGxvd3MgYW5kXG4gKiBzdXJmYWNlcyBhcyBhIFwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgZGV0YWlsc1wiIGJhbm5lciBpbiB0aGUgbzExeSBVSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlJldml2ZXJzKCk6IFJldml2ZXJzIHtcbiAgZnVuY3Rpb24gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWU6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgICByZXR1cm4gYmFzZTY0VG9BcnJheUJ1ZmZlcih2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIE8xMXktc3BlY2lmaWMgcmV2aXZlcnMgKHN0cmVhbXMsIHN0ZXAgZnVuY3Rpb25zIOKGkiBkaXNwbGF5IG9iamVjdHMpLlxuICAgIC8vIFNwcmVhZCBGSVJTVCBzbyB3ZWItc3BlY2lmaWMgb3ZlcnJpZGVzIGJlbG93IHRha2UgcHJlY2VkZW5jZS5cbiAgICAuLi5vYnNlcnZhYmlsaXR5UmV2aXZlcnMsXG5cbiAgICAvLyBCaW5hcnkgdHlwZXNcbiAgICBBcnJheUJ1ZmZlcjogcmV2aXZlQXJyYXlCdWZmZXIsXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gQmlnSW50KHZhbHVlKSxcbiAgICBCaWdJbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBCaWdJbnQ2NEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgQmlnVWludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IEJpZ1VpbnQ2NEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgRGF0ZTogKHZhbHVlKSA9PiBuZXcgRGF0ZSh2YWx1ZSksXG5cbiAgICAvLyBFcnJvciBmYW1pbHkuIFRoZSByZWR1Y2VyIHNpZGUgKHNlZVxuICAgIC8vIGBwYWNrYWdlcy9jb3JlL3NyYy9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi50c2ApIGVtaXRzIGEgdGFnZ2VkXG4gICAgLy8gZW50cnkgZm9yIGVhY2ggYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3MgcGx1cyB0aGUgd29ya2Zsb3ctc3BlY2lmaWNcbiAgICAvLyBgRmF0YWxFcnJvcmAgLyBgUmV0cnlhYmxlRXJyb3JgIC8gYEhvb2tDb25mbGljdEVycm9yYCAvXG4gICAgLy8gYFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGFuZCBgQWdncmVnYXRlRXJyb3JgLiBXaXRob3V0XG4gICAgLy8gbWF0Y2hpbmcgcmV2aXZlcnMgaGVyZSwgYGRldmFsdWUudW5mbGF0dGVuYCB0aHJvd3MgXCJVbmtub3duIHR5cGUgWFwiXG4gICAgLy8g4oCUIHdoaWNoIHN1cmZhY2VzIGluIHRoZSB3ZWIgbzExeSBVSSBhcyBcIkZhaWxlZCB0byBsb2FkIHJlc291cmNlXG4gICAgLy8gZGV0YWlsczogVW5rbm93biB0eXBlIEZhdGFsRXJyb3JcIi5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBFdmFsRXJyb3I6IG1ha2VXZWJFcnJvclN1YmNsYXNzUmV2aXZlcignRXZhbEVycm9yJyksXG4gICAgUmFuZ2VFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG1ha2VXZWJFcnJvclN1YmNsYXNzUmV2aXZlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICBTeW50YXhFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdTeW50YXhFcnJvcicpLFxuICAgIFR5cGVFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdVUklFcnJvcicpLFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IEN0b3IgPSAoXG4gICAgICAgIGdsb2JhbFRoaXMgYXMgeyBBZ2dyZWdhdGVFcnJvcj86IEFnZ3JlZ2F0ZUVycm9yQ29uc3RydWN0b3IgfVxuICAgICAgKS5BZ2dyZWdhdGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID1cbiAgICAgICAgdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IG5ldyBDdG9yKHZhbHVlLmVycm9ycywgdmFsdWUubWVzc2FnZSwgb3B0cylcbiAgICAgICAgICA6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpLCB7XG4gICAgICAgICAgICAgIG5hbWU6ICdBZ2dyZWdhdGVFcnJvcicsXG4gICAgICAgICAgICAgIGVycm9yczogdmFsdWUuZXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWluIGJyb3dzZXIgZ2xvYmFscyxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZXNvbHZlIGEgY29uc3RydWN0b3IgZnJvbSBnbG9iYWxUaGlzLiBUaGUgd2ViIG8xMXkgVUlcbiAgICAvLyBkb2Vzbid0IG5lZWQgYGluc3RhbmNlb2YgRmF0YWxFcnJvcmAgdG8gcGFzcyAobm8gdXNlciBjb2RlIHJ1bnNcbiAgICAvLyBoZXJlKSDigJQgaXQganVzdCBuZWVkcyBgbmFtZWAsIGBtZXNzYWdlYCwgYHN0YWNrYCwgYW5kIGFueSBleHRyYVxuICAgIC8vIGVudW1lcmFibGUgZmllbGRzIHRvIHJlbmRlci4gQ29uc3RydWN0IGEgcGxhaW4gYEVycm9yYCB3aXRoIGBuYW1lYFxuICAgIC8vIHNldDsgT2JqZWN0SW5zcGVjdG9yIHJlYWRzIGBjb25zdHJ1Y3Rvci5uYW1lYCBmb3IgdGhlIGRpc3BsYXllZFxuICAgIC8vIGNsYXNzIGxhYmVsLCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVhbCBjbGFzcywgc28gd2UgZW1pdCBhIHRhZ2dlZFxuICAgIC8vIEVycm9yIHdob3NlIGBuYW1lYCBmaWVsZCBjYXJyaWVzIHRoZSBjbGFzcyBpZGVudGl0eS4gVGhpcyBtYXRjaGVzXG4gICAgLy8gaG93IHRoZSBleGlzdGluZyBiYXNlIGBFcnJvcmAgcmV2aXZlciBwcmVzZW50cyB1bmtub3duIHN1YmNsYXNzZXMuXG4gICAgRmF0YWxFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnRmF0YWxFcnJvcic7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEhvb2tDb25mbGljdEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpIGFzIEVycm9yICYge1xuICAgICAgICB0b2tlbj86IHN0cmluZztcbiAgICAgICAgY29uZmxpY3RpbmdSdW5JZD86IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnJvci5uYW1lID0gJ0hvb2tDb25mbGljdEVycm9yJztcbiAgICAgIGVycm9yLnRva2VuID0gdmFsdWUudG9rZW47XG4gICAgICBpZiAodmFsdWUuY29uZmxpY3RpbmdSdW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yLmNvbmZsaWN0aW5nUnVuSWQgPSB2YWx1ZS5jb25mbGljdGluZ1J1bklkO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKSBhcyBFcnJvciAmIHtcbiAgICAgICAgcmV0cnlBZnRlcj86IERhdGU7XG4gICAgICB9O1xuICAgICAgZXJyb3IubmFtZSA9ICdSZXRyeWFibGVFcnJvcic7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIC8vIGByZXRyeUFmdGVyYCBpcyBzZXJpYWxpemVkIGFzIGFuIGVwb2NoIG1zIG51bWJlciAoc2VlIHRoZSBydW50aW1lXG4gICAgICAvLyBSZXRyeWFibGVFcnJvciByZWR1Y2VyIGZvciB0aGUgcmF0aW9uYWxlIGFyb3VuZCByZWFsbS1zYWZldHkpLlxuICAgICAgLy8gUmVoeWRyYXRlIGFzIGEgRGF0ZSBzbyBvMTF5IGNvbnN1bWVycyBjYW4gcmVuZGVyIGl0IGRpcmVjdGx5LlxuICAgICAgLy8gR3VhcmQgYWdhaW5zdCBwYXlsb2FkcyBmcm9tIG9sZGVyIHJ1bnRpbWUgdmVyc2lvbnMgdGhhdCBwcmVkYXRlXG4gICAgICAvLyB0aGUgZmllbGQg4oCUIHdpdGhvdXQgdGhpcyBjaGVjaywgYG5ldyBEYXRlKHVuZGVmaW5lZClgIHdvdWxkXG4gICAgICAvLyBwcm9kdWNlIGFuIEludmFsaWQgRGF0ZSByYXRoZXIgdGhhbiBvbWl0dGluZyB0aGUgcHJvcGVydHkuXG4gICAgICBpZiAodmFsdWUucmV0cnlBZnRlciAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yLnJldHJ5QWZ0ZXIgPSBuZXcgRGF0ZSh2YWx1ZS5yZXRyeUFmdGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cykgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvbnRleHQ/OiB1bmtub3duO1xuICAgICAgfTtcbiAgICAgIGVycm9yLm5hbWUgPSAnUnVudGltZURlY3J5cHRpb25FcnJvcic7XG4gICAgICBpZiAodmFsdWUuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gTW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlIDE4KyBleHBvc2UgYERPTUV4Y2VwdGlvbmAgb24gZ2xvYmFsVGhpcy5cbiAgICAgIC8vIGBBYm9ydENvbnRyb2xsZXIuYWJvcnQoKWAgd2l0aCBubyBhcmd1bWVudCBzeW50aGVzaXplcyBvbmUgYXMgdGhlXG4gICAgICAvLyBzaWduYWwncyByZWFzb24sIHNvIHRoaXMgaXMgYSBjb21tb24gcGF5bG9hZCBmb3IgYW55IGFib3J0ZWQgc3RlcC5cbiAgICAgIGNvbnN0IEcgPSBnbG9iYWxUaGlzIGFzIHsgRE9NRXhjZXB0aW9uPzogdHlwZW9mIERPTUV4Y2VwdGlvbiB9O1xuICAgICAgaWYgKHR5cGVvZiBHLkRPTUV4Y2VwdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBlID0gbmV3IEcuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZS5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGUgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkge1xuICAgICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBGbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgSW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBNYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgUmVnRXhwKHZhbHVlLnNvdXJjZSwgdmFsdWUuZmxhZ3MpLFxuICAgIFNldDogKHZhbHVlKSA9PiBuZXcgU2V0KHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgVWludDhDbGFtcGVkQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBVaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG5cbiAgICBIZWFkZXJzOiAodmFsdWUpID0+IG5ldyBIZWFkZXJzKHZhbHVlKSxcbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlQXJyb3dGdW5jdGlvbjogYXJyb3cgZnVuY3Rpb25zIGhhdmUgbm8gLnByb3RvdHlwZVxuICAgICAgY29uc3QgY3RvciA9IHsgUmVxdWVzdDogZnVuY3Rpb24gKCkge30gfS5SZXF1ZXN0ITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgbWV0aG9kOiB2YWx1ZS5tZXRob2QsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICAgIC4uLih2YWx1ZS5yZXNwb25zZVdyaXRhYmxlXG4gICAgICAgICAgPyB7IHJlc3BvbnNlV3JpdGFibGU6IHZhbHVlLnJlc3BvbnNlV3JpdGFibGUgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBSZXNwb25zZTogZnVuY3Rpb24gKCkge30gfS5SZXNwb25zZSE7XG4gICAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2JqLCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICB1cmw6IHZhbHVlLnVybCxcbiAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIHJlZGlyZWN0ZWQ6IHZhbHVlLnJlZGlyZWN0ZWQsXG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IFVSTCh2YWx1ZSksXG4gICAgVVJMU2VhcmNoUGFyYW1zOiAodmFsdWUpID0+IG5ldyBVUkxTZWFyY2hQYXJhbXModmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWUpLFxuXG4gICAgLy8gV2ViLXNwZWNpZmljIG92ZXJyaWRlcyBmb3IgY2xhc3MgaW5zdGFuY2VzLlxuICAgIC8vIENyZWF0ZSBvYmplY3RzIHdpdGggYSBkeW5hbWljYWxseS1uYW1lZCBjb25zdHJ1Y3RvciBzbyB0aGF0XG4gICAgLy8gcmVhY3QtaW5zcGVjdG9yIHNob3dzIHRoZSBjbGFzcyBuYW1lIChpdCByZWFkcyBjb25zdHJ1Y3Rvci5uYW1lKS5cbiAgICBDbGFzczogKHZhbHVlKSA9PiBgPGNsYXNzOiR7ZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKX0+YCxcbiAgICBJbnN0YW5jZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBSdW4gaW5zdGFuY2VzIGFyZSByZW5kZXJlZCBhcyBjbGlja2FibGUgUnVuUmVmIGJhZGdlc1xuICAgICAgY29uc3QgcnVuUmVmID0gc2VyaWFsaXplZEluc3RhbmNlVG9SZWYodmFsdWUpO1xuICAgICAgaWYgKGlzUnVuUmVmKHJ1blJlZikpIHtcbiAgICAgICAgcmV0dXJuIHJ1blJlZjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGV4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCk7XG4gICAgICBjb25zdCBkYXRhID0gdmFsdWUuZGF0YTtcbiAgICAgIGNvbnN0IHByb3BzID1cbiAgICAgICAgZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyB7IC4uLmRhdGEgfSA6IHsgdmFsdWU6IGRhdGEgfTtcbiAgICAgIC8vIENyZWF0ZSBhIGNvbnN0cnVjdG9yIHdpdGggdGhlIHJpZ2h0IG5hbWUgdXNpbmcgY29tcHV0ZWQgcHJvcGVydHlcbiAgICAgIC8vIHNvIHJlYWN0LWluc3BlY3RvcidzIGBvYmplY3QuY29uc3RydWN0b3IubmFtZWAgc2hvd3MgdGhlIGNsYXNzIG5hbWUuXG4gICAgICAvLyBNdXN0IHVzZSBgZnVuY3Rpb25gIChub3QgYXJyb3cpIGJlY2F1c2UgYXJyb3cgZnVuY3Rpb25zIGhhdmUgbm8gLnByb3RvdHlwZS5cbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlQXJyb3dGdW5jdGlvbjogYXJyb3cgZnVuY3Rpb25zIGhhdmUgbm8gLnByb3RvdHlwZVxuICAgICAgY29uc3QgY3RvciA9IHsgW2NsYXNzTmFtZV06IGZ1bmN0aW9uICgpIHt9IH1bY2xhc3NOYW1lXSE7XG4gICAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2JqLCBwcm9wcyk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHJlLWJ1aWx0IHdlYiByZXZpdmVycyAoY2FjaGVkIGZvciBwZXJmb3JtYW5jZSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5sZXQgY2FjaGVkUmV2aXZlcnM6IFJldml2ZXJzIHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGdldFJldml2ZXJzKCk6IFJldml2ZXJzIHtcbiAgaWYgKCFjYWNoZWRSZXZpdmVycykge1xuICAgIGNhY2hlZFJldml2ZXJzID0gZ2V0V2ViUmV2aXZlcnMoKTtcbiAgfVxuICByZXR1cm4gY2FjaGVkUmV2aXZlcnM7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIEFQSVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhIHJlc291cmNlIGZvciB3ZWIgZGlzcGxheS5cbiAqXG4gKiBVc2VzIGJyb3dzZXItc2FmZSByZXZpdmVycyAoYXRvYiBmb3IgYmFzZTY0LCBDbGFzc0luc3RhbmNlUmVmIGZvclxuICogY3VzdG9tIGNsYXNzZXMsIFN0cmVhbVJlZiBmb3Igc3RyZWFtcykuIENhbGwgdGhpcyBvbiBkYXRhIHJlY2VpdmVkXG4gKiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gVUkgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVSZXNvdXJjZUlPPFQ+KHJlc291cmNlOiBUKTogVCB7XG4gIGNvbnN0IGh5ZHJhdGVkID0gaHlkcmF0ZVJlc291cmNlSU9HZW5lcmljKFxuICAgIHJlc291cmNlIGFzIGFueSxcbiAgICBnZXRSZXZpdmVycygpXG4gICkgYXMgVDtcbiAgcmV0dXJuIHJlcGxhY2VFbmNyeXB0ZWRBbmRFeHBpcmVkV2l0aE1hcmtlcnMoaHlkcmF0ZWQpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY3J5cHRlZCBkYXRhIGRpc3BsYXkgbWFya2Vyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBFTkNSWVBURURfRElTUExBWV9OQU1FID0gJ0VuY3J5cHRlZCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZGlzcGxheS1mcmllbmRseSBvYmplY3QgZm9yIGVuY3J5cHRlZCBkYXRhLlxuICpcbiAqIFVzZXMgdGhlIHNhbWUgbmFtZWQtY29uc3RydWN0b3IgdHJpY2sgYXMgdGhlIEluc3RhbmNlIHJldml2ZXIgc28gdGhhdFxuICogT2JqZWN0SW5zcGVjdG9yIHJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgKFwi8J+UkiBFbmNyeXB0ZWRcIikgd2l0aCBub1xuICogZXhwYW5kYWJsZSBjaGlsZHJlbi4gVGhlIG9yaWdpbmFsIGVuY3J5cHRlZCBieXRlcyBhcmUgc3RvcmVkIGluIGFcbiAqIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IGZvciBsYXRlciBkZWNyeXB0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbmNyeXB0ZWRNYXJrZXIoZGF0YTogVWludDhBcnJheSk6IG9iamVjdCB7XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlQXJyb3dGdW5jdGlvbjogYXJyb3cgZnVuY3Rpb25zIGhhdmUgbm8gLnByb3RvdHlwZVxuICBjb25zdCBjdG9yID0geyBbRU5DUllQVEVEX0RJU1BMQVlfTkFNRV06IGZ1bmN0aW9uICgpIHt9IH1bXG4gICAgRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICBdITtcbiAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG4gIC8vIFN0b3JlIG9yaWdpbmFsIGJ5dGVzIGZvciBkZWNyeXB0aW9uLCBidXQgbm9uLWVudW1lcmFibGUgc29cbiAgLy8gT2JqZWN0SW5zcGVjdG9yIGRvZXNuJ3Qgc2hvdyB0aGVtIGFzIGNoaWxkcmVuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICdfX2VuY3J5cHRlZERhdGEnLCB7XG4gICAgdmFsdWU6IGRhdGEsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGFuIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlciAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUVcbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBpcmVkIGRhdGEgZGlzcGxheSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IEVYUElSRURfRElTUExBWV9OQU1FID0gJ0V4cGlyZWQgRGF0YSc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZGlzcGxheS1mcmllbmRseSBvYmplY3QgZm9yIGV4cGlyZWQgZGF0YS5cbiAqXG4gKiBVc2VzIHRoZSBzYW1lIG5hbWVkLWNvbnN0cnVjdG9yIHRyaWNrIGFzIHRoZSBlbmNyeXB0ZWQgbWFya2VyIHNvIHRoYXRcbiAqIE9iamVjdEluc3BlY3RvciByZW5kZXJzIHRoZSBjb25zdHJ1Y3RvciBuYW1lIChcIkV4cGlyZWQgRGF0YVwiKSB3aXRoIG5vXG4gKiBleHBhbmRhYmxlIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFeHBpcmVkTWFya2VyKCk6IG9iamVjdCB7XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlQXJyb3dGdW5jdGlvbjogYXJyb3cgZnVuY3Rpb25zIGhhdmUgbm8gLnByb3RvdHlwZVxuICBjb25zdCBjdG9yID0geyBbRVhQSVJFRF9ESVNQTEFZX05BTUVdOiBmdW5jdGlvbiAoKSB7fSB9W1xuICAgIEVYUElSRURfRElTUExBWV9OQU1FXG4gIF0hO1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGFuIGV4cGlyZWQgZGF0YSBkaXNwbGF5IG1hcmtlciAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwaXJlZE1hcmtlcih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lID09PSBFWFBJUkVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vKiogUmVwbGFjZSBhIHNpbmdsZSBmaWVsZCB2YWx1ZSB3aXRoIGEgZGlzcGxheSBtYXJrZXIgaWYgaXQncyBlbmNyeXB0ZWQgb3IgZXhwaXJlZC4gKi9cbmZ1bmN0aW9uIHRvRGlzcGxheU1hcmtlcih2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoaXNFbmNyeXB0ZWREYXRhKHZhbHVlKSkgcmV0dXJuIGNyZWF0ZUVuY3J5cHRlZE1hcmtlcih2YWx1ZSBhcyBVaW50OEFycmF5KTtcbiAgaWYgKGlzRXhwaXJlZFN0dWIodmFsdWUpKSByZXR1cm4gY3JlYXRlRXhwaXJlZE1hcmtlcigpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUG9zdC1wcm9jZXNzIGh5ZHJhdGVkIHJlc291cmNlIGRhdGE6IHJlcGxhY2UgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdmFsdWVzXG4gKiBhbmQgZXhwaXJlZCBzdHVicyB3aXRoIGRpc3BsYXktZnJpZW5kbHkgbWFya2VyIG9iamVjdHMgaW4ga25vd24gZGF0YSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VFbmNyeXB0ZWRBbmRFeHBpcmVkV2l0aE1hcmtlcnM8VD4ocmVzb3VyY2U6IFQpOiBUIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gcmVzb3VyY2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIHJlc3VsdFtrZXldID0gdG9EaXNwbGF5TWFya2VyKHJlc3VsdFtrZXldKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQuZXZlbnREYXRhICYmIHR5cGVvZiByZXN1bHQuZXZlbnREYXRhID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9XG4gICAgICB0eXBlb2YgcmVzdWx0LmV2ZW50VHlwZSA9PT0gJ3N0cmluZycgPyByZXN1bHQuZXZlbnRUeXBlIDogJyc7XG4gICAgY29uc3QgcmVmS2V5cyA9IEVWRU5UX0RBVEFfUkVGX0ZJRUxEU1tldmVudFR5cGVdID8/IFtdO1xuICAgIGNvbnN0IGVkID0geyAuLi4ocmVzdWx0LmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkKSB7XG4gICAgICAgIGVkW2tleV0gPSB0b0Rpc3BsYXlNYXJrZXIoZWRba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBlZDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgVDtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIHJlc291cmNlIGRhdGEgd2l0aCBkZWNyeXB0aW9uIHN1cHBvcnQuXG4gKlxuICogV2hlbiBhIGtleSBpcyBwcm92aWRlZCwgZW5jcnlwdGVkIGZpZWxkcyBhcmUgZGVjcnlwdGVkIGJlZm9yZSBoeWRyYXRpb24uXG4gKiBUaGlzIGlzIHRoZSBhc3luYyB2ZXJzaW9uIHVzZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJEZWNyeXB0XCIgaW4gdGhlIHdlYiBVSS5cbiAqXG4gKiBIYW5kbGVzIGJvdGggdG9wLWxldmVsIGZpZWxkcyAoaW5wdXQsIG91dHB1dCwgbWV0YWRhdGEpIGFuZCBuZXN0ZWRcbiAqIGV2ZW50RGF0YSBzdWJmaWVsZHMgcGVyIGBFVkVOVF9EQVRBX1JFRl9GSUVMRFNgIGZyb20gYEB3b3JrZmxvdy93b3JsZGAgZm9yIHRoYXQgZXZlbnQgdHlwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVSZXNvdXJjZUlPV2l0aEtleTxUPihcbiAgcmVzb3VyY2U6IFQsXG4gIGtleTogVWludDhBcnJheVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgaHlkcmF0ZURhdGFXaXRoS2V5IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24tZm9ybWF0J1xuICApO1xuICBjb25zdCB7IGltcG9ydEtleSB9ID0gYXdhaXQgaW1wb3J0KCdAd29ya2Zsb3cvY29yZS9lbmNyeXB0aW9uJyk7XG4gIGNvbnN0IGNyeXB0b0tleSA9IGF3YWl0IGltcG9ydEtleShrZXkpO1xuICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzKCk7XG5cbiAgLyoqIEV4dHJhY3Qgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGZyb20gYSBtYXJrZXIgb3IgcmF3IFVpbnQ4QXJyYXksIHRoZW4gZGVjcnlwdCArIGh5ZHJhdGUgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdEZpZWxkKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHJldjogUmV2aXZlcnMsXG4gICAgazogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnRLZXk+PlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBBbHJlYWR5LWh5ZHJhdGVkOiBlbmNyeXB0ZWQgbWFya2VyIHdpdGggc3RvcmVkIGJ5dGVzXG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgY29uc3QgcmF3ID0gKHZhbHVlIGFzIGFueSkuX19lbmNyeXB0ZWREYXRhIGFzIFVpbnQ4QXJyYXk7XG4gICAgICByZXR1cm4gaHlkcmF0ZURhdGFXaXRoS2V5KHJhdywgcmV2LCBrKTtcbiAgICB9XG4gICAgLy8gUmF3IGVuY3J5cHRlZCBVaW50OEFycmF5IChub3QgeWV0IGh5ZHJhdGVkKVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YVdpdGhLZXkodmFsdWUsIHJldiwgayk7XG4gICAgfVxuICAgIC8vIE5vdCBlbmNyeXB0ZWQg4oCUIHJldHVybiBhcy1pc1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgdG9wLWxldmVsIHNlcmlhbGl6ZWQgZmllbGRzIChydW5zLCBzdGVwcywgaG9va3MpXG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIGlmIChmaWVsZCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBhd2FpdCBkZWNyeXB0RmllbGQocmVzdWx0W2ZpZWxkXSwgcmV2aXZlcnMsIGNyeXB0b0tleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgZXZlbnREYXRhIHN1YmZpZWxkcyAoZXZlbnRzKVxuICBpZiAocmVzdWx0LmV2ZW50RGF0YSAmJiB0eXBlb2YgcmVzdWx0LmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPVxuICAgICAgdHlwZW9mIHJlc3VsdC5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gcmVzdWx0LmV2ZW50VHlwZSA6ICcnO1xuICAgIGNvbnN0IHJlZktleXMgPSBFVkVOVF9EQVRBX1JFRl9GSUVMRFNbZXZlbnRUeXBlXSA/PyBbXTtcbiAgICBjb25zdCBldmVudERhdGEgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgcmVmS2V5cykge1xuICAgICAgaWYgKGZpZWxkIGluIGV2ZW50RGF0YSkge1xuICAgICAgICBldmVudERhdGFbZmllbGRdID0gYXdhaXQgZGVjcnlwdEZpZWxkKFxuICAgICAgICAgIGV2ZW50RGF0YVtmaWVsZF0sXG4gICAgICAgICAgcmV2aXZlcnMsXG4gICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBldmVudERhdGE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIFQ7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGh5ZHJhdGVkIHJlc291cmNlIChldmVudCwgc3RlcCwgcnVuLCBldGMuKSBjb250YWlucyBhbnlcbiAqIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlcnMuIEluc3BlY3RzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgZmllbGRzXG4gKiAoYGlucHV0YCwgYG91dHB1dGAsIGBlcnJvcmAsIGBtZXRhZGF0YWApIGFzIHdlbGwgYXMgdGhlIGV2ZW50LXR5cGUtc3BlY2lmaWNcbiAqIGBldmVudERhdGFgIHJlZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNyeXB0ZWRGaWVsZHMocmVzb3VyY2U6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHJba2V5XSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHIuZXZlbnREYXRhICYmIHR5cGVvZiByLmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlb2Ygci5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gci5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gICAgY29uc3QgZWQgPSByLmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkICYmIGlzRW5jcnlwdGVkTWFya2VyKGVkW2tleV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oeWRyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsSUFBSSx3QkFBd0IsRUFDN0MsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLEVBQ1IscUJBQXFCLEVBRXJCLHVCQUF1QixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELG9EQUFvRDtBQUNwRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsWUFBWSxFQUVaLGVBQWUsRUFFZix1QkFBdUIsRUFDdkIsVUFBVSxHQUNYLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsOEVBQThFO0FBQzlFLDZCQUE2QjtBQUM3Qiw4RUFBOEU7QUFFOUUsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjO0lBQ3pDLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDdEIsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxvREFBb0Q7QUFDcEQsOEVBQThFO0FBRTlFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLDJCQUEyQixDQUNsQyxJQU1jO0lBRWQsT0FBTyxDQUFDLEtBQTJELEVBQUUsRUFBRTtRQUNyRSxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNuRSxNQUFNLElBQUksR0FBSSxVQUFrQyxDQUFDLElBQUksQ0FFeEMsQ0FBQztRQUNkLElBQUksS0FBWSxDQUFDO1FBQ2pCLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDL0IsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTix3RUFBd0U7WUFDeEUsc0VBQXNFO1lBQ3RFLHlEQUF5RDtZQUN6RCxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhO1FBQ3RDLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELE9BQU87UUFDTCxzRUFBc0U7UUFDdEUsZ0VBQWdFO1FBQ2hFLEdBQUcscUJBQXFCO1FBRXhCLGVBQWU7UUFDZixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN4QyxhQUFhLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUMvQixJQUFJLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxjQUFjLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNoQyxJQUFJLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVoQyxzQ0FBc0M7UUFDdEMsdUVBQXVFO1FBQ3ZFLG9FQUFvRTtRQUNwRSwwREFBMEQ7UUFDMUQseURBQXlEO1FBQ3pELHNFQUFzRTtRQUN0RSxrRUFBa0U7UUFDbEUscUNBQXFDO1FBQ3JDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDeEIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELFNBQVMsRUFBRSwyQkFBMkIsQ0FBQyxXQUFXLENBQUM7UUFDbkQsVUFBVSxFQUFFLDJCQUEyQixDQUFDLFlBQVksQ0FBQztRQUNyRCxjQUFjLEVBQUUsMkJBQTJCLENBQUMsZ0JBQWdCLENBQUM7UUFDN0QsV0FBVyxFQUFFLDJCQUEyQixDQUFDLGFBQWEsQ0FBQztRQUN2RCxTQUFTLEVBQUUsMkJBQTJCLENBQUMsV0FBVyxDQUFDO1FBQ25ELFFBQVEsRUFBRSwyQkFBMkIsQ0FBQyxVQUFVLENBQUM7UUFDakQsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxJQUFJLEdBQ1IsVUFDRCxDQUFDLGNBQWMsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FDVCxPQUFPLElBQUksS0FBSyxVQUFVO2dCQUN4QixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDNUMsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2lCQUNyQixDQUFDLENBQUM7WUFDVCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0Qsc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSxrRUFBa0U7UUFDbEUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLG9FQUFvRTtRQUNwRSxxRUFBcUU7UUFDckUsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QyxLQUFLLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztZQUMxQixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixNQUFNLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FHMUMsQ0FBQztZQUNGLEtBQUssQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7WUFDakMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzFCLElBQUksS0FBSyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1lBQ2xELENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBRTFDLENBQUM7WUFDRixLQUFLLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO1lBQzlCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxvRUFBb0U7WUFDcEUsaUVBQWlFO1lBQ2pFLGdFQUFnRTtZQUNoRSxrRUFBa0U7WUFDbEUsOERBQThEO1lBQzlELDZEQUE2RDtZQUM3RCxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxzQkFBc0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUUxQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLElBQUksR0FBRyx3QkFBd0IsQ0FBQztZQUN0QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLG9FQUFvRTtZQUNwRSxvRUFBb0U7WUFDcEUscUVBQXFFO1lBQ3JFLE1BQU0sQ0FBQyxHQUFHLFVBQW9ELENBQUM7WUFDL0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxZQUFZLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7b0JBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxJQUFJLE9BQU8sSUFBSSxLQUFLO29CQUFHLENBQXlCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3JFLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDeEIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELElBQUksT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNwQixLQUFxQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzdELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxZQUFZLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLFlBQVksRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0UsU0FBUyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxVQUFVLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLFVBQVUsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDOUIsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDeEQsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDOUIsVUFBVSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxpQkFBaUIsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ25DLElBQUksaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RSxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpFLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pCLG9GQUFvRjtZQUNwRixNQUFNLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFhLENBQUMsRUFBRSxDQUFDLE9BQVEsQ0FBQztZQUNsRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7Z0JBQ2QsT0FBTyxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ25DLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEIsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUFFO29CQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsb0ZBQW9GO1lBQ3BGLE1BQU0sSUFBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUyxDQUFDO1lBQ3BELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO2dCQUNkLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNuQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2pCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlCLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFM0UsOENBQThDO1FBQzlDLDhEQUE4RDtRQUM5RCxvRUFBb0U7UUFDcEUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRztRQUM5RCxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQix3REFBd0Q7WUFDeEQsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3hCLE1BQU0sS0FBSyxHQUNULElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbkUsbUVBQW1FO1lBQ25FLHVFQUF1RTtZQUN2RSw4RUFBOEU7WUFDOUUsb0ZBQW9GO1lBQ3BGLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFhLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBRSxDQUFDO1lBQ3pELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGtEQUFrRDtBQUNsRCw4RUFBOEU7QUFFOUUsSUFBSSxjQUFjLEdBQW9CLElBQUksQ0FBQztBQUUzQyxTQUFTLFdBQVc7SUFDbEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLGNBQWMsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxhQUFhO0FBQ2IsOEVBQThFO0FBRTlFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBSSxRQUFXO0lBQzlDLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUN2QyxRQUFlLEVBQ2YsV0FBVyxFQUFFLENBQ1QsQ0FBQztJQUNQLE9BQU8scUNBQXFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxpQ0FBaUM7QUFDakMsOEVBQThFO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztBQUVsRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxJQUFnQjtJQUM3QyxvRkFBb0Y7SUFDcEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsY0FBYSxDQUFDLEVBQUUsQ0FDdkQsc0JBQXNCLENBQ3RCLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyw2REFBNkQ7SUFDN0QsZ0RBQWdEO0lBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFO1FBQzVDLEtBQUssRUFBRSxJQUFJO1FBQ1gsVUFBVSxFQUFFLEtBQUs7UUFDakIsWUFBWSxFQUFFLEtBQUs7S0FDcEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsc0RBQXNEO0FBQ3RELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFjO0lBQzlDLE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssc0JBQXNCLENBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLCtCQUErQjtBQUMvQiw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDO0FBRW5EOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CO0lBQzFCLG9GQUFvRjtJQUNwRixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxjQUFhLENBQUMsRUFBRSxDQUNyRCxvQkFBb0IsQ0FDcEIsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELHlEQUF5RDtBQUN6RCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTyxDQUNMLEtBQUssS0FBSyxJQUFJO1FBQ2QsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxvQkFBb0IsQ0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLHFCQUFxQixDQUFDLEtBQW1CLENBQUMsQ0FBQztJQUM5RSxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLG1CQUFtQixFQUFFLENBQUM7SUFDdkQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxxQ0FBcUMsQ0FBSSxRQUFXO0lBQzNELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQy9ELE1BQU0sQ0FBQyxHQUFHLFFBQW1DLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBRXhCLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQ2IsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUksTUFBTSxDQUFDLFNBQXFDLEVBQUUsQ0FBQztRQUNoRSxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNkLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsT0FBTyxNQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsUUFBVyxFQUNYLEdBQWU7SUFFZixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FDekMscUNBQXFDLENBQ3RDLENBQUM7SUFDRixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUNoRSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FDbEQsMkJBQTJCLENBQzVCLENBQUM7SUFDRiwyQkFBMkIsRUFBRSxDQUFDO0lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBRS9CLCtGQUErRjtJQUMvRixLQUFLLFVBQVUsWUFBWSxDQUN6QixLQUFjLEVBQ2QsR0FBYSxFQUNiLENBQXdDO1FBRXhDLHVEQUF1RDtRQUN2RCxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxHQUFHLEdBQUksS0FBYSxDQUFDLGVBQTZCLENBQUM7WUFDekQsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCw4Q0FBOEM7UUFDOUMsSUFBSSxLQUFLLFlBQVksVUFBVSxFQUFFLENBQUM7WUFDaEMsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCwrQkFBK0I7UUFDL0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsUUFBbUMsQ0FBQztJQUM5QyxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFFeEIscUVBQXFFO0lBQ3JFLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzdELElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQ2IsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUksTUFBTSxDQUFDLFNBQXFDLEVBQUUsQ0FBQztRQUN2RSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQ25DLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFDaEIsUUFBUSxFQUNSLFNBQVMsQ0FDVixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQsT0FBTyxNQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFFBQWlCO0lBQ2xELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxHQUFHLFFBQW1DLENBQUM7SUFFOUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0QsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFvQyxDQUFDO1FBQ2xELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViLXNwZWNpZmljIGh5ZHJhdGlvbiBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSByZXZpdmVycyB0aGF0IHVzZSBgYXRvYigpYCBmb3IgYmFzZTY0IGRlY29kaW5nIChubyBOb2RlLmpzXG4gKiBgQnVmZmVyYCBkZXBlbmRlbmN5KS4gUHJvZHVjZXMgYENsYXNzSW5zdGFuY2VSZWZgIG9iamVjdHMgYW5kIGBTdHJlYW1SZWZgXG4gKiBvYmplY3RzIGZvciBVSSByZW5kZXJpbmcuXG4gKi9cblxuaW1wb3J0IHtcbiAgZXh0cmFjdENsYXNzTmFtZSxcbiAgaHlkcmF0ZVJlc291cmNlSU8gYXMgaHlkcmF0ZVJlc291cmNlSU9HZW5lcmljLFxuICBpc0VuY3J5cHRlZERhdGEsXG4gIGlzRXhwaXJlZFN0dWIsXG4gIGlzUnVuUmVmLFxuICBvYnNlcnZhYmlsaXR5UmV2aXZlcnMsXG4gIHR5cGUgUmV2aXZlcnMsXG4gIHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uLWZvcm1hdCc7XG5pbXBvcnQgeyBFVkVOVF9EQVRBX1JFRl9GSUVMRFMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyB0aGF0IGNvbnN1bWVycyBuZWVkXG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkRGF0YSxcbiAgaXNSdW5SZWYsXG4gIGlzU3RyZWFtSWQsXG4gIGlzU3RyZWFtUmVmLFxuICB0eXBlIFJldml2ZXJzLFxuICBSVU5fUkVGX1RZUEUsXG4gIHR5cGUgUnVuUmVmLFxuICBTVFJFQU1fUkVGX1RZUEUsXG4gIHR5cGUgU3RyZWFtUmVmLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJyb3dzZXItc2FmZSBiYXNlNjQgZGVjb2RlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQ6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKGJhc2U2NCA9PT0gJycgfHwgYmFzZTY0ID09PSAnLicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG4gIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2ViIHJldml2ZXJzIChicm93c2VyLXNhZmUsIG5vIEJ1ZmZlciBkZXBlbmRlbmN5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQnVpbGQgYSByZXZpdmVyIGZvciBvbmUgb2YgdGhlIGJ1aWx0LWluIGBFcnJvcmAgc3ViY2xhc3NlcyAoZS5nLlxuICogYFR5cGVFcnJvcmAsIGBSYW5nZUVycm9yYCkuIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG5hbWVkIHN1YmNsYXNzIGlzXG4gKiByZXNvbHZlZCBvZmYgYGdsb2JhbFRoaXNgIGF0IGNhbGwgdGltZSBzbyB0aGUgcHJvZHVjZWQgaW5zdGFuY2UgaGFzIHRoZVxuICogY29ycmVjdCBwcm90b3R5cGUgY2hhaW4gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpY1xuICogYEVycm9yYCAod2l0aCBgbmFtZWAgc2V0KSBpZiB0aGUgZ2xvYmFsIGlzbid0IGF2YWlsYWJsZSwgd2hpY2gga2VlcHMgdGhlXG4gKiBvMTF5IFVJIHJlbmRlcmluZyBldmVuIG9uIGV4b3RpYyBicm93c2Vycy5cbiAqXG4gKiBgY2F1c2VgIGlzIHBhc3NlZCB0aHJvdWdoIGBFcnJvck9wdGlvbnNgIHRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIHByZXNlbnQsXG4gKiBtYXRjaGluZyBgZ2V0Q29tbW9uUmV2aXZlcnNgIGluIGBAd29ya2Zsb3cvY29yZWAgc28gdGhlIHJlc3VsdGluZyBgY2F1c2VgXG4gKiBwcm9wZXJ0eSBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIChub24tZW51bWVyYWJsZSwgc2V0IGJ5IHRoZSBlbmdpbmUpIGFzIGFcbiAqIGZyZXNobHkgdGhyb3duIEVycm9yIGluIHRoZSBjb25zdW1lciByZWFsbS4gVGhlIGAnY2F1c2UnIGluIHZhbHVlYCBjaGVja1xuICogcHJlc2VydmVzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKFxuICBuYW1lOlxuICAgIHwgJ0V2YWxFcnJvcidcbiAgICB8ICdSYW5nZUVycm9yJ1xuICAgIHwgJ1JlZmVyZW5jZUVycm9yJ1xuICAgIHwgJ1N5bnRheEVycm9yJ1xuICAgIHwgJ1R5cGVFcnJvcidcbiAgICB8ICdVUklFcnJvcidcbikge1xuICByZXR1cm4gKHZhbHVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9KSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtuYW1lXSBhc1xuICAgICAgfCBFcnJvckNvbnN0cnVjdG9yXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgcGF0aDogbm8gYnVpbHQtaW4gc3ViY2xhc3MgYXZhaWxhYmxlIChleG90aWMgZW52KS4gQ29uc3RydWN0XG4gICAgICAvLyBhIHBsYWluIEVycm9yIHdpdGggdGhlIHJpZ2h0IGBuYW1lYCBhbmQgY29weSBgY2F1c2VgIG1hbnVhbGx5IHNpbmNlXG4gICAgICAvLyB0aGUgYmFzZSBFcnJvciBjb25zdHJ1Y3RvciBpcyB3aGF0IHdlIGFjdHVhbGx5IGNhbGxlZC5cbiAgICAgIGVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHsgbmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2ViLXNwZWNpZmljIHJldml2ZXJzIGZvciBoeWRyYXRpbmcgc2VyaWFsaXplZCBkYXRhLlxuICpcbiAqIFVzZXMgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qcyBCdWZmZXIgZGVwZW5kZW5jeSkuXG4gKiBBbGwgdHlwZXMgYXJlIHJldml2ZWQgYXMgcmVhbCBpbnN0YW5jZXMgKERhdGUsIE1hcCwgU2V0LCBVUkwsXG4gKiBVUkxTZWFyY2hQYXJhbXMsIEhlYWRlcnMsIEVycm9yLCBldGMuKS5cbiAqXG4gKiBOT1RFOiB0aGlzIHNldCBtdXN0IG1pcnJvciB0aGUga2V5cyBpbiBgU2VyaWFsaXphYmxlU3BlY2lhbGAgKHNlZVxuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24vdHlwZXNgKS4gQW55IHJlZHVjZXIga2V5IGFkZGVkIG9uIHRoZVxuICogc2VyaWFsaXphdGlvbiBzaWRlIHRoYXQgaXNuJ3QgY292ZXJlZCBoZXJlIHdpbGwgY2F1c2UgYGRldmFsdWUudW5mbGF0dGVuYFxuICogdG8gdGhyb3cgYFVua25vd24gdHlwZSBYYCwgd2hpY2ggYGh5ZHJhdGVSZXNvdXJjZUlPYCBzd2FsbG93cyBhbmRcbiAqIHN1cmZhY2VzIGFzIGEgXCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBkZXRhaWxzXCIgYmFubmVyIGluIHRoZSBvMTF5IFVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViUmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBmdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZTogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gTzExeS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtcywgc3RlcCBmdW5jdGlvbnMg4oaSIGRpc3BsYXkgb2JqZWN0cykuXG4gICAgLy8gU3ByZWFkIEZJUlNUIHNvIHdlYi1zcGVjaWZpYyBvdmVycmlkZXMgYmVsb3cgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC4uLm9ic2VydmFiaWxpdHlSZXZpdmVycyxcblxuICAgIC8vIEJpbmFyeSB0eXBlc1xuICAgIEFycmF5QnVmZmVyOiByZXZpdmVBcnJheUJ1ZmZlcixcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBCaWdJbnQodmFsdWUpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IEJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IG5ldyBEYXRlKHZhbHVlKSxcblxuICAgIC8vIEVycm9yIGZhbWlseS4gVGhlIHJlZHVjZXIgc2lkZSAoc2VlXG4gICAgLy8gYHBhY2thZ2VzL2NvcmUvc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzYCkgZW1pdHMgYSB0YWdnZWRcbiAgICAvLyBlbnRyeSBmb3IgZWFjaCBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyBwbHVzIHRoZSB3b3JrZmxvdy1zcGVjaWZpY1xuICAgIC8vIGBGYXRhbEVycm9yYCAvIGBSZXRyeWFibGVFcnJvcmAgLyBgSG9va0NvbmZsaWN0RXJyb3JgIC9cbiAgICAvLyBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgYW5kIGBBZ2dyZWdhdGVFcnJvcmAuIFdpdGhvdXRcbiAgICAvLyBtYXRjaGluZyByZXZpdmVycyBoZXJlLCBgZGV2YWx1ZS51bmZsYXR0ZW5gIHRocm93cyBcIlVua25vd24gdHlwZSBYXCJcbiAgICAvLyDigJQgd2hpY2ggc3VyZmFjZXMgaW4gdGhlIHdlYiBvMTF5IFVJIGFzIFwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2VcbiAgICAvLyBkZXRhaWxzOiBVbmtub3duIHR5cGUgRmF0YWxFcnJvclwiLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIFN5bnRheEVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgQ3RvciA9IChcbiAgICAgICAgZ2xvYmFsVGhpcyBhcyB7IEFnZ3JlZ2F0ZUVycm9yPzogQWdncmVnYXRlRXJyb3JDb25zdHJ1Y3RvciB9XG4gICAgICApLkFnZ3JlZ2F0ZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPVxuICAgICAgICB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gbmV3IEN0b3IodmFsdWUuZXJyb3JzLCB2YWx1ZS5tZXNzYWdlLCBvcHRzKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHtcbiAgICAgICAgICAgICAgbmFtZTogJ0FnZ3JlZ2F0ZUVycm9yJyxcbiAgICAgICAgICAgICAgZXJyb3JzOiB2YWx1ZS5lcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW4gYnJvd3NlciBnbG9iYWxzLFxuICAgIC8vIHNvIHdlIGNhbid0IHJlc29sdmUgYSBjb25zdHJ1Y3RvciBmcm9tIGdsb2JhbFRoaXMuIFRoZSB3ZWIgbzExeSBVSVxuICAgIC8vIGRvZXNuJ3QgbmVlZCBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB0byBwYXNzIChubyB1c2VyIGNvZGUgcnVuc1xuICAgIC8vIGhlcmUpIOKAlCBpdCBqdXN0IG5lZWRzIGBuYW1lYCwgYG1lc3NhZ2VgLCBgc3RhY2tgLCBhbmQgYW55IGV4dHJhXG4gICAgLy8gZW51bWVyYWJsZSBmaWVsZHMgdG8gcmVuZGVyLiBDb25zdHJ1Y3QgYSBwbGFpbiBgRXJyb3JgIHdpdGggYG5hbWVgXG4gICAgLy8gc2V0OyBPYmplY3RJbnNwZWN0b3IgcmVhZHMgYGNvbnN0cnVjdG9yLm5hbWVgIGZvciB0aGUgZGlzcGxheWVkXG4gICAgLy8gY2xhc3MgbGFiZWwsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSByZWFsIGNsYXNzLCBzbyB3ZSBlbWl0IGEgdGFnZ2VkXG4gICAgLy8gRXJyb3Igd2hvc2UgYG5hbWVgIGZpZWxkIGNhcnJpZXMgdGhlIGNsYXNzIGlkZW50aXR5LiBUaGlzIG1hdGNoZXNcbiAgICAvLyBob3cgdGhlIGV4aXN0aW5nIGJhc2UgYEVycm9yYCByZXZpdmVyIHByZXNlbnRzIHVua25vd24gc3ViY2xhc3Nlcy5cbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cykgYXMgRXJyb3IgJiB7XG4gICAgICAgIHRva2VuPzogc3RyaW5nO1xuICAgICAgICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSG9va0NvbmZsaWN0RXJyb3InO1xuICAgICAgZXJyb3IudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgIGlmICh2YWx1ZS5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29uZmxpY3RpbmdSdW5JZCA9IHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpIGFzIEVycm9yICYge1xuICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgIH07XG4gICAgICBlcnJvci5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gYHJldHJ5QWZ0ZXJgIGlzIHNlcmlhbGl6ZWQgYXMgYW4gZXBvY2ggbXMgbnVtYmVyIChzZWUgdGhlIHJ1bnRpbWVcbiAgICAgIC8vIFJldHJ5YWJsZUVycm9yIHJlZHVjZXIgZm9yIHRoZSByYXRpb25hbGUgYXJvdW5kIHJlYWxtLXNhZmV0eSkuXG4gICAgICAvLyBSZWh5ZHJhdGUgYXMgYSBEYXRlIHNvIG8xMXkgY29uc3VtZXJzIGNhbiByZW5kZXIgaXQgZGlyZWN0bHkuXG4gICAgICAvLyBHdWFyZCBhZ2FpbnN0IHBheWxvYWRzIGZyb20gb2xkZXIgcnVudGltZSB2ZXJzaW9ucyB0aGF0IHByZWRhdGVcbiAgICAgIC8vIHRoZSBmaWVsZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBgbmV3IERhdGUodW5kZWZpbmVkKWAgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgYW4gSW52YWxpZCBEYXRlIHJhdGhlciB0aGFuIG9taXR0aW5nIHRoZSBwcm9wZXJ0eS5cbiAgICAgIGlmICh2YWx1ZS5yZXRyeUFmdGVyICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IucmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29udGV4dD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUgMTgrIGV4cG9zZSBgRE9NRXhjZXB0aW9uYCBvbiBnbG9iYWxUaGlzLlxuICAgICAgLy8gYEFib3J0Q29udHJvbGxlci5hYm9ydCgpYCB3aXRoIG5vIGFyZ3VtZW50IHN5bnRoZXNpemVzIG9uZSBhcyB0aGVcbiAgICAgIC8vIHNpZ25hbCdzIHJlYXNvbiwgc28gdGhpcyBpcyBhIGNvbW1vbiBwYXlsb2FkIGZvciBhbnkgYWJvcnRlZCBzdGVwLlxuICAgICAgY29uc3QgRyA9IGdsb2JhbFRoaXMgYXMgeyBET01FeGNlcHRpb24/OiB0eXBlb2YgRE9NRXhjZXB0aW9uIH07XG4gICAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRy5ET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IE1hcCh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBTZXQodmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcblxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IEhlYWRlcnModmFsdWUpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7fSB9LlJlcXVlc3QhO1xuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgICAgLi4uKHZhbHVlLnJlc3BvbnNlV3JpdGFibGVcbiAgICAgICAgICA/IHsgcmVzcG9uc2VXcml0YWJsZTogdmFsdWUucmVzcG9uc2VXcml0YWJsZSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUFycm93RnVuY3Rpb246IGFycm93IGZ1bmN0aW9ucyBoYXZlIG5vIC5wcm90b3R5cGVcbiAgICAgIGNvbnN0IGN0b3IgPSB7IFJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7fSB9LlJlc3BvbnNlITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgVVJMKHZhbHVlKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4gbmV3IFVSTFNlYXJjaFBhcmFtcyh2YWx1ZSA9PT0gJy4nID8gJycgOiB2YWx1ZSksXG5cbiAgICAvLyBXZWItc3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gICAgLy8gQ3JlYXRlIG9iamVjdHMgd2l0aCBhIGR5bmFtaWNhbGx5LW5hbWVkIGNvbnN0cnVjdG9yIHNvIHRoYXRcbiAgICAvLyByZWFjdC1pbnNwZWN0b3Igc2hvd3MgdGhlIGNsYXNzIG5hbWUgKGl0IHJlYWRzIGNvbnN0cnVjdG9yLm5hbWUpLlxuICAgIENsYXNzOiAodmFsdWUpID0+IGA8Y2xhc3M6JHtleHRyYWN0Q2xhc3NOYW1lKHZhbHVlLmNsYXNzSWQpfT5gLFxuICAgIEluc3RhbmNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJ1biBpbnN0YW5jZXMgYXJlIHJlbmRlcmVkIGFzIGNsaWNrYWJsZSBSdW5SZWYgYmFkZ2VzXG4gICAgICBjb25zdCBydW5SZWYgPSBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZih2YWx1ZSk7XG4gICAgICBpZiAoaXNSdW5SZWYocnVuUmVmKSkge1xuICAgICAgICByZXR1cm4gcnVuUmVmO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB2YWx1ZS5kYXRhO1xuICAgICAgY29uc3QgcHJvcHMgPVxuICAgICAgICBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IHsgLi4uZGF0YSB9IDogeyB2YWx1ZTogZGF0YSB9O1xuICAgICAgLy8gQ3JlYXRlIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgcmlnaHQgbmFtZSB1c2luZyBjb21wdXRlZCBwcm9wZXJ0eVxuICAgICAgLy8gc28gcmVhY3QtaW5zcGVjdG9yJ3MgYG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lYCBzaG93cyB0aGUgY2xhc3MgbmFtZS5cbiAgICAgIC8vIE11c3QgdXNlIGBmdW5jdGlvbmAgKG5vdCBhcnJvdykgYmVjYXVzZSBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlLlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBbY2xhc3NOYW1lXTogZnVuY3Rpb24gKCkge30gfVtjbGFzc05hbWVdITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHByb3BzKTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcmUtYnVpbHQgd2ViIHJldml2ZXJzIChjYWNoZWQgZm9yIHBlcmZvcm1hbmNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBjYWNoZWRSZXZpdmVyczogUmV2aXZlcnMgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0UmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBpZiAoIWNhY2hlZFJldml2ZXJzKSB7XG4gICAgY2FjaGVkUmV2aXZlcnMgPSBnZXRXZWJSZXZpdmVycygpO1xuICB9XG4gIHJldHVybiBjYWNoZWRSZXZpdmVycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIGRhdGEgZmllbGRzIG9mIGEgcmVzb3VyY2UgZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFVzZXMgYnJvd3Nlci1zYWZlIHJldml2ZXJzIChhdG9iIGZvciBiYXNlNjQsIENsYXNzSW5zdGFuY2VSZWYgZm9yXG4gKiBjdXN0b20gY2xhc3NlcywgU3RyZWFtUmVmIGZvciBzdHJlYW1zKS4gQ2FsbCB0aGlzIG9uIGRhdGEgcmVjZWl2ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgcGFzc2luZyBpdCB0byBVSSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU88VD4ocmVzb3VyY2U6IFQpOiBUIHtcbiAgY29uc3QgaHlkcmF0ZWQgPSBoeWRyYXRlUmVzb3VyY2VJT0dlbmVyaWMoXG4gICAgcmVzb3VyY2UgYXMgYW55LFxuICAgIGdldFJldml2ZXJzKClcbiAgKSBhcyBUO1xuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhoeWRyYXRlZCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGVkIGRhdGEgZGlzcGxheSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgPSAnRW5jcnlwdGVkJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZW5jcnlwdGVkIGRhdGEuXG4gKlxuICogVXNlcyB0aGUgc2FtZSBuYW1lZC1jb25zdHJ1Y3RvciB0cmljayBhcyB0aGUgSW5zdGFuY2UgcmV2aXZlciBzbyB0aGF0XG4gKiBPYmplY3RJbnNwZWN0b3IgcmVuZGVycyB0aGUgY29uc3RydWN0b3IgbmFtZSAoXCLwn5SSIEVuY3J5cHRlZFwiKSB3aXRoIG5vXG4gKiBleHBhbmRhYmxlIGNoaWxkcmVuLiBUaGUgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gYVxuICogbm9uLWVudW1lcmFibGUgcHJvcGVydHkgZm9yIGxhdGVyIGRlY3J5cHRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRlZE1hcmtlcihkYXRhOiBVaW50OEFycmF5KTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFTkNSWVBURURfRElTUExBWV9OQU1FXTogZnVuY3Rpb24gKCkge30gfVtcbiAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gIF0hO1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgYnl0ZXMgZm9yIGRlY3J5cHRpb24sIGJ1dCBub24tZW51bWVyYWJsZSBzb1xuICAvLyBPYmplY3RJbnNwZWN0b3IgZG9lc24ndCBzaG93IHRoZW0gYXMgY2hpbGRyZW5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19fZW5jcnlwdGVkRGF0YScsIHtcbiAgICB2YWx1ZTogZGF0YSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZW5jcnlwdGVkIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkaXNwbGF5IG1hcmtlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgRVhQSVJFRF9ESVNQTEFZX05BTUUgPSAnRXhwaXJlZCBEYXRhJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZXhwaXJlZCBkYXRhLlxuICpcbiAqIFVzZXMgdGhlIHNhbWUgbmFtZWQtY29uc3RydWN0b3IgdHJpY2sgYXMgdGhlIGVuY3J5cHRlZCBtYXJrZXIgc28gdGhhdFxuICogT2JqZWN0SW5zcGVjdG9yIHJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgKFwiRXhwaXJlZCBEYXRhXCIpIHdpdGggbm9cbiAqIGV4cGFuZGFibGUgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4cGlyZWRNYXJrZXIoKTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFWFBJUkVEX0RJU1BMQVlfTkFNRV06IGZ1bmN0aW9uICgpIHt9IH1bXG4gICAgRVhQSVJFRF9ESVNQTEFZX05BTUVcbiAgXSE7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkTWFya2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09IEVYUElSRURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8qKiBSZXBsYWNlIGEgc2luZ2xlIGZpZWxkIHZhbHVlIHdpdGggYSBkaXNwbGF5IG1hcmtlciBpZiBpdCdzIGVuY3J5cHRlZCBvciBleHBpcmVkLiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5TWFya2VyKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSByZXR1cm4gY3JlYXRlRW5jcnlwdGVkTWFya2VyKHZhbHVlIGFzIFVpbnQ4QXJyYXkpO1xuICBpZiAoaXNFeHBpcmVkU3R1Yih2YWx1ZSkpIHJldHVybiBjcmVhdGVFeHBpcmVkTWFya2VyKCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBQb3N0LXByb2Nlc3MgaHlkcmF0ZWQgcmVzb3VyY2UgZGF0YTogcmVwbGFjZSBlbmNyeXB0ZWQgVWludDhBcnJheSB2YWx1ZXNcbiAqIGFuZCBleHBpcmVkIHN0dWJzIHdpdGggZGlzcGxheS1mcmllbmRseSBtYXJrZXIgb2JqZWN0cyBpbiBrbm93biBkYXRhIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VyczxUPihyZXNvdXJjZTogVCk6IFQge1xuICBpZiAoIXJlc291cmNlIHx8IHR5cGVvZiByZXNvdXJjZSAhPT0gJ29iamVjdCcpIHJldHVybiByZXNvdXJjZTtcbiAgY29uc3QgciA9IHJlc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZXN1bHQgPSB7IC4uLnIgfTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgcmVzdWx0W2tleV0gPSB0b0Rpc3BsYXlNYXJrZXIocmVzdWx0W2tleV0pO1xuICB9XG5cbiAgaWYgKHJlc3VsdC5ldmVudERhdGEgJiYgdHlwZW9mIHJlc3VsdC5ldmVudERhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID1cbiAgICAgIHR5cGVvZiByZXN1bHQuZXZlbnRUeXBlID09PSAnc3RyaW5nJyA/IHJlc3VsdC5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gICAgY29uc3QgZWQgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZktleXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZWQpIHtcbiAgICAgICAgZWRba2V5XSA9IHRvRGlzcGxheU1hcmtlcihlZFtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LmV2ZW50RGF0YSA9IGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgcmVzb3VyY2UgZGF0YSB3aXRoIGRlY3J5cHRpb24gc3VwcG9ydC5cbiAqXG4gKiBXaGVuIGEga2V5IGlzIHByb3ZpZGVkLCBlbmNyeXB0ZWQgZmllbGRzIGFyZSBkZWNyeXB0ZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gdXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIkRlY3J5cHRcIiBpbiB0aGUgd2ViIFVJLlxuICpcbiAqIEhhbmRsZXMgYm90aCB0b3AtbGV2ZWwgZmllbGRzIChpbnB1dCwgb3V0cHV0LCBtZXRhZGF0YSkgYW5kIG5lc3RlZFxuICogZXZlbnREYXRhIHN1YmZpZWxkcyBwZXIgYEVWRU5UX0RBVEFfUkVGX0ZJRUxEU2AgZnJvbSBgQHdvcmtmbG93L3dvcmxkYCBmb3IgdGhhdCBldmVudCB0eXBlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU9XaXRoS2V5PFQ+KFxuICByZXNvdXJjZTogVCxcbiAga2V5OiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgeyBoeWRyYXRlRGF0YVdpdGhLZXkgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnXG4gICk7XG4gIGNvbnN0IHsgaW1wb3J0S2V5IH0gPSBhd2FpdCBpbXBvcnQoJ0B3b3JrZmxvdy9jb3JlL2VuY3J5cHRpb24nKTtcbiAgLy8gUGF5bG9hZHMgbWF5IGJlIHpzdGQtY29tcHJlc3NlZCAodGhlIFdlYiBEZWNvbXByZXNzaW9uU3RyZWFtIGhhcyBubyB6c3RkKTtcbiAgLy8gcmVnaXN0ZXIgdGhlIFdBU00tYmFja2VkIGJyb3dzZXIgZGVjb2RlciBiZWZvcmUgaHlkcmF0aW5nLiBJZGVtcG90ZW50IGFuZFxuICAvLyBsYXp5IOKAlCB0aGUgV0FTTSBpcyBvbmx5IGNvbXBpbGVkIHdoZW4gYSB6c3RkIHBheWxvYWQgaXMgYWN0dWFsbHkgZGVjb2RlZC5cbiAgY29uc3QgeyBlbnN1cmVac3RkRGVjb2RlclJlZ2lzdGVyZWQgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi96c3RkLWJyb3dzZXItZGVjb2Rlci5qcydcbiAgKTtcbiAgZW5zdXJlWnN0ZERlY29kZXJSZWdpc3RlcmVkKCk7XG4gIGNvbnN0IGNyeXB0b0tleSA9IGF3YWl0IGltcG9ydEtleShrZXkpO1xuICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzKCk7XG5cbiAgLyoqIEV4dHJhY3Qgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGZyb20gYSBtYXJrZXIgb3IgcmF3IFVpbnQ4QXJyYXksIHRoZW4gZGVjcnlwdCArIGh5ZHJhdGUgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdEZpZWxkKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHJldjogUmV2aXZlcnMsXG4gICAgazogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnRLZXk+PlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBBbHJlYWR5LWh5ZHJhdGVkOiBlbmNyeXB0ZWQgbWFya2VyIHdpdGggc3RvcmVkIGJ5dGVzXG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgY29uc3QgcmF3ID0gKHZhbHVlIGFzIGFueSkuX19lbmNyeXB0ZWREYXRhIGFzIFVpbnQ4QXJyYXk7XG4gICAgICByZXR1cm4gaHlkcmF0ZURhdGFXaXRoS2V5KHJhdywgcmV2LCBrKTtcbiAgICB9XG4gICAgLy8gUmF3IGVuY3J5cHRlZCBVaW50OEFycmF5IChub3QgeWV0IGh5ZHJhdGVkKVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YVdpdGhLZXkodmFsdWUsIHJldiwgayk7XG4gICAgfVxuICAgIC8vIE5vdCBlbmNyeXB0ZWQg4oCUIHJldHVybiBhcy1pc1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgdG9wLWxldmVsIHNlcmlhbGl6ZWQgZmllbGRzIChydW5zLCBzdGVwcywgaG9va3MpXG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIGlmIChmaWVsZCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBhd2FpdCBkZWNyeXB0RmllbGQocmVzdWx0W2ZpZWxkXSwgcmV2aXZlcnMsIGNyeXB0b0tleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgZXZlbnREYXRhIHN1YmZpZWxkcyAoZXZlbnRzKVxuICBpZiAocmVzdWx0LmV2ZW50RGF0YSAmJiB0eXBlb2YgcmVzdWx0LmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPVxuICAgICAgdHlwZW9mIHJlc3VsdC5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gcmVzdWx0LmV2ZW50VHlwZSA6ICcnO1xuICAgIGNvbnN0IHJlZktleXMgPSBFVkVOVF9EQVRBX1JFRl9GSUVMRFNbZXZlbnRUeXBlXSA/PyBbXTtcbiAgICBjb25zdCBldmVudERhdGEgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgcmVmS2V5cykge1xuICAgICAgaWYgKGZpZWxkIGluIGV2ZW50RGF0YSkge1xuICAgICAgICBldmVudERhdGFbZmllbGRdID0gYXdhaXQgZGVjcnlwdEZpZWxkKFxuICAgICAgICAgIGV2ZW50RGF0YVtmaWVsZF0sXG4gICAgICAgICAgcmV2aXZlcnMsXG4gICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBldmVudERhdGE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIFQ7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGh5ZHJhdGVkIHJlc291cmNlIChldmVudCwgc3RlcCwgcnVuLCBldGMuKSBjb250YWlucyBhbnlcbiAqIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlcnMuIEluc3BlY3RzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgZmllbGRzXG4gKiAoYGlucHV0YCwgYG91dHB1dGAsIGBlcnJvcmAsIGBtZXRhZGF0YWApIGFzIHdlbGwgYXMgdGhlIGV2ZW50LXR5cGUtc3BlY2lmaWNcbiAqIGBldmVudERhdGFgIHJlZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNyeXB0ZWRGaWVsZHMocmVzb3VyY2U6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHJba2V5XSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHIuZXZlbnREYXRhICYmIHR5cGVvZiByLmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlb2Ygci5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gci5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gICAgY29uc3QgZWQgPSByLmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkICYmIGlzRW5jcnlwdGVkTWFya2VyKGVkW2tleV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Register the browser zstd decoder with `@workflow/core` (idempotent).
3
+ * Call this before hydrating payloads that may be zstd-compressed; the
4
+ * actual WASM compile + decode happens lazily on first use.
5
+ */
6
+ export declare function ensureZstdDecoderRegistered(): void;
7
+ //# sourceMappingURL=zstd-browser-decoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zstd-browser-decoder.d.ts","sourceRoot":"","sources":["../../src/lib/zstd-browser-decoder.ts"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Browser zstd decoder for the o11y read path.
3
+ *
4
+ * The Web `DecompressionStream` has no zstd support, so `@workflow/core`'s
5
+ * `hydrateDataWithKey` delegates zstd inflation to a decoder registered via
6
+ * `registerZstdDecoder`. This module supplies that decoder, backed by the
7
+ * `@tootallnate/zstd-wasm` single-file WASM decoder.
8
+ *
9
+ * The package leaves WASM sourcing to the caller; we resolve the shipped
10
+ * `zstd.wasm` as a bundler asset (`new URL(..., import.meta.url)`, the same
11
+ * pattern the trace-viewer Worker uses) and compile it once, lazily — the
12
+ * WASM is fetched only the first time a zstd payload is actually decoded.
13
+ */
14
+ import { registerZstdDecoder } from '@workflow/core/serialization-format';
15
+ let registered = false;
16
+ let modulePromise;
17
+ function loadWasmModule() {
18
+ if (!modulePromise) {
19
+ const url = new URL('@tootallnate/zstd-wasm/zstd.wasm', import.meta.url);
20
+ modulePromise = fetch(url)
21
+ .then((res) => res.arrayBuffer())
22
+ .then((bytes) => WebAssembly.compile(bytes));
23
+ }
24
+ return modulePromise;
25
+ }
26
+ /**
27
+ * Register the browser zstd decoder with `@workflow/core` (idempotent).
28
+ * Call this before hydrating payloads that may be zstd-compressed; the
29
+ * actual WASM compile + decode happens lazily on first use.
30
+ */
31
+ export function ensureZstdDecoderRegistered() {
32
+ if (registered)
33
+ return;
34
+ registered = true;
35
+ registerZstdDecoder(async (payload) => {
36
+ const { decompressBytes } = await import('@tootallnate/zstd-wasm');
37
+ const wasmModule = await loadWasmModule();
38
+ return decompressBytes(wasmModule, payload);
39
+ });
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienN0ZC1icm93c2VyLWRlY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3pzdGQtYnJvd3Nlci1kZWNvZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTFFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN2QixJQUFJLGFBQXNELENBQUM7QUFFM0QsU0FBUyxjQUFjO0lBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ2hDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsSUFBSSxVQUFVO1FBQUUsT0FBTztJQUN2QixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sZUFBZSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXIgenN0ZCBkZWNvZGVyIGZvciB0aGUgbzExeSByZWFkIHBhdGguXG4gKlxuICogVGhlIFdlYiBgRGVjb21wcmVzc2lvblN0cmVhbWAgaGFzIG5vIHpzdGQgc3VwcG9ydCwgc28gYEB3b3JrZmxvdy9jb3JlYCdzXG4gKiBgaHlkcmF0ZURhdGFXaXRoS2V5YCBkZWxlZ2F0ZXMgenN0ZCBpbmZsYXRpb24gdG8gYSBkZWNvZGVyIHJlZ2lzdGVyZWQgdmlhXG4gKiBgcmVnaXN0ZXJac3RkRGVjb2RlcmAuIFRoaXMgbW9kdWxlIHN1cHBsaWVzIHRoYXQgZGVjb2RlciwgYmFja2VkIGJ5IHRoZVxuICogYEB0b290YWxsbmF0ZS96c3RkLXdhc21gIHNpbmdsZS1maWxlIFdBU00gZGVjb2Rlci5cbiAqXG4gKiBUaGUgcGFja2FnZSBsZWF2ZXMgV0FTTSBzb3VyY2luZyB0byB0aGUgY2FsbGVyOyB3ZSByZXNvbHZlIHRoZSBzaGlwcGVkXG4gKiBgenN0ZC53YXNtYCBhcyBhIGJ1bmRsZXIgYXNzZXQgKGBuZXcgVVJMKC4uLiwgaW1wb3J0Lm1ldGEudXJsKWAsIHRoZSBzYW1lXG4gKiBwYXR0ZXJuIHRoZSB0cmFjZS12aWV3ZXIgV29ya2VyIHVzZXMpIGFuZCBjb21waWxlIGl0IG9uY2UsIGxhemlseSDigJQgdGhlXG4gKiBXQVNNIGlzIGZldGNoZWQgb25seSB0aGUgZmlyc3QgdGltZSBhIHpzdGQgcGF5bG9hZCBpcyBhY3R1YWxseSBkZWNvZGVkLlxuICovXG5pbXBvcnQgeyByZWdpc3RlclpzdGREZWNvZGVyIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuXG5sZXQgcmVnaXN0ZXJlZCA9IGZhbHNlO1xubGV0IG1vZHVsZVByb21pc2U6IFByb21pc2U8V2ViQXNzZW1ibHkuTW9kdWxlPiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gbG9hZFdhc21Nb2R1bGUoKTogUHJvbWlzZTxXZWJBc3NlbWJseS5Nb2R1bGU+IHtcbiAgaWYgKCFtb2R1bGVQcm9taXNlKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCgnQHRvb3RhbGxuYXRlL3pzdGQtd2FzbS96c3RkLndhc20nLCBpbXBvcnQubWV0YS51cmwpO1xuICAgIG1vZHVsZVByb21pc2UgPSBmZXRjaCh1cmwpXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgIC50aGVuKChieXRlcykgPT4gV2ViQXNzZW1ibHkuY29tcGlsZShieXRlcykpO1xuICB9XG4gIHJldHVybiBtb2R1bGVQcm9taXNlO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBicm93c2VyIHpzdGQgZGVjb2RlciB3aXRoIGBAd29ya2Zsb3cvY29yZWAgKGlkZW1wb3RlbnQpLlxuICogQ2FsbCB0aGlzIGJlZm9yZSBoeWRyYXRpbmcgcGF5bG9hZHMgdGhhdCBtYXkgYmUgenN0ZC1jb21wcmVzc2VkOyB0aGVcbiAqIGFjdHVhbCBXQVNNIGNvbXBpbGUgKyBkZWNvZGUgaGFwcGVucyBsYXppbHkgb24gZmlyc3QgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlWnN0ZERlY29kZXJSZWdpc3RlcmVkKCk6IHZvaWQge1xuICBpZiAocmVnaXN0ZXJlZCkgcmV0dXJuO1xuICByZWdpc3RlcmVkID0gdHJ1ZTtcbiAgcmVnaXN0ZXJac3RkRGVjb2Rlcihhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgIGNvbnN0IHsgZGVjb21wcmVzc0J5dGVzIH0gPSBhd2FpdCBpbXBvcnQoJ0B0b290YWxsbmF0ZS96c3RkLXdhc20nKTtcbiAgICBjb25zdCB3YXNtTW9kdWxlID0gYXdhaXQgbG9hZFdhc21Nb2R1bGUoKTtcbiAgICByZXR1cm4gZGVjb21wcmVzc0J5dGVzKHdhc21Nb2R1bGUsIHBheWxvYWQpO1xuICB9KTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.17",
4
+ "version": "5.0.0-beta.18",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -41,6 +41,7 @@
41
41
  "@radix-ui/react-slot": "1.1.1",
42
42
  "@radix-ui/react-tooltip": "1.2.8",
43
43
  "@tailwindcss/postcss": "4",
44
+ "@tootallnate/zstd-wasm": "0.0.2",
44
45
  "class-variance-authority": "0.7.1",
45
46
  "clsx": "2.1.1",
46
47
  "date-fns": "4.1.0",
@@ -55,9 +56,9 @@
55
56
  "streamdown": "2.3.0",
56
57
  "tailwind-merge": "3.5.0",
57
58
  "tailwindcss": "4",
58
- "@workflow/core": "5.0.0-beta.17",
59
+ "@workflow/core": "5.0.0-beta.18",
59
60
  "@workflow/utils": "5.0.0-beta.4",
60
- "@workflow/world": "5.0.0-beta.10"
61
+ "@workflow/world": "5.0.0-beta.11"
61
62
  },
62
63
  "devDependencies": {
63
64
  "@biomejs/biome": "^2.4.4",
@@ -0,0 +1,173 @@
1
+ 'use client';
2
+
3
+ import { ArrowLeft, ArrowRight } from 'lucide-react';
4
+ import type { ReactNode } from 'react';
5
+ import { cn } from '../../../lib/utils';
6
+ import { TimestampTooltip } from '../../ui/timestamp-tooltip';
7
+ import type { SpanMarker } from '../utils';
8
+
9
+ // ---------------------------------------------------------------------------
10
+ // Marker projection
11
+ // ---------------------------------------------------------------------------
12
+
13
+ export interface VisibleMarker {
14
+ leftPct: number;
15
+ /** Absolute (epoch) timestamp in ms — for the tooltip. */
16
+ timeMs: number;
17
+ }
18
+
19
+ /**
20
+ * Project point-in-time markers onto the visible window `[visibleStartMs,
21
+ * visibleEndMs]` of a bar, as percentages of that window. Markers outside the
22
+ * window are dropped.
23
+ */
24
+ export function projectMarkers(
25
+ markers: SpanMarker[],
26
+ visibleStartMs: number,
27
+ visibleEndMs: number
28
+ ): VisibleMarker[] {
29
+ const visibleDurationMs = visibleEndMs - visibleStartMs;
30
+ if (visibleDurationMs <= 0) return [];
31
+
32
+ return markers.flatMap((m) => {
33
+ if (m.timeMs < visibleStartMs || m.timeMs > visibleEndMs) {
34
+ return [];
35
+ }
36
+ return [
37
+ {
38
+ leftPct: ((m.timeMs - visibleStartMs) / visibleDurationMs) * 100,
39
+ timeMs: m.timeMs,
40
+ },
41
+ ];
42
+ });
43
+ }
44
+
45
+ /** Min pixel gap a tick needs from the last-kept one, else it's culled. */
46
+ const MARKER_MIN_GAP_PX = 16;
47
+
48
+ /**
49
+ * Thin out ticks that would visually collide: walk left-to-right and keep each
50
+ * one unless it sits within MARKER_MIN_GAP_PX of the last kept tick. Well-spaced
51
+ * markers survive even when a tight cluster elsewhere on the bar gets thinned —
52
+ * zoom in to resolve a cluster.
53
+ */
54
+ export function cullCollidingMarkers(
55
+ projected: VisibleMarker[],
56
+ pixelWidth: number
57
+ ): VisibleMarker[] {
58
+ const kept: VisibleMarker[] = [];
59
+ let lastKeptPct = Number.NEGATIVE_INFINITY;
60
+ for (const m of projected) {
61
+ const gapPx = ((m.leftPct - lastKeptPct) / 100) * pixelWidth;
62
+ if (gapPx < MARKER_MIN_GAP_PX) continue;
63
+ kept.push(m);
64
+ lastKeptPct = m.leftPct;
65
+ }
66
+ return kept;
67
+ }
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // Rendering
71
+ // ---------------------------------------------------------------------------
72
+
73
+ /** Marker glyph: a rounded vertical tick (3px wide). */
74
+ function MarkerTick({ className }: { className?: string }): ReactNode {
75
+ return (
76
+ <span
77
+ className={cn('block w-[3px] rounded-full bg-gray-1000', className)}
78
+ />
79
+ );
80
+ }
81
+
82
+ /**
83
+ * Point-in-time markers overlaid on a bar — one vertical tick per event (hook
84
+ * resumptions and attribute writes), centered on the bar. Each tick sits inside
85
+ * a larger hit target and, on hover, shows the shared `TimestampTooltip` card
86
+ * (the same light Geist card used for every other timestamp in the app, e.g. the
87
+ * attribute panel and event list) so the time reads consistently with the rest
88
+ * of the product. The position is clamped a hair inside the bar so an edge
89
+ * marker never jams the rounded corner.
90
+ */
91
+ export function MarkerLayer({
92
+ markers,
93
+ }: {
94
+ markers: VisibleMarker[];
95
+ }): ReactNode {
96
+ return (
97
+ <>
98
+ {markers.map((m) => (
99
+ <span
100
+ key={m.timeMs}
101
+ className="pointer-events-auto absolute top-0 bottom-0 z-10 flex w-8 -translate-x-1/2 items-center justify-center"
102
+ style={{ left: `clamp(8px, ${m.leftPct}%, calc(100% - 8px))` }}
103
+ >
104
+ <TimestampTooltip date={m.timeMs}>
105
+ <span className="flex h-6 w-8 items-center justify-center">
106
+ <MarkerTick className="h-3" />
107
+ </span>
108
+ </TimestampTooltip>
109
+ </span>
110
+ ))}
111
+ </>
112
+ );
113
+ }
114
+
115
+ /**
116
+ * Edge indicator for markers that have scrolled out of view while zoomed in.
117
+ * Pinned flush to the corresponding edge of the visible bar, it shows the marker
118
+ * glyph plus a chevron pointing the way to scroll. The chevron always sits on
119
+ * the outer (off-screen) side, in a box that lines up with the bare
120
+ * BoundaryArrow on adjacent rows.
121
+ */
122
+ export function OffscreenMarkerIndicator({
123
+ direction,
124
+ count,
125
+ targetMs,
126
+ onReveal,
127
+ }: {
128
+ direction: 'left' | 'right';
129
+ count: number;
130
+ targetMs: number;
131
+ onReveal?: (timeMs: number) => void;
132
+ }): ReactNode {
133
+ const Chevron = direction === 'right' ? ArrowRight : ArrowLeft;
134
+ const label = `${count} marker${count === 1 ? '' : 's'} ${
135
+ direction === 'right' ? 'ahead' : 'behind'
136
+ } — click to scroll to ${count === 1 ? 'it' : 'the nearest'}`;
137
+ const chevron = (
138
+ <span className="flex h-6 w-6 shrink-0 items-center justify-center">
139
+ <Chevron className="size-3 text-gray-900" />
140
+ </span>
141
+ );
142
+ const tick = <MarkerTick className="h-3.5 shrink-0" />;
143
+
144
+ return (
145
+ <button
146
+ type="button"
147
+ aria-label={label}
148
+ title={label}
149
+ onClick={(e) => {
150
+ // Don't let the row's onClick fire — revealing shouldn't also
151
+ // change the span selection.
152
+ e.stopPropagation();
153
+ onReveal?.(targetMs);
154
+ }}
155
+ className={cn(
156
+ 'pointer-events-auto absolute top-1/2 z-20 flex h-6 -translate-y-1/2 cursor-pointer items-center rounded-[0.25rem] border border-gray-alpha-400 bg-background-100 shadow-sm hover:bg-gray-100',
157
+ direction === 'right' ? 'right-0 pl-1.5' : 'left-0 pr-1.5'
158
+ )}
159
+ >
160
+ {direction === 'left' ? (
161
+ <>
162
+ {chevron}
163
+ {tick}
164
+ </>
165
+ ) : (
166
+ <>
167
+ {tick}
168
+ {chevron}
169
+ </>
170
+ )}
171
+ </button>
172
+ );
173
+ }