@almatar/smart-booking-dashboard 0.0.1
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/LICENSE +21 -0
- package/README.md +132 -0
- package/esm2022/almatar-smart-booking-dashboard.mjs +5 -0
- package/esm2022/lib/components/action-card/action-card.component.mjs +19 -0
- package/esm2022/lib/components/action-dialog/action-dialog.component.mjs +177 -0
- package/esm2022/lib/components/action-grid/action-grid.component.mjs +18 -0
- package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +62 -0
- package/esm2022/lib/components/booking-input/booking-input.component.mjs +43 -0
- package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +1441 -0
- package/esm2022/lib/components/data-search/data-search.component.mjs +84 -0
- package/esm2022/lib/components/flight-itinerary-card/flight-itinerary-card.component.mjs +73 -0
- package/esm2022/lib/components/result-panel/result-panel.component.mjs +46 -0
- package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +19 -0
- package/esm2022/lib/config/dashboard.config.mjs +16 -0
- package/esm2022/lib/config/flight-actions.config.mjs +906 -0
- package/esm2022/lib/config/hotel-actions.config.mjs +53 -0
- package/esm2022/lib/config/labels.ar.mjs +116 -0
- package/esm2022/lib/models/action.types.mjs +2 -0
- package/esm2022/lib/models/booking.types.mjs +2 -0
- package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +145 -0
- package/esm2022/lib/services/booking.service.mjs +65 -0
- package/esm2022/lib/services/toast.service.mjs +19 -0
- package/esm2022/lib/smart-booking-dashboard.module.mjs +17 -0
- package/esm2022/lib/smart-booking-dashboard.routes.mjs +7 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/almatar-smart-booking-dashboard.mjs +3259 -0
- package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/action-card/action-card.component.d.ts +10 -0
- package/lib/components/action-dialog/action-dialog.component.d.ts +26 -0
- package/lib/components/action-grid/action-grid.component.d.ts +10 -0
- package/lib/components/add-note-dialog/add-note-dialog.component.d.ts +25 -0
- package/lib/components/booking-input/booking-input.component.d.ts +23 -0
- package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +395 -0
- package/lib/components/data-search/data-search.component.d.ts +21 -0
- package/lib/components/flight-itinerary-card/flight-itinerary-card.component.d.ts +17 -0
- package/lib/components/result-panel/result-panel.component.d.ts +14 -0
- package/lib/components/workflow-actions/workflow-actions.component.d.ts +7 -0
- package/lib/config/dashboard.config.d.ts +15 -0
- package/lib/config/flight-actions.config.d.ts +2 -0
- package/lib/config/hotel-actions.config.d.ts +2 -0
- package/lib/config/labels.ar.d.ts +2 -0
- package/lib/models/action.types.d.ts +34 -0
- package/lib/models/booking.types.d.ts +6 -0
- package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +43 -0
- package/lib/services/booking.service.d.ts +22 -0
- package/lib/services/toast.service.d.ts +10 -0
- package/lib/smart-booking-dashboard.module.d.ts +7 -0
- package/lib/smart-booking-dashboard.routes.d.ts +2 -0
- package/package.json +50 -0
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,906 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2
|
+
const na = (v) => v != null && v !== '' ? String(v) : 'Not available';
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
const bi = (data) => data?.data?.booking_info;
|
|
5
|
+
const fmtMins = (mins) => mins != null ? `${Math.floor(mins / 60)}h ${mins % 60}m` : 'Not available';
|
|
6
|
+
const fmtDate = (dt) => {
|
|
7
|
+
if (!dt)
|
|
8
|
+
return 'Not available';
|
|
9
|
+
try {
|
|
10
|
+
return new Date(dt).toLocaleString('en-GB', {
|
|
11
|
+
day: '2-digit', month: 'short', year: 'numeric',
|
|
12
|
+
hour: '2-digit', minute: '2-digit',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return dt;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const dirIcon = (dir) => (dir === 'Return' || dir === 'return') ? '←' : '→';
|
|
20
|
+
/**
|
|
21
|
+
* Format a baggage allowance object (CabinBaggage / CheckedBaggage / UnderSeatBaggage).
|
|
22
|
+
* Negative values (-1) indicate the allowance is not applicable.
|
|
23
|
+
*/
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
const fmtBag = (bag) => {
|
|
26
|
+
if (!bag)
|
|
27
|
+
return 'Not included';
|
|
28
|
+
const { Pieces, Weight, Unit, Dimension, Remark } = bag;
|
|
29
|
+
// Negative Pieces = not applicable (e.g. Pieces: -1, Weight: -1)
|
|
30
|
+
if (Pieces != null && Pieces < 0 && (Weight == null || Weight < 0))
|
|
31
|
+
return 'Not included';
|
|
32
|
+
// Zero across the board = not included
|
|
33
|
+
if (Pieces === 0 && (Weight === 0 || Weight == null))
|
|
34
|
+
return 'Not included';
|
|
35
|
+
const parts = [];
|
|
36
|
+
if (Pieces != null && Pieces > 0)
|
|
37
|
+
parts.push(`${Pieces} pc${Pieces > 1 ? 's' : ''}`);
|
|
38
|
+
if (Weight != null && Weight > 0)
|
|
39
|
+
parts.push(`${Weight} ${Unit ?? 'KG'}`);
|
|
40
|
+
if (Dimension)
|
|
41
|
+
parts.push(Dimension);
|
|
42
|
+
if (Remark)
|
|
43
|
+
parts.push(Remark);
|
|
44
|
+
return parts.length > 0 ? parts.join(' · ') : 'Not available';
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Resolve pnr_info to a flat array regardless of shape.
|
|
48
|
+
* New BE format: [{pnr, LegDirectionality}, ...]
|
|
49
|
+
* Legacy format: {pnr: '...'} or null
|
|
50
|
+
*/
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
const resolvePnrList = (pnrRaw) => {
|
|
53
|
+
if (Array.isArray(pnrRaw))
|
|
54
|
+
return pnrRaw;
|
|
55
|
+
if (pnrRaw?.pnr)
|
|
56
|
+
return [{ pnr: pnrRaw.pnr, LegDirectionality: 'Departure' }];
|
|
57
|
+
return [];
|
|
58
|
+
};
|
|
59
|
+
export const FLIGHT_ACTIONS = [
|
|
60
|
+
// ── Booking Overview ──────────────────────────────────────────────────────
|
|
61
|
+
{
|
|
62
|
+
key: 'booking_info',
|
|
63
|
+
type: 'flight',
|
|
64
|
+
label: 'Booking Overview',
|
|
65
|
+
subtitle: 'Route · Class · Fare',
|
|
66
|
+
icon: 'pi pi-file',
|
|
67
|
+
apiField: 'booking_info',
|
|
68
|
+
formatter: (data) => {
|
|
69
|
+
const d = bi(data);
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
+
const legs = d?.leg_info ?? [];
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
const airlines = d?.airline_info ?? [];
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
const passengers = d?.passenger_info?.passengers ?? [];
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
+
const baggage = d?.baggage;
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
79
|
+
const dur = d?.duration;
|
|
80
|
+
const ps = d?.payment_status;
|
|
81
|
+
const cp = d?.cancellation_policy;
|
|
82
|
+
const pnrList = resolvePnrList(d?.pnr_info);
|
|
83
|
+
const pnrDep = pnrList.find((p) => p.LegDirectionality === 'Departure')?.pnr ?? pnrList[0]?.pnr;
|
|
84
|
+
const pnrRet = pnrList.find((p) => p.LegDirectionality === 'Return')?.pnr;
|
|
85
|
+
const origin = legs[0]?.LegDepartureAirportCode;
|
|
86
|
+
const dest = legs[legs.length - 1]?.LegArrivalAirportCode;
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
const sections = [];
|
|
89
|
+
// ── Booking Reference ────────────────────────────────────────────────
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
+
const refRows = [];
|
|
92
|
+
if (pnrList.length > 1) {
|
|
93
|
+
pnrList.forEach((p) => refRows.push({ label: `PNR (${p.LegDirectionality})`, value: na(p.pnr) }));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
refRows.push({ label: 'PNR', value: na(pnrDep) });
|
|
97
|
+
}
|
|
98
|
+
refRows.push({ label: 'Booking ID', value: na(cp?.bookingId) }, { label: 'Supplier ref', value: na(cp?.supplierBookingId) }, { label: 'Supplier', value: na(cp?.supplierName ?? legs[0]?.supplierName) });
|
|
99
|
+
sections.push({ title: 'Booking Reference', rows: refRows });
|
|
100
|
+
// ── Per-leg sections ─────────────────────────────────────────────────
|
|
101
|
+
legs.forEach((l, i) => {
|
|
102
|
+
const dir = l.LegDirectionality ?? '';
|
|
103
|
+
const from = l.LegDepartureAirportCode;
|
|
104
|
+
const to = l.LegArrivalAirportCode;
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
+
const segs = airlines[i]?.Segments ?? [];
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
+
const durSegs = dur?.legs?.[i]?.Segments ?? [];
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
+
const stops = l.Stops ?? [];
|
|
111
|
+
const legDurMins = durSegs.reduce((sum, s) => sum + (s.SegmentElapsedTimeMinutes ?? 0), 0);
|
|
112
|
+
const flightNos = segs.map((s) => `${s.AirlineCode}${s.FlightNumber}`).filter(Boolean).join(', ');
|
|
113
|
+
sections.push({
|
|
114
|
+
title: `${dirIcon(dir)} ${dir || `Leg ${i + 1}`} · ${from} → ${to}`,
|
|
115
|
+
rows: [
|
|
116
|
+
{ label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
|
|
117
|
+
{ label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
|
|
118
|
+
{ label: 'Duration', value: legDurMins > 0 ? fmtMins(legDurMins) : na(null) },
|
|
119
|
+
{ label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
|
|
120
|
+
{ label: 'Flight no.', value: na(flightNos) },
|
|
121
|
+
{ label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
|
|
122
|
+
{ label: 'Fare brand', value: na(l.fareBrand?.name) },
|
|
123
|
+
{
|
|
124
|
+
label: 'Stops',
|
|
125
|
+
value: stops.length === 0
|
|
126
|
+
? 'Non-stop'
|
|
127
|
+
: stops.map((s) => `${s.StopAirportCity ?? s.StopAirport} (${fmtMins(s.LayoverDuration)})`).join(', '),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
// ── Passengers ───────────────────────────────────────────────────────
|
|
133
|
+
const paxTypeLabel = { ADT: 'Adult', CNN: 'Child', INF: 'Infant' };
|
|
134
|
+
passengers.forEach((p, i) => {
|
|
135
|
+
const fullName = [p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ');
|
|
136
|
+
const phone = p?.phone ?? (p?.contactNumber?.phoneNumber
|
|
137
|
+
? `${p.contactNumber.countryCode ?? ''}${p.contactNumber.phoneNumber}` : null);
|
|
138
|
+
sections.push({
|
|
139
|
+
title: `Passenger ${i + 1} · ${fullName || na(null)}`,
|
|
140
|
+
rows: [
|
|
141
|
+
{ label: 'Type', value: na(paxTypeLabel[p?.type] ?? p?.type) },
|
|
142
|
+
{ label: 'Gender', value: na(p?.gender) },
|
|
143
|
+
{ label: 'Date of birth', value: na(p?.dateOfBirth) },
|
|
144
|
+
{ label: 'Passport', value: na(p?.identity?.number) },
|
|
145
|
+
{ label: 'Nationality', value: na(p?.identity?.nationality) },
|
|
146
|
+
{ label: 'Passport exp.', value: na(p?.identity?.expirationDate) },
|
|
147
|
+
{ label: 'Issue country', value: na(p?.identity?.issueCountry) },
|
|
148
|
+
{ label: 'Doc type', value: na(p?.identity?.type) },
|
|
149
|
+
{ label: 'Email', value: na(p?.email) },
|
|
150
|
+
{ label: 'Phone', value: na(phone) },
|
|
151
|
+
],
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// ── Payment ──────────────────────────────────────────────────────────
|
|
155
|
+
if (ps) {
|
|
156
|
+
const statusName = ps?.status?.name ?? ps?.status?.key;
|
|
157
|
+
const paid = ps?.amountInPaidCurrency != null && ps?.paidCurrency
|
|
158
|
+
? `${ps.amountInPaidCurrency} ${ps.paidCurrency}` : null;
|
|
159
|
+
sections.push({
|
|
160
|
+
title: 'Payment',
|
|
161
|
+
rows: [
|
|
162
|
+
{ label: 'Status', value: na(statusName) },
|
|
163
|
+
{ label: 'Amount', value: ps?.amount != null ? `${ps.amount} ${na(ps.currency)}` : 'Not available' },
|
|
164
|
+
{ label: 'Paid amount', value: na(paid) },
|
|
165
|
+
{ label: 'Payment method', value: na(ps?.method) },
|
|
166
|
+
{ label: 'Date', value: fmtDate(ps?.date) },
|
|
167
|
+
],
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// ── Baggage per route (full detail) ──────────────────────────────────
|
|
171
|
+
const baggageInfo = baggage?.baggage_info ?? [];
|
|
172
|
+
baggageInfo.forEach((entry) => {
|
|
173
|
+
const route = Object.keys(entry)[0];
|
|
174
|
+
if (!route)
|
|
175
|
+
return;
|
|
176
|
+
const paxTypes = entry[route] ?? {};
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
178
|
+
const rows = [];
|
|
179
|
+
Object.entries(paxTypes).forEach(([paxType, pd]) => {
|
|
180
|
+
const label = paxType === 'ADT' ? 'Adult' : paxType === 'CNN' ? 'Child' : paxType === 'INF' ? 'Infant' : paxType;
|
|
181
|
+
const cabin = pd.CabinBaggage;
|
|
182
|
+
const checked = pd.CheckedBaggage;
|
|
183
|
+
const underSeat = pd.UnderSeatBaggage;
|
|
184
|
+
rows.push({ label: `${label} · Cabin`, value: fmtBag(cabin) }, { label: `${label} · Checked`, value: fmtBag(checked) });
|
|
185
|
+
if (underSeat)
|
|
186
|
+
rows.push({ label: `${label} · Under Seat`, value: fmtBag(underSeat) });
|
|
187
|
+
});
|
|
188
|
+
sections.push({ title: `Baggage · ${route}`, rows });
|
|
189
|
+
});
|
|
190
|
+
// ── Terminal Info summary ────────────────────────────────────────────
|
|
191
|
+
const terminalData = d?.terminal ?? [];
|
|
192
|
+
terminalData.forEach((tl, li) => {
|
|
193
|
+
const legMeta = legs[li];
|
|
194
|
+
const legLabel = legMeta
|
|
195
|
+
? `Terminal · ${legMeta.LegDepartureAirportCode} → ${legMeta.LegArrivalAirportCode}`
|
|
196
|
+
: `Terminal · Leg ${li + 1}`;
|
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
198
|
+
const termRows = [];
|
|
199
|
+
(tl.Segments ?? []).forEach((s, si) => {
|
|
200
|
+
const airlineSeg = airlines[li]?.Segments?.[si];
|
|
201
|
+
const flightNo = airlineSeg ? `${airlineSeg.AirlineCode}${airlineSeg.FlightNumber}` : `Seg ${si + 1}`;
|
|
202
|
+
const depTerm = s.DepartureAirportTerminalID ? `T${s.DepartureAirportTerminalID}` : '—';
|
|
203
|
+
const arrTerm = s.ArrivalAirportTerminalID ? `T${s.ArrivalAirportTerminalID}` : '—';
|
|
204
|
+
termRows.push({
|
|
205
|
+
label: flightNo,
|
|
206
|
+
value: `${na(s.DepartureAirportCode)} ${depTerm} → ${na(s.ArrivalAirportCode)} ${arrTerm}`,
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
if (termRows.length > 0)
|
|
210
|
+
sections.push({ title: legLabel, rows: termRows });
|
|
211
|
+
});
|
|
212
|
+
// ── Cancellation Policy summary ──────────────────────────────────────
|
|
213
|
+
const cpLegs = cp?.legs ?? [];
|
|
214
|
+
cpLegs.forEach((leg) => {
|
|
215
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
216
|
+
const cpRows = [];
|
|
217
|
+
(leg.passengerPenalties ?? []).forEach((pp) => {
|
|
218
|
+
const typeLabel = pp.type === 'ADT' ? 'Adult' : pp.type === 'CNN' ? 'Child' : 'Infant';
|
|
219
|
+
const bDep = pp.penalties?.beforeDeparture;
|
|
220
|
+
const refund = bDep?.refund;
|
|
221
|
+
const exchange = bDep?.exchange;
|
|
222
|
+
const refundStr = refund?.isActionable ? `Refund: ${refund.fee} ${refund.currency}` : 'No refund';
|
|
223
|
+
const exchangeStr = exchange?.isActionable ? `Exchange: ${exchange.fee} ${exchange.currency}` : 'No exchange';
|
|
224
|
+
cpRows.push({ label: typeLabel, value: `${refundStr} · ${exchangeStr}` });
|
|
225
|
+
});
|
|
226
|
+
if (cpRows.length > 0) {
|
|
227
|
+
sections.push({
|
|
228
|
+
title: `Cancellation and Change Policy · ${leg.direction} (${leg.from} → ${leg.to})`,
|
|
229
|
+
rows: cpRows,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
return {
|
|
234
|
+
title: origin ? `${origin} → ${dest}` : 'Flight Booking',
|
|
235
|
+
subtitle: pnrDep
|
|
236
|
+
? `PNR: ${pnrDep}${pnrRet ? ' / ' + pnrRet : ''} · ${legs.length} leg${legs.length !== 1 ? 's' : ''} · ${passengers.length} pax`
|
|
237
|
+
: `${legs.length} leg${legs.length !== 1 ? 's' : ''} · ${passengers.length} pax`,
|
|
238
|
+
sections,
|
|
239
|
+
};
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
// ── Terminal Info ─────────────────────────────────────────────────────────
|
|
243
|
+
{
|
|
244
|
+
key: 'terminal',
|
|
245
|
+
type: 'flight',
|
|
246
|
+
label: 'Terminal Info',
|
|
247
|
+
subtitle: 'Gate · Check-in',
|
|
248
|
+
icon: 'pi pi-send',
|
|
249
|
+
apiField: 'booking_info',
|
|
250
|
+
formatter: (data) => {
|
|
251
|
+
const d = bi(data);
|
|
252
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
253
|
+
const terminalLegs = d?.terminal ?? [];
|
|
254
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
255
|
+
const legInfos = d?.leg_info ?? [];
|
|
256
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
257
|
+
const airlines = d?.airline_info ?? [];
|
|
258
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
+
const sections = [];
|
|
260
|
+
terminalLegs.forEach((tl, li) => {
|
|
261
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
262
|
+
const segs = tl.Segments ?? [];
|
|
263
|
+
const legMeta = legInfos[li];
|
|
264
|
+
const legLabel = legMeta
|
|
265
|
+
? `${dirIcon(legMeta.LegDirectionality)} ${legMeta.LegDepartureAirportCode} → ${legMeta.LegArrivalAirportCode}`
|
|
266
|
+
: `Leg ${li + 1}`;
|
|
267
|
+
// Leg-level times as fallback when segment-level times are absent
|
|
268
|
+
const legDepTime = legMeta?.LegDepartureDateTime;
|
|
269
|
+
const legArrTime = legMeta?.LegArrivalDateTime;
|
|
270
|
+
segs.forEach((s, si) => {
|
|
271
|
+
const airlineSeg = airlines[li]?.Segments?.[si];
|
|
272
|
+
// Resolve flight number: terminal seg → airline_info seg
|
|
273
|
+
const flightNo = s.FlightNumber
|
|
274
|
+
? `${s.AirlineCode ?? ''}${s.FlightNumber}`
|
|
275
|
+
: airlineSeg ? `${airlineSeg.AirlineCode}${airlineSeg.FlightNumber}` : null;
|
|
276
|
+
// Resolve times: terminal seg → airline_info seg → leg-level fallback
|
|
277
|
+
const depTime = s.DepartureDateTime
|
|
278
|
+
?? airlineSeg?.DepartureDateTime
|
|
279
|
+
?? (si === 0 ? legDepTime : null);
|
|
280
|
+
const arrTime = s.ArrivalDateTime
|
|
281
|
+
?? airlineSeg?.ArrivalDateTime
|
|
282
|
+
?? (si === segs.length - 1 ? legArrTime : null);
|
|
283
|
+
sections.push({
|
|
284
|
+
title: `${legLabel} · ${flightNo ?? `Seg ${si + 1}`}`,
|
|
285
|
+
rows: [
|
|
286
|
+
{ label: 'Departure airport', value: s.DepartureAirportName ? `${s.DepartureAirportName} (${s.DepartureAirportCode})` : na(s.DepartureAirportCode) },
|
|
287
|
+
{ label: 'Dep. terminal', value: na(s.DepartureAirportTerminalID) },
|
|
288
|
+
{ label: 'Arrival airport', value: s.ArrivalAirportName ? `${s.ArrivalAirportName} (${s.ArrivalAirportCode})` : na(s.ArrivalAirportCode) },
|
|
289
|
+
{ label: 'Arr. terminal', value: na(s.ArrivalAirportTerminalID) },
|
|
290
|
+
{ label: 'Flight', value: na(flightNo) },
|
|
291
|
+
{ label: 'Departure time', value: fmtDate(depTime) },
|
|
292
|
+
{ label: 'Arrival time', value: fmtDate(arrTime) },
|
|
293
|
+
],
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
const totalSegs = sections.length;
|
|
298
|
+
return {
|
|
299
|
+
title: 'Terminal Details',
|
|
300
|
+
subtitle: `${totalSegs} segment${totalSegs !== 1 ? 's' : ''}`,
|
|
301
|
+
sections: sections.length
|
|
302
|
+
? sections
|
|
303
|
+
: [{ title: 'Info', rows: [{ label: 'Status', value: 'No terminal data available' }] }],
|
|
304
|
+
};
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
// ── Payment Status ────────────────────────────────────────────────────────
|
|
308
|
+
{
|
|
309
|
+
key: 'payment_status',
|
|
310
|
+
type: 'flight',
|
|
311
|
+
hidden: true,
|
|
312
|
+
label: 'Payment Status',
|
|
313
|
+
subtitle: 'Charges · Receipt',
|
|
314
|
+
icon: 'pi pi-credit-card',
|
|
315
|
+
apiField: 'booking_info',
|
|
316
|
+
formatter: (data) => {
|
|
317
|
+
const ps = bi(data)?.payment_status;
|
|
318
|
+
const statusName = ps?.status?.name ?? ps?.status?.key;
|
|
319
|
+
const paid = ps?.amountInPaidCurrency != null && ps?.paidCurrency
|
|
320
|
+
? `${ps.amountInPaidCurrency} ${ps.paidCurrency}` : null;
|
|
321
|
+
const isSuccess = ps?.status?.key === 'SUCCESS';
|
|
322
|
+
return {
|
|
323
|
+
title: 'Payment Details',
|
|
324
|
+
subtitle: na(statusName),
|
|
325
|
+
sections: [
|
|
326
|
+
{
|
|
327
|
+
title: 'Transaction',
|
|
328
|
+
rows: [
|
|
329
|
+
{ label: 'Status', value: na(statusName), valueClass: isSuccess ? 'positive' : 'neutral' },
|
|
330
|
+
{ label: 'Amount', value: ps?.amount != null ? `${ps.amount} ${na(ps.currency)}` : 'Not available' },
|
|
331
|
+
{ label: 'Paid amount', value: na(paid) },
|
|
332
|
+
{ label: 'Payment method', value: na(ps?.method) },
|
|
333
|
+
{ label: 'Transaction ref', value: na(ps?.transactionRef ?? ps?.reference) },
|
|
334
|
+
{ label: 'Date', value: fmtDate(ps?.date) },
|
|
335
|
+
{ label: 'Currency', value: na(ps?.currency) },
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
};
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
// ── Passenger Info ────────────────────────────────────────────────────────
|
|
343
|
+
{
|
|
344
|
+
key: 'passenger_info',
|
|
345
|
+
type: 'flight',
|
|
346
|
+
hidden: true,
|
|
347
|
+
label: 'Passenger Info',
|
|
348
|
+
subtitle: 'Names · Docs',
|
|
349
|
+
icon: 'pi pi-users',
|
|
350
|
+
apiField: 'booking_info',
|
|
351
|
+
formatter: (data) => {
|
|
352
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
353
|
+
const passengers = bi(data)?.passenger_info?.passengers ?? [];
|
|
354
|
+
const typeLabel = { ADT: 'Adult', CNN: 'Child', INF: 'Infant' };
|
|
355
|
+
return {
|
|
356
|
+
title: 'Passenger Details',
|
|
357
|
+
subtitle: `${passengers.length} traveller${passengers.length !== 1 ? 's' : ''}`,
|
|
358
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
359
|
+
sections: passengers.map((p, i) => {
|
|
360
|
+
const fullName = [p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ');
|
|
361
|
+
const phone = p?.phone ?? (p?.contactNumber?.phoneNumber
|
|
362
|
+
? `${p.contactNumber.countryCode ?? ''}${p.contactNumber.phoneNumber}` : null);
|
|
363
|
+
return {
|
|
364
|
+
title: `Passenger ${i + 1} · ${fullName || na(null)}`,
|
|
365
|
+
rows: [
|
|
366
|
+
{ label: 'Type', value: na(typeLabel[p?.type] ?? p?.type) },
|
|
367
|
+
{ label: 'Gender', value: na(p?.gender) },
|
|
368
|
+
{ label: 'Date of birth', value: na(p?.dateOfBirth) },
|
|
369
|
+
{ label: 'Passport', value: na(p?.identity?.number) },
|
|
370
|
+
{ label: 'Nationality', value: na(p?.identity?.nationality) },
|
|
371
|
+
{ label: 'Passport exp.', value: na(p?.identity?.expirationDate) },
|
|
372
|
+
{ label: 'Issue country', value: na(p?.identity?.issueCountry) },
|
|
373
|
+
{ label: 'Doc type', value: na(p?.identity?.type) },
|
|
374
|
+
{ label: 'Email', value: na(p?.email) },
|
|
375
|
+
{ label: 'Phone', value: na(phone) },
|
|
376
|
+
],
|
|
377
|
+
};
|
|
378
|
+
}),
|
|
379
|
+
};
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
// ── Passenger Count ───────────────────────────────────────────────────────
|
|
383
|
+
{
|
|
384
|
+
key: 'passenger_count',
|
|
385
|
+
type: 'flight',
|
|
386
|
+
hidden: true,
|
|
387
|
+
label: 'Passenger Count',
|
|
388
|
+
subtitle: 'Adults · Children · Infants',
|
|
389
|
+
icon: 'pi pi-users',
|
|
390
|
+
apiField: 'booking_info',
|
|
391
|
+
formatter: (data) => {
|
|
392
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
393
|
+
const passengers = bi(data)?.passenger_info?.passengers ?? [];
|
|
394
|
+
const adults = passengers.filter(p => p?.type === 'ADT');
|
|
395
|
+
const children = passengers.filter(p => p?.type === 'CNN');
|
|
396
|
+
const infants = passengers.filter(p => p?.type === 'INF');
|
|
397
|
+
return {
|
|
398
|
+
title: 'Traveller Breakdown',
|
|
399
|
+
subtitle: `${passengers.length} total`,
|
|
400
|
+
sections: [
|
|
401
|
+
{
|
|
402
|
+
title: 'Summary',
|
|
403
|
+
rows: [
|
|
404
|
+
{ label: 'Total', value: String(passengers.length) },
|
|
405
|
+
{ label: 'Adults (ADT)', value: String(adults.length) },
|
|
406
|
+
{ label: 'Children (CNN)', value: String(children.length) },
|
|
407
|
+
{ label: 'Infants (INF)', value: String(infants.length) },
|
|
408
|
+
],
|
|
409
|
+
},
|
|
410
|
+
...adults.map((p, i) => ({
|
|
411
|
+
title: `Adult ${i + 1} · ${[p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ') || 'N/A'}`,
|
|
412
|
+
rows: [
|
|
413
|
+
{ label: 'Passport', value: na(p?.identity?.number) },
|
|
414
|
+
{ label: 'Email', value: na(p?.email) },
|
|
415
|
+
],
|
|
416
|
+
})),
|
|
417
|
+
...children.map((p, i) => ({
|
|
418
|
+
title: `Child ${i + 1} · ${[p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ') || 'N/A'}`,
|
|
419
|
+
rows: [
|
|
420
|
+
{ label: 'Passport', value: na(p?.identity?.number) },
|
|
421
|
+
{ label: 'DOB', value: na(p?.dateOfBirth) },
|
|
422
|
+
],
|
|
423
|
+
})),
|
|
424
|
+
...infants.map((p, i) => ({
|
|
425
|
+
title: `Infant ${i + 1} · ${[p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ') || 'N/A'}`,
|
|
426
|
+
rows: [
|
|
427
|
+
{ label: 'DOB', value: na(p?.dateOfBirth) },
|
|
428
|
+
],
|
|
429
|
+
})),
|
|
430
|
+
],
|
|
431
|
+
};
|
|
432
|
+
},
|
|
433
|
+
},
|
|
434
|
+
// ── Airline Info ──────────────────────────────────────────────────────────
|
|
435
|
+
{
|
|
436
|
+
key: 'airline_info',
|
|
437
|
+
type: 'flight',
|
|
438
|
+
hidden: true,
|
|
439
|
+
label: 'Airline Info',
|
|
440
|
+
subtitle: 'Carrier · Flight no.',
|
|
441
|
+
icon: 'pi pi-send',
|
|
442
|
+
apiField: 'booking_info',
|
|
443
|
+
formatter: (data) => {
|
|
444
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
445
|
+
const airlines = bi(data)?.airline_info ?? [];
|
|
446
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
447
|
+
const legInfos = bi(data)?.leg_info ?? [];
|
|
448
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
449
|
+
const durLegs = bi(data)?.duration?.legs ?? [];
|
|
450
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
451
|
+
const sections = [];
|
|
452
|
+
airlines.forEach((a, li) => {
|
|
453
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
454
|
+
const segs = a.Segments ?? [];
|
|
455
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
456
|
+
const durSegs = durLegs[li]?.Segments ?? [];
|
|
457
|
+
const legMeta = legInfos[li];
|
|
458
|
+
const legLabel = legMeta
|
|
459
|
+
? `${dirIcon(legMeta.LegDirectionality)} ${legMeta.LegDepartureAirportCode} → ${legMeta.LegArrivalAirportCode}`
|
|
460
|
+
: `Leg ${li + 1}`;
|
|
461
|
+
// Leg-level times as fallback for first/last segment
|
|
462
|
+
const legDepTime = legMeta?.LegDepartureDateTime;
|
|
463
|
+
const legArrTime = legMeta?.LegArrivalDateTime;
|
|
464
|
+
segs.forEach((s, si) => {
|
|
465
|
+
// Use segment-level times if available, fall back to leg times
|
|
466
|
+
const depTime = s.DepartureDateTime ?? (si === 0 ? legDepTime : null);
|
|
467
|
+
const arrTime = s.ArrivalDateTime ?? (si === segs.length - 1 ? legArrTime : null);
|
|
468
|
+
sections.push({
|
|
469
|
+
title: `${legLabel} · ${s.AirlineCode}${s.FlightNumber} (Seg ${si + 1})`,
|
|
470
|
+
rows: [
|
|
471
|
+
{ label: 'Airline', value: na(s.AirlineName) },
|
|
472
|
+
{ label: 'IATA code', value: na(s.AirlineCode) },
|
|
473
|
+
{ label: 'Flight no.', value: s.FlightNumber ? `${s.AirlineCode}${s.FlightNumber}` : 'Not available' },
|
|
474
|
+
{ label: 'Route', value: `${na(s.DepartureAirportCode)} → ${na(s.ArrivalAirportCode)}` },
|
|
475
|
+
{ label: 'Departure', value: fmtDate(depTime) },
|
|
476
|
+
{ label: 'Arrival', value: fmtDate(arrTime) },
|
|
477
|
+
{ label: 'Duration', value: durSegs[si]?.SegmentElapsedTimeMinutes ? fmtMins(durSegs[si].SegmentElapsedTimeMinutes) : 'Not available' },
|
|
478
|
+
{ label: 'Aircraft', value: na(s.AircraftType ?? s.Equipment) },
|
|
479
|
+
{ label: 'Operating code', value: na(s.OperatingAirlineCode) },
|
|
480
|
+
],
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
const totalSegs = sections.length;
|
|
485
|
+
return {
|
|
486
|
+
title: airlines[0]?.Segments?.[0]?.AirlineName ?? 'Airline Info',
|
|
487
|
+
subtitle: `${totalSegs} segment${totalSegs !== 1 ? 's' : ''}`,
|
|
488
|
+
sections,
|
|
489
|
+
};
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
// ── Leg Info ──────────────────────────────────────────────────────────────
|
|
493
|
+
{
|
|
494
|
+
key: 'leg_info',
|
|
495
|
+
type: 'flight',
|
|
496
|
+
hidden: true,
|
|
497
|
+
label: 'Leg Info',
|
|
498
|
+
subtitle: 'Route · Stops · Cabin',
|
|
499
|
+
icon: 'pi pi-map-marker',
|
|
500
|
+
apiField: 'booking_info',
|
|
501
|
+
formatter: (data) => {
|
|
502
|
+
const d = bi(data);
|
|
503
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
504
|
+
const legs = d?.leg_info ?? [];
|
|
505
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
506
|
+
const airlines = d?.airline_info ?? [];
|
|
507
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
508
|
+
const durLegs = d?.duration?.legs ?? [];
|
|
509
|
+
return {
|
|
510
|
+
title: 'Flight Legs',
|
|
511
|
+
subtitle: `${legs.length} leg${legs.length !== 1 ? 's' : ''}`,
|
|
512
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
513
|
+
sections: legs.map((l, i) => {
|
|
514
|
+
const dir = l.LegDirectionality ?? '';
|
|
515
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
516
|
+
const stops = l.Stops ?? [];
|
|
517
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
518
|
+
const segs = airlines[i]?.Segments ?? [];
|
|
519
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
520
|
+
const durSegs = durLegs[i]?.Segments ?? [];
|
|
521
|
+
const legDurMins = durSegs.reduce((sum, s) => sum + (s.SegmentElapsedTimeMinutes ?? 0), 0);
|
|
522
|
+
const flightNos = segs.map((s) => `${s.AirlineCode}${s.FlightNumber}`).filter(Boolean).join(', ');
|
|
523
|
+
return {
|
|
524
|
+
title: `${dirIcon(dir)} ${dir || `Leg ${i + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
|
|
525
|
+
rows: [
|
|
526
|
+
{ label: 'Direction', value: na(dir) },
|
|
527
|
+
{ label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
|
|
528
|
+
{ label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
|
|
529
|
+
{ label: 'Duration', value: legDurMins > 0 ? fmtMins(legDurMins) : na(null) },
|
|
530
|
+
{ label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
|
|
531
|
+
{ label: 'Flight no.', value: na(flightNos) },
|
|
532
|
+
{ label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
|
|
533
|
+
{ label: 'Fare brand', value: na(l.fareBrand?.name) },
|
|
534
|
+
{ label: 'Supplier', value: na(l.supplierName) },
|
|
535
|
+
{
|
|
536
|
+
label: 'Stops',
|
|
537
|
+
value: stops.length === 0
|
|
538
|
+
? 'Non-stop'
|
|
539
|
+
: stops.map((s) => `${s.StopAirportCity ?? s.StopAirport} (${na(s.StopAirport)}) – ${fmtMins(s.LayoverDuration)} layover`).join(' · '),
|
|
540
|
+
},
|
|
541
|
+
],
|
|
542
|
+
};
|
|
543
|
+
}),
|
|
544
|
+
};
|
|
545
|
+
},
|
|
546
|
+
},
|
|
547
|
+
// ── PNR Info ──────────────────────────────────────────────────────────────
|
|
548
|
+
{
|
|
549
|
+
key: 'pnr_info',
|
|
550
|
+
type: 'flight',
|
|
551
|
+
label: 'PNR Info',
|
|
552
|
+
subtitle: 'PNR · Booking ref',
|
|
553
|
+
icon: 'pi pi-tag',
|
|
554
|
+
apiField: 'booking_info',
|
|
555
|
+
formatter: (data) => {
|
|
556
|
+
const d = bi(data);
|
|
557
|
+
const pnrList = resolvePnrList(d?.pnr_info);
|
|
558
|
+
const pnrDep = pnrList.find((p) => p.LegDirectionality === 'Departure')?.pnr ?? pnrList[0]?.pnr;
|
|
559
|
+
const pnrRet = pnrList.find((p) => p.LegDirectionality === 'Return')?.pnr;
|
|
560
|
+
const cp = d?.cancellation_policy;
|
|
561
|
+
const isCrossSeller = pnrList.length > 1
|
|
562
|
+
|| cp?.supplierName?.toLowerCase().includes('cross')
|
|
563
|
+
|| false;
|
|
564
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
565
|
+
const pnrRows = [];
|
|
566
|
+
if (pnrList.length > 1) {
|
|
567
|
+
pnrList.forEach((p) => {
|
|
568
|
+
pnrRows.push({ label: `PNR (${p.LegDirectionality})`, value: na(p.pnr) });
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
pnrRows.push({ label: 'PNR', value: na(pnrDep) });
|
|
573
|
+
}
|
|
574
|
+
pnrRows.push({ label: 'Booking ID', value: na(cp?.bookingId) }, { label: 'Supplier ref', value: na(cp?.supplierBookingId) }, { label: 'Supplier', value: na(cp?.supplierName) }, { label: 'Cross-seller', value: isCrossSeller ? 'Yes' : 'No' });
|
|
575
|
+
return {
|
|
576
|
+
title: pnrDep ? `PNR: ${pnrDep}${pnrRet ? ' / ' + pnrRet : ''}` : 'PNR Info',
|
|
577
|
+
subtitle: isCrossSeller ? 'Cross-seller booking — two PNRs' : 'Global Distribution System reference',
|
|
578
|
+
sections: [{ title: 'References', rows: pnrRows }],
|
|
579
|
+
};
|
|
580
|
+
},
|
|
581
|
+
},
|
|
582
|
+
// ── Baggage Policy ────────────────────────────────────────────────────────
|
|
583
|
+
{
|
|
584
|
+
key: 'baggage',
|
|
585
|
+
type: 'flight',
|
|
586
|
+
label: 'Baggage Policy',
|
|
587
|
+
subtitle: 'Cabin · Checked · Add-ons',
|
|
588
|
+
icon: 'pi pi-briefcase',
|
|
589
|
+
apiField: 'booking_info',
|
|
590
|
+
formatter: (data) => {
|
|
591
|
+
const baggage = bi(data)?.baggage;
|
|
592
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
593
|
+
const infoArray = baggage?.baggage_info ?? [];
|
|
594
|
+
const addOns = baggage?.add_on_baggage ?? [];
|
|
595
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
596
|
+
const sections = [];
|
|
597
|
+
const routeNames = [];
|
|
598
|
+
infoArray.forEach((entry) => {
|
|
599
|
+
const route = Object.keys(entry)[0];
|
|
600
|
+
if (!route)
|
|
601
|
+
return;
|
|
602
|
+
routeNames.push(route);
|
|
603
|
+
const paxTypes = entry[route] ?? {};
|
|
604
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
605
|
+
const rows = [];
|
|
606
|
+
Object.entries(paxTypes).forEach(([paxType, pd]) => {
|
|
607
|
+
const label = paxType === 'ADT' ? 'Adult' : paxType === 'CNN' ? 'Child' : paxType === 'INF' ? 'Infant' : paxType;
|
|
608
|
+
const cabin = pd.CabinBaggage;
|
|
609
|
+
const checked = pd.CheckedBaggage;
|
|
610
|
+
const underSeat = pd.UnderSeatBaggage;
|
|
611
|
+
rows.push({ label: `${label} · Cabin`, value: fmtBag(cabin) }, { label: `${label} · Checked`, value: fmtBag(checked) });
|
|
612
|
+
if (underSeat) {
|
|
613
|
+
rows.push({ label: `${label} · Under Seat`, value: fmtBag(underSeat) });
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
sections.push({ title: `Baggage · ${route}`, rows });
|
|
617
|
+
});
|
|
618
|
+
if (addOns.length > 0) {
|
|
619
|
+
sections.push({
|
|
620
|
+
title: 'Add-on Baggage',
|
|
621
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
622
|
+
rows: addOns.map((a, i) => ({
|
|
623
|
+
label: `Add-on ${i + 1}`,
|
|
624
|
+
value: [a.weight, a.unit, a.route].filter(Boolean).join(' · ') || 'See booking details',
|
|
625
|
+
})),
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
return {
|
|
629
|
+
title: 'Baggage Allowance',
|
|
630
|
+
subtitle: routeNames.length > 0 ? routeNames.join(' · ') : 'All baggage types',
|
|
631
|
+
sections: sections.length > 0
|
|
632
|
+
? sections
|
|
633
|
+
: [{ title: 'Info', rows: [{ label: 'Status', value: 'No baggage data available' }] }],
|
|
634
|
+
};
|
|
635
|
+
},
|
|
636
|
+
},
|
|
637
|
+
// ── Flight Timings ────────────────────────────────────────────────────────
|
|
638
|
+
{
|
|
639
|
+
key: 'flight_timings',
|
|
640
|
+
type: 'flight',
|
|
641
|
+
hidden: true,
|
|
642
|
+
label: 'Flight Timings',
|
|
643
|
+
subtitle: 'Departure · Arrival',
|
|
644
|
+
icon: 'pi pi-clock',
|
|
645
|
+
apiField: 'booking_info',
|
|
646
|
+
formatter: (data) => {
|
|
647
|
+
const d = bi(data);
|
|
648
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
649
|
+
const legs = d?.leg_info ?? [];
|
|
650
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
651
|
+
const airlines = d?.airline_info ?? [];
|
|
652
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
653
|
+
const durLegs = d?.duration?.legs ?? [];
|
|
654
|
+
return {
|
|
655
|
+
title: 'Flight Timings',
|
|
656
|
+
subtitle: legs.length > 0
|
|
657
|
+
? `${legs[0].LegDepartureAirportCode} → ${legs[legs.length - 1].LegArrivalAirportCode}`
|
|
658
|
+
: 'All legs',
|
|
659
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
660
|
+
sections: legs.map((l, li) => {
|
|
661
|
+
const dir = l.LegDirectionality ?? '';
|
|
662
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
663
|
+
const segs = airlines[li]?.Segments ?? [];
|
|
664
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
665
|
+
const durSegs = durLegs[li]?.Segments ?? [];
|
|
666
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
667
|
+
const stops = l.Stops ?? [];
|
|
668
|
+
const legDurMins = durSegs.reduce((sum, s) => sum + (s.SegmentElapsedTimeMinutes ?? 0), 0);
|
|
669
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
670
|
+
const rows = [
|
|
671
|
+
{ label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
|
|
672
|
+
{ label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
|
|
673
|
+
{ label: 'Duration', value: legDurMins > 0 ? fmtMins(legDurMins) : na(null) },
|
|
674
|
+
];
|
|
675
|
+
// Interleave segment rows with layover rows
|
|
676
|
+
segs.forEach((s, si) => {
|
|
677
|
+
const segDur = durSegs[si]?.SegmentElapsedTimeMinutes;
|
|
678
|
+
rows.push({
|
|
679
|
+
label: `Seg ${si + 1} · ${s.AirlineCode}${s.FlightNumber}`,
|
|
680
|
+
value: `${na(s.DepartureAirportCode)} → ${na(s.ArrivalAirportCode)}${segDur ? ' · ' + fmtMins(segDur) : ''}`,
|
|
681
|
+
});
|
|
682
|
+
// Layover after this segment (if there is a stop at arrival airport)
|
|
683
|
+
if (si < segs.length - 1) {
|
|
684
|
+
const stop = stops.find((st) => st.StopAirport === s.ArrivalAirportCode);
|
|
685
|
+
if (stop) {
|
|
686
|
+
rows.push({ label: `Layover · ${stop.StopAirport}`, value: fmtMins(stop.LayoverDuration) });
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
return {
|
|
691
|
+
title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
|
|
692
|
+
rows,
|
|
693
|
+
};
|
|
694
|
+
}),
|
|
695
|
+
};
|
|
696
|
+
},
|
|
697
|
+
},
|
|
698
|
+
// ── Duration ──────────────────────────────────────────────────────────────
|
|
699
|
+
{
|
|
700
|
+
key: 'duration',
|
|
701
|
+
type: 'flight',
|
|
702
|
+
hidden: true,
|
|
703
|
+
label: 'Duration',
|
|
704
|
+
subtitle: 'Total flight time',
|
|
705
|
+
icon: 'pi pi-refresh',
|
|
706
|
+
apiField: 'booking_info',
|
|
707
|
+
formatter: (data) => {
|
|
708
|
+
const d = bi(data);
|
|
709
|
+
const dur = d?.duration;
|
|
710
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
711
|
+
const legs = d?.leg_info ?? [];
|
|
712
|
+
const total = fmtMins(dur?.totalMinutes);
|
|
713
|
+
return {
|
|
714
|
+
title: total,
|
|
715
|
+
subtitle: 'Total journey duration including layovers',
|
|
716
|
+
sections: [
|
|
717
|
+
{
|
|
718
|
+
title: 'Total',
|
|
719
|
+
rows: [{ label: 'Journey duration', value: total }],
|
|
720
|
+
},
|
|
721
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
722
|
+
...(dur?.legs ?? []).map((leg, li) => {
|
|
723
|
+
const legMeta = legs[li];
|
|
724
|
+
const dir = legMeta?.LegDirectionality ?? '';
|
|
725
|
+
const from = legMeta?.LegDepartureAirportCode;
|
|
726
|
+
const to = legMeta?.LegArrivalAirportCode;
|
|
727
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
728
|
+
const rows = [];
|
|
729
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
730
|
+
(leg.Segments ?? []).forEach((s) => {
|
|
731
|
+
rows.push({ label: `${s.DepartureAirportCode} → ${s.ArrivalAirportCode}`, value: fmtMins(s.SegmentElapsedTimeMinutes) });
|
|
732
|
+
});
|
|
733
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
734
|
+
(leg.Stops ?? []).forEach((s) => {
|
|
735
|
+
rows.push({ label: `Layover · ${s.StopAirport}`, value: fmtMins(s.LayoverDuration) });
|
|
736
|
+
});
|
|
737
|
+
return {
|
|
738
|
+
title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`}${from && to ? ` · ${from} → ${to}` : ''}`,
|
|
739
|
+
rows,
|
|
740
|
+
};
|
|
741
|
+
}),
|
|
742
|
+
],
|
|
743
|
+
};
|
|
744
|
+
},
|
|
745
|
+
},
|
|
746
|
+
// ── Cancellation Policy ───────────────────────────────────────────────────
|
|
747
|
+
{
|
|
748
|
+
key: 'cancellation_policy',
|
|
749
|
+
type: 'flight',
|
|
750
|
+
label: 'Cancellation Policy',
|
|
751
|
+
subtitle: 'Refund · Fees · Legs',
|
|
752
|
+
icon: 'pi pi-ban',
|
|
753
|
+
apiField: 'booking_info',
|
|
754
|
+
formatter: (data) => {
|
|
755
|
+
const d = bi(data);
|
|
756
|
+
const cp = d?.cancellation_policy;
|
|
757
|
+
if (!cp) {
|
|
758
|
+
return {
|
|
759
|
+
title: 'Cancellation Policy',
|
|
760
|
+
subtitle: 'No data available',
|
|
761
|
+
sections: [{ title: 'Info', rows: [{ label: 'Status', value: 'No cancellation policy data available' }] }],
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
765
|
+
const sections = [];
|
|
766
|
+
const pnrList = resolvePnrList(d?.pnr_info);
|
|
767
|
+
const isCrossSeller = pnrList.length > 1 || cp?.supplierName?.toLowerCase().includes('cross');
|
|
768
|
+
const legs = cp?.legs ?? [];
|
|
769
|
+
sections.push({
|
|
770
|
+
title: 'Booking Reference',
|
|
771
|
+
rows: [
|
|
772
|
+
{ label: 'Booking ID', value: na(cp.bookingId) },
|
|
773
|
+
{ label: 'Supplier ref', value: na(cp.supplierBookingId) },
|
|
774
|
+
{ label: 'Supplier', value: na(cp.supplierName) },
|
|
775
|
+
{ label: 'Cross-seller', value: isCrossSeller ? 'Yes' : 'No' },
|
|
776
|
+
],
|
|
777
|
+
});
|
|
778
|
+
const fmtFee = (fee, currency) => fee != null ? `${fee} ${currency ?? 'SAR'}` : '0';
|
|
779
|
+
legs.forEach((leg) => {
|
|
780
|
+
const title = `Cancellation and Change Policy · ${leg.direction} (${leg.from} → ${leg.to})`;
|
|
781
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
782
|
+
const rows = [];
|
|
783
|
+
(leg.passengerPenalties ?? []).forEach((pp) => {
|
|
784
|
+
const typeLabel = pp.type === 'ADT' ? 'Adult' : pp.type === 'CNN' ? 'Child' : 'Infant';
|
|
785
|
+
const bDep = pp.penalties?.beforeDeparture;
|
|
786
|
+
const aDep = pp.penalties?.afterDeparture;
|
|
787
|
+
const bRefund = bDep?.refund;
|
|
788
|
+
const bExchange = bDep?.exchange;
|
|
789
|
+
const aRefund = aDep?.refund;
|
|
790
|
+
const aExchange = aDep?.exchange;
|
|
791
|
+
rows.push({
|
|
792
|
+
label: `${typeLabel} · Before dep.`,
|
|
793
|
+
value: [
|
|
794
|
+
bRefund?.isActionable ? `Refund: ${fmtFee(bRefund.fee, bRefund.currency)}` : 'No refund',
|
|
795
|
+
bExchange?.isActionable ? `Exchange: ${fmtFee(bExchange.fee, bExchange.currency)}` : 'No exchange',
|
|
796
|
+
].join(' · '),
|
|
797
|
+
valueClass: bRefund?.isActionable || bExchange?.isActionable ? 'neutral' : 'negative',
|
|
798
|
+
}, {
|
|
799
|
+
label: `${typeLabel} · After dep.`,
|
|
800
|
+
value: [
|
|
801
|
+
aRefund?.isActionable ? `Refund: ${fmtFee(aRefund.fee, aRefund.currency)}` : 'No refund',
|
|
802
|
+
aExchange?.isActionable ? `Exchange: ${fmtFee(aExchange.fee, aExchange.currency)}` : 'No exchange',
|
|
803
|
+
].join(' · '),
|
|
804
|
+
valueClass: aRefund?.isActionable || aExchange?.isActionable ? 'neutral' : 'negative',
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
sections.push({ title, rows });
|
|
808
|
+
});
|
|
809
|
+
return {
|
|
810
|
+
title: `${cp.supplierName ?? 'Cancellation'} Policy`,
|
|
811
|
+
subtitle: isCrossSeller ? 'Cross-seller booking · contact supplier for refund' : `Booking ${cp.bookingId ?? ''}`,
|
|
812
|
+
sections,
|
|
813
|
+
callout: isCrossSeller
|
|
814
|
+
? { type: 'info', message: 'Cross-seller booking — refund is processed by the partner and may take additional time.' }
|
|
815
|
+
: undefined,
|
|
816
|
+
};
|
|
817
|
+
},
|
|
818
|
+
},
|
|
819
|
+
// ── Flight Status ─────────────────────────────────────────────────────────
|
|
820
|
+
{
|
|
821
|
+
key: 'flight_status',
|
|
822
|
+
type: 'flight',
|
|
823
|
+
hidden: true,
|
|
824
|
+
label: 'Flight Status',
|
|
825
|
+
subtitle: 'Live · Delays',
|
|
826
|
+
icon: 'pi pi-chart-bar',
|
|
827
|
+
apiField: 'booking_info',
|
|
828
|
+
formatter: (data) => {
|
|
829
|
+
const d = bi(data);
|
|
830
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
831
|
+
const legs = d?.leg_info ?? [];
|
|
832
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
833
|
+
const airlines = d?.airline_info ?? [];
|
|
834
|
+
const origin = legs[0]?.LegDepartureAirportCode;
|
|
835
|
+
const dest = legs[legs.length - 1]?.LegArrivalAirportCode;
|
|
836
|
+
return {
|
|
837
|
+
title: origin ? `${origin} → ${dest}` : 'Flight Status',
|
|
838
|
+
subtitle: `${legs.length} leg${legs.length !== 1 ? 's' : ''} · Scheduled times from booking`,
|
|
839
|
+
sections: legs.map((l, li) => {
|
|
840
|
+
const dir = l.LegDirectionality ?? '';
|
|
841
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
842
|
+
const segs = airlines[li]?.Segments ?? [];
|
|
843
|
+
return {
|
|
844
|
+
title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
|
|
845
|
+
rows: [
|
|
846
|
+
{ label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
|
|
847
|
+
{ label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
|
|
848
|
+
{ label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
|
|
849
|
+
{ label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
|
|
850
|
+
{ label: 'Fare brand', value: na(l.fareBrand?.name) },
|
|
851
|
+
...segs.map((s, si) => ({
|
|
852
|
+
label: `Flight ${si + 1}`,
|
|
853
|
+
value: `${s.AirlineCode}${s.FlightNumber} · ${s.DepartureAirportCode} → ${s.ArrivalAirportCode}`,
|
|
854
|
+
})),
|
|
855
|
+
],
|
|
856
|
+
};
|
|
857
|
+
}),
|
|
858
|
+
callout: { type: 'info', message: 'Live status not available — check the airline app or airport boards for real-time updates.' },
|
|
859
|
+
};
|
|
860
|
+
},
|
|
861
|
+
},
|
|
862
|
+
// ── Wi-Fi & Extras ────────────────────────────────────────────────────────
|
|
863
|
+
{
|
|
864
|
+
key: 'wifi',
|
|
865
|
+
type: 'flight',
|
|
866
|
+
hidden: true,
|
|
867
|
+
label: 'Wi-Fi & Extras',
|
|
868
|
+
subtitle: 'Onboard services',
|
|
869
|
+
icon: 'pi pi-info-circle',
|
|
870
|
+
apiField: 'booking_info',
|
|
871
|
+
formatter: (data) => {
|
|
872
|
+
const d = bi(data);
|
|
873
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
874
|
+
const legs = d?.leg_info ?? [];
|
|
875
|
+
const addOns = d?.baggage?.add_on_baggage ?? [];
|
|
876
|
+
return {
|
|
877
|
+
title: 'Onboard Extras',
|
|
878
|
+
subtitle: `${legs.length} leg${legs.length !== 1 ? 's' : ''}`,
|
|
879
|
+
sections: [
|
|
880
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
881
|
+
...legs.map((l, li) => {
|
|
882
|
+
const dir = l.LegDirectionality ?? '';
|
|
883
|
+
return {
|
|
884
|
+
title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
|
|
885
|
+
rows: [
|
|
886
|
+
{ label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
|
|
887
|
+
{ label: 'Fare brand', value: na(l.fareBrand?.name) },
|
|
888
|
+
{ label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
|
|
889
|
+
],
|
|
890
|
+
};
|
|
891
|
+
}),
|
|
892
|
+
...(addOns.length > 0 ? [{
|
|
893
|
+
title: 'Add-on Baggage',
|
|
894
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
895
|
+
rows: addOns.map((a, i) => ({
|
|
896
|
+
label: `Add-on ${i + 1}`,
|
|
897
|
+
value: [a.weight, a.unit, a.route].filter(Boolean).join(' · ') || 'See booking details',
|
|
898
|
+
})),
|
|
899
|
+
}] : []),
|
|
900
|
+
],
|
|
901
|
+
callout: { type: 'info', message: 'Detailed onboard amenities depend on the operating airline and fare class.' },
|
|
902
|
+
};
|
|
903
|
+
},
|
|
904
|
+
},
|
|
905
|
+
];
|
|
906
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpZ2h0LWFjdGlvbnMuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb25maWcvZmxpZ2h0LWFjdGlvbnMuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLDhEQUE4RDtBQUM5RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQU0sRUFBVSxFQUFFLENBQzVCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFFdEQsOERBQThEO0FBQzlELE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQztBQUVuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFLENBQ3ZDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFFN0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQVUsRUFBRTtJQUNyQyxJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sZUFBZSxDQUFDO0lBQ2hDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUMxQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVM7WUFDL0MsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUztTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxD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TyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLHFCQUFxQjs2QkFDeEYsQ0FBQyxDQUFDO3lCQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNUO2dCQUNELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLDRFQUE0RSxFQUFFO2FBQ2pILENBQUM7UUFDSixDQUFDO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2FjdGlvbi50eXBlcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBuYSA9ICh2OiBhbnkpOiBzdHJpbmcgPT5cbiAgdiAhPSBudWxsICYmIHYgIT09ICcnID8gU3RyaW5nKHYpIDogJ05vdCBhdmFpbGFibGUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgYmkgPSAoZGF0YTogYW55KSA9PiBkYXRhPy5kYXRhPy5ib29raW5nX2luZm87XG5cbmNvbnN0IGZtdE1pbnMgPSAobWluczogbnVtYmVyKTogc3RyaW5nID0+XG4gIG1pbnMgIT0gbnVsbCA/IGAke01hdGguZmxvb3IobWlucyAvIDYwKX1oICR7bWlucyAlIDYwfW1gIDogJ05vdCBhdmFpbGFibGUnO1xuXG5jb25zdCBmbXREYXRlID0gKGR0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWR0KSByZXR1cm4gJ05vdCBhdmFpbGFibGUnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZShkdCkudG9Mb2NhbGVTdHJpbmcoJ2VuLUdCJywge1xuICAgICAgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIH0pO1xuICB9IGNhdGNoIHsgcmV0dXJuIGR0OyB9XG59O1xuXG5jb25zdCBkaXJJY29uID0gKGRpcjogc3RyaW5nKSA9PiAoZGlyID09PSAnUmV0dXJuJyB8fCBkaXIgPT09ICdyZXR1cm4nKSA/ICfihpAnIDogJ+KGkic7XG5cbi8qKlxuICogRm9ybWF0IGEgYmFnZ2FnZSBhbGxvd2FuY2Ugb2JqZWN0IChDYWJpbkJhZ2dhZ2UgLyBDaGVja2VkQmFnZ2FnZSAvIFVuZGVyU2VhdEJhZ2dhZ2UpLlxuICogTmVnYXRpdmUgdmFsdWVzICgtMSkgaW5kaWNhdGUgdGhlIGFsbG93YW5jZSBpcyBub3QgYXBwbGljYWJsZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGZtdEJhZyA9IChiYWc6IGFueSk6IHN0cmluZyA9PiB7XG4gIGlmICghYmFnKSByZXR1cm4gJ05vdCBpbmNsdWRlZCc7XG4gIGNvbnN0IHsgUGllY2VzLCBXZWlnaHQsIFVuaXQsIERpbWVuc2lvbiwgUmVtYXJrIH0gPSBiYWc7XG4gIC8vIE5lZ2F0aXZlIFBpZWNlcyA9IG5vdCBhcHBsaWNhYmxlIChlLmcuIFBpZWNlczogLTEsIFdlaWdodDogLTEpXG4gIGlmIChQaWVjZXMgIT0gbnVsbCAmJiBQaWVjZXMgPCAwICYmIChXZWlnaHQgPT0gbnVsbCB8fCBXZWlnaHQgPCAwKSkgcmV0dXJuICdOb3QgaW5jbHVkZWQnO1xuICAvLyBaZXJvIGFjcm9zcyB0aGUgYm9hcmQgPSBub3QgaW5jbHVkZWRcbiAgaWYgKFBpZWNlcyA9PT0gMCAmJiAoV2VpZ2h0ID09PSAwIHx8IFdlaWdodCA9PSBudWxsKSkgcmV0dXJuICdOb3QgaW5jbHVkZWQnO1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgaWYgKFBpZWNlcyAhPSBudWxsICYmIFBpZWNlcyA+IDApIHBhcnRzLnB1c2goYCR7UGllY2VzfSBwYyR7UGllY2VzID4gMSA/ICdzJyA6ICcnfWApO1xuICBpZiAoV2VpZ2h0ICE9IG51bGwgJiYgV2VpZ2h0ID4gMCkgcGFydHMucHVzaChgJHtXZWlnaHR9ICR7VW5pdCA/PyAnS0cnfWApO1xuICBpZiAoRGltZW5zaW9uKSBwYXJ0cy5wdXNoKERpbWVuc2lvbik7XG4gIGlmIChSZW1hcmspIHBhcnRzLnB1c2goUmVtYXJrKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnTm90IGF2YWlsYWJsZSc7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgcG5yX2luZm8gdG8gYSBmbGF0IGFycmF5IHJlZ2FyZGxlc3Mgb2Ygc2hhcGUuXG4gKiBOZXcgQkUgZm9ybWF0OiBbe3BuciwgTGVnRGlyZWN0aW9uYWxpdHl9LCAuLi5dXG4gKiBMZWdhY3kgZm9ybWF0OiB7cG5yOiAnLi4uJ30gb3IgbnVsbFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgcmVzb2x2ZVBuckxpc3QgPSAocG5yUmF3OiBhbnkpOiBhbnlbXSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBuclJhdykpIHJldHVybiBwbnJSYXc7XG4gIGlmIChwbnJSYXc/LnBucikgcmV0dXJuIFt7IHBucjogcG5yUmF3LnBuciwgTGVnRGlyZWN0aW9uYWxpdHk6ICdEZXBhcnR1cmUnIH1dO1xuICByZXR1cm4gW107XG59O1xuXG5leHBvcnQgY29uc3QgRkxJR0hUX0FDVElPTlM6IEFjdGlvbkNvbmZpZ1tdID0gW1xuICAvLyDilIDilIAgQm9va2luZyBPdmVydmlldyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ2Jvb2tpbmdfaW5mbycsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgbGFiZWw6ICdCb29raW5nIE92ZXJ2aWV3JyxcbiAgICBzdWJ0aXRsZTogJ1JvdXRlIMK3IENsYXNzIMK3IEZhcmUnLFxuICAgIGljb246ICdwaSBwaS1maWxlJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGJpKGRhdGEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ3M6IGFueVtdICAgICAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSAgICA9IGQ/LmFpcmxpbmVfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBwYXNzZW5nZXJzOiBhbnlbXSAgPSBkPy5wYXNzZW5nZXJfaW5mbz8ucGFzc2VuZ2VycyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBiYWdnYWdlOiBhbnkgICAgICAgPSBkPy5iYWdnYWdlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGR1cjogYW55ICAgICAgICAgICA9IGQ/LmR1cmF0aW9uO1xuICAgICAgY29uc3QgcHMgICAgICAgICAgICAgICAgID0gZD8ucGF5bWVudF9zdGF0dXM7XG4gICAgICBjb25zdCBjcCAgICAgICAgICAgICAgICAgPSBkPy5jYW5jZWxsYXRpb25fcG9saWN5O1xuICAgICAgY29uc3QgcG5yTGlzdCAgICAgICAgICAgID0gcmVzb2x2ZVBuckxpc3QoZD8ucG5yX2luZm8pO1xuICAgICAgY29uc3QgcG5yRGVwICAgICAgICAgICAgID0gcG5yTGlzdC5maW5kKChwOiBhbnkpID0+IHAuTGVnRGlyZWN0aW9uYWxpdHkgPT09ICdEZXBhcnR1cmUnKT8ucG5yID8/IHBuckxpc3RbMF0/LnBucjtcbiAgICAgIGNvbnN0IHBuclJldCAgICAgICAgICAgICA9IHBuckxpc3QuZmluZCgocDogYW55KSA9PiBwLkxlZ0RpcmVjdGlvbmFsaXR5ID09PSAnUmV0dXJuJyk/LnBucjtcbiAgICAgIGNvbnN0IG9yaWdpbiAgICAgICAgICAgICA9IGxlZ3NbMF0/LkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlO1xuICAgICAgY29uc3QgZGVzdCAgICAgICAgICAgICAgID0gbGVnc1tsZWdzLmxlbmd0aCAtIDFdPy5MZWdBcnJpdmFsQWlycG9ydENvZGU7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBzZWN0aW9uczogYW55W10gPSBbXTtcblxuICAgICAgLy8g4pSA4pSAIEJvb2tpbmcgUmVmZXJlbmNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IHJlZlJvd3M6IGFueVtdID0gW107XG4gICAgICBpZiAocG5yTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBuckxpc3QuZm9yRWFjaCgocDogYW55KSA9PiByZWZSb3dzLnB1c2goeyBsYWJlbDogYFBOUiAoJHtwLkxlZ0RpcmVjdGlvbmFsaXR5fSlgLCB2YWx1ZTogbmEocC5wbnIpIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZlJvd3MucHVzaCh7IGxhYmVsOiAnUE5SJywgdmFsdWU6IG5hKHBuckRlcCkgfSk7XG4gICAgICB9XG4gICAgICByZWZSb3dzLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdCb29raW5nIElEJywgICB2YWx1ZTogbmEoY3A/LmJvb2tpbmdJZCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyIHJlZicsIHZhbHVlOiBuYShjcD8uc3VwcGxpZXJCb29raW5nSWQpIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdXBwbGllcicsICAgICB2YWx1ZTogbmEoY3A/LnN1cHBsaWVyTmFtZSA/PyBsZWdzWzBdPy5zdXBwbGllck5hbWUpIH0sXG4gICAgICApO1xuICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlOiAnQm9va2luZyBSZWZlcmVuY2UnLCByb3dzOiByZWZSb3dzIH0pO1xuXG4gICAgICAvLyDilIDilIAgUGVyLWxlZyBzZWN0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGxlZ3MuZm9yRWFjaCgobCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBkaXIgICAgID0gbC5MZWdEaXJlY3Rpb25hbGl0eSA/PyAnJztcbiAgICAgICAgY29uc3QgZnJvbSAgICA9IGwuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGU7XG4gICAgICAgIGNvbnN0IHRvICAgICAgPSBsLkxlZ0Fycml2YWxBaXJwb3J0Q29kZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3Qgc2VnczogYW55W10gICAgPSBhaXJsaW5lc1tpXT8uU2VnbWVudHMgPz8gW107XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IGR1clNlZ3M6IGFueVtdID0gZHVyPy5sZWdzPy5baV0/LlNlZ21lbnRzID8/IFtdO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBzdG9wczogYW55W10gICA9IGwuU3RvcHMgPz8gW107XG4gICAgICAgIGNvbnN0IGxlZ0R1ck1pbnMgICAgID0gZHVyU2Vncy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBzOiBhbnkpID0+IHN1bSArIChzLlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXMgPz8gMCksIDApO1xuICAgICAgICBjb25zdCBmbGlnaHROb3MgICAgICA9IHNlZ3MubWFwKChzOiBhbnkpID0+IGAke3MuQWlybGluZUNvZGV9JHtzLkZsaWdodE51bWJlcn1gKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcblxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogYCR7ZGlySWNvbihkaXIpfSAke2RpciB8fCBgTGVnICR7aSArIDF9YH0gwrcgJHtmcm9tfSDihpIgJHt0b31gLFxuICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEZXBhcnR1cmUnLCAgdmFsdWU6IGZtdERhdGUobC5MZWdEZXBhcnR1cmVEYXRlVGltZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsJywgICAgdmFsdWU6IGZtdERhdGUobC5MZWdBcnJpdmFsRGF0ZVRpbWUpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnRHVyYXRpb24nLCAgIHZhbHVlOiBsZWdEdXJNaW5zID4gMCA/IGZtdE1pbnMobGVnRHVyTWlucykgOiBuYShudWxsKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0FpcmxpbmUocyknLCB2YWx1ZTogbmEobC5MZWdBaXJsaW5lc05hbWVzPy5qb2luKCcsICcpKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0ZsaWdodCBuby4nLCB2YWx1ZTogbmEoZmxpZ2h0Tm9zKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0NhYmluJywgICAgICB2YWx1ZTogbmEobC5MZWdDYWJpbnM/LlswXT8uTmFtZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdGYXJlIGJyYW5kJywgdmFsdWU6IG5hKGwuZmFyZUJyYW5kPy5uYW1lKSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1N0b3BzJyxcbiAgICAgICAgICAgICAgdmFsdWU6IHN0b3BzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gJ05vbi1zdG9wJ1xuICAgICAgICAgICAgICAgIDogc3RvcHMubWFwKChzOiBhbnkpID0+IGAke3MuU3RvcEFpcnBvcnRDaXR5ID8/IHMuU3RvcEFpcnBvcnR9ICgke2ZtdE1pbnMocy5MYXlvdmVyRHVyYXRpb24pfSlgKS5qb2luKCcsICcpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDilIDilIAgUGFzc2VuZ2VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGNvbnN0IHBheFR5cGVMYWJlbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQURUOiAnQWR1bHQnLCBDTk46ICdDaGlsZCcsIElORjogJ0luZmFudCcgfTtcbiAgICAgIHBhc3NlbmdlcnMuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IFtwPy5uYW1lPy5wcmVmaXgsIHA/Lm5hbWU/LmdpdmVuTmFtZSwgcD8ubmFtZT8uc3VyTmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcGhvbmUgPSBwPy5waG9uZSA/PyAocD8uY29udGFjdE51bWJlcj8ucGhvbmVOdW1iZXJcbiAgICAgICAgICA/IGAke3AuY29udGFjdE51bWJlci5jb3VudHJ5Q29kZSA/PyAnJ30ke3AuY29udGFjdE51bWJlci5waG9uZU51bWJlcn1gIDogbnVsbCk7XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiBgUGFzc2VuZ2VyICR7aSArIDF9IMK3ICR7ZnVsbE5hbWUgfHwgbmEobnVsbCl9YCxcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsICAgICAgICAgIHZhbHVlOiBuYShwYXhUeXBlTGFiZWxbcD8udHlwZV0gPz8gcD8udHlwZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdHZW5kZXInLCAgICAgICAgdmFsdWU6IG5hKHA/LmdlbmRlcikgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEYXRlIG9mIGJpcnRoJywgdmFsdWU6IG5hKHA/LmRhdGVPZkJpcnRoKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0JywgICAgICB2YWx1ZTogbmEocD8uaWRlbnRpdHk/Lm51bWJlcikgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOYXRpb25hbGl0eScsICAgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5uYXRpb25hbGl0eSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdQYXNzcG9ydCBleHAuJywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5leHBpcmF0aW9uRGF0ZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdJc3N1ZSBjb3VudHJ5JywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5pc3N1ZUNvdW50cnkpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnRG9jIHR5cGUnLCAgICAgIHZhbHVlOiBuYShwPy5pZGVudGl0eT8udHlwZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdFbWFpbCcsICAgICAgICAgdmFsdWU6IG5hKHA/LmVtYWlsKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1Bob25lJywgICAgICAgICB2YWx1ZTogbmEocGhvbmUpIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8g4pSA4pSAIFBheW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBpZiAocHMpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzTmFtZSA9IHBzPy5zdGF0dXM/Lm5hbWUgPz8gcHM/LnN0YXR1cz8ua2V5O1xuICAgICAgICBjb25zdCBwYWlkID0gcHM/LmFtb3VudEluUGFpZEN1cnJlbmN5ICE9IG51bGwgJiYgcHM/LnBhaWRDdXJyZW5jeVxuICAgICAgICAgID8gYCR7cHMuYW1vdW50SW5QYWlkQ3VycmVuY3l9ICR7cHMucGFpZEN1cnJlbmN5fWAgOiBudWxsO1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ1BheW1lbnQnLFxuICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTdGF0dXMnLCAgICAgICAgIHZhbHVlOiBuYShzdGF0dXNOYW1lKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0Ftb3VudCcsICAgICAgICAgdmFsdWU6IHBzPy5hbW91bnQgIT0gbnVsbCA/IGAke3BzLmFtb3VudH0gJHtuYShwcy5jdXJyZW5jeSl9YCA6ICdOb3QgYXZhaWxhYmxlJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1BhaWQgYW1vdW50JywgICAgdmFsdWU6IG5hKHBhaWQpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUGF5bWVudCBtZXRob2QnLCB2YWx1ZTogbmEocHM/Lm1ldGhvZCkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEYXRlJywgICAgICAgICAgIHZhbHVlOiBmbXREYXRlKHBzPy5kYXRlKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgQmFnZ2FnZSBwZXIgcm91dGUgKGZ1bGwgZGV0YWlsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGNvbnN0IGJhZ2dhZ2VJbmZvOiBhbnlbXSA9IGJhZ2dhZ2U/LmJhZ2dhZ2VfaW5mbyA/PyBbXTtcbiAgICAgIGJhZ2dhZ2VJbmZvLmZvckVhY2goKGVudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBPYmplY3Qua2V5cyhlbnRyeSlbMF07XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgY29uc3QgcGF4VHlwZXMgPSBlbnRyeVtyb3V0ZV0gPz8ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gW107XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHBheFR5cGVzKS5mb3JFYWNoKChbcGF4VHlwZSwgcGRdOiBbc3RyaW5nLCBhbnldKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgICAgID0gcGF4VHlwZSA9PT0gJ0FEVCcgPyAnQWR1bHQnIDogcGF4VHlwZSA9PT0gJ0NOTicgPyAnQ2hpbGQnIDogcGF4VHlwZSA9PT0gJ0lORicgPyAnSW5mYW50JyA6IHBheFR5cGU7XG4gICAgICAgICAgY29uc3QgY2FiaW4gICAgID0gcGQuQ2FiaW5CYWdnYWdlO1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgICA9IHBkLkNoZWNrZWRCYWdnYWdlO1xuICAgICAgICAgIGNvbnN0IHVuZGVyU2VhdCA9IHBkLlVuZGVyU2VhdEJhZ2dhZ2U7XG4gICAgICAgICAgcm93cy5wdXNoKFxuICAgICAgICAgICAgeyBsYWJlbDogYCR7bGFiZWx9IMK3IENhYmluYCwgICB2YWx1ZTogZm10QmFnKGNhYmluKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogYCR7bGFiZWx9IMK3IENoZWNrZWRgLCB2YWx1ZTogZm10QmFnKGNoZWNrZWQpIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodW5kZXJTZWF0KSByb3dzLnB1c2goeyBsYWJlbDogYCR7bGFiZWx9IMK3IFVuZGVyIFNlYXRgLCB2YWx1ZTogZm10QmFnKHVuZGVyU2VhdCkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHsgdGl0bGU6IGBCYWdnYWdlIMK3ICR7cm91dGV9YCwgcm93cyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDilIDilIAgVGVybWluYWwgSW5mbyBzdW1tYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgY29uc3QgdGVybWluYWxEYXRhOiBhbnlbXSA9IGQ/LnRlcm1pbmFsID8/IFtdO1xuICAgICAgdGVybWluYWxEYXRhLmZvckVhY2goKHRsOiBhbnksIGxpOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgbGVnTWV0YSA9IGxlZ3NbbGldO1xuICAgICAgICBjb25zdCBsZWdMYWJlbCA9IGxlZ01ldGFcbiAgICAgICAgICA/IGBUZXJtaW5hbCDCtyAke2xlZ01ldGEuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2xlZ01ldGEuTGVnQXJyaXZhbEFpcnBvcnRDb2RlfWBcbiAgICAgICAgICA6IGBUZXJtaW5hbCDCtyBMZWcgJHtsaSArIDF9YDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgdGVybVJvd3M6IGFueVtdID0gW107XG4gICAgICAgICh0bC5TZWdtZW50cyA/PyBbXSkuZm9yRWFjaCgoczogYW55LCBzaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWlybGluZVNlZyA9IGFpcmxpbmVzW2xpXT8uU2VnbWVudHM/LltzaV07XG4gICAgICAgICAgY29uc3QgZmxpZ2h0Tm8gICA9IGFpcmxpbmVTZWcgPyBgJHthaXJsaW5lU2VnLkFpcmxpbmVDb2RlfSR7YWlybGluZVNlZy5GbGlnaHROdW1iZXJ9YCA6IGBTZWcgJHtzaSArIDF9YDtcbiAgICAgICAgICBjb25zdCBkZXBUZXJtICAgID0gcy5EZXBhcnR1cmVBaXJwb3J0VGVybWluYWxJRCA/IGBUJHtzLkRlcGFydHVyZUFpcnBvcnRUZXJtaW5hbElEfWAgOiAn4oCUJztcbiAgICAgICAgICBjb25zdCBhcnJUZXJtICAgID0gcy5BcnJpdmFsQWlycG9ydFRlcm1pbmFsSUQgICA/IGBUJHtzLkFycml2YWxBaXJwb3J0VGVybWluYWxJRH1gICAgOiAn4oCUJztcbiAgICAgICAgICB0ZXJtUm93cy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiBmbGlnaHRObyxcbiAgICAgICAgICAgIHZhbHVlOiBgJHtuYShzLkRlcGFydHVyZUFpcnBvcnRDb2RlKX0gJHtkZXBUZXJtfSDihpIgJHtuYShzLkFycml2YWxBaXJwb3J0Q29kZSl9ICR7YXJyVGVybX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRlcm1Sb3dzLmxlbmd0aCA+IDApIHNlY3Rpb25zLnB1c2goeyB0aXRsZTogbGVnTGFiZWwsIHJvd3M6IHRlcm1Sb3dzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOKUgOKUgCBDYW5jZWxsYXRpb24gUG9saWN5IHN1bW1hcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBjb25zdCBjcExlZ3M6IGFueVtdID0gY3A/LmxlZ3MgPz8gW107XG4gICAgICBjcExlZ3MuZm9yRWFjaCgobGVnOiBhbnkpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgY3BSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgICAobGVnLnBhc3NlbmdlclBlbmFsdGllcyA/PyBbXSkuZm9yRWFjaCgocHA6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR5cGVMYWJlbCAgID0gcHAudHlwZSA9PT0gJ0FEVCcgPyAnQWR1bHQnIDogcHAudHlwZSA9PT0gJ0NOTicgPyAnQ2hpbGQnIDogJ0luZmFudCc7XG4gICAgICAgICAgY29uc3QgYkRlcCAgICAgICAgPSBwcC5wZW5hbHRpZXM/LmJlZm9yZURlcGFydHVyZTtcbiAgICAgICAgICBjb25zdCByZWZ1bmQgICAgICA9IGJEZXA/LnJlZnVuZDtcbiAgICAgICAgICBjb25zdCBleGNoYW5nZSAgICA9IGJEZXA/LmV4Y2hhbmdlO1xuICAgICAgICAgIGNvbnN0IHJlZnVuZFN0ciAgID0gcmVmdW5kPy5pc0FjdGlvbmFibGUgICA/IGBSZWZ1bmQ6ICR7cmVmdW5kLmZlZX0gJHtyZWZ1bmQuY3VycmVuY3l9YCAgICAgOiAnTm8gcmVmdW5kJztcbiAgICAgICAgICBjb25zdCBleGNoYW5nZVN0ciA9IGV4Y2hhbmdlPy5pc0FjdGlvbmFibGUgPyBgRXhjaGFuZ2U6ICR7ZXhjaGFuZ2UuZmVlfSAke2V4Y2hhbmdlLmN1cnJlbmN5fWAgOiAnTm8gZXhjaGFuZ2UnO1xuICAgICAgICAgIGNwUm93cy5wdXNoKHsgbGFiZWw6IHR5cGVMYWJlbCwgdmFsdWU6IGAke3JlZnVuZFN0cn0gIMK3ICAke2V4Y2hhbmdlU3RyfWAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3BSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQ2FuY2VsbGF0aW9uIGFuZCBDaGFuZ2UgUG9saWN5IMK3ICR7bGVnLmRpcmVjdGlvbn0gKCR7bGVnLmZyb219IOKGkiAke2xlZy50b30pYCxcbiAgICAgICAgICAgIHJvd3M6IGNwUm93cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiBvcmlnaW4gPyBgJHtvcmlnaW59IOKGkiAke2Rlc3R9YCA6ICdGbGlnaHQgQm9va2luZycsXG4gICAgICAgIHN1YnRpdGxlOiBwbnJEZXBcbiAgICAgICAgICA/IGBQTlI6ICR7cG5yRGVwfSR7cG5yUmV0ID8gJyAvICcgKyBwbnJSZXQgOiAnJ30gwrcgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSDCtyAke3Bhc3NlbmdlcnMubGVuZ3RofSBwYXhgXG4gICAgICAgICAgOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSDCtyAke3Bhc3NlbmdlcnMubGVuZ3RofSBwYXhgLFxuICAgICAgICBzZWN0aW9ucyxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgVGVybWluYWwgSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3Rlcm1pbmFsJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBsYWJlbDogJ1Rlcm1pbmFsIEluZm8nLFxuICAgIHN1YnRpdGxlOiAnR2F0ZSDCtyBDaGVjay1pbicsXG4gICAgaWNvbjogJ3BpIHBpLXNlbmQnLFxuICAgIGFwaUZpZWxkOiAnYm9va2luZ19pbmZvJyxcbiAgICBmb3JtYXR0ZXI6IChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBkID0gYmkoZGF0YSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgdGVybWluYWxMZWdzOiBhbnlbXSA9IGQ/LnRlcm1pbmFsID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ0luZm9zOiBhbnlbXSAgICAgPSBkPy5sZWdfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBhaXJsaW5lczogYW55W10gICAgID0gZD8uYWlybGluZV9pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IHNlY3Rpb25zOiBhbnlbXSAgICAgPSBbXTtcblxuICAgICAgdGVybWluYWxMZWdzLmZvckVhY2goKHRsLCBsaSkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSAgPSB0bC5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgY29uc3QgbGVnTWV0YSAgICAgID0gbGVnSW5mb3NbbGldO1xuICAgICAgICBjb25zdCBsZWdMYWJlbCAgICAgPSBsZWdNZXRhXG4gICAgICAgICAgPyBgJHtkaXJJY29uKGxlZ01ldGEuTGVnRGlyZWN0aW9uYWxpdHkpfSAke2xlZ01ldGEuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2xlZ01ldGEuTGVnQXJyaXZhbEFpcnBvcnRDb2RlfWBcbiAgICAgICAgICA6IGBMZWcgJHtsaSArIDF9YDtcbiAgICAgICAgLy8gTGVnLWxldmVsIHRpbWVzIGFzIGZhbGxiYWNrIHdoZW4gc2VnbWVudC1sZXZlbCB0aW1lcyBhcmUgYWJzZW50XG4gICAgICAgIGNvbnN0IGxlZ0RlcFRpbWUgICA9IGxlZ01ldGE/LkxlZ0RlcGFydHVyZURhdGVUaW1lO1xuICAgICAgICBjb25zdCBsZWdBcnJUaW1lICAgPSBsZWdNZXRhPy5MZWdBcnJpdmFsRGF0ZVRpbWU7XG5cbiAgICAgICAgc2Vncy5mb3JFYWNoKChzLCBzaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFpcmxpbmVTZWcgPSBhaXJsaW5lc1tsaV0/LlNlZ21lbnRzPy5bc2ldO1xuICAgICAgICAgIC8vIFJlc29sdmUgZmxpZ2h0IG51bWJlcjogdGVybWluYWwgc2VnIOKGkiBhaXJsaW5lX2luZm8gc2VnXG4gICAgICAgICAgY29uc3QgZmxpZ2h0Tm8gICA9IHMuRmxpZ2h0TnVtYmVyXG4gICAgICAgICAgICA/IGAke3MuQWlybGluZUNvZGUgPz8gJyd9JHtzLkZsaWdodE51bWJlcn1gXG4gICAgICAgICAgICA6IGFpcmxpbmVTZWcgPyBgJHthaXJsaW5lU2VnLkFpcmxpbmVDb2RlfSR7YWlybGluZVNlZy5GbGlnaHROdW1iZXJ9YCA6IG51bGw7XG4gICAgICAgICAgLy8gUmVzb2x2ZSB0aW1lczogdGVybWluYWwgc2VnIOKGkiBhaXJsaW5lX2luZm8gc2VnIOKGkiBsZWctbGV2ZWwgZmFsbGJhY2tcbiAgICAgICAgICBjb25zdCBkZXBUaW1lICAgID0gcy5EZXBhcnR1cmVEYXRlVGltZVxuICAgICAgICAgICAgPz8gYWlybGluZVNlZz8uRGVwYXJ0dXJlRGF0ZVRpbWVcbiAgICAgICAgICAgID8/IChzaSA9PT0gMCA/IGxlZ0RlcFRpbWUgOiBudWxsKTtcbiAgICAgICAgICBjb25zdCBhcnJUaW1lICAgID0gcy5BcnJpdmFsRGF0ZVRpbWVcbiAgICAgICAgICAgID8/IGFpcmxpbmVTZWc/LkFycml2YWxEYXRlVGltZVxuICAgICAgICAgICAgPz8gKHNpID09PSBzZWdzLmxlbmd0aCAtIDEgPyBsZWdBcnJUaW1lIDogbnVsbCk7XG5cbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBgJHtsZWdMYWJlbH0gwrcgJHtmbGlnaHRObyA/PyBgU2VnICR7c2kgKyAxfWB9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGFydHVyZSBhaXJwb3J0JywgdmFsdWU6IHMuRGVwYXJ0dXJlQWlycG9ydE5hbWUgPyBgJHtzLkRlcGFydHVyZUFpcnBvcnROYW1lfSAoJHtzLkRlcGFydHVyZUFpcnBvcnRDb2RlfSlgIDogbmEocy5EZXBhcnR1cmVBaXJwb3J0Q29kZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcC4gdGVybWluYWwnLCAgICAgdmFsdWU6IG5hKHMuRGVwYXJ0dXJlQWlycG9ydFRlcm1pbmFsSUQpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsIGFpcnBvcnQnLCAgIHZhbHVlOiBzLkFycml2YWxBaXJwb3J0TmFtZSA/IGAke3MuQXJyaXZhbEFpcnBvcnROYW1lfSAoJHtzLkFycml2YWxBaXJwb3J0Q29kZX0pYCA6IG5hKHMuQXJyaXZhbEFpcnBvcnRDb2RlKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQXJyLiB0ZXJtaW5hbCcsICAgICB2YWx1ZTogbmEocy5BcnJpdmFsQWlycG9ydFRlcm1pbmFsSUQpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdGbGlnaHQnLCAgICAgICAgICAgIHZhbHVlOiBuYShmbGlnaHRObykgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGFydHVyZSB0aW1lJywgICAgdmFsdWU6IGZtdERhdGUoZGVwVGltZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0Fycml2YWwgdGltZScsICAgICAgdmFsdWU6IGZtdERhdGUoYXJyVGltZSkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRvdGFsU2VncyA9IHNlY3Rpb25zLmxlbmd0aDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnVGVybWluYWwgRGV0YWlscycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHt0b3RhbFNlZ3N9IHNlZ21lbnQke3RvdGFsU2VncyAhPT0gMSA/ICdzJyA6ICcnfWAsXG4gICAgICAgIHNlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGhcbiAgICAgICAgICA/IHNlY3Rpb25zXG4gICAgICAgICAgOiBbeyB0aXRsZTogJ0luZm8nLCByb3dzOiBbeyBsYWJlbDogJ1N0YXR1cycsIHZhbHVlOiAnTm8gdGVybWluYWwgZGF0YSBhdmFpbGFibGUnIH1dIH1dLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBQYXltZW50IFN0YXR1cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3BheW1lbnRfc3RhdHVzJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdQYXltZW50IFN0YXR1cycsXG4gICAgc3VidGl0bGU6ICdDaGFyZ2VzIMK3IFJlY2VpcHQnLFxuICAgIGljb246ICdwaSBwaS1jcmVkaXQtY2FyZCcsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IHBzID0gYmkoZGF0YSk/LnBheW1lbnRfc3RhdHVzO1xuICAgICAgY29uc3Qgc3RhdHVzTmFtZSA9IHBzPy5zdGF0dXM/Lm5hbWUgPz8gcHM/LnN0YXR1cz8ua2V5O1xuICAgICAgY29uc3QgcGFpZCA9IHBzPy5hbW91bnRJblBhaWRDdXJyZW5jeSAhPSBudWxsICYmIHBzPy5wYWlkQ3VycmVuY3lcbiAgICAgICAgPyBgJHtwcy5hbW91bnRJblBhaWRDdXJyZW5jeX0gJHtwcy5wYWlkQ3VycmVuY3l9YCA6IG51bGw7XG4gICAgICBjb25zdCBpc1N1Y2Nlc3MgPSBwcz8uc3RhdHVzPy5rZXkgPT09ICdTVUNDRVNTJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnUGF5bWVudCBEZXRhaWxzJyxcbiAgICAgICAgc3VidGl0bGU6IG5hKHN0YXR1c05hbWUpLFxuICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiAnVHJhbnNhY3Rpb24nLFxuICAgICAgICAgICAgcm93czogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU3RhdHVzJywgICAgICAgICAgdmFsdWU6IG5hKHN0YXR1c05hbWUpLCB2YWx1ZUNsYXNzOiBpc1N1Y2Nlc3MgPyAncG9zaXRpdmUnIDogJ25ldXRyYWwnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBbW91bnQnLCAgICAgICAgICB2YWx1ZTogcHM/LmFtb3VudCAhPSBudWxsID8gYCR7cHMuYW1vdW50fSAke25hKHBzLmN1cnJlbmN5KX1gIDogJ05vdCBhdmFpbGFibGUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdQYWlkIGFtb3VudCcsICAgICB2YWx1ZTogbmEocGFpZCkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1BheW1lbnQgbWV0aG9kJywgIHZhbHVlOiBuYShwcz8ubWV0aG9kKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnVHJhbnNhY3Rpb24gcmVmJywgdmFsdWU6IG5hKHBzPy50cmFuc2FjdGlvblJlZiA/PyBwcz8ucmVmZXJlbmNlKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGF0ZScsICAgICAgICAgICAgdmFsdWU6IGZtdERhdGUocHM/LmRhdGUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdDdXJyZW5jeScsICAgICAgICB2YWx1ZTogbmEocHM/LmN1cnJlbmN5KSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBQYXNzZW5nZXIgSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3Bhc3Nlbmdlcl9pbmZvJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdQYXNzZW5nZXIgSW5mbycsXG4gICAgc3VidGl0bGU6ICdOYW1lcyDCtyBEb2NzJyxcbiAgICBpY29uOiAncGkgcGktdXNlcnMnLFxuICAgIGFwaUZpZWxkOiAnYm9va2luZ19pbmZvJyxcbiAgICBmb3JtYXR0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgcGFzc2VuZ2VyczogYW55W10gPSBiaShkYXRhKT8ucGFzc2VuZ2VyX2luZm8/LnBhc3NlbmdlcnMgPz8gW107XG4gICAgICBjb25zdCB0eXBlTGFiZWw6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IEFEVDogJ0FkdWx0JywgQ05OOiAnQ2hpbGQnLCBJTkY6ICdJbmZhbnQnIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogJ1Bhc3NlbmdlciBEZXRhaWxzJyxcbiAgICAgICAgc3VidGl0bGU6IGAke3Bhc3NlbmdlcnMubGVuZ3RofSB0cmF2ZWxsZXIke3Bhc3NlbmdlcnMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc2VjdGlvbnM6IHBhc3NlbmdlcnMubWFwKChwOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gW3A/Lm5hbWU/LnByZWZpeCwgcD8ubmFtZT8uZ2l2ZW5OYW1lLCBwPy5uYW1lPy5zdXJOYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgICAgIGNvbnN0IHBob25lID0gcD8ucGhvbmUgPz8gKHA/LmNvbnRhY3ROdW1iZXI/LnBob25lTnVtYmVyXG4gICAgICAgICAgICA/IGAke3AuY29udGFjdE51bWJlci5jb3VudHJ5Q29kZSA/PyAnJ30ke3AuY29udGFjdE51bWJlci5waG9uZU51bWJlcn1gIDogbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpdGxlOiBgUGFzc2VuZ2VyICR7aSArIDF9IMK3ICR7ZnVsbE5hbWUgfHwgbmEobnVsbCl9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCAgICAgICAgICB2YWx1ZTogbmEodHlwZUxhYmVsW3A/LnR5cGVdID8/IHA/LnR5cGUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdHZW5kZXInLCAgICAgICAgdmFsdWU6IG5hKHA/LmdlbmRlcikgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RhdGUgb2YgYmlydGgnLCB2YWx1ZTogbmEocD8uZGF0ZU9mQmlydGgpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdQYXNzcG9ydCcsICAgICAgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5udW1iZXIpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdOYXRpb25hbGl0eScsICAgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5uYXRpb25hbGl0eSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0IGV4cC4nLCB2YWx1ZTogbmEocD8uaWRlbnRpdHk/LmV4cGlyYXRpb25EYXRlKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnSXNzdWUgY291bnRyeScsIHZhbHVlOiBuYShwPy5pZGVudGl0eT8uaXNzdWVDb3VudHJ5KSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRG9jIHR5cGUnLCAgICAgIHZhbHVlOiBuYShwPy5pZGVudGl0eT8udHlwZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0VtYWlsJywgICAgICAgICB2YWx1ZTogbmEocD8uZW1haWwpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdQaG9uZScsICAgICAgICAgdmFsdWU6IG5hKHBob25lKSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgUGFzc2VuZ2VyIENvdW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB7XG4gICAga2V5OiAncGFzc2VuZ2VyX2NvdW50JyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdQYXNzZW5nZXIgQ291bnQnLFxuICAgIHN1YnRpdGxlOiAnQWR1bHRzIMK3IENoaWxkcmVuIMK3IEluZmFudHMnLFxuICAgIGljb246ICdwaSBwaS11c2VycycsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBwYXNzZW5nZXJzOiBhbnlbXSA9IGJpKGRhdGEpPy5wYXNzZW5nZXJfaW5mbz8ucGFzc2VuZ2VycyA/PyBbXTtcbiAgICAgIGNvbnN0IGFkdWx0cyAgID0gcGFzc2VuZ2Vycy5maWx0ZXIocCA9PiBwPy50eXBlID09PSAnQURUJyk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHBhc3NlbmdlcnMuZmlsdGVyKHAgPT4gcD8udHlwZSA9PT0gJ0NOTicpO1xuICAgICAgY29uc3QgaW5mYW50cyAgPSBwYXNzZW5nZXJzLmZpbHRlcihwID0+IHA/LnR5cGUgPT09ICdJTkYnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnVHJhdmVsbGVyIEJyZWFrZG93bicsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtwYXNzZW5nZXJzLmxlbmd0aH0gdG90YWxgLFxuICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiAnU3VtbWFyeScsXG4gICAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdUb3RhbCcsICAgICAgICAgIHZhbHVlOiBTdHJpbmcocGFzc2VuZ2Vycy5sZW5ndGgpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBZHVsdHMgKEFEVCknLCAgIHZhbHVlOiBTdHJpbmcoYWR1bHRzLmxlbmd0aCkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0NoaWxkcmVuIChDTk4pJywgdmFsdWU6IFN0cmluZyhjaGlsZHJlbi5sZW5ndGgpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdJbmZhbnRzIChJTkYpJywgIHZhbHVlOiBTdHJpbmcoaW5mYW50cy5sZW5ndGgpIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYWR1bHRzLm1hcCgocCwgaSkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQWR1bHQgJHtpICsgMX0gwrcgJHtbcD8ubmFtZT8ucHJlZml4LCBwPy5uYW1lPy5naXZlbk5hbWUsIHA/Lm5hbWU/LnN1ck5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJ04vQSd9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0JywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5udW1iZXIpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdFbWFpbCcsICAgIHZhbHVlOiBuYShwPy5lbWFpbCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLmNoaWxkcmVuLm1hcCgocCwgaSkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQ2hpbGQgJHtpICsgMX0gwrcgJHtbcD8ubmFtZT8ucHJlZml4LCBwPy5uYW1lPy5naXZlbk5hbWUsIHA/Lm5hbWU/LnN1ck5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJ04vQSd9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0JywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5udW1iZXIpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdET0InLCAgICAgIHZhbHVlOiBuYShwPy5kYXRlT2ZCaXJ0aCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLmluZmFudHMubWFwKChwLCBpKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGBJbmZhbnQgJHtpICsgMX0gwrcgJHtbcD8ubmFtZT8ucHJlZml4LCBwPy5uYW1lPy5naXZlbk5hbWUsIHA/Lm5hbWU/LnN1ck5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJ04vQSd9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RPQicsIHZhbHVlOiBuYShwPy5kYXRlT2ZCaXJ0aCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBBaXJsaW5lIEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdhaXJsaW5lX2luZm8nLFxuICAgIHR5cGU6ICdmbGlnaHQnLFxuICAgIGhpZGRlbjogdHJ1ZSxcbiAgICBsYWJlbDogJ0FpcmxpbmUgSW5mbycsXG4gICAgc3VidGl0bGU6ICdDYXJyaWVyIMK3IEZsaWdodCBuby4nLFxuICAgIGljb246ICdwaSBwaS1zZW5kJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSA9IGJpKGRhdGEpPy5haXJsaW5lX2luZm8gPz8gW107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgbGVnSW5mb3M6IGFueVtdID0gYmkoZGF0YSk/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGR1ckxlZ3M6IGFueVtdICA9IGJpKGRhdGEpPy5kdXJhdGlvbj8ubGVncyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBzZWN0aW9uczogYW55W10gPSBbXTtcblxuICAgICAgYWlybGluZXMuZm9yRWFjaCgoYSwgbGkpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3Qgc2VnczogYW55W10gICAgPSBhLlNlZ21lbnRzID8/IFtdO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBkdXJTZWdzOiBhbnlbXSA9IGR1ckxlZ3NbbGldPy5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgY29uc3QgbGVnTWV0YSAgICAgICAgPSBsZWdJbmZvc1tsaV07XG4gICAgICAgIGNvbnN0IGxlZ0xhYmVsICAgICAgID0gbGVnTWV0YVxuICAgICAgICAgID8gYCR7ZGlySWNvbihsZWdNZXRhLkxlZ0RpcmVjdGlvbmFsaXR5KX0gJHtsZWdNZXRhLkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlfSDihpIgJHtsZWdNZXRhLkxlZ0Fycml2YWxBaXJwb3J0Q29kZX1gXG4gICAgICAgICAgOiBgTGVnICR7bGkgKyAxfWA7XG4gICAgICAgIC8vIExlZy1sZXZlbCB0aW1lcyBhcyBmYWxsYmFjayBmb3IgZmlyc3QvbGFzdCBzZWdtZW50XG4gICAgICAgIGNvbnN0IGxlZ0RlcFRpbWUgICAgID0gbGVnTWV0YT8uTGVnRGVwYXJ0dXJlRGF0ZVRpbWU7XG4gICAgICAgIGNvbnN0IGxlZ0FyclRpbWUgICAgID0gbGVnTWV0YT8uTGVnQXJyaXZhbERhdGVUaW1lO1xuXG4gICAgICAgIHNlZ3MuZm9yRWFjaCgocywgc2kpID0+IHtcbiAgICAgICAgICAvLyBVc2Ugc2VnbWVudC1sZXZlbCB0aW1lcyBpZiBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBsZWcgdGltZXNcbiAgICAgICAgICBjb25zdCBkZXBUaW1lID0gcy5EZXBhcnR1cmVEYXRlVGltZSA/PyAoc2kgPT09IDAgPyBsZWdEZXBUaW1lIDogbnVsbCk7XG4gICAgICAgICAgY29uc3QgYXJyVGltZSA9IHMuQXJyaXZhbERhdGVUaW1lICAgPz8gKHNpID09PSBzZWdzLmxlbmd0aCAtIDEgPyBsZWdBcnJUaW1lIDogbnVsbCk7XG5cbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBgJHtsZWdMYWJlbH0gwrcgJHtzLkFpcmxpbmVDb2RlfSR7cy5GbGlnaHROdW1iZXJ9IChTZWcgJHtzaSArIDF9KWAsXG4gICAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJsaW5lJywgICAgICAgIHZhbHVlOiBuYShzLkFpcmxpbmVOYW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnSUFUQSBjb2RlJywgICAgICB2YWx1ZTogbmEocy5BaXJsaW5lQ29kZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0ZsaWdodCBuby4nLCAgICAgdmFsdWU6IHMuRmxpZ2h0TnVtYmVyID8gYCR7cy5BaXJsaW5lQ29kZX0ke3MuRmxpZ2h0TnVtYmVyfWAgOiAnTm90IGF2YWlsYWJsZScgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1JvdXRlJywgICAgICAgICAgdmFsdWU6IGAke25hKHMuRGVwYXJ0dXJlQWlycG9ydENvZGUpfSDihpIgJHtuYShzLkFycml2YWxBaXJwb3J0Q29kZSl9YCB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVwYXJ0dXJlJywgICAgICB2YWx1ZTogZm10RGF0ZShkZXBUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQXJyaXZhbCcsICAgICAgICB2YWx1ZTogZm10RGF0ZShhcnJUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRHVyYXRpb24nLCAgICAgICB2YWx1ZTogZHVyU2Vnc1tzaV0/LlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXMgPyBmbXRNaW5zKGR1clNlZ3Nbc2ldLlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXMpIDogJ05vdCBhdmFpbGFibGUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJjcmFmdCcsICAgICAgIHZhbHVlOiBuYShzLkFpcmNyYWZ0VHlwZSA/PyBzLkVxdWlwbWVudCkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ09wZXJhdGluZyBjb2RlJywgdmFsdWU6IG5hKHMuT3BlcmF0aW5nQWlybGluZUNvZGUpIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0b3RhbFNlZ3MgPSBzZWN0aW9ucy5sZW5ndGg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYWlybGluZXNbMF0/LlNlZ21lbnRzPy5bMF0/LkFpcmxpbmVOYW1lID8/ICdBaXJsaW5lIEluZm8nLFxuICAgICAgICBzdWJ0aXRsZTogYCR7dG90YWxTZWdzfSBzZWdtZW50JHt0b3RhbFNlZ3MgIT09IDEgPyAncycgOiAnJ31gLFxuICAgICAgICBzZWN0aW9ucyxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgTGVnIEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdsZWdfaW5mbycsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIGxhYmVsOiAnTGVnIEluZm8nLFxuICAgIHN1YnRpdGxlOiAnUm91dGUgwrcgU3RvcHMgwrcgQ2FiaW4nLFxuICAgIGljb246ICdwaSBwaS1tYXAtbWFya2VyJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGJpKGRhdGEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ3M6IGFueVtdICAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSA9IGQ/LmFpcmxpbmVfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBkdXJMZWdzOiBhbnlbXSAgPSBkPy5kdXJhdGlvbj8ubGVncyA/PyBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICdGbGlnaHQgTGVncycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWAsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHNlY3Rpb25zOiBsZWdzLm1hcCgobDogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXIgICAgICA9IGwuTGVnRGlyZWN0aW9uYWxpdHkgPz8gJyc7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBzdG9wczogYW55W10gICA9IGwuU3RvcHMgPz8gW107XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSAgICA9IGFpcmxpbmVzW2ldPy5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIGNvbnN0IGR1clNlZ3M6IGFueVtdID0gZHVyTGVnc1tpXT8uU2VnbWVudHMgPz8gW107XG4gICAgICAgICAgY29uc3QgbGVnRHVyTWlucyAgICAgPSBkdXJTZWdzLnJlZHVjZSgoc3VtOiBudW1iZXIsIHM6IGFueSkgPT4gc3VtICsgKHMuU2VnbWVudEVsYXBzZWRUaW1lTWludXRlcyA/PyAwKSwgMCk7XG4gICAgICAgICAgY29uc3QgZmxpZ2h0Tm9zICAgICAgPSBzZWdzLm1hcCgoczogYW55KSA9PiBgJHtzLkFpcmxpbmVDb2RlfSR7cy5GbGlnaHROdW1iZXJ9YCkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGl0bGU6IGAke2Rpckljb24oZGlyKX0gJHtkaXIgfHwgYExlZyAke2kgKyAxfWB9IMK3ICR7bC5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZX0g4oaSICR7bC5MZWdBcnJpdmFsQWlycG9ydENvZGV9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RpcmVjdGlvbicsICB2YWx1ZTogbmEoZGlyKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVwYXJ0dXJlJywgIHZhbHVlOiBmbXREYXRlKGwuTGVnRGVwYXJ0dXJlRGF0ZVRpbWUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsJywgICAgdmFsdWU6IGZtdERhdGUobC5MZWdBcnJpdmFsRGF0ZVRpbWUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEdXJhdGlvbicsICAgdmFsdWU6IGxlZ0R1ck1pbnMgPiAwID8gZm10TWlucyhsZWdEdXJNaW5zKSA6IG5hKG51bGwpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJsaW5lKHMpJywgdmFsdWU6IG5hKGwuTGVnQWlybGluZXNOYW1lcz8uam9pbignLCAnKSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0ZsaWdodCBuby4nLCB2YWx1ZTogbmEoZmxpZ2h0Tm9zKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQ2FiaW4nLCAgICAgIHZhbHVlOiBuYShsLkxlZ0NhYmlucz8uWzBdPy5OYW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRmFyZSBicmFuZCcsIHZhbHVlOiBuYShsLmZhcmVCcmFuZD8ubmFtZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyJywgICB2YWx1ZTogbmEobC5zdXBwbGllck5hbWUpIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1N0b3BzJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RvcHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICA/ICdOb24tc3RvcCdcbiAgICAgICAgICAgICAgICAgIDogc3RvcHMubWFwKChzOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgYCR7cy5TdG9wQWlycG9ydENpdHkgPz8gcy5TdG9wQWlycG9ydH0gKCR7bmEocy5TdG9wQWlycG9ydCl9KSDigJMgJHtmbXRNaW5zKHMuTGF5b3ZlckR1cmF0aW9uKX0gbGF5b3ZlcmBcbiAgICAgICAgICAgICAgICAgICAgKS5qb2luKCcgwrcgJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBQTlIgSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3Bucl9pbmZvJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBsYWJlbDogJ1BOUiBJbmZvJyxcbiAgICBzdWJ0aXRsZTogJ1BOUiDCtyBCb29raW5nIHJlZicsXG4gICAgaWNvbjogJ3BpIHBpLXRhZycsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgICAgICAgID0gYmkoZGF0YSk7XG4gICAgICBjb25zdCBwbnJMaXN0ICA9IHJlc29sdmVQbnJMaXN0KGQ/LnBucl9pbmZvKTtcbiAgICAgIGNvbnN0IHBuckRlcCAgID0gcG5yTGlzdC5maW5kKChwOiBhbnkpID0+IHAuTGVnRGlyZWN0aW9uYWxpdHkgPT09ICdEZXBhcnR1cmUnKT8ucG5yID8/IHBuckxpc3RbMF0/LnBucjtcbiAgICAgIGNvbnN0IHBuclJldCAgID0gcG5yTGlzdC5maW5kKChwOiBhbnkpID0+IHAuTGVnRGlyZWN0aW9uYWxpdHkgPT09ICdSZXR1cm4nKT8ucG5yO1xuICAgICAgY29uc3QgY3AgICAgICAgPSBkPy5jYW5jZWxsYXRpb25fcG9saWN5O1xuICAgICAgY29uc3QgaXNDcm9zc1NlbGxlciA9IHBuckxpc3QubGVuZ3RoID4gMVxuICAgICAgICB8fCBjcD8uc3VwcGxpZXJOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjcm9zcycpXG4gICAgICAgIHx8IGZhbHNlO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgcG5yUm93czogYW55W10gPSBbXTtcbiAgICAgIGlmIChwbnJMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG5yTGlzdC5mb3JFYWNoKChwOiBhbnkpID0+IHtcbiAgICAgICAgICBwbnJSb3dzLnB1c2goeyBsYWJlbDogYFBOUiAoJHtwLkxlZ0RpcmVjdGlvbmFsaXR5fSlgLCB2YWx1ZTogbmEocC5wbnIpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBuclJvd3MucHVzaCh7IGxhYmVsOiAnUE5SJywgdmFsdWU6IG5hKHBuckRlcCkgfSk7XG4gICAgICB9XG4gICAgICBwbnJSb3dzLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdCb29raW5nIElEJywgICB2YWx1ZTogbmEoY3A/LmJvb2tpbmdJZCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyIHJlZicsIHZhbHVlOiBuYShjcD8uc3VwcGxpZXJCb29raW5nSWQpIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdXBwbGllcicsICAgICB2YWx1ZTogbmEoY3A/LnN1cHBsaWVyTmFtZSkgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Nyb3NzLXNlbGxlcicsIHZhbHVlOiBpc0Nyb3NzU2VsbGVyID8gJ1llcycgOiAnTm8nIH0sXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogcG5yRGVwID8gYFBOUjogJHtwbnJEZXB9JHtwbnJSZXQgPyAnIC8gJyArIHBuclJldCA6ICcnfWAgOiAnUE5SIEluZm8nLFxuICAgICAgICBzdWJ0aXRsZTogaXNDcm9zc1NlbGxlciA/ICdDcm9zcy1zZWxsZXIgYm9va2luZyDigJQgdHdvIFBOUnMnIDogJ0dsb2JhbCBEaXN0cmlidXRpb24gU3lzdGVtIHJlZmVyZW5jZScsXG4gICAgICAgIHNlY3Rpb25zOiBbeyB0aXRsZTogJ1JlZmVyZW5jZXMnLCByb3dzOiBwbnJSb3dzIH1dLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBCYWdnYWdlIFBvbGljeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ2JhZ2dhZ2UnLFxuICAgIHR5cGU6ICdmbGlnaHQnLFxuICAgIGxhYmVsOiAnQmFnZ2FnZSBQb2xpY3knLFxuICAgIHN1YnRpdGxlOiAnQ2FiaW4gwrcgQ2hlY2tlZCDCtyBBZGQtb25zJyxcbiAgICBpY29uOiAncGkgcGktYnJpZWZjYXNlJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgYmFnZ2FnZSA9IGJpKGRhdGEpPy5iYWdnYWdlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGluZm9BcnJheTogYW55W10gPSBiYWdnYWdlPy5iYWdnYWdlX2luZm8gPz8gW107XG4gICAgICBjb25zdCBhZGRPbnMgICAgICAgICAgID0gYmFnZ2FnZT8uYWRkX29uX2JhZ2dhZ2UgPz8gW107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3Qgc2VjdGlvbnM6IGFueVtdICA9IFtdO1xuICAgICAgY29uc3Qgcm91dGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaW5mb0FycmF5LmZvckVhY2goKGVudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBPYmplY3Qua2V5cyhlbnRyeSlbMF07XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgcm91dGVOYW1lcy5wdXNoKHJvdXRlKTtcbiAgICAgICAgY29uc3QgcGF4VHlwZXMgPSBlbnRyeVtyb3V0ZV0gPz8ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gW107XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGF4VHlwZXMpLmZvckVhY2goKFtwYXhUeXBlLCBwZF06IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsYWJlbCAgICAgPSBwYXhUeXBlID09PSAnQURUJyA/ICdBZHVsdCcgOiBwYXhUeXBlID09PSAnQ05OJyA/ICdDaGlsZCcgOiBwYXhUeXBlID09PSAnSU5GJyA/ICdJbmZhbnQnIDogcGF4VHlwZTtcbiAgICAgICAgICBjb25zdCBjYWJpbiAgICAgPSBwZC5DYWJpbkJhZ2dhZ2U7XG4gICAgICAgICAgY29uc3QgY2hlY2tlZCAgID0gcGQuQ2hlY2tlZEJhZ2dhZ2U7XG4gICAgICAgICAgY29uc3QgdW5kZXJTZWF0ID0gcGQuVW5kZXJTZWF0QmFnZ2FnZTtcblxuICAgICAgICAgIHJvd3MucHVzaChcbiAgICAgICAgICAgIHsgbGFiZWw6IGAke2xhYmVsfSDCtyBDYWJpbmAsICAgdmFsdWU6IGZtdEJhZyhjYWJpbikgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6IGAke2xhYmVsfSDCtyBDaGVja2VkYCwgdmFsdWU6IGZtdEJhZyhjaGVja2VkKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHVuZGVyU2VhdCkge1xuICAgICAgICAgICAgcm93cy5wdXNoKHsgbGFiZWw6IGAke2xhYmVsfSDCtyBVbmRlciBTZWF0YCwgdmFsdWU6IGZtdEJhZyh1bmRlclNlYXQpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlOiBgQmFnZ2FnZSDCtyAke3JvdXRlfWAsIHJvd3MgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGFkZE9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiAnQWRkLW9uIEJhZ2dhZ2UnLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgcm93czogYWRkT25zLm1hcCgoYTogYW55LCBpOiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYEFkZC1vbiAke2kgKyAxfWAsXG4gICAgICAgICAgICB2YWx1ZTogW2Eud2VpZ2h0LCBhLnVuaXQsIGEucm91dGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJykgfHwgJ1NlZSBib29raW5nIGRldGFpbHMnLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnQmFnZ2FnZSBBbGxvd2FuY2UnLFxuICAgICAgICBzdWJ0aXRsZTogcm91dGVOYW1lcy5sZW5ndGggPiAwID8gcm91dGVOYW1lcy5qb2luKCcgIMK3ICAnKSA6ICdBbGwgYmFnZ2FnZSB0eXBlcycsXG4gICAgICAgIHNlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBzZWN0aW9uc1xuICAgICAgICAgIDogW3sgdGl0bGU6ICdJbmZvJywgcm93czogW3sgbGFiZWw6ICdTdGF0dXMnLCB2YWx1ZTogJ05vIGJhZ2dhZ2UgZGF0YSBhdmFpbGFibGUnIH1dIH1dLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBGbGlnaHQgVGltaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ2ZsaWdodF90aW1pbmdzJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdGbGlnaHQgVGltaW5ncycsXG4gICAgc3VidGl0bGU6ICdEZXBhcnR1cmUgwrcgQXJyaXZhbCcsXG4gICAgaWNvbjogJ3BpIHBpLWNsb2NrJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGJpKGRhdGEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ3M6IGFueVtdICAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSA9IGQ/LmFpcmxpbmVfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBkdXJMZWdzOiBhbnlbXSAgPSBkPy5kdXJhdGlvbj8ubGVncyA/PyBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICdGbGlnaHQgVGltaW5ncycsXG4gICAgICAgIHN1YnRpdGxlOiBsZWdzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAke2xlZ3NbMF0uTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2xlZ3NbbGVncy5sZW5ndGggLSAxXS5MZWdBcnJpdmFsQWlycG9ydENvZGV9YFxuICAgICAgICAgIDogJ0FsbCBsZWdzJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc2VjdGlvbnM6IGxlZ3MubWFwKChsOiBhbnksIGxpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXIgICAgICA9IGwuTGVnRGlyZWN0aW9uYWxpdHkgPz8gJyc7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSAgICA9IGFpcmxpbmVzW2xpXT8uU2VnbWVudHMgPz8gW107XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBkdXJTZWdzOiBhbnlbXSA9IGR1ckxlZ3NbbGldPy5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIGNvbnN0IHN0b3BzOiBhbnlbXSAgID0gbC5TdG9wcyA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZWdEdXJNaW5zICAgICA9IGR1clNlZ3MucmVkdWNlKChzdW06IG51bWJlciwgczogYW55KSA9PiBzdW0gKyAocy5TZWdtZW50RWxhcHNlZFRpbWVNaW51dGVzID8/IDApLCAwKTtcblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3Qgcm93czogYW55W10gPSBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnRGVwYXJ0dXJlJywgdmFsdWU6IGZtdERhdGUobC5MZWdEZXBhcnR1cmVEYXRlVGltZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsJywgICB2YWx1ZTogZm10RGF0ZShsLkxlZ0Fycml2YWxEYXRlVGltZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEdXJhdGlvbicsICB2YWx1ZTogbGVnRHVyTWlucyA+IDAgPyBmbXRNaW5zKGxlZ0R1ck1pbnMpIDogbmEobnVsbCkgfSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gSW50ZXJsZWF2ZSBzZWdtZW50IHJvd3Mgd2l0aCBsYXlvdmVyIHJvd3NcbiAgICAgICAgICBzZWdzLmZvckVhY2goKHM6IGFueSwgc2k6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VnRHVyID0gZHVyU2Vnc1tzaV0/LlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXM7XG4gICAgICAgICAgICByb3dzLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogYFNlZyAke3NpICsgMX0gwrcgJHtzLkFpcmxpbmVDb2RlfSR7cy5GbGlnaHROdW1iZXJ9YCxcbiAgICAgICAgICAgICAgdmFsdWU6IGAke25hKHMuRGVwYXJ0dXJlQWlycG9ydENvZGUpfSDihpIgJHtuYShzLkFycml2YWxBaXJwb3J0Q29kZSl9JHtzZWdEdXIgPyAnIMK3ICcgKyBmbXRNaW5zKHNlZ0R1cikgOiAnJ31gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBMYXlvdmVyIGFmdGVyIHRoaXMgc2VnbWVudCAoaWYgdGhlcmUgaXMgYSBzdG9wIGF0IGFycml2YWwgYWlycG9ydClcbiAgICAgICAgICAgIGlmIChzaSA8IHNlZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBjb25zdCBzdG9wID0gc3RvcHMuZmluZCgoc3Q6IGFueSkgPT4gc3QuU3RvcEFpcnBvcnQgPT09IHMuQXJyaXZhbEFpcnBvcnRDb2RlKTtcbiAgICAgICAgICAgICAgaWYgKHN0b3ApIHtcbiAgICAgICAgICAgICAgICByb3dzLnB1c2goeyBsYWJlbDogYExheW92ZXIgwrcgJHtzdG9wLlN0b3BBaXJwb3J0fWAsIHZhbHVlOiBmbXRNaW5zKHN0b3AuTGF5b3ZlckR1cmF0aW9uKSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpdGxlOiBgJHtkaXJJY29uKGRpcil9ICR7ZGlyIHx8IGBMZWcgJHtsaSArIDF9YH0gwrcgJHtsLkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlfSDihpIgJHtsLkxlZ0Fycml2YWxBaXJwb3J0Q29kZX1gLFxuICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgRHVyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdkdXJhdGlvbicsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIGxhYmVsOiAnRHVyYXRpb24nLFxuICAgIHN1YnRpdGxlOiAnVG90YWwgZmxpZ2h0IHRpbWUnLFxuICAgIGljb246ICdwaSBwaS1yZWZyZXNoJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCAgID0gYmkoZGF0YSk7XG4gICAgICBjb25zdCBkdXIgPSBkPy5kdXJhdGlvbjtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBsZWdzOiBhbnlbXSA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSBmbXRNaW5zKGR1cj8udG90YWxNaW51dGVzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6IHRvdGFsLFxuICAgICAgICBzdWJ0aXRsZTogJ1RvdGFsIGpvdXJuZXkgZHVyYXRpb24gaW5jbHVkaW5nIGxheW92ZXJzJyxcbiAgICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aXRsZTogJ1RvdGFsJyxcbiAgICAgICAgICAgIHJvd3M6IFt7IGxhYmVsOiAnSm91cm5leSBkdXJhdGlvbicsIHZhbHVlOiB0b3RhbCB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgLi4uKGR1cj8ubGVncyA/PyBbXSkubWFwKChsZWc6IGFueSwgbGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGVnTWV0YSA9IGxlZ3NbbGldO1xuICAgICAgICAgICAgY29uc3QgZGlyICAgICA9IGxlZ01ldGE/LkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgZnJvbSAgICA9IGxlZ01ldGE/LkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlO1xuICAgICAgICAgICAgY29uc3QgdG8gICAgICA9IGxlZ01ldGE/LkxlZ0Fycml2YWxBaXJwb3J0Q29kZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCByb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIChsZWcuU2VnbWVudHMgPz8gW10pLmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICByb3dzLnB1c2goeyBsYWJlbDogYCR7cy5EZXBhcnR1cmVBaXJwb3J0Q29kZX0g4oaSICR7cy5BcnJpdmFsQWlycG9ydENvZGV9YCwgdmFsdWU6IGZtdE1pbnMocy5TZWdtZW50RWxhcHNlZFRpbWVNaW51dGVzKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIChsZWcuU3RvcHMgPz8gW10pLmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICByb3dzLnB1c2goeyBsYWJlbDogYExheW92ZXIgwrcgJHtzLlN0b3BBaXJwb3J0fWAsIHZhbHVlOiBmbXRNaW5zKHMuTGF5b3ZlckR1cmF0aW9uKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGl0bGU6IGAke2Rpckljb24oZGlyKX0gJHtkaXIgfHwgYExlZyAke2xpICsgMX1gfSR7ZnJvbSAmJiB0byA/IGAgwrcgJHtmcm9tfSDihpIgJHt0b31gIDogJyd9YCxcbiAgICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG5cbiAgLy8g4pSA4pSAIENhbmNlbGxhdGlvbiBQb2xpY3kg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdjYW5jZWxsYXRpb25fcG9saWN5JyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBsYWJlbDogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxuICAgIHN1YnRpdGxlOiAnUmVmdW5kIMK3IEZlZXMgwrcgTGVncycsXG4gICAgaWNvbjogJ3BpIHBpLWJhbicsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgID0gYmkoZGF0YSk7XG4gICAgICBjb25zdCBjcCA9IGQ/LmNhbmNlbGxhdGlvbl9wb2xpY3k7XG5cbiAgICAgIGlmICghY3ApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aXRsZTogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxuICAgICAgICAgIHN1YnRpdGxlOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgICAgICAgIHNlY3Rpb25zOiBbeyB0aXRsZTogJ0luZm8nLCByb3dzOiBbeyBsYWJlbDogJ1N0YXR1cycsIHZhbHVlOiAnTm8gY2FuY2VsbGF0aW9uIHBvbGljeSBkYXRhIGF2YWlsYWJsZScgfV0gfV0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBzZWN0aW9uczogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IHBuckxpc3QgICAgICAgICA9IHJlc29sdmVQbnJMaXN0KGQ/LnBucl9pbmZvKTtcbiAgICAgIGNvbnN0IGlzQ3Jvc3NTZWxsZXIgICA9IHBuckxpc3QubGVuZ3RoID4gMSB8fCBjcD8uc3VwcGxpZXJOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjcm9zcycpO1xuICAgICAgY29uc3QgbGVnczogYW55W10gICAgID0gY3A/LmxlZ3MgPz8gW107XG5cbiAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICB0aXRsZTogJ0Jvb2tpbmcgUmVmZXJlbmNlJyxcbiAgICAgICAgcm93czogW1xuICAgICAgICAgIHsgbGFiZWw6ICdCb29raW5nIElEJywgICB2YWx1ZTogbmEoY3AuYm9va2luZ0lkKSB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdTdXBwbGllciByZWYnLCB2YWx1ZTogbmEoY3Auc3VwcGxpZXJCb29raW5nSWQpIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyJywgICAgIHZhbHVlOiBuYShjcC5zdXBwbGllck5hbWUpIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ0Nyb3NzLXNlbGxlcicsIHZhbHVlOiBpc0Nyb3NzU2VsbGVyID8gJ1llcycgOiAnTm8nIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm10RmVlID0gKGZlZTogbnVtYmVyLCBjdXJyZW5jeTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgICAgIGZlZSAhPSBudWxsID8gYCR7ZmVlfSAke2N1cnJlbmN5ID8/ICdTQVInfWAgOiAnMCc7XG5cbiAgICAgIGxlZ3MuZm9yRWFjaCgobGVnOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBgQ2FuY2VsbGF0aW9uIGFuZCBDaGFuZ2UgUG9saWN5IMK3ICR7bGVnLmRpcmVjdGlvbn0gKCR7bGVnLmZyb219IOKGkiAke2xlZy50b30pYDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcblxuICAgICAgICAobGVnLnBhc3NlbmdlclBlbmFsdGllcyA/PyBbXSkuZm9yRWFjaCgocHA6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR5cGVMYWJlbCAgPSBwcC50eXBlID09PSAnQURUJyA/ICdBZHVsdCcgOiBwcC50eXBlID09PSAnQ05OJyA/ICdDaGlsZCcgOiAnSW5mYW50JztcbiAgICAgICAgICBjb25zdCBiRGVwICAgICAgID0gcHAucGVuYWx0aWVzPy5iZWZvcmVEZXBhcnR1cmU7XG4gICAgICAgICAgY29uc3QgYURlcCAgICAgICA9IHBwLnBlbmFsdGllcz8uYWZ0ZXJEZXBhcnR1cmU7XG4gICAgICAgICAgY29uc3QgYlJlZnVuZCAgICA9IGJEZXA/LnJlZnVuZDtcbiAgICAgICAgICBjb25zdCBiRXhjaGFuZ2UgID0gYkRlcD8uZXhjaGFuZ2U7XG4gICAgICAgICAgY29uc3QgYVJlZnVuZCAgICA9IGFEZXA/LnJlZnVuZDtcbiAgICAgICAgICBjb25zdCBhRXhjaGFuZ2UgID0gYURlcD8uZXhjaGFuZ2U7XG5cbiAgICAgICAgICByb3dzLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiBgJHt0eXBlTGFiZWx9IMK3IEJlZm9yZSBkZXAuYCxcbiAgICAgICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgICAgICBiUmVmdW5kPy5pc0FjdGlvbmFibGUgICA/IGBSZWZ1bmQ6ICR7Zm10RmVlKGJSZWZ1bmQuZmVlLCBiUmVmdW5kLmN1cnJlbmN5KX1gICAgICA6ICdObyByZWZ1bmQnLFxuICAgICAgICAgICAgICAgIGJFeGNoYW5nZT8uaXNBY3Rpb25hYmxlID8gYEV4Y2hhbmdlOiAke2ZtdEZlZShiRXhjaGFuZ2UuZmVlLCBiRXhjaGFuZ2UuY3VycmVuY3kpfWAgOiAnTm8gZXhjaGFuZ2UnLFxuICAgICAgICAgICAgICBdLmpvaW4oJyAgwrcgICcpLFxuICAgICAgICAgICAgICB2YWx1ZUNsYXNzOiBiUmVmdW5kPy5pc0FjdGlvbmFibGUgfHwgYkV4Y2hhbmdlPy5pc0FjdGlvbmFibGUgPyAnbmV1dHJhbCcgOiAnbmVnYXRpdmUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6IGAke3R5cGVMYWJlbH0gwrcgQWZ0ZXIgZGVwLmAsXG4gICAgICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICAgICAgYVJlZnVuZD8uaXNBY3Rpb25hYmxlICAgPyBgUmVmdW5kOiAke2ZtdEZlZShhUmVmdW5kLmZlZSwgYVJlZnVuZC5jdXJyZW5jeSl9YCAgICAgOiAnTm8gcmVmdW5kJyxcbiAgICAgICAgICAgICAgICBhRXhjaGFuZ2U/LmlzQWN0aW9uYWJsZSA/IGBFeGNoYW5nZTogJHtmbXRGZWUoYUV4Y2hhbmdlLmZlZSwgYUV4Y2hhbmdlLmN1cnJlbmN5KX1gIDogJ05vIGV4Y2hhbmdlJyxcbiAgICAgICAgICAgICAgXS5qb2luKCcgIMK3ICAnKSxcbiAgICAgICAgICAgICAgdmFsdWVDbGFzczogYVJlZnVuZD8uaXNBY3Rpb25hYmxlIHx8IGFFeGNoYW5nZT8uaXNBY3Rpb25hYmxlID8gJ25ldXRyYWwnIDogJ25lZ2F0aXZlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlLCByb3dzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiBgJHtjcC5zdXBwbGllck5hbWUgPz8gJ0NhbmNlbGxhdGlvbid9IFBvbGljeWAsXG4gICAgICAgIHN1YnRpdGxlOiBpc0Nyb3NzU2VsbGVyID8gJ0Nyb3NzLXNlbGxlciBib29raW5nIMK3IGNvbnRhY3Qgc3VwcGxpZXIgZm9yIHJlZnVuZCcgOiBgQm9va2luZyAke2NwLmJvb2tpbmdJZCA/PyAnJ31gLFxuICAgICAgICBzZWN0aW9ucyxcbiAgICAgICAgY2FsbG91dDogaXNDcm9zc1NlbGxlclxuICAgICAgICAgID8geyB0eXBlOiAnaW5mbycsIG1lc3NhZ2U6ICdDcm9zcy1zZWxsZXIgYm9va2luZyDigJQgcmVmdW5kIGlzIHByb2Nlc3NlZCBieSB0aGUgcGFydG5lciBhbmQgbWF5IHRha2UgYWRkaXRpb25hbCB0aW1lLicgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBGbGlnaHQgU3RhdHVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB7XG4gICAga2V5OiAnZmxpZ2h0X3N0YXR1cycsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIGxhYmVsOiAnRmxpZ2h0IFN0YXR1cycsXG4gICAgc3VidGl0bGU6ICdMaXZlIMK3IERlbGF5cycsXG4gICAgaWNvbjogJ3BpIHBpLWNoYXJ0LWJhcicsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgPSBiaShkYXRhKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBsZWdzOiBhbnlbXSAgICAgPSBkPy5sZWdfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBhaXJsaW5lczogYW55W10gPSBkPy5haXJsaW5lX2luZm8gPz8gW107XG4gICAgICBjb25zdCBvcmlnaW4gPSBsZWdzWzBdPy5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZTtcbiAgICAgIGNvbnN0IGRlc3QgICA9IGxlZ3NbbGVncy5sZW5ndGggLSAxXT8uTGVnQXJyaXZhbEFpcnBvcnRDb2RlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogb3JpZ2luID8gYCR7b3JpZ2lufSDihpIgJHtkZXN0fWAgOiAnRmxpZ2h0IFN0YXR1cycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSDCtyBTY2hlZHVsZWQgdGltZXMgZnJvbSBib29raW5nYCxcbiAgICAgICAgc2VjdGlvbnM6IGxlZ3MubWFwKChsLCBsaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpciAgPSBsLkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3Qgc2VnczogYW55W10gPSBhaXJsaW5lc1tsaV0/LlNlZ21lbnRzID8/IFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogYCR7ZGlySWNvbihkaXIpfSAke2RpciB8fCBgTGVnICR7bGkgKyAxfWB9IMK3ICR7bC5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZX0g4oaSICR7bC5MZWdBcnJpdmFsQWlycG9ydENvZGV9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGFydHVyZScsICB2YWx1ZTogZm10RGF0ZShsLkxlZ0RlcGFydHVyZURhdGVUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQXJyaXZhbCcsICAgIHZhbHVlOiBmbXREYXRlKGwuTGVnQXJyaXZhbERhdGVUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQWlybGluZShzKScsIHZhbHVlOiBuYShsLkxlZ0FpcmxpbmVzTmFtZXM/LmpvaW4oJywgJykpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdDYWJpbicsICAgICAgdmFsdWU6IG5hKGwuTGVnQ2FiaW5zPy5bMF0/Lk5hbWUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdGYXJlIGJyYW5kJywgdmFsdWU6IG5hKGwuZmFyZUJyYW5kPy5uYW1lKSB9LFxuICAgICAgICAgICAgICAuLi5zZWdzLm1hcCgoczogYW55LCBzaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiBgRmxpZ2h0ICR7c2kgKyAxfWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGAke3MuQWlybGluZUNvZGV9JHtzLkZsaWdodE51bWJlcn0gwrcgJHtzLkRlcGFydHVyZUFpcnBvcnRDb2RlfSDihpIgJHtzLkFycml2YWxBaXJwb3J0Q29kZX1gLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICBjYWxsb3V0OiB7IHR5cGU6ICdpbmZvJywgbWVzc2FnZTogJ0xpdmUgc3RhdHVzIG5vdCBhdmFpbGFibGUg4oCUIGNoZWNrIHRoZSBhaXJsaW5lIGFwcCBvciBhaXJwb3J0IGJvYXJkcyBmb3IgcmVhbC10aW1lIHVwZGF0ZXMuJyB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBXaS1GaSAmIEV4dHJhcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3dpZmknLFxuICAgIHR5cGU6ICdmbGlnaHQnLFxuICAgIGhpZGRlbjogdHJ1ZSxcbiAgICBsYWJlbDogJ1dpLUZpICYgRXh0cmFzJyxcbiAgICBzdWJ0aXRsZTogJ09uYm9hcmQgc2VydmljZXMnLFxuICAgIGljb246ICdwaSBwaS1pbmZvLWNpcmNsZScsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgPSBiaShkYXRhKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBsZWdzOiBhbnlbXSAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgY29uc3QgYWRkT25zICAgICAgICAgPSBkPy5iYWdnYWdlPy5hZGRfb25fYmFnZ2FnZSA/PyBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICdPbmJvYXJkIEV4dHJhcycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWAsXG4gICAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAuLi5sZWdzLm1hcCgobDogYW55LCBsaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBsLkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGl0bGU6IGAke2Rpckljb24oZGlyKX0gJHtkaXIgfHwgYExlZyAke2xpICsgMX1gfSDCtyAke2wuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2wuTGVnQXJyaXZhbEFpcnBvcnRDb2RlfWAsXG4gICAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQ2FiaW4nLCAgICAgIHZhbHVlOiBuYShsLkxlZ0NhYmlucz8uWzBdPy5OYW1lKSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdGYXJlIGJyYW5kJywgdmFsdWU6IG5hKGwuZmFyZUJyYW5kPy5uYW1lKSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJsaW5lKHMpJywgdmFsdWU6IG5hKGwuTGVnQWlybGluZXNOYW1lcz8uam9pbignLCAnKSkgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLi4uKGFkZE9ucy5sZW5ndGggPiAwID8gW3tcbiAgICAgICAgICAgIHRpdGxlOiAnQWRkLW9uIEJhZ2dhZ2UnLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHJvd3M6IGFkZE9ucy5tYXAoKGE6IGFueSwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICBsYWJlbDogYEFkZC1vbiAke2kgKyAxfWAsXG4gICAgICAgICAgICAgIHZhbHVlOiBbYS53ZWlnaHQsIGEudW5pdCwgYS5yb3V0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKSB8fCAnU2VlIGJvb2tpbmcgZGV0YWlscycsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfV0gOiBbXSksXG4gICAgICAgIF0sXG4gICAgICAgIGNhbGxvdXQ6IHsgdHlwZTogJ2luZm8nLCBtZXNzYWdlOiAnRGV0YWlsZWQgb25ib2FyZCBhbWVuaXRpZXMgZGVwZW5kIG9uIHRoZSBvcGVyYXRpbmcgYWlybGluZSBhbmQgZmFyZSBjbGFzcy4nIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG5dO1xuIl19
|