@almatar/smart-booking-dashboard 0.0.2-alpha.2 → 0.0.2-alpha.4
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/almatar-aside/aside.component.mjs +6 -7
- package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +17 -12
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +9 -3
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.mjs +210 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +3 -3
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +4 -4
- package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +11 -4
- package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +23 -21
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +42 -34
- 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/workflow-actions/workflow-actions.component.mjs +5 -3
- package/esm2022/lib/config/dashboard.config.mjs +3 -1
- package/esm2022/lib/models/reissue.types.mjs +2 -0
- package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +9 -3
- package/esm2022/lib/services/reissue.service.mjs +142 -0
- package/esm2022/lib/services/toast.service.mjs +15 -7
- 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 +2211 -102
- 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.component.d.ts +1 -2
- package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +3 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +1 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.d.ts +46 -0
- package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +2 -1
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +6 -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/workflow-actions/workflow-actions.component.d.ts +3 -1
- package/lib/config/dashboard.config.d.ts +29 -0
- package/lib/models/reissue.types.d.ts +147 -0
- package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +4 -1
- package/lib/services/reissue.service.d.ts +45 -0
- package/lib/services/toast.service.d.ts +14 -1
- package/lib/utils/reissue-format.d.ts +28 -0
- package/lib/utils/reissue-url.builder.d.ts +24 -0
- package/package.json +9 -7
- package/public-api.d.ts +5 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { Injectable, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { EMPTY, Subject, of, throwError } from 'rxjs';
|
|
4
|
+
import { catchError, debounceTime, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';
|
|
5
|
+
import { SBD_CONFIG } from '../../config/dashboard.config';
|
|
6
|
+
import { SbdReissueService } from '../../services/reissue.service';
|
|
7
|
+
import { buildReissueBookingContext, buildReissueSearchUrl } from '../../utils/reissue-url.builder';
|
|
8
|
+
import { destinationAirport, formatReissueDate, formatShortDate, formatTime, isLegFlown, legTitle, originAirport, todayIso, } from '../../utils/reissue-format';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export function buildLegRow(leg, available, selected, unavailableReason = 'offline') {
|
|
11
|
+
const flown = isLegFlown(leg);
|
|
12
|
+
return {
|
|
13
|
+
leg,
|
|
14
|
+
direction: leg.direction,
|
|
15
|
+
from: leg.originCode,
|
|
16
|
+
to: leg.destinationCode,
|
|
17
|
+
dateLabel: formatShortDate(leg.departure),
|
|
18
|
+
depTime: formatTime(leg.departure),
|
|
19
|
+
arrTime: formatTime(leg.arrival),
|
|
20
|
+
stopsLabel: leg.stops > 0 ? `${leg.stops} stop${leg.stops > 1 ? 's' : ''}` : 'Direct',
|
|
21
|
+
airlineLine: [leg.airline, leg.flightNo].filter(Boolean).join(' · '),
|
|
22
|
+
flown,
|
|
23
|
+
available: available && !flown,
|
|
24
|
+
reason: flown ? 'flown' : available ? null : unavailableReason,
|
|
25
|
+
selected: selected && !flown,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const START_ERROR = 'Could not start the reissue request.';
|
|
29
|
+
const AVAILABILITY_ERROR = 'Could not check availability for this booking.';
|
|
30
|
+
/** `base (HTTP 500: message from the backend)` — so the agent (and we, while the APIs are new) can see why it failed. */
|
|
31
|
+
function describeHttpError(base, e) {
|
|
32
|
+
const err = e;
|
|
33
|
+
// The backend sends both: `error` (the real reason, e.g. "Unauthorized!") and a generic `message`.
|
|
34
|
+
const body = typeof err?.error === 'string' ? [err.error] : [err?.error?.error, err?.error?.message];
|
|
35
|
+
const text = body.filter(Boolean).join(' — ').slice(0, 200);
|
|
36
|
+
const detail = [err?.status ? `HTTP ${err.status}` : '', text].filter(Boolean).join(': ');
|
|
37
|
+
return detail ? `${base} (${detail})` : base;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* State + rules of the Reissue dialog (one instance per dialog, provided by the dialog component).
|
|
41
|
+
* The step components are presentational: they get view models from here through the dialog shell.
|
|
42
|
+
*/
|
|
43
|
+
export class SbdReissueStore {
|
|
44
|
+
constructor() {
|
|
45
|
+
this.api = inject(SbdReissueService);
|
|
46
|
+
this.config = inject(SBD_CONFIG);
|
|
47
|
+
this.today = todayIso();
|
|
48
|
+
// ── state ─────────────────────────────────────────────────────────────────
|
|
49
|
+
this.booking = signal(null);
|
|
50
|
+
this.step = signal('service');
|
|
51
|
+
this.loading = signal(false);
|
|
52
|
+
this.error = signal(null);
|
|
53
|
+
this.postBookingId = signal('');
|
|
54
|
+
this.service = signal(null);
|
|
55
|
+
/** Raw upgrade-class response; `null` when not loaded / not offered. Read by `SbdReissueUpgradeStore`. */
|
|
56
|
+
this.upgradeOptions = signal(null);
|
|
57
|
+
this.upgradeAvailable = computed(() => this.api.hasUpgradeOptions(this.upgradeOptions()));
|
|
58
|
+
this.availableIds = signal(new Set());
|
|
59
|
+
/** The availability call answered (so "no leg available" is a real answer, not "still loading"). */
|
|
60
|
+
this.availabilityLoaded = signal(false);
|
|
61
|
+
this.selectedLegIds = signal([]);
|
|
62
|
+
/** The "select flight" step was skipped (one-way): Back from the edit step returns to the service list. */
|
|
63
|
+
this.legsStepSkipped = signal(false);
|
|
64
|
+
this.dateEdits = signal({});
|
|
65
|
+
this.routeEdits = signal({});
|
|
66
|
+
this.searchedAirports = signal([]);
|
|
67
|
+
this.load$ = new Subject();
|
|
68
|
+
this.airportTerm$ = new Subject();
|
|
69
|
+
// ── derived ───────────────────────────────────────────────────────────────
|
|
70
|
+
this.ctx = computed(() => {
|
|
71
|
+
const b = this.booking();
|
|
72
|
+
return b ? buildReissueBookingContext(b.data, b.id) : null;
|
|
73
|
+
});
|
|
74
|
+
this.legs = computed(() => this.ctx()?.legs ?? []);
|
|
75
|
+
this.selectedSet = computed(() => new Set(this.selectedLegIds()));
|
|
76
|
+
this.selectedLegs = computed(() => this.legs().filter(l => this.selectedSet().has(l.legId)));
|
|
77
|
+
this.legRows = computed(() => this.legs().map(leg => buildLegRow(leg, this.availableIds().has(leg.legId), this.selectedSet().has(leg.legId))));
|
|
78
|
+
/** `false` = a round trip must be upgraded as a whole (availability's `allowCustomerToSelectSingleLeg`). */
|
|
79
|
+
this.allowSingleLegSelection = signal(true);
|
|
80
|
+
this.anyAvailable = computed(() => this.legRows().some(r => r.available));
|
|
81
|
+
/**
|
|
82
|
+
* No leg can be reissued online (offline, or already flown): the dialog shows this message instead of the options,
|
|
83
|
+
* like the cancel dialog does for a booking it cannot auto-cancel. `null` while loading or when any leg is available.
|
|
84
|
+
*/
|
|
85
|
+
this.blocked = computed(() => {
|
|
86
|
+
const rows = this.legRows();
|
|
87
|
+
if (!this.availabilityLoaded() || !rows.length || rows.some(r => r.available))
|
|
88
|
+
return null;
|
|
89
|
+
return rows.every(r => r.flown)
|
|
90
|
+
? { title: 'All flights of this booking have already departed.', text: 'There is nothing left to reissue.' }
|
|
91
|
+
: {
|
|
92
|
+
title: 'This booking doesn’t support online reissue.',
|
|
93
|
+
text: 'Please escalate to the relevant team for manual handling.',
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
this.canContinue = computed(() => this.selectedLegIds().length > 0);
|
|
97
|
+
/** A leg's date after the change: the new one when the agent is changing it, the original otherwise. */
|
|
98
|
+
this.dateRows = computed(() => {
|
|
99
|
+
const legs = this.legs();
|
|
100
|
+
const selected = this.selectedSet();
|
|
101
|
+
const edits = this.dateEdits();
|
|
102
|
+
const effective = (l) => (selected.has(l.legId) ? (edits[l.legId] ?? '') : l.departure.slice(0, 10));
|
|
103
|
+
return legs.flatMap((leg, i) => {
|
|
104
|
+
if (!selected.has(leg.legId))
|
|
105
|
+
return [];
|
|
106
|
+
const prev = i > 0 ? effective(legs[i - 1]) : '';
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
leg,
|
|
110
|
+
title: legTitle(leg),
|
|
111
|
+
current: formatReissueDate(leg.departure),
|
|
112
|
+
value: edits[leg.legId] ?? '',
|
|
113
|
+
// Never before today or the previous leg; never after the next leg (same day is fine).
|
|
114
|
+
min: prev > this.today ? prev : this.today,
|
|
115
|
+
max: i < legs.length - 1 ? effective(legs[i + 1]) : '',
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
this.routeRows = computed(() => {
|
|
121
|
+
const edits = this.routeEdits();
|
|
122
|
+
return this.selectedLegs().map(leg => ({
|
|
123
|
+
leg,
|
|
124
|
+
title: legTitle(leg),
|
|
125
|
+
current: formatReissueDate(leg.departure),
|
|
126
|
+
origin: edits[leg.legId]?.origin ?? originAirport(leg),
|
|
127
|
+
destination: edits[leg.legId]?.destination ?? destinationAirport(leg),
|
|
128
|
+
}));
|
|
129
|
+
});
|
|
130
|
+
this.airportOptions = computed(() => {
|
|
131
|
+
const byId = new Map();
|
|
132
|
+
// Order matters (later wins): the booking's own airports, the search results, then what is already picked.
|
|
133
|
+
for (const l of this.legs()) {
|
|
134
|
+
byId.set(l.originCode, originAirport(l));
|
|
135
|
+
byId.set(l.destinationCode, destinationAirport(l));
|
|
136
|
+
}
|
|
137
|
+
for (const a of this.searchedAirports())
|
|
138
|
+
byId.set(a.id, a);
|
|
139
|
+
for (const e of Object.values(this.routeEdits())) {
|
|
140
|
+
byId.set(e.origin.id, e.origin);
|
|
141
|
+
byId.set(e.destination.id, e.destination);
|
|
142
|
+
}
|
|
143
|
+
return [...byId.values()].map(a => ({ ...a, label: `${a.city_name} (${a.id}) – ${a.name}` }));
|
|
144
|
+
});
|
|
145
|
+
this.validationError = computed(() => {
|
|
146
|
+
const service = this.service();
|
|
147
|
+
if (!service || !this.selectedLegIds().length)
|
|
148
|
+
return 'Select at least one leg.';
|
|
149
|
+
if (service === 'change_date') {
|
|
150
|
+
for (const { leg, value, min, max } of this.dateRows()) {
|
|
151
|
+
const who = leg.direction || 'This leg';
|
|
152
|
+
if (!value)
|
|
153
|
+
return 'Pick a new date for every selected leg.';
|
|
154
|
+
if (value < this.today)
|
|
155
|
+
return 'The new date cannot be in the past.';
|
|
156
|
+
if (value < min)
|
|
157
|
+
return `${who} cannot depart before the previous flight (${min}).`;
|
|
158
|
+
if (max && value > max)
|
|
159
|
+
return `${who} cannot depart after the next flight (${max}).`;
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
let changed = false;
|
|
164
|
+
for (const { leg, origin, destination } of this.routeRows()) {
|
|
165
|
+
if (origin.id === destination.id)
|
|
166
|
+
return 'Origin and destination must be different.';
|
|
167
|
+
if (origin.id !== leg.originCode || destination.id !== leg.destinationCode)
|
|
168
|
+
changed = true;
|
|
169
|
+
}
|
|
170
|
+
return changed ? null : 'Change at least one airport.';
|
|
171
|
+
});
|
|
172
|
+
this.load$.pipe(switchMap(() => this.loadFlow()), takeUntilDestroyed()).subscribe();
|
|
173
|
+
// Debounced typeahead: one request per pause in typing, older in-flight ones are dropped.
|
|
174
|
+
this.airportTerm$
|
|
175
|
+
.pipe(debounceTime(250), distinctUntilChanged(), switchMap(term => this.api.searchAirports(term)), takeUntilDestroyed())
|
|
176
|
+
.subscribe(list => this.searchedAirports.set(list));
|
|
177
|
+
}
|
|
178
|
+
/** The leg came back online from the availability check. */
|
|
179
|
+
isLegOnline(legId) {
|
|
180
|
+
return this.availableIds().has(legId);
|
|
181
|
+
}
|
|
182
|
+
// ── actions ───────────────────────────────────────────────────────────────
|
|
183
|
+
/** (Re)starts the dialog for a booking: clears every choice, then loads post-booking + availability. */
|
|
184
|
+
open(data, id) {
|
|
185
|
+
this.booking.set({ data, id });
|
|
186
|
+
this.step.set('service');
|
|
187
|
+
this.service.set(null);
|
|
188
|
+
this.selectedLegIds.set([]);
|
|
189
|
+
this.dateEdits.set({});
|
|
190
|
+
this.routeEdits.set({});
|
|
191
|
+
this.searchedAirports.set([]);
|
|
192
|
+
this.postBookingId.set('');
|
|
193
|
+
this.availableIds.set(new Set());
|
|
194
|
+
this.availabilityLoaded.set(false);
|
|
195
|
+
this.upgradeOptions.set(null);
|
|
196
|
+
this.load();
|
|
197
|
+
}
|
|
198
|
+
load() {
|
|
199
|
+
this.load$.next();
|
|
200
|
+
}
|
|
201
|
+
chooseService(service) {
|
|
202
|
+
if (this.loading() || this.error())
|
|
203
|
+
return;
|
|
204
|
+
this.service.set(service);
|
|
205
|
+
// A one-way with its only leg online has nothing to choose: skip "select flight" and go straight to editing.
|
|
206
|
+
// (An offline one-way still shows the step, so the agent sees why it cannot be changed.)
|
|
207
|
+
const rows = this.legRows();
|
|
208
|
+
if (rows.length === 1 && rows[0].available) {
|
|
209
|
+
this.selectedLegIds.set([rows[0].leg.legId]);
|
|
210
|
+
this.legsStepSkipped.set(true);
|
|
211
|
+
this.goToEdit();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
this.legsStepSkipped.set(false);
|
|
215
|
+
this.selectedLegIds.set([]);
|
|
216
|
+
this.step.set('legs');
|
|
217
|
+
}
|
|
218
|
+
toggleLeg(legId) {
|
|
219
|
+
if (!this.availableIds().has(legId))
|
|
220
|
+
return;
|
|
221
|
+
this.selectedLegIds.update(ids => (ids.includes(legId) ? ids.filter(i => i !== legId) : [...ids, legId]));
|
|
222
|
+
}
|
|
223
|
+
/** Legs -> edit: seed each selected leg with its current date / airports. */
|
|
224
|
+
goToEdit() {
|
|
225
|
+
if (!this.canContinue())
|
|
226
|
+
return;
|
|
227
|
+
if (this.service() === 'change_date') {
|
|
228
|
+
this.dateEdits.update(edits => {
|
|
229
|
+
const next = { ...edits };
|
|
230
|
+
for (const l of this.selectedLegs())
|
|
231
|
+
next[l.legId] ??= l.departure.slice(0, 10);
|
|
232
|
+
return next;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.routeEdits.update(edits => {
|
|
237
|
+
const next = { ...edits };
|
|
238
|
+
for (const l of this.selectedLegs()) {
|
|
239
|
+
next[l.legId] ??= { origin: originAirport(l), destination: destinationAirport(l) };
|
|
240
|
+
}
|
|
241
|
+
return next;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
this.step.set('edit');
|
|
245
|
+
}
|
|
246
|
+
goTo(step) {
|
|
247
|
+
this.step.set(step);
|
|
248
|
+
}
|
|
249
|
+
back() {
|
|
250
|
+
const previous = {
|
|
251
|
+
service: 'service',
|
|
252
|
+
legs: 'service',
|
|
253
|
+
edit: this.legsStepSkipped() ? 'service' : 'legs',
|
|
254
|
+
'upgrade-legs': 'service',
|
|
255
|
+
upgrade: 'service', // the upgrade store overrides this when the leg step was shown
|
|
256
|
+
confirm: 'upgrade',
|
|
257
|
+
};
|
|
258
|
+
this.step.update(s => previous[s]);
|
|
259
|
+
}
|
|
260
|
+
setDate(legId, date) {
|
|
261
|
+
this.dateEdits.update(edits => ({ ...edits, [legId]: date }));
|
|
262
|
+
}
|
|
263
|
+
setAirport(legId, side, airport) {
|
|
264
|
+
if (!airport)
|
|
265
|
+
return;
|
|
266
|
+
const current = this.routeRows().find(r => r.leg.legId === legId);
|
|
267
|
+
if (!current)
|
|
268
|
+
return;
|
|
269
|
+
this.routeEdits.update(edits => ({
|
|
270
|
+
...edits,
|
|
271
|
+
[legId]: { origin: current.origin, destination: current.destination, [side]: airport },
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
/** Swaps a leg's origin and destination (the arrow between the two pickers). */
|
|
275
|
+
swapAirports(legId) {
|
|
276
|
+
const current = this.routeRows().find(r => r.leg.legId === legId);
|
|
277
|
+
if (!current)
|
|
278
|
+
return;
|
|
279
|
+
this.routeEdits.update(edits => ({
|
|
280
|
+
...edits,
|
|
281
|
+
[legId]: { origin: current.destination, destination: current.origin },
|
|
282
|
+
}));
|
|
283
|
+
}
|
|
284
|
+
searchAirports(term) {
|
|
285
|
+
this.airportTerm$.next(term ?? '');
|
|
286
|
+
}
|
|
287
|
+
/** The web search URL for the current choices, or `null` when they are not valid yet. */
|
|
288
|
+
searchUrl() {
|
|
289
|
+
const ctx = this.ctx();
|
|
290
|
+
const service = this.service();
|
|
291
|
+
if (!ctx || !service || service === 'upgrade_class' || this.validationError())
|
|
292
|
+
return null;
|
|
293
|
+
const selection = {
|
|
294
|
+
service,
|
|
295
|
+
legs: service === 'change_date'
|
|
296
|
+
? this.dateRows().map(r => ({ legId: r.leg.legId, departDate: r.value }))
|
|
297
|
+
: this.routeRows().map(r => ({ legId: r.leg.legId, origin: r.origin, destination: r.destination })),
|
|
298
|
+
};
|
|
299
|
+
return buildReissueSearchUrl(this.config.webBaseUrl, ctx, selection, this.postBookingId());
|
|
300
|
+
}
|
|
301
|
+
// ── loading: post-booking -> availability -> upgrade options (once per dialog visit) ─────────
|
|
302
|
+
loadFlow() {
|
|
303
|
+
const ctx = this.ctx();
|
|
304
|
+
if (!ctx) {
|
|
305
|
+
this.error.set('This booking has no leg data to reissue.');
|
|
306
|
+
return EMPTY;
|
|
307
|
+
}
|
|
308
|
+
this.loading.set(true);
|
|
309
|
+
this.error.set(null);
|
|
310
|
+
return this.api.createPostBooking(ctx.bookingId).pipe(switchMap(postBookingId => {
|
|
311
|
+
if (!postBookingId)
|
|
312
|
+
return throwError(() => START_ERROR);
|
|
313
|
+
this.postBookingId.set(postBookingId);
|
|
314
|
+
return this.api.getAvailability(ctx.bookingId, postBookingId, ctx).pipe(catchError(e => throwError(() => describeHttpError(AVAILABILITY_ERROR, e))), tap(res => {
|
|
315
|
+
// A leg that already flew can never be changed, whatever availability says: treat it as offline.
|
|
316
|
+
const flown = new Set(ctx.legs.filter(isLegFlown).map(l => l.legId));
|
|
317
|
+
this.availableIds.set(new Set((res?.data?.legs ?? []).filter(l => l.available && !flown.has(l.legId)).map(l => l.legId)));
|
|
318
|
+
this.allowSingleLegSelection.set(res?.data?.allowCustomerToSelectSingleLeg ?? true);
|
|
319
|
+
this.availabilityLoaded.set(true);
|
|
320
|
+
}), switchMap(() => this.offersUpgrade(ctx.tripType, ctx.legs, postBookingId)));
|
|
321
|
+
}), tap(options => {
|
|
322
|
+
this.upgradeOptions.set(options);
|
|
323
|
+
this.loading.set(false);
|
|
324
|
+
}), catchError((e) => {
|
|
325
|
+
this.error.set(typeof e === 'string' ? e : describeHttpError(START_ERROR, e));
|
|
326
|
+
this.loading.set(false);
|
|
327
|
+
return EMPTY;
|
|
328
|
+
}));
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* The upgrade-class options (same rule as the web for listing "Upgrade Class"): skipped for a one-way whose
|
|
332
|
+
* only leg is offline; a failing call just yields `null` (option hidden) instead of blocking the dialog.
|
|
333
|
+
*/
|
|
334
|
+
offersUpgrade(tripType, legs, postBookingId) {
|
|
335
|
+
const ctx = this.ctx();
|
|
336
|
+
const oneWayOffline = tripType === 'OneWay' && !this.availableIds().has(legs[0]?.legId);
|
|
337
|
+
if (!ctx || !legs.length || oneWayOffline)
|
|
338
|
+
return of(null);
|
|
339
|
+
return this.api
|
|
340
|
+
.getUpgradeClassOptions(ctx.bookingId, postBookingId, ctx)
|
|
341
|
+
.pipe(catchError(() => of(null)));
|
|
342
|
+
}
|
|
343
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
344
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueStore }); }
|
|
345
|
+
}
|
|
346
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueStore, decorators: [{
|
|
347
|
+
type: Injectable
|
|
348
|
+
}], ctorParameters: () => [] });
|
|
349
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9yZWlzc3VlLWRpYWxvZy9yZWlzc3VlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBTyxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBUW5FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BHLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixVQUFVLEVBQ1YsVUFBVSxFQUNWLFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxHQUNULE1BQU0sNEJBQTRCLENBQUM7O0FBMkJwQyxNQUFNLFVBQVUsV0FBVyxDQUN6QixHQUFlLEVBQ2YsU0FBa0IsRUFDbEIsUUFBaUIsRUFDakIsb0JBQThDLFNBQVM7SUFFdkQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLE9BQU87UUFDTCxHQUFHO1FBQ0gsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFT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cnQgeyBJbmplY3RhYmxlLCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU0JEX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcbmltcG9ydCB7IFNiZFJlaXNzdWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVpc3N1ZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFJlaXNzdWVBaXJwb3J0LFxuICBSZWlzc3VlTGVnLFxuICBSZWlzc3VlU2VsZWN0aW9uLFxuICBSZWlzc3VlU2VydmljZUtleSxcbiAgUmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UsXG59IGZyb20gJy4uLy4uL21vZGVscy9yZWlzc3VlLnR5cGVzJztcbmltcG9ydCB7IGJ1aWxkUmVpc3N1ZUJvb2tpbmdDb250ZXh0LCBidWlsZFJlaXNzdWVTZWFyY2hVcmwgfSBmcm9tICcuLi8uLi91dGlscy9yZWlzc3VlLXVybC5idWlsZGVyJztcbmltcG9ydCB7XG4gIGRlc3RpbmF0aW9uQWlycG9ydCxcbiAgZm9ybWF0UmVpc3N1ZURhdGUsXG4gIGZvcm1hdFNob3J0RGF0ZSxcbiAgZm9ybWF0VGltZSxcbiAgaXNMZWdGbG93bixcbiAgbGVnVGl0bGUsXG4gIG9yaWdpbkFpcnBvcnQsXG4gIHRvZGF5SXNvLFxufSBmcm9tICcuLi8uLi91dGlscy9yZWlzc3VlLWZvcm1hdCc7XG5cbi8qKiBgbGVnc2AgKyBgZWRpdGAgc2VydmUgY2hhbmdlIGRhdGUgLyByb3V0ZTsgYHVwZ3JhZGUtbGVnc2AgKyBgdXBncmFkZWAgKyBgY29uZmlybWAgc2VydmUgVXBncmFkZSBDbGFzcy4gKi9cbmV4cG9ydCB0eXBlIFJlaXNzdWVTdGVwID0gJ3NlcnZpY2UnIHwgJ2xlZ3MnIHwgJ2VkaXQnIHwgJ3VwZ3JhZGUtbGVncycgfCAndXBncmFkZScgfCAnY29uZmlybSc7XG5leHBvcnQgdHlwZSBBaXJwb3J0U2lkZSA9ICdvcmlnaW4nIHwgJ2Rlc3RpbmF0aW9uJztcbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVFZGl0IHsgb3JpZ2luOiBSZWlzc3VlQWlycG9ydDsgZGVzdGluYXRpb246IFJlaXNzdWVBaXJwb3J0IH1cbmV4cG9ydCB0eXBlIEFpcnBvcnRPcHRpb24gPSBSZWlzc3VlQWlycG9ydCAmIHsgbGFiZWw6IHN0cmluZyB9O1xuXG4vKiogVmlldyBtb2RlbHM6IGV2ZXJ5dGhpbmcgdGhlIHRlbXBsYXRlcyBuZWVkIGlzIGNvbXB1dGVkIGhlcmUsIHNvIHRoZSB0ZW1wbGF0ZXMgY2FsbCBubyBtZXRob2RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWlzc3VlTGVnUm93IHtcbiAgbGVnOiBSZWlzc3VlTGVnO1xuICBkaXJlY3Rpb246IHN0cmluZztcbiAgZnJvbTogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xuICBkYXRlTGFiZWw6IHN0cmluZztcbiAgZGVwVGltZTogc3RyaW5nO1xuICBhcnJUaW1lOiBzdHJpbmc7XG4gIHN0b3BzTGFiZWw6IHN0cmluZztcbiAgYWlybGluZUxpbmU6IHN0cmluZztcbiAgLyoqIFRoZSBsZWcgYWxyZWFkeSBkZXBhcnRlZCAoXCJVc2VkIEZsaWdodFwiKTogbmV2ZXIgc2VsZWN0YWJsZS4gKi9cbiAgZmxvd246IGJvb2xlYW47XG4gIGF2YWlsYWJsZTogYm9vbGVhbjtcbiAgLyoqIFdoeSBhIGxlZyBjYW5ub3QgYmUgcGlja2VkOiBpdCBhbHJlYWR5IGZsZXcsIGl0IGlzIG9mZmxpbmUgKG5vIG9ubGluZSByZWlzc3VlKSwgb3IgaXQgaGFzIG5vIHVwZ3JhZGUgb3B0aW9ucy4gKi9cbiAgcmVhc29uOiAnZmxvd24nIHwgJ29mZmxpbmUnIHwgJ25vLW9wdGlvbnMnIHwgbnVsbDtcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExlZ1JvdyhcbiAgbGVnOiBSZWlzc3VlTGVnLFxuICBhdmFpbGFibGU6IGJvb2xlYW4sXG4gIHNlbGVjdGVkOiBib29sZWFuLFxuICB1bmF2YWlsYWJsZVJlYXNvbjogJ29mZmxpbmUnIHwgJ25vLW9wdGlvbnMnID0gJ29mZmxpbmUnLFxuKTogUmVpc3N1ZUxlZ1JvdyB7XG4gIGNvbnN0IGZsb3duID0gaXNMZWdGbG93bihsZWcpO1xuICByZXR1cm4ge1xuICAgIGxlZyxcbiAgICBkaXJlY3Rpb246IGxlZy5kaXJlY3Rpb24sXG4gICAgZnJvbTogbGVnLm9yaWdpbkNvZGUsXG4gICAgdG86IGxlZy5kZXN0aW5hdGlvbkNvZGUsXG4gICAgZGF0ZUxhYmVsOiBmb3JtYXRTaG9ydERhdGUobGVnLmRlcGFydHVyZSksXG4gICAgZGVwVGltZTogZm9ybWF0VGltZShsZWcuZGVwYXJ0dXJlKSxcbiAgICBhcnJUaW1lOiBmb3JtYXRUaW1lKGxlZy5hcnJpdmFsKSxcbiAgICBzdG9wc0xhYmVsOiBsZWcuc3RvcHMgPiAwID8gYCR7bGVnLnN0b3BzfSBzdG9wJHtsZWcuc3RvcHMgPiAxID8gJ3MnIDogJyd9YCA6ICdEaXJlY3QnLFxuICAgIGFpcmxpbmVMaW5lOiBbbGVnLmFpcmxpbmUsIGxlZy5mbGlnaHROb10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKSxcbiAgICBmbG93bixcbiAgICBhdmFpbGFibGU6IGF2YWlsYWJsZSAmJiAhZmxvd24sXG4gICAgcmVhc29uOiBmbG93biA/ICdmbG93bicgOiBhdmFpbGFibGUgPyBudWxsIDogdW5hdmFpbGFibGVSZWFzb24sXG4gICAgc2VsZWN0ZWQ6IHNlbGVjdGVkICYmICFmbG93bixcbiAgfTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVpc3N1ZURhdGVSb3cgeyBsZWc6IFJlaXNzdWVMZWc7IHRpdGxlOiBzdHJpbmc7IGN1cnJlbnQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgbWluOiBzdHJpbmc7IG1heDogc3RyaW5nIH1cbmV4cG9ydCBpbnRlcmZhY2UgUmVpc3N1ZVJvdXRlUm93IHsgbGVnOiBSZWlzc3VlTGVnOyB0aXRsZTogc3RyaW5nOyBjdXJyZW50OiBzdHJpbmc7IG9yaWdpbjogUmVpc3N1ZUFpcnBvcnQ7IGRlc3RpbmF0aW9uOiBSZWlzc3VlQWlycG9ydCB9XG5cbmNvbnN0IFNUQVJUX0VSUk9SID0gJ0NvdWxkIG5vdCBzdGFydCB0aGUgcmVpc3N1ZSByZXF1ZXN0Lic7XG5jb25zdCBBVkFJTEFCSUxJVFlfRVJST1IgPSAnQ291bGQgbm90IGNoZWNrIGF2YWlsYWJpbGl0eSBmb3IgdGhpcyBib29raW5nLic7XG5cbi8qKiBgYmFzZSAoSFRUUCA1MDA6IG1lc3NhZ2UgZnJvbSB0aGUgYmFja2VuZClgIOKAlCBzbyB0aGUgYWdlbnQgKGFuZCB3ZSwgd2hpbGUgdGhlIEFQSXMgYXJlIG5ldykgY2FuIHNlZSB3aHkgaXQgZmFpbGVkLiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVIdHRwRXJyb3IoYmFzZTogc3RyaW5nLCBlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyID0gZSBhcyB7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I/OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBzdHJpbmcgfSB8IG51bGw7XG4gIC8vIFRoZSBiYWNrZW5kIHNlbmRzIGJvdGg6IGBlcnJvcmAgKHRoZSByZWFsIHJlYXNvbiwgZS5nLiBcIlVuYXV0aG9yaXplZCFcIikgYW5kIGEgZ2VuZXJpYyBgbWVzc2FnZWAuXG4gIGNvbnN0IGJvZHkgPVxuICAgIHR5cGVvZiBlcnI/LmVycm9yID09PSAnc3RyaW5nJyA/IFtlcnIuZXJyb3JdIDogW2Vycj8uZXJyb3I/LmVycm9yLCBlcnI/LmVycm9yPy5tZXNzYWdlXTtcbiAgY29uc3QgdGV4dCA9IGJvZHkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDigJQgJykuc2xpY2UoMCwgMjAwKTtcbiAgY29uc3QgZGV0YWlsID0gW2Vycj8uc3RhdHVzID8gYEhUVFAgJHtlcnIuc3RhdHVzfWAgOiAnJywgdGV4dF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJzogJyk7XG4gIHJldHVybiBkZXRhaWwgPyBgJHtiYXNlfSAoJHtkZXRhaWx9KWAgOiBiYXNlO1xufVxuXG4vKipcbiAqIFN0YXRlICsgcnVsZXMgb2YgdGhlIFJlaXNzdWUgZGlhbG9nIChvbmUgaW5zdGFuY2UgcGVyIGRpYWxvZywgcHJvdmlkZWQgYnkgdGhlIGRpYWxvZyBjb21wb25lbnQpLlxuICogVGhlIHN0ZXAgY29tcG9uZW50cyBhcmUgcHJlc2VudGF0aW9uYWw6IHRoZXkgZ2V0IHZpZXcgbW9kZWxzIGZyb20gaGVyZSB0aHJvdWdoIHRoZSBkaWFsb2cgc2hlbGwuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTYmRSZWlzc3VlU3RvcmUge1xuICBwcml2YXRlIGFwaSA9IGluamVjdChTYmRSZWlzc3VlU2VydmljZSk7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KFNCRF9DT05GSUcpO1xuXG4gIHJlYWRvbmx5IHRvZGF5ID0gdG9kYXlJc28oKTtcblxuICAvLyDilIDilIAgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgYm9va2luZyA9IHNpZ25hbDx7IGRhdGE6IHVua25vd247IGlkOiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzdGVwID0gc2lnbmFsPFJlaXNzdWVTdGVwPignc2VydmljZScpO1xuICByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHBvc3RCb29raW5nSWQgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBzZXJ2aWNlID0gc2lnbmFsPFJlaXNzdWVTZXJ2aWNlS2V5IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBSYXcgdXBncmFkZS1jbGFzcyByZXNwb25zZTsgYG51bGxgIHdoZW4gbm90IGxvYWRlZCAvIG5vdCBvZmZlcmVkLiBSZWFkIGJ5IGBTYmRSZWlzc3VlVXBncmFkZVN0b3JlYC4gKi9cbiAgcmVhZG9ubHkgdXBncmFkZU9wdGlvbnMgPSBzaWduYWw8UmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdXBncmFkZUF2YWlsYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYXBpLmhhc1VwZ3JhZGVPcHRpb25zKHRoaXMudXBncmFkZU9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgYXZhaWxhYmxlSWRzID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQoKSk7XG4gIC8qKiBUaGUgYXZhaWxhYmlsaXR5IGNhbGwgYW5zd2VyZWQgKHNvIFwibm8gbGVnIGF2YWlsYWJsZVwiIGlzIGEgcmVhbCBhbnN3ZXIsIG5vdCBcInN0aWxsIGxvYWRpbmdcIikuICovXG4gIHByaXZhdGUgYXZhaWxhYmlsaXR5TG9hZGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZExlZ0lkcyA9IHNpZ25hbDxyZWFkb25seSBzdHJpbmdbXT4oW10pO1xuICAvKiogVGhlIFwic2VsZWN0IGZsaWdodFwiIHN0ZXAgd2FzIHNraXBwZWQgKG9uZS13YXkpOiBCYWNrIGZyb20gdGhlIGVkaXQgc3RlcCByZXR1cm5zIHRvIHRoZSBzZXJ2aWNlIGxpc3QuICovXG4gIHByaXZhdGUgbGVnc1N0ZXBTa2lwcGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBkYXRlRWRpdHMgPSBzaWduYWw8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KHt9KTtcbiAgcHJpdmF0ZSByb3V0ZUVkaXRzID0gc2lnbmFsPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJvdXRlRWRpdD4+Pih7fSk7XG4gIHByaXZhdGUgc2VhcmNoZWRBaXJwb3J0cyA9IHNpZ25hbDxyZWFkb25seSBSZWlzc3VlQWlycG9ydFtdPihbXSk7XG5cbiAgcHJpdmF0ZSBsb2FkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgYWlycG9ydFRlcm0kID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9hZCQucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy5sb2FkRmxvdygpKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gRGVib3VuY2VkIHR5cGVhaGVhZDogb25lIHJlcXVlc3QgcGVyIHBhdXNlIGluIHR5cGluZywgb2xkZXIgaW4tZmxpZ2h0IG9uZXMgYXJlIGRyb3BwZWQuXG4gICAgdGhpcy5haXJwb3J0VGVybSRcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc3dpdGNoTWFwKHRlcm0gPT4gdGhpcy5hcGkuc2VhcmNoQWlycG9ydHModGVybSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobGlzdCA9PiB0aGlzLnNlYXJjaGVkQWlycG9ydHMuc2V0KGxpc3QpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkZXJpdmVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICByZWFkb25seSBjdHggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYiA9IHRoaXMuYm9va2luZygpO1xuICAgIHJldHVybiBiID8gYnVpbGRSZWlzc3VlQm9va2luZ0NvbnRleHQoYi5kYXRhLCBiLmlkKSA6IG51bGw7XG4gIH0pO1xuICByZWFkb25seSBsZWdzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdHgoKT8ubGVncyA/PyBbXSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRTZXQgPSBjb21wdXRlZCgoKSA9PiBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRMZWdJZHMoKSkpO1xuICBwcml2YXRlIHNlbGVjdGVkTGVncyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGVncygpLmZpbHRlcihsID0+IHRoaXMuc2VsZWN0ZWRTZXQoKS5oYXMobC5sZWdJZCkpKTtcblxuICByZWFkb25seSBsZWdSb3dzID0gY29tcHV0ZWQ8UmVpc3N1ZUxlZ1Jvd1tdPigoKSA9PlxuICAgIHRoaXMubGVncygpLm1hcChsZWcgPT4gYnVpbGRMZWdSb3cobGVnLCB0aGlzLmF2YWlsYWJsZUlkcygpLmhhcyhsZWcubGVnSWQpLCB0aGlzLnNlbGVjdGVkU2V0KCkuaGFzKGxlZy5sZWdJZCkpKSxcbiAgKTtcblxuICAvKiogVGhlIGxlZyBjYW1lIGJhY2sgb25saW5lIGZyb20gdGhlIGF2YWlsYWJpbGl0eSBjaGVjay4gKi9cbiAgaXNMZWdPbmxpbmUobGVnSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUlkcygpLmhhcyhsZWdJZCk7XG4gIH1cblxuICAvKiogYGZhbHNlYCA9IGEgcm91bmQgdHJpcCBtdXN0IGJlIHVwZ3JhZGVkIGFzIGEgd2hvbGUgKGF2YWlsYWJpbGl0eSdzIGBhbGxvd0N1c3RvbWVyVG9TZWxlY3RTaW5nbGVMZWdgKS4gKi9cbiAgcmVhZG9ubHkgYWxsb3dTaW5nbGVMZWdTZWxlY3Rpb24gPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IGFueUF2YWlsYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGVnUm93cygpLnNvbWUociA9PiByLmF2YWlsYWJsZSkpO1xuXG4gIC8qKlxuICAgKiBObyBsZWcgY2FuIGJlIHJlaXNzdWVkIG9ubGluZSAob2ZmbGluZSwgb3IgYWxyZWFkeSBmbG93bik6IHRoZSBkaWFsb2cgc2hvd3MgdGhpcyBtZXNzYWdlIGluc3RlYWQgb2YgdGhlIG9wdGlvbnMsXG4gICAqIGxpa2UgdGhlIGNhbmNlbCBkaWFsb2cgZG9lcyBmb3IgYSBib29raW5nIGl0IGNhbm5vdCBhdXRvLWNhbmNlbC4gYG51bGxgIHdoaWxlIGxvYWRpbmcgb3Igd2hlbiBhbnkgbGVnIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGJsb2NrZWQgPSBjb21wdXRlZDx7IHRpdGxlOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9IHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmxlZ1Jvd3MoKTtcbiAgICBpZiAoIXRoaXMuYXZhaWxhYmlsaXR5TG9hZGVkKCkgfHwgIXJvd3MubGVuZ3RoIHx8IHJvd3Muc29tZShyID0+IHIuYXZhaWxhYmxlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJvd3MuZXZlcnkociA9PiByLmZsb3duKVxuICAgICAgPyB7IHRpdGxlOiAnQWxsIGZsaWdodHMgb2YgdGhpcyBib29raW5nIGhhdmUgYWxyZWFkeSBkZXBhcnRlZC4nLCB0ZXh0OiAnVGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlaXNzdWUuJyB9XG4gICAgICA6IHtcbiAgICAgICAgICB0aXRsZTogJ1RoaXMgYm9va2luZyBkb2VzbuKAmXQgc3VwcG9ydCBvbmxpbmUgcmVpc3N1ZS4nLFxuICAgICAgICAgIHRleHQ6ICdQbGVhc2UgZXNjYWxhdGUgdG8gdGhlIHJlbGV2YW50IHRlYW0gZm9yIG1hbnVhbCBoYW5kbGluZy4nLFxuICAgICAgICB9O1xuICB9KTtcbiAgcmVhZG9ubHkgY2FuQ29udGludWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkTGVnSWRzKCkubGVuZ3RoID4gMCk7XG5cbiAgLyoqIEEgbGVnJ3MgZGF0ZSBhZnRlciB0aGUgY2hhbmdlOiB0aGUgbmV3IG9uZSB3aGVuIHRoZSBhZ2VudCBpcyBjaGFuZ2luZyBpdCwgdGhlIG9yaWdpbmFsIG90aGVyd2lzZS4gKi9cbiAgcmVhZG9ubHkgZGF0ZVJvd3MgPSBjb21wdXRlZDxSZWlzc3VlRGF0ZVJvd1tdPigoKSA9PiB7XG4gICAgY29uc3QgbGVncyA9IHRoaXMubGVncygpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFNldCgpO1xuICAgIGNvbnN0IGVkaXRzID0gdGhpcy5kYXRlRWRpdHMoKTtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSAobDogUmVpc3N1ZUxlZykgPT4gKHNlbGVjdGVkLmhhcyhsLmxlZ0lkKSA/IChlZGl0c1tsLmxlZ0lkXSA/PyAnJykgOiBsLmRlcGFydHVyZS5zbGljZSgwLCAxMCkpO1xuXG4gICAgcmV0dXJuIGxlZ3MuZmxhdE1hcCgobGVnLCBpKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkLmhhcyhsZWcubGVnSWQpKSByZXR1cm4gW107XG4gICAgICBjb25zdCBwcmV2ID0gaSA+IDAgPyBlZmZlY3RpdmUobGVnc1tpIC0gMV0pIDogJyc7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgbGVnLFxuICAgICAgICAgIHRpdGxlOiBsZWdUaXRsZShsZWcpLFxuICAgICAgICAgIGN1cnJlbnQ6IGZvcm1hdFJlaXNzdWVEYXRlKGxlZy5kZXBhcnR1cmUpLFxuICAgICAgICAgIHZhbHVlOiBlZGl0c1tsZWcubGVnSWRdID8/ICcnLFxuICAgICAgICAgIC8vIE5ldmVyIGJlZm9yZSB0b2RheSBvciB0aGUgcHJldmlvdXMgbGVnOyBuZXZlciBhZnRlciB0aGUgbmV4dCBsZWcgKHNhbWUgZGF5IGlzIGZpbmUpLlxuICAgICAgICAgIG1pbjogcHJldiA+IHRoaXMudG9kYXkgPyBwcmV2IDogdGhpcy50b2RheSxcbiAgICAgICAgICBtYXg6IGkgPCBsZWdzLmxlbmd0aCAtIDEgPyBlZmZlY3RpdmUobGVnc1tpICsgMV0pIDogJycsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pO1xuICB9KTtcblxuICByZWFkb25seSByb3V0ZVJvd3MgPSBjb21wdXRlZDxSZWlzc3VlUm91dGVSb3dbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRzID0gdGhpcy5yb3V0ZUVkaXRzKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMZWdzKCkubWFwKGxlZyA9PiAoe1xuICAgICAgbGVnLFxuICAgICAgdGl0bGU6IGxlZ1RpdGxlKGxlZyksXG4gICAgICBjdXJyZW50OiBmb3JtYXRSZWlzc3VlRGF0ZShsZWcuZGVwYXJ0dXJlKSxcbiAgICAgIG9yaWdpbjogZWRpdHNbbGVnLmxlZ0lkXT8ub3JpZ2luID8/IG9yaWdpbkFpcnBvcnQobGVnKSxcbiAgICAgIGRlc3RpbmF0aW9uOiBlZGl0c1tsZWcubGVnSWRdPy5kZXN0aW5hdGlvbiA/PyBkZXN0aW5hdGlvbkFpcnBvcnQobGVnKSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFpcnBvcnRPcHRpb25zID0gY29tcHV0ZWQ8QWlycG9ydE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgYnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWlzc3VlQWlycG9ydD4oKTtcbiAgICAvLyBPcmRlciBtYXR0ZXJzIChsYXRlciB3aW5zKTogdGhlIGJvb2tpbmcncyBvd24gYWlycG9ydHMsIHRoZSBzZWFyY2ggcmVzdWx0cywgdGhlbiB3aGF0IGlzIGFscmVhZHkgcGlja2VkLlxuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLmxlZ3MoKSkge1xuICAgICAgYnlJZC5zZXQobC5vcmlnaW5Db2RlLCBvcmlnaW5BaXJwb3J0KGwpKTtcbiAgICAgIGJ5SWQuc2V0KGwuZGVzdGluYXRpb25Db2RlLCBkZXN0aW5hdGlvbkFpcnBvcnQobCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGEgb2YgdGhpcy5zZWFyY2hlZEFpcnBvcnRzKCkpIGJ5SWQuc2V0KGEuaWQsIGEpO1xuICAgIGZvciAoY29uc3QgZSBvZiBPYmplY3QudmFsdWVzKHRoaXMucm91dGVFZGl0cygpKSkge1xuICAgICAgYnlJZC5zZXQoZS5vcmlnaW4uaWQsIGUub3JpZ2luKTtcbiAgICAgIGJ5SWQuc2V0KGUuZGVzdGluYXRpb24uaWQsIGUuZGVzdGluYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmJ5SWQudmFsdWVzKCldLm1hcChhID0+ICh7IC4uLmEsIGxhYmVsOiBgJHthLmNpdHlfbmFtZX0gKCR7YS5pZH0pIOKAkyAke2EubmFtZX1gIH0pKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9yID0gY29tcHV0ZWQ8c3RyaW5nIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2UoKTtcbiAgICBpZiAoIXNlcnZpY2UgfHwgIXRoaXMuc2VsZWN0ZWRMZWdJZHMoKS5sZW5ndGgpIHJldHVybiAnU2VsZWN0IGF0IGxlYXN0IG9uZSBsZWcuJztcblxuICAgIGlmIChzZXJ2aWNlID09PSAnY2hhbmdlX2RhdGUnKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgbGVnLCB2YWx1ZSwgbWluLCBtYXggfSBvZiB0aGlzLmRhdGVSb3dzKCkpIHtcbiAgICAgICAgY29uc3Qgd2hvID0gbGVnLmRpcmVjdGlvbiB8fCAnVGhpcyBsZWcnO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gJ1BpY2sgYSBuZXcgZGF0ZSBmb3IgZXZlcnkgc2VsZWN0ZWQgbGVnLic7XG4gICAgICAgIGlmICh2YWx1ZSA8IHRoaXMudG9kYXkpIHJldHVybiAnVGhlIG5ldyBkYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdC4nO1xuICAgICAgICBpZiAodmFsdWUgPCBtaW4pIHJldHVybiBgJHt3aG99IGNhbm5vdCBkZXBhcnQgYmVmb3JlIHRoZSBwcmV2aW91cyBmbGlnaHQgKCR7bWlufSkuYDtcbiAgICAgICAgaWYgKG1heCAmJiB2YWx1ZSA+IG1heCkgcmV0dXJuIGAke3dob30gY2Fubm90IGRlcGFydCBhZnRlciB0aGUgbmV4dCBmbGlnaHQgKCR7bWF4fSkuYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB7IGxlZywgb3JpZ2luLCBkZXN0aW5hdGlvbiB9IG9mIHRoaXMucm91dGVSb3dzKCkpIHtcbiAgICAgIGlmIChvcmlnaW4uaWQgPT09IGRlc3RpbmF0aW9uLmlkKSByZXR1cm4gJ09yaWdpbiBhbmQgZGVzdGluYXRpb24gbXVzdCBiZSBkaWZmZXJlbnQuJztcbiAgICAgIGlmIChvcmlnaW4uaWQgIT09IGxlZy5vcmlnaW5Db2RlIHx8IGRlc3RpbmF0aW9uLmlkICE9PSBsZWcuZGVzdGluYXRpb25Db2RlKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQgPyBudWxsIDogJ0NoYW5nZSBhdCBsZWFzdCBvbmUgYWlycG9ydC4nO1xuICB9KTtcblxuICAvLyDilIDilIAgYWN0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogKFJlKXN0YXJ0cyB0aGUgZGlhbG9nIGZvciBhIGJvb2tpbmc6IGNsZWFycyBldmVyeSBjaG9pY2UsIHRoZW4gbG9hZHMgcG9zdC1ib29raW5nICsgYXZhaWxhYmlsaXR5LiAqL1xuICBvcGVuKGRhdGE6IHVua25vd24sIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJvb2tpbmcuc2V0KHsgZGF0YSwgaWQgfSk7XG4gICAgdGhpcy5zdGVwLnNldCgnc2VydmljZScpO1xuICAgIHRoaXMuc2VydmljZS5zZXQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZExlZ0lkcy5zZXQoW10pO1xuICAgIHRoaXMuZGF0ZUVkaXRzLnNldCh7fSk7XG4gICAgdGhpcy5yb3V0ZUVkaXRzLnNldCh7fSk7XG4gICAgdGhpcy5zZWFyY2hlZEFpcnBvcnRzLnNldChbXSk7XG4gICAgdGhpcy5wb3N0Qm9va2luZ0lkLnNldCgnJyk7XG4gICAgdGhpcy5hdmFpbGFibGVJZHMuc2V0KG5ldyBTZXQoKSk7XG4gICAgdGhpcy5hdmFpbGFiaWxpdHlMb2FkZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnVwZ3JhZGVPcHRpb25zLnNldChudWxsKTtcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkJC5uZXh0KCk7XG4gIH1cblxuICBjaG9vc2VTZXJ2aWNlKHNlcnZpY2U6IFJlaXNzdWVTZXJ2aWNlS2V5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGluZygpIHx8IHRoaXMuZXJyb3IoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZS5zZXQoc2VydmljZSk7XG4gICAgLy8gQSBvbmUtd2F5IHdpdGggaXRzIG9ubHkgbGVnIG9ubGluZSBoYXMgbm90aGluZyB0byBjaG9vc2U6IHNraXAgXCJzZWxlY3QgZmxpZ2h0XCIgYW5kIGdvIHN0cmFpZ2h0IHRvIGVkaXRpbmcuXG4gICAgLy8gKEFuIG9mZmxpbmUgb25lLXdheSBzdGlsbCBzaG93cyB0aGUgc3RlcCwgc28gdGhlIGFnZW50IHNlZXMgd2h5IGl0IGNhbm5vdCBiZSBjaGFuZ2VkLilcbiAgICBjb25zdCByb3dzID0gdGhpcy5sZWdSb3dzKCk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAxICYmIHJvd3NbMF0uYXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGVnSWRzLnNldChbcm93c1swXS5sZWcubGVnSWRdKTtcbiAgICAgIHRoaXMubGVnc1N0ZXBTa2lwcGVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuZ29Ub0VkaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sZWdzU3RlcFNraXBwZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnNlbGVjdGVkTGVnSWRzLnNldChbXSk7XG4gICAgdGhpcy5zdGVwLnNldCgnbGVncycpO1xuICB9XG5cbiAgdG9nZ2xlTGVnKGxlZ0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXZhaWxhYmxlSWRzKCkuaGFzKGxlZ0lkKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0ZWRMZWdJZHMudXBkYXRlKGlkcyA9PiAoaWRzLmluY2x1ZGVzKGxlZ0lkKSA/IGlkcy5maWx0ZXIoaSA9PiBpICE9PSBsZWdJZCkgOiBbLi4uaWRzLCBsZWdJZF0pKTtcbiAgfVxuXG4gIC8qKiBMZWdzIC0+IGVkaXQ6IHNlZWQgZWFjaCBzZWxlY3RlZCBsZWcgd2l0aCBpdHMgY3VycmVudCBkYXRlIC8gYWlycG9ydHMuICovXG4gIGdvVG9FZGl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5Db250aW51ZSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2VydmljZSgpID09PSAnY2hhbmdlX2RhdGUnKSB7XG4gICAgICB0aGlzLmRhdGVFZGl0cy51cGRhdGUoZWRpdHMgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0geyAuLi5lZGl0cyB9O1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5zZWxlY3RlZExlZ3MoKSkgbmV4dFtsLmxlZ0lkXSA/Pz0gbC5kZXBhcnR1cmUuc2xpY2UoMCwgMTApO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlRWRpdHMudXBkYXRlKGVkaXRzID0+IHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHsgLi4uZWRpdHMgfTtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIHRoaXMuc2VsZWN0ZWRMZWdzKCkpIHtcbiAgICAgICAgICBuZXh0W2wubGVnSWRdID8/PSB7IG9yaWdpbjogb3JpZ2luQWlycG9ydChsKSwgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uQWlycG9ydChsKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RlcC5zZXQoJ2VkaXQnKTtcbiAgfVxuXG4gIGdvVG8oc3RlcDogUmVpc3N1ZVN0ZXApOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXAuc2V0KHN0ZXApO1xuICB9XG5cbiAgYmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91czogUmVjb3JkPFJlaXNzdWVTdGVwLCBSZWlzc3VlU3RlcD4gPSB7XG4gICAgICBzZXJ2aWNlOiAnc2VydmljZScsXG4gICAgICBsZWdzOiAnc2VydmljZScsXG4gICAgICBlZGl0OiB0aGlzLmxlZ3NTdGVwU2tpcHBlZCgpID8gJ3NlcnZpY2UnIDogJ2xlZ3MnLFxuICAgICAgJ3VwZ3JhZGUtbGVncyc6ICdzZXJ2aWNlJyxcbiAgICAgIHVwZ3JhZGU6ICdzZXJ2aWNlJywgLy8gdGhlIHVwZ3JhZGUgc3RvcmUgb3ZlcnJpZGVzIHRoaXMgd2hlbiB0aGUgbGVnIHN0ZXAgd2FzIHNob3duXG4gICAgICBjb25maXJtOiAndXBncmFkZScsXG4gICAgfTtcbiAgICB0aGlzLnN0ZXAudXBkYXRlKHMgPT4gcHJldmlvdXNbc10pO1xuICB9XG5cbiAgc2V0RGF0ZShsZWdJZDogc3RyaW5nLCBkYXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVFZGl0cy51cGRhdGUoZWRpdHMgPT4gKHsgLi4uZWRpdHMsIFtsZWdJZF06IGRhdGUgfSkpO1xuICB9XG5cbiAgc2V0QWlycG9ydChsZWdJZDogc3RyaW5nLCBzaWRlOiBBaXJwb3J0U2lkZSwgYWlycG9ydDogUmVpc3N1ZUFpcnBvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFhaXJwb3J0KSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm91dGVSb3dzKCkuZmluZChyID0+IHIubGVnLmxlZ0lkID09PSBsZWdJZCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgdGhpcy5yb3V0ZUVkaXRzLnVwZGF0ZShlZGl0cyA9PiAoe1xuICAgICAgLi4uZWRpdHMsXG4gICAgICBbbGVnSWRdOiB7IG9yaWdpbjogY3VycmVudC5vcmlnaW4sIGRlc3RpbmF0aW9uOiBjdXJyZW50LmRlc3RpbmF0aW9uLCBbc2lkZV06IGFpcnBvcnQgfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogU3dhcHMgYSBsZWcncyBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uICh0aGUgYXJyb3cgYmV0d2VlbiB0aGUgdHdvIHBpY2tlcnMpLiAqL1xuICBzd2FwQWlycG9ydHMobGVnSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvdXRlUm93cygpLmZpbmQociA9PiByLmxlZy5sZWdJZCA9PT0gbGVnSWQpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIHRoaXMucm91dGVFZGl0cy51cGRhdGUoZWRpdHMgPT4gKHtcbiAgICAgIC4uLmVkaXRzLFxuICAgICAgW2xlZ0lkXTogeyBvcmlnaW46IGN1cnJlbnQuZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uOiBjdXJyZW50Lm9yaWdpbiB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHNlYXJjaEFpcnBvcnRzKHRlcm06IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWlycG9ydFRlcm0kLm5leHQodGVybSA/PyAnJyk7XG4gIH1cblxuICAvKiogVGhlIHdlYiBzZWFyY2ggVVJMIGZvciB0aGUgY3VycmVudCBjaG9pY2VzLCBvciBgbnVsbGAgd2hlbiB0aGV5IGFyZSBub3QgdmFsaWQgeWV0LiAqL1xuICBzZWFyY2hVcmwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHgoKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlKCk7XG4gICAgaWYgKCFjdHggfHwgIXNlcnZpY2UgfHwgc2VydmljZSA9PT0gJ3VwZ3JhZGVfY2xhc3MnIHx8IHRoaXMudmFsaWRhdGlvbkVycm9yKCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgc2VsZWN0aW9uOiBSZWlzc3VlU2VsZWN0aW9uID0ge1xuICAgICAgc2VydmljZSxcbiAgICAgIGxlZ3M6XG4gICAgICAgIHNlcnZpY2UgPT09ICdjaGFuZ2VfZGF0ZSdcbiAgICAgICAgICA/IHRoaXMuZGF0ZVJvd3MoKS5tYXAociA9PiAoeyBsZWdJZDogci5sZWcubGVnSWQsIGRlcGFydERhdGU6IHIudmFsdWUgfSkpXG4gICAgICAgICAgOiB0aGlzLnJvdXRlUm93cygpLm1hcChyID0+ICh7IGxlZ0lkOiByLmxlZy5sZWdJZCwgb3JpZ2luOiByLm9yaWdpbiwgZGVzdGluYXRpb246IHIuZGVzdGluYXRpb24gfSkpLFxuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkUmVpc3N1ZVNlYXJjaFVybCh0aGlzLmNvbmZpZy53ZWJCYXNlVXJsLCBjdHgsIHNlbGVjdGlvbiwgdGhpcy5wb3N0Qm9va2luZ0lkKCkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvYWRpbmc6IHBvc3QtYm9va2luZyAtPiBhdmFpbGFiaWxpdHkgLT4gdXBncmFkZSBvcHRpb25zIChvbmNlIHBlciBkaWFsb2cgdmlzaXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgbG9hZEZsb3coKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHgoKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgdGhpcy5lcnJvci5zZXQoJ1RoaXMgYm9va2luZyBoYXMgbm8gbGVnIGRhdGEgdG8gcmVpc3N1ZS4nKTtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIHJldHVybiB0aGlzLmFwaS5jcmVhdGVQb3N0Qm9va2luZyhjdHguYm9va2luZ0lkKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHBvc3RCb29raW5nSWQgPT4ge1xuICAgICAgICBpZiAoIXBvc3RCb29raW5nSWQpIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IFNUQVJUX0VSUk9SKTtcbiAgICAgICAgdGhpcy5wb3N0Qm9va2luZ0lkLnNldChwb3N0Qm9va2luZ0lkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmdldEF2YWlsYWJpbGl0eShjdHguYm9va2luZ0lkLCBwb3N0Qm9va2luZ0lkLCBjdHgpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcihlID0+IHRocm93RXJyb3IoKCkgPT4gZGVzY3JpYmVIdHRwRXJyb3IoQVZBSUxBQklMSVRZX0VSUk9SLCBlKSkpLFxuICAgICAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICAgICAgLy8gQSBsZWcgdGhhdCBhbHJlYWR5IGZsZXcgY2FuIG5ldmVyIGJlIGNoYW5nZWQsIHdoYXRldmVyIGF2YWlsYWJpbGl0eSBzYXlzOiB0cmVhdCBpdCBhcyBvZmZsaW5lLlxuICAgICAgICAgICAgY29uc3QgZmxvd24gPSBuZXcgU2V0KGN0eC5sZWdzLmZpbHRlcihpc0xlZ0Zsb3duKS5tYXAobCA9PiBsLmxlZ0lkKSk7XG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUlkcy5zZXQoXG4gICAgICAgICAgICAgIG5ldyBTZXQoKHJlcz8uZGF0YT8ubGVncyA/PyBbXSkuZmlsdGVyKGwgPT4gbC5hdmFpbGFibGUgJiYgIWZsb3duLmhhcyhsLmxlZ0lkKSkubWFwKGwgPT4gbC5sZWdJZCkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dTaW5nbGVMZWdTZWxlY3Rpb24uc2V0KHJlcz8uZGF0YT8uYWxsb3dDdXN0b21lclRvU2VsZWN0U2luZ2xlTGVnID8/IHRydWUpO1xuICAgICAgICAgICAgdGhpcy5hdmFpbGFiaWxpdHlMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9mZmVyc1VwZ3JhZGUoY3R4LnRyaXBUeXBlLCBjdHgubGVncywgcG9zdEJvb2tpbmdJZCkpLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICB0YXAob3B0aW9ucyA9PiB7XG4gICAgICAgIHRoaXMudXBncmFkZU9wdGlvbnMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aGlzLmVycm9yLnNldCh0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBlIDogZGVzY3JpYmVIdHRwRXJyb3IoU1RBUlRfRVJST1IsIGUpKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVwZ3JhZGUtY2xhc3Mgb3B0aW9ucyAoc2FtZSBydWxlIGFzIHRoZSB3ZWIgZm9yIGxpc3RpbmcgXCJVcGdyYWRlIENsYXNzXCIpOiBza2lwcGVkIGZvciBhIG9uZS13YXkgd2hvc2VcbiAgICogb25seSBsZWcgaXMgb2ZmbGluZTsgYSBmYWlsaW5nIGNhbGwganVzdCB5aWVsZHMgYG51bGxgIChvcHRpb24gaGlkZGVuKSBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBkaWFsb2cuXG4gICAqL1xuICBwcml2YXRlIG9mZmVyc1VwZ3JhZGUoXG4gICAgdHJpcFR5cGU6IHN0cmluZyxcbiAgICBsZWdzOiByZWFkb25seSBSZWlzc3VlTGVnW10sXG4gICAgcG9zdEJvb2tpbmdJZDogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFJlaXNzdWVVcGdyYWRlT3B0aW9uc1Jlc3BvbnNlIHwgbnVsbD4ge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4KCk7XG4gICAgY29uc3Qgb25lV2F5T2ZmbGluZSA9IHRyaXBUeXBlID09PSAnT25lV2F5JyAmJiAhdGhpcy5hdmFpbGFibGVJZHMoKS5oYXMobGVnc1swXT8ubGVnSWQpO1xuICAgIGlmICghY3R4IHx8ICFsZWdzLmxlbmd0aCB8fCBvbmVXYXlPZmZsaW5lKSByZXR1cm4gb2YobnVsbCk7XG4gICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAuZ2V0VXBncmFkZUNsYXNzT3B0aW9ucyhjdHguYm9va2luZ0lkLCBwb3N0Qm9va2luZ0lkLCBjdHgpXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class SbdReissueDateStepComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.rows = input.required();
|
|
6
|
+
this.changed = output();
|
|
7
|
+
}
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueDateStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueDateStepComponent, isStandalone: true, selector: "app-sbd-reissue-date-step", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { changed: "changed" }, host: { classAttribute: "sbd-rdate" }, ngImport: i0, template: `
|
|
10
|
+
@for (row of rows(); track row.leg.legId) {
|
|
11
|
+
<div class="sbd-rdate__card">
|
|
12
|
+
<div class="sbd-rdate__head">
|
|
13
|
+
<span class="sbd-rdate__name">{{ row.leg.originCode }} to {{ row.leg.destinationCode }}</span>
|
|
14
|
+
<span class="sbd-rdate__current">Currently {{ row.current }}</span>
|
|
15
|
+
</div>
|
|
16
|
+
<label class="sbd-rdate__field">
|
|
17
|
+
<span>New departure date</span>
|
|
18
|
+
<input type="date" class="sbd-rdate__input"
|
|
19
|
+
[value]="row.value" [min]="row.min" [attr.max]="row.max || null"
|
|
20
|
+
(input)="changed.emit({ legId: row.leg.legId, date: $any($event.target).value })" />
|
|
21
|
+
</label>
|
|
22
|
+
</div>
|
|
23
|
+
}
|
|
24
|
+
`, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rdate__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:14px}.sbd-rdate__head{display:flex;flex-direction:column;gap:2px}.sbd-rdate__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rdate__current{font-size:13px;color:#64748b}.sbd-rdate__field{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:12.5px;font-weight:600;color:#475569}.sbd-rdate__input{height:40px;padding:0 12px;border:1.5px solid #e2e8f0;border-radius:10px;background:#fff;font-size:13px;font-family:inherit;color:#1e2e4a}.sbd-rdate__input:focus{outline:none;border-color:var(--sbd-accent, #6d4aff)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
25
|
+
}
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueDateStepComponent, decorators: [{
|
|
27
|
+
type: Component,
|
|
28
|
+
args: [{ selector: 'app-sbd-reissue-date-step', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
29
|
+
@for (row of rows(); track row.leg.legId) {
|
|
30
|
+
<div class="sbd-rdate__card">
|
|
31
|
+
<div class="sbd-rdate__head">
|
|
32
|
+
<span class="sbd-rdate__name">{{ row.leg.originCode }} to {{ row.leg.destinationCode }}</span>
|
|
33
|
+
<span class="sbd-rdate__current">Currently {{ row.current }}</span>
|
|
34
|
+
</div>
|
|
35
|
+
<label class="sbd-rdate__field">
|
|
36
|
+
<span>New departure date</span>
|
|
37
|
+
<input type="date" class="sbd-rdate__input"
|
|
38
|
+
[value]="row.value" [min]="row.min" [attr.max]="row.max || null"
|
|
39
|
+
(input)="changed.emit({ legId: row.leg.legId, date: $any($event.target).value })" />
|
|
40
|
+
</label>
|
|
41
|
+
</div>
|
|
42
|
+
}
|
|
43
|
+
`, host: { class: 'sbd-rdate' }, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rdate__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:14px}.sbd-rdate__head{display:flex;flex-direction:column;gap:2px}.sbd-rdate__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rdate__current{font-size:13px;color:#64748b}.sbd-rdate__field{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:12.5px;font-weight:600;color:#475569}.sbd-rdate__input{height:40px;padding:0 12px;border:1.5px solid #e2e8f0;border-radius:10px;background:#fff;font-size:13px;font-family:inherit;color:#1e2e4a}.sbd-rdate__input:focus{outline:none;border-color:var(--sbd-accent, #6d4aff)}\n"] }]
|
|
44
|
+
}] });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1kYXRlLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3N0ZXBzL3JlaXNzdWUtZGF0ZS1zdGVwL3JlaXNzdWUtZGF0ZS1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBMEJsRixNQUFNLE9BQU8sMkJBQTJCO0lBdkJ4QztRQXdCRSxTQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBb0IsQ0FBQztRQUMxQyxZQUFPLEdBQUcsTUFBTSxFQUFtQyxDQUFDO0tBQ3JEOytHQUhZLDJCQUEyQjttR0FBM0IsMkJBQTJCLDZSQW5CNUI7Ozs7Ozs7Ozs7Ozs7OztHQWVUOzs0RkFJVSwyQkFBMkI7a0JBdkJ2QyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7OztHQWVULFFBRUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVpc3N1ZURhdGVSb3cgfSBmcm9tICcuLi8uLi9yZWlzc3VlLnN0b3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNiZC1yZWlzc3VlLWRhdGUtc3RlcCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBmb3IgKHJvdyBvZiByb3dzKCk7IHRyYWNrIHJvdy5sZWcubGVnSWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmRhdGVfX2NhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1yZGF0ZV9faGVhZFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXJkYXRlX19uYW1lXCI+e3sgcm93LmxlZy5vcmlnaW5Db2RlIH19IHRvIHt7IHJvdy5sZWcuZGVzdGluYXRpb25Db2RlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXJkYXRlX19jdXJyZW50XCI+Q3VycmVudGx5IHt7IHJvdy5jdXJyZW50IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2JkLXJkYXRlX19maWVsZFwiPlxuICAgICAgICAgIDxzcGFuPk5ldyBkZXBhcnR1cmUgZGF0ZTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cInNiZC1yZGF0ZV9faW5wdXRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy52YWx1ZVwiIFttaW5dPVwicm93Lm1pblwiIFthdHRyLm1heF09XCJyb3cubWF4IHx8IG51bGxcIlxuICAgICAgICAgICAgKGlucHV0KT1cImNoYW5nZWQuZW1pdCh7IGxlZ0lkOiByb3cubGVnLmxlZ0lkLCBkYXRlOiAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlIH0pXCIgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3JlaXNzdWUtZGF0ZS1zdGVwLmNvbXBvbmVudC5zY3NzJyxcbiAgaG9zdDogeyBjbGFzczogJ3NiZC1yZGF0ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgU2JkUmVpc3N1ZURhdGVTdGVwQ29tcG9uZW50IHtcbiAgcm93cyA9IGlucHV0LnJlcXVpcmVkPFJlaXNzdWVEYXRlUm93W10+KCk7XG4gIGNoYW5nZWQgPSBvdXRwdXQ8eyBsZWdJZDogc3RyaW5nOyBkYXRlOiBzdHJpbmcgfT4oKTtcbn1cbiJdfQ==
|