@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.
- package/esm2022/lib/components/action-card/action-card.component.mjs +3 -3
- package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +3 -3
- package/esm2022/lib/components/almatar-aside/aside-back-button.service.mjs +24 -0
- package/esm2022/lib/components/almatar-aside/aside.component.mjs +122 -0
- package/esm2022/lib/components/booking-input/booking-input.component.mjs +4 -3
- package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +53 -4
- package/esm2022/lib/components/data-search/data-search.component.mjs +3 -3
- package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +544 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.mjs +43 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +296 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +88 -0
- 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
- 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
- package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +129 -0
- package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +321 -0
- package/esm2022/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.mjs +52 -0
- package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.mjs +9 -0
- package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.mjs +7 -0
- package/esm2022/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.mjs +2 -0
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +457 -0
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.mjs +55 -0
- package/esm2022/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.mjs +48 -0
- package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
- package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
- package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
- package/esm2022/lib/components/result-panel/result-panel.component.mjs +3 -3
- package/esm2022/lib/components/shared/components/confirm-modal/confirm-modal.component.mjs +75 -0
- package/esm2022/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.mjs +46 -0
- package/esm2022/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.mjs +9 -0
- package/esm2022/lib/components/shared/interfaces/i-flight-refund-details.mjs +86 -0
- package/esm2022/lib/components/shared/models/cancel-hotel-booking.model.mjs +7 -0
- package/esm2022/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.mjs +27 -0
- package/esm2022/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.mjs +17 -0
- package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
- package/esm2022/lib/config/dashboard.config.mjs +3 -1
- package/esm2022/lib/config/hotel-actions.config.mjs +21 -1
- package/esm2022/lib/models/booking.types.mjs +73 -2
- package/esm2022/lib/models/reissue.types.mjs +2 -0
- package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +31 -7
- package/esm2022/lib/services/booking.service.mjs +6 -2
- package/esm2022/lib/services/reissue.service.mjs +142 -0
- package/esm2022/lib/services/toast.service.mjs +15 -7
- package/esm2022/lib/shared/components/currency-code-icon/currency-code-icon.component.mjs +35 -0
- package/esm2022/lib/shared/enums/brand-enums.enum.mjs +7 -0
- package/esm2022/lib/shared/environments/environment.mjs +10 -0
- package/esm2022/lib/shared/models/index.mjs +6 -0
- package/esm2022/lib/shared/modules/almatar-icon/almatar-icon.module.mjs +36 -0
- package/esm2022/lib/shared/modules/loader/loader.module.mjs +43 -0
- package/esm2022/lib/shared/pipes/exchange.pipe.mjs +49 -0
- package/esm2022/lib/shared/services/api.service.mjs +42 -0
- package/esm2022/lib/shared/services/shared.service.mjs +34 -0
- package/esm2022/lib/shared/services/translation.service.mjs +61 -0
- package/esm2022/lib/shared/services/webengage-tracking.service.mjs +28 -0
- package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +9 -0
- package/esm2022/lib/utils/reissue-format.mjs +64 -0
- package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/almatar-smart-booking-dashboard.mjs +5387 -395
- package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
- package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
- package/lib/components/almatar-aside/aside-back-button.service.d.ts +11 -0
- package/lib/components/almatar-aside/aside.component.d.ts +46 -0
- package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +7 -0
- package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +97 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.d.ts +25 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +91 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.d.ts +39 -0
- 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
- 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
- package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +38 -0
- package/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.d.ts +142 -0
- package/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.d.ts +23 -0
- package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.d.ts +7 -0
- package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.d.ts +5 -0
- package/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.d.ts +252 -0
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +88 -0
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.d.ts +21 -0
- package/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.d.ts +16 -0
- package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
- package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
- package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
- package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
- package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
- package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
- package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
- package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
- package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
- package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
- package/lib/components/result-panel/result-panel.component.d.ts +1 -1
- package/lib/components/shared/components/confirm-modal/confirm-modal.component.d.ts +17 -0
- package/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.d.ts +10 -0
- package/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.d.ts +7 -0
- package/lib/components/shared/interfaces/i-flight-refund-details.d.ts +73 -0
- package/lib/components/shared/models/cancel-hotel-booking.model.d.ts +6 -0
- package/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.d.ts +11 -0
- package/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.d.ts +7 -0
- package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
- package/lib/config/dashboard.config.d.ts +29 -0
- package/lib/models/booking.types.d.ts +28 -0
- package/lib/models/reissue.types.d.ts +147 -0
- package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +5 -1
- package/lib/services/reissue.service.d.ts +45 -0
- package/lib/services/toast.service.d.ts +14 -1
- package/lib/shared/components/currency-code-icon/currency-code-icon.component.d.ts +13 -0
- package/lib/shared/enums/brand-enums.enum.d.ts +5 -0
- package/lib/shared/environments/environment.d.ts +7 -0
- package/lib/shared/models/index.d.ts +11 -0
- package/lib/shared/modules/almatar-icon/almatar-icon.module.d.ts +13 -0
- package/lib/shared/modules/loader/loader.module.d.ts +13 -0
- package/lib/shared/pipes/exchange.pipe.d.ts +17 -0
- package/lib/shared/services/api.service.d.ts +43 -0
- package/lib/shared/services/shared.service.d.ts +12 -0
- package/lib/shared/services/translation.service.d.ts +17 -0
- package/lib/shared/services/webengage-tracking.service.d.ts +8 -0
- package/lib/shared/store/selectors/currency.selectors.d.ts +2 -0
- package/lib/utils/reissue-format.d.ts +28 -0
- package/lib/utils/reissue-url.builder.d.ts +24 -0
- package/package.json +9 -24
- package/public-api.d.ts +5 -1
- package/LICENSE +0 -21
- package/README.md +0 -132
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { AsideComponent } from '../almatar-aside/aside.component';
|
|
2
|
+
import { Component, ChangeDetectionStrategy, DestroyRef, inject, signal, computed, output, input, effect } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { ManageBookingFailedModalComponent } from '../shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component';
|
|
5
|
+
import { LoaderModule } from '../../shared/modules/loader/loader.module';
|
|
6
|
+
import { HotelManageBookingService } from '../shared/services/hotel-manage-booking/hotel-manage-booking.service';
|
|
7
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
+
import { ActivatedRoute } from '@angular/router';
|
|
9
|
+
import { AlmatarHotelAutoCancellationStepEnum } from './enums/almatar-hotel-auto-cancellation-step.enum';
|
|
10
|
+
import { AlmatarHotelAutoCancellationService } from './services/almatar-hotel-auto-cancellation.service';
|
|
11
|
+
import { AlmatarHotelAutoCancellationEndpointsService } from './services/almatar-hotel-auto-cancellation-endpoints.service';
|
|
12
|
+
import { AlmatarHotelAutoCancellationSelectRoomsComponent } from './components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component';
|
|
13
|
+
import { AlmatarHotelAutoCancellationRefundSummaryComponent } from './components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component';
|
|
14
|
+
import { AlmatarHotelAutoCancellationRefundMethodComponent } from './components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component';
|
|
15
|
+
import { ResultOverlayComponent } from './components/result-overlay/result-overlay.component';
|
|
16
|
+
import { HotelManageBookingAsideTabEnum } from '../shared/enums/hotel-manage-booking-aside-tab.enum';
|
|
17
|
+
import { Store } from '@ngrx/store';
|
|
18
|
+
import { filter } from 'rxjs/operators';
|
|
19
|
+
import { getCurrentCurrency } from '../../shared/store/selectors/currency.selectors';
|
|
20
|
+
import { environments } from '../../shared/environments/environment';
|
|
21
|
+
import { AlmatarIconModule } from '../../shared/modules/almatar-icon/almatar-icon.module';
|
|
22
|
+
import { SharedService } from '../../shared/services/shared.service';
|
|
23
|
+
import * as i0 from "@angular/core";
|
|
24
|
+
import * as i1 from "../../shared/modules/loader/loader.module";
|
|
25
|
+
export class AlmatarHotelAutoCancellationComponent {
|
|
26
|
+
constructor() {
|
|
27
|
+
this.hotelManageBookingService = inject(HotelManageBookingService);
|
|
28
|
+
this.autoCancellationService = inject(AlmatarHotelAutoCancellationService);
|
|
29
|
+
this.HotelManageBookingService = inject(HotelManageBookingService);
|
|
30
|
+
this.autoCancellationEndpointsService = inject(AlmatarHotelAutoCancellationEndpointsService);
|
|
31
|
+
this.activatedRoute = inject(ActivatedRoute);
|
|
32
|
+
this.destroyRef = inject(DestroyRef);
|
|
33
|
+
this.store = inject(Store);
|
|
34
|
+
this.sharedService = inject(SharedService);
|
|
35
|
+
this.selectedHotelBooking = input(null);
|
|
36
|
+
this.closed = output();
|
|
37
|
+
this.cancellationSuccess = output();
|
|
38
|
+
this.nonRefundableSubmitSuccess = output();
|
|
39
|
+
this.chatWithAgent = output();
|
|
40
|
+
this.showConfirmModal = signal(false);
|
|
41
|
+
this.showErrorModal = signal(false);
|
|
42
|
+
this.showAside = signal(true);
|
|
43
|
+
this.isLoading = signal(false);
|
|
44
|
+
this.isCancelling = signal(false);
|
|
45
|
+
this.hotelManageError = signal('');
|
|
46
|
+
this.isNusk = signal(false);
|
|
47
|
+
this.showResultOverlay = signal(false);
|
|
48
|
+
this.resultOverlayData = signal(null);
|
|
49
|
+
this.rooms = signal([]);
|
|
50
|
+
this.packages = signal([]);
|
|
51
|
+
this.hotelInfo = signal(null);
|
|
52
|
+
this.currentCurrency = signal(null);
|
|
53
|
+
this.refundDetailsData = signal(null);
|
|
54
|
+
this.selectedPackageIds = signal([]);
|
|
55
|
+
this.refundMethod = signal('wallet');
|
|
56
|
+
this.refundResponseData = signal(null);
|
|
57
|
+
this.stepEnum = AlmatarHotelAutoCancellationStepEnum;
|
|
58
|
+
this.currentStep = computed(() => this.autoCancellationService.currentStep());
|
|
59
|
+
this.isSingleRoom = computed(() => this.rooms().length === 1);
|
|
60
|
+
this.isSinglePackage = computed(() => this.packages().length === 1);
|
|
61
|
+
// Get supplier from booking or first package
|
|
62
|
+
this.bookingSuppliers = computed(() => {
|
|
63
|
+
const booking = this.selectedHotelBooking();
|
|
64
|
+
if (!booking)
|
|
65
|
+
return undefined;
|
|
66
|
+
// Try to get supplier from booking level first
|
|
67
|
+
if (booking.supplier) {
|
|
68
|
+
return booking.supplier;
|
|
69
|
+
}
|
|
70
|
+
// Otherwise get from first package
|
|
71
|
+
const packages = this.packages();
|
|
72
|
+
return packages.length > 0 ? packages[0].supplier : undefined;
|
|
73
|
+
});
|
|
74
|
+
// Computed totals for adults, children, infants from booking packages
|
|
75
|
+
this.totalAdults = computed(() => {
|
|
76
|
+
const booking = this.selectedHotelBooking();
|
|
77
|
+
if (!booking?.packages) {
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
return booking.packages.reduce((total, pkg) => {
|
|
81
|
+
const rooms = pkg.rooms || [];
|
|
82
|
+
return (total +
|
|
83
|
+
rooms.reduce((sum, room) => sum + (room.adultsNum || 0), 0));
|
|
84
|
+
}, 0);
|
|
85
|
+
});
|
|
86
|
+
this.totalChildren = computed(() => {
|
|
87
|
+
const booking = this.selectedHotelBooking();
|
|
88
|
+
if (!booking?.packages) {
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
return booking.packages.reduce((total, pkg) => {
|
|
92
|
+
const rooms = pkg.rooms || [];
|
|
93
|
+
return (total +
|
|
94
|
+
rooms.reduce((sum, room) => sum + (room.childrenNum || 0), 0));
|
|
95
|
+
}, 0);
|
|
96
|
+
});
|
|
97
|
+
this.totalInfants = computed(() => {
|
|
98
|
+
const booking = this.selectedHotelBooking();
|
|
99
|
+
if (!booking?.packages) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
return booking.packages.reduce((total, pkg) => {
|
|
103
|
+
const rooms = pkg.rooms || [];
|
|
104
|
+
return (total +
|
|
105
|
+
rooms.reduce((sum, room) => sum + (room.infantsNum || 0), 0));
|
|
106
|
+
}, 0);
|
|
107
|
+
});
|
|
108
|
+
this.asideTitle = computed(() => {
|
|
109
|
+
const step = this.currentStep();
|
|
110
|
+
switch (step) {
|
|
111
|
+
case AlmatarHotelAutoCancellationStepEnum.selectRooms:
|
|
112
|
+
return this.isSinglePackage() ? 'Confirm Cancellation' : 'Select Rooms';
|
|
113
|
+
case AlmatarHotelAutoCancellationStepEnum.refundSummary:
|
|
114
|
+
return 'Cancel Booking Request';
|
|
115
|
+
case AlmatarHotelAutoCancellationStepEnum.refundMethod:
|
|
116
|
+
return 'Select Refund Method';
|
|
117
|
+
default:
|
|
118
|
+
return 'Cancel Booking';
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
effect(() => {
|
|
122
|
+
this.HotelManageBookingService.selectedHotelBooking.next(this.selectedHotelBooking());
|
|
123
|
+
// console.log('selectedHotelBooking', this.selectedHotelBooking());
|
|
124
|
+
// console.log('refundDetailsData', this.refundDetailsData());
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
get closeIconName() {
|
|
128
|
+
const lang = this.sharedService.getAppLanguage();
|
|
129
|
+
return lang === 'ar' ? 'arrow-left' : 'arrow-right';
|
|
130
|
+
}
|
|
131
|
+
ngOnInit() {
|
|
132
|
+
this.initializeQueryParams();
|
|
133
|
+
this.loadBookingDataFromPackages();
|
|
134
|
+
this.initCurrency();
|
|
135
|
+
}
|
|
136
|
+
initCurrency() {
|
|
137
|
+
this.store
|
|
138
|
+
.select(getCurrentCurrency)
|
|
139
|
+
.pipe(filter((currency) => !!currency), takeUntilDestroyed(this.destroyRef))
|
|
140
|
+
.subscribe((currency) => {
|
|
141
|
+
this.currentCurrency.set(currency);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
ngOnDestroy() {
|
|
145
|
+
this.autoCancellationService.reset();
|
|
146
|
+
this.autoCancellationEndpointsService.clearSelectedPackageIds();
|
|
147
|
+
}
|
|
148
|
+
initializeQueryParams() {
|
|
149
|
+
this.activatedRoute.queryParams
|
|
150
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
151
|
+
.subscribe((params) => {
|
|
152
|
+
if (params['skipCheck']) {
|
|
153
|
+
this.isNusk.set(true);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
loadBookingDataFromPackages() {
|
|
158
|
+
this.isLoading.set(true);
|
|
159
|
+
const booking = this.selectedHotelBooking();
|
|
160
|
+
if (booking) {
|
|
161
|
+
this.processBookingData(booking);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.hotelManageBookingService.selectedHotelBooking
|
|
165
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
166
|
+
.subscribe((serviceBooking) => {
|
|
167
|
+
if (serviceBooking) {
|
|
168
|
+
this.processBookingData(serviceBooking);
|
|
169
|
+
}
|
|
170
|
+
this.isLoading.set(false);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
processBookingData(booking) {
|
|
175
|
+
const hotelInfoData = {
|
|
176
|
+
hotelName: booking.hotelName || '',
|
|
177
|
+
hotelImage: booking.coverImage || '',
|
|
178
|
+
checkIn: booking.dateFrom || booking?.from?._i,
|
|
179
|
+
checkOut: booking.dateTo || booking?.to?._i,
|
|
180
|
+
totalRooms: booking.packages?.length || booking.rooms || 1,
|
|
181
|
+
nights: booking.numberOfNights ||
|
|
182
|
+
booking.nightNumber ||
|
|
183
|
+
this.calculateNights(booking.dateFrom, booking.dateTo),
|
|
184
|
+
checkInTime: booking.checkInTime?.split(' ')[0],
|
|
185
|
+
checkOutTime: booking.checkOutTime?.split(' ')[0]
|
|
186
|
+
};
|
|
187
|
+
this.hotelInfo.set(hotelInfoData);
|
|
188
|
+
this.autoCancellationService.setHotelInfo(hotelInfoData);
|
|
189
|
+
// Map to both rooms (for backward compatibility) and packages (new structure)
|
|
190
|
+
const mappedRooms = this.mapPackagesToRooms(booking);
|
|
191
|
+
this.rooms.set(mappedRooms);
|
|
192
|
+
const mappedPackages = this.mapBookingToPackages(booking);
|
|
193
|
+
this.packages.set(mappedPackages);
|
|
194
|
+
this.autoCancellationService.setSelectedRooms(mappedRooms);
|
|
195
|
+
this.isLoading.set(false);
|
|
196
|
+
}
|
|
197
|
+
mapPackagesToRooms(booking) {
|
|
198
|
+
const nights = booking.numberOfNights ||
|
|
199
|
+
booking.nightNumber ||
|
|
200
|
+
this.calculateNights(booking.from, booking.to);
|
|
201
|
+
const packages = booking.packages || [];
|
|
202
|
+
return packages.flatMap((pkg, pkgIndex) => {
|
|
203
|
+
const rooms = pkg.rooms || [];
|
|
204
|
+
return rooms.map((room, roomIndex) => ({
|
|
205
|
+
packageId: pkg.id || String(pkgIndex + 1),
|
|
206
|
+
roomId: room?.roomId || `${pkg.id}-${roomIndex}`,
|
|
207
|
+
roomName: room?.roomName || `Room ${roomIndex + 1}`,
|
|
208
|
+
roomType: room?.roomType || 'Standard Room',
|
|
209
|
+
mealPlan: room?.roomBasis || '',
|
|
210
|
+
isRefundable: pkg.isRefundable !== false,
|
|
211
|
+
isCancelled: pkg.isCancelled,
|
|
212
|
+
manualRefundRequest: !pkg.isRefundable,
|
|
213
|
+
isSelected: false,
|
|
214
|
+
nights: this.hotelInfo()?.nights || nights,
|
|
215
|
+
roomAmount: 0,
|
|
216
|
+
cancellationFee: 0,
|
|
217
|
+
refundAmount: 0,
|
|
218
|
+
bedType: room?.bedType || '',
|
|
219
|
+
roomView: room?.roomView || '',
|
|
220
|
+
roomBasis: room?.roomBasis || '',
|
|
221
|
+
refundability: pkg.isRefundable,
|
|
222
|
+
refundableUntil: pkg.refundableUntil || '',
|
|
223
|
+
adultsNum: room?.adultsNum || 0,
|
|
224
|
+
childrenNum: room?.childrenNum || 0,
|
|
225
|
+
passengerName: room?.passengers?.name || ''
|
|
226
|
+
}));
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
mapBookingToPackages(booking) {
|
|
230
|
+
const bookingPackages = booking.packages || [];
|
|
231
|
+
return bookingPackages.map((pkg, pkgIndex) => {
|
|
232
|
+
const rooms = pkg.rooms || [];
|
|
233
|
+
const firstRoom = rooms[0];
|
|
234
|
+
return {
|
|
235
|
+
packageId: pkg.id || String(pkgIndex + 1),
|
|
236
|
+
packageName: firstRoom?.roomName || `Package ${pkgIndex + 1}`,
|
|
237
|
+
boardBasis: firstRoom?.roomBasis || '',
|
|
238
|
+
isRefundable: pkg.isRefundable !== false,
|
|
239
|
+
isSelected: false,
|
|
240
|
+
isCancelled: pkg.isCancelled,
|
|
241
|
+
refundability: pkg.isRefundable,
|
|
242
|
+
refundableUntil: pkg.refundableUntil || '',
|
|
243
|
+
rooms: rooms.map((room, roomIndex) => ({
|
|
244
|
+
roomId: room?.roomId || `${pkg.id}-${roomIndex}`,
|
|
245
|
+
roomName: room?.roomName || `Room ${roomIndex + 1}`,
|
|
246
|
+
roomType: room?.roomType || 'Standard Room',
|
|
247
|
+
bedType: room?.bedType || '',
|
|
248
|
+
roomBasis: room?.roomBasis || ''
|
|
249
|
+
})),
|
|
250
|
+
roomAmount: 0,
|
|
251
|
+
cancellationFee: 0,
|
|
252
|
+
refundAmount: 0,
|
|
253
|
+
manualRefundRequest: !pkg.isRefundable,
|
|
254
|
+
cancelledBefore: false,
|
|
255
|
+
cancellationPolicies: pkg.cancellationPolicies || [],
|
|
256
|
+
CancellationPoliciesRemarks: pkg.cancellationPoliciesRemarks,
|
|
257
|
+
supplier: pkg.supplier
|
|
258
|
+
};
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
calculateNights(from, to) {
|
|
262
|
+
if (!from || !to) {
|
|
263
|
+
return 1;
|
|
264
|
+
}
|
|
265
|
+
if (from.diff && typeof from.diff === 'function') {
|
|
266
|
+
return to.diff(from, 'days') || 1;
|
|
267
|
+
}
|
|
268
|
+
const fromDate = new Date(from);
|
|
269
|
+
const toDate = new Date(to);
|
|
270
|
+
const diffTime = Math.abs(toDate.getTime() - fromDate.getTime());
|
|
271
|
+
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
272
|
+
return diffDays || 1;
|
|
273
|
+
}
|
|
274
|
+
onContinueToCancel(selectedPackages) {
|
|
275
|
+
// Convert packages to rooms format for backward compatibility with the service
|
|
276
|
+
const selectedRooms = selectedPackages.flatMap((pkg) => pkg.rooms.map((room) => ({
|
|
277
|
+
packageId: pkg.packageId,
|
|
278
|
+
roomId: room.roomId,
|
|
279
|
+
roomName: room.roomName,
|
|
280
|
+
roomType: room.roomType,
|
|
281
|
+
mealPlan: room.roomBasis,
|
|
282
|
+
isRefundable: pkg.isRefundable,
|
|
283
|
+
isCancelled: pkg.isCancelled,
|
|
284
|
+
isSelected: pkg.isSelected,
|
|
285
|
+
nights: 0,
|
|
286
|
+
roomAmount: pkg.roomAmount,
|
|
287
|
+
cancellationFee: pkg.cancellationFee,
|
|
288
|
+
refundAmount: pkg.refundAmount,
|
|
289
|
+
bedType: room.bedType,
|
|
290
|
+
roomBasis: room.roomBasis,
|
|
291
|
+
refundability: pkg.refundability,
|
|
292
|
+
refundableUntil: pkg.refundableUntil,
|
|
293
|
+
cancelledBefore: pkg.cancelledBefore,
|
|
294
|
+
manualRefundRequest: pkg.manualRefundRequest
|
|
295
|
+
})));
|
|
296
|
+
this.autoCancellationService.setSelectedRooms(selectedRooms);
|
|
297
|
+
this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundSummary);
|
|
298
|
+
}
|
|
299
|
+
onKeepRoom() {
|
|
300
|
+
this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.selectRooms);
|
|
301
|
+
}
|
|
302
|
+
onSelectRefundOption(data) {
|
|
303
|
+
// Check if tenant - redirect to WhatsApp for tenant bookings
|
|
304
|
+
if (environments.isTenant) {
|
|
305
|
+
this.hotelManageBookingService.setActiveAsideTab(HotelManageBookingAsideTabEnum.whatsAppAgent);
|
|
306
|
+
this.showAside.set(false);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
// console.log('Refund option selected:', data);
|
|
310
|
+
this.selectedPackageIds.set(data.packageIds);
|
|
311
|
+
this.refundResponseData.set(data.responseData);
|
|
312
|
+
const response = data?.responseData;
|
|
313
|
+
const payout = response?.payout || data.payout;
|
|
314
|
+
const totals = response?.totals;
|
|
315
|
+
// const walletRefund = payout?.wallet || payout?.loyaltyToWallet;
|
|
316
|
+
const walletRefund = payout?.wallet;
|
|
317
|
+
const cardRefund = payout?.card ?? 0;
|
|
318
|
+
const tabbyRefund = payout?.tabby ?? payout?.tabby ?? 0;
|
|
319
|
+
const tamaraRefund = payout?.tamara ?? payout?.tamara ?? 0;
|
|
320
|
+
// Check if full wallet refund is allowed based on payout breakdown
|
|
321
|
+
// Wallet refund is allowed if there's no card/tabby/tamara portion
|
|
322
|
+
const hasNonWalletRefund = tabbyRefund > 0 || tamaraRefund > 0;
|
|
323
|
+
const totalRefundAmount = payout?.current ?? data.totalRefund;
|
|
324
|
+
const isFullWalletAllowed = (!hasNonWalletRefund && walletRefund > 0) || cardRefund > 0;
|
|
325
|
+
const loyaltyPointsValue = payout?.loyaltyToWallet ||
|
|
326
|
+
totals?.wala ||
|
|
327
|
+
totals?.qitaf ||
|
|
328
|
+
totals?.mokafa ||
|
|
329
|
+
totals?.hassad ||
|
|
330
|
+
totals?.ygg;
|
|
331
|
+
// Build refund details data for the method selector
|
|
332
|
+
this.refundDetailsData.set({
|
|
333
|
+
totalRefundAmount,
|
|
334
|
+
walletRefundAmount: payout?.wallet,
|
|
335
|
+
totalCardRefundAmount: cardRefund + tabbyRefund + tamaraRefund,
|
|
336
|
+
isFullWalletRefundAllowed: isFullWalletAllowed,
|
|
337
|
+
currency: response?.currency,
|
|
338
|
+
isRefundable: response?.flags?.refundable,
|
|
339
|
+
totalLoyaltyPointsRefundAmount: loyaltyPointsValue,
|
|
340
|
+
// Pass payment method info for proper labeling
|
|
341
|
+
paymentMethodCustomerUsed: this.determinePaymentMethod(totals, payout),
|
|
342
|
+
// Additional fields for proper loyalty program labeling and split refund display
|
|
343
|
+
loyaltyPaymentType: this.determineLoyaltyType(totals, payout),
|
|
344
|
+
totalLoyaltyPoints: loyaltyPointsValue,
|
|
345
|
+
bookingId: this.selectedHotelBooking()?.bookingId
|
|
346
|
+
});
|
|
347
|
+
// Default to wallet if allowed, otherwise originalPaymentMethod
|
|
348
|
+
if (isFullWalletAllowed && walletRefund > 0) {
|
|
349
|
+
this.refundMethod.set('wallet');
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
this.refundMethod.set('originalPaymentMethod');
|
|
353
|
+
}
|
|
354
|
+
this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundMethod);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Determines the payment method label based on totals/payout breakdown.
|
|
358
|
+
* Returns the appropriate gateway code for proper labeling.
|
|
359
|
+
*/
|
|
360
|
+
/**
|
|
361
|
+
* Determines the card/installment payment method for the card row label.
|
|
362
|
+
* Loyalty programs are handled separately by determineLoyaltyType().
|
|
363
|
+
*/
|
|
364
|
+
determinePaymentMethod(totals, payout) {
|
|
365
|
+
if ((payout?.tabby ?? totals?.tabby ?? 0) > 0) {
|
|
366
|
+
return 'TB'; // Tabby
|
|
367
|
+
}
|
|
368
|
+
if ((payout?.tamara ?? totals?.tamara ?? 0) > 0) {
|
|
369
|
+
return 'TM'; // Tamara
|
|
370
|
+
}
|
|
371
|
+
if ((payout?.card ?? totals?.card ?? 0) > 0) {
|
|
372
|
+
return 'CH'; // Card
|
|
373
|
+
}
|
|
374
|
+
return '';
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Determines the loyalty payment type for proper labeling in split refund rows.
|
|
378
|
+
* Returns the loyalty program code (e.g., 'QITAF', 'RAJHI') if applicable.
|
|
379
|
+
*/
|
|
380
|
+
determineLoyaltyType(totals, payout) {
|
|
381
|
+
if ((totals?.mokafa ?? 0) > 0) {
|
|
382
|
+
return 'AlRajhiMokafaa';
|
|
383
|
+
}
|
|
384
|
+
if ((totals?.qitaf ?? 0) > 0) {
|
|
385
|
+
return 'Qitaf';
|
|
386
|
+
}
|
|
387
|
+
if ((totals?.wala ?? 0) > 0) {
|
|
388
|
+
return 'Wala';
|
|
389
|
+
}
|
|
390
|
+
if ((payout?.loyaltyToWallet ?? 0) > 0 ||
|
|
391
|
+
(payout?.loyaltyPoints ?? 0) > 0) {
|
|
392
|
+
// Check if we have a specific loyalty type from the response
|
|
393
|
+
const loyaltyType = totals?.loyaltyType;
|
|
394
|
+
if (loyaltyType &&
|
|
395
|
+
[
|
|
396
|
+
'AlRajhiMokafaa',
|
|
397
|
+
'Qitaf',
|
|
398
|
+
'Wala',
|
|
399
|
+
'ALFURSAN',
|
|
400
|
+
'ALMATAR_POINTS'
|
|
401
|
+
].includes(loyaltyType)) {
|
|
402
|
+
return loyaltyType;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
onMethodSelected(method) {
|
|
408
|
+
this.refundMethod.set(method);
|
|
409
|
+
}
|
|
410
|
+
onBackFromRefundMethod() {
|
|
411
|
+
this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundSummary);
|
|
412
|
+
}
|
|
413
|
+
onGoBack() {
|
|
414
|
+
const step = this.currentStep();
|
|
415
|
+
switch (step) {
|
|
416
|
+
case AlmatarHotelAutoCancellationStepEnum.refundSummary:
|
|
417
|
+
this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.selectRooms);
|
|
418
|
+
break;
|
|
419
|
+
case AlmatarHotelAutoCancellationStepEnum.refundMethod:
|
|
420
|
+
this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundSummary);
|
|
421
|
+
break;
|
|
422
|
+
default:
|
|
423
|
+
// For selectRooms or other steps, do nothing (close modal)
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
canGoBack() {
|
|
428
|
+
const step = this.currentStep();
|
|
429
|
+
return (step === AlmatarHotelAutoCancellationStepEnum.refundSummary ||
|
|
430
|
+
step === AlmatarHotelAutoCancellationStepEnum.refundMethod);
|
|
431
|
+
}
|
|
432
|
+
confirmCancellation() {
|
|
433
|
+
this.isCancelling.set(true);
|
|
434
|
+
this.autoCancellationEndpointsService
|
|
435
|
+
.processAutoCancellation(this.selectedPackageIds(), this.refundMethod())
|
|
436
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
437
|
+
.subscribe({
|
|
438
|
+
next: (response) => {
|
|
439
|
+
this.isCancelling.set(false);
|
|
440
|
+
this.showAside.set(false);
|
|
441
|
+
// Check if tenant - redirect to WhatsApp
|
|
442
|
+
if (environments.isTenant || response?.data?.isWhatsApp) {
|
|
443
|
+
this.hotelManageBookingService.setActiveAsideTab(HotelManageBookingAsideTabEnum.whatsAppAgent);
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
// Show success overlay
|
|
447
|
+
this.resultOverlayData.set({
|
|
448
|
+
type: 'success',
|
|
449
|
+
title: 'Cancellation Successful!',
|
|
450
|
+
message: 'Your booking has been cancelled successfully. The refund will be processed according to your selected method.',
|
|
451
|
+
confirmText: 'Done'
|
|
452
|
+
});
|
|
453
|
+
this.showResultOverlay.set(true);
|
|
454
|
+
// Also emit for parent component if needed
|
|
455
|
+
this.cancellationSuccess.emit(response);
|
|
456
|
+
},
|
|
457
|
+
error: (error) => {
|
|
458
|
+
this.isCancelling.set(false);
|
|
459
|
+
this.showAside.set(false);
|
|
460
|
+
// Extract error message from various possible structures
|
|
461
|
+
let errorMessage = 'We encountered an issue processing your cancellation. Please try again or contact support.';
|
|
462
|
+
console.error('Cancellation error:', error);
|
|
463
|
+
if (error?.error?.message) {
|
|
464
|
+
errorMessage = error.error.message;
|
|
465
|
+
}
|
|
466
|
+
else if (error?.error?.errors && Array.isArray(error.error.errors) && error.error.errors.length > 0) {
|
|
467
|
+
errorMessage = error.error.errors[0];
|
|
468
|
+
}
|
|
469
|
+
else if (error?.message) {
|
|
470
|
+
errorMessage = error.message;
|
|
471
|
+
}
|
|
472
|
+
else if (typeof error === 'string') {
|
|
473
|
+
errorMessage = error;
|
|
474
|
+
}
|
|
475
|
+
// Show error overlay
|
|
476
|
+
this.resultOverlayData.set({
|
|
477
|
+
type: 'error',
|
|
478
|
+
title: 'Cancellation Failed',
|
|
479
|
+
message: errorMessage,
|
|
480
|
+
confirmText: 'Close'
|
|
481
|
+
});
|
|
482
|
+
this.showResultOverlay.set(true);
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
onCloseModal() {
|
|
487
|
+
this.closed.emit();
|
|
488
|
+
}
|
|
489
|
+
onNonRefundableSubmitSuccess(packageName) {
|
|
490
|
+
this.showAside.set(false);
|
|
491
|
+
// Show success overlay for non-refundable request
|
|
492
|
+
this.resultOverlayData.set({
|
|
493
|
+
type: 'success',
|
|
494
|
+
title: 'Request Submitted!',
|
|
495
|
+
message: `Your cancellation request for ${packageName} has been submitted successfully. Our team will review your request and contact you shortly.`,
|
|
496
|
+
confirmText: 'Done'
|
|
497
|
+
});
|
|
498
|
+
this.showResultOverlay.set(true);
|
|
499
|
+
// Also emit for parent component if needed
|
|
500
|
+
this.nonRefundableSubmitSuccess.emit(packageName);
|
|
501
|
+
}
|
|
502
|
+
onChatWithAgent() {
|
|
503
|
+
this.showAside.set(false);
|
|
504
|
+
this.chatWithAgent.emit();
|
|
505
|
+
}
|
|
506
|
+
closeAllModals() {
|
|
507
|
+
this.showConfirmModal.set(false);
|
|
508
|
+
this.showErrorModal.set(false);
|
|
509
|
+
this.showAside.set(false);
|
|
510
|
+
this.closed.emit();
|
|
511
|
+
}
|
|
512
|
+
onResultOverlayConfirm() {
|
|
513
|
+
this.showResultOverlay.set(false);
|
|
514
|
+
this.resultOverlayData.set(null);
|
|
515
|
+
this.closed.emit();
|
|
516
|
+
}
|
|
517
|
+
onResultOverlayCancel() {
|
|
518
|
+
this.showResultOverlay.set(false);
|
|
519
|
+
this.resultOverlayData.set(null);
|
|
520
|
+
}
|
|
521
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
522
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlmatarHotelAutoCancellationComponent, isStandalone: true, selector: "almatar-hotel-auto-cancellation", inputs: { selectedHotelBooking: { classPropertyName: "selectedHotelBooking", publicName: "selectedHotelBooking", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", cancellationSuccess: "cancellationSuccess", nonRefundableSubmitSuccess: "nonRefundableSubmitSuccess", chatWithAgent: "chatWithAgent" }, providers: [
|
|
523
|
+
AlmatarHotelAutoCancellationService,
|
|
524
|
+
AlmatarHotelAutoCancellationEndpointsService
|
|
525
|
+
], ngImport: i0, template: "@if (showAside()) {\n <almatar-aside\n\n class=\"auto_cancellation_wrapper\"\n [asideTitle]=\"asideTitle()\"\n [showAside]=\"showAside()\"\n [whiteHeader]=\"true\"\n [showHeader]=\"false\"\n (onClose)=\"onCloseModal()\"\n >\n <!-- Custom Header with 60px height -->\n <div class=\"auto_cancellation__header\">\n @if (canGoBack()) {\n <button class=\"auto_cancellation__header-back\" (click)=\"onGoBack()\" type=\"button\">\n <i class=\"pi pi-arrow-left\"></i>\n </button>\n }\n <div class=\"auto_cancellation__header-content\">\n @if (currentStep() === stepEnum.selectRooms) {\n <h2 class=\"auto_cancellation__header-title\">\n @if (isSinglePackage()) {\n Cancel Rooms\n } @else {\n Select Rooms\n }\n </h2>\n <p class=\"auto_cancellation__header-subtitle\">\n @if (isSinglePackage()) {\n Review and confirm your cancellation\n } @else {\n Choose which room(s) you'd like to cancel\n }\n </p>\n } @else if (currentStep() === stepEnum.refundSummary) {\n <h2 class=\"auto_cancellation__header-title\">Cancel Booking Request</h2>\n <p class=\"auto_cancellation__header-subtitle\">Review your refund summary and proceed</p>\n } @else if (currentStep() === stepEnum.refundMethod) {\n <h2 class=\"auto_cancellation__header-title\">Select Refund Method</h2>\n <p class=\"auto_cancellation__header-subtitle\">Choose how you'd like to receive your refund</p>\n } @else {\n <h2 class=\"auto_cancellation__header-title\">{{ asideTitle() }}</h2>\n <p class=\"auto_cancellation__header-subtitle\">Complete your booking cancellation</p>\n }\n </div>\n <button class=\"auto_cancellation__header-close\" (click)=\"onCloseModal()\" type=\"button\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n\n <div class=\"auto_cancellation__component\" [class.isNusk]=\"isNusk()\">\n @if (isLoading()) {\n <div class=\"auto_cancellation__loading\">\n <app-loader></app-loader>\n </div>\n }\n\n @if (currentStep() === stepEnum.selectRooms && !isLoading()) {\n <almatar-hotel-auto-cancellation-select-rooms\n [packages]=\"packages()\"\n [hotelInfo]=\"hotelInfo()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.hotelId\"\n [currencyCode]=\"selectedHotelBooking()?.currencyCode || 'SAR'\"\n (continueToCancel)=\"onContinueToCancel($event)\"\n (closeModal)=\"onCloseModal()\"\n (nonRefundableSubmitSuccess)=\"onNonRefundableSubmitSuccess($event)\"\n (chatWithAgent)=\"onChatWithAgent()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundSummary && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-summary\n [selectedRooms]=\"autoCancellationService.selectedRooms()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.id || selectedHotelBooking()?.hpk\"\n [hotelInfo]=\"hotelInfo()\"\n [selectionSkipped]=\"packages().length <= 1\"\n (keepRoom)=\"onKeepRoom()\"\n (selectRefundOption)=\"onSelectRefundOption($event)\"\n (closeModal)=\"onCloseModal()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundMethod && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-method\n [refundDetailsData]=\"refundDetailsData()\"\n [currencyObj]=\"currentCurrency()\"\n [refundMethod]=\"refundMethod()\"\n [isCancelling]=\"isCancelling()\"\n (methodSelected)=\"onMethodSelected($event)\"\n (backRequested)=\"onBackFromRefundMethod()\"\n (confirmRequested)=\"confirmCancellation()\"\n (closeModal)=\"onCloseModal()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n />\n }\n </div>\n </almatar-aside>\n}\n\n@if (showErrorModal()) {\n <div\n almatar-manage-booking-failed-modal\n [errorMessage]=\"hotelManageError()\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n\n@if (showResultOverlay() && resultOverlayData()) {\n <app-result-overlay\n [data]=\"resultOverlayData()!\"\n [show]=\"showResultOverlay()\"\n (confirm)=\"onResultOverlayConfirm()\"\n (cancel)=\"onResultOverlayCancel()\"\n />\n}\n", styles: [".auto_cancellation__header{height:60px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;background:#fff;border-bottom:1px solid #e2e8f0;flex-shrink:0;gap:16px}.auto_cancellation__header-content{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.auto_cancellation__header-title{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:700;color:#1e293b;margin:0;line-height:1.3}.auto_cancellation__header-subtitle{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;color:#64748b;margin:0;line-height:1.4}.auto_cancellation__header-back{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease;margin-right:8px}.auto_cancellation__header-back i{font-size:18px;color:#64748b}.auto_cancellation__header-back:hover{background:#f1f5f9}.auto_cancellation__header-back:hover i{color:#1e293b}.auto_cancellation__header-back:active{background:#e2e8f0}.auto_cancellation__header-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease}.auto_cancellation__header-close i{font-size:18px;color:#64748b}.auto_cancellation__header-close:hover{background:#f1f5f9}.auto_cancellation__header-close:hover i{color:#1e293b}.auto_cancellation__header-close:active{background:#e2e8f0}.auto_cancellation__component{height:calc(100% - 60px)}.auto_cancellation__loading{display:flex;align-items:center;justify-content:center;height:100%;min-height:200px}.auto_cancellation_wrapper ::ng-deep almatar-hotel-auto-cancellation{display:block;height:100%}.auto_cancellation_wrapper ::ng-deep .p-sidebar-header{display:none!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-content{padding-top:0!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-close{display:none!important}.auto_cancellation_wrapper ::ng-deep .almatar_aside .p-dialog-content{background:var(--almatar-neutral-surface-screen-bg)}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn{min-height:48px;padding:12px 24px;border-radius:10px;font-size:15px;font-weight:600;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;position:relative;overflow:hidden}.auto_cancellation_wrapper ::ng-deep .main_btn:disabled,.auto_cancellation_wrapper ::ng-deep .btn:disabled{opacity:.5;cursor:not-allowed}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn--primary{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;box-shadow:0 2px 8px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .main_btn:hover:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:hover:not(:disabled){background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:0 4px 12px #3b82f666;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .main_btn:active:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .btn--secondary{background:#f1f5f9;color:#1e293b;border:1px solid #e2e8f0}.auto_cancellation_wrapper ::ng-deep .btn--secondary:hover:not(:disabled){background:#e2e8f0;border-color:#cbd5e1;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--secondary:active:not(:disabled){background:#cbd5e1;transform:translateY(0)}.auto_cancellation_wrapper ::ng-deep .btn--danger{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;box-shadow:0 2px 8px #ef44444d}.auto_cancellation_wrapper ::ng-deep .btn--danger:hover:not(:disabled){background:linear-gradient(135deg,#dc2626,#b91c1c);box-shadow:0 4px 12px #ef444466;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--danger:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #ef44444d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us{background:linear-gradient(135deg,#10b981,#059669);box-shadow:0 2px 8px #10b9814d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us:hover:not(:disabled){background:linear-gradient(135deg,#059669,#047857);box-shadow:0 4px 12px #10b98166;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn__spinner{width:18px;height:18px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.auto_cancellation_wrapper ::ng-deep .isNusk .main_btn,.auto_cancellation_wrapper ::ng-deep .isNusk .btn--primary{background:linear-gradient(135deg,var(--almatar-nusuk-primary),var(--almatar-nusuk-primary))!important;border-radius:33px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "component", type: i1.LoaderComponent, selector: "app-loader", inputs: ["loading", "message"] }, { kind: "component", type: AsideComponent, selector: "almatar-aside", inputs: ["asideTitle", "showHeader", "headerTemplate", "whiteHeader", "showAside", "width", "modal", "closable", "transitionOptions", "interceptClose"], outputs: ["onClose", "closeRequested"] }, { kind: "component", type: AlmatarHotelAutoCancellationSelectRoomsComponent, selector: "almatar-hotel-auto-cancellation-select-rooms", inputs: ["packages", "hotelInfo", "bookingId", "hotelId", "currencyCode"], outputs: ["continueToCancel", "closeModal", "nonRefundableSubmitSuccess", "chatWithAgent"] }, { kind: "component", type: AlmatarHotelAutoCancellationRefundSummaryComponent, selector: "almatar-hotel-auto-cancellation-refund-summary", inputs: ["selectedRooms", "bookingId", "hotelId", "hotelInfo", "selectionSkipped"], outputs: ["keepRoom", "selectRefundOption", "closeModal"] }, { kind: "component", type: AlmatarHotelAutoCancellationRefundMethodComponent, selector: "almatar-hotel-auto-cancellation-refund-method", inputs: ["refundDetailsData", "currencyObj", "refundMethod", "bookingId", "isCancelling", "showBack"], outputs: ["methodSelected", "backRequested", "confirmRequested", "closeModal"] }, { kind: "ngmodule", type: AlmatarIconModule }, { kind: "component", type: ResultOverlayComponent, selector: "app-result-overlay", inputs: ["data", "show"], outputs: ["confirm", "cancel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
526
|
+
}
|
|
527
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationComponent, decorators: [{
|
|
528
|
+
type: Component,
|
|
529
|
+
args: [{ selector: 'almatar-hotel-auto-cancellation', standalone: true, imports: [
|
|
530
|
+
CommonModule,
|
|
531
|
+
LoaderModule,
|
|
532
|
+
AsideComponent,
|
|
533
|
+
ManageBookingFailedModalComponent,
|
|
534
|
+
AlmatarHotelAutoCancellationSelectRoomsComponent,
|
|
535
|
+
AlmatarHotelAutoCancellationRefundSummaryComponent,
|
|
536
|
+
AlmatarHotelAutoCancellationRefundMethodComponent,
|
|
537
|
+
AlmatarIconModule,
|
|
538
|
+
ResultOverlayComponent
|
|
539
|
+
], providers: [
|
|
540
|
+
AlmatarHotelAutoCancellationService,
|
|
541
|
+
AlmatarHotelAutoCancellationEndpointsService
|
|
542
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showAside()) {\n <almatar-aside\n\n class=\"auto_cancellation_wrapper\"\n [asideTitle]=\"asideTitle()\"\n [showAside]=\"showAside()\"\n [whiteHeader]=\"true\"\n [showHeader]=\"false\"\n (onClose)=\"onCloseModal()\"\n >\n <!-- Custom Header with 60px height -->\n <div class=\"auto_cancellation__header\">\n @if (canGoBack()) {\n <button class=\"auto_cancellation__header-back\" (click)=\"onGoBack()\" type=\"button\">\n <i class=\"pi pi-arrow-left\"></i>\n </button>\n }\n <div class=\"auto_cancellation__header-content\">\n @if (currentStep() === stepEnum.selectRooms) {\n <h2 class=\"auto_cancellation__header-title\">\n @if (isSinglePackage()) {\n Cancel Rooms\n } @else {\n Select Rooms\n }\n </h2>\n <p class=\"auto_cancellation__header-subtitle\">\n @if (isSinglePackage()) {\n Review and confirm your cancellation\n } @else {\n Choose which room(s) you'd like to cancel\n }\n </p>\n } @else if (currentStep() === stepEnum.refundSummary) {\n <h2 class=\"auto_cancellation__header-title\">Cancel Booking Request</h2>\n <p class=\"auto_cancellation__header-subtitle\">Review your refund summary and proceed</p>\n } @else if (currentStep() === stepEnum.refundMethod) {\n <h2 class=\"auto_cancellation__header-title\">Select Refund Method</h2>\n <p class=\"auto_cancellation__header-subtitle\">Choose how you'd like to receive your refund</p>\n } @else {\n <h2 class=\"auto_cancellation__header-title\">{{ asideTitle() }}</h2>\n <p class=\"auto_cancellation__header-subtitle\">Complete your booking cancellation</p>\n }\n </div>\n <button class=\"auto_cancellation__header-close\" (click)=\"onCloseModal()\" type=\"button\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n\n <div class=\"auto_cancellation__component\" [class.isNusk]=\"isNusk()\">\n @if (isLoading()) {\n <div class=\"auto_cancellation__loading\">\n <app-loader></app-loader>\n </div>\n }\n\n @if (currentStep() === stepEnum.selectRooms && !isLoading()) {\n <almatar-hotel-auto-cancellation-select-rooms\n [packages]=\"packages()\"\n [hotelInfo]=\"hotelInfo()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.hotelId\"\n [currencyCode]=\"selectedHotelBooking()?.currencyCode || 'SAR'\"\n (continueToCancel)=\"onContinueToCancel($event)\"\n (closeModal)=\"onCloseModal()\"\n (nonRefundableSubmitSuccess)=\"onNonRefundableSubmitSuccess($event)\"\n (chatWithAgent)=\"onChatWithAgent()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundSummary && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-summary\n [selectedRooms]=\"autoCancellationService.selectedRooms()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.id || selectedHotelBooking()?.hpk\"\n [hotelInfo]=\"hotelInfo()\"\n [selectionSkipped]=\"packages().length <= 1\"\n (keepRoom)=\"onKeepRoom()\"\n (selectRefundOption)=\"onSelectRefundOption($event)\"\n (closeModal)=\"onCloseModal()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundMethod && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-method\n [refundDetailsData]=\"refundDetailsData()\"\n [currencyObj]=\"currentCurrency()\"\n [refundMethod]=\"refundMethod()\"\n [isCancelling]=\"isCancelling()\"\n (methodSelected)=\"onMethodSelected($event)\"\n (backRequested)=\"onBackFromRefundMethod()\"\n (confirmRequested)=\"confirmCancellation()\"\n (closeModal)=\"onCloseModal()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n />\n }\n </div>\n </almatar-aside>\n}\n\n@if (showErrorModal()) {\n <div\n almatar-manage-booking-failed-modal\n [errorMessage]=\"hotelManageError()\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n\n@if (showResultOverlay() && resultOverlayData()) {\n <app-result-overlay\n [data]=\"resultOverlayData()!\"\n [show]=\"showResultOverlay()\"\n (confirm)=\"onResultOverlayConfirm()\"\n (cancel)=\"onResultOverlayCancel()\"\n />\n}\n", styles: [".auto_cancellation__header{height:60px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;background:#fff;border-bottom:1px solid #e2e8f0;flex-shrink:0;gap:16px}.auto_cancellation__header-content{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.auto_cancellation__header-title{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:700;color:#1e293b;margin:0;line-height:1.3}.auto_cancellation__header-subtitle{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;color:#64748b;margin:0;line-height:1.4}.auto_cancellation__header-back{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease;margin-right:8px}.auto_cancellation__header-back i{font-size:18px;color:#64748b}.auto_cancellation__header-back:hover{background:#f1f5f9}.auto_cancellation__header-back:hover i{color:#1e293b}.auto_cancellation__header-back:active{background:#e2e8f0}.auto_cancellation__header-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease}.auto_cancellation__header-close i{font-size:18px;color:#64748b}.auto_cancellation__header-close:hover{background:#f1f5f9}.auto_cancellation__header-close:hover i{color:#1e293b}.auto_cancellation__header-close:active{background:#e2e8f0}.auto_cancellation__component{height:calc(100% - 60px)}.auto_cancellation__loading{display:flex;align-items:center;justify-content:center;height:100%;min-height:200px}.auto_cancellation_wrapper ::ng-deep almatar-hotel-auto-cancellation{display:block;height:100%}.auto_cancellation_wrapper ::ng-deep .p-sidebar-header{display:none!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-content{padding-top:0!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-close{display:none!important}.auto_cancellation_wrapper ::ng-deep .almatar_aside .p-dialog-content{background:var(--almatar-neutral-surface-screen-bg)}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn{min-height:48px;padding:12px 24px;border-radius:10px;font-size:15px;font-weight:600;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;position:relative;overflow:hidden}.auto_cancellation_wrapper ::ng-deep .main_btn:disabled,.auto_cancellation_wrapper ::ng-deep .btn:disabled{opacity:.5;cursor:not-allowed}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn--primary{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;box-shadow:0 2px 8px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .main_btn:hover:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:hover:not(:disabled){background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:0 4px 12px #3b82f666;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .main_btn:active:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .btn--secondary{background:#f1f5f9;color:#1e293b;border:1px solid #e2e8f0}.auto_cancellation_wrapper ::ng-deep .btn--secondary:hover:not(:disabled){background:#e2e8f0;border-color:#cbd5e1;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--secondary:active:not(:disabled){background:#cbd5e1;transform:translateY(0)}.auto_cancellation_wrapper ::ng-deep .btn--danger{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;box-shadow:0 2px 8px #ef44444d}.auto_cancellation_wrapper ::ng-deep .btn--danger:hover:not(:disabled){background:linear-gradient(135deg,#dc2626,#b91c1c);box-shadow:0 4px 12px #ef444466;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--danger:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #ef44444d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us{background:linear-gradient(135deg,#10b981,#059669);box-shadow:0 2px 8px #10b9814d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us:hover:not(:disabled){background:linear-gradient(135deg,#059669,#047857);box-shadow:0 4px 12px #10b98166;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn__spinner{width:18px;height:18px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.auto_cancellation_wrapper ::ng-deep .isNusk .main_btn,.auto_cancellation_wrapper ::ng-deep .isNusk .btn--primary{background:linear-gradient(135deg,var(--almatar-nusuk-primary),var(--almatar-nusuk-primary))!important;border-radius:33px!important}\n"] }]
|
|
543
|
+
}], ctorParameters: () => [] });
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixVQUFVLEVBR1YsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdGQUF3RixDQUFDO0FBQzNJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzRUFBc0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDekcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7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QkFDakMsZ0RBQWdEO3dCQUNoRCxrREFBa0Q7d0JBQ2xELGlEQUFpRDt3QkFDakQsaUJBQWlCO3dCQUNqQixzQkFBc0I7cUJBQ3ZCLGFBQ1U7d0JBQ1QsbUNBQW1DO3dCQUNuQyw0Q0FBNEM7cUJBQzdDLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNpZGVDb21wb25lbnQgfSBmcm9tICcuLi9hbG1hdGFyLWFzaWRlL2FzaWRlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBEZXN0cm95UmVmLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBvdXRwdXQsXG4gIGlucHV0LFxuICBlZmZlY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWFuYWdlQm9va2luZ0ZhaWxlZE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vc2hhcmVkL2NvbXBvbmVudHMvbWFuYWdlLWJvb2tpbmctZmFpbGVkLW1vZGFsL21hbmFnZS1ib29raW5nLWZhaWxlZC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZGVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZHVsZXMvbG9hZGVyL2xvYWRlci5tb2R1bGUnO1xuaW1wb3J0IHsgSG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9ob3RlbC1tYW5hZ2UtYm9va2luZy9ob3RlbC1tYW5hZ2UtYm9va2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bSB9IGZyb20gJy4vZW51bXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1zdGVwLmVudW0nO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzU2VydmljZSxcbiAgSUF1dG9DYW5jZWxsYXRpb25Qcm9jZXNzUmVzcG9uc2Vcbn0gZnJvbSAnLi9zZXJ2aWNlcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbSxcbiAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Ib3RlbEluZm8sXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZSxcbiAgSUJvb2tpbmdQYWNrYWdlXG59IGZyb20gJy4vaW50ZXJmYWNlcy9pLWFsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIElSZWZ1bmREZXRhaWxzRGF0YSBhcyBJRmxpZ2h0UmVmdW5kRGV0YWlsc0RhdGEsXG4gIFJlZnVuZFByZWZlcnJlZE1ldGhvZCxcbiAgTG95YWx0eVBheW1lbnRUeXBlXG59IGZyb20gJy4uL3NoYXJlZC9pbnRlcmZhY2VzL2ktZmxpZ2h0LXJlZnVuZC1kZXRhaWxzJztcbmltcG9ydCB7IElIb3RlbEJvb2tpbmdEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Jvb2tpbmcudHlwZXMnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlbGVjdFJvb21zQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5L2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kLXN1bW1hcnkuY29tcG9uZW50JztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRNZXRob2RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmQtbWV0aG9kL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kLW1ldGhvZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVzdWx0T3ZlcmxheUNvbXBvbmVudCwgUmVzdWx0T3ZlcmxheURhdGEgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVzdWx0LW92ZXJsYXkvcmVzdWx0LW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IEhvdGVsTWFuYWdlQm9va2luZ0FzaWRlVGFiRW51bSB9IGZyb20gJy4uL3NoYXJlZC9lbnVtcy9ob3RlbC1tYW5hZ2UtYm9va2luZy1hc2lkZS10YWIuZW51bSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGdldEN1cnJlbnRDdXJyZW5jeSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zdG9yZS9zZWxlY3RvcnMvY3VycmVuY3kuc2VsZWN0b3JzJztcbmltcG9ydCB7IGVudmlyb25tZW50cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQWxtYXRhckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kdWxlcy9hbG1hdGFyLWljb24vYWxtYXRhci1pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IGxveWFsdHlQb2ludHNNZXRob2RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIExvYWRlck1vZHVsZSxcbiAgICBBc2lkZUNvbXBvbmVudCxcbiAgICBNYW5hZ2VCb29raW5nRmFpbGVkTW9kYWxDb21wb25lbnQsXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlbGVjdFJvb21zQ29tcG9uZW50LFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRTdW1tYXJ5Q29tcG9uZW50LFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRNZXRob2RDb21wb25lbnQsXG4gICAgQWxtYXRhckljb25Nb2R1bGUsXG4gICAgUmVzdWx0T3ZlcmxheUNvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU2VydmljZSxcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzU2VydmljZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIHByaXZhdGUgcmVhZG9ubHkgaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSA9IGluamVjdChcbiAgICBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlXG4gICk7XG5cbiAgcmVhZG9ubHkgYXV0b0NhbmNlbGxhdGlvblNlcnZpY2UgPSBpbmplY3QoXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlcnZpY2VcbiAgKTtcblxuICBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KEhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2UgPSBpbmplY3QoXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2VcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KFN0b3JlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzaGFyZWRTZXJ2aWNlID0gaW5qZWN0KFNoYXJlZFNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSG90ZWxCb29raW5nID0gaW5wdXQ8SUhvdGVsQm9va2luZ0RhdGEgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgY2FuY2VsbGF0aW9uU3VjY2VzcyA9IG91dHB1dDxJQXV0b0NhbmNlbGxhdGlvblByb2Nlc3NSZXNwb25zZT4oKTtcbiAgcmVhZG9ubHkgbm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjaGF0V2l0aEFnZW50ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgc2hvd0NvbmZpcm1Nb2RhbCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dFcnJvck1vZGFsID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0FzaWRlID0gc2lnbmFsKHRydWUpO1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBpc0NhbmNlbGxpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBob3RlbE1hbmFnZUVycm9yID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc051c2sgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzaG93UmVzdWx0T3ZlcmxheSA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHJlc3VsdE92ZXJsYXlEYXRhID0gc2lnbmFsPFJlc3VsdE92ZXJsYXlEYXRhIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJvb21zID0gc2lnbmFsPElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdPihbXSk7XG4gIHJlYWRvbmx5IHBhY2thZ2VzID0gc2lnbmFsPElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVtdPihbXSk7XG4gIHJlYWRvbmx5IGhvdGVsSW5mbyA9IHNpZ25hbDxJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkhvdGVsSW5mbyB8IG51bGw+KFxuICAgIG51bGxcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50Q3VycmVuY3kgPSBzaWduYWw8YW55PihudWxsKTtcbiAgcmVhZG9ubHkgcmVmdW5kRGV0YWlsc0RhdGEgPSBzaWduYWw8SUZsaWdodFJlZnVuZERldGFpbHNEYXRhIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkUGFja2FnZUlkcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICByZWFkb25seSByZWZ1bmRNZXRob2QgPSBzaWduYWw8UmVmdW5kUHJlZmVycmVkTWV0aG9kPignd2FsbGV0Jyk7XG4gIHJlYWRvbmx5IHJlZnVuZFJlc3BvbnNlRGF0YSA9IHNpZ25hbDxhbnk+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHN0ZXBFbnVtID0gQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtO1xuICByZWFkb25seSBjdXJyZW50U3RlcCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5hdXRvQ2FuY2VsbGF0aW9uU2VydmljZS5jdXJyZW50U3RlcCgpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNTaW5nbGVSb29tID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yb29tcygpLmxlbmd0aCA9PT0gMSk7XG4gIHJlYWRvbmx5IGlzU2luZ2xlUGFja2FnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFja2FnZXMoKS5sZW5ndGggPT09IDEpO1xuXG4gIC8vIEdldCBzdXBwbGllciBmcm9tIGJvb2tpbmcgb3IgZmlyc3QgcGFja2FnZVxuICByZWFkb25seSBib29raW5nU3VwcGxpZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJvb2tpbmcgPSB0aGlzLnNlbGVjdGVkSG90ZWxCb29raW5nKCk7XG4gICAgaWYgKCFib29raW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gVHJ5IHRvIGdldCBzdXBwbGllciBmcm9tIGJvb2tpbmcgbGV2ZWwgZmlyc3RcbiAgICBpZiAoKGJvb2tpbmcgYXMgYW55KS5zdXBwbGllcikge1xuICAgICAgcmV0dXJuIChib29raW5nIGFzIGFueSkuc3VwcGxpZXI7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGdldCBmcm9tIGZpcnN0IHBhY2thZ2VcbiAgICBjb25zdCBwYWNrYWdlcyA9IHRoaXMucGFja2FnZXMoKTtcbiAgICByZXR1cm4gcGFja2FnZXMubGVuZ3RoID4gMCA/IHBhY2thZ2VzWzBdLnN1cHBsaWVyIDogdW5kZWZpbmVkO1xuICB9KTtcblxuICAvLyBDb21wdXRlZCB0b3RhbHMgZm9yIGFkdWx0cywgY2hpbGRyZW4sIGluZmFudHMgZnJvbSBib29raW5nIHBhY2thZ2VzXG4gIHJlYWRvbmx5IHRvdGFsQWR1bHRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJvb2tpbmcgPSB0aGlzLnNlbGVjdGVkSG90ZWxCb29raW5nKCk7XG4gICAgaWYgKCFib29raW5nPy5wYWNrYWdlcykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBib29raW5nLnBhY2thZ2VzLnJlZHVjZSgodG90YWw6IG51bWJlciwgcGtnOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHJvb21zID0gcGtnLnJvb21zIHx8IFtdO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdG90YWwgK1xuICAgICAgICByb29tcy5yZWR1Y2UoKHN1bTogbnVtYmVyLCByb29tOiBhbnkpID0+IHN1bSArIChyb29tLmFkdWx0c051bSB8fCAwKSwgMClcbiAgICAgICk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRvdGFsQ2hpbGRyZW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYm9va2luZyA9IHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKTtcbiAgICBpZiAoIWJvb2tpbmc/LnBhY2thZ2VzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGJvb2tpbmcucGFja2FnZXMucmVkdWNlKCh0b3RhbDogbnVtYmVyLCBwa2c6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgcm9vbXMgPSBwa2cucm9vbXMgfHwgW107XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0b3RhbCArXG4gICAgICAgIHJvb21zLnJlZHVjZShcbiAgICAgICAgICAoc3VtOiBudW1iZXIsIHJvb206IGFueSkgPT4gc3VtICsgKHJvb20uY2hpbGRyZW5OdW0gfHwgMCksXG4gICAgICAgICAgMFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICByZWFkb25seSB0b3RhbEluZmFudHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYm9va2luZyA9IHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKTtcbiAgICBpZiAoIWJvb2tpbmc/LnBhY2thZ2VzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGJvb2tpbmcucGFja2FnZXMucmVkdWNlKCh0b3RhbDogbnVtYmVyLCBwa2c6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgcm9vbXMgPSBwa2cucm9vbXMgfHwgW107XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0b3RhbCArXG4gICAgICAgIHJvb21zLnJlZHVjZShcbiAgICAgICAgICAoc3VtOiBudW1iZXIsIHJvb206IGFueSkgPT4gc3VtICsgKHJvb20uaW5mYW50c051bSB8fCAwKSxcbiAgICAgICAgICAwXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFzaWRlVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcbiAgICBzd2l0Y2ggKHN0ZXApIHtcbiAgICAgIGNhc2UgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnNlbGVjdFJvb21zOlxuICAgICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZVBhY2thZ2UoKSA/ICdDb25maXJtIENhbmNlbGxhdGlvbicgOiAnU2VsZWN0IFJvb21zJztcbiAgICAgIGNhc2UgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnk6XG4gICAgICAgIHJldHVybiAnQ2FuY2VsIEJvb2tpbmcgUmVxdWVzdCc7XG4gICAgICBjYXNlIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bS5yZWZ1bmRNZXRob2Q6XG4gICAgICAgIHJldHVybiAnU2VsZWN0IFJlZnVuZCBNZXRob2QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdDYW5jZWwgQm9va2luZyc7XG4gICAgfVxuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5Ib3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nLm5leHQoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKVxuICAgICAgKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZEhvdGVsQm9va2luZycsIHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVmdW5kRGV0YWlsc0RhdGEnLCB0aGlzLnJlZnVuZERldGFpbHNEYXRhKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGNsb3NlSWNvbk5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldEFwcExhbmd1YWdlKCk7XG4gICAgcmV0dXJuIGxhbmcgPT09ICdhcicgPyAnYXJyb3ctbGVmdCcgOiAnYXJyb3ctcmlnaHQnO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLmxvYWRCb29raW5nRGF0YUZyb21QYWNrYWdlcygpO1xuICAgIHRoaXMuaW5pdEN1cnJlbmN5KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDdXJyZW5jeSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KGdldEN1cnJlbnRDdXJyZW5jeSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGN1cnJlbmN5KSA9PiAhIWN1cnJlbmN5KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGN1cnJlbmN5KSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudEN1cnJlbmN5LnNldChjdXJyZW5jeSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNTZXJ2aWNlLmNsZWFyU2VsZWN0ZWRQYWNrYWdlSWRzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xuICAgICAgICBpZiAocGFyYW1zWydza2lwQ2hlY2snXSkge1xuICAgICAgICAgIHRoaXMuaXNOdXNrLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRCb29raW5nRGF0YUZyb21QYWNrYWdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgY29uc3QgYm9va2luZyA9IHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKTtcblxuICAgIGlmIChib29raW5nKSB7XG4gICAgICB0aGlzLnByb2Nlc3NCb29raW5nRGF0YShib29raW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKChzZXJ2aWNlQm9va2luZykgPT4ge1xuICAgICAgICAgIGlmIChzZXJ2aWNlQm9va2luZykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQm9va2luZ0RhdGEoc2VydmljZUJvb2tpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NCb29raW5nRGF0YShib29raW5nOiBJSG90ZWxCb29raW5nRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGhvdGVsSW5mb0RhdGE6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uSG90ZWxJbmZvID0ge1xuICAgICAgaG90ZWxOYW1lOiBib29raW5nLmhvdGVsTmFtZSB8fCAnJyxcbiAgICAgIGhvdGVsSW1hZ2U6IGJvb2tpbmcuY292ZXJJbWFnZSB8fCAnJyxcbiAgICAgIGNoZWNrSW46IGJvb2tpbmcuZGF0ZUZyb20gfHwgYm9va2luZz8uZnJvbT8uX2ksXG4gICAgICBjaGVja091dDogYm9va2luZy5kYXRlVG8gfHwgYm9va2luZz8udG8/Ll9pLFxuICAgICAgdG90YWxSb29tczogYm9va2luZy5wYWNrYWdlcz8ubGVuZ3RoIHx8IGJvb2tpbmcucm9vbXMgfHwgMSxcbiAgICAgIG5pZ2h0czpcbiAgICAgICAgYm9va2luZy5udW1iZXJPZk5pZ2h0cyB8fFxuICAgICAgICBib29raW5nLm5pZ2h0TnVtYmVyIHx8XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTmlnaHRzKGJvb2tpbmcuZGF0ZUZyb20sIGJvb2tpbmcuZGF0ZVRvKSxcbiAgICAgIGNoZWNrSW5UaW1lOiBib29raW5nLmNoZWNrSW5UaW1lPy5zcGxpdCgnICcpWzBdLFxuICAgICAgY2hlY2tPdXRUaW1lOiBib29raW5nLmNoZWNrT3V0VGltZT8uc3BsaXQoJyAnKVswXVxuICAgIH07XG4gICAgdGhpcy5ob3RlbEluZm8uc2V0KGhvdGVsSW5mb0RhdGEpO1xuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0SG90ZWxJbmZvKGhvdGVsSW5mb0RhdGEpO1xuXG4gICAgLy8gTWFwIHRvIGJvdGggcm9vbXMgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSBhbmQgcGFja2FnZXMgKG5ldyBzdHJ1Y3R1cmUpXG4gICAgY29uc3QgbWFwcGVkUm9vbXMgPSB0aGlzLm1hcFBhY2thZ2VzVG9Sb29tcyhib29raW5nKTtcbiAgICB0aGlzLnJvb21zLnNldChtYXBwZWRSb29tcyk7XG5cbiAgICBjb25zdCBtYXBwZWRQYWNrYWdlcyA9IHRoaXMubWFwQm9va2luZ1RvUGFja2FnZXMoYm9va2luZyk7XG4gICAgdGhpcy5wYWNrYWdlcy5zZXQobWFwcGVkUGFja2FnZXMpO1xuXG4gICAgdGhpcy5hdXRvQ2FuY2VsbGF0aW9uU2VydmljZS5zZXRTZWxlY3RlZFJvb21zKG1hcHBlZFJvb21zKTtcblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG1hcFBhY2thZ2VzVG9Sb29tcyhcbiAgICBib29raW5nOiBhbnlcbiAgKTogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Sb29tW10ge1xuICAgIGNvbnN0IG5pZ2h0cyA9XG4gICAgICBib29raW5nLm51bWJlck9mTmlnaHRzIHx8XG4gICAgICBib29raW5nLm5pZ2h0TnVtYmVyIHx8XG4gICAgICB0aGlzLmNhbGN1bGF0ZU5pZ2h0cyhib29raW5nLmZyb20sIGJvb2tpbmcudG8pO1xuICAgIGNvbnN0IHBhY2thZ2VzOiBJQm9va2luZ1BhY2thZ2VbXSA9IGJvb2tpbmcucGFja2FnZXMgfHwgW107XG5cbiAgICByZXR1cm4gcGFja2FnZXMuZmxhdE1hcCgocGtnOiBJQm9va2luZ1BhY2thZ2UsIHBrZ0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHJvb21zID0gcGtnLnJvb21zIHx8IFtdO1xuICAgICAgcmV0dXJuIHJvb21zLm1hcCgocm9vbTogYW55LCByb29tSW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgcGFja2FnZUlkOiBwa2cuaWQgfHwgU3RyaW5nKHBrZ0luZGV4ICsgMSksXG4gICAgICAgIHJvb21JZDogcm9vbT8ucm9vbUlkIHx8IGAke3BrZy5pZH0tJHtyb29tSW5kZXh9YCxcbiAgICAgICAgcm9vbU5hbWU6IHJvb20/LnJvb21OYW1lIHx8IGBSb29tICR7cm9vbUluZGV4ICsgMX1gLFxuICAgICAgICByb29tVHlwZTogcm9vbT8ucm9vbVR5cGUgfHwgJ1N0YW5kYXJkIFJvb20nLFxuICAgICAgICBtZWFsUGxhbjogcm9vbT8ucm9vbUJhc2lzIHx8ICcnLFxuICAgICAgICBpc1JlZnVuZGFibGU6IHBrZy5pc1JlZnVuZGFibGUgIT09IGZhbHNlLFxuICAgICAgICBpc0NhbmNlbGxlZDogcGtnLmlzQ2FuY2VsbGVkLFxuICAgICAgICBtYW51YWxSZWZ1bmRSZXF1ZXN0OiAhcGtnLmlzUmVmdW5kYWJsZSxcbiAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIG5pZ2h0czogdGhpcy5ob3RlbEluZm8oKT8ubmlnaHRzIHx8IG5pZ2h0cyxcbiAgICAgICAgcm9vbUFtb3VudDogMCxcbiAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiAwLFxuICAgICAgICByZWZ1bmRBbW91bnQ6IDAsXG4gICAgICAgIGJlZFR5cGU6IHJvb20/LmJlZFR5cGUgfHwgJycsXG4gICAgICAgIHJvb21WaWV3OiByb29tPy5yb29tVmlldyB8fCAnJyxcbiAgICAgICAgcm9vbUJhc2lzOiByb29tPy5yb29tQmFzaXMgfHwgJycsXG4gICAgICAgIHJlZnVuZGFiaWxpdHk6IHBrZy5pc1JlZnVuZGFibGUsXG4gICAgICAgIHJlZnVuZGFibGVVbnRpbDogcGtnLnJlZnVuZGFibGVVbnRpbCB8fCAnJyxcbiAgICAgICAgYWR1bHRzTnVtOiByb29tPy5hZHVsdHNOdW0gfHwgMCxcbiAgICAgICAgY2hpbGRyZW5OdW06IHJvb20/LmNoaWxkcmVuTnVtIHx8IDAsXG4gICAgICAgIHBhc3Nlbmdlck5hbWU6IHJvb20/LnBhc3NlbmdlcnM/Lm5hbWUgfHwgJydcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQm9va2luZ1RvUGFja2FnZXMoXG4gICAgYm9va2luZzogYW55XG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVtdIHtcbiAgICBjb25zdCBib29raW5nUGFja2FnZXM6IElCb29raW5nUGFja2FnZVtdID0gYm9va2luZy5wYWNrYWdlcyB8fCBbXTtcblxuICAgIHJldHVybiBib29raW5nUGFja2FnZXMubWFwKChwa2c6IElCb29raW5nUGFja2FnZSwgcGtnSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgcm9vbXMgPSBwa2cucm9vbXMgfHwgW107XG4gICAgICBjb25zdCBmaXJzdFJvb20gPSByb29tc1swXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFja2FnZUlkOiBwa2cuaWQgfHwgU3RyaW5nKHBrZ0luZGV4ICsgMSksXG4gICAgICAgIHBhY2thZ2VOYW1lOiBmaXJzdFJvb20/LnJvb21OYW1lIHx8IGBQYWNrYWdlICR7cGtnSW5kZXggKyAxfWAsXG4gICAgICAgIGJvYXJkQmFzaXM6IGZpcnN0Um9vbT8ucm9vbUJhc2lzIHx8ICcnLFxuICAgICAgICBpc1JlZnVuZGFibGU6IHBrZy5pc1JlZnVuZGFibGUgIT09IGZhbHNlLFxuICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgaXNDYW5jZWxsZWQ6IHBrZy5pc0NhbmNlbGxlZCxcbiAgICAgICAgcmVmdW5kYWJpbGl0eTogcGtnLmlzUmVmdW5kYWJsZSxcbiAgICAgICAgcmVmdW5kYWJsZVVudGlsOiBwa2cucmVmdW5kYWJsZVVudGlsIHx8ICcnLFxuICAgICAgICByb29tczogcm9vbXMubWFwKChyb29tOiBhbnksIHJvb21JbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgIHJvb21JZDogcm9vbT8ucm9vbUlkIHx8IGAke3BrZy5pZH0tJHtyb29tSW5kZXh9YCxcbiAgICAgICAgICByb29tTmFtZTogcm9vbT8ucm9vbU5hbWUgfHwgYFJvb20gJHtyb29tSW5kZXggKyAxfWAsXG4gICAgICAgICAgcm9vbVR5cGU6IHJvb20/LnJvb21UeXBlIHx8ICdTdGFuZGFyZCBSb29tJyxcbiAgICAgICAgICBiZWRUeXBlOiByb29tPy5iZWRUeXBlIHx8ICcnLFxuICAgICAgICAgIHJvb21CYXNpczogcm9vbT8ucm9vbUJhc2lzIHx8ICcnXG4gICAgICAgIH0pKSxcbiAgICAgICAgcm9vbUFtb3VudDogMCxcbiAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiAwLFxuICAgICAgICByZWZ1bmRBbW91bnQ6IDAsXG4gICAgICAgIG1hbnVhbFJlZnVuZFJlcXVlc3Q6ICFwa2cuaXNSZWZ1bmRhYmxlLFxuICAgICAgICBjYW5jZWxsZWRCZWZvcmU6IGZhbHNlLFxuICAgICAgICBjYW5jZWxsYXRpb25Qb2xpY2llczogcGtnLmNhbmNlbGxhdGlvblBvbGljaWVzIHx8IFtdLFxuICAgICAgICBDYW5jZWxsYXRpb25Qb2xpY2llc1JlbWFya3M6IHBrZy5jYW5jZWxsYXRpb25Qb2xpY2llc1JlbWFya3MsXG4gICAgICAgIHN1cHBsaWVyOiBwa2cuc3VwcGxpZXJcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZU5pZ2h0cyhmcm9tOiBhbnksIHRvOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICghZnJvbSB8fCAhdG8pIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoZnJvbS5kaWZmICYmIHR5cGVvZiBmcm9tLmRpZmYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0by5kaWZmKGZyb20sICdkYXlzJykgfHwgMTtcbiAgICB9XG4gICAgY29uc3QgZnJvbURhdGUgPSBuZXcgRGF0ZShmcm9tKTtcbiAgICBjb25zdCB0b0RhdGUgPSBuZXcgRGF0ZSh0byk7XG4gICAgY29uc3QgZGlmZlRpbWUgPSBNYXRoLmFicyh0b0RhdGUuZ2V0VGltZSgpIC0gZnJvbURhdGUuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBkaWZmRGF5cyA9IE1hdGguY2VpbChkaWZmVGltZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XG4gICAgcmV0dXJuIGRpZmZEYXlzIHx8IDE7XG4gIH1cblxuICBvbkNvbnRpbnVlVG9DYW5jZWwoXG4gICAgc2VsZWN0ZWRQYWNrYWdlczogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25QYWNrYWdlW11cbiAgKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBwYWNrYWdlcyB0byByb29tcyBmb3JtYXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc2VydmljZVxuICAgIGNvbnN0IHNlbGVjdGVkUm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdID1cbiAgICAgIHNlbGVjdGVkUGFja2FnZXMuZmxhdE1hcCgocGtnKSA9PlxuICAgICAgICBwa2cucm9vbXMubWFwKChyb29tKSA9PiAoe1xuICAgICAgICAgIHBhY2thZ2VJZDogcGtnLnBhY2thZ2VJZCxcbiAgICAgICAgICByb29tSWQ6IHJvb20ucm9vbUlkLFxuICAgICAgICAgIHJvb21OYW1lOiByb29tLnJvb21OYW1lLFxuICAgICAgICAgIHJvb21UeXBlOiByb29tLnJvb21UeXBlLFxuICAgICAgICAgIG1lYWxQbGFuOiByb29tLnJvb21CYXNpcyxcbiAgICAgICAgICBpc1JlZnVuZGFibGU6IHBrZy5pc1JlZnVuZGFibGUsXG4gICAgICAgICAgaXNDYW5jZWxsZWQ6IHBrZy5pc0NhbmNlbGxlZCxcbiAgICAgICAgICBpc1NlbGVjdGVkOiBwa2cuaXNTZWxlY3RlZCxcbiAgICAgICAgICBuaWdodHM6IDAsXG4gICAgICAgICAgcm9vbUFtb3VudDogcGtnLnJvb21BbW91bnQsXG4gICAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiBwa2cuY2FuY2VsbGF0aW9uRmVlLFxuICAgICAgICAgIHJlZnVuZEFtb3VudDogcGtnLnJlZnVuZEFtb3VudCxcbiAgICAgICAgICBiZWRUeXBlOiByb29tLmJlZFR5cGUsXG4gICAgICAgICAgcm9vbUJhc2lzOiByb29tLnJvb21CYXNpcyxcbiAgICAgICAgICByZWZ1bmRhYmlsaXR5OiBwa2cucmVmdW5kYWJpbGl0eSxcbiAgICAgICAgICByZWZ1bmRhYmxlVW50aWw6IHBrZy5yZWZ1bmRhYmxlVW50aWwsXG4gICAgICAgICAgY2FuY2VsbGVkQmVmb3JlOiBwa2cuY2FuY2VsbGVkQmVmb3JlLFxuICAgICAgICAgIG1hbnVhbFJlZnVuZFJlcXVlc3Q6IHBrZy5tYW51YWxSZWZ1bmRSZXF1ZXN0XG4gICAgICAgIH0pKVxuICAgICAgKTtcblxuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0U2VsZWN0ZWRSb29tcyhzZWxlY3RlZFJvb21zKTtcbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlLnNldEN1cnJlbnRTdGVwKFxuICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnlcbiAgICApO1xuICB9XG5cbiAgb25LZWVwUm9vbSgpOiB2b2lkIHtcbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlLnNldEN1cnJlbnRTdGVwKFxuICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnNlbGVjdFJvb21zXG4gICAgKTtcbiAgfVxuXG4gIG9uU2VsZWN0UmVmdW5kT3B0aW9uKGRhdGE6IHtcbiAgICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbiAgICBwYXlvdXQ6IGFueTtcbiAgICB0b3RhbFJlZnVuZDogbnVtYmVyO1xuICAgIHJlc3BvbnNlRGF0YTogYW55O1xuICB9KTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGVuYW50IC0gcmVkaXJlY3QgdG8gV2hhdHNBcHAgZm9yIHRlbmFudCBib29raW5nc1xuICAgIGlmIChlbnZpcm9ubWVudHMuaXNUZW5hbnQpIHtcbiAgICAgIHRoaXMuaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZS5zZXRBY3RpdmVBc2lkZVRhYihcbiAgICAgICAgSG90ZWxNYW5hZ2VCb29raW5nQXNpZGVUYWJFbnVtLndoYXRzQXBwQWdlbnRcbiAgICAgICk7XG4gICAgICB0aGlzLnNob3dBc2lkZS5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdSZWZ1bmQgb3B0aW9uIHNlbGVjdGVkOicsIGRhdGEpO1xuXG4gICAgdGhpcy5zZWxlY3RlZFBhY2thZ2VJZHMuc2V0KGRhdGEucGFja2FnZUlkcyk7XG4gICAgdGhpcy5yZWZ1bmRSZXNwb25zZURhdGEuc2V0KGRhdGEucmVzcG9uc2VEYXRhKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZGF0YT8ucmVzcG9uc2VEYXRhO1xuICAgIGNvbnN0IHBheW91dCA9IHJlc3BvbnNlPy5wYXlvdXQgfHwgZGF0YS5wYXlvdXQ7XG4gICAgY29uc3QgdG90YWxzID0gcmVzcG9uc2U/LnRvdGFscztcblxuICAgIC8vIGNvbnN0IHdhbGxldFJlZnVuZCA9IHBheW91dD8ud2FsbGV0IHx8IHBheW91dD8ubG95YWx0eVRvV2FsbGV0O1xuICAgIGNvbnN0IHdhbGxldFJlZnVuZCA9IHBheW91dD8ud2FsbGV0O1xuXG4gICAgY29uc3QgY2FyZFJlZnVuZCA9IHBheW91dD8uY2FyZCA/PyAwO1xuICAgIGNvbnN0IHRhYmJ5UmVmdW5kID0gcGF5b3V0Py50YWJieSA/PyBwYXlvdXQ/LnRhYmJ5ID8/IDA7XG4gICAgY29uc3QgdGFtYXJhUmVmdW5kID0gcGF5b3V0Py50YW1hcmEgPz8gcGF5b3V0Py50YW1hcmEgPz8gMDtcblxuICAgIC8vIENoZWNrIGlmIGZ1bGwgd2FsbGV0IHJlZnVuZCBpcyBhbGxvd2VkIGJhc2VkIG9uIHBheW91dCBicmVha2Rvd25cbiAgICAvLyBXYWxsZXQgcmVmdW5kIGlzIGFsbG93ZWQgaWYgdGhlcmUncyBubyBjYXJkL3RhYmJ5L3RhbWFyYSBwb3J0aW9uXG4gICAgY29uc3QgaGFzTm9uV2FsbGV0UmVmdW5kID0gdGFiYnlSZWZ1bmQgPiAwIHx8IHRhbWFyYVJlZnVuZCA+IDA7XG4gICAgY29uc3QgdG90YWxSZWZ1bmRBbW91bnQgPSBwYXlvdXQ/LmN1cnJlbnQgPz8gZGF0YS50b3RhbFJlZnVuZDtcbiAgICBjb25zdCBpc0Z1bGxXYWxsZXRBbGxvd2VkID1cbiAgICAgICghaGFzTm9uV2FsbGV0UmVmdW5kICYmIHdhbGxldFJlZnVuZCA+IDApIHx8IGNhcmRSZWZ1bmQgPiAwO1xuXG4gICAgY29uc3QgbG95YWx0eVBvaW50c1ZhbHVlID1cbiAgICAgIHBheW91dD8ubG95YWx0eVRvV2FsbGV0IHx8XG4gICAgICB0b3RhbHM/LndhbGEgfHxcbiAgICAgIHRvdGFscz8ucWl0YWYgfHxcbiAgICAgIHRvdGFscz8ubW9rYWZhIHx8XG4gICAgICB0b3RhbHM/Lmhhc3NhZCB8fFxuICAgICAgdG90YWxzPy55Z2c7XG5cbiAgICAvLyBCdWlsZCByZWZ1bmQgZGV0YWlscyBkYXRhIGZvciB0aGUgbWV0aG9kIHNlbGVjdG9yXG4gICAgdGhpcy5yZWZ1bmREZXRhaWxzRGF0YS5zZXQoe1xuICAgICAgdG90YWxSZWZ1bmRBbW91bnQsXG4gICAgICB3YWxsZXRSZWZ1bmRBbW91bnQ6IHBheW91dD8ud2FsbGV0LFxuICAgICAgdG90YWxDYXJkUmVmdW5kQW1vdW50OiBjYXJkUmVmdW5kICsgdGFiYnlSZWZ1bmQgKyB0YW1hcmFSZWZ1bmQsXG4gICAgICBpc0Z1bGxXYWxsZXRSZWZ1bmRBbGxvd2VkOiBpc0Z1bGxXYWxsZXRBbGxvd2VkLFxuICAgICAgY3VycmVuY3k6IHJlc3BvbnNlPy5jdXJyZW5jeSxcbiAgICAgIGlzUmVmdW5kYWJsZTogcmVzcG9uc2U/LmZsYWdzPy5yZWZ1bmRhYmxlLFxuICAgICAgdG90YWxMb3lhbHR5UG9pbnRzUmVmdW5kQW1vdW50OiBsb3lhbHR5UG9pbnRzVmFsdWUsXG4gICAgICAvLyBQYXNzIHBheW1lbnQgbWV0aG9kIGluZm8gZm9yIHByb3BlciBsYWJlbGluZ1xuICAgICAgcGF5bWVudE1ldGhvZEN1c3RvbWVyVXNlZDogdGhpcy5kZXRlcm1pbmVQYXltZW50TWV0aG9kKHRvdGFscywgcGF5b3V0KSxcbiAgICAgIC8vIEFkZGl0aW9uYWwgZmllbGRzIGZvciBwcm9wZXIgbG95YWx0eSBwcm9ncmFtIGxhYmVsaW5nIGFuZCBzcGxpdCByZWZ1bmQgZGlzcGxheVxuICAgICAgbG95YWx0eVBheW1lbnRUeXBlOiB0aGlzLmRldGVybWluZUxveWFsdHlUeXBlKHRvdGFscywgcGF5b3V0KSxcbiAgICAgIHRvdGFsTG95YWx0eVBvaW50czogbG95YWx0eVBvaW50c1ZhbHVlLFxuICAgICAgYm9va2luZ0lkOiB0aGlzLnNlbGVjdGVkSG90ZWxCb29raW5nKCk/LmJvb2tpbmdJZFxuICAgIH0pO1xuXG4gICAgLy8gRGVmYXVsdCB0byB3YWxsZXQgaWYgYWxsb3dlZCwgb3RoZXJ3aXNlIG9yaWdpbmFsUGF5bWVudE1ldGhvZFxuICAgIGlmIChpc0Z1bGxXYWxsZXRBbGxvd2VkICYmIHdhbGxldFJlZnVuZCA+IDApIHtcbiAgICAgIHRoaXMucmVmdW5kTWV0aG9kLnNldCgnd2FsbGV0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmdW5kTWV0aG9kLnNldCgnb3JpZ2luYWxQYXltZW50TWV0aG9kJyk7XG4gICAgfVxuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0ucmVmdW5kTWV0aG9kXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBwYXltZW50IG1ldGhvZCBsYWJlbCBiYXNlZCBvbiB0b3RhbHMvcGF5b3V0IGJyZWFrZG93bi5cbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZ2F0ZXdheSBjb2RlIGZvciBwcm9wZXIgbGFiZWxpbmcuXG4gICAqL1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgY2FyZC9pbnN0YWxsbWVudCBwYXltZW50IG1ldGhvZCBmb3IgdGhlIGNhcmQgcm93IGxhYmVsLlxuICAgKiBMb3lhbHR5IHByb2dyYW1zIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgZGV0ZXJtaW5lTG95YWx0eVR5cGUoKS5cbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lUGF5bWVudE1ldGhvZCh0b3RhbHM6IGFueSwgcGF5b3V0OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICgocGF5b3V0Py50YWJieSA/PyB0b3RhbHM/LnRhYmJ5ID8/IDApID4gMCkge1xuICAgICAgcmV0dXJuICdUQic7IC8vIFRhYmJ5XG4gICAgfVxuICAgIGlmICgocGF5b3V0Py50YW1hcmEgPz8gdG90YWxzPy50YW1hcmEgPz8gMCkgPiAwKSB7XG4gICAgICByZXR1cm4gJ1RNJzsgLy8gVGFtYXJhXG4gICAgfVxuICAgIGlmICgocGF5b3V0Py5jYXJkID8/IHRvdGFscz8uY2FyZCA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnQ0gnOyAvLyBDYXJkXG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBsb3lhbHR5IHBheW1lbnQgdHlwZSBmb3IgcHJvcGVyIGxhYmVsaW5nIGluIHNwbGl0IHJlZnVuZCByb3dzLlxuICAgKiBSZXR1cm5zIHRoZSBsb3lhbHR5IHByb2dyYW0gY29kZSAoZS5nLiwgJ1FJVEFGJywgJ1JBSkhJJykgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lTG95YWx0eVR5cGUoXG4gICAgdG90YWxzOiBhbnksXG4gICAgcGF5b3V0OiBhbnlcbiAgKTogTG95YWx0eVBheW1lbnRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoKHRvdGFscz8ubW9rYWZhID8/IDApID4gMCkge1xuICAgICAgcmV0dXJuICdBbFJhamhpTW9rYWZhYSc7XG4gICAgfVxuICAgIGlmICgodG90YWxzPy5xaXRhZiA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnUWl0YWYnO1xuICAgIH1cbiAgICBpZiAoKHRvdGFscz8ud2FsYSA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnV2FsYSc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIChwYXlvdXQ/LmxveWFsdHlUb1dhbGxldCA/PyAwKSA+IDAgfHxcbiAgICAgIChwYXlvdXQ/LmxveWFsdHlQb2ludHMgPz8gMCkgPiAwXG4gICAgKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgc3BlY2lmaWMgbG95YWx0eSB0eXBlIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCBsb3lhbHR5VHlwZSA9IHRvdGFscz8ubG95YWx0eVR5cGUgYXMgTG95YWx0eVBheW1lbnRUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBsb3lhbHR5VHlwZSAmJlxuICAgICAgICBbXG4gICAgICAgICAgJ0FsUmFqaGlNb2thZmFhJyxcbiAgICAgICAgICAnUWl0YWYnLFxuICAgICAgICAgICdXYWxhJyxcbiAgICAgICAgICAnQUxGVVJTQU4nLFxuICAgICAgICAgICdBTE1BVEFSX1BPSU5UUydcbiAgICAgICAgXS5pbmNsdWRlcyhsb3lhbHR5VHlwZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbG95YWx0eVR5cGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBvbk1ldGhvZFNlbGVjdGVkKG1ldGhvZDogUmVmdW5kUHJlZmVycmVkTWV0aG9kKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1bmRNZXRob2Quc2V0KG1ldGhvZCk7XG4gIH1cblxuICBvbkJhY2tGcm9tUmVmdW5kTWV0aG9kKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0ucmVmdW5kU3VtbWFyeVxuICAgICk7XG4gIH1cblxuICBvbkdvQmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5jdXJyZW50U3RlcCgpO1xuICAgIHN3aXRjaCAoc3RlcCkge1xuICAgICAgY2FzZSBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0ucmVmdW5kU3VtbWFyeTpcbiAgICAgICAgdGhpcy5hdXRvQ2FuY2VsbGF0aW9uU2VydmljZS5zZXRDdXJyZW50U3RlcChcbiAgICAgICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0uc2VsZWN0Um9vbXNcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bS5yZWZ1bmRNZXRob2Q6XG4gICAgICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBGb3Igc2VsZWN0Um9vbXMgb3Igb3RoZXIgc3RlcHMsIGRvIG5vdGhpbmcgKGNsb3NlIG1vZGFsKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBjYW5Hb0JhY2soKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RlcCA9PT0gQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnkgfHxcbiAgICAgIHN0ZXAgPT09IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bS5yZWZ1bmRNZXRob2RcbiAgICApO1xuICB9XG5cbiAgY29uZmlybUNhbmNlbGxhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2FuY2VsbGluZy5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNTZXJ2aWNlXG4gICAgICAucHJvY2Vzc0F1dG9DYW5jZWxsYXRpb24odGhpcy5zZWxlY3RlZFBhY2thZ2VJZHMoKSwgdGhpcy5yZWZ1bmRNZXRob2QoKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNDYW5jZWxsaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5zaG93QXNpZGUuc2V0KGZhbHNlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRlbmFudCAtIHJlZGlyZWN0IHRvIFdoYXRzQXBwXG4gICAgICAgICAgaWYgKGVudmlyb25tZW50cy5pc1RlbmFudCB8fCByZXNwb25zZT8uZGF0YT8uaXNXaGF0c0FwcCkge1xuICAgICAgICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNldEFjdGl2ZUFzaWRlVGFiKFxuICAgICAgICAgICAgICBIb3RlbE1hbmFnZUJvb2tpbmdBc2lkZVRhYkVudW0ud2hhdHNBcHBBZ2VudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgb3ZlcmxheVxuICAgICAgICAgIHRoaXMucmVzdWx0T3ZlcmxheURhdGEuc2V0KHtcbiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIHRpdGxlOiAnQ2FuY2VsbGF0aW9uIFN1Y2Nlc3NmdWwhJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICdZb3VyIGJvb2tpbmcgaGFzIGJlZW4gY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseS4gVGhlIHJlZnVuZCB3aWxsIGJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8geW91ciBzZWxlY3RlZCBtZXRob2QuJyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnRG9uZSdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNob3dSZXN1bHRPdmVybGF5LnNldCh0cnVlKTtcblxuICAgICAgICAgIC8vIEFsc28gZW1pdCBmb3IgcGFyZW50IGNvbXBvbmVudCBpZiBuZWVkZWRcbiAgICAgICAgICB0aGlzLmNhbmNlbGxhdGlvblN1Y2Nlc3MuZW1pdChyZXNwb25zZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmlzQ2FuY2VsbGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc2hvd0FzaWRlLnNldChmYWxzZSk7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IGVycm9yIG1lc3NhZ2UgZnJvbSB2YXJpb3VzIHBvc3NpYmxlIHN0cnVjdHVyZXNcbiAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ1dlIGVuY291bnRlcmVkIGFuIGlzc3VlIHByb2Nlc3NpbmcgeW91ciBjYW5jZWxsYXRpb24uIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0Lic7XG5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5jZWxsYXRpb24gZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgICAgaWYgKGVycm9yPy5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3IuZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yPy5lcnJvcj8uZXJyb3JzICYmIEFycmF5LmlzQXJyYXkoZXJyb3IuZXJyb3IuZXJyb3JzKSAmJiBlcnJvci5lcnJvci5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3IuZXJyb3IuZXJyb3JzWzBdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaG93IGVycm9yIG92ZXJsYXlcbiAgICAgICAgICB0aGlzLnJlc3VsdE92ZXJsYXlEYXRhLnNldCh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdDYW5jZWxsYXRpb24gRmFpbGVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnQ2xvc2UnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zaG93UmVzdWx0T3ZlcmxheS5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25DbG9zZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uTm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MocGFja2FnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FzaWRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgb3ZlcmxheSBmb3Igbm9uLXJlZnVuZGFibGUgcmVxdWVzdFxuICAgIHRoaXMucmVzdWx0T3ZlcmxheURhdGEuc2V0KHtcbiAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgIHRpdGxlOiAnUmVxdWVzdCBTdWJtaXR0ZWQhJyxcbiAgICAgIG1lc3NhZ2U6IGBZb3VyIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciAke3BhY2thZ2VOYW1lfSBoYXMgYmVlbiBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LiBPdXIgdGVhbSB3aWxsIHJldmlldyB5b3VyIHJlcXVlc3QgYW5kIGNvbnRhY3QgeW91IHNob3J0bHkuYCxcbiAgICAgIGNvbmZpcm1UZXh0OiAnRG9uZSdcbiAgICB9KTtcbiAgICB0aGlzLnNob3dSZXN1bHRPdmVybGF5LnNldCh0cnVlKTtcblxuICAgIC8vIEFsc28gZW1pdCBmb3IgcGFyZW50IGNvbXBvbmVudCBpZiBuZWVkZWRcbiAgICB0aGlzLm5vblJlZnVuZGFibGVTdWJtaXRTdWNjZXNzLmVtaXQocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgb25DaGF0V2l0aEFnZW50KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FzaWRlLnNldChmYWxzZSk7XG4gICAgdGhpcy5jaGF0V2l0aEFnZW50LmVtaXQoKTtcbiAgfVxuXG4gIGNsb3NlQWxsTW9kYWxzKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Nb2RhbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2hvd0Vycm9yTW9kYWwuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnNob3dBc2lkZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uUmVzdWx0T3ZlcmxheUNvbmZpcm0oKTogdm9pZCB7XG4gICAgdGhpcy5zaG93UmVzdWx0T3ZlcmxheS5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzdWx0T3ZlcmxheURhdGEuc2V0KG51bGwpO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uUmVzdWx0T3ZlcmxheUNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dSZXN1bHRPdmVybGF5LnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXN1bHRPdmVybGF5RGF0YS5zZXQobnVsbCk7XG4gIH1cbn1cbiIsIkBpZiAoc2hvd0FzaWRlKCkpIHtcbiAgPGFsbWF0YXItYXNpZGVcblxuICAgIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fd3JhcHBlclwiXG4gICAgW2FzaWRlVGl0bGVdPVwiYXNpZGVUaXRsZSgpXCJcbiAgICBbc2hvd0FzaWRlXT1cInNob3dBc2lkZSgpXCJcbiAgICBbd2hpdGVIZWFkZXJdPVwidHJ1ZVwiXG4gICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgIChvbkNsb3NlKT1cIm9uQ2xvc2VNb2RhbCgpXCJcbiAgPlxuICAgIDwhLS0gQ3VzdG9tIEhlYWRlciB3aXRoIDYwcHggaGVpZ2h0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9faGVhZGVyXCI+XG4gICAgICBAaWYgKGNhbkdvQmFjaygpKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9faGVhZGVyLWJhY2tcIiAoY2xpY2spPVwib25Hb0JhY2soKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWFycm93LWxlZnRcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItY29udGVudFwiPlxuICAgICAgICBAaWYgKGN1cnJlbnRTdGVwKCkgPT09IHN0ZXBFbnVtLnNlbGVjdFJvb21zKSB7XG4gICAgICAgICAgPGgyIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci10aXRsZVwiPlxuICAgICAgICAgICAgQGlmIChpc1NpbmdsZVBhY2thZ2UoKSkge1xuICAgICAgICAgICAgICBDYW5jZWwgUm9vbXNcbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBTZWxlY3QgUm9vbXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci1zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgQGlmIChpc1NpbmdsZVBhY2thZ2UoKSkge1xuICAgICAgICAgICAgICBSZXZpZXcgYW5kIGNvbmZpcm0geW91ciBjYW5jZWxsYXRpb25cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBDaG9vc2Ugd2hpY2ggcm9vbShzKSB5b3UnZCBsaWtlIHRvIGNhbmNlbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfSBAZWxzZSBpZiAoY3VycmVudFN0ZXAoKSA9PT0gc3RlcEVudW0ucmVmdW5kU3VtbWFyeSkge1xuICAgICAgICAgIDxoMiBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItdGl0bGVcIj5DYW5jZWwgQm9va2luZyBSZXF1ZXN0PC9oMj5cbiAgICAgICAgICA8cCBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItc3VidGl0bGVcIj5SZXZpZXcgeW91ciByZWZ1bmQgc3VtbWFyeSBhbmQgcHJvY2VlZDwvcD5cbiAgICAgICAgfSBAZWxzZSBpZiAoY3VycmVudFN0ZXAoKSA9PT0gc3RlcEVudW0ucmVmdW5kTWV0aG9kKSB7XG4gICAgICAgICAgPGgyIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci10aXRsZVwiPlNlbGVjdCBSZWZ1bmQgTWV0aG9kPC9oMj5cbiAgICAgICAgICA8cCBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItc3VidGl0bGVcIj5DaG9vc2UgaG93IHlvdSdkIGxpa2UgdG8gcmVjZWl2ZSB5b3VyIHJlZnVuZDwvcD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGgyIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci10aXRsZVwiPnt7IGFzaWRlVGl0bGUoKSB9fTwvaDI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9faGVhZGVyLXN1YnRpdGxlXCI+Q29tcGxldGUgeW91ciBib29raW5nIGNhbmNlbGxhdGlvbjwvcD5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci1jbG9zZVwiIChjbGljayk9XCJvbkNsb3NlTW9kYWwoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS10aW1lc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19jb21wb25lbnRcIiBbY2xhc3MuaXNOdXNrXT1cImlzTnVzaygpXCI+XG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9fbG9hZGluZ1wiPlxuICAgICAgICAgIDxhcHAtbG9hZGVyPjwvYXBwLWxvYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoY3VycmVudFN0ZXAoKSA9PT0gc3RlcEVudW0uc2VsZWN0Um9vbXMgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgIDxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXNlbGVjdC1yb29tc1xuICAgICAgICAgIFtwYWNrYWdlc109XCJwYWNrYWdlcygpXCJcbiAgICAgICAgICBbaG90ZWxJbmZvXT1cImhvdGVsSW5mbygpXCJcbiAgICAgICAgICBbYm9va2luZ0lkXT1cInNlbGVjdGVkSG90ZWxCb29raW5nKCk/LmJvb2tpbmdJZFwiXG4gICAgICAgICAgW2hvdGVsSWRdPVwic2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uaG90ZWxJZFwiXG4gICAgICAgICAgW2N1cnJlbmN5Q29kZV09XCJzZWxlY3RlZEhvdGVsQm9va2luZygpPy5jdXJyZW5jeUNvZGUgfHwgJ1NBUidcIlxuICAgICAgICAgIChjb250aW51ZVRvQ2FuY2VsKT1cIm9uQ29udGludWVUb0NhbmNlbCgkZXZlbnQpXCJcbiAgICAgICAgICAoY2xvc2VNb2RhbCk9XCJvbkNsb3NlTW9kYWwoKVwiXG4gICAgICAgICAgKG5vblJlZnVuZGFibGVTdWJtaXRTdWNjZXNzKT1cIm9uTm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MoJGV2ZW50KVwiXG4gICAgICAgICAgKGNoYXRXaXRoQWdlbnQpPVwib25DaGF0V2l0aEFnZW50KClcIlxuICAgICAgICAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGN1cnJlbnRTdGVwKCkgPT09IHN0ZXBFbnVtLnJlZnVuZFN1bW1hcnkgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgIDxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5XG4gICAgICAgICAgW3NlbGVjdGVkUm9vbXNdPVwiYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2VsZWN0ZWRSb29tcygpXCJcbiAgICAgICAgICBbYm9va2luZ0lkXT1cInNlbGVjdGVkSG90ZWxCb29raW5nKCk/LmJvb2tpbmdJZFwiXG4gICAgICAgICAgW2hvdGVsSWRdPVwic2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uaWQgfHwgc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uaHBrXCJcbiAgICAgICAgICBbaG90ZWxJbmZvXT1cImhvdGVsSW5mbygpXCJcbiAgICAgICAgICBbc2VsZWN0aW9uU2tpcHBlZF09XCJwYWNrYWdlcygpLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgICAoa2VlcFJvb20pPVwib25LZWVwUm9vbSgpXCJcbiAgICAgICAgICAoc2VsZWN0UmVmdW5kT3B0aW9uKT1cIm9uU2VsZWN0UmVmdW5kT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgIChjbG9zZU1vZGFsKT1cIm9uQ2xvc2VNb2RhbCgpXCJcbiAgICAgICAgLz5cbiAgICAgIH1cblxuICAgICAgQGlmIChjdXJyZW50U3RlcCgpID09PSBzdGVwRW51bS5yZWZ1bmRNZXRob2QgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgIDxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1tZXRob2RcbiAgICAgICAgICBbcmVmdW5kRGV0YWlsc0RhdGFdPVwicmVmdW5kRGV0YWlsc0RhdGEoKVwiXG4gICAgICAgICAgW2N1cnJlbmN5T2JqXT1cImN1cnJlbnRDdXJyZW5jeSgpXCJcbiAgICAgICAgICBbcmVmdW5kTWV0aG9kXT1cInJlZnVuZE1ldGhvZCgpXCJcbiAgICAgICAgICBbaXNDYW5jZWxsaW5nXT1cImlzQ2FuY2VsbGluZygpXCJcbiAgICAgICAgICAobWV0aG9kU2VsZWN0ZWQpPVwib25NZXRob2RTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoYmFja1JlcXVlc3RlZCk9XCJvbkJhY2tGcm9tUmVmdW5kTWV0aG9kKClcIlxuICAgICAgICAgIChjb25maXJtUmVxdWVzdGVkKT1cImNvbmZpcm1DYW5jZWxsYXRpb24oKVwiXG4gICAgICAgICAgKGNsb3NlTW9kYWwpPVwib25DbG9zZU1vZGFsKClcIlxuICAgICAgICAgIFtib29raW5nSWRdPVwic2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uYm9va2luZ0lkXCJcbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9hbG1hdGFyLWFzaWRlPlxufVxuXG5AaWYgKHNob3dFcnJvck1vZGFsKCkpIHtcbiAgPGRpdlxuICAgIGFsbWF0YXItbWFuYWdlLWJvb2tpbmctZmFpbGVkLW1vZGFsXG4gICAgW2Vycm9yTWVzc2FnZV09XCJob3RlbE1hbmFnZUVycm9yKClcIlxuICAgIChjYW5jZWxFdmVudCk9XCJjbG9zZUFsbE1vZGFscygpXCJcbiAgICAoY29uZmlybUV2ZW50KT1cImNsb3NlQWxsTW9kYWxzKClcIlxuICA+PC9kaXY+XG59XG5cbkBpZiAoc2hvd1Jlc3VsdE92ZXJsYXkoKSAmJiByZXN1bHRPdmVybGF5RGF0YSgpKSB7XG4gIDxhcHAtcmVzdWx0LW92ZXJsYXlcbiAgICBbZGF0YV09XCJyZXN1bHRPdmVybGF5RGF0YSgpIVwiXG4gICAgW3Nob3ddPVwic2hvd1Jlc3VsdE92ZXJsYXkoKVwiXG4gICAgKGNvbmZpcm0pPVwib25SZXN1bHRPdmVybGF5Q29uZmlybSgpXCJcbiAgICAoY2FuY2VsKT1cIm9uUmVzdWx0T3ZlcmxheUNhbmNlbCgpXCJcbiAgLz5cbn1cbiJdfQ==
|