@firestitch/report 18.0.15 → 18.0.17

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.
@@ -12,10 +12,10 @@ import * as i1 from "@firestitch/chip";
12
12
  import * as i2 from "@firestitch/date";
13
13
  import * as i3 from "@firestitch/dialog";
14
14
  import * as i4 from "@firestitch/skeleton";
15
- // One group of an entity's AI-classified cached code functions — the model
16
- // class's or the handler class's, per the source it was opened for. Fetched on
17
- // open from the shared per-entity endpoint (one payload carries both groups,
18
- // each row tagged with its source) and filtered client-side.
15
+ // One group of a unit's AI-classified cached code functions — an entity's model
16
+ // or handler class, or the single group of a standalone code class. Fetched on
17
+ // open from the shared per-key endpoint (one payload carries every group, each
18
+ // row tagged with its source) and filtered client-side.
19
19
  export class EntityFunctionsComponent {
20
20
  // One color per AI classification kind, so a function's nature reads at a glance.
21
21
  static KIND_COLORS = {
@@ -28,15 +28,23 @@ export class EntityFunctionsComponent {
28
28
  };
29
29
  // Interesting logic first: derived values and rules, then data access, then the rest.
30
30
  static KIND_ORDER = ['calculation', 'business-rule', 'query', 'mutation', 'accessor', 'other'];
31
+ // The dialog title per group. A standalone class has no model/handler split,
32
+ // so its one group is just the code the build read.
33
+ static SOURCE_LABELS = {
34
+ model: 'Model functions',
35
+ handler: 'Handler functions',
36
+ class: 'Code functions',
37
+ };
31
38
  _data = inject(MAT_DIALOG_DATA);
32
39
  entityKey = this._data.entityKey;
33
- sourceLabel = this._data.source === 'model' ? 'Model functions' : 'Handler functions';
40
+ sourceLabel = EntityFunctionsComponent.SOURCE_LABELS[this._data.source];
34
41
  // null until loaded — gates the list behind the skeleton.
35
42
  entityFunctions = signal(null);
36
- // The class this group's functions were discovered from.
43
+ // The class this group's functions were discovered from. A standalone code
44
+ // class has no handler, so its group reads the model slot like 'model' does.
37
45
  discoveredClass = computed(() => {
38
46
  const loaded = this.entityFunctions();
39
- return this._data.source === 'model' ? loaded?.modelClass : loaded?.handlerClass;
47
+ return this._data.source === 'handler' ? loaded?.handlerClass : loaded?.modelClass;
40
48
  });
41
49
  // This group's functions, ordered by kind priority then method name.
42
50
  functions = computed(() => this._sortFunctions((this.entityFunctions()?.functions ?? [])
@@ -78,4 +86,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
78
86
  FsSkeletonModule,
79
87
  ], template: "<fs-dialog>\n <fs-dialog-title>\n {{ entityKey }} \u2014 {{ sourceLabel }}\n </fs-dialog-title>\n <mat-dialog-content>\n <div *fsSkeleton=\"entityFunctions()\">\n @if (entityFunctions(); as fns) {\n @if (functions().length) {\n @if (fns.generatedAt) {\n <div class=\"hint functions-generated\">\n Discovered from {{ discoveredClass() }} &middot;\n <fs-date\n [date]=\"fns.generatedAt\"\n format=\"date-time\">\n </fs-date>\n </div>\n }\n <div class=\"functions-list\">\n @for (fn of functions(); track fn.class + '::' + fn.method) {\n <div class=\"function-row\">\n <div class=\"function-head\">\n <fs-chip\n size=\"tiny\"\n [backgroundColor]=\"kindColor(fn.kind)\"\n color=\"#ffffff\">\n {{ fn.kind }}\n </fs-chip>\n <code class=\"function-method\">{{ fn.method }}</code>\n </div>\n <div class=\"function-summary\">{{ fn.summary }}</div>\n @if (fn.produces) {\n <div class=\"function-produces hint\">Produces: {{ fn.produces }}</div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"hint\">\n No functions cached for this entity yet \u2014 run a build to discover its code.\n </div>\n }\n }\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".hint{margin:0;color:#0009;font-size:13px;line-height:1.5}.functions-generated{margin-bottom:10px}.functions-list{display:flex;flex-direction:column}.functions-list .function-row{display:flex;flex-direction:column;gap:3px;padding:10px 0}.functions-list .function-row+.function-row{border-top:1px solid rgba(0,0,0,.08)}.functions-list .function-row .function-head{display:flex;align-items:center;gap:8px}.functions-list .function-row .function-method{font-family:monospace;font-size:13px;font-weight:600}.functions-list .function-row .function-summary{color:#000000bf}.functions-list .function-row .function-produces{padding-left:10px}\n"] }]
80
88
  }], ctorParameters: () => [] });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9lbnRpdHktZnVuY3Rpb25zL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFhcEQsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsNkRBQTZEO0FBaUI3RCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGtGQUFrRjtJQUMxRSxNQUFNLENBQVUsV0FBVyxHQUEyQjtRQUM1RCxhQUFhLEVBQUUsU0FBUztRQUN4Qixl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QztJQUN6RSxDQUFDO3dHQS9EVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qix3RUM1Q3JDLG95REFzREEsc3JCRHBCSSxTQUFTLGlMQUNULGdCQUFnQix5R0FDaEIsZ0JBQWdCLDRIQUNoQixjQUFjLG9MQUNkLFlBQVkscVhBQ1osWUFBWSw0SUFDWixjQUFjLDhUQUNkLGdCQUFnQjs7NEZBR1Asd0JBQXdCO2tCQWhCcEMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixjQUFjO3dCQUNkLGdCQUFnQjtxQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBGc0NoaXBNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jaGlwJztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgU2VtYW50aWNFbnRpdHlGdW5jdGlvbixcbiAgU2VtYW50aWNFbnRpdHlGdW5jdGlvbnMsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlGdW5jdGlvbnNEaWFsb2dEYXRhIHtcbiAgZW50aXR5S2V5OiBzdHJpbmc7XG4gIHNvdXJjZTogJ21vZGVsJyB8ICdoYW5kbGVyJztcbn1cblxuXG4vLyBPbmUgZ3JvdXAgb2YgYW4gZW50aXR5J3MgQUktY2xhc3NpZmllZCBjYWNoZWQgY29kZSBmdW5jdGlvbnMg4oCUIHRoZSBtb2RlbFxuLy8gY2xhc3MncyBvciB0aGUgaGFuZGxlciBjbGFzcydzLCBwZXIgdGhlIHNvdXJjZSBpdCB3YXMgb3BlbmVkIGZvci4gRmV0Y2hlZCBvblxuLy8gb3BlbiBmcm9tIHRoZSBzaGFyZWQgcGVyLWVudGl0eSBlbmRwb2ludCAob25lIHBheWxvYWQgY2FycmllcyBib3RoIGdyb3Vwcyxcbi8vIGVhY2ggcm93IHRhZ2dlZCB3aXRoIGl0cyBzb3VyY2UpIGFuZCBmaWx0ZXJlZCBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIEZzQ2hpcE1vZHVsZSxcbiAgICBGc0RhdGVNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IHtcblxuICAvLyBPbmUgY29sb3IgcGVyIEFJIGNsYXNzaWZpY2F0aW9uIGtpbmQsIHNvIGEgZnVuY3Rpb24ncyBuYXR1cmUgcmVhZHMgYXQgYSBnbGFuY2UuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtJTkRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdjYWxjdWxhdGlvbic6ICcjMTU2NWMwJyxcbiAgICAnYnVzaW5lc3MtcnVsZSc6ICcjNmExYjlhJyxcbiAgICAncXVlcnknOiAnIzAwNjk1YycsXG4gICAgJ211dGF0aW9uJzogJyNlNjUxMDAnLFxuICAgICdhY2Nlc3Nvcic6ICcjNTQ2ZTdhJyxcbiAgICAnb3RoZXInOiAnIzc1NzU3NScsXG4gIH07XG5cbiAgLy8gSW50ZXJlc3RpbmcgbG9naWMgZmlyc3Q6IGRlcml2ZWQgdmFsdWVzIGFuZCBydWxlcywgdGhlbiBkYXRhIGFjY2VzcywgdGhlbiB0aGUgcmVzdC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0lORF9PUkRFUiA9IFsnY2FsY3VsYXRpb24nLCAnYnVzaW5lc3MtcnVsZScsICdxdWVyeScsICdtdXRhdGlvbicsICdhY2Nlc3NvcicsICdvdGhlciddO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGEgPSBpbmplY3Q8RW50aXR5RnVuY3Rpb25zRGlhbG9nRGF0YT4oTUFUX0RJQUxPR19EQVRBKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5S2V5ID0gdGhpcy5fZGF0YS5lbnRpdHlLZXk7XG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VMYWJlbCA9IHRoaXMuX2RhdGEuc291cmNlID09PSAnbW9kZWwnID8gJ01vZGVsIGZ1bmN0aW9ucycgOiAnSGFuZGxlciBmdW5jdGlvbnMnO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgbGlzdCBiZWhpbmQgdGhlIHNrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5RnVuY3Rpb25zID0gc2lnbmFsPFNlbWFudGljRW50aXR5RnVuY3Rpb25zIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNsYXNzIHRoaXMgZ3JvdXAncyBmdW5jdGlvbnMgd2VyZSBkaXNjb3ZlcmVkIGZyb20uXG4gIHB1YmxpYyByZWFkb25seSBkaXNjb3ZlcmVkQ2xhc3MgPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5lbnRpdHlGdW5jdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNvdXJjZSA9PT0gJ21vZGVsJyA/IGxvYWRlZD8ubW9kZWxDbGFzcyA6IGxvYWRlZD8uaGFuZGxlckNsYXNzO1xuICB9KTtcblxuICAvLyBUaGlzIGdyb3VwJ3MgZnVuY3Rpb25zLCBvcmRlcmVkIGJ5IGtpbmQgcHJpb3JpdHkgdGhlbiBtZXRob2QgbmFtZS5cbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9ucyA9IGNvbXB1dGVkPFNlbWFudGljRW50aXR5RnVuY3Rpb25bXT4oKCkgPT5cbiAgICB0aGlzLl9zb3J0RnVuY3Rpb25zKFxuICAgICAgKHRoaXMuZW50aXR5RnVuY3Rpb25zKCk/LmZ1bmN0aW9ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoZm4pID0+IGZuLnNvdXJjZSA9PT0gdGhpcy5fZGF0YS5zb3VyY2UpLFxuICAgICksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaW5qZWN0KFJlcG9ydERhdGEpLnNlbWFudGljRW50aXR5RnVuY3Rpb25zKHRoaXMuX2RhdGEuZW50aXR5S2V5KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChlbnRpdHlGdW5jdGlvbnM6IFNlbWFudGljRW50aXR5RnVuY3Rpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuZW50aXR5RnVuY3Rpb25zLnNldChlbnRpdHlGdW5jdGlvbnMpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMga2luZENvbG9yKGtpbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX0NPTE9SU1traW5kXSA/PyBFbnRpdHlGdW5jdGlvbnNDb21wb25lbnQuS0lORF9DT0xPUlMub3RoZXI7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0RnVuY3Rpb25zKGZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdKTogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLmZ1bmN0aW9uc11cbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpbmREaWZmID0gdGhpcy5fa2luZFJhbmsoYS5raW5kKSAtIHRoaXMuX2tpbmRSYW5rKGIua2luZCk7XG5cbiAgICAgICAgcmV0dXJuIGtpbmREaWZmICE9PSAwID8ga2luZERpZmYgOiBhLm1ldGhvZC5sb2NhbGVDb21wYXJlKGIubWV0aG9kKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfa2luZFJhbmsoa2luZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCByYW5rID0gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfT1JERVIuaW5kZXhPZihraW5kKTtcblxuICAgIHJldHVybiByYW5rID09PSAtMSA/IEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX09SREVSLmxlbmd0aCA6IHJhbms7XG4gIH1cbn1cbiIsIjxmcy1kaWFsb2c+XG4gIDxmcy1kaWFsb2ctdGl0bGU+XG4gICAge3sgZW50aXR5S2V5IH19IOKAlCB7eyBzb3VyY2VMYWJlbCB9fVxuICA8L2ZzLWRpYWxvZy10aXRsZT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2ICpmc1NrZWxldG9uPVwiZW50aXR5RnVuY3Rpb25zKClcIj5cbiAgICAgIEBpZiAoZW50aXR5RnVuY3Rpb25zKCk7IGFzIGZucykge1xuICAgICAgICBAaWYgKGZ1bmN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIEBpZiAoZm5zLmdlbmVyYXRlZEF0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludCBmdW5jdGlvbnMtZ2VuZXJhdGVkXCI+XG4gICAgICAgICAgICAgIERpc2NvdmVyZWQgZnJvbSB7eyBkaXNjb3ZlcmVkQ2xhc3MoKSB9fSAmbWlkZG90O1xuICAgICAgICAgICAgICA8ZnMtZGF0ZVxuICAgICAgICAgICAgICAgICAgW2RhdGVdPVwiZm5zLmdlbmVyYXRlZEF0XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1hdD1cImRhdGUtdGltZVwiPlxuICAgICAgICAgICAgICA8L2ZzLWRhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bmN0aW9ucy1saXN0XCI+XG4gICAgICAgICAgICBAZm9yIChmbiBvZiBmdW5jdGlvbnMoKTsgdHJhY2sgZm4uY2xhc3MgKyAnOjonICsgZm4ubWV0aG9kKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICAgICAgPGZzLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICBzaXplPVwidGlueVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJraW5kQ29sb3IoZm4ua2luZClcIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiI2ZmZmZmZlwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmbi5raW5kIH19XG4gICAgICAgICAgICAgICAgICA8L2ZzLWNoaXA+XG4gICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImZ1bmN0aW9uLW1ldGhvZFwiPnt7IGZuLm1ldGhvZCB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24tc3VtbWFyeVwiPnt7IGZuLnN1bW1hcnkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYgKGZuLnByb2R1Y2VzKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24tcHJvZHVjZXMgaGludFwiPlByb2R1Y2VzOiB7eyBmbi5wcm9kdWNlcyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50XCI+XG4gICAgICAgICAgICBObyBmdW5jdGlvbnMgY2FjaGVkIGZvciB0aGlzIGVudGl0eSB5ZXQg4oCUIHJ1biBhIGJ1aWxkIHRvIGRpc2NvdmVyIGl0cyBjb2RlLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidW5kZWZpbmVkXCI+XG4gICAgICBDbG9zZVxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbjwvZnMtZGlhbG9nPlxuIl19
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9lbnRpdHktZnVuY3Rpb25zL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFjcEQsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usd0RBQXdEO0FBaUJ4RCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGtGQUFrRjtJQUMxRSxNQUFNLENBQVUsV0FBVyxHQUEyQjtRQUM1RCxhQUFhLEVBQUUsU0FBUztRQUN4Qixl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TyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9ELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekUsQ0FBQzt3R0F4RVUsd0JBQXdCOzRGQUF4Qix3QkFBd0Isd0VDN0NyQyxveURBc0RBLHNyQkRuQkksU0FBUyxpTEFDVCxnQkFBZ0IseUdBQ2hCLGdCQUFnQiw0SEFDaEIsY0FBYyxvTEFDZCxZQUFZLHFYQUNaLFlBQVksNElBQ1osY0FBYyw4VEFDZCxnQkFBZ0I7OzRGQUdQLHdCQUF3QjtrQkFoQnBDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRnNDaGlwTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY2hpcCc7XG5pbXBvcnQgeyBGc0RhdGVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9za2VsZXRvbic7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIFNlbWFudGljRW50aXR5RnVuY3Rpb24sXG4gIFNlbWFudGljRW50aXR5RnVuY3Rpb25zLFxuICBTZW1hbnRpY0Z1bmN0aW9uU291cmNlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RnVuY3Rpb25zRGlhbG9nRGF0YSB7XG4gIGVudGl0eUtleTogc3RyaW5nO1xuICBzb3VyY2U6IFNlbWFudGljRnVuY3Rpb25Tb3VyY2U7XG59XG5cblxuLy8gT25lIGdyb3VwIG9mIGEgdW5pdCdzIEFJLWNsYXNzaWZpZWQgY2FjaGVkIGNvZGUgZnVuY3Rpb25zIOKAlCBhbiBlbnRpdHkncyBtb2RlbFxuLy8gb3IgaGFuZGxlciBjbGFzcywgb3IgdGhlIHNpbmdsZSBncm91cCBvZiBhIHN0YW5kYWxvbmUgY29kZSBjbGFzcy4gRmV0Y2hlZCBvblxuLy8gb3BlbiBmcm9tIHRoZSBzaGFyZWQgcGVyLWtleSBlbmRwb2ludCAob25lIHBheWxvYWQgY2FycmllcyBldmVyeSBncm91cCwgZWFjaFxuLy8gcm93IHRhZ2dlZCB3aXRoIGl0cyBzb3VyY2UpIGFuZCBmaWx0ZXJlZCBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIEZzQ2hpcE1vZHVsZSxcbiAgICBGc0RhdGVNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IHtcblxuICAvLyBPbmUgY29sb3IgcGVyIEFJIGNsYXNzaWZpY2F0aW9uIGtpbmQsIHNvIGEgZnVuY3Rpb24ncyBuYXR1cmUgcmVhZHMgYXQgYSBnbGFuY2UuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtJTkRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdjYWxjdWxhdGlvbic6ICcjMTU2NWMwJyxcbiAgICAnYnVzaW5lc3MtcnVsZSc6ICcjNmExYjlhJyxcbiAgICAncXVlcnknOiAnIzAwNjk1YycsXG4gICAgJ211dGF0aW9uJzogJyNlNjUxMDAnLFxuICAgICdhY2Nlc3Nvcic6ICcjNTQ2ZTdhJyxcbiAgICAnb3RoZXInOiAnIzc1NzU3NScsXG4gIH07XG5cbiAgLy8gSW50ZXJlc3RpbmcgbG9naWMgZmlyc3Q6IGRlcml2ZWQgdmFsdWVzIGFuZCBydWxlcywgdGhlbiBkYXRhIGFjY2VzcywgdGhlbiB0aGUgcmVzdC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0lORF9PUkRFUiA9IFsnY2FsY3VsYXRpb24nLCAnYnVzaW5lc3MtcnVsZScsICdxdWVyeScsICdtdXRhdGlvbicsICdhY2Nlc3NvcicsICdvdGhlciddO1xuXG4gIC8vIFRoZSBkaWFsb2cgdGl0bGUgcGVyIGdyb3VwLiBBIHN0YW5kYWxvbmUgY2xhc3MgaGFzIG5vIG1vZGVsL2hhbmRsZXIgc3BsaXQsXG4gIC8vIHNvIGl0cyBvbmUgZ3JvdXAgaXMganVzdCB0aGUgY29kZSB0aGUgYnVpbGQgcmVhZC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09VUkNFX0xBQkVMUzogUmVjb3JkPFNlbWFudGljRnVuY3Rpb25Tb3VyY2UsIHN0cmluZz4gPSB7XG4gICAgbW9kZWw6ICdNb2RlbCBmdW5jdGlvbnMnLFxuICAgIGhhbmRsZXI6ICdIYW5kbGVyIGZ1bmN0aW9ucycsXG4gICAgY2xhc3M6ICdDb2RlIGZ1bmN0aW9ucycsXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YSA9IGluamVjdDxFbnRpdHlGdW5jdGlvbnNEaWFsb2dEYXRhPihNQVRfRElBTE9HX0RBVEEpO1xuXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHlLZXkgPSB0aGlzLl9kYXRhLmVudGl0eUtleTtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZUxhYmVsID0gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LlNPVVJDRV9MQUJFTFNbdGhpcy5fZGF0YS5zb3VyY2VdO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgbGlzdCBiZWhpbmQgdGhlIHNrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5RnVuY3Rpb25zID0gc2lnbmFsPFNlbWFudGljRW50aXR5RnVuY3Rpb25zIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNsYXNzIHRoaXMgZ3JvdXAncyBmdW5jdGlvbnMgd2VyZSBkaXNjb3ZlcmVkIGZyb20uIEEgc3RhbmRhbG9uZSBjb2RlXG4gIC8vIGNsYXNzIGhhcyBubyBoYW5kbGVyLCBzbyBpdHMgZ3JvdXAgcmVhZHMgdGhlIG1vZGVsIHNsb3QgbGlrZSAnbW9kZWwnIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBkaXNjb3ZlcmVkQ2xhc3MgPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5lbnRpdHlGdW5jdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNvdXJjZSA9PT0gJ2hhbmRsZXInID8gbG9hZGVkPy5oYW5kbGVyQ2xhc3MgOiBsb2FkZWQ/Lm1vZGVsQ2xhc3M7XG4gIH0pO1xuXG4gIC8vIFRoaXMgZ3JvdXAncyBmdW5jdGlvbnMsIG9yZGVyZWQgYnkga2luZCBwcmlvcml0eSB0aGVuIG1ldGhvZCBuYW1lLlxuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25zID0gY29tcHV0ZWQ8U2VtYW50aWNFbnRpdHlGdW5jdGlvbltdPigoKSA9PlxuICAgIHRoaXMuX3NvcnRGdW5jdGlvbnMoXG4gICAgICAodGhpcy5lbnRpdHlGdW5jdGlvbnMoKT8uZnVuY3Rpb25zID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChmbikgPT4gZm4uc291cmNlID09PSB0aGlzLl9kYXRhLnNvdXJjZSksXG4gICAgKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpbmplY3QoUmVwb3J0RGF0YSkuc2VtYW50aWNFbnRpdHlGdW5jdGlvbnModGhpcy5fZGF0YS5lbnRpdHlLZXkpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKGVudGl0eUZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5lbnRpdHlGdW5jdGlvbnMuc2V0KGVudGl0eUZ1bmN0aW9ucyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBraW5kQ29sb3Ioa2luZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfQ09MT1JTW2tpbmRdID8/IEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX0NPTE9SUy5vdGhlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRGdW5jdGlvbnMoZnVuY3Rpb25zOiBTZW1hbnRpY0VudGl0eUZ1bmN0aW9uW10pOiBTZW1hbnRpY0VudGl0eUZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBbLi4uZnVuY3Rpb25zXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3Qga2luZERpZmYgPSB0aGlzLl9raW5kUmFuayhhLmtpbmQpIC0gdGhpcy5fa2luZFJhbmsoYi5raW5kKTtcblxuICAgICAgICByZXR1cm4ga2luZERpZmYgIT09IDAgPyBraW5kRGlmZiA6IGEubWV0aG9kLmxvY2FsZUNvbXBhcmUoYi5tZXRob2QpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9raW5kUmFuayhraW5kOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHJhbmsgPSBFbnRpdHlGdW5jdGlvbnNDb21wb25lbnQuS0lORF9PUkRFUi5pbmRleE9mKGtpbmQpO1xuXG4gICAgcmV0dXJuIHJhbmsgPT09IC0xID8gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfT1JERVIubGVuZ3RoIDogcmFuaztcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGZzLWRpYWxvZy10aXRsZT5cbiAgICB7eyBlbnRpdHlLZXkgfX0g4oCUIHt7IHNvdXJjZUxhYmVsIH19XG4gIDwvZnMtZGlhbG9nLXRpdGxlPlxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKmZzU2tlbGV0b249XCJlbnRpdHlGdW5jdGlvbnMoKVwiPlxuICAgICAgQGlmIChlbnRpdHlGdW5jdGlvbnMoKTsgYXMgZm5zKSB7XG4gICAgICAgIEBpZiAoZnVuY3Rpb25zKCkubGVuZ3RoKSB7XG4gICAgICAgICAgQGlmIChmbnMuZ2VuZXJhdGVkQXQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50IGZ1bmN0aW9ucy1nZW5lcmF0ZWRcIj5cbiAgICAgICAgICAgICAgRGlzY292ZXJlZCBmcm9tIHt7IGRpc2NvdmVyZWRDbGFzcygpIH19ICZtaWRkb3Q7XG4gICAgICAgICAgICAgIDxmcy1kYXRlXG4gICAgICAgICAgICAgICAgICBbZGF0ZV09XCJmbnMuZ2VuZXJhdGVkQXRcIlxuICAgICAgICAgICAgICAgICAgZm9ybWF0PVwiZGF0ZS10aW1lXCI+XG4gICAgICAgICAgICAgIDwvZnMtZGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb25zLWxpc3RcIj5cbiAgICAgICAgICAgIEBmb3IgKGZuIG9mIGZ1bmN0aW9ucygpOyB0cmFjayBmbi5jbGFzcyArICc6OicgKyBmbi5tZXRob2QpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bmN0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICA8ZnMtY2hpcFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ0aW55XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImtpbmRDb2xvcihmbi5raW5kKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCIjZmZmZmZmXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZuLmtpbmQgfX1cbiAgICAgICAgICAgICAgICAgIDwvZnMtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZnVuY3Rpb24tbWV0aG9kXCI+e3sgZm4ubWV0aG9kIH19PC9jb2RlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1zdW1tYXJ5XCI+e3sgZm4uc3VtbWFyeSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoZm4ucHJvZHVjZXMpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1wcm9kdWNlcyBoaW50XCI+UHJvZHVjZXM6IHt7IGZuLnByb2R1Y2VzIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhpbnRcIj5cbiAgICAgICAgICAgIE5vIGZ1bmN0aW9ucyBjYWNoZWQgZm9yIHRoaXMgZW50aXR5IHlldCDigJQgcnVuIGEgYnVpbGQgdG8gZGlzY292ZXIgaXRzIGNvZGUuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIENsb3NlXG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=