@almatar/smart-booking-dashboard 0.0.2-alpha.7 → 0.0.2-alpha.9

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 (36) hide show
  1. package/esm2022/lib/components/booking-input/booking-input.component.mjs +17 -4
  2. package/esm2022/lib/components/flight-itinerary-card/flight-itinerary-card.component.mjs +3 -3
  3. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +4 -3
  4. package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +3 -3
  5. package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +2 -2
  6. package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +3 -3
  7. package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +2 -2
  8. package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +3 -3
  9. package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +2 -2
  10. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +3 -3
  11. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +3 -5
  12. package/esm2022/lib/components/train-details/train-details.component.mjs +89 -0
  13. package/esm2022/lib/config/dashboard.config.mjs +6 -1
  14. package/esm2022/lib/models/booking.types.mjs +1 -1
  15. package/esm2022/lib/models/train.types.mjs +2 -0
  16. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +34 -7
  17. package/esm2022/lib/services/booking.service.mjs +10 -3
  18. package/esm2022/lib/services/brand.service.mjs +29 -0
  19. package/esm2022/lib/services/reissue.service.mjs +3 -3
  20. package/esm2022/lib/shared/services/api.service.mjs +3 -3
  21. package/esm2022/lib/shared/services/sbd-http.mjs +27 -0
  22. package/esm2022/public-api.mjs +2 -1
  23. package/fesm2022/almatar-smart-booking-dashboard.mjs +219 -35
  24. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  25. package/lib/components/booking-input/booking-input.component.d.ts +10 -4
  26. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +2 -2
  27. package/lib/components/train-details/train-details.component.d.ts +28 -0
  28. package/lib/config/dashboard.config.d.ts +17 -0
  29. package/lib/models/booking.types.d.ts +2 -0
  30. package/lib/models/train.types.d.ts +61 -0
  31. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +6 -2
  32. package/lib/services/booking.service.d.ts +3 -0
  33. package/lib/services/brand.service.d.ts +14 -0
  34. package/lib/shared/services/sbd-http.d.ts +8 -0
  35. package/package.json +1 -1
  36. package/public-api.d.ts +2 -1
@@ -13,6 +13,7 @@ import { SbdActionGridComponent } from '../../components/action-grid/action-grid
13
13
  import { SbdCancelDialogComponent } from '../../components/cancel-dialog/cancel-dialog.component';
14
14
  import { AlmatarHotelAutoCancellationComponent } from '../../components/hotel-cancel/almatar-hotel-auto-cancellation.component';
15
15
  import { SbdFlightItineraryCardComponent } from '../../components/flight-itinerary-card/flight-itinerary-card.component';
16
+ import { SbdTrainDetailsComponent } from '../../components/train-details/train-details.component';
16
17
  import { SbdHotelItineraryCardComponent } from '../../components/hotel-itinerary-card/hotel-itinerary-card.component';
17
18
  import { SbdDataSearchComponent } from '../../components/data-search/data-search.component';
18
19
  import { SbdActionDialogComponent } from '../../components/action-dialog/action-dialog.component';
@@ -28,6 +29,8 @@ export class SmartBookingDashboardComponent {
28
29
  /** The Reissue button is shown for flights only, and only when the host enabled the feature. */
29
30
  this.reissueEnabled = inject(SBD_CONFIG).reissueEnabled;
30
31
  this.product = signal('flight');
32
+ /** The product the FCR based parts (cancel, notes, actions) work on. Trains have none of them. */
33
+ this.fcrProduct = computed(() => (this.product() === 'hotel' ? 'hotel' : 'flight'));
31
34
  this.bookingId = signal('');
32
35
  this.bookingStatus = signal('idle');
33
36
  this.bookingData = signal(null);
@@ -38,7 +41,7 @@ export class SmartBookingDashboardComponent {
38
41
  this.reissueDialogOpen = signal(false);
39
42
  this.selectedActionKey = signal(null);
40
43
  this.activeContextTab = signal('changes');
41
- this.availableActions = computed(() => (this.product() === 'flight' ? FLIGHT_ACTIONS : HOTEL_ACTIONS).filter(a => !a.hidden));
44
+ this.availableActions = computed(() => (this.product() === 'flight' ? FLIGHT_ACTIONS : this.product() === 'hotel' ? HOTEL_ACTIONS : []).filter(a => !a.hidden));
42
45
  // Handle both correct spelling (dataVerified) and BE typo (dataVerfied)
43
46
  this.dataVerified = computed(() => {
44
47
  const bi = this.bookingData()?.data?.booking_info;
@@ -113,18 +116,41 @@ export class SmartBookingDashboardComponent {
113
116
  document.querySelector('.sbd-booking-input__field')?.focus();
114
117
  }
115
118
  }
119
+ /** The booking on screen was found under the previous brand: clear it, the agent looks it up again on the new one. */
120
+ onBrandChanged() {
121
+ this.bookingStatus.set('idle');
122
+ this.bookingData.set(null);
123
+ }
116
124
  lookupBooking() {
117
125
  const id = this.bookingId().trim();
118
126
  if (!id)
119
127
  return;
120
128
  this.bookingStatus.set('loading');
121
- const fields = this.product() === 'hotel'
129
+ const product = this.product();
130
+ if (product === 'train') {
131
+ this.bookingService.getTrainDetails(id).subscribe({
132
+ next: (detail) => {
133
+ const found = detail.configured && (detail.found || !!detail.summary || detail.sections?.length > 0);
134
+ this.bookingData.set(found ? detail : null);
135
+ this.bookingStatus.set(found ? 'success' : 'error');
136
+ if (!found)
137
+ this.toast.error('Train booking not found. Check the ID and try again.');
138
+ },
139
+ error: () => {
140
+ this.bookingStatus.set('error');
141
+ this.bookingData.set(null);
142
+ this.toast.error('Train booking not found. Check the ID and try again.');
143
+ },
144
+ });
145
+ return;
146
+ }
147
+ const fields = product === 'hotel'
122
148
  ? ['booking_info', 'hotel_information', 'checkin_checkout', 'room_information']
123
149
  : 'booking_info';
124
- this.bookingService.getBooking(id, this.product(), fields).subscribe({
150
+ this.bookingService.getBooking(id, product, fields).subscribe({
125
151
  next: ({ data }) => {
126
152
  // console.log('Booking data received:', data);
127
- if (this.product() === 'hotel') {
153
+ if (product === 'hotel') {
128
154
  const mappedData = mapToHotelBookingData(data);
129
155
  this.bookingData.set(mappedData);
130
156
  }
@@ -141,7 +167,7 @@ export class SmartBookingDashboardComponent {
141
167
  });
142
168
  }
143
169
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SmartBookingDashboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
144
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SmartBookingDashboardComponent, isStandalone: true, selector: "app-smart-booking-dashboard", host: { listeners: { "document:keydown": "onKeydown($event)" } }, ngImport: i0, template: "<div class=\"sbd-page\">\n\n <!-- Search bar full-width at top -->\n <div class=\"sbd-page__search\">\n <app-sbd-booking-input\n [(product)]=\"product\"\n [(bookingId)]=\"bookingId\"\n [loading]=\"bookingStatus() === 'loading'\"\n (lookup)=\"lookupBooking()\"\n />\n </div>\n\n <!-- Hotel: Use dedicated component -->\n @if (product() === 'hotel') {\n <app-sbd-hotel-content\n [bookingData]=\"bookingData()\"\n [bookingStatus]=\"bookingStatus()\"\n [bookingId]=\"bookingId()\"\n [dataVerified]=\"dataVerified()\"\n [bookingNotes]=\"bookingNotes()\"\n [bookingHistory]=\"bookingHistory()\"\n [historyGroups]=\"historyGroups()\"\n [activeContextTab]=\"activeContextTab()\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (addNoteRequested)=\"addNoteDialogOpen.set(true)\"\n (contextTabChanged)=\"activeContextTab.set($event)\"\n />\n }\n\n <!-- Flight: Keep original 2-column layout -->\n @if (product() === 'flight') {\n <div class=\"sbd-page__content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-page__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-flight-itinerary-card [product]=\"product()\" [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-page__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-page__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-page__quick-actions\">\n <span class=\"sbd-page__quick-label\">Quick actions</span>\n <app-sbd-workflow-actions\n [bookingId]=\"bookingId()\"\n [showReissue]=\"reissueEnabled && product() === 'flight'\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (reissue)=\"reissueDialogOpen.set(true)\"\n />\n </div>\n\n <!-- Action grid -->\n <app-sbd-action-grid\n [actions]=\"availableActions()\"\n [activeKey]=\"selectedActionKey()\"\n (actionSelected)=\"openAction($event)\"\n />\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-page__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-page__context-tabs\">\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"activeContextTab.set('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-page__context-pill sbd-page__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"activeContextTab.set('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-page__context-pill sbd-page__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-page__context-add\"\n (click)=\"addNoteDialogOpen.set(true)\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-page__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-page__note\">\n <div class=\"sbd-page__note-top\">\n <span class=\"sbd-page__note-badge sbd-page__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-page__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-page__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-page__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-page__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-page__changes-group\">\n <div class=\"sbd-page__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-page__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-page__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-page__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-page__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-page__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n </div>\n }\n\n</div>\n\n<app-sbd-cancel-dialog\n [visible]=\"cancelDialogOpen() && product() === 'flight'\"\n [bookingId]=\"bookingId()\"\n [product]=\"product()\"\n [pnrInfo]=\"cancelPnrInfo()\"\n [bookingInfo]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (confirmed)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<almatar-hotel-auto-cancellation\n *ngIf=\"cancelDialogOpen() && product() === 'hotel'\"\n [selectedHotelBooking]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (cancellationSuccess)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<app-sbd-action-dialog\n [visible]=\"actionDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"product()\"\n [actions]=\"availableActions()\"\n [initialKey]=\"selectedActionKey()\"\n [preloadedData]=\"bookingData()\"\n (closed)=\"actionDialogOpen.set(false)\"\n/>\n\n<app-sbd-add-note-dialog\n [visible]=\"addNoteDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"product()\"\n (closed)=\"addNoteDialogOpen.set(false)\"\n/>\n\n<app-sbd-reissue-dialog\n [visible]=\"reissueDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [bookingData]=\"bookingData()\"\n (closed)=\"reissueDialogOpen.set(false)\"\n/>\n", styles: [".sbd-page{display:flex;flex-direction:column;gap:20px;padding:24px;max-width:1400px;min-height:100%}.sbd-page__search{width:100%}.sbd-page__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-page__error i{font-size:18px}.sbd-page__content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-page__content{grid-template-columns:1fr}}.sbd-page__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-page__main{display:flex;flex-direction:column;gap:16px}.sbd-page__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-page__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-page__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-page__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-page__context-add{margin-left:auto;margin-right:10px}.sbd-page__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-page__context-tab .pi{font-size:13px}.sbd-page__context-tab:hover{color:#334155}.sbd-page__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-page__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-page__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-page__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-page__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-page__context-empty .pi{font-size:16px}.sbd-page__notes-list{display:flex;flex-direction:column}.sbd-page__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-page__note:last-child{border-bottom:none}.sbd-page__note-top{display:flex;align-items:center;gap:8px}.sbd-page__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-page__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-page__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-page__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-page__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-page__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-page__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-page__changes-groups{display:flex;flex-direction:column}.sbd-page__changes-group{border-bottom:1px solid #f1f5f9}.sbd-page__changes-group:last-child{border-bottom:none}.sbd-page__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-page__changes-meta strong{font-weight:700;color:#334155}.sbd-page__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-page__changes-sep{color:#cbd5e1}.sbd-page__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-page__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-page__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-page__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-page__changes-table thead th:nth-child(2){color:#dc2626}.sbd-page__changes-table thead th:nth-child(3){color:#16a34a}.sbd-page__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-page__changes-table tbody tr:last-child{border-bottom:none}.sbd-page__changes-table tbody tr:hover{background:#f8fafc}.sbd-page__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-page__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-page__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-page__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-page__content--loading{opacity:.6;pointer-events:none}.sbd-page__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-page__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}.sbd-page__skeleton-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-top:8px}.sbd-page__skeleton-chip{height:56px;background:#f1f5f9;border-radius:8px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}@keyframes sbd-fadein{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "component", type: SbdBookingInputComponent, selector: "app-sbd-booking-input", inputs: ["loading", "product", "bookingId"], outputs: ["productChange", "bookingIdChange", "lookup"] }, { kind: "component", type: SbdWorkflowActionsComponent, selector: "app-sbd-workflow-actions", inputs: ["bookingId", "showReissue"], outputs: ["cancelBooking", "reissue"] }, { kind: "component", type: SbdActionGridComponent, selector: "app-sbd-action-grid", inputs: ["actions", "activeKey", "loadingKey"], outputs: ["actionSelected"] }, { kind: "component", type: SbdCancelDialogComponent, selector: "app-sbd-cancel-dialog", inputs: ["visible", "bookingId", "product", "pnrInfo", "bookingInfo"], outputs: ["closed", "confirmed"] }, { kind: "component", type: AlmatarHotelAutoCancellationComponent, selector: "almatar-hotel-auto-cancellation", inputs: ["selectedHotelBooking"], outputs: ["closed", "cancellationSuccess", "nonRefundableSubmitSuccess", "chatWithAgent"] }, { kind: "component", type: SbdFlightItineraryCardComponent, selector: "app-sbd-flight-itinerary-card", inputs: ["data", "product", "verified"] }, { kind: "component", type: SbdDataSearchComponent, selector: "app-sbd-data-search", inputs: ["data"] }, { kind: "component", type: SbdActionDialogComponent, selector: "app-sbd-action-dialog", inputs: ["visible", "bookingId", "product", "actions", "initialKey", "preloadedData"], outputs: ["closed"] }, { kind: "component", type: SbdAddNoteDialogComponent, selector: "app-sbd-add-note-dialog", inputs: ["visible", "bookingId", "product"], outputs: ["closed"] }, { kind: "component", type: SbdReissueDialogComponent, selector: "app-sbd-reissue-dialog", inputs: ["visible", "bookingId", "bookingData"], outputs: ["closed"] }, { kind: "component", type: SbdHotelContentComponent, selector: "app-sbd-hotel-content", inputs: ["bookingData", "bookingStatus", "bookingId", "dataVerified", "bookingNotes", "bookingHistory", "historyGroups", "activeContextTab"], outputs: ["cancelBooking", "addNoteRequested", "contextTabChanged"] }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }] }); }
170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SmartBookingDashboardComponent, isStandalone: true, selector: "app-smart-booking-dashboard", host: { listeners: { "document:keydown": "onKeydown($event)" } }, ngImport: i0, template: "<div class=\"sbd-page\">\n\n <!-- Search bar full-width at top -->\n <div class=\"sbd-page__search\">\n <app-sbd-booking-input\n [(product)]=\"product\"\n [(bookingId)]=\"bookingId\"\n [loading]=\"bookingStatus() === 'loading'\"\n (lookup)=\"lookupBooking()\"\n (brandChanged)=\"onBrandChanged()\"\n />\n </div>\n\n <!-- Hotel: Use dedicated component -->\n @if (product() === 'hotel') {\n <app-sbd-hotel-content\n [bookingData]=\"bookingData()\"\n [bookingStatus]=\"bookingStatus()\"\n [bookingId]=\"bookingId()\"\n [dataVerified]=\"dataVerified()\"\n [bookingNotes]=\"bookingNotes()\"\n [bookingHistory]=\"bookingHistory()\"\n [historyGroups]=\"historyGroups()\"\n [activeContextTab]=\"activeContextTab()\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (addNoteRequested)=\"addNoteDialogOpen.set(true)\"\n (contextTabChanged)=\"activeContextTab.set($event)\"\n />\n }\n\n <!-- Train: read-only booking details -->\n @if (product() === 'train') {\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:80%\"></div>\n </div>\n }\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-page__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Train booking not found. Double-check the ID, then try again.</span>\n </div>\n }\n @if (bookingStatus() === 'success' && bookingData()) {\n <app-sbd-train-details [detail]=\"bookingData()\" [bookingId]=\"bookingId()\" />\n }\n }\n\n <!-- Flight: Keep original 2-column layout -->\n @if (product() === 'flight') {\n <div class=\"sbd-page__content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-page__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-flight-itinerary-card [product]=\"fcrProduct()\" [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-page__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-page__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-page__quick-actions\">\n <span class=\"sbd-page__quick-label\">Quick actions</span>\n <app-sbd-workflow-actions\n [bookingId]=\"bookingId()\"\n [showReissue]=\"reissueEnabled && product() === 'flight'\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (reissue)=\"reissueDialogOpen.set(true)\"\n />\n </div>\n\n <!-- Action grid -->\n <app-sbd-action-grid\n [actions]=\"availableActions()\"\n [activeKey]=\"selectedActionKey()\"\n (actionSelected)=\"openAction($event)\"\n />\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-page__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-page__context-tabs\">\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"activeContextTab.set('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-page__context-pill sbd-page__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"activeContextTab.set('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-page__context-pill sbd-page__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-page__context-add\"\n (click)=\"addNoteDialogOpen.set(true)\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-page__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-page__note\">\n <div class=\"sbd-page__note-top\">\n <span class=\"sbd-page__note-badge sbd-page__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-page__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-page__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-page__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-page__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-page__changes-group\">\n <div class=\"sbd-page__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-page__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-page__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-page__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-page__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-page__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n </div>\n }\n\n</div>\n\n<app-sbd-cancel-dialog\n [visible]=\"cancelDialogOpen() && product() === 'flight'\"\n [bookingId]=\"bookingId()\"\n [product]=\"fcrProduct()\"\n [pnrInfo]=\"cancelPnrInfo()\"\n [bookingInfo]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (confirmed)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<almatar-hotel-auto-cancellation\n *ngIf=\"cancelDialogOpen() && product() === 'hotel'\"\n [selectedHotelBooking]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (cancellationSuccess)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<app-sbd-action-dialog\n [visible]=\"actionDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"fcrProduct()\"\n [actions]=\"availableActions()\"\n [initialKey]=\"selectedActionKey()\"\n [preloadedData]=\"bookingData()\"\n (closed)=\"actionDialogOpen.set(false)\"\n/>\n\n<app-sbd-add-note-dialog\n [visible]=\"addNoteDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"fcrProduct()\"\n (closed)=\"addNoteDialogOpen.set(false)\"\n/>\n\n<app-sbd-reissue-dialog\n [visible]=\"reissueDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [bookingData]=\"bookingData()\"\n (closed)=\"reissueDialogOpen.set(false)\"\n/>\n", styles: [".sbd-page{display:flex;flex-direction:column;gap:20px;padding:24px;max-width:1400px;min-height:100%}.sbd-page__search{width:100%}.sbd-page__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-page__error i{font-size:18px}.sbd-page__content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-page__content{grid-template-columns:1fr}}.sbd-page__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-page__main{display:flex;flex-direction:column;gap:16px}.sbd-page__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-page__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-page__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-page__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-page__context-add{margin-left:auto;margin-right:10px}.sbd-page__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-page__context-tab .pi{font-size:13px}.sbd-page__context-tab:hover{color:#334155}.sbd-page__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-page__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-page__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-page__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-page__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-page__context-empty .pi{font-size:16px}.sbd-page__notes-list{display:flex;flex-direction:column}.sbd-page__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-page__note:last-child{border-bottom:none}.sbd-page__note-top{display:flex;align-items:center;gap:8px}.sbd-page__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-page__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-page__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-page__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-page__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-page__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-page__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-page__changes-groups{display:flex;flex-direction:column}.sbd-page__changes-group{border-bottom:1px solid #f1f5f9}.sbd-page__changes-group:last-child{border-bottom:none}.sbd-page__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-page__changes-meta strong{font-weight:700;color:#334155}.sbd-page__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-page__changes-sep{color:#cbd5e1}.sbd-page__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-page__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-page__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-page__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-page__changes-table thead th:nth-child(2){color:#dc2626}.sbd-page__changes-table thead th:nth-child(3){color:#16a34a}.sbd-page__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-page__changes-table tbody tr:last-child{border-bottom:none}.sbd-page__changes-table tbody tr:hover{background:#f8fafc}.sbd-page__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-page__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-page__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-page__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-page__content--loading{opacity:.6;pointer-events:none}.sbd-page__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-page__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}.sbd-page__skeleton-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-top:8px}.sbd-page__skeleton-chip{height:56px;background:#f1f5f9;border-radius:8px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}@keyframes sbd-fadein{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "component", type: SbdBookingInputComponent, selector: "app-sbd-booking-input", inputs: ["loading", "product", "bookingId"], outputs: ["productChange", "bookingIdChange", "lookup", "brandChanged"] }, { kind: "component", type: SbdWorkflowActionsComponent, selector: "app-sbd-workflow-actions", inputs: ["bookingId", "showReissue"], outputs: ["cancelBooking", "reissue"] }, { kind: "component", type: SbdActionGridComponent, selector: "app-sbd-action-grid", inputs: ["actions", "activeKey", "loadingKey"], outputs: ["actionSelected"] }, { kind: "component", type: SbdCancelDialogComponent, selector: "app-sbd-cancel-dialog", inputs: ["visible", "bookingId", "product", "pnrInfo", "bookingInfo"], outputs: ["closed", "confirmed"] }, { kind: "component", type: AlmatarHotelAutoCancellationComponent, selector: "almatar-hotel-auto-cancellation", inputs: ["selectedHotelBooking"], outputs: ["closed", "cancellationSuccess", "nonRefundableSubmitSuccess", "chatWithAgent"] }, { kind: "component", type: SbdFlightItineraryCardComponent, selector: "app-sbd-flight-itinerary-card", inputs: ["data", "product", "verified"] }, { kind: "component", type: SbdDataSearchComponent, selector: "app-sbd-data-search", inputs: ["data"] }, { kind: "component", type: SbdActionDialogComponent, selector: "app-sbd-action-dialog", inputs: ["visible", "bookingId", "product", "actions", "initialKey", "preloadedData"], outputs: ["closed"] }, { kind: "component", type: SbdAddNoteDialogComponent, selector: "app-sbd-add-note-dialog", inputs: ["visible", "bookingId", "product"], outputs: ["closed"] }, { kind: "component", type: SbdReissueDialogComponent, selector: "app-sbd-reissue-dialog", inputs: ["visible", "bookingId", "bookingData"], outputs: ["closed"] }, { kind: "component", type: SbdHotelContentComponent, selector: "app-sbd-hotel-content", inputs: ["bookingData", "bookingStatus", "bookingId", "dataVerified", "bookingNotes", "bookingHistory", "historyGroups", "activeContextTab"], outputs: ["cancelBooking", "addNoteRequested", "contextTabChanged"] }, { kind: "component", type: SbdTrainDetailsComponent, selector: "app-sbd-train-details", inputs: ["detail", "bookingId"] }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }] }); }
145
171
  }
146
172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SmartBookingDashboardComponent, decorators: [{
147
173
  type: Component,
@@ -158,12 +184,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
158
184
  SbdAddNoteDialogComponent,
159
185
  SbdReissueDialogComponent,
160
186
  SbdHotelContentComponent,
187
+ SbdTrainDetailsComponent,
161
188
  LowerCasePipe,
162
189
  NgIf,
163
190
  ButtonModule,
164
- ], template: "<div class=\"sbd-page\">\n\n <!-- Search bar full-width at top -->\n <div class=\"sbd-page__search\">\n <app-sbd-booking-input\n [(product)]=\"product\"\n [(bookingId)]=\"bookingId\"\n [loading]=\"bookingStatus() === 'loading'\"\n (lookup)=\"lookupBooking()\"\n />\n </div>\n\n <!-- Hotel: Use dedicated component -->\n @if (product() === 'hotel') {\n <app-sbd-hotel-content\n [bookingData]=\"bookingData()\"\n [bookingStatus]=\"bookingStatus()\"\n [bookingId]=\"bookingId()\"\n [dataVerified]=\"dataVerified()\"\n [bookingNotes]=\"bookingNotes()\"\n [bookingHistory]=\"bookingHistory()\"\n [historyGroups]=\"historyGroups()\"\n [activeContextTab]=\"activeContextTab()\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (addNoteRequested)=\"addNoteDialogOpen.set(true)\"\n (contextTabChanged)=\"activeContextTab.set($event)\"\n />\n }\n\n <!-- Flight: Keep original 2-column layout -->\n @if (product() === 'flight') {\n <div class=\"sbd-page__content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-page__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-flight-itinerary-card [product]=\"product()\" [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-page__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-page__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-page__quick-actions\">\n <span class=\"sbd-page__quick-label\">Quick actions</span>\n <app-sbd-workflow-actions\n [bookingId]=\"bookingId()\"\n [showReissue]=\"reissueEnabled && product() === 'flight'\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (reissue)=\"reissueDialogOpen.set(true)\"\n />\n </div>\n\n <!-- Action grid -->\n <app-sbd-action-grid\n [actions]=\"availableActions()\"\n [activeKey]=\"selectedActionKey()\"\n (actionSelected)=\"openAction($event)\"\n />\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-page__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-page__context-tabs\">\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"activeContextTab.set('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-page__context-pill sbd-page__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"activeContextTab.set('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-page__context-pill sbd-page__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-page__context-add\"\n (click)=\"addNoteDialogOpen.set(true)\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-page__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-page__note\">\n <div class=\"sbd-page__note-top\">\n <span class=\"sbd-page__note-badge sbd-page__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-page__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-page__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-page__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-page__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-page__changes-group\">\n <div class=\"sbd-page__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-page__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-page__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-page__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-page__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-page__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n </div>\n }\n\n</div>\n\n<app-sbd-cancel-dialog\n [visible]=\"cancelDialogOpen() && product() === 'flight'\"\n [bookingId]=\"bookingId()\"\n [product]=\"product()\"\n [pnrInfo]=\"cancelPnrInfo()\"\n [bookingInfo]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (confirmed)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<almatar-hotel-auto-cancellation\n *ngIf=\"cancelDialogOpen() && product() === 'hotel'\"\n [selectedHotelBooking]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (cancellationSuccess)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<app-sbd-action-dialog\n [visible]=\"actionDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"product()\"\n [actions]=\"availableActions()\"\n [initialKey]=\"selectedActionKey()\"\n [preloadedData]=\"bookingData()\"\n (closed)=\"actionDialogOpen.set(false)\"\n/>\n\n<app-sbd-add-note-dialog\n [visible]=\"addNoteDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"product()\"\n (closed)=\"addNoteDialogOpen.set(false)\"\n/>\n\n<app-sbd-reissue-dialog\n [visible]=\"reissueDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [bookingData]=\"bookingData()\"\n (closed)=\"reissueDialogOpen.set(false)\"\n/>\n", styles: [".sbd-page{display:flex;flex-direction:column;gap:20px;padding:24px;max-width:1400px;min-height:100%}.sbd-page__search{width:100%}.sbd-page__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-page__error i{font-size:18px}.sbd-page__content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-page__content{grid-template-columns:1fr}}.sbd-page__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-page__main{display:flex;flex-direction:column;gap:16px}.sbd-page__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-page__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-page__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-page__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-page__context-add{margin-left:auto;margin-right:10px}.sbd-page__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-page__context-tab .pi{font-size:13px}.sbd-page__context-tab:hover{color:#334155}.sbd-page__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-page__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-page__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-page__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-page__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-page__context-empty .pi{font-size:16px}.sbd-page__notes-list{display:flex;flex-direction:column}.sbd-page__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-page__note:last-child{border-bottom:none}.sbd-page__note-top{display:flex;align-items:center;gap:8px}.sbd-page__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-page__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-page__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-page__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-page__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-page__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-page__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-page__changes-groups{display:flex;flex-direction:column}.sbd-page__changes-group{border-bottom:1px solid #f1f5f9}.sbd-page__changes-group:last-child{border-bottom:none}.sbd-page__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-page__changes-meta strong{font-weight:700;color:#334155}.sbd-page__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-page__changes-sep{color:#cbd5e1}.sbd-page__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-page__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-page__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-page__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-page__changes-table thead th:nth-child(2){color:#dc2626}.sbd-page__changes-table thead th:nth-child(3){color:#16a34a}.sbd-page__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-page__changes-table tbody tr:last-child{border-bottom:none}.sbd-page__changes-table tbody tr:hover{background:#f8fafc}.sbd-page__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-page__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-page__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-page__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-page__content--loading{opacity:.6;pointer-events:none}.sbd-page__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-page__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}.sbd-page__skeleton-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-top:8px}.sbd-page__skeleton-chip{height:56px;background:#f1f5f9;border-radius:8px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}@keyframes sbd-fadein{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"] }]
191
+ ], template: "<div class=\"sbd-page\">\n\n <!-- Search bar full-width at top -->\n <div class=\"sbd-page__search\">\n <app-sbd-booking-input\n [(product)]=\"product\"\n [(bookingId)]=\"bookingId\"\n [loading]=\"bookingStatus() === 'loading'\"\n (lookup)=\"lookupBooking()\"\n (brandChanged)=\"onBrandChanged()\"\n />\n </div>\n\n <!-- Hotel: Use dedicated component -->\n @if (product() === 'hotel') {\n <app-sbd-hotel-content\n [bookingData]=\"bookingData()\"\n [bookingStatus]=\"bookingStatus()\"\n [bookingId]=\"bookingId()\"\n [dataVerified]=\"dataVerified()\"\n [bookingNotes]=\"bookingNotes()\"\n [bookingHistory]=\"bookingHistory()\"\n [historyGroups]=\"historyGroups()\"\n [activeContextTab]=\"activeContextTab()\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (addNoteRequested)=\"addNoteDialogOpen.set(true)\"\n (contextTabChanged)=\"activeContextTab.set($event)\"\n />\n }\n\n <!-- Train: read-only booking details -->\n @if (product() === 'train') {\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:80%\"></div>\n </div>\n }\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-page__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Train booking not found. Double-check the ID, then try again.</span>\n </div>\n }\n @if (bookingStatus() === 'success' && bookingData()) {\n <app-sbd-train-details [detail]=\"bookingData()\" [bookingId]=\"bookingId()\" />\n }\n }\n\n <!-- Flight: Keep original 2-column layout -->\n @if (product() === 'flight') {\n <div class=\"sbd-page__content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-page__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-flight-itinerary-card [product]=\"fcrProduct()\" [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-page__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-page__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-page__quick-actions\">\n <span class=\"sbd-page__quick-label\">Quick actions</span>\n <app-sbd-workflow-actions\n [bookingId]=\"bookingId()\"\n [showReissue]=\"reissueEnabled && product() === 'flight'\"\n (cancelBooking)=\"cancelDialogOpen.set(true)\"\n (reissue)=\"reissueDialogOpen.set(true)\"\n />\n </div>\n\n <!-- Action grid -->\n <app-sbd-action-grid\n [actions]=\"availableActions()\"\n [activeKey]=\"selectedActionKey()\"\n (actionSelected)=\"openAction($event)\"\n />\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-page__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-page__context-tabs\">\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"activeContextTab.set('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-page__context-pill sbd-page__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-page__context-tab\"\n [class.sbd-page__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"activeContextTab.set('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-page__context-pill sbd-page__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-page__context-add\"\n (click)=\"addNoteDialogOpen.set(true)\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-page__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-page__note\">\n <div class=\"sbd-page__note-top\">\n <span class=\"sbd-page__note-badge sbd-page__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-page__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-page__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-page__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-page__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-page__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-page__changes-group\">\n <div class=\"sbd-page__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-page__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-page__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-page__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-page__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-page__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-page__skeleton-card\">\n <div class=\"sbd-page__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-page__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n </div>\n }\n\n</div>\n\n<app-sbd-cancel-dialog\n [visible]=\"cancelDialogOpen() && product() === 'flight'\"\n [bookingId]=\"bookingId()\"\n [product]=\"fcrProduct()\"\n [pnrInfo]=\"cancelPnrInfo()\"\n [bookingInfo]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (confirmed)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<almatar-hotel-auto-cancellation\n *ngIf=\"cancelDialogOpen() && product() === 'hotel'\"\n [selectedHotelBooking]=\"bookingData()\"\n (closed)=\"cancelDialogOpen.set(false)\"\n (cancellationSuccess)=\"bookingStatus.set('idle'); bookingData.set(null)\"\n/>\n\n<app-sbd-action-dialog\n [visible]=\"actionDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"fcrProduct()\"\n [actions]=\"availableActions()\"\n [initialKey]=\"selectedActionKey()\"\n [preloadedData]=\"bookingData()\"\n (closed)=\"actionDialogOpen.set(false)\"\n/>\n\n<app-sbd-add-note-dialog\n [visible]=\"addNoteDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [product]=\"fcrProduct()\"\n (closed)=\"addNoteDialogOpen.set(false)\"\n/>\n\n<app-sbd-reissue-dialog\n [visible]=\"reissueDialogOpen()\"\n [bookingId]=\"bookingId()\"\n [bookingData]=\"bookingData()\"\n (closed)=\"reissueDialogOpen.set(false)\"\n/>\n", styles: [".sbd-page{display:flex;flex-direction:column;gap:20px;padding:24px;max-width:1400px;min-height:100%}.sbd-page__search{width:100%}.sbd-page__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-page__error i{font-size:18px}.sbd-page__content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-page__content{grid-template-columns:1fr}}.sbd-page__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-page__main{display:flex;flex-direction:column;gap:16px}.sbd-page__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-page__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-page__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-page__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-page__context-add{margin-left:auto;margin-right:10px}.sbd-page__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-page__context-tab .pi{font-size:13px}.sbd-page__context-tab:hover{color:#334155}.sbd-page__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-page__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-page__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-page__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-page__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-page__context-empty .pi{font-size:16px}.sbd-page__notes-list{display:flex;flex-direction:column}.sbd-page__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-page__note:last-child{border-bottom:none}.sbd-page__note-top{display:flex;align-items:center;gap:8px}.sbd-page__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-page__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-page__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-page__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-page__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-page__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-page__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-page__changes-groups{display:flex;flex-direction:column}.sbd-page__changes-group{border-bottom:1px solid #f1f5f9}.sbd-page__changes-group:last-child{border-bottom:none}.sbd-page__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-page__changes-meta strong{font-weight:700;color:#334155}.sbd-page__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-page__changes-sep{color:#cbd5e1}.sbd-page__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-page__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-page__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-page__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-page__changes-table thead th:nth-child(2){color:#dc2626}.sbd-page__changes-table thead th:nth-child(3){color:#16a34a}.sbd-page__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-page__changes-table tbody tr:last-child{border-bottom:none}.sbd-page__changes-table tbody tr:hover{background:#f8fafc}.sbd-page__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-page__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-page__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-page__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-page__content--loading{opacity:.6;pointer-events:none}.sbd-page__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-page__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}.sbd-page__skeleton-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-top:8px}.sbd-page__skeleton-chip{height:56px;background:#f1f5f9;border-radius:8px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}@keyframes sbd-fadein{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"] }]
165
192
  }], propDecorators: { onKeydown: [{
166
193
  type: HostListener,
167
194
  args: ['document:keydown', ['$event']]
168
195
  }] } });
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYm9va2luZy1kYXNoYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9wYWdlcy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zbWFydC1ib29raW5nLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL3BhZ2VzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQWtDLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDbEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFD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QXlCO3dCQUN6Qix5QkFBeUI7d0JBQ3pCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixJQUFJO3dCQUNKLFlBQVk7cUJBQ2I7OEJBOEZELFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvd2VyQ2FzZVBpcGUsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuXG5cbmltcG9ydCB7IFNCRF9DT05GSUcgfSBmcm9tICcuLi8uLi9jb25maWcvZGFzaGJvYXJkLmNvbmZpZyc7XG5pbXBvcnQgeyBTYmRCb29raW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jvb2tpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBTYmRUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEZMSUdIVF9BQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlnL2ZsaWdodC1hY3Rpb25zLmNvbmZpZyc7XG5pbXBvcnQgeyBIT1RFTF9BQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlnL2hvdGVsLWFjdGlvbnMuY29uZmlnJztcbmltcG9ydCB7IFByb2R1Y3RUeXBlLCBJSG90ZWxCb29raW5nRGF0YSwgbWFwVG9Ib3RlbEJvb2tpbmdEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Jvb2tpbmcudHlwZXMnO1xuXG5pbXBvcnQgeyBTYmRCb29raW5nSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Jvb2tpbmctaW5wdXQvYm9va2luZy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2JkV29ya2Zsb3dBY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy93b3JrZmxvdy1hY3Rpb25zL3dvcmtmbG93LWFjdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEFjdGlvbkdyaWRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FjdGlvbi1ncmlkL2FjdGlvbi1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmRDYW5jZWxEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NhbmNlbC1kaWFsb2cvY2FuY2VsLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEZsaWdodEl0aW5lcmFyeUNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2ZsaWdodC1pdGluZXJhcnktY2FyZC9mbGlnaHQtaXRpbmVyYXJ5LWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEhvdGVsSXRpbmVyYXJ5Q2FyZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaG90ZWwtaXRpbmVyYXJ5LWNhcmQvaG90ZWwtaXRpbmVyYXJ5LWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZERhdGFTZWFyY2hDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2RhdGEtc2VhcmNoL2RhdGEtc2VhcmNoLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmRBY3Rpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FjdGlvbi1kaWFsb2cvYWN0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2JkQWRkTm90ZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYWRkLW5vdGUtZGlhbG9nL2FkZC1ub3RlLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2JkUmVpc3N1ZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcmVpc3N1ZS1kaWFsb2cvcmVpc3N1ZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEhvdGVsQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2NvbXBvbmVudHMvaG90ZWwtY29udGVudC9ob3RlbC1jb250ZW50LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zbWFydC1ib29raW5nLWRhc2hib2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBTYmRCb29raW5nSW5wdXRDb21wb25lbnQsXG4gICAgU2JkV29ya2Zsb3dBY3Rpb25zQ29tcG9uZW50LFxuICAgIFNiZEFjdGlvbkdyaWRDb21wb25lbnQsXG4gICAgU2JkQ2FuY2VsRGlhbG9nQ29tcG9uZW50LFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Db21wb25lbnQsXG4gICAgU2JkRmxpZ2h0SXRpbmVyYXJ5Q2FyZENvbXBvbmVudCxcbiAgICBTYmRIb3RlbEl0aW5lcmFyeUNhcmRDb21wb25lbnQsXG4gICAgU2JkRGF0YVNlYXJjaENvbXBvbmVudCxcbiAgICBTYmRBY3Rpb25EaWFsb2dDb21wb25lbnQsXG4gICAgU2JkQWRkTm90ZURpYWxvZ0NvbXBvbmVudCxcbiAgICBTYmRSZWlzc3VlRGlhbG9nQ29tcG9uZW50LFxuICAgIFNiZEhvdGVsQ29udGVudENvbXBvbmVudCxcbiAgICBMb3dlckNhc2VQaXBlLFxuICAgIE5nSWYsXG4gICAgQnV0dG9uTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtYm9va2luZy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vc21hcnQtYm9va2luZy1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBTbWFydEJvb2tpbmdEYXNoYm9hcmRDb21wb25lbnQge1xuICBwcml2YXRlIGJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KFNiZEJvb2tpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChTYmRUb2FzdFNlcnZpY2UpO1xuICAvKiogVGhlIFJlaXNzdWUgYnV0dG9uIGlzIHNob3duIGZvciBmbGlnaHRzIG9ubHksIGFuZCBvbmx5IHdoZW4gdGhlIGhvc3QgZW5hYmxlZCB0aGUgZmVhdHVyZS4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlaXNzdWVFbmFibGVkID0gaW5qZWN0KFNCRF9DT05GSUcpLnJlaXNzdWVFbmFibGVkO1xuXG4gIHByb2R1Y3QgPSBzaWduYWw8UHJvZHVjdFR5cGU+KCdmbGlnaHQnKTtcbiAgYm9va2luZ0lkID0gc2lnbmFsKCcnKTtcblxuICBib29raW5nU3RhdHVzID0gc2lnbmFsPCdpZGxlJyB8ICdsb2FkaW5nJyB8ICdzdWNjZXNzJyB8ICdlcnJvcic+KCdpZGxlJyk7XG4gIGJvb2tpbmdEYXRhID0gc2lnbmFsPElIb3RlbEJvb2tpbmdEYXRhIHwgYW55IHwgbnVsbD4obnVsbCk7XG5cbiAgY2FuY2VsRGlhbG9nT3BlbiAgICAgICAgICA9IHNpZ25hbChmYWxzZSk7XG4gIGhvdGVsQXV0b0NhbmNlbERpYWxvZ09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICBhY3Rpb25EaWFsb2dPcGVuICAgICAgICAgID0gc2lnbmFsKGZhbHNlKTtcbiAgYWRkTm90ZURpYWxvZ09wZW4gICAgICAgICA9IHNpZ25hbChmYWxzZSk7XG4gIHJlaXNzdWVEaWFsb2dPcGVuICAgICAgICAgPSBzaWduYWwoZmFsc2UpO1xuICBzZWxlY3RlZEFjdGlvbktleSAgICAgICAgID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBhY3RpdmVDb250ZXh0VGFiICAgICAgICAgID0gc2lnbmFsPCdub3RlcycgfCAnY2hhbmdlcyc+KCdjaGFuZ2VzJyk7XG5cbiAgYXZhaWxhYmxlQWN0aW9ucyA9IGNvbXB1dGVkKCgpID0+XG4gICAgKHRoaXMucHJvZHVjdCgpID09PSAnZmxpZ2h0JyA/IEZMSUdIVF9BQ1RJT05TIDogSE9URUxfQUNUSU9OUykuZmlsdGVyKGEgPT4gIWEuaGlkZGVuKVxuICApO1xuXG4gIC8vIEhhbmRsZSBib3RoIGNvcnJlY3Qgc3BlbGxpbmcgKGRhdGFWZXJpZmllZCkgYW5kIEJFIHR5cG8gKGRhdGFWZXJmaWVkKVxuICBkYXRhVmVyaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmkgPSB0aGlzLmJvb2tpbmdEYXRhKCk/LmRhdGE/LmJvb2tpbmdfaW5mbztcbiAgICByZXR1cm4gYmk/LmRhdGFWZXJpZmllZCA9PT0gdHJ1ZSB8fCBiaT8uZGF0YVZlcmZpZWQgPT09IHRydWU7XG4gIH0pO1xuXG4gIC8vIFBOUiBsaXN0IGZvciB0aGUgYWN0aXZlIGJvb2tpbmcsIG5vcm1hbGl6ZWQgdG8gYSBmbGF0IGFycmF5IHJlZ2FyZGxlc3Mgb2YgQkUgc2hhcGUuXG4gIGNhbmNlbFBuckluZm8gPSBjb21wdXRlZDx7IHBucj86IHN0cmluZzsgTGVnRGlyZWN0aW9uYWxpdHk/OiBzdHJpbmcgfVtdPigoKSA9PiB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5ib29raW5nRGF0YSgpPy5kYXRhPy5ib29raW5nX2luZm8/LnBucl9pbmZvO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiByYXc7XG4gICAgaWYgKHJhdz8ucG5yKSByZXR1cm4gW3sgcG5yOiByYXcucG5yLCBMZWdEaXJlY3Rpb25hbGl0eTogJ0RlcGFydHVyZScgfV07XG4gICAgcmV0dXJuIFtdO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBib29raW5nSGlzdG9yeSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmJvb2tpbmdEYXRhKCk/LmRhdGE/LmJvb2tpbmdfaW5mbz8uaGlzdG9yeSA/PyBbXSkgYXMgYW55W10pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGJvb2tpbmdOb3RlcyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmJvb2tpbmdEYXRhKCk/LmRhdGE/LmJvb2tpbmdfaW5mbz8ubm90ZXMgPz8gW10pIGFzIGFueVtdKTtcblxuICBoaXN0b3J5R3JvdXBzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCB7IGNoYW5nZWRCeTogc3RyaW5nOyBjaGFuZ2VkQXQ6IHN0cmluZzsgZW50cmllczogeyBmaWVsZDogc3RyaW5nOyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfVtdIH0+KCk7XG4gICAgZm9yIChjb25zdCBlIG9mIHRoaXMuYm9va2luZ0hpc3RvcnkoKSkge1xuICAgICAgaWYgKCFncm91cHMuaGFzKGUuY2hhbmdlZEF0KSkgZ3JvdXBzLnNldChlLmNoYW5nZWRBdCwgeyBjaGFuZ2VkQnk6IGUuY2hhbmdlZEJ5LCBjaGFuZ2VkQXQ6IGUuY2hhbmdlZEF0LCBlbnRyaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJhd0ZpZWxkID0gKGUuZmllbGQgYXMgc3RyaW5nKS5zcGxpdCgnLicpLnBvcCgpID8/IGUuZmllbGQ7XG4gICAgICBncm91cHMuZ2V0KGUuY2hhbmdlZEF0KSEuZW50cmllcy5wdXNoKHtcbiAgICAgICAgZmllbGQ6IHJhd0ZpZWxkLnJlcGxhY2UoL1xcWy4qP1xcXS9nLCAnJyksXG4gICAgICAgIGZyb206IGUucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgdG86IGUubmV3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ncm91cHMudmFsdWVzKCldO1xuICB9KTtcblxuICBmbXROb3RlRGF0ZShkYXRlOiB7IHNlYzogbnVtYmVyOyB1c2VjPzogbnVtYmVyIH0pOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZT8uc2VjKSByZXR1cm4gJ+KAlCc7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLnNlYyAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHsgcmV0dXJuICfigJQnOyB9XG4gIH1cblxuICBmb3JtYXRGaWVsZChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGRcbiAgICAgIC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdKS9nLCAnJDEgJDInKVxuICAgICAgLnJlcGxhY2UoLyhbYS16XFxkXSkoW0EtWl0pL2csICckMSAkMicpXG4gICAgICAudHJpbSgpO1xuICB9XG5cbiAgZm10RGF0ZShkdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWR0KSByZXR1cm4gJ+KAlCc7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShkdCkudG9Mb2NhbGVTdHJpbmcoJ2VuLUdCJywge1xuICAgICAgICBkYXk6ICcyLWRpZ2l0JywgbW9udGg6ICdzaG9ydCcsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHsgcmV0dXJuIGR0OyB9XG4gIH1cblxuICBvcGVuQWN0aW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEFjdGlvbktleS5zZXQoa2V5KTtcbiAgICB0aGlzLmFjdGlvbkRpYWxvZ09wZW4uc2V0KHRydWUpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBldmVudC5rZXkgPT09ICdrJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJy5zYmQtYm9va2luZy1pbnB1dF9fZmllbGQnKT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBsb29rdXBCb29raW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5ib29raW5nSWQoKS50cmltKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5ib29raW5nU3RhdHVzLnNldCgnbG9hZGluZycpO1xuXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5wcm9kdWN0KCkgPT09ICdob3RlbCdcbiAgICAgID8gWydib29raW5nX2luZm8nLCAnaG90ZWxfaW5mb3JtYXRpb24nLCAnY2hlY2tpbl9jaGVja291dCcsICdyb29tX2luZm9ybWF0aW9uJ11cbiAgICAgIDogJ2Jvb2tpbmdfaW5mbyc7XG5cbiAgICB0aGlzLmJvb2tpbmdTZXJ2aWNlLmdldEJvb2tpbmcoaWQsIHRoaXMucHJvZHVjdCgpLCBmaWVsZHMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0Jvb2tpbmcgZGF0YSByZWNlaXZlZDonLCBkYXRhKTsgIFxuICAgICAgICBpZih0aGlzLnByb2R1Y3QoKSA9PT0gJ2hvdGVsJyl7XG4gICAgICAgICAgY29uc3QgbWFwcGVkRGF0YSA9IG1hcFRvSG90ZWxCb29raW5nRGF0YShkYXRhKTtcbiAgICAgICAgICB0aGlzLmJvb2tpbmdEYXRhLnNldChtYXBwZWREYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJvb2tpbmdEYXRhLnNldChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvb2tpbmdTdGF0dXMuc2V0KCdzdWNjZXNzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ib29raW5nU3RhdHVzLnNldCgnZXJyb3InKTtcbiAgICAgICAgdGhpcy5ib29raW5nRGF0YS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMudG9hc3QuZXJyb3IoJ0Jvb2tpbmcgbm90IGZvdW5kLiBDaGVjayB0aGUgSUQgYW5kIHRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInNiZC1wYWdlXCI+XG5cbiAgPCEtLSBTZWFyY2ggYmFyIGZ1bGwtd2lkdGggYXQgdG9wIC0tPlxuICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NlYXJjaFwiPlxuICAgIDxhcHAtc2JkLWJvb2tpbmctaW5wdXRcbiAgICAgIFsocHJvZHVjdCldPVwicHJvZHVjdFwiXG4gICAgICBbKGJvb2tpbmdJZCldPVwiYm9va2luZ0lkXCJcbiAgICAgIFtsb2FkaW5nXT1cImJvb2tpbmdTdGF0dXMoKSA9PT0gJ2xvYWRpbmcnXCJcbiAgICAgIChsb29rdXApPVwibG9va3VwQm9va2luZygpXCJcbiAgICAvPlxuICA8L2Rpdj5cblxuICA8IS0tIEhvdGVsOiBVc2UgZGVkaWNhdGVkIGNvbXBvbmVudCAtLT5cbiAgQGlmIChwcm9kdWN0KCkgPT09ICdob3RlbCcpIHtcbiAgICA8YXBwLXNiZC1ob3RlbC1jb250ZW50XG4gICAgICBbYm9va2luZ0RhdGFdPVwiYm9va2luZ0RhdGEoKVwiXG4gICAgICBbYm9va2luZ1N0YXR1c109XCJib29raW5nU3RhdHVzKClcIlxuICAgICAgW2Jvb2tpbmdJZF09XCJib29raW5nSWQoKVwiXG4gICAgICBbZGF0YVZlcmlmaWVkXT1cImRhdGFWZXJpZmllZCgpXCJcbiAgICAgIFtib29raW5nTm90ZXNdPVwiYm9va2luZ05vdGVzKClcIlxuICAgICAgW2Jvb2tpbmdIaXN0b3J5XT1cImJvb2tpbmdIaXN0b3J5KClcIlxuICAgICAgW2hpc3RvcnlHcm91cHNdPVwiaGlzdG9yeUdyb3VwcygpXCJcbiAgICAgIFthY3RpdmVDb250ZXh0VGFiXT1cImFjdGl2ZUNvbnRleHRUYWIoKVwiXG4gICAgICAoY2FuY2VsQm9va2luZyk9XCJjYW5jZWxEaWFsb2dPcGVuLnNldCh0cnVlKVwiXG4gICAgICAoYWRkTm90ZVJlcXVlc3RlZCk9XCJhZGROb3RlRGlhbG9nT3Blbi5zZXQodHJ1ZSlcIlxuICAgICAgKGNvbnRleHRUYWJDaGFuZ2VkKT1cImFjdGl2ZUNvbnRleHRUYWIuc2V0KCRldmVudClcIlxuICAgIC8+XG4gIH1cblxuICA8IS0tIEZsaWdodDogS2VlcCBvcmlnaW5hbCAyLWNvbHVtbiBsYXlvdXQgLS0+XG4gIEBpZiAocHJvZHVjdCgpID09PSAnZmxpZ2h0Jykge1xuICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fY29udGVudFwiPlxuXG4gICAgICA8IS0tIExlZnQ6IGJvb2tpbmcgY29udGV4dCAtLT5cbiAgICAgIDxhc2lkZSBjbGFzcz1cInNiZC1wYWdlX19hc2lkZVwiPlxuXG4gICAgICAgIDwhLS0gRGF0YSBzZWFyY2ggYXQgdGhlIHRvcCBvZiB0aGUgc2lkZWJhciAtLT5cbiAgICAgICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgIDxhcHAtc2JkLWRhdGEtc2VhcmNoIFtkYXRhXT1cImJvb2tpbmdEYXRhKClcIiAvPlxuICAgICAgICAgIDxhcHAtc2JkLWZsaWdodC1pdGluZXJhcnktY2FyZCBbcHJvZHVjdF09XCJwcm9kdWN0KClcIiBbZGF0YV09XCJib29raW5nRGF0YSgpXCIgW3ZlcmlmaWVkXT1cImRhdGFWZXJpZmllZCgpXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gTG9hZGluZyBza2VsZXRvbiBmb3IgYXNpZGUgLS0+XG4gICAgICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo2MCVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo0MCVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo4MCVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo1MCVcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICA8L2FzaWRlPlxuXG4gICAgICA8IS0tIFJpZ2h0OiBhZ2VudCB3b3Jrc3BhY2UgLS0+XG4gICAgICA8bWFpbiBjbGFzcz1cInNiZC1wYWdlX19tYWluXCI+XG5cbiAgICAgICAgPCEtLSBFcnJvciBzdGF0ZSAtLT5cbiAgICAgICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2Vycm9yXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPkJvb2tpbmcgbm90IGZvdW5kLiBEb3VibGUtY2hlY2sgdGhlIElEIGFuZCBwcm9kdWN0IHR5cGUsIHRoZW4gdHJ5IGFnYWluLjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gQ29udGVudCBvbmNlIGxvYWRlZCAtLT5cbiAgICAgICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdzdWNjZXNzJykge1xuXG4gICAgICAgICAgPCEtLSBRdWljayBhY3Rpb25zIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fcXVpY2stYWN0aW9uc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcGFnZV9fcXVpY2stbGFiZWxcIj5RdWljayBhY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgPGFwcC1zYmQtd29ya2Zsb3ctYWN0aW9uc1xuICAgICAgICAgICAgICBbYm9va2luZ0lkXT1cImJvb2tpbmdJZCgpXCJcbiAgICAgICAgICAgICAgW3Nob3dSZWlzc3VlXT1cInJlaXNzdWVFbmFibGVkICYmIHByb2R1Y3QoKSA9PT0gJ2ZsaWdodCdcIlxuICAgICAgICAgICAgICAoY2FuY2VsQm9va2luZyk9XCJjYW5jZWxEaWFsb2dPcGVuLnNldCh0cnVlKVwiXG4gICAgICAgICAgICAgIChyZWlzc3VlKT1cInJlaXNzdWVEaWFsb2dPcGVuLnNldCh0cnVlKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBBY3Rpb24gZ3JpZCAtLT5cbiAgICAgICAgICA8YXBwLXNiZC1hY3Rpb24tZ3JpZFxuICAgICAgICAgICAgW2FjdGlvbnNdPVwiYXZhaWxhYmxlQWN0aW9ucygpXCJcbiAgICAgICAgICAgIFthY3RpdmVLZXldPVwic2VsZWN0ZWRBY3Rpb25LZXkoKVwiXG4gICAgICAgICAgICAoYWN0aW9uU2VsZWN0ZWQpPVwib3BlbkFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPCEtLSBDb250ZXh0OiBOb3RlcyArIENoYW5nZXMgdGFiYmVkIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fY29udGV4dFwiPlxuXG4gICAgICAgICAgICA8IS0tIFRhYiBiYXIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHQtdGFic1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHQtdGFiXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2JkLXBhZ2VfX2NvbnRleHQtdGFiLS1hY3RpdmVdPVwiYWN0aXZlQ29udGV4dFRhYigpID09PSAnY2hhbmdlcydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVDb250ZXh0VGFiLnNldCgnY2hhbmdlcycpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1oaXN0b3J5XCI+PC9pPlxuICAgICAgICAgICAgICAgIENoYW5nZXNcbiAgICAgICAgICAgICAgICBAaWYgKGJvb2tpbmdIaXN0b3J5KCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcGFnZV9fY29udGV4dC1waWxsIHNiZC1wYWdlX19jb250ZXh0LXBpbGwtLWNoYW5nZXNcIj57eyBib29raW5nSGlzdG9yeSgpLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHQtdGFiXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2JkLXBhZ2VfX2NvbnRleHQtdGFiLS1hY3RpdmVdPVwiYWN0aXZlQ29udGV4dFRhYigpID09PSAnbm90ZXMnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlQ29udGV4dFRhYi5zZXQoJ25vdGVzJylcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNvbW1lbnRzXCI+PC9pPlxuICAgICAgICAgICAgICAgIE5vdGVzXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcGFnZV9fY29udGV4dC1waWxsIHNiZC1wYWdlX19jb250ZXh0LXBpbGwtLW5vdGVzXCI+e3sgYm9va2luZ05vdGVzKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgQGlmIChhY3RpdmVDb250ZXh0VGFiKCkgPT09ICdub3RlcycpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJBZGQgTm90ZVwiIGljb249XCJwaSBwaS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1vdXRsaW5lZCBzYmQtcGFnZV9fY29udGV4dC1hZGRcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5vdGVEaWFsb2dPcGVuLnNldCh0cnVlKVwiPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBOb3RlcyB0YWIgLS0+XG4gICAgICAgICAgICBAaWYgKGFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ25vdGVzJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX25vdGVzLWxpc3RcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGJvb2tpbmdOb3RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19jb250ZXh0LWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5ib3hcIj48L2k+IE5vIG5vdGVzIHlldFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBmb3IgKG5vdGUgb2YgYm9va2luZ05vdGVzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19ub3RlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fbm90ZS10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1wYWdlX19ub3RlLWJhZGdlIHNiZC1wYWdlX19ub3RlLWJhZGdlLS17eyBub3RlLmFjdGlvbiB8IGxvd2VyY2FzZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbm90ZS5hY3Rpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcGFnZV9fbm90ZS1hdXRob3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG5vdGUud3JpdHRlbkJ5Py5maXJzdE5hbWUgfX0ge3sgbm90ZS53cml0dGVuQnk/Lmxhc3ROYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXBhZ2VfX25vdGUtZGF0ZVwiPnt7IGZtdE5vdGVEYXRlKG5vdGUuZGF0ZSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNiZC1wYWdlX19ub3RlLW1zZ1wiPnt7IG5vdGUubWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gQ2hhbmdlcyB0YWIgLS0+XG4gICAgICAgICAgICBAaWYgKGFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ2NoYW5nZXMnKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fY2hhbmdlcy1ncm91cHNcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhpc3RvcnlHcm91cHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fY29udGV4dC1lbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZWNrXCI+PC9pPiBObyBjaGFuZ2VzIHJlY29yZGVkXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGZvciAoZ3JvdXAgb2YgaGlzdG9yeUdyb3VwcygpOyB0cmFjayBncm91cC5jaGFuZ2VkQXQpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fY2hhbmdlcy1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdXNlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGdyb3VwLmNoYW5nZWRCeSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtc2VwXCI+wrc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm10RGF0ZShncm91cC5jaGFuZ2VkQXQpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48aSBjbGFzcz1cInBpIHBpLXRpbWVzLWNpcmNsZVwiPjwvaT4gQmVmb3JlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxpIGNsYXNzPVwicGkgcGktY2hlY2stY2lyY2xlXCI+PC9pPiBBZnRlcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZW50cnkgb2YgZ3JvdXAuZW50cmllczsgdHJhY2sgZW50cnkuZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiZC1wYWdlX19jaGFuZ2VzLWZpZWxkXCI+e3sgZm9ybWF0RmllbGQoZW50cnkuZmllbGQpIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmQtcGFnZV9fY2hhbmdlcy1vbGRcIj57eyBlbnRyeS5mcm9tIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmQtcGFnZV9fY2hhbmdlcy1uZXdcIj57eyBlbnRyeS50byB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBMb2FkaW5nIHNrZWxldG9uIGZvciBtYWluIC0tPlxuICAgICAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19za2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NDAlXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6MjUlXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgPC9tYWluPlxuXG4gICAgPC9kaXY+XG4gIH1cblxuPC9kaXY+XG5cbjxhcHAtc2JkLWNhbmNlbC1kaWFsb2dcbiAgW3Zpc2libGVdPVwiY2FuY2VsRGlhbG9nT3BlbigpICYmIHByb2R1Y3QoKSA9PT0gJ2ZsaWdodCdcIlxuICBbYm9va2luZ0lkXT1cImJvb2tpbmdJZCgpXCJcbiAgW3Byb2R1Y3RdPVwicHJvZHVjdCgpXCJcbiAgW3BuckluZm9dPVwiY2FuY2VsUG5ySW5mbygpXCJcbiAgW2Jvb2tpbmdJbmZvXT1cImJvb2tpbmdEYXRhKClcIlxuICAoY2xvc2VkKT1cImNhbmNlbERpYWxvZ09wZW4uc2V0KGZhbHNlKVwiXG4gIChjb25maXJtZWQpPVwiYm9va2luZ1N0YXR1cy5zZXQoJ2lkbGUnKTsgYm9va2luZ0RhdGEuc2V0KG51bGwpXCJcbi8+XG5cbjxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uXG4gICpuZ0lmPVwiY2FuY2VsRGlhbG9nT3BlbigpICYmIHByb2R1Y3QoKSA9PT0gJ2hvdGVsJ1wiXG4gIFtzZWxlY3RlZEhvdGVsQm9va2luZ109XCJib29raW5nRGF0YSgpXCJcbiAgKGNsb3NlZCk9XCJjYW5jZWxEaWFsb2dPcGVuLnNldChmYWxzZSlcIlxuICAoY2FuY2VsbGF0aW9uU3VjY2Vzcyk9XCJib29raW5nU3RhdHVzLnNldCgnaWRsZScpOyBib29raW5nRGF0YS5zZXQobnVsbClcIlxuLz5cblxuPGFwcC1zYmQtYWN0aW9uLWRpYWxvZ1xuICBbdmlzaWJsZV09XCJhY3Rpb25EaWFsb2dPcGVuKClcIlxuICBbYm9va2luZ0lkXT1cImJvb2tpbmdJZCgpXCJcbiAgW3Byb2R1Y3RdPVwicHJvZHVjdCgpXCJcbiAgW2FjdGlvbnNdPVwiYXZhaWxhYmxlQWN0aW9ucygpXCJcbiAgW2luaXRpYWxLZXldPVwic2VsZWN0ZWRBY3Rpb25LZXkoKVwiXG4gIFtwcmVsb2FkZWREYXRhXT1cImJvb2tpbmdEYXRhKClcIlxuICAoY2xvc2VkKT1cImFjdGlvbkRpYWxvZ09wZW4uc2V0KGZhbHNlKVwiXG4vPlxuXG48YXBwLXNiZC1hZGQtbm90ZS1kaWFsb2dcbiAgW3Zpc2libGVdPVwiYWRkTm90ZURpYWxvZ09wZW4oKVwiXG4gIFtib29raW5nSWRdPVwiYm9va2luZ0lkKClcIlxuICBbcHJvZHVjdF09XCJwcm9kdWN0KClcIlxuICAoY2xvc2VkKT1cImFkZE5vdGVEaWFsb2dPcGVuLnNldChmYWxzZSlcIlxuLz5cblxuPGFwcC1zYmQtcmVpc3N1ZS1kaWFsb2dcbiAgW3Zpc2libGVdPVwicmVpc3N1ZURpYWxvZ09wZW4oKVwiXG4gIFtib29raW5nSWRdPVwiYm9va2luZ0lkKClcIlxuICBbYm9va2luZ0RhdGFdPVwiYm9va2luZ0RhdGEoKVwiXG4gIChjbG9zZWQpPVwicmVpc3N1ZURpYWxvZ09wZW4uc2V0KGZhbHNlKVwiXG4vPlxuIl19
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYm9va2luZy1kYXNoYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9wYWdlcy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zbWFydC1ib29raW5nLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL3BhZ2VzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQW9ELHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFckgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDbEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFD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S0FDeEIseUJBQXlCLHNJQUN6Qix5QkFBeUIseUlBQ3pCLHdCQUF3QixxUkFDeEIsd0JBQXdCLDhGQUN4QixhQUFhLGtEQUNiLElBQUksNEZBQ0osWUFBWTs7NEZBS0gsOEJBQThCO2tCQXhCMUMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQO3dCQUNQLHdCQUF3Qjt3QkFDeEIsMkJBQTJCO3dCQUMzQixzQkFBc0I7d0JBQ3RCLHdCQUF3Qjt3QkFDeEIscUNBQXFDO3dCQUNyQywrQkFBK0I7d0JBQy9CLDhCQUE4Qjt3QkFDOUIsc0JBQXNCO3dCQUN0Qix3QkFBd0I7d0JBQ3hCLHlCQUF5Qjt3QkFDekIseUJBQXlCO3dCQUN6Qix3QkFBd0I7d0JBQ3hCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixJQUFJO3dCQUNKLFlBQVk7cUJBQ2I7OEJBZ0dELFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvd2VyQ2FzZVBpcGUsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuXG5cbmltcG9ydCB7IFNCRF9DT05GSUcgfSBmcm9tICcuLi8uLi9jb25maWcvZGFzaGJvYXJkLmNvbmZpZyc7XG5pbXBvcnQgeyBTYmRCb29raW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jvb2tpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBTYmRUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEZMSUdIVF9BQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlnL2ZsaWdodC1hY3Rpb25zLmNvbmZpZyc7XG5pbXBvcnQgeyBIT1RFTF9BQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlnL2hvdGVsLWFjdGlvbnMuY29uZmlnJztcbmltcG9ydCB7IERhc2hib2FyZFByb2R1Y3QsIFByb2R1Y3RUeXBlLCBJSG90ZWxCb29raW5nRGF0YSwgbWFwVG9Ib3RlbEJvb2tpbmdEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Jvb2tpbmcudHlwZXMnO1xuXG5pbXBvcnQgeyBTYmRCb29raW5nSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Jvb2tpbmctaW5wdXQvYm9va2luZy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2JkV29ya2Zsb3dBY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy93b3JrZmxvdy1hY3Rpb25zL3dvcmtmbG93LWFjdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEFjdGlvbkdyaWRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FjdGlvbi1ncmlkL2FjdGlvbi1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmRDYW5jZWxEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NhbmNlbC1kaWFsb2cvY2FuY2VsLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEZsaWdodEl0aW5lcmFyeUNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2ZsaWdodC1pdGluZXJhcnktY2FyZC9mbGlnaHQtaXRpbmVyYXJ5LWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFRyYWluRGV0YWlsc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdHJhaW4tZGV0YWlscy90cmFpbi1kZXRhaWxzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmRIb3RlbEl0aW5lcmFyeUNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hvdGVsLWl0aW5lcmFyeS1jYXJkL2hvdGVsLWl0aW5lcmFyeS1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmREYXRhU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9kYXRhLXNlYXJjaC9kYXRhLXNlYXJjaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2JkQWN0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hY3Rpb24tZGlhbG9nL2FjdGlvbi1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZEFkZE5vdGVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FkZC1ub3RlLWRpYWxvZy9hZGQtbm90ZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZFJlaXNzdWVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3JlaXNzdWUtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmRIb3RlbENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9jb21wb25lbnRzL2hvdGVsLWNvbnRlbnQvaG90ZWwtY29udGVudC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc21hcnQtYm9va2luZy1kYXNoYm9hcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgU2JkQm9va2luZ0lucHV0Q29tcG9uZW50LFxuICAgIFNiZFdvcmtmbG93QWN0aW9uc0NvbXBvbmVudCxcbiAgICBTYmRBY3Rpb25HcmlkQ29tcG9uZW50LFxuICAgIFNiZENhbmNlbERpYWxvZ0NvbXBvbmVudCxcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uQ29tcG9uZW50LFxuICAgIFNiZEZsaWdodEl0aW5lcmFyeUNhcmRDb21wb25lbnQsXG4gICAgU2JkSG90ZWxJdGluZXJhcnlDYXJkQ29tcG9uZW50LFxuICAgIFNiZERhdGFTZWFyY2hDb21wb25lbnQsXG4gICAgU2JkQWN0aW9uRGlhbG9nQ29tcG9uZW50LFxuICAgIFNiZEFkZE5vdGVEaWFsb2dDb21wb25lbnQsXG4gICAgU2JkUmVpc3N1ZURpYWxvZ0NvbXBvbmVudCxcbiAgICBTYmRIb3RlbENvbnRlbnRDb21wb25lbnQsXG4gICAgU2JkVHJhaW5EZXRhaWxzQ29tcG9uZW50LFxuICAgIExvd2VyQ2FzZVBpcGUsXG4gICAgTmdJZixcbiAgICBCdXR0b25Nb2R1bGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydC1ib29raW5nLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9zbWFydC1ib29raW5nLWRhc2hib2FyZC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0Qm9va2luZ0Rhc2hib2FyZENvbXBvbmVudCB7XG4gIHByaXZhdGUgYm9va2luZ1NlcnZpY2UgPSBpbmplY3QoU2JkQm9va2luZ1NlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFNiZFRvYXN0U2VydmljZSk7XG4gIC8qKiBUaGUgUmVpc3N1ZSBidXR0b24gaXMgc2hvd24gZm9yIGZsaWdodHMgb25seSwgYW5kIG9ubHkgd2hlbiB0aGUgaG9zdCBlbmFibGVkIHRoZSBmZWF0dXJlLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVpc3N1ZUVuYWJsZWQgPSBpbmplY3QoU0JEX0NPTkZJRykucmVpc3N1ZUVuYWJsZWQ7XG5cbiAgcHJvZHVjdCA9IHNpZ25hbDxEYXNoYm9hcmRQcm9kdWN0PignZmxpZ2h0Jyk7XG4gIC8qKiBUaGUgcHJvZHVjdCB0aGUgRkNSIGJhc2VkIHBhcnRzIChjYW5jZWwsIG5vdGVzLCBhY3Rpb25zKSB3b3JrIG9uLiBUcmFpbnMgaGF2ZSBub25lIG9mIHRoZW0uICovXG4gIGZjclByb2R1Y3QgPSBjb21wdXRlZDxQcm9kdWN0VHlwZT4oKCkgPT4gKHRoaXMucHJvZHVjdCgpID09PSAnaG90ZWwnID8gJ2hvdGVsJyA6ICdmbGlnaHQnKSk7XG4gIGJvb2tpbmdJZCA9IHNpZ25hbCgnJyk7XG5cbiAgYm9va2luZ1N0YXR1cyA9IHNpZ25hbDwnaWRsZScgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZXJyb3InPignaWRsZScpO1xuICBib29raW5nRGF0YSA9IHNpZ25hbDxJSG90ZWxCb29raW5nRGF0YSB8IGFueSB8IG51bGw+KG51bGwpO1xuXG4gIGNhbmNlbERpYWxvZ09wZW4gICAgICAgICAgPSBzaWduYWwoZmFsc2UpO1xuICBob3RlbEF1dG9DYW5jZWxEaWFsb2dPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgYWN0aW9uRGlhbG9nT3BlbiAgICAgICAgICA9IHNpZ25hbChmYWxzZSk7XG4gIGFkZE5vdGVEaWFsb2dPcGVuICAgICAgICAgPSBzaWduYWwoZmFsc2UpO1xuICByZWlzc3VlRGlhbG9nT3BlbiAgICAgICAgID0gc2lnbmFsKGZhbHNlKTtcbiAgc2VsZWN0ZWRBY3Rpb25LZXkgICAgICAgICA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgYWN0aXZlQ29udGV4dFRhYiAgICAgICAgICA9IHNpZ25hbDwnbm90ZXMnIHwgJ2NoYW5nZXMnPignY2hhbmdlcycpO1xuXG4gIGF2YWlsYWJsZUFjdGlvbnMgPSBjb21wdXRlZCgoKSA9PlxuICAgICh0aGlzLnByb2R1Y3QoKSA9PT0gJ2ZsaWdodCcgPyBGTElHSFRfQUNUSU9OUyA6IHRoaXMucHJvZHVjdCgpID09PSAnaG90ZWwnID8gSE9URUxfQUNUSU9OUyA6IFtdKS5maWx0ZXIoYSA9PiAhYS5oaWRkZW4pXG4gICk7XG5cbiAgLy8gSGFuZGxlIGJvdGggY29ycmVjdCBzcGVsbGluZyAoZGF0YVZlcmlmaWVkKSBhbmQgQkUgdHlwbyAoZGF0YVZlcmZpZWQpXG4gIGRhdGFWZXJpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiaSA9IHRoaXMuYm9va2luZ0RhdGEoKT8uZGF0YT8uYm9va2luZ19pbmZvO1xuICAgIHJldHVybiBiaT8uZGF0YVZlcmlmaWVkID09PSB0cnVlIHx8IGJpPy5kYXRhVmVyZmllZCA9PT0gdHJ1ZTtcbiAgfSk7XG5cbiAgLy8gUE5SIGxpc3QgZm9yIHRoZSBhY3RpdmUgYm9va2luZywgbm9ybWFsaXplZCB0byBhIGZsYXQgYXJyYXkgcmVnYXJkbGVzcyBvZiBCRSBzaGFwZS5cbiAgY2FuY2VsUG5ySW5mbyA9IGNvbXB1dGVkPHsgcG5yPzogc3RyaW5nOyBMZWdEaXJlY3Rpb25hbGl0eT86IHN0cmluZyB9W10+KCgpID0+IHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmJvb2tpbmdEYXRhKCk/LmRhdGE/LmJvb2tpbmdfaW5mbz8ucG5yX2luZm87XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIHJhdztcbiAgICBpZiAocmF3Py5wbnIpIHJldHVybiBbeyBwbnI6IHJhdy5wbnIsIExlZ0RpcmVjdGlvbmFsaXR5OiAnRGVwYXJ0dXJlJyB9XTtcbiAgICByZXR1cm4gW107XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGJvb2tpbmdIaXN0b3J5ID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuYm9va2luZ0RhdGEoKT8uZGF0YT8uYm9va2luZ19pbmZvPy5oaXN0b3J5ID8/IFtdKSBhcyBhbnlbXSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgYm9va2luZ05vdGVzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuYm9va2luZ0RhdGEoKT8uZGF0YT8uYm9va2luZ19pbmZvPy5ub3RlcyA/PyBbXSkgYXMgYW55W10pO1xuXG4gIGhpc3RvcnlHcm91cHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIHsgY2hhbmdlZEJ5OiBzdHJpbmc7IGNoYW5nZWRBdDogc3RyaW5nOyBlbnRyaWVzOiB7IGZpZWxkOiBzdHJpbmc7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9W10gfT4oKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5ib29raW5nSGlzdG9yeSgpKSB7XG4gICAgICBpZiAoIWdyb3Vwcy5oYXMoZS5jaGFuZ2VkQXQpKSBncm91cHMuc2V0KGUuY2hhbmdlZEF0LCB7IGNoYW5nZWRCeTogZS5jaGFuZ2VkQnksIGNoYW5nZWRBdDogZS5jaGFuZ2VkQXQsIGVudHJpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmF3RmllbGQgPSAoZS5maWVsZCBhcyBzdHJpbmcpLnNwbGl0KCcuJykucG9wKCkgPz8gZS5maWVsZDtcbiAgICAgIGdyb3Vwcy5nZXQoZS5jaGFuZ2VkQXQpIS5lbnRyaWVzLnB1c2goe1xuICAgICAgICBmaWVsZDogcmF3RmllbGQucmVwbGFjZSgvXFxbLio/XFxdL2csICcnKSxcbiAgICAgICAgZnJvbTogZS5wcmV2aW91c1ZhbHVlLFxuICAgICAgICB0bzogZS5uZXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmdyb3Vwcy52YWx1ZXMoKV07XG4gIH0pO1xuXG4gIGZtdE5vdGVEYXRlKGRhdGU6IHsgc2VjOiBudW1iZXI7IHVzZWM/OiBudW1iZXIgfSk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlPy5zZWMpIHJldHVybiAn4oCUJztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuc2VjICogMTAwMCkudG9Mb2NhbGVTdHJpbmcoJ2VuLUdCJywge1xuICAgICAgICBkYXk6ICcyLWRpZ2l0JywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggeyByZXR1cm4gJ+KAlCc7IH1cbiAgfVxuXG4gIGZvcm1hdEZpZWxkKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZFxuICAgICAgLnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csICckMSAkMicpXG4gICAgICAucmVwbGFjZSgvKFthLXpcXGRdKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAgIC50cmltKCk7XG4gIH1cblxuICBmbXREYXRlKGR0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZHQpIHJldHVybiAn4oCUJztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGR0KS50b0xvY2FsZVN0cmluZygnZW4tR0InLCB7XG4gICAgICAgIGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggeyByZXR1cm4gZHQ7IH1cbiAgfVxuXG4gIG9wZW5BY3Rpb24oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQWN0aW9uS2V5LnNldChrZXkpO1xuICAgIHRoaXMuYWN0aW9uRGlhbG9nT3Blbi5zZXQodHJ1ZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmIGV2ZW50LmtleSA9PT0gJ2snKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignLnNiZC1ib29raW5nLWlucHV0X19maWVsZCcpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgYm9va2luZyBvbiBzY3JlZW4gd2FzIGZvdW5kIHVuZGVyIHRoZSBwcmV2aW91cyBicmFuZDogY2xlYXIgaXQsIHRoZSBhZ2VudCBsb29rcyBpdCB1cCBhZ2FpbiBvbiB0aGUgbmV3IG9uZS4gKi9cbiAgb25CcmFuZENoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5ib29raW5nU3RhdHVzLnNldCgnaWRsZScpO1xuICAgIHRoaXMuYm9va2luZ0RhdGEuc2V0KG51bGwpO1xuICB9XG5cbiAgbG9va3VwQm9va2luZygpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuYm9va2luZ0lkKCkudHJpbSgpO1xuICAgIGlmICghaWQpIHJldHVybjtcblxuICAgIHRoaXMuYm9va2luZ1N0YXR1cy5zZXQoJ2xvYWRpbmcnKTtcblxuICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLnByb2R1Y3QoKTtcbiAgICBpZiAocHJvZHVjdCA9PT0gJ3RyYWluJykge1xuICAgICAgdGhpcy5ib29raW5nU2VydmljZS5nZXRUcmFpbkRldGFpbHMoaWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkZXRhaWwpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IGRldGFpbC5jb25maWd1cmVkICYmIChkZXRhaWwuZm91bmQgfHwgISFkZXRhaWwuc3VtbWFyeSB8fCBkZXRhaWwuc2VjdGlvbnM/Lmxlbmd0aCA+IDApO1xuICAgICAgICAgIHRoaXMuYm9va2luZ0RhdGEuc2V0KGZvdW5kID8gZGV0YWlsIDogbnVsbCk7XG4gICAgICAgICAgdGhpcy5ib29raW5nU3RhdHVzLnNldChmb3VuZCA/ICdzdWNjZXNzJyA6ICdlcnJvcicpO1xuICAgICAgICAgIGlmICghZm91bmQpIHRoaXMudG9hc3QuZXJyb3IoJ1RyYWluIGJvb2tpbmcgbm90IGZvdW5kLiBDaGVjayB0aGUgSUQgYW5kIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmJvb2tpbmdTdGF0dXMuc2V0KCdlcnJvcicpO1xuICAgICAgICAgIHRoaXMuYm9va2luZ0RhdGEuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMudG9hc3QuZXJyb3IoJ1RyYWluIGJvb2tpbmcgbm90IGZvdW5kLiBDaGVjayB0aGUgSUQgYW5kIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkcyA9IHByb2R1Y3QgPT09ICdob3RlbCdcbiAgICAgID8gWydib29raW5nX2luZm8nLCAnaG90ZWxfaW5mb3JtYXRpb24nLCAnY2hlY2tpbl9jaGVja291dCcsICdyb29tX2luZm9ybWF0aW9uJ11cbiAgICAgIDogJ2Jvb2tpbmdfaW5mbyc7XG5cbiAgICB0aGlzLmJvb2tpbmdTZXJ2aWNlLmdldEJvb2tpbmcoaWQsIHByb2R1Y3QsIGZpZWxkcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnQm9va2luZyBkYXRhIHJlY2VpdmVkOicsIGRhdGEpOyAgXG4gICAgICAgIGlmIChwcm9kdWN0ID09PSAnaG90ZWwnKSB7XG4gICAgICAgICAgY29uc3QgbWFwcGVkRGF0YSA9IG1hcFRvSG90ZWxCb29raW5nRGF0YShkYXRhKTtcbiAgICAgICAgICB0aGlzLmJvb2tpbmdEYXRhLnNldChtYXBwZWREYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJvb2tpbmdEYXRhLnNldChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvb2tpbmdTdGF0dXMuc2V0KCdzdWNjZXNzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ib29raW5nU3RhdHVzLnNldCgnZXJyb3InKTtcbiAgICAgICAgdGhpcy5ib29raW5nRGF0YS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMudG9hc3QuZXJyb3IoJ0Jvb2tpbmcgbm90IGZvdW5kLiBDaGVjayB0aGUgSUQgYW5kIHRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInNiZC1wYWdlXCI+XG5cbiAgPCEtLSBTZWFyY2ggYmFyIGZ1bGwtd2lkdGggYXQgdG9wIC0tPlxuICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NlYXJjaFwiPlxuICAgIDxhcHAtc2JkLWJvb2tpbmctaW5wdXRcbiAgICAgIFsocHJvZHVjdCldPVwicHJvZHVjdFwiXG4gICAgICBbKGJvb2tpbmdJZCldPVwiYm9va2luZ0lkXCJcbiAgICAgIFtsb2FkaW5nXT1cImJvb2tpbmdTdGF0dXMoKSA9PT0gJ2xvYWRpbmcnXCJcbiAgICAgIChsb29rdXApPVwibG9va3VwQm9va2luZygpXCJcbiAgICAgIChicmFuZENoYW5nZWQpPVwib25CcmFuZENoYW5nZWQoKVwiXG4gICAgLz5cbiAgPC9kaXY+XG5cbiAgPCEtLSBIb3RlbDogVXNlIGRlZGljYXRlZCBjb21wb25lbnQgLS0+XG4gIEBpZiAocHJvZHVjdCgpID09PSAnaG90ZWwnKSB7XG4gICAgPGFwcC1zYmQtaG90ZWwtY29udGVudFxuICAgICAgW2Jvb2tpbmdEYXRhXT1cImJvb2tpbmdEYXRhKClcIlxuICAgICAgW2Jvb2tpbmdTdGF0dXNdPVwiYm9va2luZ1N0YXR1cygpXCJcbiAgICAgIFtib29raW5nSWRdPVwiYm9va2luZ0lkKClcIlxuICAgICAgW2RhdGFWZXJpZmllZF09XCJkYXRhVmVyaWZpZWQoKVwiXG4gICAgICBbYm9va2luZ05vdGVzXT1cImJvb2tpbmdOb3RlcygpXCJcbiAgICAgIFtib29raW5nSGlzdG9yeV09XCJib29raW5nSGlzdG9yeSgpXCJcbiAgICAgIFtoaXN0b3J5R3JvdXBzXT1cImhpc3RvcnlHcm91cHMoKVwiXG4gICAgICBbYWN0aXZlQ29udGV4dFRhYl09XCJhY3RpdmVDb250ZXh0VGFiKClcIlxuICAgICAgKGNhbmNlbEJvb2tpbmcpPVwiY2FuY2VsRGlhbG9nT3Blbi5zZXQodHJ1ZSlcIlxuICAgICAgKGFkZE5vdGVSZXF1ZXN0ZWQpPVwiYWRkTm90ZURpYWxvZ09wZW4uc2V0KHRydWUpXCJcbiAgICAgIChjb250ZXh0VGFiQ2hhbmdlZCk9XCJhY3RpdmVDb250ZXh0VGFiLnNldCgkZXZlbnQpXCJcbiAgICAvPlxuICB9XG5cbiAgPCEtLSBUcmFpbjogcmVhZC1vbmx5IGJvb2tpbmcgZGV0YWlscyAtLT5cbiAgQGlmIChwcm9kdWN0KCkgPT09ICd0cmFpbicpIHtcbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjYwJVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NDAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo4MCVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ2Vycm9yJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19lcnJvclwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgPHNwYW4+VHJhaW4gYm9va2luZyBub3QgZm91bmQuIERvdWJsZS1jaGVjayB0aGUgSUQsIHRoZW4gdHJ5IGFnYWluLjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ3N1Y2Nlc3MnICYmIGJvb2tpbmdEYXRhKCkpIHtcbiAgICAgIDxhcHAtc2JkLXRyYWluLWRldGFpbHMgW2RldGFpbF09XCJib29raW5nRGF0YSgpXCIgW2Jvb2tpbmdJZF09XCJib29raW5nSWQoKVwiIC8+XG4gICAgfVxuICB9XG5cbiAgPCEtLSBGbGlnaHQ6IEtlZXAgb3JpZ2luYWwgMi1jb2x1bW4gbGF5b3V0IC0tPlxuICBAaWYgKHByb2R1Y3QoKSA9PT0gJ2ZsaWdodCcpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRlbnRcIj5cblxuICAgICAgPCEtLSBMZWZ0OiBib29raW5nIGNvbnRleHQgLS0+XG4gICAgICA8YXNpZGUgY2xhc3M9XCJzYmQtcGFnZV9fYXNpZGVcIj5cblxuICAgICAgICA8IS0tIERhdGEgc2VhcmNoIGF0IHRoZSB0b3Agb2YgdGhlIHNpZGViYXIgLS0+XG4gICAgICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICA8YXBwLXNiZC1kYXRhLXNlYXJjaCBbZGF0YV09XCJib29raW5nRGF0YSgpXCIgLz5cbiAgICAgICAgICA8YXBwLXNiZC1mbGlnaHQtaXRpbmVyYXJ5LWNhcmQgW3Byb2R1Y3RdPVwiZmNyUHJvZHVjdCgpXCIgW2RhdGFdPVwiYm9va2luZ0RhdGEoKVwiIFt2ZXJpZmllZF09XCJkYXRhVmVyaWZpZWQoKVwiIC8+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIExvYWRpbmcgc2tlbGV0b24gZm9yIGFzaWRlIC0tPlxuICAgICAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19za2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NjAlXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NDAlXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6ODAlXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NTAlXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgPC9hc2lkZT5cblxuICAgICAgPCEtLSBSaWdodDogYWdlbnQgd29ya3NwYWNlIC0tPlxuICAgICAgPG1haW4gY2xhc3M9XCJzYmQtcGFnZV9fbWFpblwiPlxuXG4gICAgICAgIDwhLS0gRXJyb3Igc3RhdGUgLS0+XG4gICAgICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19lcnJvclwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8c3Bhbj5Cb29raW5nIG5vdCBmb3VuZC4gRG91YmxlLWNoZWNrIHRoZSBJRCBhbmQgcHJvZHVjdCB0eXBlLCB0aGVuIHRyeSBhZ2Fpbi48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIENvbnRlbnQgb25jZSBsb2FkZWQgLS0+XG4gICAgICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnc3VjY2VzcycpIHtcblxuICAgICAgICAgIDwhLS0gUXVpY2sgYWN0aW9ucyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX3F1aWNrLWFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXBhZ2VfX3F1aWNrLWxhYmVsXCI+UXVpY2sgYWN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgIDxhcHAtc2JkLXdvcmtmbG93LWFjdGlvbnNcbiAgICAgICAgICAgICAgW2Jvb2tpbmdJZF09XCJib29raW5nSWQoKVwiXG4gICAgICAgICAgICAgIFtzaG93UmVpc3N1ZV09XCJyZWlzc3VlRW5hYmxlZCAmJiBwcm9kdWN0KCkgPT09ICdmbGlnaHQnXCJcbiAgICAgICAgICAgICAgKGNhbmNlbEJvb2tpbmcpPVwiY2FuY2VsRGlhbG9nT3Blbi5zZXQodHJ1ZSlcIlxuICAgICAgICAgICAgICAocmVpc3N1ZSk9XCJyZWlzc3VlRGlhbG9nT3Blbi5zZXQodHJ1ZSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQWN0aW9uIGdyaWQgLS0+XG4gICAgICAgICAgPGFwcC1zYmQtYWN0aW9uLWdyaWRcbiAgICAgICAgICAgIFthY3Rpb25zXT1cImF2YWlsYWJsZUFjdGlvbnMoKVwiXG4gICAgICAgICAgICBbYWN0aXZlS2V5XT1cInNlbGVjdGVkQWN0aW9uS2V5KClcIlxuICAgICAgICAgICAgKGFjdGlvblNlbGVjdGVkKT1cIm9wZW5BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgLz5cblxuICAgICAgICAgIDwhLS0gQ29udGV4dDogTm90ZXMgKyBDaGFuZ2VzIHRhYmJlZCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHRcIj5cblxuICAgICAgICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19jb250ZXh0LXRhYnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiZC1wYWdlX19jb250ZXh0LXRhYlwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNiZC1wYWdlX19jb250ZXh0LXRhYi0tYWN0aXZlXT1cImFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ2NoYW5nZXMnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlQ29udGV4dFRhYi5zZXQoJ2NoYW5nZXMnKVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaGlzdG9yeVwiPjwvaT5cbiAgICAgICAgICAgICAgICBDaGFuZ2VzXG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nSGlzdG9yeSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHQtcGlsbCBzYmQtcGFnZV9fY29udGV4dC1waWxsLS1jaGFuZ2VzXCI+e3sgYm9va2luZ0hpc3RvcnkoKS5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiZC1wYWdlX19jb250ZXh0LXRhYlwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNiZC1wYWdlX19jb250ZXh0LXRhYi0tYWN0aXZlXT1cImFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ25vdGVzJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUNvbnRleHRUYWIuc2V0KCdub3RlcycpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jb21tZW50c1wiPjwvaT5cbiAgICAgICAgICAgICAgICBOb3Rlc1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHQtcGlsbCBzYmQtcGFnZV9fY29udGV4dC1waWxsLS1ub3Rlc1wiPnt7IGJvb2tpbmdOb3RlcygpLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnbm90ZXMnKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwiQWRkIE5vdGVcIiBpY29uPVwicGkgcGktcGx1c1wiIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tb3V0bGluZWQgc2JkLXBhZ2VfX2NvbnRleHQtYWRkXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROb3RlRGlhbG9nT3Blbi5zZXQodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTm90ZXMgdGFiIC0tPlxuICAgICAgICAgICAgQGlmIChhY3RpdmVDb250ZXh0VGFiKCkgPT09ICdub3RlcycpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19ub3Rlcy1saXN0XCI+XG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nTm90ZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fY29udGV4dC1lbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluYm94XCI+PC9pPiBObyBub3RlcyB5ZXRcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZm9yIChub3RlIG9mIGJvb2tpbmdOb3RlcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fbm90ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX25vdGUtdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtcGFnZV9fbm90ZS1iYWRnZSBzYmQtcGFnZV9fbm90ZS1iYWRnZS0te3sgbm90ZS5hY3Rpb24gfCBsb3dlcmNhc2UgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG5vdGUuYWN0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXBhZ2VfX25vdGUtYXV0aG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBub3RlLndyaXR0ZW5CeT8uZmlyc3ROYW1lIH19IHt7IG5vdGUud3JpdHRlbkJ5Py5sYXN0TmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1wYWdlX19ub3RlLWRhdGVcIj57eyBmbXROb3RlRGF0ZShub3RlLmRhdGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzYmQtcGFnZV9fbm90ZS1tc2dcIj57eyBub3RlLm1lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIENoYW5nZXMgdGFiIC0tPlxuICAgICAgICAgICAgQGlmIChhY3RpdmVDb250ZXh0VGFiKCkgPT09ICdjaGFuZ2VzJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtZ3JvdXBzXCI+XG4gICAgICAgICAgICAgICAgQGlmIChoaXN0b3J5R3JvdXBzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NvbnRleHQtZW1wdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jaGVja1wiPjwvaT4gTm8gY2hhbmdlcyByZWNvcmRlZFxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBmb3IgKGdyb3VwIG9mIGhpc3RvcnlHcm91cHMoKTsgdHJhY2sgZ3JvdXAuY2hhbmdlZEF0KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19jaGFuZ2VzLW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXVzZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBncm91cC5jaGFuZ2VkQnkgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1wYWdlX19jaGFuZ2VzLXNlcFwiPsK3PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZtdERhdGUoZ3JvdXAuY2hhbmdlZEF0KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInNiZC1wYWdlX19jaGFuZ2VzLXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+RmllbGQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PGkgY2xhc3M9XCJwaSBwaS10aW1lcy1jaXJjbGVcIj48L2k+IEJlZm9yZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48aSBjbGFzcz1cInBpIHBpLWNoZWNrLWNpcmNsZVwiPjwvaT4gQWZ0ZXI8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGVudHJ5IG9mIGdyb3VwLmVudHJpZXM7IHRyYWNrIGVudHJ5LmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmQtcGFnZV9fY2hhbmdlcy1maWVsZFwiPnt7IGZvcm1hdEZpZWxkKGVudHJ5LmZpZWxkKSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtb2xkXCI+e3sgZW50cnkuZnJvbSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2JkLXBhZ2VfX2NoYW5nZXMtbmV3XCI+e3sgZW50cnkudG8gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gTG9hZGluZyBza2VsZXRvbiBmb3IgbWFpbiAtLT5cbiAgICAgICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdsb2FkaW5nJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcGFnZV9fc2tlbGV0b24tY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjQwJVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1wYWdlX19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjI1JVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgIDwvbWFpbj5cblxuICAgIDwvZGl2PlxuICB9XG5cbjwvZGl2PlxuXG48YXBwLXNiZC1jYW5jZWwtZGlhbG9nXG4gIFt2aXNpYmxlXT1cImNhbmNlbERpYWxvZ09wZW4oKSAmJiBwcm9kdWN0KCkgPT09ICdmbGlnaHQnXCJcbiAgW2Jvb2tpbmdJZF09XCJib29raW5nSWQoKVwiXG4gIFtwcm9kdWN0XT1cImZjclByb2R1Y3QoKVwiXG4gIFtwbnJJbmZvXT1cImNhbmNlbFBuckluZm8oKVwiXG4gIFtib29raW5nSW5mb109XCJib29raW5nRGF0YSgpXCJcbiAgKGNsb3NlZCk9XCJjYW5jZWxEaWFsb2dPcGVuLnNldChmYWxzZSlcIlxuICAoY29uZmlybWVkKT1cImJvb2tpbmdTdGF0dXMuc2V0KCdpZGxlJyk7IGJvb2tpbmdEYXRhLnNldChudWxsKVwiXG4vPlxuXG48YWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvblxuICAqbmdJZj1cImNhbmNlbERpYWxvZ09wZW4oKSAmJiBwcm9kdWN0KCkgPT09ICdob3RlbCdcIlxuICBbc2VsZWN0ZWRIb3RlbEJvb2tpbmddPVwiYm9va2luZ0RhdGEoKVwiXG4gIChjbG9zZWQpPVwiY2FuY2VsRGlhbG9nT3Blbi5zZXQoZmFsc2UpXCJcbiAgKGNhbmNlbGxhdGlvblN1Y2Nlc3MpPVwiYm9va2luZ1N0YXR1cy5zZXQoJ2lkbGUnKTsgYm9va2luZ0RhdGEuc2V0KG51bGwpXCJcbi8+XG5cbjxhcHAtc2JkLWFjdGlvbi1kaWFsb2dcbiAgW3Zpc2libGVdPVwiYWN0aW9uRGlhbG9nT3BlbigpXCJcbiAgW2Jvb2tpbmdJZF09XCJib29raW5nSWQoKVwiXG4gIFtwcm9kdWN0XT1cImZjclByb2R1Y3QoKVwiXG4gIFthY3Rpb25zXT1cImF2YWlsYWJsZUFjdGlvbnMoKVwiXG4gIFtpbml0aWFsS2V5XT1cInNlbGVjdGVkQWN0aW9uS2V5KClcIlxuICBbcHJlbG9hZGVkRGF0YV09XCJib29raW5nRGF0YSgpXCJcbiAgKGNsb3NlZCk9XCJhY3Rpb25EaWFsb2dPcGVuLnNldChmYWxzZSlcIlxuLz5cblxuPGFwcC1zYmQtYWRkLW5vdGUtZGlhbG9nXG4gIFt2aXNpYmxlXT1cImFkZE5vdGVEaWFsb2dPcGVuKClcIlxuICBbYm9va2luZ0lkXT1cImJvb2tpbmdJZCgpXCJcbiAgW3Byb2R1Y3RdPVwiZmNyUHJvZHVjdCgpXCJcbiAgKGNsb3NlZCk9XCJhZGROb3RlRGlhbG9nT3Blbi5zZXQoZmFsc2UpXCJcbi8+XG5cbjxhcHAtc2JkLXJlaXNzdWUtZGlhbG9nXG4gIFt2aXNpYmxlXT1cInJlaXNzdWVEaWFsb2dPcGVuKClcIlxuICBbYm9va2luZ0lkXT1cImJvb2tpbmdJZCgpXCJcbiAgW2Jvb2tpbmdEYXRhXT1cImJvb2tpbmdEYXRhKClcIlxuICAoY2xvc2VkKT1cInJlaXNzdWVEaWFsb2dPcGVuLnNldChmYWxzZSlcIlxuLz5cbiJdfQ==
@@ -1,11 +1,11 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
- import { HttpClient } from '@angular/common/http';
3
2
  import { map } from 'rxjs/operators';
4
3
  import { SBD_CONFIG } from '../config/dashboard.config';
4
+ import { SBD_HTTP } from '../shared/services/sbd-http';
5
5
  import * as i0 from "@angular/core";
6
6
  export class SbdBookingService {
7
7
  constructor() {
8
- this.http = inject(HttpClient);
8
+ this.http = inject(SBD_HTTP);
9
9
  this.config = inject(SBD_CONFIG);
10
10
  this.base = this.config.apiBase;
11
11
  }
@@ -25,6 +25,13 @@ export class SbdBookingService {
25
25
  })
26
26
  .pipe(map(data => ({ data, elapsedMs: performance.now() - start })));
27
27
  }
28
+ /** Train booking details: bilingual sections + summary, ready to show (same API Helix uses). */
29
+ getTrainDetails(id) {
30
+ const base = (this.config.trainApiBase ?? this.base).replace(/\/+$/, '');
31
+ return this.http.get(`${base}/crm/fcr/booking/${encodeURIComponent(id)}/details`, {
32
+ params: { product: 'trains' },
33
+ });
34
+ }
28
35
  resendTicket(id) {
29
36
  return this.http.post(`${this.base}/v1/fcr/booking/${id}/resend`, {});
30
37
  }
@@ -66,4 +73,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
66
73
  type: Injectable,
67
74
  args: [{ providedIn: 'root' }]
68
75
  }] });
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2luZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9zZXJ2aWNlcy9ib29raW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBTXhELE1BQU0sT0FBTyxpQkFBaUI7SUFEOUI7UUFFVSxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFCLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsU0FBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0tBMEVwQztJQXhFQyxVQUFVLENBQ1IsRUFBVSxFQUNWLE9BQTJCLEVBQzNCLFNBQTRCLEtBQUssRUFDakMsV0FBd0IsSUFBSTtRQUU1QixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUEyQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFB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QUkscUJBQXFCLEtBQUssT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUM7WUFDMUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLGdCQUFnQixFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RyxDQUFDOytHQTVFVSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQURKLE1BQU07OzRGQUNuQixpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU0JEX0NPTkZJRyB9IGZyb20gJy4uL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgQXBpUmVzcG9uc2UgPSBhbnk7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU2JkQm9va2luZ1NlcnZpY2Uge1xuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KFNCRF9DT05GSUcpO1xuICBwcml2YXRlIGJhc2UgPSB0aGlzLmNvbmZpZy5hcGlCYXNlO1xuXG4gIGdldEJvb2tpbmcoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9kdWN0OiAnZmxpZ2h0JyB8ICdob3RlbCcsXG4gICAgZmllbGRzOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICdhbGwnLFxuICAgIGxhbmd1YWdlOiAnZW4nIHwgJ2FyJyA9ICdlbicsXG4gICk6IE9ic2VydmFibGU8eyBkYXRhOiBBcGlSZXNwb25zZTsgZWxhcHNlZE1zOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZmllbGRzUGFyYW0gPSBBcnJheS5pc0FycmF5KGZpZWxkcykgPyBmaWVsZHMuam9pbignLCcpIDogZmllbGRzO1xuICAgIGNvbnN0IHByb2R1Y3RQYXJhbSA9IHByb2R1Y3QgPT09ICdmbGlnaHQnID8gJ2ZsaWdodHMnIDogJ2hvdGVscyc7XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgcGxhdGZvcm06IHRoaXMuY29uZmlnLnBsYXRmb3JtLCAnQWNjZXB0LUxhbmd1YWdlJzogbGFuZ3VhZ2UgfTtcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgcHJvZHVjdDogcHJvZHVjdFBhcmFtLCBmaWVsZHM6IGZpZWxkc1BhcmFtIH07XG4gICAgaWYgKHByb2R1Y3QgPT09ICdmbGlnaHQnKSB7XG4gICAgICBwYXJhbXNbJ2FkZEFpcmxpbmVTdGFtcCddID0gJ3RydWUnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQoYCR7dGhpcy5iYXNlfS92MS9mY3IvYm9va2luZy9pbmZvcm1hdGlvbi8ke2lkfWAsIHtcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcChkYXRhID0+ICh7IGRhdGEsIGVsYXBzZWRNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCB9KSkpO1xuICB9XG5cbiAgcmVzZW5kVGlja2V0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYmFzZX0vdjEvZmNyL2Jvb2tpbmcvJHtpZH0vcmVzZW5kYCwge30pO1xuICB9XG5cbiAgZ2V0UmVmdW5kRGV0YWlscyhpZDogc3RyaW5nLCBwcm9kdWN0OiAnZmxpZ2h0JyB8ICdob3RlbCcgPSAnZmxpZ2h0JywgbGFuZ3VhZ2U6ICdlbicgfCAnYXInID0gJ2VuJyk6IE9ic2VydmFibGU8QXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9kdWN0UGFyYW0gPSBwcm9kdWN0ID09PSAnZmxpZ2h0JyA/ICdmbGlnaHRzJyA6ICdob3RlbHMnO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IHBsYXRmb3JtOiB0aGlzLmNvbmZpZy5wbGF0Zm9ybSB9O1xuICAgIGlmIChsYW5ndWFnZSA9PT0gJ2FyJykgaGVhZGVyc1snQWNjZXB0LUxhbmd1YWdlJ10gPSAnYXInO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJhc2V9L3YxL2Zjci9yZWZ1bmQvZGV0YWlsc2AsIHtcbiAgICAgIGJvb2tpbmdJZDogaWQsXG4gICAgICBwcm9kdWN0OiBwcm9kdWN0UGFyYW0sXG4gICAgfSwgeyBoZWFkZXJzIH0pO1xuICB9XG5cbiAgYWRkTm90ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb2R1Y3Q6ICdmbGlnaHQnIHwgJ2hvdGVsJyA9ICdmbGlnaHQnLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBhY3Rpb246ICdHRU5FUkFMJyB8ICdGRUVEQkFDSycgfCAnUkVNQVJLJyA9ICdHRU5FUkFMJyxcbiAgKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb2R1Y3RQYXJhbSA9IHByb2R1Y3QgPT09ICdmbGlnaHQnID8gJ2ZsaWdodCcgOiAnaG90ZWwnO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KFxuICAgICAgYCR7dGhpcy5iYXNlfS92MS9iYWNrLW9mZmljZS9ib29raW5nLyR7cHJvZHVjdFBhcmFtfS9hZGROb3RlLyR7aWR9YCxcbiAgICAgIHsgbm90ZXM6IFt7IG1lc3NhZ2UsIGFjdGlvbiB9XSB9LFxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25maXJtQ2FuY2VsKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvZHVjdDogJ2ZsaWdodCcgfCAnaG90ZWwnID0gJ2ZsaWdodCcsXG4gICAgbGVnSW5mbz86IHN0cmluZ1tdLFxuICAgIHNlbGVjdGVkU291cmNlPzogc3RyaW5nLFxuICAgIHByZWZlcnJlZFJlZnVuZE1ldGhvZD86ICd3YWxsZXQnIHwgJ29yaWdpbmFsUGF5bWVudE1ldGhvZCcgfCAnc3BsaXQnLFxuICAgIHNwbGl0QW1vdW50cz86IHsgd2FsbGV0UmVmdW5kQW1vdW50OiBudW1iZXI7IHRvdGFsQ2FyZFJlZnVuZEFtb3VudDogbnVtYmVyIH0sXG4gICk6IE9ic2VydmFibGU8QXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9kdWN0UGFyYW0gPSBwcm9kdWN0ID09PSAnZmxpZ2h0JyA/ICdmbGlnaHRzJyA6ICdob3RlbHMnO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgYm9keTogYW55ID0geyBib29raW5nSWQ6IFN0cmluZyhpZCksIHByb2R1Y3Q6IHByb2R1Y3RQYXJhbSB9O1xuICAgIGlmIChsZWdJbmZvICYmIGxlZ0luZm8ubGVuZ3RoID4gMCkgYm9keS5sZWdJbmZvID0gbGVnSW5mbztcbiAgICBpZiAoc2VsZWN0ZWRTb3VyY2UpIGJvZHkuc2VsZWN0ZWRTb3VyY2UgPSBzZWxlY3RlZFNvdXJjZTtcbiAgICBpZiAocHJlZmVycmVkUmVmdW5kTWV0aG9kKSBib2R5LnByZWZlcnJlZFJlZnVuZE1ldGhvZCA9IHByZWZlcnJlZFJlZnVuZE1ldGhvZDtcbiAgICBpZiAocHJlZmVycmVkUmVmdW5kTWV0aG9kID09PSAnc3BsaXQnICYmIHNwbGl0QW1vdW50cykge1xuICAgICAgYm9keS53YWxsZXRSZWZ1bmRBbW91bnQgPSBzcGxpdEFtb3VudHMud2FsbGV0UmVmdW5kQW1vdW50O1xuICAgICAgYm9keS50b3RhbENhcmRSZWZ1bmRBbW91bnQgPSBzcGxpdEFtb3VudHMudG90YWxDYXJkUmVmdW5kQW1vdW50O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5iYXNlfS92MS9mY3IvcmVmdW5kYCwgYm9keSwgeyBoZWFkZXJzOiB7IHBsYXRmb3JtOiB0aGlzLmNvbmZpZy5wbGF0Zm9ybSB9IH0pO1xuICB9XG59XG4iXX0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2luZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9zZXJ2aWNlcy9ib29raW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBT3ZELE1BQU0sT0FBTyxpQkFBaUI7SUFEOUI7UUFFVSxTQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsU0FBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0tBa0ZwQztJQWhGQyxVQUFVLENBQ1IsRUFBVSxFQUNWLE9BQTJCLEVBQzNCLFNBQTRCLEtBQUssRUFDakMsV0FBd0IsSUFBSTtRQUU1QixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUEyQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFB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LFFBQVEsQ0FBQztRQUNqRSw4REFBOEQ7UUFDOUQsTUFBTSxJQUFJLEdBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUNuRSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUMxRCxJQUFJLGNBQWM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN6RCxJQUFJLHFCQUFxQjtZQUFFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztRQUM5RSxJQUFJLHFCQUFxQixLQUFLLE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDO1lBQzFELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUM7UUFDbEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0csQ0FBQzsrR0FwRlUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNOzs0RkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTQkRfQ09ORklHIH0gZnJvbSAnLi4vY29uZmlnL2Rhc2hib2FyZC5jb25maWcnO1xuaW1wb3J0IHsgU0JEX0hUVFAgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvc2JkLWh0dHAnO1xuaW1wb3J0IHsgU2JkVHJhaW5EZXRhaWwgfSBmcm9tICcuLi9tb2RlbHMvdHJhaW4udHlwZXMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBBcGlSZXNwb25zZSA9IGFueTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTYmRCb29raW5nU2VydmljZSB7XG4gIHByaXZhdGUgaHR0cCA9IGluamVjdChTQkRfSFRUUCk7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KFNCRF9DT05GSUcpO1xuICBwcml2YXRlIGJhc2UgPSB0aGlzLmNvbmZpZy5hcGlCYXNlO1xuXG4gIGdldEJvb2tpbmcoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9kdWN0OiAnZmxpZ2h0JyB8ICdob3RlbCcsXG4gICAgZmllbGRzOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICdhbGwnLFxuICAgIGxhbmd1YWdlOiAnZW4nIHwgJ2FyJyA9ICdlbicsXG4gICk6IE9ic2VydmFibGU8eyBkYXRhOiBBcGlSZXNwb25zZTsgZWxhcHNlZE1zOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZmllbGRzUGFyYW0gPSBBcnJheS5pc0FycmF5KGZpZWxkcykgPyBmaWVsZHMuam9pbignLCcpIDogZmllbGRzO1xuICAgIGNvbnN0IHByb2R1Y3RQYXJhbSA9IHByb2R1Y3QgPT09ICdmbGlnaHQnID8gJ2ZsaWdodHMnIDogJ2hvdGVscyc7XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgcGxhdGZvcm06IHRoaXMuY29uZmlnLnBsYXRmb3JtLCAnQWNjZXB0LUxhbmd1YWdlJzogbGFuZ3VhZ2UgfTtcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgcHJvZHVjdDogcHJvZHVjdFBhcmFtLCBmaWVsZHM6IGZpZWxkc1BhcmFtIH07XG4gICAgaWYgKHByb2R1Y3QgPT09ICdmbGlnaHQnKSB7XG4gICAgICBwYXJhbXNbJ2FkZEFpcmxpbmVTdGFtcCddID0gJ3RydWUnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQoYCR7dGhpcy5iYXNlfS92MS9mY3IvYm9va2luZy9pbmZvcm1hdGlvbi8ke2lkfWAsIHtcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcChkYXRhID0+ICh7IGRhdGEsIGVsYXBzZWRNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCB9KSkpO1xuICB9XG5cbiAgLyoqIFRyYWluIGJvb2tpbmcgZGV0YWlsczogYmlsaW5ndWFsIHNlY3Rpb25zICsgc3VtbWFyeSwgcmVhZHkgdG8gc2hvdyAoc2FtZSBBUEkgSGVsaXggdXNlcykuICovXG4gIGdldFRyYWluRGV0YWlscyhpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYmRUcmFpbkRldGFpbD4ge1xuICAgIGNvbnN0IGJhc2UgPSAodGhpcy5jb25maWcudHJhaW5BcGlCYXNlID8/IHRoaXMuYmFzZSkucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U2JkVHJhaW5EZXRhaWw+KGAke2Jhc2V9L2NybS9mY3IvYm9va2luZy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2RldGFpbHNgLCB7XG4gICAgICBwYXJhbXM6IHsgcHJvZHVjdDogJ3RyYWlucycgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2VuZFRpY2tldChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJhc2V9L3YxL2Zjci9ib29raW5nLyR7aWR9L3Jlc2VuZGAsIHt9KTtcbiAgfVxuXG4gIGdldFJlZnVuZERldGFpbHMoaWQ6IHN0cmluZywgcHJvZHVjdDogJ2ZsaWdodCcgfCAnaG90ZWwnID0gJ2ZsaWdodCcsIGxhbmd1YWdlOiAnZW4nIHwgJ2FyJyA9ICdlbicpOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvZHVjdFBhcmFtID0gcHJvZHVjdCA9PT0gJ2ZsaWdodCcgPyAnZmxpZ2h0cycgOiAnaG90ZWxzJztcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBwbGF0Zm9ybTogdGhpcy5jb25maWcucGxhdGZvcm0gfTtcbiAgICBpZiAobGFuZ3VhZ2UgPT09ICdhcicpIGhlYWRlcnNbJ0FjY2VwdC1MYW5ndWFnZSddID0gJ2FyJztcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5iYXNlfS92MS9mY3IvcmVmdW5kL2RldGFpbHNgLCB7XG4gICAgICBib29raW5nSWQ6IGlkLFxuICAgICAgcHJvZHVjdDogcHJvZHVjdFBhcmFtLFxuICAgIH0sIHsgaGVhZGVycyB9KTtcbiAgfVxuXG4gIGFkZE5vdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9kdWN0OiAnZmxpZ2h0JyB8ICdob3RlbCcgPSAnZmxpZ2h0JyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYWN0aW9uOiAnR0VORVJBTCcgfCAnRkVFREJBQ0snIHwgJ1JFTUFSSycgPSAnR0VORVJBTCcsXG4gICk6IE9ic2VydmFibGU8QXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9kdWN0UGFyYW0gPSBwcm9kdWN0ID09PSAnZmxpZ2h0JyA/ICdmbGlnaHQnIDogJ2hvdGVsJztcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChcbiAgICAgIGAke3RoaXMuYmFzZX0vdjEvYmFjay1vZmZpY2UvYm9va2luZy8ke3Byb2R1Y3RQYXJhbX0vYWRkTm90ZS8ke2lkfWAsXG4gICAgICB7IG5vdGVzOiBbeyBtZXNzYWdlLCBhY3Rpb24gfV0gfSxcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uZmlybUNhbmNlbChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb2R1Y3Q6ICdmbGlnaHQnIHwgJ2hvdGVsJyA9ICdmbGlnaHQnLFxuICAgIGxlZ0luZm8/OiBzdHJpbmdbXSxcbiAgICBzZWxlY3RlZFNvdXJjZT86IHN0cmluZyxcbiAgICBwcmVmZXJyZWRSZWZ1bmRNZXRob2Q/OiAnd2FsbGV0JyB8ICdvcmlnaW5hbFBheW1lbnRNZXRob2QnIHwgJ3NwbGl0JyxcbiAgICBzcGxpdEFtb3VudHM/OiB7IHdhbGxldFJlZnVuZEFtb3VudDogbnVtYmVyOyB0b3RhbENhcmRSZWZ1bmRBbW91bnQ6IG51bWJlciB9LFxuICApOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvZHVjdFBhcmFtID0gcHJvZHVjdCA9PT0gJ2ZsaWdodCcgPyAnZmxpZ2h0cycgOiAnaG90ZWxzJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGJvZHk6IGFueSA9IHsgYm9va2luZ0lkOiBTdHJpbmcoaWQpLCBwcm9kdWN0OiBwcm9kdWN0UGFyYW0gfTtcbiAgICBpZiAobGVnSW5mbyAmJiBsZWdJbmZvLmxlbmd0aCA+IDApIGJvZHkubGVnSW5mbyA9IGxlZ0luZm87XG4gICAgaWYgKHNlbGVjdGVkU291cmNlKSBib2R5LnNlbGVjdGVkU291cmNlID0gc2VsZWN0ZWRTb3VyY2U7XG4gICAgaWYgKHByZWZlcnJlZFJlZnVuZE1ldGhvZCkgYm9keS5wcmVmZXJyZWRSZWZ1bmRNZXRob2QgPSBwcmVmZXJyZWRSZWZ1bmRNZXRob2Q7XG4gICAgaWYgKHByZWZlcnJlZFJlZnVuZE1ldGhvZCA9PT0gJ3NwbGl0JyAmJiBzcGxpdEFtb3VudHMpIHtcbiAgICAgIGJvZHkud2FsbGV0UmVmdW5kQW1vdW50ID0gc3BsaXRBbW91bnRzLndhbGxldFJlZnVuZEFtb3VudDtcbiAgICAgIGJvZHkudG90YWxDYXJkUmVmdW5kQW1vdW50ID0gc3BsaXRBbW91bnRzLnRvdGFsQ2FyZFJlZnVuZEFtb3VudDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYmFzZX0vdjEvZmNyL3JlZnVuZGAsIGJvZHksIHsgaGVhZGVyczogeyBwbGF0Zm9ybTogdGhpcy5jb25maWcucGxhdGZvcm0gfSB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,29 @@
1
+ import { Injectable, inject, signal } from '@angular/core';
2
+ import { SBD_CONFIG } from '../config/dashboard.config';
3
+ import * as i0 from "@angular/core";
4
+ /** The brand the agent is working on. It is sent as the `x-brand` header of every request of the dashboard. */
5
+ export class SbdBrandService {
6
+ constructor() {
7
+ this.config = inject(SBD_CONFIG);
8
+ this.brands = this.config.brands;
9
+ /** The `value` of the selected brand. Starts on the default of the config (Almatar). */
10
+ this.brand = signal(this.start());
11
+ }
12
+ /** Ignores a value that is not one of the brands, so a wrong header can never be sent. */
13
+ setBrand(value) {
14
+ if (this.brands.some((b) => b.value === value)) {
15
+ this.brand.set(value);
16
+ }
17
+ }
18
+ start() {
19
+ const wanted = this.config.defaultBrand;
20
+ return this.brands.some((b) => b.value === wanted) ? wanted : (this.brands[0]?.value ?? 'almatar');
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdBrandService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
23
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdBrandService, providedIn: 'root' }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdBrandService, decorators: [{
26
+ type: Injectable,
27
+ args: [{ providedIn: 'root' }]
28
+ }] });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvc2VydmljZXMvYnJhbmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBa0IsTUFBTSw0QkFBNEIsQ0FBQzs7QUFFeEUsK0dBQStHO0FBRS9HLE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBRW1CLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEMsV0FBTSxHQUE4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUVoRSx3RkFBd0Y7UUFDL0UsVUFBSyxHQUFHLE1BQU0sQ0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQWEvQztJQVhDLDBGQUEwRjtJQUMxRixRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLO1FBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7K0dBbEJVLGVBQWU7bUhBQWYsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTQkRfQ09ORklHLCBTYmRCcmFuZE9wdGlvbiB9IGZyb20gJy4uL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcblxuLyoqIFRoZSBicmFuZCB0aGUgYWdlbnQgaXMgd29ya2luZyBvbi4gSXQgaXMgc2VudCBhcyB0aGUgYHgtYnJhbmRgIGhlYWRlciBvZiBldmVyeSByZXF1ZXN0IG9mIHRoZSBkYXNoYm9hcmQuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNiZEJyYW5kU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFNCRF9DT05GSUcpO1xuXG4gIHJlYWRvbmx5IGJyYW5kczogcmVhZG9ubHkgU2JkQnJhbmRPcHRpb25bXSA9IHRoaXMuY29uZmlnLmJyYW5kcztcblxuICAvKiogVGhlIGB2YWx1ZWAgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLiBTdGFydHMgb24gdGhlIGRlZmF1bHQgb2YgdGhlIGNvbmZpZyAoQWxtYXRhcikuICovXG4gIHJlYWRvbmx5IGJyYW5kID0gc2lnbmFsPHN0cmluZz4odGhpcy5zdGFydCgpKTtcblxuICAvKiogSWdub3JlcyBhIHZhbHVlIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUgYnJhbmRzLCBzbyBhIHdyb25nIGhlYWRlciBjYW4gbmV2ZXIgYmUgc2VudC4gKi9cbiAgc2V0QnJhbmQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJyYW5kcy5zb21lKChiKSA9PiBiLnZhbHVlID09PSB2YWx1ZSkpIHtcbiAgICAgIHRoaXMuYnJhbmQuc2V0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgd2FudGVkID0gdGhpcy5jb25maWcuZGVmYXVsdEJyYW5kO1xuICAgIHJldHVybiB0aGlzLmJyYW5kcy5zb21lKChiKSA9PiBiLnZhbHVlID09PSB3YW50ZWQpID8gd2FudGVkIDogKHRoaXMuYnJhbmRzWzBdPy52YWx1ZSA/PyAnYWxtYXRhcicpO1xuICB9XG59XG4iXX0=