@almatar/smart-booking-dashboard 0.0.1 → 0.0.2-alpha.3

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 (128) hide show
  1. package/esm2022/lib/components/action-card/action-card.component.mjs +3 -3
  2. package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +3 -3
  3. package/esm2022/lib/components/almatar-aside/aside-back-button.service.mjs +24 -0
  4. package/esm2022/lib/components/almatar-aside/aside.component.mjs +122 -0
  5. package/esm2022/lib/components/booking-input/booking-input.component.mjs +4 -3
  6. package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +53 -4
  7. package/esm2022/lib/components/data-search/data-search.component.mjs +3 -3
  8. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +544 -0
  9. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.mjs +43 -0
  10. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +296 -0
  11. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +88 -0
  12. 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 +242 -0
  13. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.mjs +48 -0
  14. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +129 -0
  15. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +321 -0
  16. package/esm2022/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.mjs +52 -0
  17. package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.mjs +9 -0
  18. package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.mjs +7 -0
  19. package/esm2022/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.mjs +2 -0
  20. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +457 -0
  21. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.mjs +55 -0
  22. package/esm2022/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.mjs +48 -0
  23. package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
  24. package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
  25. package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
  26. package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
  27. package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
  28. package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
  29. package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
  30. package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
  31. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
  32. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
  33. package/esm2022/lib/components/result-panel/result-panel.component.mjs +3 -3
  34. package/esm2022/lib/components/shared/components/confirm-modal/confirm-modal.component.mjs +75 -0
  35. package/esm2022/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.mjs +46 -0
  36. package/esm2022/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.mjs +9 -0
  37. package/esm2022/lib/components/shared/interfaces/i-flight-refund-details.mjs +86 -0
  38. package/esm2022/lib/components/shared/models/cancel-hotel-booking.model.mjs +7 -0
  39. package/esm2022/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.mjs +27 -0
  40. package/esm2022/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.mjs +17 -0
  41. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
  42. package/esm2022/lib/config/dashboard.config.mjs +3 -1
  43. package/esm2022/lib/config/hotel-actions.config.mjs +21 -1
  44. package/esm2022/lib/models/booking.types.mjs +73 -2
  45. package/esm2022/lib/models/reissue.types.mjs +2 -0
  46. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +31 -7
  47. package/esm2022/lib/services/booking.service.mjs +6 -2
  48. package/esm2022/lib/services/reissue.service.mjs +142 -0
  49. package/esm2022/lib/services/toast.service.mjs +15 -7
  50. package/esm2022/lib/shared/components/currency-code-icon/currency-code-icon.component.mjs +35 -0
  51. package/esm2022/lib/shared/enums/brand-enums.enum.mjs +7 -0
  52. package/esm2022/lib/shared/environments/environment.mjs +10 -0
  53. package/esm2022/lib/shared/models/index.mjs +6 -0
  54. package/esm2022/lib/shared/modules/almatar-icon/almatar-icon.module.mjs +36 -0
  55. package/esm2022/lib/shared/modules/loader/loader.module.mjs +43 -0
  56. package/esm2022/lib/shared/pipes/exchange.pipe.mjs +49 -0
  57. package/esm2022/lib/shared/services/api.service.mjs +42 -0
  58. package/esm2022/lib/shared/services/shared.service.mjs +34 -0
  59. package/esm2022/lib/shared/services/translation.service.mjs +61 -0
  60. package/esm2022/lib/shared/services/webengage-tracking.service.mjs +28 -0
  61. package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +9 -0
  62. package/esm2022/lib/utils/reissue-format.mjs +64 -0
  63. package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
  64. package/esm2022/public-api.mjs +3 -1
  65. package/fesm2022/almatar-smart-booking-dashboard.mjs +5387 -395
  66. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  67. package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
  68. package/lib/components/almatar-aside/aside-back-button.service.d.ts +11 -0
  69. package/lib/components/almatar-aside/aside.component.d.ts +46 -0
  70. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +7 -0
  71. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +97 -0
  72. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.d.ts +25 -0
  73. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +91 -0
  74. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.d.ts +39 -0
  75. package/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.d.ts +44 -0
  76. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.d.ts +19 -0
  77. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +38 -0
  78. package/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.d.ts +142 -0
  79. package/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.d.ts +23 -0
  80. package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.d.ts +7 -0
  81. package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.d.ts +5 -0
  82. package/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.d.ts +252 -0
  83. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +88 -0
  84. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.d.ts +21 -0
  85. package/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.d.ts +16 -0
  86. package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
  87. package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
  88. package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
  89. package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
  90. package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
  91. package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
  92. package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
  93. package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
  94. package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
  95. package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
  96. package/lib/components/result-panel/result-panel.component.d.ts +1 -1
  97. package/lib/components/shared/components/confirm-modal/confirm-modal.component.d.ts +17 -0
  98. package/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.d.ts +10 -0
  99. package/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.d.ts +7 -0
  100. package/lib/components/shared/interfaces/i-flight-refund-details.d.ts +73 -0
  101. package/lib/components/shared/models/cancel-hotel-booking.model.d.ts +6 -0
  102. package/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.d.ts +11 -0
  103. package/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.d.ts +7 -0
  104. package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
  105. package/lib/config/dashboard.config.d.ts +29 -0
  106. package/lib/models/booking.types.d.ts +28 -0
  107. package/lib/models/reissue.types.d.ts +147 -0
  108. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +5 -1
  109. package/lib/services/reissue.service.d.ts +45 -0
  110. package/lib/services/toast.service.d.ts +14 -1
  111. package/lib/shared/components/currency-code-icon/currency-code-icon.component.d.ts +13 -0
  112. package/lib/shared/enums/brand-enums.enum.d.ts +5 -0
  113. package/lib/shared/environments/environment.d.ts +7 -0
  114. package/lib/shared/models/index.d.ts +11 -0
  115. package/lib/shared/modules/almatar-icon/almatar-icon.module.d.ts +13 -0
  116. package/lib/shared/modules/loader/loader.module.d.ts +13 -0
  117. package/lib/shared/pipes/exchange.pipe.d.ts +17 -0
  118. package/lib/shared/services/api.service.d.ts +43 -0
  119. package/lib/shared/services/shared.service.d.ts +12 -0
  120. package/lib/shared/services/translation.service.d.ts +17 -0
  121. package/lib/shared/services/webengage-tracking.service.d.ts +8 -0
  122. package/lib/shared/store/selectors/currency.selectors.d.ts +2 -0
  123. package/lib/utils/reissue-format.d.ts +28 -0
  124. package/lib/utils/reissue-url.builder.d.ts +24 -0
  125. package/package.json +9 -24
  126. package/public-api.d.ts +5 -1
  127. package/LICENSE +0 -21
  128. package/README.md +0 -132
@@ -0,0 +1,48 @@
1
+ import { Component, ChangeDetectionStrategy, input, output, computed, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class AlmatarHotelAutoCancellationRefundableRoomComponent {
5
+ constructor() {
6
+ this.package = input.required();
7
+ this.hideCheckbox = input(false);
8
+ this.togglePackage = output();
9
+ this.groupedRooms = computed(() => {
10
+ const rooms = this.package()?.rooms || [];
11
+ const groupMap = new Map();
12
+ for (const room of rooms) {
13
+ // const bedTypeOrRoomType = rawBedType || rawRoomType || room.roomName || '';
14
+ const bedTypeOrRoomType = room?.roomName;
15
+ const roomBasis = room.roomBasis || '';
16
+ const key = `${bedTypeOrRoomType}|||${roomBasis}`;
17
+ if (groupMap.has(key)) {
18
+ const group = groupMap.get(key);
19
+ group.count++;
20
+ group.rooms.push(room);
21
+ }
22
+ else {
23
+ groupMap.set(key, {
24
+ key,
25
+ bedTypeOrRoomType,
26
+ roomBasis,
27
+ count: 1,
28
+ rooms: [room],
29
+ });
30
+ }
31
+ }
32
+ return Array.from(groupMap.values());
33
+ });
34
+ }
35
+ onTogglePackage() {
36
+ if (this.hideCheckbox()) {
37
+ return;
38
+ }
39
+ this.togglePackage.emit(this.package()?.packageId);
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationRefundableRoomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlmatarHotelAutoCancellationRefundableRoomComponent, isStandalone: true, selector: "almatar-hotel-auto-cancellation-refundable-room", inputs: { package: { classPropertyName: "package", publicName: "package", isSignal: true, isRequired: true, transformFunction: null }, hideCheckbox: { classPropertyName: "hideCheckbox", publicName: "hideCheckbox", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { togglePackage: "togglePackage" }, ngImport: i0, template: "<div\n class=\"package-item\"\n [class.package-item--selected]=\"package().isSelected\"\n (click)=\"onTogglePackage()\"\n>\n <div class=\"package-item__header\">\n @if (!hideCheckbox()) {\n <div\n class=\"package-item__checkbox\"\n [class.package-item__checkbox--checked]=\"package().isSelected\"\n (click)=\"$event.stopPropagation(); onTogglePackage()\"\n >\n <svg\n class=\"package-item__checkbox-icon\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 7L5.5 10.5L12 3.5\"\n stroke=\"white\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n }\n\n <div class=\"package-item__content\">\n <div class=\"package-item__info\">\n <h4 class=\"package-item__name\">{{ package().packageName }}</h4>\n @if (package().boardBasis) {\n <span class=\"package-item__board-basis\">{{\n package().boardBasis\n }}</span>\n }\n </div>\n\n <span\n class=\"package-item__refund-badge package-item__refund-badge--refundable\"\n >\n REFUNDABLE\n </span>\n </div>\n </div>\n\n @if (groupedRooms().length) {\n <div class=\"package-item__rooms\">\n @for (group of groupedRooms(); track i; let i = $index) {\n <div class=\"package-item__room\">\n <h5 class=\"package-item__room-name\">\n @if (group.count > 1) {\n {{ group.count }}x\n @if (group.bedTypeOrRoomType) {\n {{ group.bedTypeOrRoomType }}\n }\n } @else {\n Room\n {{ i + 1 }}\n @if (group.bedTypeOrRoomType) {\n <span class=\"package-item__separator\">\u2022</span>\n {{ group.bedTypeOrRoomType }}\n }\n }\n </h5>\n @if (group.roomBasis) {\n <span class=\"package-item__room-basis\">{{ group.roomBasis }}</span>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".package-item{display:flex;flex-direction:column;gap:12px;padding:12px;background:#fff;border:2px solid #e5e7eb;border-radius:16px;cursor:pointer;transition:border-color .2s ease,border-width .2s ease,background-color .2s ease}.package-item:hover{border:2px solid rgb(124,58,237)}.package-item--selected{border:2px solid rgb(124,58,237);background:#fff}.package-item__header{display:flex;align-items:flex-start;gap:8px;width:100%}.package-item__checkbox{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;border:2px solid rgb(124,58,237);border-radius:2px;cursor:pointer;background:#fff;transition:all .2s ease;margin-top:2px}.package-item__checkbox--checked{background:#7c3aed}.package-item__checkbox-icon{opacity:0;transition:opacity .2s ease}.package-item__checkbox--checked .package-item__checkbox-icon{opacity:1}.package-item__content{flex:1;display:flex;justify-content:space-between;align-items:flex-start}.package-item__info{display:flex;flex-direction:column;gap:4px}.package-item__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;margin:0}.package-item__board-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.package-item__refund-badge{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);text-transform:uppercase;padding:6px 8px;flex-shrink:0;border-radius:999px}.package-item__refund-badge--refundable{color:#15803c;background:#f0fdf5}.package-item__rooms{display:flex;flex-direction:column;gap:8px;margin-inline-start:26px}.package-item__room{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:16px;border:1px solid rgb(217,217,222)}.package-item__room-name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center;gap:0;margin:0}.package-item__separator{margin:0 4px;color:#1f2937;font-weight:var(--almatar-font-weight-regular)}.package-item__room-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationRefundableRoomComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'almatar-hotel-auto-cancellation-refundable-room', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"package-item\"\n [class.package-item--selected]=\"package().isSelected\"\n (click)=\"onTogglePackage()\"\n>\n <div class=\"package-item__header\">\n @if (!hideCheckbox()) {\n <div\n class=\"package-item__checkbox\"\n [class.package-item__checkbox--checked]=\"package().isSelected\"\n (click)=\"$event.stopPropagation(); onTogglePackage()\"\n >\n <svg\n class=\"package-item__checkbox-icon\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 7L5.5 10.5L12 3.5\"\n stroke=\"white\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n }\n\n <div class=\"package-item__content\">\n <div class=\"package-item__info\">\n <h4 class=\"package-item__name\">{{ package().packageName }}</h4>\n @if (package().boardBasis) {\n <span class=\"package-item__board-basis\">{{\n package().boardBasis\n }}</span>\n }\n </div>\n\n <span\n class=\"package-item__refund-badge package-item__refund-badge--refundable\"\n >\n REFUNDABLE\n </span>\n </div>\n </div>\n\n @if (groupedRooms().length) {\n <div class=\"package-item__rooms\">\n @for (group of groupedRooms(); track i; let i = $index) {\n <div class=\"package-item__room\">\n <h5 class=\"package-item__room-name\">\n @if (group.count > 1) {\n {{ group.count }}x\n @if (group.bedTypeOrRoomType) {\n {{ group.bedTypeOrRoomType }}\n }\n } @else {\n Room\n {{ i + 1 }}\n @if (group.bedTypeOrRoomType) {\n <span class=\"package-item__separator\">\u2022</span>\n {{ group.bedTypeOrRoomType }}\n }\n }\n </h5>\n @if (group.roomBasis) {\n <span class=\"package-item__room-basis\">{{ group.roomBasis }}</span>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".package-item{display:flex;flex-direction:column;gap:12px;padding:12px;background:#fff;border:2px solid #e5e7eb;border-radius:16px;cursor:pointer;transition:border-color .2s ease,border-width .2s ease,background-color .2s ease}.package-item:hover{border:2px solid rgb(124,58,237)}.package-item--selected{border:2px solid rgb(124,58,237);background:#fff}.package-item__header{display:flex;align-items:flex-start;gap:8px;width:100%}.package-item__checkbox{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;border:2px solid rgb(124,58,237);border-radius:2px;cursor:pointer;background:#fff;transition:all .2s ease;margin-top:2px}.package-item__checkbox--checked{background:#7c3aed}.package-item__checkbox-icon{opacity:0;transition:opacity .2s ease}.package-item__checkbox--checked .package-item__checkbox-icon{opacity:1}.package-item__content{flex:1;display:flex;justify-content:space-between;align-items:flex-start}.package-item__info{display:flex;flex-direction:column;gap:4px}.package-item__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;margin:0}.package-item__board-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}.package-item__refund-badge{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);text-transform:uppercase;padding:6px 8px;flex-shrink:0;border-radius:999px}.package-item__refund-badge--refundable{color:#15803c;background:#f0fdf5}.package-item__rooms{display:flex;flex-direction:column;gap:8px;margin-inline-start:26px}.package-item__room{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:16px;border:1px solid rgb(217,217,222)}.package-item__room-name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center;gap:0;margin:0}.package-item__separator{margin:0 4px;color:#1f2937;font-weight:var(--almatar-font-weight-regular)}.package-item__room-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583}\n"] }]
47
+ }] });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQTBCL0MsTUFBTSxPQUFPLG1EQUFtRDtJQVhoRTtRQVlXLFlBQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF3QyxDQUFDO1FBQ2pFLGlCQUFZLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXJDLGtCQUFhLEdBQUcsTUFBTSxFQUFVLENBQUM7UUFFakMsaUJBQVksR0FBRyxRQUFRLENBQXdCLEdBQUcsRUFBRTtZQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztZQUV4RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6Qiw4RUFBOEU7Z0JBQzlFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sR0FBRyxHQUFHLEdBQUcsaUJBQWlCLE1BQU0sU0FBUyxFQUFFLENBQUM7Z0JBRWxELElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDO29CQUNqQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2QsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTt3QkFDaEIsR0FBRzt3QkFDSCxpQkFBaUI7d0JBQ2pCLFNBQVM7d0JBQ1QsS0FBSyxFQUFFLENBQUM7d0JBQ1IsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO3FCQUNkLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztLQVFKO0lBTkMsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQzsrR0F2Q1UsbURBQW1EO21HQUFuRCxtREFBbUQsOGFDakNoRSxvdEVBNEVBLDhxRURuRFksWUFBWTs7NEZBUVgsbURBQW1EO2tCQVgvRCxTQUFTOytCQUNFLGlEQUFpRCxjQUMvQyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBTU4sdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIGNvbXB1dGVkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG4vLyBUcmFuc2xhdGlvbiBtb2R1bGUgcmVtb3ZlZCAtIHVzaW5nIEVuZ2xpc2ggb25seVxuaW1wb3J0IHtcbiAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25QYWNrYWdlLFxuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblBhY2thZ2VSb29tLFxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2ktYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5pbnRlcmZhY2UnO1xuXG5pbnRlcmZhY2UgSUdyb3VwZWRQYWNrYWdlUm9vbSB7XG4gIGtleTogc3RyaW5nO1xuICBiZWRUeXBlT3JSb29tVHlwZTogc3RyaW5nO1xuICByb29tQmFzaXM6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAgcm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVJvb21bXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6XG4gICAgJy4vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmRhYmxlLXJvb20uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZGFibGUtcm9vbS5jb21wb25lbnQuc2NzcycsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kYWJsZVJvb21Db21wb25lbnQge1xuICByZWFkb25seSBwYWNrYWdlID0gaW5wdXQucmVxdWlyZWQ8SUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25QYWNrYWdlPigpO1xuICByZWFkb25seSBoaWRlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgdG9nZ2xlUGFja2FnZSA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgZ3JvdXBlZFJvb21zID0gY29tcHV0ZWQ8SUdyb3VwZWRQYWNrYWdlUm9vbVtdPigoKSA9PiB7XG4gICAgY29uc3Qgcm9vbXMgPSB0aGlzLnBhY2thZ2UoKT8ucm9vbXMgfHwgW107XG4gICAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwPHN0cmluZywgSUdyb3VwZWRQYWNrYWdlUm9vbT4oKTtcblxuICAgIGZvciAoY29uc3Qgcm9vbSBvZiByb29tcykge1xuICAgICAgLy8gY29uc3QgYmVkVHlwZU9yUm9vbVR5cGUgPSByYXdCZWRUeXBlIHx8IHJhd1Jvb21UeXBlIHx8IHJvb20ucm9vbU5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBiZWRUeXBlT3JSb29tVHlwZSA9IHJvb20/LnJvb21OYW1lO1xuICAgICAgY29uc3Qgcm9vbUJhc2lzID0gcm9vbS5yb29tQmFzaXMgfHwgJyc7XG4gICAgICBjb25zdCBrZXkgPSBgJHtiZWRUeXBlT3JSb29tVHlwZX18fHwke3Jvb21CYXNpc31gO1xuXG4gICAgICBpZiAoZ3JvdXBNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cE1hcC5nZXQoa2V5KSE7XG4gICAgICAgIGdyb3VwLmNvdW50Kys7XG4gICAgICAgIGdyb3VwLnJvb21zLnB1c2gocm9vbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncm91cE1hcC5zZXQoa2V5LCB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGJlZFR5cGVPclJvb21UeXBlLFxuICAgICAgICAgIHJvb21CYXNpcyxcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICByb29tczogW3Jvb21dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC52YWx1ZXMoKSk7XG4gIH0pO1xuXG4gIG9uVG9nZ2xlUGFja2FnZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oaWRlQ2hlY2tib3goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZVBhY2thZ2UuZW1pdCh0aGlzLnBhY2thZ2UoKT8ucGFja2FnZUlkKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInBhY2thZ2UtaXRlbVwiXG4gIFtjbGFzcy5wYWNrYWdlLWl0ZW0tLXNlbGVjdGVkXT1cInBhY2thZ2UoKS5pc1NlbGVjdGVkXCJcbiAgKGNsaWNrKT1cIm9uVG9nZ2xlUGFja2FnZSgpXCJcbj5cbiAgPGRpdiBjbGFzcz1cInBhY2thZ2UtaXRlbV9faGVhZGVyXCI+XG4gICAgQGlmICghaGlkZUNoZWNrYm94KCkpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX2NoZWNrYm94XCJcbiAgICAgICAgW2NsYXNzLnBhY2thZ2UtaXRlbV9fY2hlY2tib3gtLWNoZWNrZWRdPVwicGFja2FnZSgpLmlzU2VsZWN0ZWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvblRvZ2dsZVBhY2thZ2UoKVwiXG4gICAgICA+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICBjbGFzcz1cInBhY2thZ2UtaXRlbV9fY2hlY2tib3gtaWNvblwiXG4gICAgICAgICAgd2lkdGg9XCIxNFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTRcIlxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTQgMTRcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIgN0w1LjUgMTAuNUwxMiAzLjVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwid2hpdGVcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX2NvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX2luZm9cIj5cbiAgICAgICAgPGg0IGNsYXNzPVwicGFja2FnZS1pdGVtX19uYW1lXCI+e3sgcGFja2FnZSgpLnBhY2thZ2VOYW1lIH19PC9oND5cbiAgICAgICAgQGlmIChwYWNrYWdlKCkuYm9hcmRCYXNpcykge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFja2FnZS1pdGVtX19ib2FyZC1iYXNpc1wiPnt7XG4gICAgICAgICAgICBwYWNrYWdlKCkuYm9hcmRCYXNpc1xuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX3JlZnVuZC1iYWRnZSBwYWNrYWdlLWl0ZW1fX3JlZnVuZC1iYWRnZS0tcmVmdW5kYWJsZVwiXG4gICAgICA+XG4gICAgICAgIFJFRlVOREFCTEVcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChncm91cGVkUm9vbXMoKS5sZW5ndGgpIHtcbiAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1pdGVtX19yb29tc1wiPlxuICAgICAgQGZvciAoZ3JvdXAgb2YgZ3JvdXBlZFJvb21zKCk7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX3Jvb21cIj5cbiAgICAgICAgICA8aDUgY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX3Jvb20tbmFtZVwiPlxuICAgICAgICAgICAgQGlmIChncm91cC5jb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAge3sgZ3JvdXAuY291bnQgfX14XG4gICAgICAgICAgICAgIEBpZiAoZ3JvdXAuYmVkVHlwZU9yUm9vbVR5cGUpIHtcbiAgICAgICAgICAgICAgICB7eyBncm91cC5iZWRUeXBlT3JSb29tVHlwZSB9fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgUm9vbVxuICAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICAgICBAaWYgKGdyb3VwLmJlZFR5cGVPclJvb21UeXBlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX3NlcGFyYXRvclwiPuKAojwvc3Bhbj5cbiAgICAgICAgICAgICAgICB7eyBncm91cC5iZWRUeXBlT3JSb29tVHlwZSB9fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9oNT5cbiAgICAgICAgICBAaWYgKGdyb3VwLnJvb21CYXNpcykge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWl0ZW1fX3Jvb20tYmFzaXNcIj57eyBncm91cC5yb29tQmFzaXMgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,129 @@
1
+ import { Component, input, output, signal } from '@angular/core';
2
+ import { LowerCasePipe, NgIf } from '@angular/common';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { DialogModule } from 'primeng/dialog';
5
+ import { SbdHotelItineraryCardComponent } from '../../../hotel-itinerary-card/hotel-itinerary-card.component';
6
+ import { SbdDataSearchComponent } from '../../../data-search/data-search.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "primeng/button";
9
+ import * as i2 from "primeng/dialog";
10
+ export class SbdHotelContentComponent {
11
+ constructor() {
12
+ // Inputs
13
+ this.bookingData = input.required();
14
+ this.bookingStatus = input.required();
15
+ this.bookingId = input.required();
16
+ this.dataVerified = input.required();
17
+ this.bookingNotes = input.required();
18
+ this.bookingHistory = input.required();
19
+ this.historyGroups = input.required();
20
+ this.activeContextTab = input.required();
21
+ // Outputs
22
+ this.cancelBooking = output();
23
+ this.addNoteRequested = output();
24
+ this.contextTabChanged = output();
25
+ // Dialog state
26
+ this.detailDialogVisible = signal(false);
27
+ this.selectedDetail = signal(null);
28
+ }
29
+ fmtNoteDate(date) {
30
+ if (!date?.sec)
31
+ return '—';
32
+ try {
33
+ return new Date(date.sec * 1000).toLocaleString('en-GB', {
34
+ day: '2-digit', month: 'short', year: 'numeric',
35
+ hour: '2-digit', minute: '2-digit',
36
+ });
37
+ }
38
+ catch {
39
+ return '—';
40
+ }
41
+ }
42
+ formatField(field) {
43
+ return field
44
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
45
+ .replace(/([a-z\d])([A-Z])/g, '$1 $2')
46
+ .trim();
47
+ }
48
+ fmtDate(dt) {
49
+ if (!dt)
50
+ return '—';
51
+ try {
52
+ return new Date(dt).toLocaleString('en-GB', {
53
+ day: '2-digit', month: 'short', hour: '2-digit', minute: '2-digit',
54
+ });
55
+ }
56
+ catch {
57
+ return dt;
58
+ }
59
+ }
60
+ onCancelBooking() {
61
+ this.cancelBooking.emit();
62
+ }
63
+ onAddNote() {
64
+ this.addNoteRequested.emit();
65
+ }
66
+ onTabChange(tab) {
67
+ this.contextTabChanged.emit(tab);
68
+ }
69
+ formatDate(date) {
70
+ if (!date)
71
+ return '—';
72
+ try {
73
+ return new Date(date).toLocaleDateString('en-GB', {
74
+ day: '2-digit',
75
+ month: 'short',
76
+ year: 'numeric',
77
+ });
78
+ }
79
+ catch {
80
+ return date;
81
+ }
82
+ }
83
+ formatPrice(price) {
84
+ if (!price)
85
+ return '—';
86
+ return new Intl.NumberFormat('en-US', {
87
+ style: 'currency',
88
+ currency: 'SAR',
89
+ minimumFractionDigits: 2,
90
+ }).format(price);
91
+ }
92
+ showDetailDialog(title, data, type) {
93
+ this.selectedDetail.set({ title, data, type });
94
+ this.detailDialogVisible.set(true);
95
+ }
96
+ closeDetailDialog() {
97
+ this.detailDialogVisible.set(false);
98
+ this.selectedDetail.set(null);
99
+ }
100
+ showPackagesDetail() {
101
+ const packages = this.bookingData()?.packages;
102
+ if (packages && packages.length > 0) {
103
+ this.showDetailDialog('Room Packages', packages, 'packages');
104
+ }
105
+ }
106
+ formatDetailValue(value) {
107
+ if (value === null || value === undefined)
108
+ return '—';
109
+ if (typeof value === 'boolean')
110
+ return value ? 'Yes' : 'No';
111
+ if (typeof value === 'object')
112
+ return JSON.stringify(value, null, 2);
113
+ return String(value);
114
+ }
115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdHotelContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdHotelContentComponent, isStandalone: true, selector: "app-sbd-hotel-content", inputs: { bookingData: { classPropertyName: "bookingData", publicName: "bookingData", isSignal: true, isRequired: true, transformFunction: null }, bookingStatus: { classPropertyName: "bookingStatus", publicName: "bookingStatus", isSignal: true, isRequired: true, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: true, transformFunction: null }, dataVerified: { classPropertyName: "dataVerified", publicName: "dataVerified", isSignal: true, isRequired: true, transformFunction: null }, bookingNotes: { classPropertyName: "bookingNotes", publicName: "bookingNotes", isSignal: true, isRequired: true, transformFunction: null }, bookingHistory: { classPropertyName: "bookingHistory", publicName: "bookingHistory", isSignal: true, isRequired: true, transformFunction: null }, historyGroups: { classPropertyName: "historyGroups", publicName: "historyGroups", isSignal: true, isRequired: true, transformFunction: null }, activeContextTab: { classPropertyName: "activeContextTab", publicName: "activeContextTab", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { cancelBooking: "cancelBooking", addNoteRequested: "addNoteRequested", contextTabChanged: "contextTabChanged" }, ngImport: i0, template: "<!-- 2-column layout for hotels -->\n<div class=\"sbd-hotel-content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-hotel-content__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-hotel-itinerary-card [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-hotel-content__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-hotel-content__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-hotel-content__quick-actions\">\n <span class=\"sbd-hotel-content__quick-label\">Quick actions</span>\n <button\n pButton\n label=\"Cancel Booking\"\n icon=\"pi pi-times-circle\"\n class=\"p-button-danger p-button-sm\"\n (click)=\"onCancelBooking()\">\n </button>\n </div>\n\n <!-- Modern Data Overview Cards -->\n <div class=\"sbd-hotel-content__data-overview\">\n <h3 class=\"sbd-hotel-content__section-title\">Booking Overview</h3>\n\n <div class=\"sbd-hotel-content__data-grid\">\n <!-- Booking ID Card -->\n @if (bookingData()?.bookingId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--blue\">\n <i class=\"pi pi-bookmark\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Booking ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.bookingId }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel Name Card -->\n @if (bookingData()?.hotelName) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--purple\">\n <i class=\"pi pi-building\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelName }}</span>\n </div>\n </div>\n }\n\n <!-- Check-in Date Card -->\n @if (bookingData()?.dateFrom) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--green\">\n <i class=\"pi pi-calendar-plus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-in</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateFrom) }}</span>\n @if (bookingData()?.checkInTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkInTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Check-out Date Card -->\n @if (bookingData()?.dateTo) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--orange\">\n <i class=\"pi pi-calendar-minus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-out</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateTo) }}</span>\n @if (bookingData()?.checkOutTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkOutTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Number of Nights Card -->\n @if (bookingData()?.numberOfNights) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--indigo\">\n <i class=\"pi pi-moon\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Duration</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.numberOfNights }} Nights</span>\n </div>\n </div>\n }\n\n <!-- Number of Rooms Card -->\n @if (bookingData()?.rooms) {\n <div class=\"sbd-hotel-content__data-card sbd-hotel-content__data-card--clickable\" (click)=\"showPackagesDetail()\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--pink\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Rooms</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.rooms }} Room{{ bookingData()?.rooms > 1 ? 's' : '' }}</span>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <span class=\"sbd-hotel-content__data-subtext\">Click for details</span>\n }\n </div>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <i class=\"pi pi-chevron-right sbd-hotel-content__data-arrow\"></i>\n }\n </div>\n }\n\n <!-- Price Card -->\n @if (bookingData()?.price) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--emerald\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Total Price</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatPrice(bookingData()?.price) }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel ID Card -->\n @if (bookingData()?.hotelId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--teal\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelId }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-hotel-content__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-hotel-content__context-tabs\">\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"onTabChange('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"onTabChange('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__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-hotel-content__context-add\"\n (click)=\"onAddNote()\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-hotel-content__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-hotel-content__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-hotel-content__note\">\n <div class=\"sbd-hotel-content__note-top\">\n <span class=\"sbd-hotel-content__note-badge sbd-hotel-content__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-hotel-content__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-hotel-content__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-hotel-content__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-hotel-content__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-hotel-content__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-hotel-content__changes-group\">\n <div class=\"sbd-hotel-content__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-hotel-content__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-hotel-content__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-hotel-content__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-hotel-content__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-hotel-content__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-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n</div>\n\n<!-- Detail Dialog -->\n<p-dialog\n [(visible)]=\"detailDialogVisible\"\n [header]=\"selectedDetail()?.title || 'Details'\"\n [modal]=\"true\"\n [style]=\"{ width: '600px', maxWidth: '90vw' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n styleClass=\"sbd-hotel-content__detail-dialog\">\n\n @if (selectedDetail()?.type === 'packages' && selectedDetail()?.data) {\n <div class=\"sbd-hotel-content__packages-detail\">\n @for (pkg of selectedDetail()?.data; track $index) {\n <div class=\"sbd-hotel-content__package-card\">\n <div class=\"sbd-hotel-content__package-header\">\n <span class=\"sbd-hotel-content__package-title\">Package {{ $index + 1 }}</span>\n @if (pkg.isRefundable) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--success\">Refundable</span>\n } @else {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--danger\">Non-Refundable</span>\n }\n </div>\n\n @if (pkg.supplier) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Supplier</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.supplier }}</span>\n </div>\n }\n\n @if (pkg.rooms && pkg.rooms.length > 0) {\n <div class=\"sbd-hotel-content__rooms-section\">\n <h4 class=\"sbd-hotel-content__subsection-title\">Rooms ({{ pkg.rooms.length }})</h4>\n @for (room of pkg.rooms; track room.roomId || $index) {\n <div class=\"sbd-hotel-content__room-item\">\n <div class=\"sbd-hotel-content__room-icon\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__room-details\">\n @if (room.roomName) {\n <div class=\"sbd-hotel-content__room-name\">{{ room.roomName }}</div>\n }\n <div class=\"sbd-hotel-content__room-info\">\n @if (room.roomType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomType }}</span>\n }\n @if (room.roomBasis) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomBasis }}</span>\n }\n @if (room.bedType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.bedType }}</span>\n }\n </div>\n @if (room.adultsNum || room.childrenNum) {\n <div class=\"sbd-hotel-content__room-occupancy\">\n @if (room.adultsNum) {\n <span><i class=\"pi pi-user\"></i> {{ room.adultsNum }} Adult{{ room.adultsNum > 1 ? 's' : '' }}</span>\n }\n @if (room.childrenNum) {\n <span><i class=\"pi pi-users\"></i> {{ room.childrenNum }} Child{{ room.childrenNum > 1 ? 'ren' : '' }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (pkg.refundableUntil) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Refundable Until</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.refundableUntil }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</p-dialog>\n", styles: [".sbd-hotel-content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-hotel-content{grid-template-columns:1fr}}.sbd-hotel-content__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-hotel-content__error i{font-size:18px}.sbd-hotel-content__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-hotel-content__main{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__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-hotel-content__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-hotel-content__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-hotel-content__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-hotel-content__context-add{margin-left:auto;margin-right:10px}.sbd-hotel-content__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-hotel-content__context-tab .pi{font-size:13px}.sbd-hotel-content__context-tab:hover{color:#334155}.sbd-hotel-content__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-hotel-content__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-hotel-content__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-hotel-content__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-hotel-content__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-hotel-content__context-empty .pi{font-size:16px}.sbd-hotel-content__notes-list{display:flex;flex-direction:column}.sbd-hotel-content__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__note:last-child{border-bottom:none}.sbd-hotel-content__note-top{display:flex;align-items:center;gap:8px}.sbd-hotel-content__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-hotel-content__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-hotel-content__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-hotel-content__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-hotel-content__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-hotel-content__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-hotel-content__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-hotel-content__changes-groups{display:flex;flex-direction:column}.sbd-hotel-content__changes-group{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-group:last-child{border-bottom:none}.sbd-hotel-content__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-hotel-content__changes-meta strong{font-weight:700;color:#334155}.sbd-hotel-content__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-hotel-content__changes-sep{color:#cbd5e1}.sbd-hotel-content__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-hotel-content__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__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-hotel-content__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-hotel-content__changes-table thead th:nth-child(2){color:#dc2626}.sbd-hotel-content__changes-table thead th:nth-child(3){color:#16a34a}.sbd-hotel-content__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-table tbody tr:last-child{border-bottom:none}.sbd-hotel-content__changes-table tbody tr:hover{background:#f8fafc}.sbd-hotel-content__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-hotel-content__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-hotel-content__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-hotel-content__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-hotel-content__data-overview{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px}.sbd-hotel-content__section-title{margin:0 0 16px;font-size:15px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.sbd-hotel-content__data-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}@media (max-width: 768px){.sbd-hotel-content__data-grid{grid-template-columns:1fr}}.sbd-hotel-content__data-card{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;transition:all .2s ease}.sbd-hotel-content__data-card:hover{background:#fff;border-color:#cbd5e1;box-shadow:0 2px 8px #0000000a;transform:translateY(-1px)}.sbd-hotel-content__data-card--clickable{cursor:pointer}.sbd-hotel-content__data-card--clickable:hover{background:#fff;border-color:#3b82f6;box-shadow:0 4px 12px #3b82f626;transform:translateY(-2px)}.sbd-hotel-content__data-arrow{color:#94a3b8;font-size:14px;margin-left:auto;align-self:center;transition:transform .2s ease}.sbd-hotel-content__data-card--clickable:hover .sbd-hotel-content__data-arrow{transform:translate(3px);color:#3b82f6}.sbd-hotel-content__data-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;flex-shrink:0}.sbd-hotel-content__data-icon i{font-size:18px;color:#fff}.sbd-hotel-content__data-icon--blue{background:linear-gradient(135deg,#3b82f6,#2563eb)}.sbd-hotel-content__data-icon--purple{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.sbd-hotel-content__data-icon--green{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--orange{background:linear-gradient(135deg,#f59e0b,#d97706)}.sbd-hotel-content__data-icon--indigo{background:linear-gradient(135deg,#6366f1,#4f46e5)}.sbd-hotel-content__data-icon--pink{background:linear-gradient(135deg,#ec4899,#db2777)}.sbd-hotel-content__data-icon--emerald{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--teal{background:linear-gradient(135deg,#14b8a6,#0d9488)}.sbd-hotel-content__data-content{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.sbd-hotel-content__data-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.sbd-hotel-content__data-value{font-size:14px;font-weight:700;color:#1e293b;word-break:break-word}.sbd-hotel-content__data-subtext{font-size:11px;color:#94a3b8;margin-top:2px}.sbd-hotel-content__packages-detail{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__package-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__package-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__package-title{font-size:15px;font-weight:700;color:#1e293b}.sbd-hotel-content__badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:6px}.sbd-hotel-content__badge--success{background:#dcfce7;color:#16a34a}.sbd-hotel-content__badge--danger{background:#fee2e2;color:#dc2626}.sbd-hotel-content__package-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}.sbd-hotel-content__package-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__package-value{font-size:13px;font-weight:600;color:#1e293b}.sbd-hotel-content__rooms-section{margin-top:8px}.sbd-hotel-content__subsection-title{font-size:13px;font-weight:700;color:#475569;margin:0 0 12px;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__room-item{display:flex;align-items:flex-start;gap:12px;padding:12px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px}.sbd-hotel-content__room-item:last-child{margin-bottom:0}.sbd-hotel-content__room-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ec4899,#db2777);border-radius:8px;flex-shrink:0}.sbd-hotel-content__room-icon i{font-size:16px;color:#fff}.sbd-hotel-content__room-details{flex:1;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__room-name{font-size:14px;font-weight:700;color:#1e293b}.sbd-hotel-content__room-info{display:flex;flex-wrap:wrap;gap:6px}.sbd-hotel-content__room-tag{font-size:11px;font-weight:600;padding:3px 8px;background:#e0e7ff;color:#4f46e5;border-radius:4px}.sbd-hotel-content__room-occupancy{display:flex;gap:12px;font-size:12px;color:#64748b}.sbd-hotel-content__room-occupancy span{display:flex;align-items:center;gap:4px}.sbd-hotel-content__room-occupancy span i{font-size:11px}.sbd-hotel-content__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}\n"], dependencies: [{ kind: "component", type: SbdHotelItineraryCardComponent, selector: "app-sbd-hotel-itinerary-card", inputs: ["data", "verified"] }, { kind: "component", type: SbdDataSearchComponent, selector: "app-sbd-data-search", inputs: ["data"] }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] }); }
117
+ }
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdHotelContentComponent, decorators: [{
119
+ type: Component,
120
+ args: [{ selector: 'app-sbd-hotel-content', standalone: true, imports: [
121
+ SbdHotelItineraryCardComponent,
122
+ SbdDataSearchComponent,
123
+ LowerCasePipe,
124
+ NgIf,
125
+ ButtonModule,
126
+ DialogModule,
127
+ ], template: "<!-- 2-column layout for hotels -->\n<div class=\"sbd-hotel-content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-hotel-content__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-hotel-itinerary-card [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-hotel-content__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-hotel-content__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-hotel-content__quick-actions\">\n <span class=\"sbd-hotel-content__quick-label\">Quick actions</span>\n <button\n pButton\n label=\"Cancel Booking\"\n icon=\"pi pi-times-circle\"\n class=\"p-button-danger p-button-sm\"\n (click)=\"onCancelBooking()\">\n </button>\n </div>\n\n <!-- Modern Data Overview Cards -->\n <div class=\"sbd-hotel-content__data-overview\">\n <h3 class=\"sbd-hotel-content__section-title\">Booking Overview</h3>\n\n <div class=\"sbd-hotel-content__data-grid\">\n <!-- Booking ID Card -->\n @if (bookingData()?.bookingId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--blue\">\n <i class=\"pi pi-bookmark\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Booking ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.bookingId }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel Name Card -->\n @if (bookingData()?.hotelName) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--purple\">\n <i class=\"pi pi-building\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelName }}</span>\n </div>\n </div>\n }\n\n <!-- Check-in Date Card -->\n @if (bookingData()?.dateFrom) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--green\">\n <i class=\"pi pi-calendar-plus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-in</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateFrom) }}</span>\n @if (bookingData()?.checkInTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkInTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Check-out Date Card -->\n @if (bookingData()?.dateTo) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--orange\">\n <i class=\"pi pi-calendar-minus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-out</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateTo) }}</span>\n @if (bookingData()?.checkOutTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkOutTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Number of Nights Card -->\n @if (bookingData()?.numberOfNights) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--indigo\">\n <i class=\"pi pi-moon\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Duration</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.numberOfNights }} Nights</span>\n </div>\n </div>\n }\n\n <!-- Number of Rooms Card -->\n @if (bookingData()?.rooms) {\n <div class=\"sbd-hotel-content__data-card sbd-hotel-content__data-card--clickable\" (click)=\"showPackagesDetail()\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--pink\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Rooms</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.rooms }} Room{{ bookingData()?.rooms > 1 ? 's' : '' }}</span>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <span class=\"sbd-hotel-content__data-subtext\">Click for details</span>\n }\n </div>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <i class=\"pi pi-chevron-right sbd-hotel-content__data-arrow\"></i>\n }\n </div>\n }\n\n <!-- Price Card -->\n @if (bookingData()?.price) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--emerald\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Total Price</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatPrice(bookingData()?.price) }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel ID Card -->\n @if (bookingData()?.hotelId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--teal\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelId }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-hotel-content__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-hotel-content__context-tabs\">\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"onTabChange('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"onTabChange('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__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-hotel-content__context-add\"\n (click)=\"onAddNote()\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-hotel-content__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-hotel-content__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-hotel-content__note\">\n <div class=\"sbd-hotel-content__note-top\">\n <span class=\"sbd-hotel-content__note-badge sbd-hotel-content__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-hotel-content__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-hotel-content__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-hotel-content__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-hotel-content__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-hotel-content__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-hotel-content__changes-group\">\n <div class=\"sbd-hotel-content__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-hotel-content__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-hotel-content__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-hotel-content__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-hotel-content__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-hotel-content__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-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n</div>\n\n<!-- Detail Dialog -->\n<p-dialog\n [(visible)]=\"detailDialogVisible\"\n [header]=\"selectedDetail()?.title || 'Details'\"\n [modal]=\"true\"\n [style]=\"{ width: '600px', maxWidth: '90vw' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n styleClass=\"sbd-hotel-content__detail-dialog\">\n\n @if (selectedDetail()?.type === 'packages' && selectedDetail()?.data) {\n <div class=\"sbd-hotel-content__packages-detail\">\n @for (pkg of selectedDetail()?.data; track $index) {\n <div class=\"sbd-hotel-content__package-card\">\n <div class=\"sbd-hotel-content__package-header\">\n <span class=\"sbd-hotel-content__package-title\">Package {{ $index + 1 }}</span>\n @if (pkg.isRefundable) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--success\">Refundable</span>\n } @else {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--danger\">Non-Refundable</span>\n }\n </div>\n\n @if (pkg.supplier) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Supplier</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.supplier }}</span>\n </div>\n }\n\n @if (pkg.rooms && pkg.rooms.length > 0) {\n <div class=\"sbd-hotel-content__rooms-section\">\n <h4 class=\"sbd-hotel-content__subsection-title\">Rooms ({{ pkg.rooms.length }})</h4>\n @for (room of pkg.rooms; track room.roomId || $index) {\n <div class=\"sbd-hotel-content__room-item\">\n <div class=\"sbd-hotel-content__room-icon\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__room-details\">\n @if (room.roomName) {\n <div class=\"sbd-hotel-content__room-name\">{{ room.roomName }}</div>\n }\n <div class=\"sbd-hotel-content__room-info\">\n @if (room.roomType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomType }}</span>\n }\n @if (room.roomBasis) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomBasis }}</span>\n }\n @if (room.bedType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.bedType }}</span>\n }\n </div>\n @if (room.adultsNum || room.childrenNum) {\n <div class=\"sbd-hotel-content__room-occupancy\">\n @if (room.adultsNum) {\n <span><i class=\"pi pi-user\"></i> {{ room.adultsNum }} Adult{{ room.adultsNum > 1 ? 's' : '' }}</span>\n }\n @if (room.childrenNum) {\n <span><i class=\"pi pi-users\"></i> {{ room.childrenNum }} Child{{ room.childrenNum > 1 ? 'ren' : '' }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (pkg.refundableUntil) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Refundable Until</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.refundableUntil }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</p-dialog>\n", styles: [".sbd-hotel-content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-hotel-content{grid-template-columns:1fr}}.sbd-hotel-content__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-hotel-content__error i{font-size:18px}.sbd-hotel-content__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-hotel-content__main{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__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-hotel-content__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-hotel-content__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-hotel-content__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-hotel-content__context-add{margin-left:auto;margin-right:10px}.sbd-hotel-content__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-hotel-content__context-tab .pi{font-size:13px}.sbd-hotel-content__context-tab:hover{color:#334155}.sbd-hotel-content__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-hotel-content__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-hotel-content__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-hotel-content__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-hotel-content__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-hotel-content__context-empty .pi{font-size:16px}.sbd-hotel-content__notes-list{display:flex;flex-direction:column}.sbd-hotel-content__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__note:last-child{border-bottom:none}.sbd-hotel-content__note-top{display:flex;align-items:center;gap:8px}.sbd-hotel-content__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-hotel-content__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-hotel-content__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-hotel-content__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-hotel-content__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-hotel-content__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-hotel-content__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-hotel-content__changes-groups{display:flex;flex-direction:column}.sbd-hotel-content__changes-group{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-group:last-child{border-bottom:none}.sbd-hotel-content__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-hotel-content__changes-meta strong{font-weight:700;color:#334155}.sbd-hotel-content__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-hotel-content__changes-sep{color:#cbd5e1}.sbd-hotel-content__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-hotel-content__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__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-hotel-content__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-hotel-content__changes-table thead th:nth-child(2){color:#dc2626}.sbd-hotel-content__changes-table thead th:nth-child(3){color:#16a34a}.sbd-hotel-content__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-table tbody tr:last-child{border-bottom:none}.sbd-hotel-content__changes-table tbody tr:hover{background:#f8fafc}.sbd-hotel-content__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-hotel-content__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-hotel-content__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-hotel-content__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-hotel-content__data-overview{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px}.sbd-hotel-content__section-title{margin:0 0 16px;font-size:15px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.sbd-hotel-content__data-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}@media (max-width: 768px){.sbd-hotel-content__data-grid{grid-template-columns:1fr}}.sbd-hotel-content__data-card{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;transition:all .2s ease}.sbd-hotel-content__data-card:hover{background:#fff;border-color:#cbd5e1;box-shadow:0 2px 8px #0000000a;transform:translateY(-1px)}.sbd-hotel-content__data-card--clickable{cursor:pointer}.sbd-hotel-content__data-card--clickable:hover{background:#fff;border-color:#3b82f6;box-shadow:0 4px 12px #3b82f626;transform:translateY(-2px)}.sbd-hotel-content__data-arrow{color:#94a3b8;font-size:14px;margin-left:auto;align-self:center;transition:transform .2s ease}.sbd-hotel-content__data-card--clickable:hover .sbd-hotel-content__data-arrow{transform:translate(3px);color:#3b82f6}.sbd-hotel-content__data-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;flex-shrink:0}.sbd-hotel-content__data-icon i{font-size:18px;color:#fff}.sbd-hotel-content__data-icon--blue{background:linear-gradient(135deg,#3b82f6,#2563eb)}.sbd-hotel-content__data-icon--purple{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.sbd-hotel-content__data-icon--green{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--orange{background:linear-gradient(135deg,#f59e0b,#d97706)}.sbd-hotel-content__data-icon--indigo{background:linear-gradient(135deg,#6366f1,#4f46e5)}.sbd-hotel-content__data-icon--pink{background:linear-gradient(135deg,#ec4899,#db2777)}.sbd-hotel-content__data-icon--emerald{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--teal{background:linear-gradient(135deg,#14b8a6,#0d9488)}.sbd-hotel-content__data-content{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.sbd-hotel-content__data-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.sbd-hotel-content__data-value{font-size:14px;font-weight:700;color:#1e293b;word-break:break-word}.sbd-hotel-content__data-subtext{font-size:11px;color:#94a3b8;margin-top:2px}.sbd-hotel-content__packages-detail{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__package-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__package-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__package-title{font-size:15px;font-weight:700;color:#1e293b}.sbd-hotel-content__badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:6px}.sbd-hotel-content__badge--success{background:#dcfce7;color:#16a34a}.sbd-hotel-content__badge--danger{background:#fee2e2;color:#dc2626}.sbd-hotel-content__package-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}.sbd-hotel-content__package-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__package-value{font-size:13px;font-weight:600;color:#1e293b}.sbd-hotel-content__rooms-section{margin-top:8px}.sbd-hotel-content__subsection-title{font-size:13px;font-weight:700;color:#475569;margin:0 0 12px;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__room-item{display:flex;align-items:flex-start;gap:12px;padding:12px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px}.sbd-hotel-content__room-item:last-child{margin-bottom:0}.sbd-hotel-content__room-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ec4899,#db2777);border-radius:8px;flex-shrink:0}.sbd-hotel-content__room-icon i{font-size:16px;color:#fff}.sbd-hotel-content__room-details{flex:1;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__room-name{font-size:14px;font-weight:700;color:#1e293b}.sbd-hotel-content__room-info{display:flex;flex-wrap:wrap;gap:6px}.sbd-hotel-content__room-tag{font-size:11px;font-weight:600;padding:3px 8px;background:#e0e7ff;color:#4f46e5;border-radius:4px}.sbd-hotel-content__room-occupancy{display:flex;gap:12px;font-size:12px;color:#64748b}.sbd-hotel-content__room-occupancy span{display:flex;align-items:center;gap:4px}.sbd-hotel-content__room-occupancy span i{font-size:11px}.sbd-hotel-content__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}\n"] }]
128
+ }] });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2NvbXBvbmVudHMvaG90ZWwtY29udGVudC9ob3RlbC1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvY29tcG9uZW50cy9ob3RlbC1jb250ZW50L2hvdGVsLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDOUcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7QUFnQnBGLE1BQU0sT0FBTyx3QkFBd0I7SUFkckM7UUFlRSxTQUFTO1FBQ1QsZ0JBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUE0QixDQUFDO1FBQ3pELGtCQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNEMsQ0FBQztRQUMzRSxjQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO1FBQ3JDLGlCQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO1FBQ3pDLGlCQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBUyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBUyxDQUFDO1FBQ3pDLGtCQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBUyxDQUFDO1FBQ3hDLHFCQUFnQixHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXVCLENBQUM7UUFFekQsVUFBVTtRQUNWLGtCQUFhLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFDL0IscUJBQWdCLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFDbEMsc0JBQWlCLEdBQUcsTUFBTSxFQUF1QixDQUFDO1FBRWxELGVBQWU7UUFDZix3QkFBbUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsbUJBQWMsR0FBRyxNQUFNLENBQW9ELElBQUksQ0FBQyxDQUFDO0tBcUZsRjtJQW5GQyxXQUFXLENBQUMsSUFBb0M7UUFDOUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZELEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUztnQkFDL0MsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUzthQUNuQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQUMsT0FBTyxHQUFHLENBQUM7UUFBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLEtBQUs7YUFDVCxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxDQUFDO2FBQ3pDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUM7YUFDckMsSUFBSSxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxDQUFDLEVBQVU7UUFDaEIsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTO2FBQ25FLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFBQyxPQUFPLEVBQUUsQ0FBQztRQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBd0I7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXdCO1FBQ2pDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDdEIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hELEdBQUcsRUFBRSxTQUFTO2dCQUNkLEtBQUssRUFBRSxPQUFPO2dCQUNkLElBQUksRUFBRSxTQUFTO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQXlCO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDdkIsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFO1lBQ3BDLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YscUJBQXFCLEVBQUUsQ0FBQztTQUN6QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQVk7UUFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLENBQUM7UUFDOUMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQVU7UUFDMUIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7K0dBdEdVLHdCQUF3QjttR0FBeEIsd0JBQXdCLG8wQ0N2QnJDLHkwZkF5V0Esb3JURDVWSSw4QkFBOEIsdUdBQzlCLHNCQUFzQiw2RUFDdEIsYUFBYSxpREFFYixZQUFZLHNLQUNaLFlBQVk7OzRGQUtILHdCQUF3QjtrQkFkcEMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxXQUNQO3dCQUNQLDhCQUE4Qjt3QkFDOUIsc0JBQXNCO3dCQUN0QixhQUFhO3dCQUNiLElBQUk7d0JBQ0osWUFBWTt3QkFDWixZQUFZO3FCQUNiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvd2VyQ2FzZVBpcGUsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xuXG5pbXBvcnQgeyBJSG90ZWxCb29raW5nRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9ib29raW5nLnR5cGVzJztcbmltcG9ydCB7IFNiZEhvdGVsSXRpbmVyYXJ5Q2FyZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2hvdGVsLWl0aW5lcmFyeS1jYXJkL2hvdGVsLWl0aW5lcmFyeS1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYmREYXRhU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1zZWFyY2gvZGF0YS1zZWFyY2guY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNiZC1ob3RlbC1jb250ZW50JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFNiZEhvdGVsSXRpbmVyYXJ5Q2FyZENvbXBvbmVudCxcbiAgICBTYmREYXRhU2VhcmNoQ29tcG9uZW50LFxuICAgIExvd2VyQ2FzZVBpcGUsXG4gICAgTmdJZixcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgRGlhbG9nTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vaG90ZWwtY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ob3RlbC1jb250ZW50LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU2JkSG90ZWxDb250ZW50Q29tcG9uZW50IHtcbiAgLy8gSW5wdXRzXG4gIGJvb2tpbmdEYXRhID0gaW5wdXQucmVxdWlyZWQ8SUhvdGVsQm9va2luZ0RhdGEgfCBudWxsPigpO1xuICBib29raW5nU3RhdHVzID0gaW5wdXQucmVxdWlyZWQ8J2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3N1Y2Nlc3MnIHwgJ2Vycm9yJz4oKTtcbiAgYm9va2luZ0lkID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuICBkYXRhVmVyaWZpZWQgPSBpbnB1dC5yZXF1aXJlZDxib29sZWFuPigpO1xuICBib29raW5nTm90ZXMgPSBpbnB1dC5yZXF1aXJlZDxhbnlbXT4oKTtcbiAgYm9va2luZ0hpc3RvcnkgPSBpbnB1dC5yZXF1aXJlZDxhbnlbXT4oKTtcbiAgaGlzdG9yeUdyb3VwcyA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICBhY3RpdmVDb250ZXh0VGFiID0gaW5wdXQucmVxdWlyZWQ8J25vdGVzJyB8ICdjaGFuZ2VzJz4oKTtcblxuICAvLyBPdXRwdXRzXG4gIGNhbmNlbEJvb2tpbmcgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgYWRkTm90ZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuICBjb250ZXh0VGFiQ2hhbmdlZCA9IG91dHB1dDwnbm90ZXMnIHwgJ2NoYW5nZXMnPigpO1xuXG4gIC8vIERpYWxvZyBzdGF0ZVxuICBkZXRhaWxEaWFsb2dWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgc2VsZWN0ZWREZXRhaWwgPSBzaWduYWw8eyB0aXRsZTogc3RyaW5nOyBkYXRhOiBhbnk7IHR5cGU6IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG5cbiAgZm10Tm90ZURhdGUoZGF0ZTogeyBzZWM6IG51bWJlcjsgdXNlYz86IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGU/LnNlYykgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5zZWMgKiAxMDAwKS50b0xvY2FsZVN0cmluZygnZW4tR0InLCB7XG4gICAgICAgIGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IHJldHVybiAn4oCUJzsgfVxuICB9XG5cbiAgZm9ybWF0RmllbGQoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkXG4gICAgICAucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywgJyQxICQyJylcbiAgICAgIC5yZXBsYWNlKC8oW2EtelxcZF0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuXG4gIGZtdERhdGUoZHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFkdCkgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZHQpLnRvTG9jYWxlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IHJldHVybiBkdDsgfVxuICB9XG5cbiAgb25DYW5jZWxCb29raW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsQm9va2luZy5lbWl0KCk7XG4gIH1cblxuICBvbkFkZE5vdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hZGROb3RlUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYjogJ25vdGVzJyB8ICdjaGFuZ2VzJyk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dFRhYkNoYW5nZWQuZW1pdCh0YWIpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZSkgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFByaWNlKHByaWNlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghcHJpY2UpIHJldHVybiAn4oCUJztcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdlbi1VUycsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3k6ICdTQVInLFxuICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLFxuICAgIH0pLmZvcm1hdChwcmljZSk7XG4gIH1cblxuICBzaG93RGV0YWlsRGlhbG9nKHRpdGxlOiBzdHJpbmcsIGRhdGE6IGFueSwgdHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERldGFpbC5zZXQoeyB0aXRsZSwgZGF0YSwgdHlwZSB9KTtcbiAgICB0aGlzLmRldGFpbERpYWxvZ1Zpc2libGUuc2V0KHRydWUpO1xuICB9XG5cbiAgY2xvc2VEZXRhaWxEaWFsb2coKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxEaWFsb2dWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RlZERldGFpbC5zZXQobnVsbCk7XG4gIH1cblxuICBzaG93UGFja2FnZXNEZXRhaWwoKTogdm9pZCB7XG4gICAgY29uc3QgcGFja2FnZXMgPSB0aGlzLmJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzO1xuICAgIGlmIChwYWNrYWdlcyAmJiBwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNob3dEZXRhaWxEaWFsb2coJ1Jvb20gUGFja2FnZXMnLCBwYWNrYWdlcywgJ3BhY2thZ2VzJyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0RGV0YWlsVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAn4oCUJztcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/ICdZZXMnIDogJ05vJztcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuIiwiPCEtLSAyLWNvbHVtbiBsYXlvdXQgZm9yIGhvdGVscyAtLT5cbjxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudFwiPlxuXG4gIDwhLS0gTGVmdDogYm9va2luZyBjb250ZXh0IC0tPlxuICA8YXNpZGUgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYXNpZGVcIj5cblxuICAgIDwhLS0gRGF0YSBzZWFyY2ggYXQgdGhlIHRvcCBvZiB0aGUgc2lkZWJhciAtLT5cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICA8YXBwLXNiZC1kYXRhLXNlYXJjaCBbZGF0YV09XCJib29raW5nRGF0YSgpXCIgLz5cbiAgICAgIDxhcHAtc2JkLWhvdGVsLWl0aW5lcmFyeS1jYXJkIFtkYXRhXT1cImJvb2tpbmdEYXRhKClcIiBbdmVyaWZpZWRdPVwiZGF0YVZlcmlmaWVkKClcIiAvPlxuICAgIH1cblxuICAgIDwhLS0gTG9hZGluZyBza2VsZXRvbiBmb3IgYXNpZGUgLS0+XG4gICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdsb2FkaW5nJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo2MCVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjQwJVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6ODAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo1MCVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICA8L2FzaWRlPlxuXG4gIDwhLS0gUmlnaHQ6IGFnZW50IHdvcmtzcGFjZSAtLT5cbiAgPG1haW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbWFpblwiPlxuXG4gICAgPCEtLSBFcnJvciBzdGF0ZSAtLT5cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ2Vycm9yJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19lcnJvclwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgPHNwYW4+Qm9va2luZyBub3QgZm91bmQuIERvdWJsZS1jaGVjayB0aGUgSUQgYW5kIHByb2R1Y3QgdHlwZSwgdGhlbiB0cnkgYWdhaW4uPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBDb250ZW50IG9uY2UgbG9hZGVkIC0tPlxuICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnc3VjY2VzcycpIHtcblxuICAgICAgPCEtLSBRdWljayBhY3Rpb25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19xdWljay1hY3Rpb25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3F1aWNrLWxhYmVsXCI+UXVpY2sgYWN0aW9uczwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICBsYWJlbD1cIkNhbmNlbCBCb29raW5nXCJcbiAgICAgICAgICBpY29uPVwicGkgcGktdGltZXMtY2lyY2xlXCJcbiAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbi1zbVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsQm9va2luZygpXCI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9kZXJuIERhdGEgT3ZlcnZpZXcgQ2FyZHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtb3ZlcnZpZXdcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NlY3Rpb24tdGl0bGVcIj5Cb29raW5nIE92ZXJ2aWV3PC9oMz5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtZ3JpZFwiPlxuICAgICAgICAgIDwhLS0gQm9va2luZyBJRCBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uYm9va2luZ0lkKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1ibHVlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ib29rbWFya1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkJvb2tpbmcgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS12YWx1ZVwiPnt7IGJvb2tpbmdEYXRhKCk/LmJvb2tpbmdJZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIEhvdGVsIE5hbWUgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmhvdGVsTmFtZSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tcHVycGxlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1idWlsZGluZ1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkhvdGVsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5ob3RlbE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBDaGVjay1pbiBEYXRlIENhcmQgLS0+XG4gICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5kYXRlRnJvbSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNhbGVuZGFyLXBsdXNcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtbGFiZWxcIj5DaGVjay1pbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3sgZm9ybWF0RGF0ZShib29raW5nRGF0YSgpPy5kYXRlRnJvbSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5jaGVja0luVGltZSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1zdWJ0ZXh0XCI+e3sgYm9va2luZ0RhdGEoKT8uY2hlY2tJblRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gQ2hlY2stb3V0IERhdGUgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmRhdGVUbykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tb3JhbmdlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jYWxlbmRhci1taW51c1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkNoZWNrLW91dDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3sgZm9ybWF0RGF0ZShib29raW5nRGF0YSgpPy5kYXRlVG8pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uY2hlY2tPdXRUaW1lKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXN1YnRleHRcIj57eyBib29raW5nRGF0YSgpPy5jaGVja091dFRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gTnVtYmVyIG9mIE5pZ2h0cyBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8ubnVtYmVyT2ZOaWdodHMpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uIHNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24tLWluZGlnb1wiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktbW9vblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkR1cmF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5udW1iZXJPZk5pZ2h0cyB9fSBOaWdodHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBOdW1iZXIgb2YgUm9vbXMgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnJvb21zKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZCBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkLS1jbGlja2FibGVcIiAoY2xpY2spPVwic2hvd1BhY2thZ2VzRGV0YWlsKClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tcGlua1wiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaG9tZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPlJvb21zPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5yb29tcyB9fSBSb29te3sgYm9va2luZ0RhdGEoKT8ucm9vbXMgPiAxID8gJ3MnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5wYWNrYWdlcyAmJiBib29raW5nRGF0YSgpPy5wYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXN1YnRleHRcIj5DbGljayBmb3IgZGV0YWlsczwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzICYmIGJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtYXJyb3dcIj48L2k+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gUHJpY2UgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnByaWNlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1lbWVyYWxkXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS13YWxsZXRcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtbGFiZWxcIj5Ub3RhbCBQcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3sgZm9ybWF0UHJpY2UoYm9va2luZ0RhdGEoKT8ucHJpY2UpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gSG90ZWwgSUQgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmhvdGVsSWQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uIHNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24tLXRlYWxcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWlkLWNhcmRcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtbGFiZWxcIj5Ib3RlbCBJRDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3sgYm9va2luZ0RhdGEoKT8uaG90ZWxJZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29udGV4dDogTm90ZXMgKyBDaGFuZ2VzIHRhYmJlZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dFwiPlxuXG4gICAgICAgIDwhLS0gVGFiIGJhciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXRhYnNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtdGFiXCJcbiAgICAgICAgICAgIFtjbGFzcy5zYmQtaG90ZWwtY29udGVudF9fY29udGV4dC10YWItLWFjdGl2ZV09XCJhY3RpdmVDb250ZXh0VGFiKCkgPT09ICdjaGFuZ2VzJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25UYWJDaGFuZ2UoJ2NoYW5nZXMnKVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1oaXN0b3J5XCI+PC9pPlxuICAgICAgICAgICAgQ2hhbmdlc1xuICAgICAgICAgICAgQGlmIChib29raW5nSGlzdG9yeSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1waWxsIHNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXBpbGwtLWNoYW5nZXNcIj57eyBib29raW5nSGlzdG9yeSgpLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtdGFiXCJcbiAgICAgICAgICAgIFtjbGFzcy5zYmQtaG90ZWwtY29udGVudF9fY29udGV4dC10YWItLWFjdGl2ZV09XCJhY3RpdmVDb250ZXh0VGFiKCkgPT09ICdub3RlcydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKCdub3RlcycpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNvbW1lbnRzXCI+PC9pPlxuICAgICAgICAgICAgTm90ZXNcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtcGlsbCBzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1waWxsLS1ub3Rlc1wiPnt7IGJvb2tpbmdOb3RlcygpLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKGFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ25vdGVzJykge1xuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwiQWRkIE5vdGVcIiBpY29uPVwicGkgcGktcGx1c1wiIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tb3V0bGluZWQgc2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtYWRkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkTm90ZSgpXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTm90ZXMgdGFiIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ25vdGVzJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbm90ZXMtbGlzdFwiPlxuICAgICAgICAgICAgQGlmIChib29raW5nTm90ZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmJveFwiPjwvaT4gTm8gbm90ZXMgeWV0XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGZvciAobm90ZSBvZiBib29raW5nTm90ZXMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbm90ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbm90ZS10b3BcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX25vdGUtYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX25vdGUtYmFkZ2UtLXt7IG5vdGUuYWN0aW9uIHwgbG93ZXJjYXNlIH19XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG5vdGUuYWN0aW9uIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlLWF1dGhvclwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBub3RlLndyaXR0ZW5CeT8uZmlyc3ROYW1lIH19IHt7IG5vdGUud3JpdHRlbkJ5Py5sYXN0TmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbm90ZS1kYXRlXCI+e3sgZm10Tm90ZURhdGUobm90ZS5kYXRlKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlLW1zZ1wiPnt7IG5vdGUubWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIENoYW5nZXMgdGFiIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ2NoYW5nZXMnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jaGFuZ2VzLWdyb3Vwc1wiPlxuICAgICAgICAgICAgQGlmIChoaXN0b3J5R3JvdXBzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1lbXB0eVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2hlY2tcIj48L2k+IE5vIGNoYW5nZXMgcmVjb3JkZWRcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZm9yIChncm91cCBvZiBoaXN0b3J5R3JvdXBzKCk7IHRyYWNrIGdyb3VwLmNoYW5nZWRBdCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS11c2VyXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBncm91cC5jaGFuZ2VkQnkgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtc2VwXCI+wrc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmbXREYXRlKGdyb3VwLmNoYW5nZWRBdCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aD5GaWVsZDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoPjxpIGNsYXNzPVwicGkgcGktdGltZXMtY2lyY2xlXCI+PC9pPiBCZWZvcmU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aD48aSBjbGFzcz1cInBpIHBpLWNoZWNrLWNpcmNsZVwiPjwvaT4gQWZ0ZXI8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZW50cnkgb2YgZ3JvdXAuZW50cmllczsgdHJhY2sgZW50cnkuZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1maWVsZFwiPnt7IGZvcm1hdEZpZWxkKGVudHJ5LmZpZWxkKSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1vbGRcIj57eyBlbnRyeS5mcm9tIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jaGFuZ2VzLW5ld1wiPnt7IGVudHJ5LnRvIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgIDwvZGl2PlxuXG4gICAgfVxuXG4gICAgPCEtLSBMb2FkaW5nIHNrZWxldG9uIGZvciBtYWluIC0tPlxuICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnbG9hZGluZycpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NDAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDoyNSVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICA8L21haW4+XG5cbjwvZGl2PlxuXG48IS0tIERldGFpbCBEaWFsb2cgLS0+XG48cC1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJkZXRhaWxEaWFsb2dWaXNpYmxlXCJcbiAgW2hlYWRlcl09XCJzZWxlY3RlZERldGFpbCgpPy50aXRsZSB8fCAnRGV0YWlscydcIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiAnNjAwcHgnLCBtYXhXaWR0aDogJzkwdncnIH1cIlxuICBbZHJhZ2dhYmxlXT1cImZhbHNlXCJcbiAgW3Jlc2l6YWJsZV09XCJmYWxzZVwiXG4gIHN0eWxlQ2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGV0YWlsLWRpYWxvZ1wiPlxuXG4gIEBpZiAoc2VsZWN0ZWREZXRhaWwoKT8udHlwZSA9PT0gJ3BhY2thZ2VzJyAmJiBzZWxlY3RlZERldGFpbCgpPy5kYXRhKSB7XG4gICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlcy1kZXRhaWxcIj5cbiAgICAgIEBmb3IgKHBrZyBvZiBzZWxlY3RlZERldGFpbCgpPy5kYXRhOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLWNhcmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtaGVhZGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLXRpdGxlXCI+UGFja2FnZSB7eyAkaW5kZXggKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgQGlmIChwa2cuaXNSZWZ1bmRhYmxlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlIHNiZC1ob3RlbC1jb250ZW50X19iYWRnZS0tc3VjY2Vzc1wiPlJlZnVuZGFibGU8L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1kYW5nZXJcIj5Ob24tUmVmdW5kYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAocGtnLnN1cHBsaWVyKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2Utcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtbGFiZWxcIj5TdXBwbGllcjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcGFja2FnZS12YWx1ZVwiPnt7IHBrZy5zdXBwbGllciB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocGtnLnJvb21zICYmIHBrZy5yb29tcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb21zLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3N1YnNlY3Rpb24tdGl0bGVcIj5Sb29tcyAoe3sgcGtnLnJvb21zLmxlbmd0aCB9fSk8L2g0PlxuICAgICAgICAgICAgICBAZm9yIChyb29tIG9mIHBrZy5yb29tczsgdHJhY2sgcm9vbS5yb29tSWQgfHwgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaG9tZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChyb29tLnJvb21OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLW5hbWVcIj57eyByb29tLnJvb21OYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvb20ucm9vbVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20tdGFnXCI+e3sgcm9vbS5yb29tVHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb29tLnJvb21CYXNpcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS10YWdcIj57eyByb29tLnJvb21CYXNpcyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb29tLmJlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20tdGFnXCI+e3sgcm9vbS5iZWRUeXBlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5hZHVsdHNOdW0gfHwgcm9vbS5jaGlsZHJlbk51bSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1vY2N1cGFuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5hZHVsdHNOdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9XCJwaSBwaS11c2VyXCI+PC9pPiB7eyByb29tLmFkdWx0c051bSB9fSBBZHVsdHt7IHJvb20uYWR1bHRzTnVtID4gMSA/ICdzJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb29tLmNoaWxkcmVuTnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwicGkgcGktdXNlcnNcIj48L2k+IHt7IHJvb20uY2hpbGRyZW5OdW0gfX0gQ2hpbGR7eyByb29tLmNoaWxkcmVuTnVtID4gMSA/ICdyZW4nIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKHBrZy5yZWZ1bmRhYmxlVW50aWwpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcGFja2FnZS1yb3dcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcGFja2FnZS1sYWJlbFwiPlJlZnVuZGFibGUgVW50aWw8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtdmFsdWVcIj57eyBwa2cucmVmdW5kYWJsZVVudGlsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9wLWRpYWxvZz5cbiJdfQ==