@firestitch/report 18.7.0 → 18.8.1

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 (64) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
  2. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  3. package/app/reports/components/component-list/component-list.component.d.ts +7 -1
  4. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
  6. package/app/reports/components/report-component/report-component.component.d.ts +2 -11
  7. package/app/reports/data/report.data.d.ts +0 -2
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
  10. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  11. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  12. package/app/reports/export/report-export-collector.service.d.ts +29 -1
  13. package/app/reports/export/report-pdf.service.d.ts +5 -0
  14. package/app/reports/export/report-pptx.service.d.ts +7 -0
  15. package/app/reports/format.d.ts +29 -1
  16. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  17. package/app/reports/interfaces/report.interface.d.ts +124 -4
  18. package/app/reports/kpi-card.d.ts +48 -0
  19. package/app/reports/layout.d.ts +0 -9
  20. package/app/reports/list-config.d.ts +8 -1
  21. package/app/reports/option-builder.d.ts +7 -0
  22. package/app/reports/output-notes.d.ts +14 -0
  23. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  24. package/app/reports/services/report-filter-state.service.d.ts +1 -0
  25. package/app/reports/theme/palette.d.ts +5 -0
  26. package/app/reports/theme/typography.d.ts +1 -0
  27. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
  28. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
  29. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  30. package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
  31. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  32. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
  33. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
  34. package/esm2022/app/reports/data/report.data.mjs +5 -5
  35. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  36. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
  37. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  38. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  39. package/esm2022/app/reports/export/report-export-collector.service.mjs +123 -10
  40. package/esm2022/app/reports/export/report-pdf.service.mjs +257 -44
  41. package/esm2022/app/reports/export/report-pptx.service.mjs +324 -51
  42. package/esm2022/app/reports/format.mjs +452 -3
  43. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  44. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  45. package/esm2022/app/reports/kpi-card.mjs +187 -0
  46. package/esm2022/app/reports/layout.mjs +1 -46
  47. package/esm2022/app/reports/list-config.mjs +33 -1
  48. package/esm2022/app/reports/option-builder.mjs +637 -54
  49. package/esm2022/app/reports/output-notes.mjs +204 -0
  50. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  51. package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
  52. package/esm2022/app/reports/theme/palette.mjs +22 -1
  53. package/esm2022/app/reports/theme/typography.mjs +5 -1
  54. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  55. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  56. package/esm2022/public_api.mjs +2 -1
  57. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-CFnbJx44.mjs} +2 -2
  58. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-CFnbJx44.mjs.map} +1 -1
  59. package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-CSylkyko.mjs} +2735 -507
  60. package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +1 -0
  61. package/fesm2022/firestitch-report.mjs +1 -1
  62. package/package.json +1 -1
  63. package/public_api.d.ts +1 -0
  64. package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
@@ -78,8 +78,8 @@ export class ReportData {
78
78
  ...config,
79
79
  });
80
80
  }
81
- // Report settings: any subset of { name, pageWidth, pageHeight, layout,
82
- // timezone, locale, currency, styles, headerFooter } — styles carry the
81
+ // Report settings: any subset of { name, pageWidth, pageHeight, timezone,
82
+ // locale, currency, styles, headerFooter } — styles carry the
83
83
  // report's typographic config (e.g. heading size), headerFooter the
84
84
  // header/footer band depths in inches. The page size is in inches and
85
85
  // width/height go together. locale (a BCP 47 tag) and currency (an ISO 4217
@@ -126,7 +126,7 @@ export class ReportData {
126
126
  }
127
127
  // Component settings: any subset of { title, padding } — the human-facing
128
128
  // dialog edits — or a text block's { html } from its inline editor; geometry
129
- // (x/y/w/h/flowWidth) is persisted via savePositions from the canvas instead.
129
+ // (x/y/w/h) is persisted via savePositions from the canvas instead.
130
130
  updateComponent(reportId, componentId, settings, config = {}) {
131
131
  return this._api.put(this._path(`${reportId}/components/${componentId}/settings`), settings, {
132
132
  key: 'component',
@@ -177,7 +177,7 @@ export class ReportData {
177
177
  });
178
178
  }
179
179
  // Persist geometry for the moved components only — any subset of
180
- // { x, y, w, h } (inches), flowWidth (percent) and order (flow position).
180
+ // { x, y, w, h } (inches).
181
181
  savePositions(reportId, positions, config = {}) {
182
182
  return this._api.put(this._path(`${reportId}/components/positions`), { positions }, {
183
183
  key: null,
@@ -379,4 +379,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
379
379
  providedIn: 'root',
380
380
  }]
381
381
  }] });
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDOztBQWlCdkQsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSxxRkFBcUY7QUFJckYsTUFBTSxPQUFPLFVBQVU7SUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDdkUsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUU1QixrRkFBa0Y7SUFDbEYsa0RBQWtEO0lBQzFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUN2QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQy9ELENBQUM7SUFFTSxPQUFPLENBQUMsUUFBYSxFQUFFLEVBQUUsU0FBd0IsRUFBRTtRQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osS0FBSyxFQUNMO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDdkUsSUFBSSxDQUFDLFFBQWEsRUFBRSxFQUFFLFNBQXdCLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEtBQUssRUFDTCxNQUFNLENB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QVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGc0FwaSwgUmVxdWVzdENvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBDb21wb25lbnRFeHBvcnRSZXNwb25zZSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnRDb21wb25lbnRTcWwsXG4gIFJlcG9ydEZpbHRlckxldmVsLFxuICBSZXBvcnRMb2NhbGVzLFxuICBSZXBvcnRUcmVlLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIEFQSSBnYXRld2F5IGZvciB0aGUgUmVwb3J0cyBtb2R1bGUuIEV2ZXJ5IGVuZHBvaW50IGhhbmdzIG9mZiBbYmFzZVBhdGhdLFxuLy8gd2hpY2ggZGVmYXVsdHMgdG8gXCJyZXBvcnRzXCIgKHRoZSBmcmFtZXdvcmsgcmVwb3J0cyBiYWNrZW5kIGF0IC9hcGkvcmVwb3J0cylcbi8vIGFuZCBjYW4gYmUgcmVwb2ludGVkIGJ5IHRoZSBob3N0IHNvIHRoZSBwYWNrYWdlIHN0YXlzIHNlbGYtY29udGFpbmVkIGFuZCBwb3J0YWJsZS5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnREYXRhPFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfYXBpID0gaW5qZWN0KEZzQXBpKTtcblxuICAvLyBUaGUgQVBJIHJvb3QgZm9yIGV2ZXJ5IHJlcG9ydHMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZSBmcmFtZXdvcmsgcmVwb3J0c1xuICAvLyBjb250ZXh0OyBzZXQgaXQgb25jZSAoZS5nLiBmcm9tIHRoZSBob3N0J3MgcmVwb3J0IHBhZ2UpIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIGJhc2VQYXRoID0gJ3JlcG9ydHMnO1xuXG4gIC8vIEJ1aWxkIGFuIGVuZHBvaW50IHBhdGggdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYmFzZSwgZS5nLiBfcGF0aCgpID0+IFwiYWkvcmVwb3J0c1wiLFxuICAvLyBfcGF0aChgJHtpZH0vcGFnZXNgKSA9PiBcImFpL3JlcG9ydHMvMTIzL3BhZ2VzXCIuXG4gIHByaXZhdGUgX3BhdGgoc3VmZml4ID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWZmaXggPyBgJHt0aGlzLmJhc2VQYXRofS8ke3N1ZmZpeH1gIDogdGhpcy5iYXNlUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRzKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnRzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGxpc3Rpbmcg4oCUIHJlcG9ydHMgQU5EIHRoZSBmb2xkZXJzIHRoZXkgYXJlIGZpbGVkIGludG8g4oCUXG4gIC8vIGZyb20gdGhlIG9uZSBHRVQuIE5vIGBrZXlgLCBiZWNhdXNlIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHRoZSBhbnN3ZXIgaGVyZTtcbiAgLy8gcmVwb3J0cygpIGtlZXBzIGl0cyAncmVwb3J0cycga2V5IGZvciBjYWxsZXJzIHRoYXQgb25seSB3YW50IHRoZSBmbGF0IGxpc3QuXG4gIHB1YmxpYyB0cmVlKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgeyBuYW1lLCByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBGaWxlIGEgcmVwb3J0IHVuZGVyIGEgZm9sZGVyLCBvciBwYXNzIG51bGwgdG8gbW92ZSBpdCB0byB0aGUgcm9vdC4gU2VudFxuICAvLyBleHBsaWNpdGx5IChuZXZlciBvbWl0dGVkKSBzbyB0aGUgYmFja2VuZCBjYW4gdGVsbCBcIm1vdmUgdG8gcm9vdFwiIGZyb21cbiAgLy8gXCJsZWF2ZSB0aGUgZm9sZGVyIGFsb25lXCIuXG4gIHB1YmxpYyBtb3ZlUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydEZvbGRlcklkOiBudW1iZXIgfCBudWxsLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgcmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZvbGRlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ2ZvbGRlcnMnKSxcbiAgICAgIHsgbmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm9sZGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lIGFuZC9vciBtb3ZlIGEgZm9sZGVyLiBPbmx5IHRoZSBrZXlzIHBhc3NlZCBhcmUgYWN0ZWQgb24gc2VydmVyLXNpZGUsXG4gIC8vIHNvIGEgcmVuYW1lIG5ldmVyIGRpc3R1cmJzIHRoZSBwYXJlbnQgYW5kIGEgZHJhZyBuZXZlciBkaXN0dXJicyB0aGUgbmFtZS5cbiAgcHVibGljIHVwZGF0ZUZvbGRlcihcbiAgICByZXBvcnRGb2xkZXJJZDogbnVtYmVyLFxuICAgIGZvbGRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAgZm9sZGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZSwgd2hhdGV2ZXIgdGhlIGZvbGRlciBob2xkczogaXRzIGNvbnRlbnRzIGxlYXZlIHRoZSBsaXN0aW5nIHdpdGhcbiAgLy8gaXQsIGFuZCB1bmRlbGV0ZUZvbGRlcigpIGJyaW5ncyB0aGUgbG90IGJhY2suXG4gIHB1YmxpYyBkZWxldGVGb2xkZXIocmVwb3J0Rm9sZGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIGZvbGRlciB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgZm9sZGVyXG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gQW55IGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IGlzIHJlc3RvcmVkIHRvbywgc29cbiAgLy8gaXQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVdpZHRoLCBwYWdlSGVpZ2h0LCBsYXlvdXQsXG4gIC8vIHRpbWV6b25lLCBsb2NhbGUsIGN1cnJlbmN5LCBzdHlsZXMsIGhlYWRlckZvb3RlciB9IOKAlCBzdHlsZXMgY2FycnkgdGhlXG4gIC8vIHJlcG9ydCdzIHR5cG9ncmFwaGljIGNvbmZpZyAoZS5nLiBoZWFkaW5nIHNpemUpLCBoZWFkZXJGb290ZXIgdGhlXG4gIC8vIGhlYWRlci9mb290ZXIgYmFuZCBkZXB0aHMgaW4gaW5jaGVzLiBUaGUgcGFnZSBzaXplIGlzIGluIGluY2hlcyBhbmRcbiAgLy8gd2lkdGgvaGVpZ2h0IGdvIHRvZ2V0aGVyLiBsb2NhbGUgKGEgQkNQIDQ3IHRhZykgYW5kIGN1cnJlbmN5IChhbiBJU08gNDIxN1xuICAvLyBjb2RlKSBhcmUgZWFjaCBzZW50IG9ubHkgdG8gY2hhbmdlIHRoZW07ICcnIHJldHVybnMgdGhlIHJlcG9ydCB0byB0aGVcbiAgLy8gZGVmYXVsdCwgYW5kIHRoZSBjdXJyZW5jeSBvbmx5IG5hbWVzIHdoYXQgdGhlIGFtb3VudHMgYXJlIGluLlxuICBwdWJsaWMgdXBkYXRlKHJlcG9ydElkOiBudW1iZXIsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQXBwZW5kIGEgYmxhbmsgcGFnZSB0byB0aGUgcmVwb3J0OyByZXNvbHZlcyB0byB0aGUgbmV3IHBhZ2UuXG4gIHB1YmxpYyBhZGRQYWdlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQW55IHN1YnNldCBvZiB7IG5hbWUsIG1hc3RlckhpZGRlbiB9LiBBbiBlbXB0eSBuYW1lIGlzIHN0b3JlZCBhcyBudWxsXG4gIC8vIHNlcnZlci1zaWRlLCB3aGljaCBwdXRzIHRoZSB0YWIgYmFjayBvbiBpdHMgcG9zaXRpb25hbCBcIlBhZ2UgTlwiIGxhYmVsO1xuICAvLyBtYXN0ZXJIaWRkZW4gaGlkZXMgdGhlIHJlcG9ydCdzIGhlYWRlciBhbmQgZm9vdGVyIG9uIHRoaXMgcGFnZS5cbiAgcHVibGljIHVwZGF0ZVBhZ2UoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBwYWdlSWQ6IG51bWJlcixcbiAgICBwYWdlOiB7IG5hbWU/OiBzdHJpbmc7IG1hc3RlckhpZGRlbj86IGJvb2xlYW4gfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy8ke3BhZ2VJZH1gKSxcbiAgICAgIHBhZ2UsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEZWxldGUgYSBwYWdlIGFuZCBldmVyeXRoaW5nIG9uIGl0LiBSZWZ1c2VkIHNlcnZlci1zaWRlIGZvciB0aGUgbGFzdFxuICAvLyByZW1haW5pbmcgcGFnZSDigJQgYSByZXBvcnQgd2l0aCBubyBjYW52YXMgaXMgYSBkZWxldGVkIHJlcG9ydCwgbm90IGEgcGFnZVxuICAvLyBvcGVyYXRpb24uXG4gIHB1YmxpYyBkZWxldGVQYWdlKHJlcG9ydElkOiBudW1iZXIsIHBhZ2VJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBlcnNpc3QgdGhlIHRhYiBvcmRlciBhZnRlciBhIGRyYWcg4oCUIHRoZSB3aG9sZSBsaXN0LCBpbiBpdHMgbmV3IG9yZGVyLCBzb1xuICAvLyB0aGUgc2VxdWVuY2Ugc3RheXMgZ2FwbGVzcyB3aXRob3V0IHRoZSBzZXJ2ZXIgaW5mZXJyaW5nIHRoZSBtb3ZlLlxuICBwdWJsaWMgc2F2ZVBhZ2VQb3NpdGlvbnMoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBwb3NpdGlvbnM6IHsgcGFnZUlkOiBudW1iZXI7IG9yZGVyOiBudW1iZXIgfVtdLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3M6IGFueSBzdWJzZXQgb2YgeyB0aXRsZSwgcGFkZGluZyB9IOKAlCB0aGUgaHVtYW4tZmFjaW5nXG4gIC8vIGRpYWxvZyBlZGl0cyDigJQgb3IgYSB0ZXh0IGJsb2NrJ3MgeyBodG1sIH0gZnJvbSBpdHMgaW5saW5lIGVkaXRvcjsgZ2VvbWV0cnlcbiAgLy8gKHgveS93L2gvZmxvd1dpZHRoKSBpcyBwZXJzaXN0ZWQgdmlhIHNhdmVQb3NpdGlvbnMgZnJvbSB0aGUgY2FudmFzIGluc3RlYWQuXG4gIHB1YmxpYyB1cGRhdGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NldHRpbmdzYCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGxhY2UgYSB0ZXh0IGJsb2NrIOKAlCBvbiBhIHBhZ2UsIG9yIGluIHRoZSBoZWFkZXIvZm9vdGVyIHdoZW4gcGFnZUlkIGlzXG4gIC8vIG9taXR0ZWQuIFRoZSBvbmx5IGNvbXBvbmVudCB0aGUgVUkgY3JlYXRlcyBpdHNlbGY6IGNoYXJ0cywgbGlzdHMgYW5kIEtQSXNcbiAgLy8gbmVlZCBhIHF1ZXJ5IGFuZCBjb21lIGZyb20gdGhlIGNoYXQuIFJlc29sdmVzIHRvIHsgaWQgfS5cbiAgcHVibGljIGFkZFRleHQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB0ZXh0OiB7IHBhZ2VJZD86IG51bWJlcjsgaHRtbD86IHN0cmluZzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHNgKSxcbiAgICAgIHRleHQsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBvbmUgY29tcG9uZW50IGZyb20gdGhlIGNhbnZhcywgdG9nZXRoZXIgd2l0aCBpdHMgZmlsdGVycyBhbmQgYW55XG4gIC8vIGZpbHRlciBncm91cCB0aGV5IGxlYXZlIGVtcHR5LiBTb2Z0IHNlcnZlci1zaWRlLCBidXQgdGhlcmUgaXMgbm8gcmVzdG9yZVxuICAvLyBhbnl3aGVyZSBpbiB0aGUgVUksIHNvIHRoZSBkaWFsb2cncyBjb25maXJtIHByZXNlbnRzIGl0IGFzIHBlcm1hbmVudC5cbiAgcHVibGljIGRlbGV0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlOiB0aGUgcmVwb3J0IGxlYXZlcyB0aGUgbGlzdGluZyBidXQga2VlcHMgaXRzIHBhZ2VzIGFuZFxuICAvLyBjb21wb25lbnRzLCBzbyB1bmRlbGV0ZSgpIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGRvY3VtZW50LlxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgcmVwb3J0IHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSByZXBvcnRcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBJdHMgZm9sZGVyIGlzIHJlc3RvcmVkIHRvbyB3aGVuIGl0IGlzIGRlbGV0ZWQsXG4gIC8vIG9yIGluc2lkZSBvbmUgdGhhdCBpcywgc28gdGhlIHJlcG9ydCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgYXNzZW1ibGVkIHN0cnVjdHVyZTogcGFnZXMg4oaSIGNvbXBvbmVudHMgKCsgdGhlaXIgZmlsdGVycykgYW5kIHRoZVxuICAvLyByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzLlxuICBwdWJsaWMgZ2V0KHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBlcnNpc3QgZ2VvbWV0cnkgZm9yIHRoZSBtb3ZlZCBjb21wb25lbnRzIG9ubHkg4oCUIGFueSBzdWJzZXQgb2ZcbiAgLy8geyB4LCB5LCB3LCBoIH0gKGluY2hlcyksIGZsb3dXaWR0aCAocGVyY2VudCkgYW5kIG9yZGVyIChmbG93IHBvc2l0aW9uKS5cbiAgcHVibGljIHNhdmVQb3NpdGlvbnMoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBwb3NpdGlvbnM6ICh7IGNvbXBvbmVudElkOiBudW1iZXIgfSAmIFBhcnRpYWw8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXI7IGZsb3dXaWR0aDogbnVtYmVyOyBvcmRlcjogbnVtYmVyIH0+KVtdLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvcG9zaXRpb25zYCksXG4gICAgICB7IHBvc2l0aW9ucyB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE9uZSBjb21wb25lbnQncyBkYXRhLiBUaGUgYm9keSBjYXJyaWVzIGV2ZXJ5dGhpbmcgc2Vzc2lvbi1zY29wZWQ6IHRoZVxuICAvLyByZXNvbHZlZCBmaWx0ZXIgdmFsdWVzIGFuZCB0aGUgY29tcG9uZW50J3Mgb3duIGludGVyYWN0aW9uIHN0YXRlLlxuICAvL1xuICAvLyBgaXNFeHBvcnRgIG1hcmtzIHRoZSByZWFkIGFzIHBhcnQgb2YgYSBQREYvUG93ZXJQb2ludCByZW5kZXIuIFRoZSBzZXJ2ZXJcbiAgLy8gZ2l2ZXMgdGhvc2UgYSBsb25nZXIgcGVyLXN0YXRlbWVudCBjZWlsaW5nIHRoYW4gYW4gb24tc2NyZWVuIHRpbGUsIGJlY2F1c2VcbiAgLy8gYSByZWFkZXIgd2F0Y2hpbmcgYW4gZXhwb3J0IHByb2dyZXNzIGJhciBjYW4gd2FpdCBmb3IgYSBxdWVyeSBub2JvZHkgd291bGRcbiAgLy8gdG9sZXJhdGUgd2FpdGluZyBmb3Igb24gYSBkYXNoYm9hcmQuXG4gIHB1YmxpYyBjb21wb25lbnREYXRhKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9kYXRhYCksXG4gICAgICB7IGZpbHRlcnMsIHN0YXRlLCBleHBvcnQ6IGlzRXhwb3J0IH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2RhdGEnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIG9uZSBjb21wb25lbnQgdG8gQ1NWIHNlcnZlci1zaWRlOiB0aGUgZmlsZSBpcyB3aGF0IHRoZSBzY3JlZW5cbiAgLy8gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIHJlbmRlcmVkLCBhIGxpc3QgaW4gZnVsbCBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIpLlxuICAvLyBUaGUgYmFja2VuZCBzdHJlYW1zIHBlcmNlbnRhZ2UgcHJvZ3Jlc3Mgd2hpbGUgaXQgd3JpdGVzLlxuICAvL1xuICAvLyBrZXk6IG51bGwgb24gcHVycG9zZSwgdW5saWtlIHRoZSBrZXk6ICd1cmwnIHByZXNpZ25lZC1leHBvcnQgcGF0dGVybjogdGhlXG4gIC8vIHJlc3BvbnNlIGFsc28gY2FycmllcyBgbm90ZXNgLCB0aGUgc2VudGVuY2VzIHNheWluZyBob3cgdGhlIGZpbGUgZmFsbHNcbiAgLy8gc2hvcnQgb2YgdGhlIGZ1bGwgcmVzdWx0LCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gc2hvdyB0aGVtIGJlZm9yZSBpdCBoYW5kc1xuICAvLyB0aGUgdXJsIHRvIEZzUHJvY2Vzcy5kb3dubG9hZC5cbiAgcHVibGljIGV4cG9ydENvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPENvbXBvbmVudEV4cG9ydFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9leHBvcnRgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIEVWRVJZIGNvbXBvbmVudCBvbiB0aGUgcmVwb3J0IOKAlCBvciBvbiBvbmUgcGFnZSDigJQgc2VydmVyLXNpZGUgYW5kXG4gIC8vIHJlc29sdmVzIHRvIGEgcHJlc2lnbmVkIFVSTCBmb3IgYSB6aXAgb2Ygb25lIENTViBwZXIgY29tcG9uZW50LCBmb2xkZXJlZCBieVxuICAvLyBwYWdlLCBwbHVzIGFuICdFeHBvcnQgTm90ZXMudHh0Jy4gYGZpbHRlcnNgIGNhcnJpZXMgdGhlIHJlc29sdmVkIHZhbHVlcyBmb3JcbiAgLy8gZXZlcnkgY29tcG9uZW50IHRvZ2V0aGVyOyBlYWNoIG9uZSBwaWNrcyBvdXQgaXRzIG93bi4gYGZyZXF1ZW5jeWAgaXMgdGhlXG4gIC8vIHJlcG9ydCdzIGdyb3VwLWJ5IGdyYWluICh0aGUgc2VydmVyIHJlLWJ1Y2tldHMgb25seSB0aW1lLXNlcmllcyBjaGFydHMgdG9cbiAgLy8gaXQpLCBhbmQgYGZpbHRlclN1bW1hcnlgIGlzIHRoZSBmaWx0ZXIgYmFyIGFzIHRoZSB2aWV3ZXIgcmVhZHMgaXQsIHdyaXR0ZW5cbiAgLy8gdmVyYmF0aW0gaW50byB0aGUgbm90ZXMgZmlsZS4gU2FtZSBrZWVwLWFsaXZlIGNvbnRyYWN0IGFzIGV4cG9ydENvbXBvbmVudCxcbiAgLy8gb3ZlciBhIGxvbmdlciBydW47IGNvbnN1bWUgdGhyb3VnaCBGc1Byb2Nlc3MuZG93bmxvYWQuXG4gIHB1YmxpYyBleHBvcnRSZXBvcnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICAgIGZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwgPSBudWxsLFxuICAgIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdID0gW10sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2V4cG9ydGApLFxuICAgICAge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAuLi4ocGFnZUlkID8geyBwYWdlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZyZXF1ZW5jeSA/IHsgZnJlcXVlbmN5IH0gOiB7fSksXG4gICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd1cmwnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEaXN0aW5jdCBvcHRpb25zIGZvciBhIHNlbGVjdCBmaWx0ZXIgKGRyaXZlcyBtdWx0aXNlbGVjdCBjb250cm9scykuXG4gIHB1YmxpYyBmaWx0ZXJPcHRpb25zKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9L29wdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHN0YXRlbWVudCBhIGNvbXBvbmVudCBydW5zLCBmb3IgdGhlIFNRTCB0YWIuXG4gIC8vXG4gIC8vIEZldGNoZWQgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIGNvbXBvbmVudCwgYmVjYXVzZSBhIERFUklWRUQgY29tcG9uZW50IGhhc1xuICAvLyBubyBzdG9yZWQgU1FMIOKAlCBpdCBzdG9yZXMgYSBkb2N1bWVudCwgYW5kIGl0cyBzdGF0ZW1lbnQgb25seSBleGlzdHMgb25jZVxuICAvLyB0aGUgYmFja2VuZCBjb21waWxlcyB0aGF0IGRvY3VtZW50LiBDb21waWxlZCBwZXIgcmVxdWVzdCwgZm9yIHRoZSBvbmVcbiAgLy8gY29tcG9uZW50IGJlaW5nIGxvb2tlZCBhdCwgc28gb3BlbmluZyBhIHJlcG9ydCBuZXZlciBwYXlzIGZvciBpdC5cbiAgLy9cbiAgLy8gYGtleTogbnVsbGAgYmVjYXVzZSB0aGUgd2hvbGUgZW52ZWxvcGUgaXMgdGhlIGFuc3dlciBoZXJlOiBhIHN0YWxlIGRvY3VtZW50XG4gIC8vIGNvbWVzIGJhY2sgYXMgeyBzcWw6IG51bGwsIGVycm9yLCBlcnJvclR5cGUgfSBhbmQgdW53cmFwcGluZyBvbmUgZmllbGRcbiAgLy8gd291bGQgdGhyb3cgdGhlIGRpYWdub3NpcyBhd2F5LlxuICBwdWJsaWMgY29tcG9uZW50U3FsKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRDb21wb25lbnRTcWw+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vc3FsYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgY29tcG9uZW50IFNRTCdzIGZpbHRlcmFibGUgb3V0cHV0IGNvbHVtbnMg4oCUIGRyaXZlcyB0aGUgY29sdW1uIHBpY2tlclxuICAvLyBpbiB0aGUgZmlsdGVyIFVJIHNvIGEgY29sdW1uIG5hbWUgaXMgbmV2ZXIgdHlwZWQgYnkgaGFuZC5cbiAgcHVibGljIGNvbXBvbmVudENvbHVtbnMocmVwb3J0SWQ6IG51bWJlciwgY29tcG9uZW50SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vY29sdW1uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbHVtbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBNYWtlIG9uZSBjb2x1bW4gZmlsdGVyYWJsZS4gYGxldmVsYCAoY29tcG9uZW50IHwgcmVwb3J0KSBwbGFjZXMgYSBuZXdcbiAgLy8gZ3JvdXA7IGBncm91cElkYCBpbnN0ZWFkIGxpbmtzIGludG8gYW4gZXhpc3RpbmcgZ3JvdXAuIEEgc2VsZWN0IGZpbHRlcidzXG4gIC8vIG9wdGlvbnMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50IFNRTCB3aGVuIG9wdGlvbnNTcWwgaXMgb21pdHRlZC5cbiAgcHVibGljIGFkZEZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyOiB7IGZpbHRlckNvbHVtbjogc3RyaW5nOyB0eXBlPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgbGV2ZWw/OiBzdHJpbmc7IG9wdGlvbnNTcWw/OiBzdHJpbmc7IGdyb3VwSWQ/OiBudW1iZXIgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9maWx0ZXJzYCksXG4gICAgICBmaWx0ZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciDigJQgYW55IHN1YnNldCBvZiB7IGxhYmVsLCBvcHRpb25zU3FsLCBlbmFibGVkIH0uXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGFiZWw/OiBzdHJpbmc7IG9wdGlvbnNTcWw/OiBzdHJpbmc7IGVuYWJsZWQ/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGEgZmlsdGVyIChpdHMgZ3JvdXAgZ29lcyB0b28gd2hlbiBub3RoaW5nIGVsc2UgdXNlcyBpdCkuXG4gIHB1YmxpYyBkZWxldGVGaWx0ZXIocmVwb3J0SWQ6IG51bWJlciwgZmlsdGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ2xvYmFsIEFJIGtub3dsZWRnZSBkb2N1bWVudCAob3BlcmF0b3ItYXV0aG9yZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zKVxuICAvLyBhbmQgaXRzIGZ1bGwgdmVyc2lvbiBoaXN0b3J5OiB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfS5cbiAgcHVibGljIGluc3RydWN0aW9ucyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTYXZlIGEgbmV3IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IChhcHBlbmQtb25seTsgYW4gdW5jaGFuZ2VkIHNhdmUgaXMgYVxuICAvLyBuby1vcCBzZXJ2ZXItc2lkZSkuIFJlc29sdmVzIHRvIHRoZSBzYW1lIHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZUluc3RydWN0aW9ucyhjb250ZW50OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHsgY29udGVudCB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2UgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCBjdXJyZW50IChubyBuZXcgcm93IGlzIGNyZWF0ZWQpLlxuICBwdWJsaWMgcmVzdG9yZUluc3RydWN0aW9uKGluc3RydWN0aW9uSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGBpbnN0cnVjdGlvbnMvJHtpbnN0cnVjdGlvbklkfS9yZXN0b3JlYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSdW4gYSBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZCwgc3RyZWFtZWQ6IGVtaXRzIGFuIGV2ZW50IHBlciBOREpTT04gZnJhbWVcbiAgLy8gKHsga2luZDogJ2xvZycsIGxpbmUsIHBlcmNlbnQgfSBmZWVkIGxpbmVzIGFuZCB7IGtpbmQ6ICdzZWN0aW9uJyB9IHBoYXNlXG4gIC8vIG1hcmtlcnMpIGFuZCBjb21wbGV0ZXMgd2hlbiB0aGUgYnVpbGQgZW5kcy4gRmVlZCB0aGUgbGluZXMgaW50byBGc1Byb2Nlc3MuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnN0cmVhbShcbiAgICAgICdQT1NUJyxcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7IHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICAvLyBMYXRlc3QgYnVpbGQgc3RhdHVzICsgZW50aXR5IHNjb3JlYm9hcmQ6IHsgYnVpbGQsIGRldGFpbCB9LlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0YXR1cyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3AgdGhlIHJ1bm5pbmcgYnVpbGQgKHRoZSBjdXJyZW50IHNlbWFudGljIGRhdGFiYXNlIHN0YXlzIGluIHBsYWNlKS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdG9wKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQvc3RvcCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2J1aWxkJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGVudGl0eSdzIGNhY2hlZCBBSS1jbGFzc2lmaWVkIGNvZGUgZnVuY3Rpb25zIOKAlCBsb2FkZWQgb24gZXhwYW5kLCBvbmVcbiAgLy8gZW50aXR5IGF0IGEgdGltZSwgYmVjYXVzZSB0aGUgZnVsbCBzZXQgYWNyb3NzIGFsbCBlbnRpdGllcyBpcyBmYXIgdG9vIGJpZ1xuICAvLyB0byBzaGlwIGluc2lkZSB0aGUgc2NvcmVib2FyZCBjYWxsLlxuICBwdWJsaWMgc2VtYW50aWNFbnRpdHlGdW5jdGlvbnMoZW50aXR5OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGBzZW1hbnRpYy9lbnRpdGllcy8ke2VudGl0eX0vZnVuY3Rpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZW50aXR5RnVuY3Rpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCBtb2R1bGUncyBHZW5lcmFsIHNldHRpbmdzIChzZW1hbnRpYy1idWlsZCBjb25jdXJyZW5jeSArIGl0cyBib3VuZHMpLlxuICBwdWJsaWMgc2V0dGluZ3MoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NldHRpbmdzJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2V0dGluZ3MnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbG9jYWxlcyBhbmQgY3VycmVuY2llcyBhIHJlcG9ydCBjYW4gYmUgd3JpdHRlbiBpbiwgZm9yIHRoZSByZXBvcnRcbiAgLy8gc2V0dGluZ3MnIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0czogdGhlIGRlZmF1bHQgbG9jYWxlLCBlYWNoIG9mZmVyZWRcbiAgLy8gbG9jYWxlIHdpdGggdGhlIGN1cnJlbmN5IGEgcmVwb3J0IGluIGl0IHVzZXMgd2hlbiBpdCBuYW1lcyBub25lLCBhbmQgZXZlcnlcbiAgLy8gY3VycmVuY3kgY29kZS4gT25seSBhIHNlcnZlciB0aGF0IHNlbmRzIGVmZmVjdGl2ZUxvY2FsZSBoYXMgdGhpcyByb3V0ZS5cbiAgcHVibGljIGxvY2FsZXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydExvY2FsZXM+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2xvY2FsZXMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdsb2NhbGVzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgR2VuZXJhbCBzZXR0aW5nczsgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBzZXR0aW5ncyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiB7IHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyIH0sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIGdyb3VwIOKAlCBpdHMgZXhwb3N1cmUgbGV2ZWwgKCdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCcpXG4gIC8vIGFuZC9vciBpdHMgZGVmYXVsdCB2YWx1ZSAodGhlIHZhbHVlIHNlZWRpbmcgdGhlIHJlcG9ydCBiYXIgb24gb3BlbikuIFNlbmRcbiAgLy8gYGRlZmF1bHQ6IG51bGxgIChvciBhbiBlbXB0eSBkZWZhdWx0KSB0byBjbGVhciBpdC4gT25seSB0aGUga2V5cyBwcm92aWRlZFxuICAvLyBhcmUgY2hhbmdlZC5cbiAgcHVibGljIHVwZGF0ZUZpbHRlckdyb3VwKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZ3JvdXBJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGV2ZWw/OiBSZXBvcnRGaWx0ZXJMZXZlbDsgZGVmYXVsdD86IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJncm91cHMvJHtncm91cElkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyR3JvdXAnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDOztBQWlCdkQsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSxxRkFBcUY7QUFJckYsTUFBTSxPQUFPLFVBQVU7SUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDdkUsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUU1QixrRkFBa0Y7SUFDbEYsa0RBQWtEO0lBQzFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUN2QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQy9ELENBQUM7SUFFTSxPQUFPLENBQUMsUUFBYSxFQUFFLEVBQUUsU0FBd0IsRUFBRTtRQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osS0FBSyxFQUNMO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDdkUsSUFBSSxDQUFDLFFBQWEsRUFBRSxFQUFFLFNBQXdCLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEtBQUssRUFDTCxNQUFNLENB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QVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGc0FwaSwgUmVxdWVzdENvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBDb21wb25lbnRFeHBvcnRSZXNwb25zZSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnRDb21wb25lbnRTcWwsXG4gIFJlcG9ydEZpbHRlckxldmVsLFxuICBSZXBvcnRMb2NhbGVzLFxuICBSZXBvcnRUcmVlLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIEFQSSBnYXRld2F5IGZvciB0aGUgUmVwb3J0cyBtb2R1bGUuIEV2ZXJ5IGVuZHBvaW50IGhhbmdzIG9mZiBbYmFzZVBhdGhdLFxuLy8gd2hpY2ggZGVmYXVsdHMgdG8gXCJyZXBvcnRzXCIgKHRoZSBmcmFtZXdvcmsgcmVwb3J0cyBiYWNrZW5kIGF0IC9hcGkvcmVwb3J0cylcbi8vIGFuZCBjYW4gYmUgcmVwb2ludGVkIGJ5IHRoZSBob3N0IHNvIHRoZSBwYWNrYWdlIHN0YXlzIHNlbGYtY29udGFpbmVkIGFuZCBwb3J0YWJsZS5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnREYXRhPFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfYXBpID0gaW5qZWN0KEZzQXBpKTtcblxuICAvLyBUaGUgQVBJIHJvb3QgZm9yIGV2ZXJ5IHJlcG9ydHMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZSBmcmFtZXdvcmsgcmVwb3J0c1xuICAvLyBjb250ZXh0OyBzZXQgaXQgb25jZSAoZS5nLiBmcm9tIHRoZSBob3N0J3MgcmVwb3J0IHBhZ2UpIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIGJhc2VQYXRoID0gJ3JlcG9ydHMnO1xuXG4gIC8vIEJ1aWxkIGFuIGVuZHBvaW50IHBhdGggdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYmFzZSwgZS5nLiBfcGF0aCgpID0+IFwiYWkvcmVwb3J0c1wiLFxuICAvLyBfcGF0aChgJHtpZH0vcGFnZXNgKSA9PiBcImFpL3JlcG9ydHMvMTIzL3BhZ2VzXCIuXG4gIHByaXZhdGUgX3BhdGgoc3VmZml4ID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWZmaXggPyBgJHt0aGlzLmJhc2VQYXRofS8ke3N1ZmZpeH1gIDogdGhpcy5iYXNlUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRzKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnRzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGxpc3Rpbmcg4oCUIHJlcG9ydHMgQU5EIHRoZSBmb2xkZXJzIHRoZXkgYXJlIGZpbGVkIGludG8g4oCUXG4gIC8vIGZyb20gdGhlIG9uZSBHRVQuIE5vIGBrZXlgLCBiZWNhdXNlIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHRoZSBhbnN3ZXIgaGVyZTtcbiAgLy8gcmVwb3J0cygpIGtlZXBzIGl0cyAncmVwb3J0cycga2V5IGZvciBjYWxsZXJzIHRoYXQgb25seSB3YW50IHRoZSBmbGF0IGxpc3QuXG4gIHB1YmxpYyB0cmVlKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgeyBuYW1lLCByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBGaWxlIGEgcmVwb3J0IHVuZGVyIGEgZm9sZGVyLCBvciBwYXNzIG51bGwgdG8gbW92ZSBpdCB0byB0aGUgcm9vdC4gU2VudFxuICAvLyBleHBsaWNpdGx5IChuZXZlciBvbWl0dGVkKSBzbyB0aGUgYmFja2VuZCBjYW4gdGVsbCBcIm1vdmUgdG8gcm9vdFwiIGZyb21cbiAgLy8gXCJsZWF2ZSB0aGUgZm9sZGVyIGFsb25lXCIuXG4gIHB1YmxpYyBtb3ZlUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydEZvbGRlcklkOiBudW1iZXIgfCBudWxsLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgcmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZvbGRlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ2ZvbGRlcnMnKSxcbiAgICAgIHsgbmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm9sZGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lIGFuZC9vciBtb3ZlIGEgZm9sZGVyLiBPbmx5IHRoZSBrZXlzIHBhc3NlZCBhcmUgYWN0ZWQgb24gc2VydmVyLXNpZGUsXG4gIC8vIHNvIGEgcmVuYW1lIG5ldmVyIGRpc3R1cmJzIHRoZSBwYXJlbnQgYW5kIGEgZHJhZyBuZXZlciBkaXN0dXJicyB0aGUgbmFtZS5cbiAgcHVibGljIHVwZGF0ZUZvbGRlcihcbiAgICByZXBvcnRGb2xkZXJJZDogbnVtYmVyLFxuICAgIGZvbGRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAgZm9sZGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZSwgd2hhdGV2ZXIgdGhlIGZvbGRlciBob2xkczogaXRzIGNvbnRlbnRzIGxlYXZlIHRoZSBsaXN0aW5nIHdpdGhcbiAgLy8gaXQsIGFuZCB1bmRlbGV0ZUZvbGRlcigpIGJyaW5ncyB0aGUgbG90IGJhY2suXG4gIHB1YmxpYyBkZWxldGVGb2xkZXIocmVwb3J0Rm9sZGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIGZvbGRlciB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgZm9sZGVyXG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gQW55IGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IGlzIHJlc3RvcmVkIHRvbywgc29cbiAgLy8gaXQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVdpZHRoLCBwYWdlSGVpZ2h0LCB0aW1lem9uZSxcbiAgLy8gbG9jYWxlLCBjdXJyZW5jeSwgc3R5bGVzLCBoZWFkZXJGb290ZXIgfSDigJQgc3R5bGVzIGNhcnJ5IHRoZVxuICAvLyByZXBvcnQncyB0eXBvZ3JhcGhpYyBjb25maWcgKGUuZy4gaGVhZGluZyBzaXplKSwgaGVhZGVyRm9vdGVyIHRoZVxuICAvLyBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzIGluIGluY2hlcy4gVGhlIHBhZ2Ugc2l6ZSBpcyBpbiBpbmNoZXMgYW5kXG4gIC8vIHdpZHRoL2hlaWdodCBnbyB0b2dldGhlci4gbG9jYWxlIChhIEJDUCA0NyB0YWcpIGFuZCBjdXJyZW5jeSAoYW4gSVNPIDQyMTdcbiAgLy8gY29kZSkgYXJlIGVhY2ggc2VudCBvbmx5IHRvIGNoYW5nZSB0aGVtOyAnJyByZXR1cm5zIHRoZSByZXBvcnQgdG8gdGhlXG4gIC8vIGRlZmF1bHQsIGFuZCB0aGUgY3VycmVuY3kgb25seSBuYW1lcyB3aGF0IHRoZSBhbW91bnRzIGFyZSBpbi5cbiAgcHVibGljIHVwZGF0ZShyZXBvcnRJZDogbnVtYmVyLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2UgdG8gdGhlIHJlcG9ydDsgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFueSBzdWJzZXQgb2YgeyBuYW1lLCBtYXN0ZXJIaWRkZW4gfS4gQW4gZW1wdHkgbmFtZSBpcyBzdG9yZWQgYXMgbnVsbFxuICAvLyBzZXJ2ZXItc2lkZSwgd2hpY2ggcHV0cyB0aGUgdGFiIGJhY2sgb24gaXRzIHBvc2l0aW9uYWwgXCJQYWdlIE5cIiBsYWJlbDtcbiAgLy8gbWFzdGVySGlkZGVuIGhpZGVzIHRoZSByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBvbiB0aGlzIHBhZ2UuXG4gIHB1YmxpYyB1cGRhdGVQYWdlKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgcGFnZTogeyBuYW1lPzogc3RyaW5nOyBtYXN0ZXJIaWRkZW4/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICBwYWdlLFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIGEgcGFnZSBhbmQgZXZlcnl0aGluZyBvbiBpdC4gUmVmdXNlZCBzZXJ2ZXItc2lkZSBmb3IgdGhlIGxhc3RcbiAgLy8gcmVtYWluaW5nIHBhZ2Ug4oCUIGEgcmVwb3J0IHdpdGggbm8gY2FudmFzIGlzIGEgZGVsZXRlZCByZXBvcnQsIG5vdCBhIHBhZ2VcbiAgLy8gb3BlcmF0aW9uLlxuICBwdWJsaWMgZGVsZXRlUGFnZShyZXBvcnRJZDogbnVtYmVyLCBwYWdlSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IHRoZSB0YWIgb3JkZXIgYWZ0ZXIgYSBkcmFnIOKAlCB0aGUgd2hvbGUgbGlzdCwgaW4gaXRzIG5ldyBvcmRlciwgc29cbiAgLy8gdGhlIHNlcXVlbmNlIHN0YXlzIGdhcGxlc3Mgd2l0aG91dCB0aGUgc2VydmVyIGluZmVycmluZyB0aGUgbW92ZS5cbiAgcHVibGljIHNhdmVQYWdlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiB7IHBhZ2VJZDogbnVtYmVyOyBvcmRlcjogbnVtYmVyIH1bXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgdGl0bGUsIHBhZGRpbmcgfSDigJQgdGhlIGh1bWFuLWZhY2luZ1xuICAvLyBkaWFsb2cgZWRpdHMg4oCUIG9yIGEgdGV4dCBibG9jaydzIHsgaHRtbCB9IGZyb20gaXRzIGlubGluZSBlZGl0b3I7IGdlb21ldHJ5XG4gIC8vICh4L3kvdy9oKSBpcyBwZXJzaXN0ZWQgdmlhIHNhdmVQb3NpdGlvbnMgZnJvbSB0aGUgY2FudmFzIGluc3RlYWQuXG4gIHB1YmxpYyB1cGRhdGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NldHRpbmdzYCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGxhY2UgYSB0ZXh0IGJsb2NrIOKAlCBvbiBhIHBhZ2UsIG9yIGluIHRoZSBoZWFkZXIvZm9vdGVyIHdoZW4gcGFnZUlkIGlzXG4gIC8vIG9taXR0ZWQuIFRoZSBvbmx5IGNvbXBvbmVudCB0aGUgVUkgY3JlYXRlcyBpdHNlbGY6IGNoYXJ0cywgbGlzdHMgYW5kIEtQSXNcbiAgLy8gbmVlZCBhIHF1ZXJ5IGFuZCBjb21lIGZyb20gdGhlIGNoYXQuIFJlc29sdmVzIHRvIHsgaWQgfS5cbiAgcHVibGljIGFkZFRleHQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB0ZXh0OiB7IHBhZ2VJZD86IG51bWJlcjsgaHRtbD86IHN0cmluZzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHNgKSxcbiAgICAgIHRleHQsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBvbmUgY29tcG9uZW50IGZyb20gdGhlIGNhbnZhcywgdG9nZXRoZXIgd2l0aCBpdHMgZmlsdGVycyBhbmQgYW55XG4gIC8vIGZpbHRlciBncm91cCB0aGV5IGxlYXZlIGVtcHR5LiBTb2Z0IHNlcnZlci1zaWRlLCBidXQgdGhlcmUgaXMgbm8gcmVzdG9yZVxuICAvLyBhbnl3aGVyZSBpbiB0aGUgVUksIHNvIHRoZSBkaWFsb2cncyBjb25maXJtIHByZXNlbnRzIGl0IGFzIHBlcm1hbmVudC5cbiAgcHVibGljIGRlbGV0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlOiB0aGUgcmVwb3J0IGxlYXZlcyB0aGUgbGlzdGluZyBidXQga2VlcHMgaXRzIHBhZ2VzIGFuZFxuICAvLyBjb21wb25lbnRzLCBzbyB1bmRlbGV0ZSgpIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGRvY3VtZW50LlxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgcmVwb3J0IHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSByZXBvcnRcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBJdHMgZm9sZGVyIGlzIHJlc3RvcmVkIHRvbyB3aGVuIGl0IGlzIGRlbGV0ZWQsXG4gIC8vIG9yIGluc2lkZSBvbmUgdGhhdCBpcywgc28gdGhlIHJlcG9ydCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgYXNzZW1ibGVkIHN0cnVjdHVyZTogcGFnZXMg4oaSIGNvbXBvbmVudHMgKCsgdGhlaXIgZmlsdGVycykgYW5kIHRoZVxuICAvLyByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzLlxuICBwdWJsaWMgZ2V0KHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBlcnNpc3QgZ2VvbWV0cnkgZm9yIHRoZSBtb3ZlZCBjb21wb25lbnRzIG9ubHkg4oCUIGFueSBzdWJzZXQgb2ZcbiAgLy8geyB4LCB5LCB3LCBoIH0gKGluY2hlcykuXG4gIHB1YmxpYyBzYXZlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiAoeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBQYXJ0aWFsPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0+KVtdLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvcG9zaXRpb25zYCksXG4gICAgICB7IHBvc2l0aW9ucyB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE9uZSBjb21wb25lbnQncyBkYXRhLiBUaGUgYm9keSBjYXJyaWVzIGV2ZXJ5dGhpbmcgc2Vzc2lvbi1zY29wZWQ6IHRoZVxuICAvLyByZXNvbHZlZCBmaWx0ZXIgdmFsdWVzIGFuZCB0aGUgY29tcG9uZW50J3Mgb3duIGludGVyYWN0aW9uIHN0YXRlLlxuICAvL1xuICAvLyBgaXNFeHBvcnRgIG1hcmtzIHRoZSByZWFkIGFzIHBhcnQgb2YgYSBQREYvUG93ZXJQb2ludCByZW5kZXIuIFRoZSBzZXJ2ZXJcbiAgLy8gZ2l2ZXMgdGhvc2UgYSBsb25nZXIgcGVyLXN0YXRlbWVudCBjZWlsaW5nIHRoYW4gYW4gb24tc2NyZWVuIHRpbGUsIGJlY2F1c2VcbiAgLy8gYSByZWFkZXIgd2F0Y2hpbmcgYW4gZXhwb3J0IHByb2dyZXNzIGJhciBjYW4gd2FpdCBmb3IgYSBxdWVyeSBub2JvZHkgd291bGRcbiAgLy8gdG9sZXJhdGUgd2FpdGluZyBmb3Igb24gYSBkYXNoYm9hcmQuXG4gIHB1YmxpYyBjb21wb25lbnREYXRhKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9kYXRhYCksXG4gICAgICB7IGZpbHRlcnMsIHN0YXRlLCBleHBvcnQ6IGlzRXhwb3J0IH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2RhdGEnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIG9uZSBjb21wb25lbnQgdG8gQ1NWIHNlcnZlci1zaWRlOiB0aGUgZmlsZSBpcyB3aGF0IHRoZSBzY3JlZW5cbiAgLy8gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIHJlbmRlcmVkLCBhIGxpc3QgaW4gZnVsbCBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIpLlxuICAvLyBUaGUgYmFja2VuZCBzdHJlYW1zIHBlcmNlbnRhZ2UgcHJvZ3Jlc3Mgd2hpbGUgaXQgd3JpdGVzLlxuICAvL1xuICAvLyBrZXk6IG51bGwgb24gcHVycG9zZSwgdW5saWtlIHRoZSBrZXk6ICd1cmwnIHByZXNpZ25lZC1leHBvcnQgcGF0dGVybjogdGhlXG4gIC8vIHJlc3BvbnNlIGFsc28gY2FycmllcyBgbm90ZXNgLCB0aGUgc2VudGVuY2VzIHNheWluZyBob3cgdGhlIGZpbGUgZmFsbHNcbiAgLy8gc2hvcnQgb2YgdGhlIGZ1bGwgcmVzdWx0LCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gc2hvdyB0aGVtIGJlZm9yZSBpdCBoYW5kc1xuICAvLyB0aGUgdXJsIHRvIEZzUHJvY2Vzcy5kb3dubG9hZC5cbiAgcHVibGljIGV4cG9ydENvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPENvbXBvbmVudEV4cG9ydFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9leHBvcnRgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIEVWRVJZIGNvbXBvbmVudCBvbiB0aGUgcmVwb3J0IOKAlCBvciBvbiBvbmUgcGFnZSDigJQgc2VydmVyLXNpZGUgYW5kXG4gIC8vIHJlc29sdmVzIHRvIGEgcHJlc2lnbmVkIFVSTCBmb3IgYSB6aXAgb2Ygb25lIENTViBwZXIgY29tcG9uZW50LCBmb2xkZXJlZCBieVxuICAvLyBwYWdlLCBwbHVzIGFuICdFeHBvcnQgTm90ZXMudHh0Jy4gYGZpbHRlcnNgIGNhcnJpZXMgdGhlIHJlc29sdmVkIHZhbHVlcyBmb3JcbiAgLy8gZXZlcnkgY29tcG9uZW50IHRvZ2V0aGVyOyBlYWNoIG9uZSBwaWNrcyBvdXQgaXRzIG93bi4gYGZyZXF1ZW5jeWAgaXMgdGhlXG4gIC8vIHJlcG9ydCdzIGdyb3VwLWJ5IGdyYWluICh0aGUgc2VydmVyIHJlLWJ1Y2tldHMgb25seSB0aW1lLXNlcmllcyBjaGFydHMgdG9cbiAgLy8gaXQpLCBhbmQgYGZpbHRlclN1bW1hcnlgIGlzIHRoZSBmaWx0ZXIgYmFyIGFzIHRoZSB2aWV3ZXIgcmVhZHMgaXQsIHdyaXR0ZW5cbiAgLy8gdmVyYmF0aW0gaW50byB0aGUgbm90ZXMgZmlsZS4gU2FtZSBrZWVwLWFsaXZlIGNvbnRyYWN0IGFzIGV4cG9ydENvbXBvbmVudCxcbiAgLy8gb3ZlciBhIGxvbmdlciBydW47IGNvbnN1bWUgdGhyb3VnaCBGc1Byb2Nlc3MuZG93bmxvYWQuXG4gIHB1YmxpYyBleHBvcnRSZXBvcnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICAgIGZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwgPSBudWxsLFxuICAgIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdID0gW10sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2V4cG9ydGApLFxuICAgICAge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAuLi4ocGFnZUlkID8geyBwYWdlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZyZXF1ZW5jeSA/IHsgZnJlcXVlbmN5IH0gOiB7fSksXG4gICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd1cmwnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEaXN0aW5jdCBvcHRpb25zIGZvciBhIHNlbGVjdCBmaWx0ZXIgKGRyaXZlcyBtdWx0aXNlbGVjdCBjb250cm9scykuXG4gIHB1YmxpYyBmaWx0ZXJPcHRpb25zKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9L29wdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHN0YXRlbWVudCBhIGNvbXBvbmVudCBydW5zLCBmb3IgdGhlIFNRTCB0YWIuXG4gIC8vXG4gIC8vIEZldGNoZWQgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIGNvbXBvbmVudCwgYmVjYXVzZSBhIERFUklWRUQgY29tcG9uZW50IGhhc1xuICAvLyBubyBzdG9yZWQgU1FMIOKAlCBpdCBzdG9yZXMgYSBkb2N1bWVudCwgYW5kIGl0cyBzdGF0ZW1lbnQgb25seSBleGlzdHMgb25jZVxuICAvLyB0aGUgYmFja2VuZCBjb21waWxlcyB0aGF0IGRvY3VtZW50LiBDb21waWxlZCBwZXIgcmVxdWVzdCwgZm9yIHRoZSBvbmVcbiAgLy8gY29tcG9uZW50IGJlaW5nIGxvb2tlZCBhdCwgc28gb3BlbmluZyBhIHJlcG9ydCBuZXZlciBwYXlzIGZvciBpdC5cbiAgLy9cbiAgLy8gYGtleTogbnVsbGAgYmVjYXVzZSB0aGUgd2hvbGUgZW52ZWxvcGUgaXMgdGhlIGFuc3dlciBoZXJlOiBhIHN0YWxlIGRvY3VtZW50XG4gIC8vIGNvbWVzIGJhY2sgYXMgeyBzcWw6IG51bGwsIGVycm9yLCBlcnJvclR5cGUgfSBhbmQgdW53cmFwcGluZyBvbmUgZmllbGRcbiAgLy8gd291bGQgdGhyb3cgdGhlIGRpYWdub3NpcyBhd2F5LlxuICBwdWJsaWMgY29tcG9uZW50U3FsKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRDb21wb25lbnRTcWw+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vc3FsYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgY29tcG9uZW50IFNRTCdzIGZpbHRlcmFibGUgb3V0cHV0IGNvbHVtbnMg4oCUIGRyaXZlcyB0aGUgY29sdW1uIHBpY2tlclxuICAvLyBpbiB0aGUgZmlsdGVyIFVJIHNvIGEgY29sdW1uIG5hbWUgaXMgbmV2ZXIgdHlwZWQgYnkgaGFuZC5cbiAgcHVibGljIGNvbXBvbmVudENvbHVtbnMocmVwb3J0SWQ6IG51bWJlciwgY29tcG9uZW50SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vY29sdW1uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbHVtbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBNYWtlIG9uZSBjb2x1bW4gZmlsdGVyYWJsZS4gYGxldmVsYCAoY29tcG9uZW50IHwgcmVwb3J0KSBwbGFjZXMgYSBuZXdcbiAgLy8gZ3JvdXA7IGBncm91cElkYCBpbnN0ZWFkIGxpbmtzIGludG8gYW4gZXhpc3RpbmcgZ3JvdXAuIEEgc2VsZWN0IGZpbHRlcidzXG4gIC8vIG9wdGlvbnMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50IFNRTCB3aGVuIG9wdGlvbnNTcWwgaXMgb21pdHRlZC5cbiAgcHVibGljIGFkZEZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyOiB7IGZpbHRlckNvbHVtbjogc3RyaW5nOyB0eXBlPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgbGV2ZWw/OiBzdHJpbmc7IG9wdGlvbnNTcWw/OiBzdHJpbmc7IGdyb3VwSWQ/OiBudW1iZXIgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9maWx0ZXJzYCksXG4gICAgICBmaWx0ZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciDigJQgYW55IHN1YnNldCBvZiB7IGxhYmVsLCBvcHRpb25zU3FsLCBlbmFibGVkIH0uXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGFiZWw/OiBzdHJpbmc7IG9wdGlvbnNTcWw/OiBzdHJpbmc7IGVuYWJsZWQ/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGEgZmlsdGVyIChpdHMgZ3JvdXAgZ29lcyB0b28gd2hlbiBub3RoaW5nIGVsc2UgdXNlcyBpdCkuXG4gIHB1YmxpYyBkZWxldGVGaWx0ZXIocmVwb3J0SWQ6IG51bWJlciwgZmlsdGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ2xvYmFsIEFJIGtub3dsZWRnZSBkb2N1bWVudCAob3BlcmF0b3ItYXV0aG9yZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zKVxuICAvLyBhbmQgaXRzIGZ1bGwgdmVyc2lvbiBoaXN0b3J5OiB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfS5cbiAgcHVibGljIGluc3RydWN0aW9ucyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTYXZlIGEgbmV3IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IChhcHBlbmQtb25seTsgYW4gdW5jaGFuZ2VkIHNhdmUgaXMgYVxuICAvLyBuby1vcCBzZXJ2ZXItc2lkZSkuIFJlc29sdmVzIHRvIHRoZSBzYW1lIHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZUluc3RydWN0aW9ucyhjb250ZW50OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHsgY29udGVudCB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2UgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCBjdXJyZW50IChubyBuZXcgcm93IGlzIGNyZWF0ZWQpLlxuICBwdWJsaWMgcmVzdG9yZUluc3RydWN0aW9uKGluc3RydWN0aW9uSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGBpbnN0cnVjdGlvbnMvJHtpbnN0cnVjdGlvbklkfS9yZXN0b3JlYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSdW4gYSBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZCwgc3RyZWFtZWQ6IGVtaXRzIGFuIGV2ZW50IHBlciBOREpTT04gZnJhbWVcbiAgLy8gKHsga2luZDogJ2xvZycsIGxpbmUsIHBlcmNlbnQgfSBmZWVkIGxpbmVzIGFuZCB7IGtpbmQ6ICdzZWN0aW9uJyB9IHBoYXNlXG4gIC8vIG1hcmtlcnMpIGFuZCBjb21wbGV0ZXMgd2hlbiB0aGUgYnVpbGQgZW5kcy4gRmVlZCB0aGUgbGluZXMgaW50byBGc1Byb2Nlc3MuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnN0cmVhbShcbiAgICAgICdQT1NUJyxcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7IHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICAvLyBMYXRlc3QgYnVpbGQgc3RhdHVzICsgZW50aXR5IHNjb3JlYm9hcmQ6IHsgYnVpbGQsIGRldGFpbCB9LlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0YXR1cyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3AgdGhlIHJ1bm5pbmcgYnVpbGQgKHRoZSBjdXJyZW50IHNlbWFudGljIGRhdGFiYXNlIHN0YXlzIGluIHBsYWNlKS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdG9wKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQvc3RvcCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2J1aWxkJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGVudGl0eSdzIGNhY2hlZCBBSS1jbGFzc2lmaWVkIGNvZGUgZnVuY3Rpb25zIOKAlCBsb2FkZWQgb24gZXhwYW5kLCBvbmVcbiAgLy8gZW50aXR5IGF0IGEgdGltZSwgYmVjYXVzZSB0aGUgZnVsbCBzZXQgYWNyb3NzIGFsbCBlbnRpdGllcyBpcyBmYXIgdG9vIGJpZ1xuICAvLyB0byBzaGlwIGluc2lkZSB0aGUgc2NvcmVib2FyZCBjYWxsLlxuICBwdWJsaWMgc2VtYW50aWNFbnRpdHlGdW5jdGlvbnMoZW50aXR5OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGBzZW1hbnRpYy9lbnRpdGllcy8ke2VudGl0eX0vZnVuY3Rpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZW50aXR5RnVuY3Rpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCBtb2R1bGUncyBHZW5lcmFsIHNldHRpbmdzIChzZW1hbnRpYy1idWlsZCBjb25jdXJyZW5jeSArIGl0cyBib3VuZHMpLlxuICBwdWJsaWMgc2V0dGluZ3MoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NldHRpbmdzJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2V0dGluZ3MnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbG9jYWxlcyBhbmQgY3VycmVuY2llcyBhIHJlcG9ydCBjYW4gYmUgd3JpdHRlbiBpbiwgZm9yIHRoZSByZXBvcnRcbiAgLy8gc2V0dGluZ3MnIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0czogdGhlIGRlZmF1bHQgbG9jYWxlLCBlYWNoIG9mZmVyZWRcbiAgLy8gbG9jYWxlIHdpdGggdGhlIGN1cnJlbmN5IGEgcmVwb3J0IGluIGl0IHVzZXMgd2hlbiBpdCBuYW1lcyBub25lLCBhbmQgZXZlcnlcbiAgLy8gY3VycmVuY3kgY29kZS4gT25seSBhIHNlcnZlciB0aGF0IHNlbmRzIGVmZmVjdGl2ZUxvY2FsZSBoYXMgdGhpcyByb3V0ZS5cbiAgcHVibGljIGxvY2FsZXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydExvY2FsZXM+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2xvY2FsZXMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdsb2NhbGVzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgR2VuZXJhbCBzZXR0aW5nczsgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBzZXR0aW5ncyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiB7IHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyIH0sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIGdyb3VwIOKAlCBpdHMgZXhwb3N1cmUgbGV2ZWwgKCdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCcpXG4gIC8vIGFuZC9vciBpdHMgZGVmYXVsdCB2YWx1ZSAodGhlIHZhbHVlIHNlZWRpbmcgdGhlIHJlcG9ydCBiYXIgb24gb3BlbikuIFNlbmRcbiAgLy8gYGRlZmF1bHQ6IG51bGxgIChvciBhbiBlbXB0eSBkZWZhdWx0KSB0byBjbGVhciBpdC4gT25seSB0aGUga2V5cyBwcm92aWRlZFxuICAvLyBhcmUgY2hhbmdlZC5cbiAgcHVibGljIHVwZGF0ZUZpbHRlckdyb3VwKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZ3JvdXBJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGV2ZWw/OiBSZXBvcnRGaWx0ZXJMZXZlbDsgZGVmYXVsdD86IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJncm91cHMvJHtncm91cElkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyR3JvdXAnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==