valtech-components 4.0.937 → 4.0.939

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/esm2022/lib/components/molecules/group-picker/group-picker.component.mjs +97 -0
  2. package/esm2022/lib/components/organisms/group-members/group-members.component.mjs +178 -0
  3. package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +1 -381
  4. package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
  5. package/esm2022/lib/services/groups/groups.service.mjs +92 -0
  6. package/esm2022/lib/services/groups/types.mjs +2 -0
  7. package/esm2022/lib/version.mjs +2 -2
  8. package/esm2022/public-api.mjs +4 -3
  9. package/fesm2022/valtech-components.mjs +641 -7612
  10. package/fesm2022/valtech-components.mjs.map +1 -1
  11. package/lib/components/molecules/group-picker/group-picker.component.d.ts +28 -0
  12. package/lib/components/organisms/group-members/group-members.component.d.ts +43 -0
  13. package/lib/components/organisms/mini-games/types.d.ts +0 -182
  14. package/lib/services/groups/groups.service.d.ts +39 -0
  15. package/lib/services/groups/types.d.ts +69 -0
  16. package/lib/version.d.ts +1 -1
  17. package/package.json +1 -1
  18. package/public-api.d.ts +4 -2
  19. package/src/lib/assets/games/README.md +8 -0
  20. package/esm2022/lib/components/organisms/mini-games/christianity-bot.mjs +0 -94
  21. package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +0 -503
  22. package/esm2022/lib/components/organisms/mini-games/christianity-catalog.mjs +0 -247
  23. package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -4580
  24. package/esm2022/lib/components/organisms/mini-games/christianity-rules.mjs +0 -1383
  25. package/esm2022/lib/components/organisms/mini-games/christianity-tutorial.mjs +0 -152
  26. package/lib/components/organisms/mini-games/christianity-bot.d.ts +0 -15
  27. package/lib/components/organisms/mini-games/christianity-card.component.d.ts +0 -55
  28. package/lib/components/organisms/mini-games/christianity-catalog.d.ts +0 -18
  29. package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -395
  30. package/lib/components/organisms/mini-games/christianity-rules.d.ts +0 -57
  31. package/lib/components/organisms/mini-games/christianity-tutorial.d.ts +0 -38
  32. package/src/lib/assets/games/christianity/card-symbol.svg +0 -51
  33. package/src/lib/assets/games/christianity/card-template-reference/front.html +0 -114
  34. package/src/lib/assets/games/christianity/card-template-reference/front.style.css +0 -352
  35. package/src/lib/assets/games/christianity/data/01-genesis.bible-reference-suggestions.csv +0 -191
  36. package/src/lib/assets/games/christianity/data/01-genesis.bible-verses.nbv-open.csv +0 -170
  37. package/src/lib/assets/games/christianity/data/01-genesis.cards.csv +0 -281
  38. package/src/lib/assets/games/christianity/data/01-genesis.cards.i18n.csv +0 -281
  39. package/src/lib/assets/games/christianity/data/01-genesis.cards.json +0 -16453
  40. package/src/lib/assets/games/christianity/data/01-genesis.unassigned-effects.csv +0 -49
  41. package/src/lib/assets/games/christianity/data/README.md +0 -40
  42. package/src/lib/assets/games/christianity/data/data-con-habilides.csv +0 -273
  43. package/src/lib/assets/games/christianity/data/habilidades-por-tipo.xlsx +0 -0
  44. package/src/lib/assets/games/christianity/data/listado-edicion.csv +0 -281
  45. package/src/lib/assets/games/christianity/editions/1/cards/.gitkeep +0 -1
  46. package/src/lib/assets/games/christianity/editions/1/cards/PLACEHOLDER.png +0 -0
  47. package/src/lib/assets/games/christianity/editions/README.md +0 -34
  48. package/src/lib/assets/games/christianity/icons/1-icon.png +0 -0
  49. package/src/lib/assets/games/christianity/icons/action.png +0 -0
  50. package/src/lib/assets/games/christianity/icons/character.png +0 -0
  51. package/src/lib/assets/games/christianity/icons/event.png +0 -0
  52. package/src/lib/assets/games/christianity/icons/leader.png +0 -0
  53. package/src/lib/assets/games/christianity/icons/offering.png +0 -0
  54. package/src/lib/assets/games/christianity/icons/place.png +0 -0
  55. package/src/lib/assets/games/christianity/icons/tool.png +0 -0
  56. package/src/lib/assets/games/christianity/icons/wisdom.png +0 -0
  57. package/src/lib/assets/games/christianity/sources/README.md +0 -16
  58. package/src/lib/assets/games/christianity/sources/spaonbv_vpl.txt +0 -29102
  59. package/src/lib/assets/games/christianity/sources/spaonbv_vpl.xml +0 -29104
  60. package/src/lib/assets/games/christianity/spaonbv.txt +0 -52
@@ -1,1383 +0,0 @@
1
- export const CHRISTIANITY_BATTLE_SLOTS = 4;
2
- // Máximo de cartas en mano: al robar por encima de este límite, la carta robada se descarta a Historia.
3
- export const CHRISTIANITY_MAX_HAND_SIZE = 7;
4
- export function readyOfferings(player) {
5
- return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), player.temporaryOfferingReserve ?? 0);
6
- }
7
- export function totalOfferings(player) {
8
- return player.offerings.reduce((total, offering) => total + offering.value, 0);
9
- }
10
- export function effectiveCost(player, card) {
11
- const base = card.cost ?? 0;
12
- if (base === 0)
13
- return 0;
14
- const delta = (player.costModifiers ?? [])
15
- .filter(m => m.cardType === card.type)
16
- .reduce((sum, m) => sum + m.delta, 0);
17
- return Math.max(0, base + delta);
18
- }
19
- export function canPlayCard(game, seat, card) {
20
- if (game.status !== 'in_progress' || game.turnOwner !== seat)
21
- return false;
22
- const player = game.players[seat];
23
- if (card.type === 'offering') {
24
- const extraCost = (player.costModifiers ?? [])
25
- .filter(m => m.cardType === 'offering')
26
- .reduce((s, m) => s + m.delta, 0);
27
- if (extraCost > 0 && readyOfferings(player) < extraCost)
28
- return false;
29
- return !player.offeringPlayedThisTurn;
30
- }
31
- const cost = effectiveCost(player, card);
32
- if (card.type === 'character') {
33
- return readyOfferings(player) >= cost && player.battleZone.length < CHRISTIANITY_BATTLE_SLOTS;
34
- }
35
- if (card.type === 'tool') {
36
- return readyOfferings(player) >= cost && player.battleZone.length > 0;
37
- }
38
- if (card.type === 'action' || card.type === 'wisdom' || card.type === 'event') {
39
- const locked = (player.costModifiers ?? []).some(m => m.cardType === card.type && m.delta >= 99);
40
- if (locked)
41
- return false;
42
- return readyOfferings(player) >= cost;
43
- }
44
- if (card.type === 'place')
45
- return true;
46
- return false;
47
- }
48
- export function playCardFromHand(game, seat, card, options = {}) {
49
- if (!canPlayCard(game, seat, card)) {
50
- return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
51
- }
52
- const next = structuredClone(game);
53
- const player = next.players[seat];
54
- const handIndex = player.hand?.indexOf(card.id) ?? -1;
55
- if (handIndex < 0 || !player.hand) {
56
- return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
57
- }
58
- const displayName = options.displayName ?? card.name;
59
- let playedOfferingValue = 0;
60
- let spentOfferings = 0;
61
- player.hand.splice(handIndex, 1);
62
- if (card.type === 'offering') {
63
- playedOfferingValue = card.offeringValue ?? card.life ?? 1;
64
- player.offerings.push({
65
- instanceId: `${seat.toLowerCase()}_offering_${next.revision + 1}`,
66
- cardId: card.id,
67
- name: displayName,
68
- owner: seat,
69
- ready: true,
70
- value: playedOfferingValue,
71
- abilityName: card.abilityName,
72
- abilityText: card.abilityText,
73
- abilityCost: card.abilityCost,
74
- });
75
- player.offeringPlayedThisTurn = true;
76
- }
77
- else if (card.type === 'character') {
78
- const occupiedSlots = new Set(player.battleZone.map((character, index) => Number.isInteger(character.slot) ? (character.slot ?? index) : index));
79
- const targetSlot = options.slotIndex ?? [0, 1, 2, 3].find(index => !occupiedSlots.has(index));
80
- if (targetSlot === undefined || occupiedSlots.has(targetSlot)) {
81
- return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
82
- }
83
- spentOfferings = effectiveCost(player, card);
84
- spendOfferings(player, spentOfferings);
85
- const life = card.life ?? 1;
86
- const newChar = {
87
- instanceId: `${seat.toLowerCase()}_${next.revision + 1}_${player.battleZone.length}`,
88
- cardId: card.id,
89
- name: displayName,
90
- owner: seat,
91
- controller: seat,
92
- slot: targetSlot,
93
- attack: card.attack ?? 0,
94
- currentHp: life,
95
- maxHp: life,
96
- canAttack: false,
97
- };
98
- const synthesized = synthesizeStructuredEffects(card);
99
- bakeEffects(newChar, [...(card.effects ?? []), ...synthesized]);
100
- player.battleZone.push(newChar);
101
- fireEffects(next, newChar, 'on_enter', seat);
102
- fireEffects(next, newChar, 'passive', seat);
103
- applyPassiveCostModifiers(next.players[seat], newChar.instanceId, card, true);
104
- resolveCharacterStrategyEnter(next, newChar, card, seat, options.lookup);
105
- inlineCleanup(next, options.lookup);
106
- player.battleZone.sort((left, right) => (left.slot ?? 0) - (right.slot ?? 0));
107
- }
108
- else if (card.type === 'tool') {
109
- spentOfferings = effectiveCost(player, card);
110
- if (spentOfferings > 0) {
111
- spendOfferings(player, spentOfferings);
112
- }
113
- next.players[seat] = player;
114
- const targetId = options.targetInstanceId;
115
- const charIdx = next.players[seat].battleZone.findIndex(c => c.instanceId === targetId);
116
- if (charIdx < 0) {
117
- return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
118
- }
119
- const ch = next.players[seat].battleZone[charIdx];
120
- ch.equippedTools = [...(ch.equippedTools ?? []), card.id];
121
- applyToolPassives(ch, card);
122
- }
123
- else if (card.type === 'action' || card.type === 'wisdom' || card.type === 'event') {
124
- spentOfferings = effectiveCost(player, card);
125
- if (spentOfferings > 0) {
126
- spendOfferings(player, spentOfferings);
127
- }
128
- next.historyZone.push(card.id);
129
- next.players[seat] = player;
130
- resolveCardEffect(next, card, seat, options.lookup);
131
- inlineCleanup(next, options.lookup);
132
- }
133
- else if (card.type === 'place') {
134
- const previousPlace = next.placeZone[0];
135
- if (previousPlace) {
136
- next.historyZone.push(previousPlace);
137
- }
138
- next.placeZone = [card.id];
139
- resolveCardEffect(next, card, seat, options.lookup);
140
- }
141
- next.revision++;
142
- const log = [playCardLog(card, displayName)];
143
- next.log = [...log, ...next.log].slice(0, 4);
144
- return { game: next, played: true, playedOfferingValue, spentOfferings, log };
145
- }
146
- export function canUseOfferingAbility(game, seat, offeringInstanceId) {
147
- if (game.status !== 'in_progress' || game.turnOwner !== seat)
148
- return false;
149
- const player = game.players[seat];
150
- const offering = player.offerings.find(card => card.instanceId === offeringInstanceId);
151
- if (!offering?.ready || !offering.abilityName || offering.abilityUsedThisTurn)
152
- return false;
153
- return readyOfferings(player) >= (offering.abilityCost ?? 0);
154
- }
155
- export function resolveOfferingAbility(game, seat, offeringInstanceId, messages) {
156
- if (!canUseOfferingAbility(game, seat, offeringInstanceId)) {
157
- return { game, resolved: false, leaderDamage: 0, reserveGain: 0, spentOfferings: 0, log: [] };
158
- }
159
- const next = structuredClone(game);
160
- const player = next.players[seat];
161
- const liveOffering = player.offerings.find(card => card.instanceId === offeringInstanceId);
162
- if (!liveOffering)
163
- return { game, resolved: false, leaderDamage: 0, reserveGain: 0, spentOfferings: 0, log: [] };
164
- const spentOfferings = liveOffering.abilityCost ?? 0;
165
- if (spentOfferings > 0) {
166
- spendOfferings(player, spentOfferings);
167
- }
168
- const reserveGain = offeringAbilityReserveGain(liveOffering.abilityText, liveOffering.value);
169
- player.temporaryOfferingReserve = (player.temporaryOfferingReserve ?? 0) + reserveGain;
170
- player.offerings = player.offerings.map(card => card.instanceId === offeringInstanceId ? { ...card, abilityUsedThisTurn: true } : card);
171
- player.leaderHp = Math.max(0, player.leaderHp - 1);
172
- next.revision++;
173
- const log = [`${liveOffering.name}: ${liveOffering.abilityName}.`];
174
- if (messages) {
175
- evaluateVictory(next, log, messages);
176
- }
177
- next.log = [...log, ...next.log].slice(0, 4);
178
- return { game: next, resolved: true, leaderDamage: 1, reserveGain, spentOfferings, log };
179
- }
180
- function playCardLog(card, displayName) {
181
- if (card.type === 'offering')
182
- return `${displayName} queda lista como ofrenda.`;
183
- if (card.type === 'place')
184
- return `${displayName} queda como lugar activo.`;
185
- if (card.type === 'action' || card.type === 'event')
186
- return `${displayName} fue jugada.`;
187
- if (card.type === 'wisdom')
188
- return `${displayName} fue revelada.`;
189
- if (card.type === 'tool')
190
- return `${displayName} fue equipada.`;
191
- return `${displayName} entra en batalla.`;
192
- }
193
- export function resolveAttackLeader(game, attackerSeat, attackerInstanceId, messages) {
194
- const defenderSeat = opponentSeat(attackerSeat);
195
- if (game.status !== 'in_progress' || game.players[defenderSeat].battleZone.length > 0) {
196
- return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
197
- }
198
- const next = structuredClone(game);
199
- const attacker = next.players[attackerSeat].battleZone.find(card => card.instanceId === attackerInstanceId);
200
- if (!attacker || !attacker.canAttack)
201
- return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
202
- fireEffects(next, attacker, 'on_attack', attackerSeat, { targeting: 'leader' });
203
- const damage = attacker.attack + (attacker.combatAttackBuff ?? 0);
204
- next.players[defenderSeat].leaderHp = Math.max(0, next.players[defenderSeat].leaderHp - damage);
205
- attacker.combatAttackBuff = 0;
206
- attacker.canAttack = false;
207
- const log = [
208
- `${attacker.name} ${attackerSeat === 'P1' ? messages.attacksOpponentLeader : messages.attacksYourLeader}`,
209
- ];
210
- evaluateVictory(next, log, messages);
211
- next.revision++;
212
- next.log = [...log, ...next.log].slice(0, 4);
213
- return { game: next, attacked: true, attackerDamage: 0, targetDamage: damage, log };
214
- }
215
- export function resolveAttackCharacter(game, attackerSeat, attackerInstanceId, targetInstanceId, messages) {
216
- const defenderSeat = opponentSeat(attackerSeat);
217
- if (game.status !== 'in_progress')
218
- return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
219
- const next = structuredClone(game);
220
- const attacker = next.players[attackerSeat].battleZone.find(card => card.instanceId === attackerInstanceId);
221
- const target = next.players[defenderSeat].battleZone.find(card => card.instanceId === targetInstanceId);
222
- if (!attacker || !target || !attacker.canAttack) {
223
- return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
224
- }
225
- fireEffects(next, attacker, 'on_attack', attackerSeat, { targeting: 'character' }, target);
226
- fireEffects(next, target, 'on_defend', defenderSeat, { targeting: 'character' }, attacker);
227
- const attackerTotal = attacker.attack + (attacker.combatAttackBuff ?? 0);
228
- const targetTotal = target.attack + (target.combatAttackBuff ?? 0);
229
- target.currentHp -= attackerTotal;
230
- attacker.currentHp -= targetTotal;
231
- attacker.combatAttackBuff = 0;
232
- target.combatAttackBuff = 0;
233
- attacker.canAttack = false;
234
- cleanupDestroyed(next.players[attackerSeat], next);
235
- cleanupDestroyed(next.players[defenderSeat], next);
236
- const log = [`${attacker.name} ${messages.combatsAgainst} ${target.name}.`];
237
- evaluateVictory(next, log, messages);
238
- next.revision++;
239
- next.log = [...log, ...next.log].slice(0, 4);
240
- return {
241
- game: next,
242
- attacked: true,
243
- attackerDamage: targetTotal,
244
- targetDamage: attackerTotal,
245
- log,
246
- };
247
- }
248
- export function advanceTurn(game, messages) {
249
- game.players[game.turnOwner].temporaryOfferingReserve = 0;
250
- game.turnOwner = opponentSeat(game.turnOwner);
251
- game.turnCount++;
252
- const current = game.players[game.turnOwner];
253
- current.offeringPlayedThisTurn = false;
254
- current.offerings = current.offerings.map(offering => ({
255
- ...offering,
256
- ready: true,
257
- abilityUsedThisTurn: false,
258
- }));
259
- current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
260
- const drawnCard = game.sharedDeck.shift();
261
- const log = [];
262
- let discardedForHandLimit = false;
263
- if (drawnCard) {
264
- if (current.hand) {
265
- current.hand.push(drawnCard);
266
- // Mano llena: la carta robada por encima del máximo se descarta a Historia.
267
- while (current.hand.length > CHRISTIANITY_MAX_HAND_SIZE) {
268
- const discarded = current.hand.pop();
269
- if (discarded)
270
- game.historyZone.push(discarded);
271
- discardedForHandLimit = true;
272
- }
273
- }
274
- else {
275
- current.handCount = (current.handCount ?? 0) + 1;
276
- if (current.handCount > CHRISTIANITY_MAX_HAND_SIZE) {
277
- current.handCount = CHRISTIANITY_MAX_HAND_SIZE;
278
- if (drawnCard)
279
- game.historyZone.push(drawnCard);
280
- discardedForHandLimit = true;
281
- }
282
- }
283
- }
284
- else {
285
- evaluateVictory(game, log, messages);
286
- }
287
- return [
288
- drawnCard ? `${current.displayName} ${messages.drawsCard}` : messages.deckIsEmpty,
289
- ...(discardedForHandLimit ? [`${current.displayName} ${messages.handFull}`] : []),
290
- `${messages.turnOf} ${current.displayName}.`,
291
- ...log,
292
- ];
293
- }
294
- export function evaluateVictory(game, log, messages) {
295
- if (game.players.P1.leaderHp > 0 && game.players.P2.leaderHp > 0 && game.sharedDeck.length > 0)
296
- return;
297
- game.status = 'finished';
298
- const winner = game.players.P1.leaderHp <= 0
299
- ? 'P2'
300
- : game.players.P2.leaderHp <= 0
301
- ? 'P1'
302
- : game.players.P1.leaderHp >= game.players.P2.leaderHp
303
- ? 'P1'
304
- : 'P2';
305
- game.matchScore[winner] += 1;
306
- log.push(winner === 'P1' ? messages.youWin : messages.opponentWins);
307
- }
308
- export function cleanupDestroyed(player, game, lookup) {
309
- const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
310
- if (!destroyed.length)
311
- return;
312
- for (const ch of destroyed) {
313
- fireEffects(game, ch, 'on_death', ch.owner);
314
- applyPassiveCostModifiers(game.players[ch.owner], ch.instanceId, null, false);
315
- if (lookup) {
316
- const def = lookup(ch.cardId);
317
- if (def)
318
- resolveCharacterStrategyDeath(game, ch, def, ch.owner, lookup);
319
- }
320
- }
321
- game.historyZone.push(...destroyed.map(card => card.cardId));
322
- player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
323
- }
324
- export function spendOfferings(player, cost) {
325
- let remaining = cost;
326
- const temporaryReserve = player.temporaryOfferingReserve ?? 0;
327
- if (temporaryReserve > 0) {
328
- const spentTemporaryReserve = Math.min(temporaryReserve, remaining);
329
- player.temporaryOfferingReserve = temporaryReserve - spentTemporaryReserve;
330
- remaining -= spentTemporaryReserve;
331
- }
332
- player.offerings = player.offerings.map(offering => {
333
- if (remaining <= 0 || !offering.ready)
334
- return offering;
335
- remaining -= offering.value;
336
- return { ...offering, ready: false };
337
- });
338
- }
339
- function offeringAbilityReserveGain(abilityText, fallbackValue) {
340
- const match = abilityText?.match(/valor de (\d+) ofrendas?/i);
341
- const parsed = match ? Number(match[1]) : Number.NaN;
342
- return Number.isFinite(parsed) && parsed > 0 ? parsed : Math.max(1, fallbackValue);
343
- }
344
- export function opponentSeat(seat) {
345
- return seat === 'P1' ? 'P2' : 'P1';
346
- }
347
- function checkCondition(condition, ctx) {
348
- if (!condition)
349
- return true;
350
- return condition.targeting === ctx.targeting;
351
- }
352
- function applyMutationToCharacter(ch, effect) {
353
- const mut = effect.mutation;
354
- const duration = effect.duration ?? 'permanent';
355
- switch (mut.type) {
356
- case 'buff_attack':
357
- if (duration === 'combat') {
358
- ch.combatAttackBuff = (ch.combatAttackBuff ?? 0) + mut.amount;
359
- }
360
- else {
361
- ch.attack += mut.amount;
362
- }
363
- break;
364
- case 'buff_life':
365
- ch.currentHp += mut.amount;
366
- ch.maxHp += mut.amount;
367
- break;
368
- case 'deal_damage':
369
- ch.currentHp = Math.max(0, ch.currentHp - mut.amount);
370
- break;
371
- case 'restore_hp':
372
- ch.currentHp = Math.min(ch.maxHp, ch.currentHp + mut.amount);
373
- break;
374
- case 'destroy':
375
- ch.currentHp = 0;
376
- break;
377
- }
378
- }
379
- function applyEffect(game, effect, source, combatOpponent, seat) {
380
- const { mutation: mut, target } = effect;
381
- const opp = opponentSeat(seat);
382
- switch (target) {
383
- case 'self':
384
- applyMutationToCharacter(source, effect);
385
- break;
386
- case 'combat_opponent':
387
- if (combatOpponent)
388
- applyMutationToCharacter(combatOpponent, effect);
389
- break;
390
- case 'all_friendly':
391
- for (const ch of game.players[seat].battleZone)
392
- applyMutationToCharacter(ch, effect);
393
- break;
394
- case 'all_enemy':
395
- for (const ch of game.players[opp].battleZone)
396
- applyMutationToCharacter(ch, effect);
397
- break;
398
- case 'opponent_leader':
399
- case 'own_leader': {
400
- const ls = target === 'opponent_leader' ? opp : seat;
401
- if (mut.type === 'deal_damage') {
402
- game.players[ls].leaderHp = Math.max(0, game.players[ls].leaderHp - mut.amount);
403
- }
404
- else if (mut.type === 'restore_hp') {
405
- game.players[ls].leaderHp = Math.min(game.players[ls].leaderMaxHp, game.players[ls].leaderHp + mut.amount);
406
- }
407
- break;
408
- }
409
- }
410
- // game-level mutations that bypass the character switch
411
- if (mut.type === 'draw_card') {
412
- for (let i = 0; i < mut.amount; i++)
413
- drawCardFor(game, seat);
414
- }
415
- else if (mut.type === 'discard_card') {
416
- const tSeat = mut.who === 'opponent' ? opp : seat;
417
- const hand = game.players[tSeat].hand ?? [];
418
- let seed = game.revision * 31 + game.turnCount * 7;
419
- for (let i = 0; i < Math.min(mut.amount, hand.length); i++) {
420
- seed = (seed * 1664525 + 1013904223) & 0xffffffff;
421
- const idx = Math.abs(seed) % hand.length;
422
- game.historyZone.push(hand.splice(idx, 1)[0]);
423
- }
424
- game.players[tSeat].hand = hand;
425
- }
426
- else if (mut.type === 'gain_offerings') {
427
- game.players[seat].temporaryOfferingReserve =
428
- (game.players[seat].temporaryOfferingReserve ?? 0) + mut.amount;
429
- }
430
- }
431
- function fireEffects(game, source, trigger, seat, ctx = {}, combatOpponent = null) {
432
- for (const effect of source.effects ?? []) {
433
- if (effect.trigger !== trigger)
434
- continue;
435
- if (!checkCondition(effect.condition, ctx))
436
- continue;
437
- applyEffect(game, effect, source, combatOpponent, seat);
438
- }
439
- }
440
- function bakeEffects(instance, effects) {
441
- instance.effects = [...(instance.effects ?? []), ...effects];
442
- }
443
- // --- Tool equip passives (H8) ---
444
- function applyToolPassives(ch, card) {
445
- const text = card.abilities?.[0]?.text ?? '';
446
- const lower = text.toLowerCase();
447
- const atkMatch = lower.match(/\+(\d+)\s+punto(?:s)? de ataque/);
448
- if (atkMatch)
449
- ch.attack += parseInt(atkMatch[1], 10);
450
- const lifeMatch = lower.match(/\+(\d+)\s+punto(?:s)? de vida/);
451
- if (lifeMatch) {
452
- const n = parseInt(lifeMatch[1], 10);
453
- ch.currentHp += n;
454
- ch.maxHp += n;
455
- }
456
- if (lower.includes('puede atacar el turno en que entra')) {
457
- ch.canAttack = true;
458
- }
459
- bakeEffects(ch, card.effects ?? []);
460
- }
461
- // --- Deterministic helpers ---
462
- function lcgStep(seed) {
463
- return ((seed * 1664525 + 1013904223) & 0x7fffffff) >>> 0;
464
- }
465
- function gameSeed(game) {
466
- return lcgStep(game.revision * 31 + game.turnCount * 7);
467
- }
468
- function coinFlip(game) {
469
- return gameSeed(game) % 2 === 0;
470
- }
471
- function pseudoRandIndex(len, seed) {
472
- return Math.abs(seed) % len;
473
- }
474
- // --- Auto-targeting helpers ---
475
- function pickMostDangerous(zone) {
476
- if (!zone.length)
477
- return null;
478
- return zone.reduce((a, b) => (a.attack >= b.attack ? a : b));
479
- }
480
- function pickMostVulnerable(zone) {
481
- if (!zone.length)
482
- return null;
483
- return zone.reduce((a, b) => (a.currentHp <= b.currentHp ? a : b));
484
- }
485
- function pickBestFriendly(zone, excluding) {
486
- const candidates = excluding ? zone.filter(c => c.instanceId !== excluding) : zone;
487
- if (!candidates.length)
488
- return null;
489
- return candidates.reduce((a, b) => (a.attack >= b.attack ? a : b));
490
- }
491
- function bounceCharacterToDeck(game, ch, fromSeat) {
492
- game.players[fromSeat].battleZone = game.players[fromSeat].battleZone.filter(c => c.instanceId !== ch.instanceId);
493
- game.sharedDeck.unshift(ch.cardId);
494
- }
495
- function stealCharacter(game, ch, fromSeat, toSeat) {
496
- game.players[fromSeat].battleZone = game.players[fromSeat].battleZone.filter(c => c.instanceId !== ch.instanceId);
497
- const newSlots = new Set(game.players[toSeat].battleZone.map(c => c.slot ?? 0));
498
- const freeSlot = [0, 1, 2, 3].find(s => !newSlots.has(s)) ?? 3;
499
- if (game.players[toSeat].battleZone.length < CHRISTIANITY_BATTLE_SLOTS) {
500
- game.players[toSeat].battleZone.push({
501
- ...ch,
502
- controller: toSeat,
503
- slot: freeSlot,
504
- canAttack: false,
505
- });
506
- }
507
- }
508
- function searchDeckForCard(game, seat, matchFn, lookup, putInPlay = false) {
509
- if (!lookup)
510
- return false;
511
- const idx = game.sharedDeck.findIndex(id => {
512
- const def = lookup(id);
513
- return def ? matchFn(def) : false;
514
- });
515
- if (idx < 0)
516
- return false;
517
- const [cardId] = game.sharedDeck.splice(idx, 1);
518
- shuffleDeckSegment(game, 0, game.sharedDeck.length, gameSeed(game));
519
- if (putInPlay) {
520
- const def = lookup(cardId);
521
- if (def && game.players[seat].battleZone.length < CHRISTIANITY_BATTLE_SLOTS) {
522
- const occupiedSlots = new Set(game.players[seat].battleZone.map((c, i) => c.slot ?? i));
523
- const freeSlot = [0, 1, 2, 3].find(s => !occupiedSlots.has(s));
524
- if (freeSlot !== undefined) {
525
- game.players[seat].battleZone.push({
526
- instanceId: `${seat.toLowerCase()}_search_${game.revision}`,
527
- cardId,
528
- name: def.name,
529
- owner: seat,
530
- controller: seat,
531
- slot: freeSlot,
532
- attack: def.attack ?? 0,
533
- currentHp: def.life ?? 1,
534
- maxHp: def.life ?? 1,
535
- canAttack: false,
536
- });
537
- return true;
538
- }
539
- }
540
- game.players[seat].hand?.push(cardId);
541
- }
542
- else {
543
- game.players[seat].hand?.push(cardId);
544
- }
545
- return true;
546
- }
547
- function shuffleDeckSegment(game, start, end, seed) {
548
- const deck = game.sharedDeck;
549
- for (let i = end - 1; i > start; i--) {
550
- seed = lcgStep(seed);
551
- const j = start + (seed % (i - start + 1));
552
- [deck[i], deck[j]] = [deck[j], deck[i]];
553
- }
554
- }
555
- // --- Passive cost modifier system ---
556
- function parsePassiveCostModifiers(card) {
557
- if (card.strategy !== 'accelerate' && card.strategy !== 'slowdown')
558
- return null;
559
- const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
560
- const results = [];
561
- const typeMap = [
562
- ['sabidurí', 'wisdom'],
563
- ['sabiduria', 'wisdom'],
564
- ['evento', 'event'],
565
- ['acción', 'action'],
566
- ['accion', 'action'],
567
- ['herramienta', 'tool'],
568
- ['personaje', 'character'],
569
- ['ofrenda', 'offering'],
570
- ['lugar', 'place'],
571
- ];
572
- for (const [keyword, type] of typeMap) {
573
- if (!text.includes(keyword))
574
- continue;
575
- // lock patterns
576
- if (text.includes('no se pueden jugar')) {
577
- results.push({ cardType: type, delta: 99 });
578
- break;
579
- }
580
- const n = parseSpanishNumber(text) || 1;
581
- if (card.strategy === 'accelerate') {
582
- results.push({ cardType: type, delta: -n });
583
- }
584
- else {
585
- results.push({ cardType: type, delta: n });
586
- }
587
- break;
588
- }
589
- return results.length ? results : null;
590
- }
591
- export function applyPassiveCostModifiers(player, sourceId, card, add) {
592
- if (!add) {
593
- player.costModifiers = (player.costModifiers ?? []).filter(m => m.sourceId !== sourceId);
594
- return;
595
- }
596
- if (!card)
597
- return;
598
- const mods = parsePassiveCostModifiers(card);
599
- if (!mods)
600
- return;
601
- player.costModifiers = [
602
- ...(player.costModifiers ?? []).filter(m => m.sourceId !== sourceId),
603
- ...mods.map(m => ({ ...m, sourceId })),
604
- ];
605
- }
606
- // --- Structured effect synthesis for characters ---
607
- function synthesizeStructuredEffects(card) {
608
- const effects = [];
609
- if (!card.strategy)
610
- return effects;
611
- const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
612
- if (card.strategy === 'buff') {
613
- // on_attack buff to self (combat duration)
614
- if (text.includes('al atacar') && text.includes('ataque')) {
615
- const n = parseSpanishNumber(text) || 1;
616
- effects.push({
617
- trigger: 'on_attack',
618
- strategy: 'buff',
619
- target: 'self',
620
- mutation: { type: 'buff_attack', amount: n },
621
- duration: text.includes('final del turno') ? 'combat' : 'permanent',
622
- });
623
- }
624
- // passive buff to all_friendly
625
- if ((text.includes('mientras') || text.includes('todos los personajes en juego junto')) &&
626
- text.includes('+') &&
627
- text.includes('ataque')) {
628
- const n = parseSpanishNumber(text) || 1;
629
- effects.push({
630
- trigger: 'passive',
631
- strategy: 'buff',
632
- target: 'all_friendly',
633
- mutation: { type: 'buff_attack', amount: n },
634
- duration: 'permanent',
635
- });
636
- }
637
- }
638
- if (card.strategy === 'destroy') {
639
- // on_death damage to all_enemy
640
- if (text.includes('al ser destruido') && text.includes('daño') && text.includes('oponente')) {
641
- const n = parseSpanishNumber(text) || 1;
642
- effects.push({
643
- trigger: 'on_death',
644
- strategy: 'destroy',
645
- target: 'all_enemy',
646
- mutation: { type: 'deal_damage', amount: n },
647
- duration: 'permanent',
648
- });
649
- }
650
- // on_death damage to opponent leader
651
- if (text.includes('al ser destruido') && text.includes('daño') && text.includes('líder')) {
652
- const n = parseSpanishNumber(text) || 1;
653
- effects.push({
654
- trigger: 'on_death',
655
- strategy: 'destroy',
656
- target: 'opponent_leader',
657
- mutation: { type: 'deal_damage', amount: n },
658
- duration: 'permanent',
659
- });
660
- }
661
- }
662
- return effects;
663
- }
664
- // --- Character strategy: on_enter & on_death ---
665
- function resolveCharacterStrategyEnter(game, ch, card, seat, lookup) {
666
- if (!card.strategy)
667
- return;
668
- const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
669
- const opp = opponentSeat(seat);
670
- const seed = gameSeed(game);
671
- switch (card.strategy) {
672
- case 'buff': {
673
- if (!text.includes('al entrar en juego'))
674
- return;
675
- const n = parseSpanishNumber(text) || 1;
676
- const isLife = text.includes('vida');
677
- const isAtk = text.includes('ataque');
678
- if (!isLife && !isAtk)
679
- return;
680
- if (text.includes('uno de tus personajes') || text.includes('1 de tus personajes')) {
681
- const target = pickBestFriendly(game.players[seat].battleZone, ch.instanceId);
682
- if (!target)
683
- return;
684
- if (isAtk)
685
- target.attack += n;
686
- if (isLife) {
687
- target.currentHp += n;
688
- target.maxHp += n;
689
- }
690
- }
691
- else if (text.includes('todos tus personajes') ||
692
- text.includes('tus personajes en juego')) {
693
- for (const c of game.players[seat].battleZone) {
694
- if (c.instanceId === ch.instanceId)
695
- continue;
696
- if (isAtk)
697
- c.attack += n;
698
- if (isLife) {
699
- c.currentHp += n;
700
- c.maxHp += n;
701
- }
702
- }
703
- }
704
- break;
705
- }
706
- case 'destroy': {
707
- if (!text.includes('al entrar en juego') && !text.includes('cuando entra en juego'))
708
- return;
709
- // "destruye todos los personajes en juego"
710
- if (text.includes('destruye todos los personajes en juego') ||
711
- text.includes('baraja a todos personajes en juego')) {
712
- for (const s of ['P1', 'P2']) {
713
- game.players[s].battleZone.forEach(c => {
714
- if (c.instanceId !== ch.instanceId)
715
- c.currentHp = 0;
716
- });
717
- }
718
- // "Destruye 4 de tus cartas de ofrenda"
719
- const nOff = parseSpanishNumber(text.split('destruye').slice(-1)[0] ?? '');
720
- if (nOff > 0) {
721
- game.players[seat].offerings = game.players[seat].offerings.slice(nOff);
722
- }
723
- return;
724
- }
725
- // "baraja 1 personaje oponente" (bounce)
726
- if (text.includes('baraja') && (text.includes('oponente') || text.includes('rival'))) {
727
- const n = parseSpanishNumber(text) || 1;
728
- const targets = [...game.players[opp].battleZone].sort((a, b) => (b.attack ?? 0) - (a.attack ?? 0));
729
- for (let i = 0; i < Math.min(n, targets.length); i++) {
730
- bounceCharacterToDeck(game, targets[i], opp);
731
- }
732
- return;
733
- }
734
- // "baraja 1 de tus personajes en juego" (self bounce)
735
- if (text.includes('baraja') &&
736
- (text.includes('tus personajes') || text.includes('uno de tus'))) {
737
- const selfTargets = game.players[seat].battleZone.filter(c => c.instanceId !== ch.instanceId);
738
- if (selfTargets.length) {
739
- bounceCharacterToDeck(game, selfTargets[pseudoRandIndex(selfTargets.length, seed)], seat);
740
- }
741
- return;
742
- }
743
- // "destruye 1 personaje oponente"
744
- if (text.includes('destruye') && text.includes('oponente')) {
745
- const n = parseSpanishNumber(text) || 1;
746
- // Conditional: "que tenga menos puntos de ataque que esta carta"
747
- const targets = game.players[opp].battleZone.filter(c => {
748
- if (text.includes('menos puntos de ataque que esta'))
749
- return c.attack < ch.attack;
750
- return true;
751
- });
752
- for (let i = 0; i < Math.min(n, targets.length); i++) {
753
- const target = text.includes('elige') || n === 1
754
- ? (pickMostDangerous(targets) ?? targets[0])
755
- : targets[i];
756
- if (target)
757
- target.currentHp = 0;
758
- }
759
- return;
760
- }
761
- // "inflige N puntos de daño a 1/2 personaje(s) oponente(s)"
762
- if (text.includes('inflige') && text.includes('daño')) {
763
- const dmg = parseSpanishNumber(text) || 1;
764
- // How many targets?
765
- const countMatch = text.match(/a\s+(\d+|un|dos|tres)\s+personaje/i);
766
- const nTargets = countMatch ? parseSpanishNumber(countMatch[1]) || 1 : 1;
767
- const sorted = [...game.players[opp].battleZone].sort((a, b) => a.currentHp - b.currentHp);
768
- // Coin-flip conditional
769
- if (text.includes('lanza') && text.includes('moneda')) {
770
- if (!coinFlip(game)) {
771
- // "si sale cruz" — usually nothing or own character bounced
772
- if (text.includes('si sale cruz') && text.includes('tus personajes')) {
773
- const selfT = game.players[seat].battleZone.filter(c => c.instanceId !== ch.instanceId);
774
- if (selfT.length)
775
- selfT[pseudoRandIndex(selfT.length, seed)].currentHp = 0;
776
- }
777
- return;
778
- }
779
- }
780
- for (let i = 0; i < Math.min(nTargets, sorted.length); i++) {
781
- sorted[i].currentHp = Math.max(0, sorted[i].currentHp - dmg);
782
- }
783
- return;
784
- }
785
- break;
786
- }
787
- case 'search': {
788
- if (!text.includes('al entrar en juego') &&
789
- !text.includes('cuando entra en juego') &&
790
- !text.includes('busca'))
791
- return;
792
- if (!text.includes('busca'))
793
- return;
794
- const typeMap = [
795
- ['personaje', 'character'],
796
- ['herramienta', 'tool'],
797
- ['sabiduría', 'wisdom'],
798
- ['sabiduria', 'wisdom'],
799
- ['evento', 'event'],
800
- ['acción', 'action'],
801
- ['accion', 'action'],
802
- ['ofrenda', 'offering'],
803
- ['lugar', 'place'],
804
- ];
805
- for (const [keyword, type] of typeMap) {
806
- if (!text.includes(keyword))
807
- continue;
808
- const power = text.includes('poder destacado')
809
- ? 'featured'
810
- : text.includes('poder normal')
811
- ? 'normal'
812
- : undefined;
813
- const putInPlay = text.includes('ponla en juego') || text.includes('juégala') || text.includes('juegala');
814
- searchDeckForCard(game, seat, def => def.type === type && (!power || def.power === power), lookup, putInPlay);
815
- break;
816
- }
817
- break;
818
- }
819
- case 'deckpeek': {
820
- if (!text.includes('al entrar en juego') && !text.includes('cuando entra en juego'))
821
- return;
822
- const n = parseSpanishNumber(text) || 3;
823
- deckpeekReorder(game, seat, n, lookup);
824
- break;
825
- }
826
- case 'mindcontrol': {
827
- if (!text.includes('al entrar en juego') && !text.includes('cuando entra en juego'))
828
- return;
829
- // "puedes elegir un personaje oponente ... con menos puntos de ataque que este"
830
- if (text.includes('menos puntos de ataque que este') ||
831
- text.includes('menos puntos de ataque que esta')) {
832
- const target = game.players[opp].battleZone.find(c => c.attack < ch.attack);
833
- if (target)
834
- stealCharacter(game, target, opp, seat);
835
- return;
836
- }
837
- // "puedes elegir un personaje oponente" generic steal
838
- if (text.includes('personaje oponente') &&
839
- (text.includes('pon') || text.includes('coloca'))) {
840
- const target = pickMostVulnerable(game.players[opp].battleZone);
841
- if (target)
842
- stealCharacter(game, target, opp, seat);
843
- }
844
- break;
845
- }
846
- case 'reveal': {
847
- if (text.includes('lanza') && text.includes('moneda')) {
848
- if (coinFlip(game))
849
- game.players[opp].handRevealed = true;
850
- }
851
- else if (text.includes('oponente') && text.includes('mano')) {
852
- game.players[opp].handRevealed = true;
853
- }
854
- else if (text.includes('jugadores') && text.includes('mano')) {
855
- game.players.P1.handRevealed = true;
856
- game.players.P2.handRevealed = true;
857
- }
858
- break;
859
- }
860
- case 'accelerate': {
861
- // Passive: canAttack on enter
862
- if (text.includes('puede atacar cuando entra') || text.includes('puede atacar el turno')) {
863
- ch.canAttack = true;
864
- }
865
- break;
866
- }
867
- default:
868
- break;
869
- }
870
- }
871
- function resolveCharacterStrategyDeath(game, ch, card, seat, _lookup) {
872
- if (!card.strategy)
873
- return;
874
- const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
875
- const opp = opponentSeat(seat);
876
- if (card.strategy === 'destroy' && text.includes('al ser destruido')) {
877
- // "baraja a todos personajes en juego" on death
878
- if (text.includes('baraja a todos personajes')) {
879
- for (const s of ['P1', 'P2']) {
880
- game.players[s].battleZone.forEach(c => (c.currentHp = 0));
881
- }
882
- return;
883
- }
884
- // "baraja N de tus personajes" on death
885
- if (text.includes('baraja') && text.includes('tus personajes')) {
886
- const n = parseSpanishNumber(text) || 1;
887
- const selfT = [...game.players[seat].battleZone].slice(0, n);
888
- for (const c of selfT)
889
- bounceCharacterToDeck(game, c, seat);
890
- }
891
- }
892
- if (card.strategy === 'mindcontrol' && text.includes('al ser destruido')) {
893
- // "pon al personaje que destruya esta carta en tu zona"
894
- // Can't reliably identify attacker at this point, skip
895
- }
896
- }
897
- // --- Deckpeek / reorder ---
898
- function deckpeekReorder(game, seat, n, lookup) {
899
- const top = game.sharedDeck.slice(0, n);
900
- if (!top.length)
901
- return;
902
- // Pull cards matching type to hand (for deckpeek+draw combos)
903
- // For simplicity: sort top N by descending cost, keeping highest-value cards on top
904
- if (lookup) {
905
- top.sort((a, b) => {
906
- const da = lookup(a);
907
- const db = lookup(b);
908
- return (db?.cost ?? 0) - (da?.cost ?? 0);
909
- });
910
- }
911
- game.sharedDeck.splice(0, n, ...top);
912
- // Check if the ability lets us draw a found card
913
- const def = lookup?.(game.players[seat].battleZone.at(-1)?.cardId ?? '');
914
- const text = (def?.abilities?.[0]?.text ?? '').toLowerCase();
915
- if (text.includes('poner') && text.includes('mano') && top.length) {
916
- const drawn = game.sharedDeck.shift();
917
- if (drawn)
918
- game.players[seat].hand?.push(drawn);
919
- }
920
- }
921
- // --- Inline cleanup after card effects ---
922
- function inlineCleanup(game, lookup) {
923
- for (const s of ['P1', 'P2']) {
924
- const destroyed = game.players[s].battleZone.filter(c => c.currentHp <= 0);
925
- for (const ch of destroyed) {
926
- fireEffects(game, ch, 'on_death', ch.owner);
927
- applyPassiveCostModifiers(game.players[ch.owner], ch.instanceId, null, false);
928
- if (lookup) {
929
- const def = lookup(ch.cardId);
930
- if (def)
931
- resolveCharacterStrategyDeath(game, ch, def, ch.owner, lookup);
932
- }
933
- }
934
- game.historyZone.push(...destroyed.map(c => c.cardId));
935
- game.players[s].battleZone = game.players[s].battleZone.filter(c => c.currentHp > 0);
936
- }
937
- }
938
- // --- Effect resolution (H7) ---
939
- function resolveCardEffect(game, card, seat, lookup) {
940
- const text = card.abilities?.[0]?.text ?? '';
941
- switch (card.strategy) {
942
- case 'directdamage':
943
- effectDirectDamage(game, card, text, seat);
944
- break;
945
- case 'restore':
946
- effectRestore(game, card, text, seat);
947
- break;
948
- case 'draw':
949
- effectDraw(game, card, text, seat);
950
- break;
951
- case 'discard':
952
- effectDiscard(game, card, text, seat);
953
- break;
954
- case 'buff':
955
- effectBuff(game, card, text, seat);
956
- break;
957
- case 'destroy':
958
- effectDestroyCard(game, card, text, seat);
959
- break;
960
- case 'search':
961
- effectSearch(game, card, text, seat, lookup);
962
- break;
963
- case 'deckpeek':
964
- effectDeckpeek(game, card, text, seat, lookup);
965
- break;
966
- case 'mindcontrol':
967
- effectMindcontrol(game, card, text, seat);
968
- break;
969
- case 'reveal':
970
- effectReveal(game, card, text, seat);
971
- break;
972
- case 'accelerate':
973
- effectAccelerate(game, card, text, seat);
974
- break;
975
- case 'slowdown':
976
- effectSlowdown(game, card, text, seat);
977
- break;
978
- }
979
- }
980
- function effectDirectDamage(game, card, text, seat) {
981
- const opponent = opponentSeat(seat);
982
- const lower = text.toLowerCase();
983
- let dmg;
984
- if (lower.includes('tantos')) {
985
- dmg = game.players[seat].battleZone.length;
986
- }
987
- else {
988
- dmg = parseSpanishNumber(text);
989
- }
990
- if (dmg <= 0)
991
- return;
992
- game.players[opponent].leaderHp = Math.max(0, game.players[opponent].leaderHp - dmg);
993
- }
994
- function effectRestore(game, card, text, seat) {
995
- const lower = text.toLowerCase();
996
- const n = Math.max(1, parseSpanishNumber(text) || 1);
997
- if (lower.includes('los líderes') || lower.includes('los lideres')) {
998
- for (const s of ['P1', 'P2']) {
999
- const p = game.players[s];
1000
- p.leaderHp = Math.min(p.leaderMaxHp, p.leaderHp + n);
1001
- }
1002
- return;
1003
- }
1004
- if (lower.includes('tus personajes') || lower.includes('personajes en juego')) {
1005
- for (const ch of game.players[seat].battleZone) {
1006
- ch.currentHp = Math.min(ch.maxHp, ch.currentHp + n);
1007
- }
1008
- return;
1009
- }
1010
- if (lower.includes('del líder') ||
1011
- lower.includes('al líder') ||
1012
- lower.includes('del lider') ||
1013
- lower.includes('al lider')) {
1014
- const p = game.players[seat];
1015
- p.leaderHp = Math.min(p.leaderMaxHp, p.leaderHp + n);
1016
- }
1017
- }
1018
- function effectDraw(game, card, text, seat) {
1019
- const lower = text.toLowerCase();
1020
- if (lower.includes('los jugadores')) {
1021
- const n = Math.max(1, parseSpanishNumber(text) || 1);
1022
- for (let i = 0; i < n; i++) {
1023
- drawCardFor(game, 'P1');
1024
- drawCardFor(game, 'P2');
1025
- }
1026
- return;
1027
- }
1028
- if (lower.includes('por cada personaje oponente')) {
1029
- const n = game.players[opponentSeat(seat)].battleZone.length;
1030
- for (let i = 0; i < n; i++)
1031
- drawCardFor(game, seat);
1032
- return;
1033
- }
1034
- const n = Math.max(1, parseSpanishNumber(text) || 1);
1035
- for (let i = 0; i < n; i++)
1036
- drawCardFor(game, seat);
1037
- }
1038
- function effectDiscard(game, card, text, seat) {
1039
- const lower = text.toLowerCase();
1040
- const opponent = opponentSeat(seat);
1041
- if (lower.includes('ambos jugadores descartan su mano') ||
1042
- lower.includes('los jugadores descartan su mano')) {
1043
- for (const s of ['P1', 'P2']) {
1044
- const p = game.players[s];
1045
- game.historyZone.push(...(p.hand ?? []));
1046
- p.hand = [];
1047
- }
1048
- return;
1049
- }
1050
- if ((lower.includes('oponente') && lower.includes('azar')) ||
1051
- lower.includes('tu oponente descarta')) {
1052
- const n = Math.max(1, parseSpanishNumber(text) || 1);
1053
- const op = game.players[opponent];
1054
- const hand = op.hand ?? [];
1055
- let seed = game.revision * 31 + game.turnCount * 7;
1056
- for (let i = 0; i < n && hand.length > 0; i++) {
1057
- seed = (seed * 1664525 + 1013904223) & 0xffffffff;
1058
- const idx = Math.abs(seed) % hand.length;
1059
- game.historyZone.push(hand[idx]);
1060
- hand.splice(idx, 1);
1061
- }
1062
- op.hand = hand;
1063
- }
1064
- }
1065
- function effectBuff(game, card, text, seat) {
1066
- const lower = text.toLowerCase();
1067
- const n = parseSpanishNumber(text) || 1;
1068
- const isAtk = lower.includes('ataque');
1069
- const isLife = lower.includes('vida');
1070
- const isTurn = lower.includes('final del turno');
1071
- const applyBuff = (ch) => {
1072
- if (isAtk) {
1073
- if (isTurn)
1074
- ch.combatAttackBuff = (ch.combatAttackBuff ?? 0) + n;
1075
- else
1076
- ch.attack += n;
1077
- }
1078
- if (isLife) {
1079
- ch.currentHp += n;
1080
- ch.maxHp += n;
1081
- }
1082
- };
1083
- if (lower.includes('tus personajes') || lower.includes('los personajes en juego junto')) {
1084
- game.players[seat].battleZone.forEach(applyBuff);
1085
- return;
1086
- }
1087
- if (lower.includes('un personaje en juego') ||
1088
- lower.includes('uno de tus personajes') ||
1089
- lower.includes('1 personaje')) {
1090
- const target = lower.includes('oponente')
1091
- ? pickMostVulnerable(game.players[opponentSeat(seat)].battleZone)
1092
- : pickBestFriendly(game.players[seat].battleZone);
1093
- if (target)
1094
- applyBuff(target);
1095
- return;
1096
- }
1097
- // Fallback: buff all own
1098
- game.players[seat].battleZone.forEach(applyBuff);
1099
- }
1100
- function effectDestroyCard(game, card, text, seat) {
1101
- const lower = text.toLowerCase();
1102
- const opp = opponentSeat(seat);
1103
- // "Baraja a todos personajes en juego" / "destruye todos"
1104
- if (lower.includes('todos los personajes en juego') ||
1105
- (lower.includes('todos') && lower.includes('personajes'))) {
1106
- for (const s of ['P1', 'P2']) {
1107
- game.players[s].battleZone.forEach(c => (c.currentHp = 0));
1108
- }
1109
- return;
1110
- }
1111
- // "Los jugadores eligen uno de sus personajes" - everyone keeps one
1112
- if (lower.includes('los jugadores eligen uno')) {
1113
- for (const s of ['P1', 'P2']) {
1114
- const zone = game.players[s].battleZone;
1115
- if (zone.length <= 1)
1116
- continue;
1117
- const keeper = pickBestFriendly(zone);
1118
- zone.forEach(c => {
1119
- if (c.instanceId !== keeper?.instanceId)
1120
- c.currentHp = 0;
1121
- });
1122
- }
1123
- return;
1124
- }
1125
- // "Los jugadores emparejan de izquierda a derecha los personajes en juego. Se atacan entre sí."
1126
- if (lower.includes('emparejan') ||
1127
- lower.includes('atacan entre sí') ||
1128
- lower.includes('atacan entre si')) {
1129
- const p1 = game.players.P1.battleZone;
1130
- const p2 = game.players.P2.battleZone;
1131
- const pairs = Math.min(p1.length, p2.length);
1132
- for (let i = 0; i < pairs; i++) {
1133
- const a = p1[i];
1134
- const b = p2[i];
1135
- const aAtk = a.attack;
1136
- a.currentHp = Math.max(0, a.currentHp - b.attack);
1137
- b.currentHp = Math.max(0, b.currentHp - aAtk);
1138
- }
1139
- return;
1140
- }
1141
- // "Inflige N puntos de daño a un personaje oponente en juego"
1142
- if (lower.includes('inflige') && lower.includes('daño') && lower.includes('oponente')) {
1143
- const dmg = parseSpanishNumber(text) || 1;
1144
- const target = pickMostVulnerable(game.players[opp].battleZone);
1145
- if (target)
1146
- target.currentHp = Math.max(0, target.currentHp - dmg);
1147
- return;
1148
- }
1149
- // "Baraja un personaje oponente en juego" (bounce)
1150
- if (lower.includes('baraja') && lower.includes('oponente')) {
1151
- const target = pickMostDangerous(game.players[opp].battleZone);
1152
- if (target)
1153
- bounceCharacterToDeck(game, target, opp);
1154
- return;
1155
- }
1156
- // "Destruye un personaje oponente en juego"
1157
- if (lower.includes('destruye') && lower.includes('oponente')) {
1158
- const target = pickMostDangerous(game.players[opp].battleZone);
1159
- if (target)
1160
- target.currentHp = 0;
1161
- return;
1162
- }
1163
- // "Lanza 1 moneda. Si sale cara, destruye 1 personaje de tu oponente"
1164
- if (lower.includes('lanza') && lower.includes('moneda')) {
1165
- if (coinFlip(game)) {
1166
- const target = pickMostDangerous(game.players[opp].battleZone);
1167
- if (target)
1168
- target.currentHp = 0;
1169
- }
1170
- else if (lower.includes('si sale cruz') && lower.includes('tu oponente')) {
1171
- // opponent bounces/destroys one of their own
1172
- }
1173
- return;
1174
- }
1175
- // "Inflige 1 punto de daño a todos los personajes en juego" (e.g. plague events)
1176
- if (lower.includes('inflige') && lower.includes('todos los personajes')) {
1177
- const dmg = parseSpanishNumber(text) || 1;
1178
- for (const s of ['P1', 'P2']) {
1179
- game.players[s].battleZone.forEach(c => {
1180
- c.currentHp = Math.max(0, c.currentHp - dmg);
1181
- });
1182
- }
1183
- return;
1184
- }
1185
- // "Destruye N de tus cartas de ofrenda"
1186
- if (lower.includes('tus cartas de ofrenda') && lower.includes('destruye')) {
1187
- const n = parseSpanishNumber(text) || 1;
1188
- game.players[seat].offerings = game.players[seat].offerings.slice(n);
1189
- }
1190
- }
1191
- function effectSearch(game, card, text, seat, lookup) {
1192
- const lower = text.toLowerCase();
1193
- const typeMap = [
1194
- ['personaje', 'character'],
1195
- ['herramienta', 'tool'],
1196
- ['sabiduría', 'wisdom'],
1197
- ['sabiduria', 'wisdom'],
1198
- ['evento', 'event'],
1199
- ['acción', 'action'],
1200
- ['accion', 'action'],
1201
- ['ofrenda', 'offering'],
1202
- ['lugar', 'place'],
1203
- ];
1204
- const power = lower.includes('poder destacado')
1205
- ? 'featured'
1206
- : lower.includes('poder normal')
1207
- ? 'normal'
1208
- : undefined;
1209
- const n = lower.includes('dos cartas') || lower.includes('2 cartas') ? 2 : 1;
1210
- const putInPlay = lower.includes('ponla en juego') ||
1211
- lower.includes('juégala') ||
1212
- lower.includes('juegala') ||
1213
- lower.includes('sin costo');
1214
- // Discard cost
1215
- if (lower.includes('descarta dos cartas') || lower.includes('descartas dos cartas')) {
1216
- const hand = game.players[seat].hand ?? [];
1217
- const seed = gameSeed(game);
1218
- for (let i = 0; i < Math.min(2, hand.length); i++) {
1219
- const idx = pseudoRandIndex(hand.length - i, seed + i);
1220
- game.historyZone.push(hand.splice(idx, 1)[0]);
1221
- }
1222
- }
1223
- for (const [keyword, type] of typeMap) {
1224
- if (!lower.includes(keyword))
1225
- continue;
1226
- for (let i = 0; i < n; i++) {
1227
- searchDeckForCard(game, seat, def => def.type === type && (!power || def.power === power), lookup, putInPlay);
1228
- }
1229
- break;
1230
- }
1231
- }
1232
- function effectDeckpeek(game, card, text, seat, lookup) {
1233
- const n = parseSpanishNumber(text) || 3;
1234
- const lower = text.toLowerCase();
1235
- const top = game.sharedDeck.slice(0, n);
1236
- if (!top.length)
1237
- return;
1238
- // "poner en juego todas las cartas de ofrenda de poder normal" from top N
1239
- if (lower.includes('poner en juego') && lower.includes('ofrenda') && lookup) {
1240
- for (const id of top) {
1241
- const def = lookup(id);
1242
- if (def?.type === 'offering') {
1243
- game.players[seat].offerings.push({
1244
- instanceId: `${seat.toLowerCase()}_dp_${game.revision}_${id}`,
1245
- cardId: id,
1246
- name: def.name,
1247
- owner: seat,
1248
- ready: true,
1249
- value: def.offeringValue ?? 1,
1250
- });
1251
- game.sharedDeck.splice(game.sharedDeck.indexOf(id), 1);
1252
- }
1253
- }
1254
- return;
1255
- }
1256
- // "mostrar una carta de X que encuentres y ponerla en tu mano"
1257
- if (lower.includes('mostrar') && lower.includes('mano') && lookup) {
1258
- const typeMap = [
1259
- ['herramienta', 'tool'],
1260
- ['ofrenda', 'offering'],
1261
- ['sabiduría', 'wisdom'],
1262
- ['sabiduria', 'wisdom'],
1263
- ['personaje', 'character'],
1264
- ];
1265
- for (const [keyword, type] of typeMap) {
1266
- if (!lower.includes(keyword))
1267
- continue;
1268
- const found = top.find(id => lookup(id)?.type === type);
1269
- if (found) {
1270
- game.sharedDeck.splice(game.sharedDeck.indexOf(found), 1);
1271
- game.players[seat].hand?.push(found);
1272
- }
1273
- break;
1274
- }
1275
- }
1276
- // "poner en tu mano" first card
1277
- if (lower.includes('poner') && lower.includes('mano') && !lower.includes('mostrar')) {
1278
- const drawn = game.sharedDeck.shift();
1279
- if (drawn)
1280
- game.players[seat].hand?.push(drawn);
1281
- return;
1282
- }
1283
- // Reorder remaining top cards optimally (highest cost first)
1284
- const remaining = game.sharedDeck.slice(0, n);
1285
- if (lookup) {
1286
- remaining.sort((a, b) => (lookup(b)?.cost ?? 0) - (lookup(a)?.cost ?? 0));
1287
- game.sharedDeck.splice(0, n, ...remaining);
1288
- }
1289
- }
1290
- function effectMindcontrol(game, card, text, seat) {
1291
- const lower = text.toLowerCase();
1292
- const opp = opponentSeat(seat);
1293
- // "Los jugadores intercambian sus personajes en juego"
1294
- if (lower.includes('intercambian sus personajes')) {
1295
- const p1zone = [...game.players.P1.battleZone];
1296
- const p2zone = [...game.players.P2.battleZone];
1297
- game.players.P1.battleZone = p2zone.map(c => ({ ...c, controller: 'P1' }));
1298
- game.players.P2.battleZone = p1zone.map(c => ({ ...c, controller: 'P2' }));
1299
- return;
1300
- }
1301
- // "Los jugadores intercambian su mano"
1302
- if (lower.includes('intercambian su mano')) {
1303
- const h1 = game.players.P1.hand ?? [];
1304
- const h2 = game.players.P2.hand ?? [];
1305
- game.players.P1.hand = h2;
1306
- game.players.P2.hand = h1;
1307
- return;
1308
- }
1309
- // Generic "pon un personaje oponente" steal
1310
- if (lower.includes('personaje oponente') && lower.includes('pon')) {
1311
- const target = pickMostVulnerable(game.players[opp].battleZone);
1312
- if (target)
1313
- stealCharacter(game, target, opp, seat);
1314
- }
1315
- }
1316
- function effectReveal(game, card, text, seat) {
1317
- const lower = text.toLowerCase();
1318
- const opp = opponentSeat(seat);
1319
- if (lower.includes('tu oponente muestra su mano') || lower.includes('oponente muestra su mano')) {
1320
- game.players[opp].handRevealed = true;
1321
- }
1322
- else if (lower.includes('jugadores juegan con su mano')) {
1323
- game.players.P1.handRevealed = true;
1324
- game.players.P2.handRevealed = true;
1325
- }
1326
- }
1327
- function effectAccelerate(game, card, text, seat) {
1328
- // Action/event-level accelerate: give temporary offerings
1329
- const lower = text.toLowerCase();
1330
- const n = parseSpanishNumber(text) || 1;
1331
- if (lower.includes('genera') && lower.includes('ofrenda')) {
1332
- game.players[seat].temporaryOfferingReserve =
1333
- (game.players[seat].temporaryOfferingReserve ?? 0) + n;
1334
- }
1335
- }
1336
- function effectSlowdown(game, card, text, seat) {
1337
- // Action-level slowdown: return a character to hand
1338
- const lower = text.toLowerCase();
1339
- const opp = opponentSeat(seat);
1340
- if (lower.includes('devuelve') && lower.includes('personaje') && lower.includes('mano')) {
1341
- const target = pickMostDangerous(game.players[opp].battleZone);
1342
- if (target) {
1343
- game.players[opp].battleZone = game.players[opp].battleZone.filter(c => c.instanceId !== target.instanceId);
1344
- game.players[opp].hand?.push(target.cardId);
1345
- }
1346
- }
1347
- }
1348
- function drawCardFor(game, seat) {
1349
- const card = game.sharedDeck.shift();
1350
- if (!card)
1351
- return;
1352
- const p = game.players[seat];
1353
- if (p.hand)
1354
- p.hand.push(card);
1355
- else
1356
- p.handCount = (p.handCount ?? 0) + 1;
1357
- }
1358
- function parseSpanishNumber(text) {
1359
- const words = {
1360
- un: 1,
1361
- una: 1,
1362
- uno: 1,
1363
- dos: 2,
1364
- tres: 3,
1365
- cuatro: 4,
1366
- cinco: 5,
1367
- seis: 6,
1368
- siete: 7,
1369
- ocho: 8,
1370
- nueve: 9,
1371
- diez: 10,
1372
- };
1373
- const digitMatch = text.match(/\b(\d+)\b/);
1374
- if (digitMatch)
1375
- return parseInt(digitMatch[1], 10);
1376
- const lower = text.toLowerCase();
1377
- for (const [word, n] of Object.entries(words)) {
1378
- if (new RegExp(`\\b${word}\\b`).test(lower))
1379
- return n;
1380
- }
1381
- return 0;
1382
- }
1383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LXJ1bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NocmlzdGlhbml0eS1ydWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFM0Msd0dBQXdHO0FBQ3hHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQXVDNUMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUErQjtJQUM1RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUM1QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNsRSxNQUFNLENBQUMsd0JBQXdCLElBQUksQ0FBQyxDQUNyQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBK0I7SUFDNUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUErQixFQUMvQixJQUFnQztJQUVoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM1QixJQUFJLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDekIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztTQUN2QyxNQUFNLENB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QztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBWTtJQUN0QyxNQUFNLEtBQUssR0FBMkI7UUFDcEMsRUFBRSxFQUFFLENBQUM7UUFDTCxHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLENBQUM7UUFDTixJQUFJLEVBQUUsQ0FBQztRQUNQLE1BQU0sRUFBRSxDQUFDO1FBQ1QsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLEVBQUUsQ0FBQztRQUNQLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxFQUFFLENBQUM7UUFDUCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksRUFBRSxFQUFFO0tBQ1QsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsSUFBSSxVQUFVO1FBQUUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIENocmlzdGlhbml0eUNhcmRFZmZlY3QsXG4gIENocmlzdGlhbml0eUNhcmRUeXBlLFxuICBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgQ2hyaXN0aWFuaXR5RWZmZWN0VHJpZ2dlcixcbiAgQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgQ2hyaXN0aWFuaXR5U2VhdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBDSFJJU1RJQU5JVFlfQkFUVExFX1NMT1RTID0gNDtcblxuLy8gTcOheGltbyBkZSBjYXJ0YXMgZW4gbWFubzogYWwgcm9iYXIgcG9yIGVuY2ltYSBkZSBlc3RlIGzDrW1pdGUsIGxhIGNhcnRhIHJvYmFkYSBzZSBkZXNjYXJ0YSBhIEhpc3RvcmlhLlxuZXhwb3J0IGNvbnN0IENIUklTVElBTklUWV9NQVhfSEFORF9TSVpFID0gNztcblxuZXhwb3J0IGludGVyZmFjZSBDaHJpc3RpYW5pdHlSdWxlTWVzc2FnZXMge1xuICBhdHRhY2tzT3Bwb25lbnRMZWFkZXI6IHN0cmluZztcbiAgYXR0YWNrc1lvdXJMZWFkZXI6IHN0cmluZztcbiAgY29tYmF0c0FnYWluc3Q6IHN0cmluZztcbiAgZHJhd3NDYXJkOiBzdHJpbmc7XG4gIGRlY2tJc0VtcHR5OiBzdHJpbmc7XG4gIHR1cm5PZjogc3RyaW5nO1xuICB5b3VXaW46IHN0cmluZztcbiAgb3Bwb25lbnRXaW5zOiBzdHJpbmc7XG4gIGhhbmRGdWxsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hyaXN0aWFuaXR5UGxheUNhcmRSZXN1bHQge1xuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGU7XG4gIHBsYXllZDogYm9vbGVhbjtcbiAgcGxheWVkT2ZmZXJpbmdWYWx1ZTogbnVtYmVyO1xuICBzcGVudE9mZmVyaW5nczogbnVtYmVyO1xuICBsb2c6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENocmlzdGlhbml0eUF0dGFja1Jlc3VsdCB7XG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZTtcbiAgYXR0YWNrZWQ6IGJvb2xlYW47XG4gIGF0dGFja2VyRGFtYWdlOiBudW1iZXI7XG4gIHRhcmdldERhbWFnZTogbnVtYmVyO1xuICBsb2c6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENocmlzdGlhbml0eU9mZmVyaW5nQWJpbGl0eVJlc3VsdCB7XG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZTtcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIGxlYWRlckRhbWFnZTogbnVtYmVyO1xuICByZXNlcnZlR2FpbjogbnVtYmVyO1xuICBzcGVudE9mZmVyaW5nczogbnVtYmVyO1xuICBsb2c6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZHlPZmZlcmluZ3MocGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSk6IG51bWJlciB7XG4gIHJldHVybiBwbGF5ZXIub2ZmZXJpbmdzLnJlZHVjZShcbiAgICAodG90YWwsIG9mZmVyaW5nKSA9PiB0b3RhbCArIChvZmZlcmluZy5yZWFkeSA/IG9mZmVyaW5nLnZhbHVlIDogMCksXG4gICAgcGxheWVyLnRlbXBvcmFyeU9mZmVyaW5nUmVzZXJ2ZSA/PyAwXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3RhbE9mZmVyaW5ncyhwbGF5ZXI6IENocmlzdGlhbml0eVBsYXllclN0YXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBsYXllci5vZmZlcmluZ3MucmVkdWNlKCh0b3RhbCwgb2ZmZXJpbmcpID0+IHRvdGFsICsgb2ZmZXJpbmcudmFsdWUsIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlQ29zdChcbiAgcGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25cbik6IG51bWJlciB7XG4gIGNvbnN0IGJhc2UgPSBjYXJkLmNvc3QgPz8gMDtcbiAgaWYgKGJhc2UgPT09IDApIHJldHVybiAwO1xuICBjb25zdCBkZWx0YSA9IChwbGF5ZXIuY29zdE1vZGlmaWVycyA/PyBbXSlcbiAgICAuZmlsdGVyKG0gPT4gbS5jYXJkVHlwZSA9PT0gY2FyZC50eXBlKVxuICAgIC5yZWR1Y2UoKHN1bSwgbSkgPT4gc3VtICsgbS5kZWx0YSwgMCk7XG4gIHJldHVybiBNYXRoLm1heCgwLCBiYXNlICsgZGVsdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FuUGxheUNhcmQoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25cbik6IGJvb2xlYW4ge1xuICBpZiAoZ2FtZS5zdGF0dXMgIT09ICdpbl9wcm9ncmVzcycgfHwgZ2FtZS50dXJuT3duZXIgIT09IHNlYXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGxheWVyID0gZ2FtZS5wbGF5ZXJzW3NlYXRdO1xuICBpZiAoY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnKSB7XG4gICAgY29uc3QgZXh0cmFDb3N0ID0gKHBsYXllci5jb3N0TW9kaWZpZXJzID8/IFtdKVxuICAgICAgLmZpbHRlcihtID0+IG0uY2FyZFR5cGUgPT09ICdvZmZlcmluZycpXG4gICAgICAucmVkdWNlKChzLCBtKSA9PiBzICsgbS5kZWx0YSwgMCk7XG4gICAgaWYgKGV4dHJhQ29zdCA+IDAgJiYgcmVhZHlPZmZlcmluZ3MocGxheWVyKSA8IGV4dHJhQ29zdCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhcGxheWVyLm9mZmVyaW5nUGxheWVkVGhpc1R1cm47XG4gIH1cbiAgY29uc3QgY29zdCA9IGVmZmVjdGl2ZUNvc3QocGxheWVyLCBjYXJkKTtcbiAgaWYgKGNhcmQudHlwZSA9PT0gJ2NoYXJhY3RlcicpIHtcbiAgICByZXR1cm4gcmVhZHlPZmZlcmluZ3MocGxheWVyKSA+PSBjb3N0ICYmIHBsYXllci5iYXR0bGVab25lLmxlbmd0aCA8IENIUklTVElBTklUWV9CQVRUTEVfU0xPVFM7XG4gIH1cbiAgaWYgKGNhcmQudHlwZSA9PT0gJ3Rvb2wnKSB7XG4gICAgcmV0dXJuIHJlYWR5T2ZmZXJpbmdzKHBsYXllcikgPj0gY29zdCAmJiBwbGF5ZXIuYmF0dGxlWm9uZS5sZW5ndGggPiAwO1xuICB9XG4gIGlmIChjYXJkLnR5cGUgPT09ICdhY3Rpb24nIHx8IGNhcmQudHlwZSA9PT0gJ3dpc2RvbScgfHwgY2FyZC50eXBlID09PSAnZXZlbnQnKSB7XG4gICAgY29uc3QgbG9ja2VkID0gKHBsYXllci5jb3N0TW9kaWZpZXJzID8/IFtdKS5zb21lKFxuICAgICAgbSA9PiBtLmNhcmRUeXBlID09PSBjYXJkLnR5cGUgJiYgbS5kZWx0YSA+PSA5OVxuICAgICk7XG4gICAgaWYgKGxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByZWFkeU9mZmVyaW5ncyhwbGF5ZXIpID49IGNvc3Q7XG4gIH1cbiAgaWYgKGNhcmQudHlwZSA9PT0gJ3BsYWNlJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgQ2FyZExvb2t1cCA9IChpZDogc3RyaW5nKSA9PiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB8IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5Q2FyZEZyb21IYW5kKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBvcHRpb25zOiB7XG4gICAgc2xvdEluZGV4PzogbnVtYmVyO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgIHRhcmdldEluc3RhbmNlSWQ/OiBzdHJpbmc7XG4gICAgbG9va3VwPzogQ2FyZExvb2t1cDtcbiAgfSA9IHt9XG4pOiBDaHJpc3RpYW5pdHlQbGF5Q2FyZFJlc3VsdCB7XG4gIGlmICghY2FuUGxheUNhcmQoZ2FtZSwgc2VhdCwgY2FyZCkpIHtcbiAgICByZXR1cm4geyBnYW1lLCBwbGF5ZWQ6IGZhbHNlLCBwbGF5ZWRPZmZlcmluZ1ZhbHVlOiAwLCBzcGVudE9mZmVyaW5nczogMCwgbG9nOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IHN0cnVjdHVyZWRDbG9uZShnYW1lKTtcbiAgY29uc3QgcGxheWVyID0gbmV4dC5wbGF5ZXJzW3NlYXRdO1xuICBjb25zdCBoYW5kSW5kZXggPSBwbGF5ZXIuaGFuZD8uaW5kZXhPZihjYXJkLmlkKSA/PyAtMTtcbiAgaWYgKGhhbmRJbmRleCA8IDAgfHwgIXBsYXllci5oYW5kKSB7XG4gICAgcmV0dXJuIHsgZ2FtZSwgcGxheWVkOiBmYWxzZSwgcGxheWVkT2ZmZXJpbmdWYWx1ZTogMCwgc3BlbnRPZmZlcmluZ3M6IDAsIGxvZzogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSA/PyBjYXJkLm5hbWU7XG4gIGxldCBwbGF5ZWRPZmZlcmluZ1ZhbHVlID0gMDtcbiAgbGV0IHNwZW50T2ZmZXJpbmdzID0gMDtcblxuICBwbGF5ZXIuaGFuZC5zcGxpY2UoaGFuZEluZGV4LCAxKTtcbiAgaWYgKGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJykge1xuICAgIHBsYXllZE9mZmVyaW5nVmFsdWUgPSBjYXJkLm9mZmVyaW5nVmFsdWUgPz8gY2FyZC5saWZlID8/IDE7XG4gICAgcGxheWVyLm9mZmVyaW5ncy5wdXNoKHtcbiAgICAgIGluc3RhbmNlSWQ6IGAke3NlYXQudG9Mb3dlckNhc2UoKX1fb2ZmZXJpbmdfJHtuZXh0LnJldmlzaW9uICsgMX1gLFxuICAgICAgY2FyZElkOiBjYXJkLmlkLFxuICAgICAgbmFtZTogZGlzcGxheU5hbWUsXG4gICAgICBvd25lcjogc2VhdCxcbiAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgdmFsdWU6IHBsYXllZE9mZmVyaW5nVmFsdWUsXG4gICAgICBhYmlsaXR5TmFtZTogY2FyZC5hYmlsaXR5TmFtZSxcbiAgICAgIGFiaWxpdHlUZXh0OiBjYXJkLmFiaWxpdHlUZXh0LFxuICAgICAgYWJpbGl0eUNvc3Q6IGNhcmQuYWJpbGl0eUNvc3QsXG4gICAgfSk7XG4gICAgcGxheWVyLm9mZmVyaW5nUGxheWVkVGhpc1R1cm4gPSB0cnVlO1xuICB9IGVsc2UgaWYgKGNhcmQudHlwZSA9PT0gJ2NoYXJhY3RlcicpIHtcbiAgICBjb25zdCBvY2N1cGllZFNsb3RzID0gbmV3IFNldChcbiAgICAgIHBsYXllci5iYXR0bGVab25lLm1hcCgoY2hhcmFjdGVyLCBpbmRleCkgPT5cbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihjaGFyYWN0ZXIuc2xvdCkgPyAoY2hhcmFjdGVyLnNsb3QgPz8gaW5kZXgpIDogaW5kZXhcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldFNsb3QgPSBvcHRpb25zLnNsb3RJbmRleCA/PyBbMCwgMSwgMiwgM10uZmluZChpbmRleCA9PiAhb2NjdXBpZWRTbG90cy5oYXMoaW5kZXgpKTtcbiAgICBpZiAodGFyZ2V0U2xvdCA9PT0gdW5kZWZpbmVkIHx8IG9jY3VwaWVkU2xvdHMuaGFzKHRhcmdldFNsb3QpKSB7XG4gICAgICByZXR1cm4geyBnYW1lLCBwbGF5ZWQ6IGZhbHNlLCBwbGF5ZWRPZmZlcmluZ1ZhbHVlOiAwLCBzcGVudE9mZmVyaW5nczogMCwgbG9nOiBbXSB9O1xuICAgIH1cbiAgICBzcGVudE9mZmVyaW5ncyA9IGVmZmVjdGl2ZUNvc3QocGxheWVyLCBjYXJkKTtcbiAgICBzcGVuZE9mZmVyaW5ncyhwbGF5ZXIsIHNwZW50T2ZmZXJpbmdzKTtcbiAgICBjb25zdCBsaWZlID0gY2FyZC5saWZlID8/IDE7XG4gICAgY29uc3QgbmV3Q2hhcjogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UgPSB7XG4gICAgICBpbnN0YW5jZUlkOiBgJHtzZWF0LnRvTG93ZXJDYXNlKCl9XyR7bmV4dC5yZXZpc2lvbiArIDF9XyR7cGxheWVyLmJhdHRsZVpvbmUubGVuZ3RofWAsXG4gICAgICBjYXJkSWQ6IGNhcmQuaWQsXG4gICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIG93bmVyOiBzZWF0LFxuICAgICAgY29udHJvbGxlcjogc2VhdCxcbiAgICAgIHNsb3Q6IHRhcmdldFNsb3QsXG4gICAgICBhdHRhY2s6IGNhcmQuYXR0YWNrID8/IDAsXG4gICAgICBjdXJyZW50SHA6IGxpZmUsXG4gICAgICBtYXhIcDogbGlmZSxcbiAgICAgIGNhbkF0dGFjazogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IHN5bnRoZXNpemVTdHJ1Y3R1cmVkRWZmZWN0cyhjYXJkKTtcbiAgICBiYWtlRWZmZWN0cyhuZXdDaGFyLCBbLi4uKGNhcmQuZWZmZWN0cyA/PyBbXSksIC4uLnN5bnRoZXNpemVkXSk7XG4gICAgcGxheWVyLmJhdHRsZVpvbmUucHVzaChuZXdDaGFyKTtcbiAgICBmaXJlRWZmZWN0cyhuZXh0LCBuZXdDaGFyLCAnb25fZW50ZXInLCBzZWF0KTtcbiAgICBmaXJlRWZmZWN0cyhuZXh0LCBuZXdDaGFyLCAncGFzc2l2ZScsIHNlYXQpO1xuICAgIGFwcGx5UGFzc2l2ZUNvc3RNb2RpZmllcnMobmV4dC5wbGF5ZXJzW3NlYXRdLCBuZXdDaGFyLmluc3RhbmNlSWQsIGNhcmQsIHRydWUpO1xuICAgIHJlc29sdmVDaGFyYWN0ZXJTdHJhdGVneUVudGVyKG5leHQsIG5ld0NoYXIsIGNhcmQsIHNlYXQsIG9wdGlvbnMubG9va3VwKTtcbiAgICBpbmxpbmVDbGVhbnVwKG5leHQsIG9wdGlvbnMubG9va3VwKTtcbiAgICBwbGF5ZXIuYmF0dGxlWm9uZS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuc2xvdCA/PyAwKSAtIChyaWdodC5zbG90ID8/IDApKTtcbiAgfSBlbHNlIGlmIChjYXJkLnR5cGUgPT09ICd0b29sJykge1xuICAgIHNwZW50T2ZmZXJpbmdzID0gZWZmZWN0aXZlQ29zdChwbGF5ZXIsIGNhcmQpO1xuICAgIGlmIChzcGVudE9mZmVyaW5ncyA+IDApIHtcbiAgICAgIHNwZW5kT2ZmZXJpbmdzKHBsYXllciwgc3BlbnRPZmZlcmluZ3MpO1xuICAgIH1cbiAgICBuZXh0LnBsYXllcnNbc2VhdF0gPSBwbGF5ZXI7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSBvcHRpb25zLnRhcmdldEluc3RhbmNlSWQ7XG4gICAgY29uc3QgY2hhcklkeCA9IG5leHQucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmZpbmRJbmRleChjID0+IGMuaW5zdGFuY2VJZCA9PT0gdGFyZ2V0SWQpO1xuICAgIGlmIChjaGFySWR4IDwgMCkge1xuICAgICAgcmV0dXJuIHsgZ2FtZSwgcGxheWVkOiBmYWxzZSwgcGxheWVkT2ZmZXJpbmdWYWx1ZTogMCwgc3BlbnRPZmZlcmluZ3M6IDAsIGxvZzogW10gfTtcbiAgICB9XG4gICAgY29uc3QgY2ggPSBuZXh0LnBsYXllcnNbc2VhdF0uYmF0dGxlWm9uZVtjaGFySWR4XTtcbiAgICBjaC5lcXVpcHBlZFRvb2xzID0gWy4uLihjaC5lcXVpcHBlZFRvb2xzID8/IFtdKSwgY2FyZC5pZF07XG4gICAgYXBwbHlUb29sUGFzc2l2ZXMoY2gsIGNhcmQpO1xuICB9IGVsc2UgaWYgKGNhcmQudHlwZSA9PT0gJ2FjdGlvbicgfHwgY2FyZC50eXBlID09PSAnd2lzZG9tJyB8fCBjYXJkLnR5cGUgPT09ICdldmVudCcpIHtcbiAgICBzcGVudE9mZmVyaW5ncyA9IGVmZmVjdGl2ZUNvc3QocGxheWVyLCBjYXJkKTtcbiAgICBpZiAoc3BlbnRPZmZlcmluZ3MgPiAwKSB7XG4gICAgICBzcGVuZE9mZmVyaW5ncyhwbGF5ZXIsIHNwZW50T2ZmZXJpbmdzKTtcbiAgICB9XG4gICAgbmV4dC5oaXN0b3J5Wm9uZS5wdXNoKGNhcmQuaWQpO1xuICAgIG5leHQucGxheWVyc1tzZWF0XSA9IHBsYXllcjtcbiAgICByZXNvbHZlQ2FyZEVmZmVjdChuZXh0LCBjYXJkLCBzZWF0LCBvcHRpb25zLmxvb2t1cCk7XG4gICAgaW5saW5lQ2xlYW51cChuZXh0LCBvcHRpb25zLmxvb2t1cCk7XG4gIH0gZWxzZSBpZiAoY2FyZC50eXBlID09PSAncGxhY2UnKSB7XG4gICAgY29uc3QgcHJldmlvdXNQbGFjZSA9IG5leHQucGxhY2Vab25lWzBdO1xuICAgIGlmIChwcmV2aW91c1BsYWNlKSB7XG4gICAgICBuZXh0Lmhpc3Rvcnlab25lLnB1c2gocHJldmlvdXNQbGFjZSk7XG4gICAgfVxuICAgIG5leHQucGxhY2Vab25lID0gW2NhcmQuaWRdO1xuICAgIHJlc29sdmVDYXJkRWZmZWN0KG5leHQsIGNhcmQsIHNlYXQsIG9wdGlvbnMubG9va3VwKTtcbiAgfVxuXG4gIG5leHQucmV2aXNpb24rKztcbiAgY29uc3QgbG9nID0gW3BsYXlDYXJkTG9nKGNhcmQsIGRpc3BsYXlOYW1lKV07XG4gIG5leHQubG9nID0gWy4uLmxvZywgLi4ubmV4dC5sb2ddLnNsaWNlKDAsIDQpO1xuICByZXR1cm4geyBnYW1lOiBuZXh0LCBwbGF5ZWQ6IHRydWUsIHBsYXllZE9mZmVyaW5nVmFsdWUsIHNwZW50T2ZmZXJpbmdzLCBsb2cgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZU9mZmVyaW5nQWJpbGl0eShcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBvZmZlcmluZ0luc3RhbmNlSWQ6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChnYW1lLnN0YXR1cyAhPT0gJ2luX3Byb2dyZXNzJyB8fCBnYW1lLnR1cm5Pd25lciAhPT0gc2VhdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwbGF5ZXIgPSBnYW1lLnBsYXllcnNbc2VhdF07XG4gIGNvbnN0IG9mZmVyaW5nID0gcGxheWVyLm9mZmVyaW5ncy5maW5kKGNhcmQgPT4gY2FyZC5pbnN0YW5jZUlkID09PSBvZmZlcmluZ0luc3RhbmNlSWQpO1xuICBpZiAoIW9mZmVyaW5nPy5yZWFkeSB8fCAhb2ZmZXJpbmcuYWJpbGl0eU5hbWUgfHwgb2ZmZXJpbmcuYWJpbGl0eVVzZWRUaGlzVHVybikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmVhZHlPZmZlcmluZ3MocGxheWVyKSA+PSAob2ZmZXJpbmcuYWJpbGl0eUNvc3QgPz8gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT2ZmZXJpbmdBYmlsaXR5KFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIG9mZmVyaW5nSW5zdGFuY2VJZDogc3RyaW5nLFxuICBtZXNzYWdlcz86IENocmlzdGlhbml0eVJ1bGVNZXNzYWdlc1xuKTogQ2hyaXN0aWFuaXR5T2ZmZXJpbmdBYmlsaXR5UmVzdWx0IHtcbiAgaWYgKCFjYW5Vc2VPZmZlcmluZ0FiaWxpdHkoZ2FtZSwgc2VhdCwgb2ZmZXJpbmdJbnN0YW5jZUlkKSkge1xuICAgIHJldHVybiB7IGdhbWUsIHJlc29sdmVkOiBmYWxzZSwgbGVhZGVyRGFtYWdlOiAwLCByZXNlcnZlR2FpbjogMCwgc3BlbnRPZmZlcmluZ3M6IDAsIGxvZzogW10gfTtcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoZ2FtZSk7XG4gIGNvbnN0IHBsYXllciA9IG5leHQucGxheWVyc1tzZWF0XTtcbiAgY29uc3QgbGl2ZU9mZmVyaW5nID0gcGxheWVyLm9mZmVyaW5ncy5maW5kKGNhcmQgPT4gY2FyZC5pbnN0YW5jZUlkID09PSBvZmZlcmluZ0luc3RhbmNlSWQpO1xuICBpZiAoIWxpdmVPZmZlcmluZylcbiAgICByZXR1cm4geyBnYW1lLCByZXNvbHZlZDogZmFsc2UsIGxlYWRlckRhbWFnZTogMCwgcmVzZXJ2ZUdhaW46IDAsIHNwZW50T2ZmZXJpbmdzOiAwLCBsb2c6IFtdIH07XG5cbiAgY29uc3Qgc3BlbnRPZmZlcmluZ3MgPSBsaXZlT2ZmZXJpbmcuYWJpbGl0eUNvc3QgPz8gMDtcbiAgaWYgKHNwZW50T2ZmZXJpbmdzID4gMCkge1xuICAgIHNwZW5kT2ZmZXJpbmdzKHBsYXllciwgc3BlbnRPZmZlcmluZ3MpO1xuICB9XG4gIGNvbnN0IHJlc2VydmVHYWluID0gb2ZmZXJpbmdBYmlsaXR5UmVzZXJ2ZUdhaW4obGl2ZU9mZmVyaW5nLmFiaWxpdHlUZXh0LCBsaXZlT2ZmZXJpbmcudmFsdWUpO1xuICBwbGF5ZXIudGVtcG9yYXJ5T2ZmZXJpbmdSZXNlcnZlID0gKHBsYXllci50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPz8gMCkgKyByZXNlcnZlR2FpbjtcbiAgcGxheWVyLm9mZmVyaW5ncyA9IHBsYXllci5vZmZlcmluZ3MubWFwKGNhcmQgPT5cbiAgICBjYXJkLmluc3RhbmNlSWQgPT09IG9mZmVyaW5nSW5zdGFuY2VJZCA/IHsgLi4uY2FyZCwgYWJpbGl0eVVzZWRUaGlzVHVybjogdHJ1ZSB9IDogY2FyZFxuICApO1xuICBwbGF5ZXIubGVhZGVySHAgPSBNYXRoLm1heCgwLCBwbGF5ZXIubGVhZGVySHAgLSAxKTtcbiAgbmV4dC5yZXZpc2lvbisrO1xuICBjb25zdCBsb2cgPSBbYCR7bGl2ZU9mZmVyaW5nLm5hbWV9OiAke2xpdmVPZmZlcmluZy5hYmlsaXR5TmFtZX0uYF07XG4gIGlmIChtZXNzYWdlcykge1xuICAgIGV2YWx1YXRlVmljdG9yeShuZXh0LCBsb2csIG1lc3NhZ2VzKTtcbiAgfVxuICBuZXh0LmxvZyA9IFsuLi5sb2csIC4uLm5leHQubG9nXS5zbGljZSgwLCA0KTtcbiAgcmV0dXJuIHsgZ2FtZTogbmV4dCwgcmVzb2x2ZWQ6IHRydWUsIGxlYWRlckRhbWFnZTogMSwgcmVzZXJ2ZUdhaW4sIHNwZW50T2ZmZXJpbmdzLCBsb2cgfTtcbn1cblxuZnVuY3Rpb24gcGxheUNhcmRMb2coY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sIGRpc3BsYXlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnKSByZXR1cm4gYCR7ZGlzcGxheU5hbWV9IHF1ZWRhIGxpc3RhIGNvbW8gb2ZyZW5kYS5gO1xuICBpZiAoY2FyZC50eXBlID09PSAncGxhY2UnKSByZXR1cm4gYCR7ZGlzcGxheU5hbWV9IHF1ZWRhIGNvbW8gbHVnYXIgYWN0aXZvLmA7XG4gIGlmIChjYXJkLnR5cGUgPT09ICdhY3Rpb24nIHx8IGNhcmQudHlwZSA9PT0gJ2V2ZW50JykgcmV0dXJuIGAke2Rpc3BsYXlOYW1lfSBmdWUganVnYWRhLmA7XG4gIGlmIChjYXJkLnR5cGUgPT09ICd3aXNkb20nKSByZXR1cm4gYCR7ZGlzcGxheU5hbWV9IGZ1ZSByZXZlbGFkYS5gO1xuICBpZiAoY2FyZC50eXBlID09PSAndG9vbCcpIHJldHVybiBgJHtkaXNwbGF5TmFtZX0gZnVlIGVxdWlwYWRhLmA7XG4gIHJldHVybiBgJHtkaXNwbGF5TmFtZX0gZW50cmEgZW4gYmF0YWxsYS5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF0dGFja0xlYWRlcihcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBhdHRhY2tlclNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGF0dGFja2VySW5zdGFuY2VJZDogc3RyaW5nLFxuICBtZXNzYWdlczogQ2hyaXN0aWFuaXR5UnVsZU1lc3NhZ2VzXG4pOiBDaHJpc3RpYW5pdHlBdHRhY2tSZXN1bHQge1xuICBjb25zdCBkZWZlbmRlclNlYXQgPSBvcHBvbmVudFNlYXQoYXR0YWNrZXJTZWF0KTtcbiAgaWYgKGdhbWUuc3RhdHVzICE9PSAnaW5fcHJvZ3Jlc3MnIHx8IGdhbWUucGxheWVyc1tkZWZlbmRlclNlYXRdLmJhdHRsZVpvbmUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGdhbWUsIGF0dGFja2VkOiBmYWxzZSwgYXR0YWNrZXJEYW1hZ2U6IDAsIHRhcmdldERhbWFnZTogMCwgbG9nOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IHN0cnVjdHVyZWRDbG9uZShnYW1lKTtcbiAgY29uc3QgYXR0YWNrZXIgPSBuZXh0LnBsYXllcnNbYXR0YWNrZXJTZWF0XS5iYXR0bGVab25lLmZpbmQoXG4gICAgY2FyZCA9PiBjYXJkLmluc3RhbmNlSWQgPT09IGF0dGFja2VySW5zdGFuY2VJZFxuICApO1xuICBpZiAoIWF0dGFja2VyIHx8ICFhdHRhY2tlci5jYW5BdHRhY2spXG4gICAgcmV0dXJuIHsgZ2FtZSwgYXR0YWNrZWQ6IGZhbHNlLCBhdHRhY2tlckRhbWFnZTogMCwgdGFyZ2V0RGFtYWdlOiAwLCBsb2c6IFtdIH07XG5cbiAgZmlyZUVmZmVjdHMobmV4dCwgYXR0YWNrZXIsICdvbl9hdHRhY2snLCBhdHRhY2tlclNlYXQsIHsgdGFyZ2V0aW5nOiAnbGVhZGVyJyB9KTtcbiAgY29uc3QgZGFtYWdlID0gYXR0YWNrZXIuYXR0YWNrICsgKGF0dGFja2VyLmNvbWJhdEF0dGFja0J1ZmYgPz8gMCk7XG4gIG5leHQucGxheWVyc1tkZWZlbmRlclNlYXRdLmxlYWRlckhwID0gTWF0aC5tYXgoMCwgbmV4dC5wbGF5ZXJzW2RlZmVuZGVyU2VhdF0ubGVhZGVySHAgLSBkYW1hZ2UpO1xuICBhdHRhY2tlci5jb21iYXRBdHRhY2tCdWZmID0gMDtcbiAgYXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gIGNvbnN0IGxvZyA9IFtcbiAgICBgJHthdHRhY2tlci5uYW1lfSAke2F0dGFja2VyU2VhdCA9PT0gJ1AxJyA/IG1lc3NhZ2VzLmF0dGFja3NPcHBvbmVudExlYWRlciA6IG1lc3NhZ2VzLmF0dGFja3NZb3VyTGVhZGVyfWAsXG4gIF07XG4gIGV2YWx1YXRlVmljdG9yeShuZXh0LCBsb2csIG1lc3NhZ2VzKTtcbiAgbmV4dC5yZXZpc2lvbisrO1xuICBuZXh0LmxvZyA9IFsuLi5sb2csIC4uLm5leHQubG9nXS5zbGljZSgwLCA0KTtcbiAgcmV0dXJuIHsgZ2FtZTogbmV4dCwgYXR0YWNrZWQ6IHRydWUsIGF0dGFja2VyRGFtYWdlOiAwLCB0YXJnZXREYW1hZ2U6IGRhbWFnZSwgbG9nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXR0YWNrQ2hhcmFjdGVyKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGF0dGFja2VyU2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgYXR0YWNrZXJJbnN0YW5jZUlkOiBzdHJpbmcsXG4gIHRhcmdldEluc3RhbmNlSWQ6IHN0cmluZyxcbiAgbWVzc2FnZXM6IENocmlzdGlhbml0eVJ1bGVNZXNzYWdlc1xuKTogQ2hyaXN0aWFuaXR5QXR0YWNrUmVzdWx0IHtcbiAgY29uc3QgZGVmZW5kZXJTZWF0ID0gb3Bwb25lbnRTZWF0KGF0dGFja2VyU2VhdCk7XG4gIGlmIChnYW1lLnN0YXR1cyAhPT0gJ2luX3Byb2dyZXNzJylcbiAgICByZXR1cm4geyBnYW1lLCBhdHRhY2tlZDogZmFsc2UsIGF0dGFja2VyRGFtYWdlOiAwLCB0YXJnZXREYW1hZ2U6IDAsIGxvZzogW10gfTtcblxuICBjb25zdCBuZXh0ID0gc3RydWN0dXJlZENsb25lKGdhbWUpO1xuICBjb25zdCBhdHRhY2tlciA9IG5leHQucGxheWVyc1thdHRhY2tlclNlYXRdLmJhdHRsZVpvbmUuZmluZChcbiAgICBjYXJkID0+IGNhcmQuaW5zdGFuY2VJZCA9PT0gYXR0YWNrZXJJbnN0YW5jZUlkXG4gICk7XG4gIGNvbnN0IHRhcmdldCA9IG5leHQucGxheWVyc1tkZWZlbmRlclNlYXRdLmJhdHRsZVpvbmUuZmluZChcbiAgICBjYXJkID0+IGNhcmQuaW5zdGFuY2VJZCA9PT0gdGFyZ2V0SW5zdGFuY2VJZFxuICApO1xuICBpZiAoIWF0dGFja2VyIHx8ICF0YXJnZXQgfHwgIWF0dGFja2VyLmNhbkF0dGFjaykge1xuICAgIHJldHVybiB7IGdhbWUsIGF0dGFja2VkOiBmYWxzZSwgYXR0YWNrZXJEYW1hZ2U6IDAsIHRhcmdldERhbWFnZTogMCwgbG9nOiBbXSB9O1xuICB9XG5cbiAgZmlyZUVmZmVjdHMobmV4dCwgYXR0YWNrZXIsICdvbl9hdHRhY2snLCBhdHRhY2tlclNlYXQsIHsgdGFyZ2V0aW5nOiAnY2hhcmFjdGVyJyB9LCB0YXJnZXQpO1xuICBmaXJlRWZmZWN0cyhuZXh0LCB0YXJnZXQsICdvbl9kZWZlbmQnLCBkZWZlbmRlclNlYXQsIHsgdGFyZ2V0aW5nOiAnY2hhcmFjdGVyJyB9LCBhdHRhY2tlcik7XG4gIGNvbnN0IGF0dGFja2VyVG90YWwgPSBhdHRhY2tlci5hdHRhY2sgKyAoYXR0YWNrZXIuY29tYmF0QXR0YWNrQnVmZiA/PyAwKTtcbiAgY29uc3QgdGFyZ2V0VG90YWwgPSB0YXJnZXQuYXR0YWNrICsgKHRhcmdldC5jb21iYXRBdHRhY2tCdWZmID8/IDApO1xuICB0YXJnZXQuY3VycmVudEhwIC09IGF0dGFja2VyVG90YWw7XG4gIGF0dGFja2VyLmN1cnJlbnRIcCAtPSB0YXJnZXRUb3RhbDtcbiAgYXR0YWNrZXIuY29tYmF0QXR0YWNrQnVmZiA9IDA7XG4gIHRhcmdldC5jb21iYXRBdHRhY2tCdWZmID0gMDtcbiAgYXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gIGNsZWFudXBEZXN0cm95ZWQobmV4dC5wbGF5ZXJzW2F0dGFja2VyU2VhdF0sIG5leHQpO1xuICBjbGVhbnVwRGVzdHJveWVkKG5leHQucGxheWVyc1tkZWZlbmRlclNlYXRdLCBuZXh0KTtcbiAgY29uc3QgbG9nID0gW2Ake2F0dGFja2VyLm5hbWV9ICR7bWVzc2FnZXMuY29tYmF0c0FnYWluc3R9ICR7dGFyZ2V0Lm5hbWV9LmBdO1xuICBldmFsdWF0ZVZpY3RvcnkobmV4dCwgbG9nLCBtZXNzYWdlcyk7XG4gIG5leHQucmV2aXNpb24rKztcbiAgbmV4dC5sb2cgPSBbLi4ubG9nLCAuLi5uZXh0LmxvZ10uc2xpY2UoMCwgNCk7XG5cbiAgcmV0dXJuIHtcbiAgICBnYW1lOiBuZXh0LFxuICAgIGF0dGFja2VkOiB0cnVlLFxuICAgIGF0dGFja2VyRGFtYWdlOiB0YXJnZXRUb3RhbCxcbiAgICB0YXJnZXREYW1hZ2U6IGF0dGFja2VyVG90YWwsXG4gICAgbG9nLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWR2YW5jZVR1cm4oXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgbWVzc2FnZXM6IENocmlzdGlhbml0eVJ1bGVNZXNzYWdlc1xuKTogc3RyaW5nW10ge1xuICBnYW1lLnBsYXllcnNbZ2FtZS50dXJuT3duZXJdLnRlbXBvcmFyeU9mZmVyaW5nUmVzZXJ2ZSA9IDA7XG4gIGdhbWUudHVybk93bmVyID0gb3Bwb25lbnRTZWF0KGdhbWUudHVybk93bmVyKTtcbiAgZ2FtZS50dXJuQ291bnQrKztcbiAgY29uc3QgY3VycmVudCA9IGdhbWUucGxheWVyc1tnYW1lLnR1cm5Pd25lcl07XG4gIGN1cnJlbnQub2ZmZXJpbmdQbGF5ZWRUaGlzVHVybiA9IGZhbHNlO1xuICBjdXJyZW50Lm9mZmVyaW5ncyA9IGN1cnJlbnQub2ZmZXJpbmdzLm1hcChvZmZlcmluZyA9PiAoe1xuICAgIC4uLm9mZmVyaW5nLFxuICAgIHJlYWR5OiB0cnVlLFxuICAgIGFiaWxpdHlVc2VkVGhpc1R1cm46IGZhbHNlLFxuICB9KSk7XG4gIGN1cnJlbnQuYmF0dGxlWm9uZSA9IGN1cnJlbnQuYmF0dGxlWm9uZS5tYXAoY2FyZCA9PiAoeyAuLi5jYXJkLCBjYW5BdHRhY2s6IHRydWUgfSkpO1xuICBjb25zdCBkcmF3bkNhcmQgPSBnYW1lLnNoYXJlZERlY2suc2hpZnQoKTtcbiAgY29uc3QgbG9nOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGlzY2FyZGVkRm9ySGFuZExpbWl0ID0gZmFsc2U7XG4gIGlmIChkcmF3bkNhcmQpIHtcbiAgICBpZiAoY3VycmVudC5oYW5kKSB7XG4gICAgICBjdXJyZW50LmhhbmQucHVzaChkcmF3bkNhcmQpO1xuICAgICAgLy8gTWFubyBsbGVuYTogbGEgY2FydGEgcm9iYWRhIHBvciBlbmNpbWEgZGVsIG3DoXhpbW8gc2UgZGVzY2FydGEgYSBIaXN0b3JpYS5cbiAgICAgIHdoaWxlIChjdXJyZW50LmhhbmQubGVuZ3RoID4gQ0hSSVNUSUFOSVRZX01BWF9IQU5EX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZGlzY2FyZGVkID0gY3VycmVudC5oYW5kLnBvcCgpO1xuICAgICAgICBpZiAoZGlzY2FyZGVkKSBnYW1lLmhpc3Rvcnlab25lLnB1c2goZGlzY2FyZGVkKTtcbiAgICAgICAgZGlzY2FyZGVkRm9ySGFuZExpbWl0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5oYW5kQ291bnQgPSAoY3VycmVudC5oYW5kQ291bnQgPz8gMCkgKyAxO1xuICAgICAgaWYgKGN1cnJlbnQuaGFuZENvdW50ID4gQ0hSSVNUSUFOSVRZX01BWF9IQU5EX1NJWkUpIHtcbiAgICAgICAgY3VycmVudC5oYW5kQ291bnQgPSBDSFJJU1RJQU5JVFlfTUFYX0hBTkRfU0laRTtcbiAgICAgICAgaWYgKGRyYXduQ2FyZCkgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKGRyYXduQ2FyZCk7XG4gICAgICAgIGRpc2NhcmRlZEZvckhhbmRMaW1pdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGV2YWx1YXRlVmljdG9yeShnYW1lLCBsb2csIG1lc3NhZ2VzKTtcbiAgfVxuICByZXR1cm4gW1xuICAgIGRyYXduQ2FyZCA/IGAke2N1cnJlbnQuZGlzcGxheU5hbWV9ICR7bWVzc2FnZXMuZHJhd3NDYXJkfWAgOiBtZXNzYWdlcy5kZWNrSXNFbXB0eSxcbiAgICAuLi4oZGlzY2FyZGVkRm9ySGFuZExpbWl0ID8gW2Ake2N1cnJlbnQuZGlzcGxheU5hbWV9ICR7bWVzc2FnZXMuaGFuZEZ1bGx9YF0gOiBbXSksXG4gICAgYCR7bWVzc2FnZXMudHVybk9mfSAke2N1cnJlbnQuZGlzcGxheU5hbWV9LmAsXG4gICAgLi4ubG9nLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVWaWN0b3J5KFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGxvZzogc3RyaW5nW10sXG4gIG1lc3NhZ2VzOiBDaHJpc3RpYW5pdHlSdWxlTWVzc2FnZXNcbik6IHZvaWQge1xuICBpZiAoZ2FtZS5wbGF5ZXJzLlAxLmxlYWRlckhwID4gMCAmJiBnYW1lLnBsYXllcnMuUDIubGVhZGVySHAgPiAwICYmIGdhbWUuc2hhcmVkRGVjay5sZW5ndGggPiAwKVxuICAgIHJldHVybjtcbiAgZ2FtZS5zdGF0dXMgPSAnZmluaXNoZWQnO1xuICBjb25zdCB3aW5uZXI6IENocmlzdGlhbml0eVNlYXQgPVxuICAgIGdhbWUucGxheWVycy5QMS5sZWFkZXJIcCA8PSAwXG4gICAgICA/ICdQMidcbiAgICAgIDogZ2FtZS5wbGF5ZXJzLlAyLmxlYWRlckhwIDw9IDBcbiAgICAgICAgPyAnUDEnXG4gICAgICAgIDogZ2FtZS5wbGF5ZXJzLlAxLmxlYWRlckhwID49IGdhbWUucGxheWVycy5QMi5sZWFkZXJIcFxuICAgICAgICAgID8gJ1AxJ1xuICAgICAgICAgIDogJ1AyJztcbiAgZ2FtZS5tYXRjaFNjb3JlW3dpbm5lcl0gKz0gMTtcbiAgbG9nLnB1c2god2lubmVyID09PSAnUDEnID8gbWVzc2FnZXMueW91V2luIDogbWVzc2FnZXMub3Bwb25lbnRXaW5zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBEZXN0cm95ZWQoXG4gIHBsYXllcjogQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUsXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgbG9va3VwPzogQ2FyZExvb2t1cFxuKTogdm9pZCB7XG4gIGNvbnN0IGRlc3Ryb3llZCA9IHBsYXllci5iYXR0bGVab25lLmZpbHRlcihjYXJkID0+IGNhcmQuY3VycmVudEhwIDw9IDApO1xuICBpZiAoIWRlc3Ryb3llZC5sZW5ndGgpIHJldHVybjtcbiAgZm9yIChjb25zdCBjaCBvZiBkZXN0cm95ZWQpIHtcbiAgICBmaXJlRWZmZWN0cyhnYW1lLCBjaCwgJ29uX2RlYXRoJywgY2gub3duZXIpO1xuICAgIGFwcGx5UGFzc2l2ZUNvc3RNb2RpZmllcnMoZ2FtZS5wbGF5ZXJzW2NoLm93bmVyXSwgY2guaW5zdGFuY2VJZCwgbnVsbCwgZmFsc2UpO1xuICAgIGlmIChsb29rdXApIHtcbiAgICAgIGNvbnN0IGRlZiA9IGxvb2t1cChjaC5jYXJkSWQpO1xuICAgICAgaWYgKGRlZikgcmVzb2x2ZUNoYXJhY3RlclN0cmF0ZWd5RGVhdGgoZ2FtZSwgY2gsIGRlZiwgY2gub3duZXIgYXMgQ2hyaXN0aWFuaXR5U2VhdCwgbG9va3VwKTtcbiAgICB9XG4gIH1cbiAgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKC4uLmRlc3Ryb3llZC5tYXAoY2FyZCA9PiBjYXJkLmNhcmRJZCkpO1xuICBwbGF5ZXIuYmF0dGxlWm9uZSA9IHBsYXllci5iYXR0bGVab25lLmZpbHRlcihjYXJkID0+IGNhcmQuY3VycmVudEhwID4gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGVuZE9mZmVyaW5ncyhwbGF5ZXI6IENocmlzdGlhbml0eVBsYXllclN0YXRlLCBjb3N0OiBudW1iZXIpOiB2b2lkIHtcbiAgbGV0IHJlbWFpbmluZyA9IGNvc3Q7XG4gIGNvbnN0IHRlbXBvcmFyeVJlc2VydmUgPSBwbGF5ZXIudGVtcG9yYXJ5T2ZmZXJpbmdSZXNlcnZlID8/IDA7XG4gIGlmICh0ZW1wb3JhcnlSZXNlcnZlID4gMCkge1xuICAgIGNvbnN0IHNwZW50VGVtcG9yYXJ5UmVzZXJ2ZSA9IE1hdGgubWluKHRlbXBvcmFyeVJlc2VydmUsIHJlbWFpbmluZyk7XG4gICAgcGxheWVyLnRlbXBvcmFyeU9mZmVyaW5nUmVzZXJ2ZSA9IHRlbXBvcmFyeVJlc2VydmUgLSBzcGVudFRlbXBvcmFyeVJlc2VydmU7XG4gICAgcmVtYWluaW5nIC09IHNwZW50VGVtcG9yYXJ5UmVzZXJ2ZTtcbiAgfVxuICBwbGF5ZXIub2ZmZXJpbmdzID0gcGxheWVyLm9mZmVyaW5ncy5tYXAob2ZmZXJpbmcgPT4ge1xuICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCAhb2ZmZXJpbmcucmVhZHkpIHJldHVybiBvZmZlcmluZztcbiAgICByZW1haW5pbmcgLT0gb2ZmZXJpbmcudmFsdWU7XG4gICAgcmV0dXJuIHsgLi4ub2ZmZXJpbmcsIHJlYWR5OiBmYWxzZSB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb2ZmZXJpbmdBYmlsaXR5UmVzZXJ2ZUdhaW4oXG4gIGFiaWxpdHlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrVmFsdWU6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgbWF0Y2ggPSBhYmlsaXR5VGV4dD8ubWF0Y2goL3ZhbG9yIGRlIChcXGQrKSBvZnJlbmRhcz8vaSk7XG4gIGNvbnN0IHBhcnNlZCA9IG1hdGNoID8gTnVtYmVyKG1hdGNoWzFdKSA6IE51bWJlci5OYU47XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogTWF0aC5tYXgoMSwgZmFsbGJhY2tWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcHBvbmVudFNlYXQoc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCk6IENocmlzdGlhbml0eVNlYXQge1xuICByZXR1cm4gc2VhdCA9PT0gJ1AxJyA/ICdQMicgOiAnUDEnO1xufVxuXG4vLyAtLS0gRWZmZWN0IGVuZ2luZSAoSDkpIC0tLVxuXG50eXBlIEVmZmVjdEN0eCA9IHsgdGFyZ2V0aW5nPzogJ2NoYXJhY3RlcicgfCAnbGVhZGVyJyB9O1xuXG5mdW5jdGlvbiBjaGVja0NvbmRpdGlvbihjb25kaXRpb246IENocmlzdGlhbml0eUNhcmRFZmZlY3RbJ2NvbmRpdGlvbiddLCBjdHg6IEVmZmVjdEN0eCk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmRpdGlvbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBjb25kaXRpb24udGFyZ2V0aW5nID09PSBjdHgudGFyZ2V0aW5nO1xufVxuXG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9DaGFyYWN0ZXIoXG4gIGNoOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgZWZmZWN0OiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0XG4pOiB2b2lkIHtcbiAgY29uc3QgbXV0ID0gZWZmZWN0Lm11dGF0aW9uO1xuICBjb25zdCBkdXJhdGlvbiA9IGVmZmVjdC5kdXJhdGlvbiA/PyAncGVybWFuZW50JztcbiAgc3dpdGNoIChtdXQudHlwZSkge1xuICAgIGNhc2UgJ2J1ZmZfYXR0YWNrJzpcbiAgICAgIGlmIChkdXJhdGlvbiA9PT0gJ2NvbWJhdCcpIHtcbiAgICAgICAgY2guY29tYmF0QXR0YWNrQnVmZiA9IChjaC5jb21iYXRBdHRhY2tCdWZmID8/IDApICsgbXV0LmFtb3VudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoLmF0dGFjayArPSBtdXQuYW1vdW50O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYnVmZl9saWZlJzpcbiAgICAgIGNoLmN1cnJlbnRIcCArPSBtdXQuYW1vdW50O1xuICAgICAgY2gubWF4SHAgKz0gbXV0LmFtb3VudDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RlYWxfZGFtYWdlJzpcbiAgICAgIGNoLmN1cnJlbnRIcCA9IE1hdGgubWF4KDAsIGNoLmN1cnJlbnRIcCAtIG11dC5hbW91bnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmVzdG9yZV9ocCc6XG4gICAgICBjaC5jdXJyZW50SHAgPSBNYXRoLm1pbihjaC5tYXhIcCwgY2guY3VycmVudEhwICsgbXV0LmFtb3VudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkZXN0cm95JzpcbiAgICAgIGNoLmN1cnJlbnRIcCA9IDA7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseUVmZmVjdChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBlZmZlY3Q6IENocmlzdGlhbml0eUNhcmRFZmZlY3QsXG4gIHNvdXJjZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIGNvbWJhdE9wcG9uZW50OiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSB8IG51bGwsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICBjb25zdCB7IG11dGF0aW9uOiBtdXQsIHRhcmdldCB9ID0gZWZmZWN0O1xuICBjb25zdCBvcHAgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG5cbiAgc3dpdGNoICh0YXJnZXQpIHtcbiAgICBjYXNlICdzZWxmJzpcbiAgICAgIGFwcGx5TXV0YXRpb25Ub0NoYXJhY3Rlcihzb3VyY2UsIGVmZmVjdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb21iYXRfb3Bwb25lbnQnOlxuICAgICAgaWYgKGNvbWJhdE9wcG9uZW50KSBhcHBseU11dGF0aW9uVG9DaGFyYWN0ZXIoY29tYmF0T3Bwb25lbnQsIGVmZmVjdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhbGxfZnJpZW5kbHknOlxuICAgICAgZm9yIChjb25zdCBjaCBvZiBnYW1lLnBsYXllcnNbc2VhdF0uYmF0dGxlWm9uZSkgYXBwbHlNdXRhdGlvblRvQ2hhcmFjdGVyKGNoLCBlZmZlY3QpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWxsX2VuZW15JzpcbiAgICAgIGZvciAoY29uc3QgY2ggb2YgZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSkgYXBwbHlNdXRhdGlvblRvQ2hhcmFjdGVyKGNoLCBlZmZlY3QpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb3Bwb25lbnRfbGVhZGVyJzpcbiAgICBjYXNlICdvd25fbGVhZGVyJzoge1xuICAgICAgY29uc3QgbHMgPSB0YXJnZXQgPT09ICdvcHBvbmVudF9sZWFkZXInID8gb3BwIDogc2VhdDtcbiAgICAgIGlmIChtdXQudHlwZSA9PT0gJ2RlYWxfZGFtYWdlJykge1xuICAgICAgICBnYW1lLnBsYXllcnNbbHNdLmxlYWRlckhwID0gTWF0aC5tYXgoMCwgZ2FtZS5wbGF5ZXJzW2xzXS5sZWFkZXJIcCAtIG11dC5hbW91bnQpO1xuICAgICAgfSBlbHNlIGlmIChtdXQudHlwZSA9PT0gJ3Jlc3RvcmVfaHAnKSB7XG4gICAgICAgIGdhbWUucGxheWVyc1tsc10ubGVhZGVySHAgPSBNYXRoLm1pbihcbiAgICAgICAgICBnYW1lLnBsYXllcnNbbHNdLmxlYWRlck1heEhwLFxuICAgICAgICAgIGdhbWUucGxheWVyc1tsc10ubGVhZGVySHAgKyBtdXQuYW1vdW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBnYW1lLWxldmVsIG11dGF0aW9ucyB0aGF0IGJ5cGFzcyB0aGUgY2hhcmFjdGVyIHN3aXRjaFxuICBpZiAobXV0LnR5cGUgPT09ICdkcmF3X2NhcmQnKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYW1vdW50OyBpKyspIGRyYXdDYXJkRm9yKGdhbWUsIHNlYXQpO1xuICB9IGVsc2UgaWYgKG11dC50eXBlID09PSAnZGlzY2FyZF9jYXJkJykge1xuICAgIGNvbnN0IHRTZWF0ID0gbXV0LndobyA9PT0gJ29wcG9uZW50JyA/IG9wcCA6IHNlYXQ7XG4gICAgY29uc3QgaGFuZCA9IGdhbWUucGxheWVyc1t0U2VhdF0uaGFuZCA/PyBbXTtcbiAgICBsZXQgc2VlZCA9IGdhbWUucmV2aXNpb24gKiAzMSArIGdhbWUudHVybkNvdW50ICogNztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKG11dC5hbW91bnQsIGhhbmQubGVuZ3RoKTsgaSsrKSB7XG4gICAgICBzZWVkID0gKHNlZWQgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykgJiAweGZmZmZmZmZmO1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5hYnMoc2VlZCkgJSBoYW5kLmxlbmd0aDtcbiAgICAgIGdhbWUuaGlzdG9yeVpvbmUucHVzaChoYW5kLnNwbGljZShpZHgsIDEpWzBdKTtcbiAgICB9XG4gICAgZ2FtZS5wbGF5ZXJzW3RTZWF0XS5oYW5kID0gaGFuZDtcbiAgfSBlbHNlIGlmIChtdXQudHlwZSA9PT0gJ2dhaW5fb2ZmZXJpbmdzJykge1xuICAgIGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPVxuICAgICAgKGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPz8gMCkgKyBtdXQuYW1vdW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpcmVFZmZlY3RzKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIHNvdXJjZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIHRyaWdnZXI6IENocmlzdGlhbml0eUVmZmVjdFRyaWdnZXIsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGN0eDogRWZmZWN0Q3R4ID0ge30sXG4gIGNvbWJhdE9wcG9uZW50OiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSB8IG51bGwgPSBudWxsXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlZmZlY3Qgb2Ygc291cmNlLmVmZmVjdHMgPz8gW10pIHtcbiAgICBpZiAoZWZmZWN0LnRyaWdnZXIgIT09IHRyaWdnZXIpIGNvbnRpbnVlO1xuICAgIGlmICghY2hlY2tDb25kaXRpb24oZWZmZWN0LmNvbmRpdGlvbiwgY3R4KSkgY29udGludWU7XG4gICAgYXBwbHlFZmZlY3QoZ2FtZSwgZWZmZWN0LCBzb3VyY2UsIGNvbWJhdE9wcG9uZW50LCBzZWF0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYWtlRWZmZWN0cyhcbiAgaW5zdGFuY2U6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlLFxuICBlZmZlY3RzOiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0W11cbik6IHZvaWQge1xuICBpbnN0YW5jZS5lZmZlY3RzID0gWy4uLihpbnN0YW5jZS5lZmZlY3RzID8/IFtdKSwgLi4uZWZmZWN0c107XG59XG5cbi8vIC0tLSBUb29sIGVxdWlwIHBhc3NpdmVzIChIOCkgLS0tXG5cbmZ1bmN0aW9uIGFwcGx5VG9vbFBhc3NpdmVzKFxuICBjaDogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uXG4pOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJyc7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhdGtNYXRjaCA9IGxvd2VyLm1hdGNoKC9cXCsoXFxkKylcXHMrcHVudG8oPzpzKT8gZGUgYXRhcXVlLyk7XG4gIGlmIChhdGtNYXRjaCkgY2guYXR0YWNrICs9IHBhcnNlSW50KGF0a01hdGNoWzFdLCAxMCk7XG4gIGNvbnN0IGxpZmVNYXRjaCA9IGxvd2VyLm1hdGNoKC9cXCsoXFxkKylcXHMrcHVudG8oPzpzKT8gZGUgdmlkYS8pO1xuICBpZiAobGlmZU1hdGNoKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGxpZmVNYXRjaFsxXSwgMTApO1xuICAgIGNoLmN1cnJlbnRIcCArPSBuO1xuICAgIGNoLm1heEhwICs9IG47XG4gIH1cbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwdWVkZSBhdGFjYXIgZWwgdHVybm8gZW4gcXVlIGVudHJhJykpIHtcbiAgICBjaC5jYW5BdHRhY2sgPSB0cnVlO1xuICB9XG4gIGJha2VFZmZlY3RzKGNoLCBjYXJkLmVmZmVjdHMgPz8gW10pO1xufVxuXG4vLyAtLS0gRGV0ZXJtaW5pc3RpYyBoZWxwZXJzIC0tLVxuXG5mdW5jdGlvbiBsY2dTdGVwKHNlZWQ6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoKHNlZWQgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykgJiAweDdmZmZmZmZmKSA+Pj4gMDtcbn1cblxuZnVuY3Rpb24gZ2FtZVNlZWQoZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGxjZ1N0ZXAoZ2FtZS5yZXZpc2lvbiAqIDMxICsgZ2FtZS50dXJuQ291bnQgKiA3KTtcbn1cblxuZnVuY3Rpb24gY29pbkZsaXAoZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnYW1lU2VlZChnYW1lKSAlIDIgPT09IDA7XG59XG5cbmZ1bmN0aW9uIHBzZXVkb1JhbmRJbmRleChsZW46IG51bWJlciwgc2VlZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguYWJzKHNlZWQpICUgbGVuO1xufVxuXG4vLyAtLS0gQXV0by10YXJnZXRpbmcgaGVscGVycyAtLS1cblxuZnVuY3Rpb24gcGlja01vc3REYW5nZXJvdXMoXG4gIHpvbmU6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlW11cbik6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlIHwgbnVsbCB7XG4gIGlmICghem9uZS5sZW5ndGgpIHJldHVybiBudWxsO1xuICByZXR1cm4gem9uZS5yZWR1Y2UoKGEsIGIpID0+IChhLmF0dGFjayA+PSBiLmF0dGFjayA/IGEgOiBiKSk7XG59XG5cbmZ1bmN0aW9uIHBpY2tNb3N0VnVsbmVyYWJsZShcbiAgem9uZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2VbXVxuKTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UgfCBudWxsIHtcbiAgaWYgKCF6b25lLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB6b25lLnJlZHVjZSgoYSwgYikgPT4gKGEuY3VycmVudEhwIDw9IGIuY3VycmVudEhwID8gYSA6IGIpKTtcbn1cblxuZnVuY3Rpb24gcGlja0Jlc3RGcmllbmRseShcbiAgem9uZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2VbXSxcbiAgZXhjbHVkaW5nPzogc3RyaW5nXG4pOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSB8IG51bGwge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZXhjbHVkaW5nID8gem9uZS5maWx0ZXIoYyA9PiBjLmluc3RhbmNlSWQgIT09IGV4Y2x1ZGluZykgOiB6b25lO1xuICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNhbmRpZGF0ZXMucmVkdWNlKChhLCBiKSA9PiAoYS5hdHRhY2sgPj0gYi5hdHRhY2sgPyBhIDogYikpO1xufVxuXG5mdW5jdGlvbiBib3VuY2VDaGFyYWN0ZXJUb0RlY2soXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2g6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlLFxuICBmcm9tU2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGdhbWUucGxheWVyc1tmcm9tU2VhdF0uYmF0dGxlWm9uZSA9IGdhbWUucGxheWVyc1tmcm9tU2VhdF0uYmF0dGxlWm9uZS5maWx0ZXIoXG4gICAgYyA9PiBjLmluc3RhbmNlSWQgIT09IGNoLmluc3RhbmNlSWRcbiAgKTtcbiAgZ2FtZS5zaGFyZWREZWNrLnVuc2hpZnQoY2guY2FyZElkKTtcbn1cblxuZnVuY3Rpb24gc3RlYWxDaGFyYWN0ZXIoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2g6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlLFxuICBmcm9tU2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgdG9TZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgZ2FtZS5wbGF5ZXJzW2Zyb21TZWF0XS5iYXR0bGVab25lID0gZ2FtZS5wbGF5ZXJzW2Zyb21TZWF0XS5iYXR0bGVab25lLmZpbHRlcihcbiAgICBjID0+IGMuaW5zdGFuY2VJZCAhPT0gY2guaW5zdGFuY2VJZFxuICApO1xuICBjb25zdCBuZXdTbG90cyA9IG5ldyBTZXQoZ2FtZS5wbGF5ZXJzW3RvU2VhdF0uYmF0dGxlWm9uZS5tYXAoYyA9PiBjLnNsb3QgPz8gMCkpO1xuICBjb25zdCBmcmVlU2xvdCA9IFswLCAxLCAyLCAzXS5maW5kKHMgPT4gIW5ld1Nsb3RzLmhhcyhzKSkgPz8gMztcbiAgaWYgKGdhbWUucGxheWVyc1t0b1NlYXRdLmJhdHRsZVpvbmUubGVuZ3RoIDwgQ0hSSVNUSUFOSVRZX0JBVFRMRV9TTE9UUykge1xuICAgIGdhbWUucGxheWVyc1t0b1NlYXRdLmJhdHRsZVpvbmUucHVzaCh7XG4gICAgICAuLi5jaCxcbiAgICAgIGNvbnRyb2xsZXI6IHRvU2VhdCxcbiAgICAgIHNsb3Q6IGZyZWVTbG90LFxuICAgICAgY2FuQXR0YWNrOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZWFyY2hEZWNrRm9yQ2FyZChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBtYXRjaEZuOiAoZGVmOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbikgPT4gYm9vbGVhbixcbiAgbG9va3VwOiBDYXJkTG9va3VwIHwgdW5kZWZpbmVkLFxuICBwdXRJblBsYXkgPSBmYWxzZVxuKTogYm9vbGVhbiB7XG4gIGlmICghbG9va3VwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGlkeCA9IGdhbWUuc2hhcmVkRGVjay5maW5kSW5kZXgoaWQgPT4ge1xuICAgIGNvbnN0IGRlZiA9IGxvb2t1cChpZCk7XG4gICAgcmV0dXJuIGRlZiA/IG1hdGNoRm4oZGVmKSA6IGZhbHNlO1xuICB9KTtcbiAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW2NhcmRJZF0gPSBnYW1lLnNoYXJlZERlY2suc3BsaWNlKGlkeCwgMSk7XG4gIHNodWZmbGVEZWNrU2VnbWVudChnYW1lLCAwLCBnYW1lLnNoYXJlZERlY2subGVuZ3RoLCBnYW1lU2VlZChnYW1lKSk7XG4gIGlmIChwdXRJblBsYXkpIHtcbiAgICBjb25zdCBkZWYgPSBsb29rdXAoY2FyZElkKTtcbiAgICBpZiAoZGVmICYmIGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmxlbmd0aCA8IENIUklTVElBTklUWV9CQVRUTEVfU0xPVFMpIHtcbiAgICAgIGNvbnN0IG9jY3VwaWVkU2xvdHMgPSBuZXcgU2V0KGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLm1hcCgoYywgaSkgPT4gYy5zbG90ID8/IGkpKTtcbiAgICAgIGNvbnN0IGZyZWVTbG90ID0gWzAsIDEsIDIsIDNdLmZpbmQocyA9PiAhb2NjdXBpZWRTbG90cy5oYXMocykpO1xuICAgICAgaWYgKGZyZWVTbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUucHVzaCh7XG4gICAgICAgICAgaW5zdGFuY2VJZDogYCR7c2VhdC50b0xvd2VyQ2FzZSgpfV9zZWFyY2hfJHtnYW1lLnJldmlzaW9ufWAsXG4gICAgICAgICAgY2FyZElkLFxuICAgICAgICAgIG5hbWU6IGRlZi5uYW1lLFxuICAgICAgICAgIG93bmVyOiBzZWF0LFxuICAgICAgICAgIGNvbnRyb2xsZXI6IHNlYXQsXG4gICAgICAgICAgc2xvdDogZnJlZVNsb3QsXG4gICAgICAgICAgYXR0YWNrOiBkZWYuYXR0YWNrID8/IDAsXG4gICAgICAgICAgY3VycmVudEhwOiBkZWYubGlmZSA/PyAxLFxuICAgICAgICAgIG1heEhwOiBkZWYubGlmZSA/PyAxLFxuICAgICAgICAgIGNhbkF0dGFjazogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmhhbmQ/LnB1c2goY2FyZElkKTtcbiAgfSBlbHNlIHtcbiAgICBnYW1lLnBsYXllcnNbc2VhdF0uaGFuZD8ucHVzaChjYXJkSWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaHVmZmxlRGVja1NlZ21lbnQoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4gIHNlZWQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGNvbnN0IGRlY2sgPSBnYW1lLnNoYXJlZERlY2s7XG4gIGZvciAobGV0IGkgPSBlbmQgLSAxOyBpID4gc3RhcnQ7IGktLSkge1xuICAgIHNlZWQgPSBsY2dTdGVwKHNlZWQpO1xuICAgIGNvbnN0IGogPSBzdGFydCArIChzZWVkICUgKGkgLSBzdGFydCArIDEpKTtcbiAgICBbZGVja1tpXSwgZGVja1tqXV0gPSBbZGVja1tqXSwgZGVja1tpXV07XG4gIH1cbn1cblxuLy8gLS0tIFBhc3NpdmUgY29zdCBtb2RpZmllciBzeXN0ZW0gLS0tXG5cbmZ1bmN0aW9uIHBhcnNlUGFzc2l2ZUNvc3RNb2RpZmllcnMoXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uXG4pOiBBcnJheTx7IGNhcmRUeXBlOiBDaHJpc3RpYW5pdHlDYXJkVHlwZTsgZGVsdGE6IG51bWJlciB9PiB8IG51bGwge1xuICBpZiAoY2FyZC5zdHJhdGVneSAhPT0gJ2FjY2VsZXJhdGUnICYmIGNhcmQuc3RyYXRlZ3kgIT09ICdzbG93ZG93bicpIHJldHVybiBudWxsO1xuICBjb25zdCB0ZXh0ID0gKGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgY2FyZFR5cGU6IENocmlzdGlhbml0eUNhcmRUeXBlOyBkZWx0YTogbnVtYmVyIH0+ID0gW107XG4gIGNvbnN0IHR5cGVNYXA6IEFycmF5PFtzdHJpbmcsIENocmlzdGlhbml0eUNhcmRUeXBlXT4gPSBbXG4gICAgWydzYWJpZHVyw60nLCAnd2lzZG9tJ10sXG4gICAgWydzYWJpZHVyaWEnLCAnd2lzZG9tJ10sXG4gICAgWydldmVudG8nLCAnZXZlbnQnXSxcbiAgICBbJ2FjY2nDs24nLCAnYWN0aW9uJ10sXG4gICAgWydhY2Npb24nLCAnYWN0aW9uJ10sXG4gICAgWydoZXJyYW1pZW50YScsICd0b29sJ10sXG4gICAgWydwZXJzb25hamUnLCAnY2hhcmFjdGVyJ10sXG4gICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgWydsdWdhcicsICdwbGFjZSddLFxuICBdO1xuICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB0eXBlXSBvZiB0eXBlTWFwKSB7XG4gICAgaWYgKCF0ZXh0LmluY2x1ZGVzKGtleXdvcmQpKSBjb250aW51ZTtcbiAgICAvLyBsb2NrIHBhdHRlcm5zXG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ25vIHNlIHB1ZWRlbiBqdWdhcicpKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBjYXJkVHlwZTogdHlwZSwgZGVsdGE6IDk5IH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMTtcbiAgICBpZiAoY2FyZC5zdHJhdGVneSA9PT0gJ2FjY2VsZXJhdGUnKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBjYXJkVHlwZTogdHlwZSwgZGVsdGE6IC1uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBjYXJkVHlwZTogdHlwZSwgZGVsdGE6IG4gfSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlc3VsdHMgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXNzaXZlQ29zdE1vZGlmaWVycyhcbiAgcGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgc291cmNlSWQ6IHN0cmluZyxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24gfCBudWxsLFxuICBhZGQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoIWFkZCkge1xuICAgIHBsYXllci5jb3N0TW9kaWZpZXJzID0gKHBsYXllci5jb3N0TW9kaWZpZXJzID8/IFtdKS5maWx0ZXIobSA9PiBtLnNvdXJjZUlkICE9PSBzb3VyY2VJZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghY2FyZCkgcmV0dXJuO1xuICBjb25zdCBtb2RzID0gcGFyc2VQYXNzaXZlQ29zdE1vZGlmaWVycyhjYXJkKTtcbiAgaWYgKCFtb2RzKSByZXR1cm47XG4gIHBsYXllci5jb3N0TW9kaWZpZXJzID0gW1xuICAgIC4uLihwbGF5ZXIuY29zdE1vZGlmaWVycyA/PyBbXSkuZmlsdGVyKG0gPT4gbS5zb3VyY2VJZCAhPT0gc291cmNlSWQpLFxuICAgIC4uLm1vZHMubWFwKG0gPT4gKHsgLi4ubSwgc291cmNlSWQgfSkpLFxuICBdO1xufVxuXG4vLyAtLS0gU3RydWN0dXJlZCBlZmZlY3Qgc3ludGhlc2lzIGZvciBjaGFyYWN0ZXJzIC0tLVxuXG5mdW5jdGlvbiBzeW50aGVzaXplU3RydWN0dXJlZEVmZmVjdHMoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pOiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0W10ge1xuICBjb25zdCBlZmZlY3RzOiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0W10gPSBbXTtcbiAgaWYgKCFjYXJkLnN0cmF0ZWd5KSByZXR1cm4gZWZmZWN0cztcbiAgY29uc3QgdGV4dCA9IChjYXJkLmFiaWxpdGllcz8uWzBdPy50ZXh0ID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChjYXJkLnN0cmF0ZWd5ID09PSAnYnVmZicpIHtcbiAgICAvLyBvbl9hdHRhY2sgYnVmZiB0byBzZWxmIChjb21iYXQgZHVyYXRpb24pXG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2FsIGF0YWNhcicpICYmIHRleHQuaW5jbHVkZXMoJ2F0YXF1ZScpKSB7XG4gICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICBlZmZlY3RzLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiAnb25fYXR0YWNrJyxcbiAgICAgICAgc3RyYXRlZ3k6ICdidWZmJyxcbiAgICAgICAgdGFyZ2V0OiAnc2VsZicsXG4gICAgICAgIG11dGF0aW9uOiB7IHR5cGU6ICdidWZmX2F0dGFjaycsIGFtb3VudDogbiB9LFxuICAgICAgICBkdXJhdGlvbjogdGV4dC5pbmNsdWRlcygnZmluYWwgZGVsIHR1cm5vJykgPyAnY29tYmF0JyA6ICdwZXJtYW5lbnQnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHBhc3NpdmUgYnVmZiB0byBhbGxfZnJpZW5kbHlcbiAgICBpZiAoXG4gICAgICAodGV4dC5pbmNsdWRlcygnbWllbnRyYXMnKSB8fCB0ZXh0LmluY2x1ZGVzKCd0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnbyBqdW50bycpKSAmJlxuICAgICAgdGV4dC5pbmNsdWRlcygnKycpICYmXG4gICAgICB0ZXh0LmluY2x1ZGVzKCdhdGFxdWUnKVxuICAgICkge1xuICAgICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgICAgZWZmZWN0cy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogJ3Bhc3NpdmUnLFxuICAgICAgICBzdHJhdGVneTogJ2J1ZmYnLFxuICAgICAgICB0YXJnZXQ6ICdhbGxfZnJpZW5kbHknLFxuICAgICAgICBtdXRhdGlvbjogeyB0eXBlOiAnYnVmZl9hdHRhY2snLCBhbW91bnQ6IG4gfSxcbiAgICAgICAgZHVyYXRpb246ICdwZXJtYW5lbnQnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhcmQuc3RyYXRlZ3kgPT09ICdkZXN0cm95Jykge1xuICAgIC8vIG9uX2RlYXRoIGRhbWFnZSB0byBhbGxfZW5lbXlcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnYWwgc2VyIGRlc3RydWlkbycpICYmIHRleHQuaW5jbHVkZXMoJ2Rhw7FvJykgJiYgdGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSkge1xuICAgICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgICAgZWZmZWN0cy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogJ29uX2RlYXRoJyxcbiAgICAgICAgc3RyYXRlZ3k6ICdkZXN0cm95JyxcbiAgICAgICAgdGFyZ2V0OiAnYWxsX2VuZW15JyxcbiAgICAgICAgbXV0YXRpb246IHsgdHlwZTogJ2RlYWxfZGFtYWdlJywgYW1vdW50OiBuIH0sXG4gICAgICAgIGR1cmF0aW9uOiAncGVybWFuZW50JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBvbl9kZWF0aCBkYW1hZ2UgdG8gb3Bwb25lbnQgbGVhZGVyXG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2FsIHNlciBkZXN0cnVpZG8nKSAmJiB0ZXh0LmluY2x1ZGVzKCdkYcOxbycpICYmIHRleHQuaW5jbHVkZXMoJ2zDrWRlcicpKSB7XG4gICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICBlZmZlY3RzLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiAnb25fZGVhdGgnLFxuICAgICAgICBzdHJhdGVneTogJ2Rlc3Ryb3knLFxuICAgICAgICB0YXJnZXQ6ICdvcHBvbmVudF9sZWFkZXInLFxuICAgICAgICBtdXRhdGlvbjogeyB0eXBlOiAnZGVhbF9kYW1hZ2UnLCBhbW91bnQ6IG4gfSxcbiAgICAgICAgZHVyYXRpb246ICdwZXJtYW5lbnQnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdHM7XG59XG5cbi8vIC0tLSBDaGFyYWN0ZXIgc3RyYXRlZ3k6IG9uX2VudGVyICYgb25fZGVhdGggLS0tXG5cbmZ1bmN0aW9uIHJlc29sdmVDaGFyYWN0ZXJTdHJhdGVneUVudGVyKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNoOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGxvb2t1cDogQ2FyZExvb2t1cCB8IHVuZGVmaW5lZFxuKTogdm9pZCB7XG4gIGlmICghY2FyZC5zdHJhdGVneSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gKGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wcCA9IG9wcG9uZW50U2VhdChzZWF0KTtcbiAgY29uc3Qgc2VlZCA9IGdhbWVTZWVkKGdhbWUpO1xuXG4gIHN3aXRjaCAoY2FyZC5zdHJhdGVneSkge1xuICAgIGNhc2UgJ2J1ZmYnOiB7XG4gICAgICBpZiAoIXRleHQuaW5jbHVkZXMoJ2FsIGVudHJhciBlbiBqdWVnbycpKSByZXR1cm47XG4gICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICBjb25zdCBpc0xpZmUgPSB0ZXh0LmluY2x1ZGVzKCd2aWRhJyk7XG4gICAgICBjb25zdCBpc0F0ayA9IHRleHQuaW5jbHVkZXMoJ2F0YXF1ZScpO1xuICAgICAgaWYgKCFpc0xpZmUgJiYgIWlzQXRrKSByZXR1cm47XG4gICAgICBpZiAodGV4dC5pbmNsdWRlcygndW5vIGRlIHR1cyBwZXJzb25hamVzJykgfHwgdGV4dC5pbmNsdWRlcygnMSBkZSB0dXMgcGVyc29uYWplcycpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBpY2tCZXN0RnJpZW5kbHkoZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUsIGNoLmluc3RhbmNlSWQpO1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICBpZiAoaXNBdGspIHRhcmdldC5hdHRhY2sgKz0gbjtcbiAgICAgICAgaWYgKGlzTGlmZSkge1xuICAgICAgICAgIHRhcmdldC5jdXJyZW50SHAgKz0gbjtcbiAgICAgICAgICB0YXJnZXQubWF4SHAgKz0gbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGV4dC5pbmNsdWRlcygndG9kb3MgdHVzIHBlcnNvbmFqZXMnKSB8fFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCd0dXMgcGVyc29uYWplcyBlbiBqdWVnbycpXG4gICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lKSB7XG4gICAgICAgICAgaWYgKGMuaW5zdGFuY2VJZCA9PT0gY2guaW5zdGFuY2VJZCkgY29udGludWU7XG4gICAgICAgICAgaWYgKGlzQXRrKSBjLmF0dGFjayArPSBuO1xuICAgICAgICAgIGlmIChpc0xpZmUpIHtcbiAgICAgICAgICAgIGMuY3VycmVudEhwICs9IG47XG4gICAgICAgICAgICBjLm1heEhwICs9IG47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlICdkZXN0cm95Jzoge1xuICAgICAgaWYgKCF0ZXh0LmluY2x1ZGVzKCdhbCBlbnRyYXIgZW4ganVlZ28nKSAmJiAhdGV4dC5pbmNsdWRlcygnY3VhbmRvIGVudHJhIGVuIGp1ZWdvJykpIHJldHVybjtcbiAgICAgIC8vIFwiZGVzdHJ1eWUgdG9kb3MgbG9zIHBlcnNvbmFqZXMgZW4ganVlZ29cIlxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCdkZXN0cnV5ZSB0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnbycpIHx8XG4gICAgICAgIHRleHQuaW5jbHVkZXMoJ2JhcmFqYSBhIHRvZG9zIHBlcnNvbmFqZXMgZW4ganVlZ28nKVxuICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgICAgICAgZ2FtZS5wbGF5ZXJzW3NdLmJhdHRsZVpvbmUuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgIGlmIChjLmluc3RhbmNlSWQgIT09IGNoLmluc3RhbmNlSWQpIGMuY3VycmVudEhwID0gMDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcIkRlc3RydXllIDQgZGUgdHVzIGNhcnRhcyBkZSBvZnJlbmRhXCJcbiAgICAgICAgY29uc3Qgbk9mZiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0LnNwbGl0KCdkZXN0cnV5ZScpLnNsaWNlKC0xKVswXSA/PyAnJyk7XG4gICAgICAgIGlmIChuT2ZmID4gMCkge1xuICAgICAgICAgIGdhbWUucGxheWVyc1tzZWF0XS5vZmZlcmluZ3MgPSBnYW1lLnBsYXllcnNbc2VhdF0ub2ZmZXJpbmdzLnNsaWNlKG5PZmYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFwiYmFyYWphIDEgcGVyc29uYWplIG9wb25lbnRlXCIgKGJvdW5jZSlcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdiYXJhamEnKSAmJiAodGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSB8fCB0ZXh0LmluY2x1ZGVzKCdyaXZhbCcpKSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4uZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZV0uc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gKGIuYXR0YWNrID8/IDApIC0gKGEuYXR0YWNrID8/IDApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obiwgdGFyZ2V0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICBib3VuY2VDaGFyYWN0ZXJUb0RlY2soZ2FtZSwgdGFyZ2V0c1tpXSwgb3BwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBcImJhcmFqYSAxIGRlIHR1cyBwZXJzb25hamVzIGVuIGp1ZWdvXCIgKHNlbGYgYm91bmNlKVxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCdiYXJhamEnKSAmJlxuICAgICAgICAodGV4dC5pbmNsdWRlcygndHVzIHBlcnNvbmFqZXMnKSB8fCB0ZXh0LmluY2x1ZGVzKCd1bm8gZGUgdHVzJykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZlRhcmdldHMgPSBnYW1lLnBsYXllcnNbc2VhdF0uYmF0dGxlWm9uZS5maWx0ZXIoXG4gICAgICAgICAgYyA9PiBjLmluc3RhbmNlSWQgIT09IGNoLmluc3RhbmNlSWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNlbGZUYXJnZXRzLmxlbmd0aCkge1xuICAgICAgICAgIGJvdW5jZUNoYXJhY3RlclRvRGVjayhnYW1lLCBzZWxmVGFyZ2V0c1twc2V1ZG9SYW5kSW5kZXgoc2VsZlRhcmdldHMubGVuZ3RoLCBzZWVkKV0sIHNlYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFwiZGVzdHJ1eWUgMSBwZXJzb25hamUgb3BvbmVudGVcIlxuICAgICAgaWYgKHRleHQuaW5jbHVkZXMoJ2Rlc3RydXllJykgJiYgdGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICAgIC8vIENvbmRpdGlvbmFsOiBcInF1ZSB0ZW5nYSBtZW5vcyBwdW50b3MgZGUgYXRhcXVlIHF1ZSBlc3RhIGNhcnRhXCJcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUuZmlsdGVyKGMgPT4ge1xuICAgICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdtZW5vcyBwdW50b3MgZGUgYXRhcXVlIHF1ZSBlc3RhJykpIHJldHVybiBjLmF0dGFjayA8IGNoLmF0dGFjaztcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obiwgdGFyZ2V0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgdGV4dC5pbmNsdWRlcygnZWxpZ2UnKSB8fCBuID09PSAxXG4gICAgICAgICAgICAgID8gKHBpY2tNb3N0RGFuZ2Vyb3VzKHRhcmdldHMpID8/IHRhcmdldHNbMF0pXG4gICAgICAgICAgICAgIDogdGFyZ2V0c1tpXTtcbiAgICAgICAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY3VycmVudEhwID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBcImluZmxpZ2UgTiBwdW50b3MgZGUgZGHDsW8gYSAxLzIgcGVyc29uYWplKHMpIG9wb25lbnRlKHMpXCJcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdpbmZsaWdlJykgJiYgdGV4dC5pbmNsdWRlcygnZGHDsW8nKSkge1xuICAgICAgICBjb25zdCBkbWcgPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMTtcbiAgICAgICAgLy8gSG93IG1hbnkgdGFyZ2V0cz9cbiAgICAgICAgY29uc3QgY291bnRNYXRjaCA9IHRleHQubWF0Y2goL2FcXHMrKFxcZCt8dW58ZG9zfHRyZXMpXFxzK3BlcnNvbmFqZS9pKTtcbiAgICAgICAgY29uc3QgblRhcmdldHMgPSBjb3VudE1hdGNoID8gcGFyc2VTcGFuaXNoTnVtYmVyKGNvdW50TWF0Y2hbMV0pIHx8IDEgOiAxO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZV0uc29ydCgoYSwgYikgPT4gYS5jdXJyZW50SHAgLSBiLmN1cnJlbnRIcCk7XG4gICAgICAgIC8vIENvaW4tZmxpcCBjb25kaXRpb25hbFxuICAgICAgICBpZiAodGV4dC5pbmNsdWRlcygnbGFuemEnKSAmJiB0ZXh0LmluY2x1ZGVzKCdtb25lZGEnKSkge1xuICAgICAgICAgIGlmICghY29pbkZsaXAoZ2FtZSkpIHtcbiAgICAgICAgICAgIC8vIFwic2kgc2FsZSBjcnV6XCIg4oCUIHVzdWFsbHkgbm90aGluZyBvciBvd24gY2hhcmFjdGVyIGJvdW5jZWRcbiAgICAgICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdzaSBzYWxlIGNydXonKSAmJiB0ZXh0LmluY2x1ZGVzKCd0dXMgcGVyc29uYWplcycpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbGZUID0gZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGMgPT4gYy5pbnN0YW5jZUlkICE9PSBjaC5pbnN0YW5jZUlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChzZWxmVC5sZW5ndGgpIHNlbGZUW3BzZXVkb1JhbmRJbmRleChzZWxmVC5sZW5ndGgsIHNlZWQpXS5jdXJyZW50SHAgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKG5UYXJnZXRzLCBzb3J0ZWQubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgc29ydGVkW2ldLmN1cnJlbnRIcCA9IE1hdGgubWF4KDAsIHNvcnRlZFtpXS5jdXJyZW50SHAgLSBkbWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ3NlYXJjaCc6IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRleHQuaW5jbHVkZXMoJ2FsIGVudHJhciBlbiBqdWVnbycpICYmXG4gICAgICAgICF0ZXh0LmluY2x1ZGVzKCdjdWFuZG8gZW50cmEgZW4ganVlZ28nKSAmJlxuICAgICAgICAhdGV4dC5pbmNsdWRlcygnYnVzY2EnKVxuICAgICAgKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIXRleHQuaW5jbHVkZXMoJ2J1c2NhJykpIHJldHVybjtcbiAgICAgIGNvbnN0IHR5cGVNYXA6IEFycmF5PFtzdHJpbmcsIENocmlzdGlhbml0eUNhcmRUeXBlXT4gPSBbXG4gICAgICAgIFsncGVyc29uYWplJywgJ2NoYXJhY3RlciddLFxuICAgICAgICBbJ2hlcnJhbWllbnRhJywgJ3Rvb2wnXSxcbiAgICAgICAgWydzYWJpZHVyw61hJywgJ3dpc2RvbSddLFxuICAgICAgICBbJ3NhYmlkdXJpYScsICd3aXNkb20nXSxcbiAgICAgICAgWydldmVudG8nLCAnZXZlbnQnXSxcbiAgICAgICAgWydhY2Npw7NuJywgJ2FjdGlvbiddLFxuICAgICAgICBbJ2FjY2lvbicsICdhY3Rpb24nXSxcbiAgICAgICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgICAgIFsnbHVnYXInLCAncGxhY2UnXSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB0eXBlXSBvZiB0eXBlTWFwKSB7XG4gICAgICAgIGlmICghdGV4dC5pbmNsdWRlcyhrZXl3b3JkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHBvd2VyID0gdGV4dC5pbmNsdWRlcygncG9kZXIgZGVzdGFjYWRvJylcbiAgICAgICAgICA/ICdmZWF0dXJlZCdcbiAgICAgICAgICA6IHRleHQuaW5jbHVkZXMoJ3BvZGVyIG5vcm1hbCcpXG4gICAgICAgICAgICA/ICdub3JtYWwnXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcHV0SW5QbGF5ID1cbiAgICAgICAgICB0ZXh0LmluY2x1ZGVzKCdwb25sYSBlbiBqdWVnbycpIHx8IHRleHQuaW5jbHVkZXMoJ2p1w6lnYWxhJykgfHwgdGV4dC5pbmNsdWRlcygnanVlZ2FsYScpO1xuICAgICAgICBzZWFyY2hEZWNrRm9yQ2FyZChcbiAgICAgICAgICBnYW1lLFxuICAgICAgICAgIHNlYXQsXG4gICAgICAgICAgZGVmID0+IGRlZi50eXBlID09PSB0eXBlICYmICghcG93ZXIgfHwgZGVmLnBvd2VyID09PSBwb3dlciksXG4gICAgICAgICAgbG9va3VwLFxuICAgICAgICAgIHB1dEluUGxheVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2RlY2twZWVrJzoge1xuICAgICAgaWYgKCF0ZXh0LmluY2x1ZGVzKCdhbCBlbnRyYXIgZW4ganVlZ28nKSAmJiAhdGV4dC5pbmNsdWRlcygnY3VhbmRvIGVudHJhIGVuIGp1ZWdvJykpIHJldHVybjtcbiAgICAgIGNvbnN0IG4gPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMztcbiAgICAgIGRlY2twZWVrUmVvcmRlcihnYW1lLCBzZWF0LCBuLCBsb29rdXApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSAnbWluZGNvbnRyb2wnOiB7XG4gICAgICBpZiAoIXRleHQuaW5jbHVkZXMoJ2FsIGVudHJhciBlbiBqdWVnbycpICYmICF0ZXh0LmluY2x1ZGVzKCdjdWFuZG8gZW50cmEgZW4ganVlZ28nKSkgcmV0dXJuO1xuICAgICAgLy8gXCJwdWVkZXMgZWxlZ2lyIHVuIHBlcnNvbmFqZSBvcG9uZW50ZSAuLi4gY29uIG1lbm9zIHB1bnRvcyBkZSBhdGFxdWUgcXVlIGVzdGVcIlxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCdtZW5vcyBwdW50b3MgZGUgYXRhcXVlIHF1ZSBlc3RlJykgfHxcbiAgICAgICAgdGV4dC5pbmNsdWRlcygnbWVub3MgcHVudG9zIGRlIGF0YXF1ZSBxdWUgZXN0YScpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZS5maW5kKGMgPT4gYy5hdHRhY2sgPCBjaC5hdHRhY2spO1xuICAgICAgICBpZiAodGFyZ2V0KSBzdGVhbENoYXJhY3RlcihnYW1lLCB0YXJnZXQsIG9wcCwgc2VhdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFwicHVlZGVzIGVsZWdpciB1biBwZXJzb25hamUgb3BvbmVudGVcIiBnZW5lcmljIHN0ZWFsXG4gICAgICBpZiAoXG4gICAgICAgIHRleHQuaW5jbHVkZXMoJ3BlcnNvbmFqZSBvcG9uZW50ZScpICYmXG4gICAgICAgICh0ZXh0LmluY2x1ZGVzKCdwb24nKSB8fCB0ZXh0LmluY2x1ZGVzKCdjb2xvY2EnKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwaWNrTW9zdFZ1bG5lcmFibGUoZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSk7XG4gICAgICAgIGlmICh0YXJnZXQpIHN0ZWFsQ2hhcmFjdGVyKGdhbWUsIHRhcmdldCwgb3BwLCBzZWF0KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ3JldmVhbCc6IHtcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdsYW56YScpICYmIHRleHQuaW5jbHVkZXMoJ21vbmVkYScpKSB7XG4gICAgICAgIGlmIChjb2luRmxpcChnYW1lKSkgZ2FtZS5wbGF5ZXJzW29wcF0uaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSAmJiB0ZXh0LmluY2x1ZGVzKCdtYW5vJykpIHtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW29wcF0uaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGV4dC5pbmNsdWRlcygnanVnYWRvcmVzJykgJiYgdGV4dC5pbmNsdWRlcygnbWFubycpKSB7XG4gICAgICAgIGdhbWUucGxheWVycy5QMS5oYW5kUmV2ZWFsZWQgPSB0cnVlO1xuICAgICAgICBnYW1lLnBsYXllcnMuUDIuaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2FjY2VsZXJhdGUnOiB7XG4gICAgICAvLyBQYXNzaXZlOiBjYW5BdHRhY2sgb24gZW50ZXJcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdwdWVkZSBhdGFjYXIgY3VhbmRvIGVudHJhJykgfHwgdGV4dC5pbmNsdWRlcygncHVlZGUgYXRhY2FyIGVsIHR1cm5vJykpIHtcbiAgICAgICAgY2guY2FuQXR0YWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ2hhcmFjdGVyU3RyYXRlZ3lEZWF0aChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjaDogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBfbG9va3VwOiBDYXJkTG9va3VwIHwgdW5kZWZpbmVkXG4pOiB2b2lkIHtcbiAgaWYgKCFjYXJkLnN0cmF0ZWd5KSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSAoY2FyZC5hYmlsaXRpZXM/LlswXT8udGV4dCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgb3BwID0gb3Bwb25lbnRTZWF0KHNlYXQpO1xuXG4gIGlmIChjYXJkLnN0cmF0ZWd5ID09PSAnZGVzdHJveScgJiYgdGV4dC5pbmNsdWRlcygnYWwgc2VyIGRlc3RydWlkbycpKSB7XG4gICAgLy8gXCJiYXJhamEgYSB0b2RvcyBwZXJzb25hamVzIGVuIGp1ZWdvXCIgb24gZGVhdGhcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnYmFyYWphIGEgdG9kb3MgcGVyc29uYWplcycpKSB7XG4gICAgICBmb3IgKGNvbnN0IHMgb2YgWydQMScsICdQMiddIGFzIENocmlzdGlhbml0eVNlYXRbXSkge1xuICAgICAgICBnYW1lLnBsYXllcnNbc10uYmF0dGxlWm9uZS5mb3JFYWNoKGMgPT4gKGMuY3VycmVudEhwID0gMCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBcImJhcmFqYSBOIGRlIHR1cyBwZXJzb25hamVzXCIgb24gZGVhdGhcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnYmFyYWphJykgJiYgdGV4dC5pbmNsdWRlcygndHVzIHBlcnNvbmFqZXMnKSkge1xuICAgICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgICAgY29uc3Qgc2VsZlQgPSBbLi4uZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmVdLnNsaWNlKDAsIG4pO1xuICAgICAgZm9yIChjb25zdCBjIG9mIHNlbGZUKSBib3VuY2VDaGFyYWN0ZXJUb0RlY2soZ2FtZSwgYywgc2VhdCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhcmQuc3RyYXRlZ3kgPT09ICdtaW5kY29udHJvbCcgJiYgdGV4dC5pbmNsdWRlcygnYWwgc2VyIGRlc3RydWlkbycpKSB7XG4gICAgLy8gXCJwb24gYWwgcGVyc29uYWplIHF1ZSBkZXN0cnV5YSBlc3RhIGNhcnRhIGVuIHR1IHpvbmFcIlxuICAgIC8vIENhbid0IHJlbGlhYmx5IGlkZW50aWZ5IGF0dGFja2VyIGF0IHRoaXMgcG9pbnQsIHNraXBcbiAgfVxufVxuXG4vLyAtLS0gRGVja3BlZWsgLyByZW9yZGVyIC0tLVxuXG5mdW5jdGlvbiBkZWNrcGVla1Jlb3JkZXIoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgbjogbnVtYmVyLFxuICBsb29rdXA6IENhcmRMb29rdXAgfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBjb25zdCB0b3AgPSBnYW1lLnNoYXJlZERlY2suc2xpY2UoMCwgbik7XG4gIGlmICghdG9wLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBQdWxsIGNhcmRzIG1hdGNoaW5nIHR5cGUgdG8gaGFuZCAoZm9yIGRlY2twZWVrK2RyYXcgY29tYm9zKVxuICAvLyBGb3Igc2ltcGxpY2l0eTogc29ydCB0b3AgTiBieSBkZXNjZW5kaW5nIGNvc3QsIGtlZXBpbmcgaGlnaGVzdC12YWx1ZSBjYXJkcyBvbiB0b3BcbiAgaWYgKGxvb2t1cCkge1xuICAgIHRvcC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBkYSA9IGxvb2t1cChhKTtcbiAgICAgIGNvbnN0IGRiID0gbG9va3VwKGIpO1xuICAgICAgcmV0dXJuIChkYj8uY29zdCA/PyAwKSAtIChkYT8uY29zdCA/PyAwKTtcbiAgICB9KTtcbiAgfVxuICBnYW1lLnNoYXJlZERlY2suc3BsaWNlKDAsIG4sIC4uLnRvcCk7XG4gIC8vIENoZWNrIGlmIHRoZSBhYmlsaXR5IGxldHMgdXMgZHJhdyBhIGZvdW5kIGNhcmRcbiAgY29uc3QgZGVmID0gbG9va3VwPy4oZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUuYXQoLTEpPy5jYXJkSWQgPz8gJycpO1xuICBjb25zdCB0ZXh0ID0gKGRlZj8uYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0LmluY2x1ZGVzKCdwb25lcicpICYmIHRleHQuaW5jbHVkZXMoJ21hbm8nKSAmJiB0b3AubGVuZ3RoKSB7XG4gICAgY29uc3QgZHJhd24gPSBnYW1lLnNoYXJlZERlY2suc2hpZnQoKTtcbiAgICBpZiAoZHJhd24pIGdhbWUucGxheWVyc1tzZWF0XS5oYW5kPy5wdXNoKGRyYXduKTtcbiAgfVxufVxuXG4vLyAtLS0gSW5saW5lIGNsZWFudXAgYWZ0ZXIgY2FyZCBlZmZlY3RzIC0tLVxuXG5mdW5jdGlvbiBpbmxpbmVDbGVhbnVwKGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSwgbG9va3VwOiBDYXJkTG9va3VwIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgY29uc3QgZGVzdHJveWVkID0gZ2FtZS5wbGF5ZXJzW3NdLmJhdHRsZVpvbmUuZmlsdGVyKGMgPT4gYy5jdXJyZW50SHAgPD0gMCk7XG4gICAgZm9yIChjb25zdCBjaCBvZiBkZXN0cm95ZWQpIHtcbiAgICAgIGZpcmVFZmZlY3RzKGdhbWUsIGNoLCAnb25fZGVhdGgnLCBjaC5vd25lcik7XG4gICAgICBhcHBseVBhc3NpdmVDb3N0TW9kaWZpZXJzKGdhbWUucGxheWVyc1tjaC5vd25lcl0sIGNoLmluc3RhbmNlSWQsIG51bGwsIGZhbHNlKTtcbiAgICAgIGlmIChsb29rdXApIHtcbiAgICAgICAgY29uc3QgZGVmID0gbG9va3VwKGNoLmNhcmRJZCk7XG4gICAgICAgIGlmIChkZWYpIHJlc29sdmVDaGFyYWN0ZXJTdHJhdGVneURlYXRoKGdhbWUsIGNoLCBkZWYsIGNoLm93bmVyIGFzIENocmlzdGlhbml0eVNlYXQsIGxvb2t1cCk7XG4gICAgICB9XG4gICAgfVxuICAgIGdhbWUuaGlzdG9yeVpvbmUucHVzaCguLi5kZXN0cm95ZWQubWFwKGMgPT4gYy5jYXJkSWQpKTtcbiAgICBnYW1lLnBsYXllcnNbc10uYmF0dGxlWm9uZSA9IGdhbWUucGxheWVyc1tzXS5iYXR0bGVab25lLmZpbHRlcihjID0+IGMuY3VycmVudEhwID4gMCk7XG4gIH1cbn1cblxuLy8gLS0tIEVmZmVjdCByZXNvbHV0aW9uIChINykgLS0tXG5cbmZ1bmN0aW9uIHJlc29sdmVDYXJkRWZmZWN0KFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBsb29rdXA/OiBDYXJkTG9va3VwXG4pOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJyc7XG4gIHN3aXRjaCAoY2FyZC5zdHJhdGVneSkge1xuICAgIGNhc2UgJ2RpcmVjdGRhbWFnZSc6XG4gICAgICBlZmZlY3REaXJlY3REYW1hZ2UoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXN0b3JlJzpcbiAgICAgIGVmZmVjdFJlc3RvcmUoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkcmF3JzpcbiAgICAgIGVmZmVjdERyYXcoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkaXNjYXJkJzpcbiAgICAgIGVmZmVjdERpc2NhcmQoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdidWZmJzpcbiAgICAgIGVmZmVjdEJ1ZmYoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkZXN0cm95JzpcbiAgICAgIGVmZmVjdERlc3Ryb3lDYXJkKGdhbWUsIGNhcmQsIHRleHQsIHNlYXQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgIGVmZmVjdFNlYXJjaChnYW1lLCBjYXJkLCB0ZXh0LCBzZWF0LCBsb29rdXApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGVja3BlZWsnOlxuICAgICAgZWZmZWN0RGVja3BlZWsoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCwgbG9va3VwKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21pbmRjb250cm9sJzpcbiAgICAgIGVmZmVjdE1pbmRjb250cm9sKGdhbWUsIGNhcmQsIHRleHQsIHNlYXQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmV2ZWFsJzpcbiAgICAgIGVmZmVjdFJldmVhbChnYW1lLCBjYXJkLCB0ZXh0LCBzZWF0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjY2VsZXJhdGUnOlxuICAgICAgZWZmZWN0QWNjZWxlcmF0ZShnYW1lLCBjYXJkLCB0ZXh0LCBzZWF0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Nsb3dkb3duJzpcbiAgICAgIGVmZmVjdFNsb3dkb3duKGdhbWUsIGNhcmQsIHRleHQsIHNlYXQpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZWZmZWN0RGlyZWN0RGFtYWdlKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICBjb25zdCBvcHBvbmVudCA9IG9wcG9uZW50U2VhdChzZWF0KTtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGxldCBkbWc6IG51bWJlcjtcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCd0YW50b3MnKSkge1xuICAgIGRtZyA9IGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICBkbWcgPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCk7XG4gIH1cbiAgaWYgKGRtZyA8PSAwKSByZXR1cm47XG4gIGdhbWUucGxheWVyc1tvcHBvbmVudF0ubGVhZGVySHAgPSBNYXRoLm1heCgwLCBnYW1lLnBsYXllcnNbb3Bwb25lbnRdLmxlYWRlckhwIC0gZG1nKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0UmVzdG9yZShcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG4gPSBNYXRoLm1heCgxLCBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMSk7XG4gIGlmIChsb3dlci5pbmNsdWRlcygnbG9zIGzDrWRlcmVzJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2xvcyBsaWRlcmVzJykpIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgWydQMScsICdQMiddIGFzIENocmlzdGlhbml0eVNlYXRbXSkge1xuICAgICAgY29uc3QgcCA9IGdhbWUucGxheWVyc1tzXTtcbiAgICAgIHAubGVhZGVySHAgPSBNYXRoLm1pbihwLmxlYWRlck1heEhwLCBwLmxlYWRlckhwICsgbik7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3R1cyBwZXJzb25hamVzJykgfHwgbG93ZXIuaW5jbHVkZXMoJ3BlcnNvbmFqZXMgZW4ganVlZ28nKSkge1xuICAgIGZvciAoY29uc3QgY2ggb2YgZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUpIHtcbiAgICAgIGNoLmN1cnJlbnRIcCA9IE1hdGgubWluKGNoLm1heEhwLCBjaC5jdXJyZW50SHAgKyBuKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChcbiAgICBsb3dlci5pbmNsdWRlcygnZGVsIGzDrWRlcicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2FsIGzDrWRlcicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2RlbCBsaWRlcicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2FsIGxpZGVyJylcbiAgKSB7XG4gICAgY29uc3QgcCA9IGdhbWUucGxheWVyc1tzZWF0XTtcbiAgICBwLmxlYWRlckhwID0gTWF0aC5taW4ocC5sZWFkZXJNYXhIcCwgcC5sZWFkZXJIcCArIG4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdERyYXcoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHRleHQ6IHN0cmluZyxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2xvcyBqdWdhZG9yZXMnKSkge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGRyYXdDYXJkRm9yKGdhbWUsICdQMScpO1xuICAgICAgZHJhd0NhcmRGb3IoZ2FtZSwgJ1AyJyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3BvciBjYWRhIHBlcnNvbmFqZSBvcG9uZW50ZScpKSB7XG4gICAgY29uc3QgbiA9IGdhbWUucGxheWVyc1tvcHBvbmVudFNlYXQoc2VhdCldLmJhdHRsZVpvbmUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBkcmF3Q2FyZEZvcihnYW1lLCBzZWF0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbiA9IE1hdGgubWF4KDEsIHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIGRyYXdDYXJkRm9yKGdhbWUsIHNlYXQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3REaXNjYXJkKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICBjb25zdCBsb3dlciA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgb3Bwb25lbnQgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG4gIGlmIChcbiAgICBsb3dlci5pbmNsdWRlcygnYW1ib3MganVnYWRvcmVzIGRlc2NhcnRhbiBzdSBtYW5vJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnbG9zIGp1Z2Fkb3JlcyBkZXNjYXJ0YW4gc3UgbWFubycpXG4gICkge1xuICAgIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgICBjb25zdCBwID0gZ2FtZS5wbGF5ZXJzW3NdO1xuICAgICAgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKC4uLihwLmhhbmQgPz8gW10pKTtcbiAgICAgIHAuaGFuZCA9IFtdO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKFxuICAgIChsb3dlci5pbmNsdWRlcygnb3BvbmVudGUnKSAmJiBsb3dlci5pbmNsdWRlcygnYXphcicpKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCd0dSBvcG9uZW50ZSBkZXNjYXJ0YScpXG4gICkge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMSk7XG4gICAgY29uc3Qgb3AgPSBnYW1lLnBsYXllcnNbb3Bwb25lbnRdO1xuICAgIGNvbnN0IGhhbmQgPSBvcC5oYW5kID8/IFtdO1xuICAgIGxldCBzZWVkID0gZ2FtZS5yZXZpc2lvbiAqIDMxICsgZ2FtZS50dXJuQ291bnQgKiA3O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbiAmJiBoYW5kLmxlbmd0aCA+IDA7IGkrKykge1xuICAgICAgc2VlZCA9IChzZWVkICogMTY2NDUyNSArIDEwMTM5MDQyMjMpICYgMHhmZmZmZmZmZjtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguYWJzKHNlZWQpICUgaGFuZC5sZW5ndGg7XG4gICAgICBnYW1lLmhpc3Rvcnlab25lLnB1c2goaGFuZFtpZHhdKTtcbiAgICAgIGhhbmQuc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuICAgIG9wLmhhbmQgPSBoYW5kO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdEJ1ZmYoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHRleHQ6IHN0cmluZyxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gIGNvbnN0IGlzQXRrID0gbG93ZXIuaW5jbHVkZXMoJ2F0YXF1ZScpO1xuICBjb25zdCBpc0xpZmUgPSBsb3dlci5pbmNsdWRlcygndmlkYScpO1xuICBjb25zdCBpc1R1cm4gPSBsb3dlci5pbmNsdWRlcygnZmluYWwgZGVsIHR1cm5vJyk7XG5cbiAgY29uc3QgYXBwbHlCdWZmID0gKGNoOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSkgPT4ge1xuICAgIGlmIChpc0F0aykge1xuICAgICAgaWYgKGlzVHVybikgY2guY29tYmF0QXR0YWNrQnVmZiA9IChjaC5jb21iYXRBdHRhY2tCdWZmID8/IDApICsgbjtcbiAgICAgIGVsc2UgY2guYXR0YWNrICs9IG47XG4gICAgfVxuICAgIGlmIChpc0xpZmUpIHtcbiAgICAgIGNoLmN1cnJlbnRIcCArPSBuO1xuICAgICAgY2gubWF4SHAgKz0gbjtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCd0dXMgcGVyc29uYWplcycpIHx8IGxvd2VyLmluY2x1ZGVzKCdsb3MgcGVyc29uYWplcyBlbiBqdWVnbyBqdW50bycpKSB7XG4gICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUuZm9yRWFjaChhcHBseUJ1ZmYpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VuIHBlcnNvbmFqZSBlbiBqdWVnbycpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VubyBkZSB0dXMgcGVyc29uYWplcycpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJzEgcGVyc29uYWplJylcbiAgKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbG93ZXIuaW5jbHVkZXMoJ29wb25lbnRlJylcbiAgICAgID8gcGlja01vc3RWdWxuZXJhYmxlKGdhbWUucGxheWVyc1tvcHBvbmVudFNlYXQoc2VhdCldLmJhdHRsZVpvbmUpXG4gICAgICA6IHBpY2tCZXN0RnJpZW5kbHkoZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIGFwcGx5QnVmZih0YXJnZXQpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBGYWxsYmFjazogYnVmZiBhbGwgb3duXG4gIGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmZvckVhY2goYXBwbHlCdWZmKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0RGVzdHJveUNhcmQoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHRleHQ6IHN0cmluZyxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHAgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG5cbiAgLy8gXCJCYXJhamEgYSB0b2RvcyBwZXJzb25hamVzIGVuIGp1ZWdvXCIgLyBcImRlc3RydXllIHRvZG9zXCJcbiAgaWYgKFxuICAgIGxvd2VyLmluY2x1ZGVzKCd0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnbycpIHx8XG4gICAgKGxvd2VyLmluY2x1ZGVzKCd0b2RvcycpICYmIGxvd2VyLmluY2x1ZGVzKCdwZXJzb25hamVzJykpXG4gICkge1xuICAgIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgICBnYW1lLnBsYXllcnNbc10uYmF0dGxlWm9uZS5mb3JFYWNoKGMgPT4gKGMuY3VycmVudEhwID0gMCkpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkxvcyBqdWdhZG9yZXMgZWxpZ2VuIHVubyBkZSBzdXMgcGVyc29uYWplc1wiIC0gZXZlcnlvbmUga2VlcHMgb25lXG4gIGlmIChsb3dlci5pbmNsdWRlcygnbG9zIGp1Z2Fkb3JlcyBlbGlnZW4gdW5vJykpIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgWydQMScsICdQMiddIGFzIENocmlzdGlhbml0eVNlYXRbXSkge1xuICAgICAgY29uc3Qgem9uZSA9IGdhbWUucGxheWVyc1tzXS5iYXR0bGVab25lO1xuICAgICAgaWYgKHpvbmUubGVuZ3RoIDw9IDEpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2VlcGVyID0gcGlja0Jlc3RGcmllbmRseSh6b25lKTtcbiAgICAgIHpvbmUuZm9yRWFjaChjID0+IHtcbiAgICAgICAgaWYgKGMuaW5zdGFuY2VJZCAhPT0ga2VlcGVyPy5pbnN0YW5jZUlkKSBjLmN1cnJlbnRIcCA9IDA7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gXCJMb3MganVnYWRvcmVzIGVtcGFyZWphbiBkZSBpenF1aWVyZGEgYSBkZXJlY2hhIGxvcyBwZXJzb25hamVzIGVuIGp1ZWdvLiBTZSBhdGFjYW4gZW50cmUgc8OtLlwiXG4gIGlmIChcbiAgICBsb3dlci5pbmNsdWRlcygnZW1wYXJlamFuJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnYXRhY2FuIGVudHJlIHPDrScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2F0YWNhbiBlbnRyZSBzaScpXG4gICkge1xuICAgIGNvbnN0IHAxID0gZ2FtZS5wbGF5ZXJzLlAxLmJhdHRsZVpvbmU7XG4gICAgY29uc3QgcDIgPSBnYW1lLnBsYXllcnMuUDIuYmF0dGxlWm9uZTtcbiAgICBjb25zdCBwYWlycyA9IE1hdGgubWluKHAxLmxlbmd0aCwgcDIubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhaXJzOyBpKyspIHtcbiAgICAgIGNvbnN0IGEgPSBwMVtpXTtcbiAgICAgIGNvbnN0IGIgPSBwMltpXTtcbiAgICAgIGNvbnN0IGFBdGsgPSBhLmF0dGFjaztcbiAgICAgIGEuY3VycmVudEhwID0gTWF0aC5tYXgoMCwgYS5jdXJyZW50SHAgLSBiLmF0dGFjayk7XG4gICAgICBiLmN1cnJlbnRIcCA9IE1hdGgubWF4KDAsIGIuY3VycmVudEhwIC0gYUF0ayk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwiSW5mbGlnZSBOIHB1bnRvcyBkZSBkYcOxbyBhIHVuIHBlcnNvbmFqZSBvcG9uZW50ZSBlbiBqdWVnb1wiXG4gIGlmIChsb3dlci5pbmNsdWRlcygnaW5mbGlnZScpICYmIGxvd2VyLmluY2x1ZGVzKCdkYcOxbycpICYmIGxvd2VyLmluY2x1ZGVzKCdvcG9uZW50ZScpKSB7XG4gICAgY29uc3QgZG1nID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgY29uc3QgdGFyZ2V0ID0gcGlja01vc3RWdWxuZXJhYmxlKGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jdXJyZW50SHAgPSBNYXRoLm1heCgwLCB0YXJnZXQuY3VycmVudEhwIC0gZG1nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkJhcmFqYSB1biBwZXJzb25hamUgb3BvbmVudGUgZW4ganVlZ29cIiAoYm91bmNlKVxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2JhcmFqYScpICYmIGxvd2VyLmluY2x1ZGVzKCdvcG9uZW50ZScpKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gcGlja01vc3REYW5nZXJvdXMoZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSk7XG4gICAgaWYgKHRhcmdldCkgYm91bmNlQ2hhcmFjdGVyVG9EZWNrKGdhbWUsIHRhcmdldCwgb3BwKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkRlc3RydXllIHVuIHBlcnNvbmFqZSBvcG9uZW50ZSBlbiBqdWVnb1wiXG4gIGlmIChsb3dlci5pbmNsdWRlcygnZGVzdHJ1eWUnKSAmJiBsb3dlci5pbmNsdWRlcygnb3BvbmVudGUnKSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHBpY2tNb3N0RGFuZ2Vyb3VzKGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jdXJyZW50SHAgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwiTGFuemEgMSBtb25lZGEuIFNpIHNhbGUgY2FyYSwgZGVzdHJ1eWUgMSBwZXJzb25hamUgZGUgdHUgb3BvbmVudGVcIlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2xhbnphJykgJiYgbG93ZXIuaW5jbHVkZXMoJ21vbmVkYScpKSB7XG4gICAgaWYgKGNvaW5GbGlwKGdhbWUpKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBwaWNrTW9zdERhbmdlcm91cyhnYW1lLnBsYXllcnNbb3BwXS5iYXR0bGVab25lKTtcbiAgICAgIGlmICh0YXJnZXQpIHRhcmdldC5jdXJyZW50SHAgPSAwO1xuICAgIH0gZWxzZSBpZiAobG93ZXIuaW5jbHVkZXMoJ3NpIHNhbGUgY3J1eicpICYmIGxvd2VyLmluY2x1ZGVzKCd0dSBvcG9uZW50ZScpKSB7XG4gICAgICAvLyBvcHBvbmVudCBib3VuY2VzL2Rlc3Ryb3lzIG9uZSBvZiB0aGVpciBvd25cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gXCJJbmZsaWdlIDEgcHVudG8gZGUgZGHDsW8gYSB0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnb1wiIChlLmcuIHBsYWd1ZSBldmVudHMpXG4gIGlmIChsb3dlci5pbmNsdWRlcygnaW5mbGlnZScpICYmIGxvd2VyLmluY2x1ZGVzKCd0b2RvcyBsb3MgcGVyc29uYWplcycpKSB7XG4gICAgY29uc3QgZG1nID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgZm9yIChjb25zdCBzIG9mIFsnUDEnLCAnUDInXSBhcyBDaHJpc3RpYW5pdHlTZWF0W10pIHtcbiAgICAgIGdhbWUucGxheWVyc1tzXS5iYXR0bGVab25lLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGMuY3VycmVudEhwID0gTWF0aC5tYXgoMCwgYy5jdXJyZW50SHAgLSBkbWcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwiRGVzdHJ1eWUgTiBkZSB0dXMgY2FydGFzIGRlIG9mcmVuZGFcIlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3R1cyBjYXJ0YXMgZGUgb2ZyZW5kYScpICYmIGxvd2VyLmluY2x1ZGVzKCdkZXN0cnV5ZScpKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgIGdhbWUucGxheWVyc1tzZWF0XS5vZmZlcmluZ3MgPSBnYW1lLnBsYXllcnNbc2VhdF0ub2ZmZXJpbmdzLnNsaWNlKG4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdFNlYXJjaChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBsb29rdXA6IENhcmRMb29rdXAgfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBjb25zdCBsb3dlciA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdHlwZU1hcDogQXJyYXk8W3N0cmluZywgQ2hyaXN0aWFuaXR5Q2FyZFR5cGVdPiA9IFtcbiAgICBbJ3BlcnNvbmFqZScsICdjaGFyYWN0ZXInXSxcbiAgICBbJ2hlcnJhbWllbnRhJywgJ3Rvb2wnXSxcbiAgICBbJ3NhYmlkdXLDrWEnLCAnd2lzZG9tJ10sXG4gICAgWydzYWJpZHVyaWEnLCAnd2lzZG9tJ10sXG4gICAgWydldmVudG8nLCAnZXZlbnQnXSxcbiAgICBbJ2FjY2nDs24nLCAnYWN0aW9uJ10sXG4gICAgWydhY2Npb24nLCAnYWN0aW9uJ10sXG4gICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgWydsdWdhcicsICdwbGFjZSddLFxuICBdO1xuICBjb25zdCBwb3dlciA9IGxvd2VyLmluY2x1ZGVzKCdwb2RlciBkZXN0YWNhZG8nKVxuICAgID8gJ2ZlYXR1cmVkJ1xuICAgIDogbG93ZXIuaW5jbHVkZXMoJ3BvZGVyIG5vcm1hbCcpXG4gICAgICA/ICdub3JtYWwnXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IGxvd2VyLmluY2x1ZGVzKCdkb3MgY2FydGFzJykgfHwgbG93ZXIuaW5jbHVkZXMoJzIgY2FydGFzJykgPyAyIDogMTtcbiAgY29uc3QgcHV0SW5QbGF5ID1cbiAgICBsb3dlci5pbmNsdWRlcygncG9ubGEgZW4ganVlZ28nKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCdqdcOpZ2FsYScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2p1ZWdhbGEnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCdzaW4gY29zdG8nKTtcblxuICAvLyBEaXNjYXJkIGNvc3RcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdkZXNjYXJ0YSBkb3MgY2FydGFzJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2Rlc2NhcnRhcyBkb3MgY2FydGFzJykpIHtcbiAgICBjb25zdCBoYW5kID0gZ2FtZS5wbGF5ZXJzW3NlYXRdLmhhbmQgPz8gW107XG4gICAgY29uc3Qgc2VlZCA9IGdhbWVTZWVkKGdhbWUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oMiwgaGFuZC5sZW5ndGgpOyBpKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IHBzZXVkb1JhbmRJbmRleChoYW5kLmxlbmd0aCAtIGksIHNlZWQgKyBpKTtcbiAgICAgIGdhbWUuaGlzdG9yeVpvbmUucHVzaChoYW5kLnNwbGljZShpZHgsIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB0eXBlXSBvZiB0eXBlTWFwKSB7XG4gICAgaWYgKCFsb3dlci5pbmNsdWRlcyhrZXl3b3JkKSkgY29udGludWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHNlYXJjaERlY2tGb3JDYXJkKFxuICAgICAgICBnYW1lLFxuICAgICAgICBzZWF0LFxuICAgICAgICBkZWYgPT4gZGVmLnR5cGUgPT09IHR5cGUgJiYgKCFwb3dlciB8fCBkZWYucG93ZXIgPT09IHBvd2VyKSxcbiAgICAgICAgbG9va3VwLFxuICAgICAgICBwdXRJblBsYXlcbiAgICAgICk7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdERlY2twZWVrKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGxvb2t1cDogQ2FyZExvb2t1cCB8IHVuZGVmaW5lZFxuKTogdm9pZCB7XG4gIGNvbnN0IG4gPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMztcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHRvcCA9IGdhbWUuc2hhcmVkRGVjay5zbGljZSgwLCBuKTtcbiAgaWYgKCF0b3AubGVuZ3RoKSByZXR1cm47XG5cbiAgLy8gXCJwb25lciBlbiBqdWVnbyB0b2RhcyBsYXMgY2FydGFzIGRlIG9mcmVuZGEgZGUgcG9kZXIgbm9ybWFsXCIgZnJvbSB0b3AgTlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3BvbmVyIGVuIGp1ZWdvJykgJiYgbG93ZXIuaW5jbHVkZXMoJ29mcmVuZGEnKSAmJiBsb29rdXApIHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRvcCkge1xuICAgICAgY29uc3QgZGVmID0gbG9va3VwKGlkKTtcbiAgICAgIGlmIChkZWY/LnR5cGUgPT09ICdvZmZlcmluZycpIHtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLm9mZmVyaW5ncy5wdXNoKHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiBgJHtzZWF0LnRvTG93ZXJDYXNlKCl9X2RwXyR7Z2FtZS5yZXZpc2lvbn1fJHtpZH1gLFxuICAgICAgICAgIGNhcmRJZDogaWQsXG4gICAgICAgICAgbmFtZTogZGVmLm5hbWUsXG4gICAgICAgICAgb3duZXI6IHNlYXQsXG4gICAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGRlZi5vZmZlcmluZ1ZhbHVlID8/IDEsXG4gICAgICAgIH0pO1xuICAgICAgICBnYW1lLnNoYXJlZERlY2suc3BsaWNlKGdhbWUuc2hhcmVkRGVjay5pbmRleE9mKGlkKSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwibW9zdHJhciB1bmEgY2FydGEgZGUgWCBxdWUgZW5jdWVudHJlcyB5IHBvbmVybGEgZW4gdHUgbWFub1wiXG4gIGlmIChsb3dlci5pbmNsdWRlcygnbW9zdHJhcicpICYmIGxvd2VyLmluY2x1ZGVzKCdtYW5vJykgJiYgbG9va3VwKSB7XG4gICAgY29uc3QgdHlwZU1hcDogQXJyYXk8W3N0cmluZywgQ2hyaXN0aWFuaXR5Q2FyZFR5cGVdPiA9IFtcbiAgICAgIFsnaGVycmFtaWVudGEnLCAndG9vbCddLFxuICAgICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgICBbJ3NhYmlkdXLDrWEnLCAnd2lzZG9tJ10sXG4gICAgICBbJ3NhYmlkdXJpYScsICd3aXNkb20nXSxcbiAgICAgIFsncGVyc29uYWplJywgJ2NoYXJhY3RlciddLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdHlwZV0gb2YgdHlwZU1hcCkge1xuICAgICAgaWYgKCFsb3dlci5pbmNsdWRlcyhrZXl3b3JkKSkgY29udGludWU7XG4gICAgICBjb25zdCBmb3VuZCA9IHRvcC5maW5kKGlkID0+IGxvb2t1cChpZCk/LnR5cGUgPT09IHR5cGUpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGdhbWUuc2hhcmVkRGVjay5zcGxpY2UoZ2FtZS5zaGFyZWREZWNrLmluZGV4T2YoZm91bmQpLCAxKTtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmhhbmQ/LnB1c2goZm91bmQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gXCJwb25lciBlbiB0dSBtYW5vXCIgZmlyc3QgY2FyZFxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3BvbmVyJykgJiYgbG93ZXIuaW5jbHVkZXMoJ21hbm8nKSAmJiAhbG93ZXIuaW5jbHVkZXMoJ21vc3RyYXInKSkge1xuICAgIGNvbnN0IGRyYXduID0gZ2FtZS5zaGFyZWREZWNrLnNoaWZ0KCk7XG4gICAgaWYgKGRyYXduKSBnYW1lLnBsYXllcnNbc2VhdF0uaGFuZD8ucHVzaChkcmF3bik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVvcmRlciByZW1haW5pbmcgdG9wIGNhcmRzIG9wdGltYWxseSAoaGlnaGVzdCBjb3N0IGZpcnN0KVxuICBjb25zdCByZW1haW5pbmcgPSBnYW1lLnNoYXJlZERlY2suc2xpY2UoMCwgbik7XG4gIGlmIChsb29rdXApIHtcbiAgICByZW1haW5pbmcuc29ydCgoYSwgYikgPT4gKGxvb2t1cChiKT8uY29zdCA/PyAwKSAtIChsb29rdXAoYSk/LmNvc3QgPz8gMCkpO1xuICAgIGdhbWUuc2hhcmVkRGVjay5zcGxpY2UoMCwgbiwgLi4ucmVtYWluaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlZmZlY3RNaW5kY29udHJvbChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wcCA9IG9wcG9uZW50U2VhdChzZWF0KTtcblxuICAvLyBcIkxvcyBqdWdhZG9yZXMgaW50ZXJjYW1iaWFuIHN1cyBwZXJzb25hamVzIGVuIGp1ZWdvXCJcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdpbnRlcmNhbWJpYW4gc3VzIHBlcnNvbmFqZXMnKSkge1xuICAgIGNvbnN0IHAxem9uZSA9IFsuLi5nYW1lLnBsYXllcnMuUDEuYmF0dGxlWm9uZV07XG4gICAgY29uc3QgcDJ6b25lID0gWy4uLmdhbWUucGxheWVycy5QMi5iYXR0bGVab25lXTtcbiAgICBnYW1lLnBsYXllcnMuUDEuYmF0dGxlWm9uZSA9IHAyem9uZS5tYXAoYyA9PiAoeyAuLi5jLCBjb250cm9sbGVyOiAnUDEnIH0pKTtcbiAgICBnYW1lLnBsYXllcnMuUDIuYmF0dGxlWm9uZSA9IHAxem9uZS5tYXAoYyA9PiAoeyAuLi5jLCBjb250cm9sbGVyOiAnUDInIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkxvcyBqdWdhZG9yZXMgaW50ZXJjYW1iaWFuIHN1IG1hbm9cIlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2ludGVyY2FtYmlhbiBzdSBtYW5vJykpIHtcbiAgICBjb25zdCBoMSA9IGdhbWUucGxheWVycy5QMS5oYW5kID8/IFtdO1xuICAgIGNvbnN0IGgyID0gZ2FtZS5wbGF5ZXJzLlAyLmhhbmQgPz8gW107XG4gICAgZ2FtZS5wbGF5ZXJzLlAxLmhhbmQgPSBoMjtcbiAgICBnYW1lLnBsYXllcnMuUDIuaGFuZCA9IGgxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdlbmVyaWMgXCJwb24gdW4gcGVyc29uYWplIG9wb25lbnRlXCIgc3RlYWxcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwZXJzb25hamUgb3BvbmVudGUnKSAmJiBsb3dlci5pbmNsdWRlcygncG9uJykpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwaWNrTW9zdFZ1bG5lcmFibGUoZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSk7XG4gICAgaWYgKHRhcmdldCkgc3RlYWxDaGFyYWN0ZXIoZ2FtZSwgdGFyZ2V0LCBvcHAsIHNlYXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdFJldmVhbChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wcCA9IG9wcG9uZW50U2VhdChzZWF0KTtcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCd0dSBvcG9uZW50ZSBtdWVzdHJhIHN1IG1hbm8nKSB8fCBsb3dlci5pbmNsdWRlcygnb3BvbmVudGUgbXVlc3RyYSBzdSBtYW5vJykpIHtcbiAgICBnYW1lLnBsYXllcnNbb3BwXS5oYW5kUmV2ZWFsZWQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGxvd2VyLmluY2x1ZGVzKCdqdWdhZG9yZXMganVlZ2FuIGNvbiBzdSBtYW5vJykpIHtcbiAgICBnYW1lLnBsYXllcnMuUDEuaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICBnYW1lLnBsYXllcnMuUDIuaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlZmZlY3RBY2NlbGVyYXRlKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICAvLyBBY3Rpb24vZXZlbnQtbGV2ZWwgYWNjZWxlcmF0ZTogZ2l2ZSB0ZW1wb3Jhcnkgb2ZmZXJpbmdzXG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gIGlmIChsb3dlci5pbmNsdWRlcygnZ2VuZXJhJykgJiYgbG93ZXIuaW5jbHVkZXMoJ29mcmVuZGEnKSkge1xuICAgIGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPVxuICAgICAgKGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPz8gMCkgKyBuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdFNsb3dkb3duKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICAvLyBBY3Rpb24tbGV2ZWwgc2xvd2Rvd246IHJldHVybiBhIGNoYXJhY3RlciB0byBoYW5kXG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHAgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG4gIGlmIChsb3dlci5pbmNsdWRlcygnZGV2dWVsdmUnKSAmJiBsb3dlci5pbmNsdWRlcygncGVyc29uYWplJykgJiYgbG93ZXIuaW5jbHVkZXMoJ21hbm8nKSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHBpY2tNb3N0RGFuZ2Vyb3VzKGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUgPSBnYW1lLnBsYXllcnNbb3BwXS5iYXR0bGVab25lLmZpbHRlcihcbiAgICAgICAgYyA9PiBjLmluc3RhbmNlSWQgIT09IHRhcmdldC5pbnN0YW5jZUlkXG4gICAgICApO1xuICAgICAgZ2FtZS5wbGF5ZXJzW29wcF0uaGFuZD8ucHVzaCh0YXJnZXQuY2FyZElkKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZHJhd0NhcmRGb3IoZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLCBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0KTogdm9pZCB7XG4gIGNvbnN0IGNhcmQgPSBnYW1lLnNoYXJlZERlY2suc2hpZnQoKTtcbiAgaWYgKCFjYXJkKSByZXR1cm47XG4gIGNvbnN0IHAgPSBnYW1lLnBsYXllcnNbc2VhdF07XG4gIGlmIChwLmhhbmQpIHAuaGFuZC5wdXNoKGNhcmQpO1xuICBlbHNlIHAuaGFuZENvdW50ID0gKHAuaGFuZENvdW50ID8/IDApICsgMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIHVuOiAxLFxuICAgIHVuYTogMSxcbiAgICB1bm86IDEsXG4gICAgZG9zOiAyLFxuICAgIHRyZXM6IDMsXG4gICAgY3VhdHJvOiA0LFxuICAgIGNpbmNvOiA1LFxuICAgIHNlaXM6IDYsXG4gICAgc2lldGU6IDcsXG4gICAgb2NobzogOCxcbiAgICBudWV2ZTogOSxcbiAgICBkaWV6OiAxMCxcbiAgfTtcbiAgY29uc3QgZGlnaXRNYXRjaCA9IHRleHQubWF0Y2goL1xcYihcXGQrKVxcYi8pO1xuICBpZiAoZGlnaXRNYXRjaCkgcmV0dXJuIHBhcnNlSW50KGRpZ2l0TWF0Y2hbMV0sIDEwKTtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGZvciAoY29uc3QgW3dvcmQsIG5dIG9mIE9iamVjdC5lbnRyaWVzKHdvcmRzKSkge1xuICAgIGlmIChuZXcgUmVnRXhwKGBcXFxcYiR7d29yZH1cXFxcYmApLnRlc3QobG93ZXIpKSByZXR1cm4gbjtcbiAgfVxuICByZXR1cm4gMDtcbn1cbiJdfQ==