valtech-components 4.0.936 → 4.0.938

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 (53) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +3 -3
  2. package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +1 -381
  3. package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
  4. package/esm2022/lib/version.mjs +2 -2
  5. package/esm2022/public-api.mjs +1 -3
  6. package/fesm2022/valtech-components.mjs +138 -7459
  7. package/fesm2022/valtech-components.mjs.map +1 -1
  8. package/lib/components/organisms/mini-games/types.d.ts +0 -182
  9. package/lib/version.d.ts +1 -1
  10. package/package.json +1 -1
  11. package/public-api.d.ts +0 -2
  12. package/src/lib/assets/games/README.md +8 -0
  13. package/esm2022/lib/components/organisms/mini-games/christianity-bot.mjs +0 -94
  14. package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +0 -503
  15. package/esm2022/lib/components/organisms/mini-games/christianity-catalog.mjs +0 -247
  16. package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -4580
  17. package/esm2022/lib/components/organisms/mini-games/christianity-rules.mjs +0 -1383
  18. package/esm2022/lib/components/organisms/mini-games/christianity-tutorial.mjs +0 -152
  19. package/lib/components/organisms/mini-games/christianity-bot.d.ts +0 -15
  20. package/lib/components/organisms/mini-games/christianity-card.component.d.ts +0 -55
  21. package/lib/components/organisms/mini-games/christianity-catalog.d.ts +0 -18
  22. package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -395
  23. package/lib/components/organisms/mini-games/christianity-rules.d.ts +0 -57
  24. package/lib/components/organisms/mini-games/christianity-tutorial.d.ts +0 -38
  25. package/src/lib/assets/games/christianity/card-symbol.svg +0 -51
  26. package/src/lib/assets/games/christianity/card-template-reference/front.html +0 -114
  27. package/src/lib/assets/games/christianity/card-template-reference/front.style.css +0 -352
  28. package/src/lib/assets/games/christianity/data/01-genesis.bible-reference-suggestions.csv +0 -191
  29. package/src/lib/assets/games/christianity/data/01-genesis.bible-verses.nbv-open.csv +0 -170
  30. package/src/lib/assets/games/christianity/data/01-genesis.cards.csv +0 -281
  31. package/src/lib/assets/games/christianity/data/01-genesis.cards.i18n.csv +0 -281
  32. package/src/lib/assets/games/christianity/data/01-genesis.cards.json +0 -16453
  33. package/src/lib/assets/games/christianity/data/01-genesis.unassigned-effects.csv +0 -49
  34. package/src/lib/assets/games/christianity/data/README.md +0 -40
  35. package/src/lib/assets/games/christianity/data/data-con-habilides.csv +0 -273
  36. package/src/lib/assets/games/christianity/data/habilidades-por-tipo.xlsx +0 -0
  37. package/src/lib/assets/games/christianity/data/listado-edicion.csv +0 -281
  38. package/src/lib/assets/games/christianity/editions/1/cards/.gitkeep +0 -1
  39. package/src/lib/assets/games/christianity/editions/1/cards/PLACEHOLDER.png +0 -0
  40. package/src/lib/assets/games/christianity/editions/README.md +0 -34
  41. package/src/lib/assets/games/christianity/icons/1-icon.png +0 -0
  42. package/src/lib/assets/games/christianity/icons/action.png +0 -0
  43. package/src/lib/assets/games/christianity/icons/character.png +0 -0
  44. package/src/lib/assets/games/christianity/icons/event.png +0 -0
  45. package/src/lib/assets/games/christianity/icons/leader.png +0 -0
  46. package/src/lib/assets/games/christianity/icons/offering.png +0 -0
  47. package/src/lib/assets/games/christianity/icons/place.png +0 -0
  48. package/src/lib/assets/games/christianity/icons/tool.png +0 -0
  49. package/src/lib/assets/games/christianity/icons/wisdom.png +0 -0
  50. package/src/lib/assets/games/christianity/sources/README.md +0 -16
  51. package/src/lib/assets/games/christianity/sources/spaonbv_vpl.txt +0 -29102
  52. package/src/lib/assets/games/christianity/sources/spaonbv_vpl.xml +0 -29104
  53. package/src/lib/assets/games/christianity/spaonbv.txt +0 -52
@@ -44,185 +44,3 @@ export interface BubbleBlitzCell {
44
44
  state?: 'idle' | 'popping' | 'falling' | 'entering';
45
45
  drop?: number;
46
46
  }
47
- export type ChristianitySeat = 'P1' | 'P2';
48
- export type ChristianityGameStatus = 'in_progress' | 'finished';
49
- export type ChristianityGameMode = 'solo_bot' | 'two_player' | 'local_pass';
50
- export type ChristianityCardType = 'action' | 'character' | 'event' | 'leader' | 'offering' | 'place' | 'tool' | 'wisdom';
51
- export type ChristianityCardRarity = 'normal' | 'good' | 'very-good' | 'uncommon' | 'rare' | 'legendary';
52
- export type ChristianityStrategy = 'discard' | 'deckpeek' | 'directdamage' | 'search' | 'aggro' | 'restore' | 'accelerate' | 'slowdown' | 'mindcontrol' | 'destroy' | 'draw' | 'reveal' | 'buff';
53
- export type ChristianityEffectTrigger = 'on_play' | 'on_enter' | 'on_attack' | 'on_defend' | 'on_death' | 'passive';
54
- export type ChristianityEffectTarget = 'self' | 'combat_opponent' | 'all_friendly' | 'all_enemy' | 'opponent_leader' | 'own_leader';
55
- export type ChristianityEffectMutation = {
56
- type: 'buff_attack';
57
- amount: number;
58
- } | {
59
- type: 'buff_life';
60
- amount: number;
61
- } | {
62
- type: 'deal_damage';
63
- amount: number;
64
- } | {
65
- type: 'restore_hp';
66
- amount: number;
67
- } | {
68
- type: 'draw_card';
69
- amount: number;
70
- } | {
71
- type: 'discard_card';
72
- amount: number;
73
- who: 'self' | 'opponent';
74
- } | {
75
- type: 'destroy';
76
- } | {
77
- type: 'gain_offerings';
78
- amount: number;
79
- };
80
- export interface ChristianityCardEffect {
81
- trigger: ChristianityEffectTrigger;
82
- strategy: ChristianityStrategy;
83
- target: ChristianityEffectTarget;
84
- mutation: ChristianityEffectMutation;
85
- condition?: {
86
- targeting: 'character' | 'leader';
87
- } | null;
88
- duration?: 'combat' | 'turn' | 'permanent';
89
- }
90
- export interface ChristianityCardAbility {
91
- name?: string;
92
- text?: string;
93
- }
94
- export interface ChristianityCardTranslation {
95
- name?: string;
96
- fullName?: string;
97
- verseText?: string;
98
- scripture?: string;
99
- abilityName?: string;
100
- abilityText?: string;
101
- abilities?: ChristianityCardAbility[];
102
- }
103
- export interface ChristianityCardBibleReference {
104
- book?: string;
105
- chapter?: number;
106
- reference?: string;
107
- version?: string;
108
- text?: string;
109
- }
110
- export interface ChristianityCardArt {
111
- legend?: string;
112
- size?: number;
113
- positionX?: number;
114
- positionY?: number;
115
- imagePath?: string;
116
- imageUrl?: string;
117
- mimeType?: string;
118
- width?: number;
119
- height?: number;
120
- source?: string;
121
- model?: string;
122
- artistCredit?: string;
123
- promptId?: string;
124
- status?: string;
125
- }
126
- export interface ChristianityCardDefinition {
127
- id: string;
128
- sourceId?: number;
129
- editionNumber?: number;
130
- editionIcon?: string;
131
- name: string;
132
- fullName?: string;
133
- type: ChristianityCardType;
134
- cost?: number;
135
- offeringValue?: number;
136
- attack?: number;
137
- life?: number;
138
- leaderLife?: number;
139
- legacyRestriction?: number;
140
- abilityName?: string;
141
- abilityText?: string;
142
- abilityCost?: number;
143
- abilities?: ChristianityCardAbility[];
144
- strategy?: ChristianityStrategy;
145
- effects?: ChristianityCardEffect[];
146
- power?: string;
147
- bible?: ChristianityCardBibleReference;
148
- art?: ChristianityCardArt;
149
- imageUrl?: string;
150
- verseText?: string;
151
- scripture?: string;
152
- edition?: string;
153
- collectorNumber?: string;
154
- editionSize?: number;
155
- copyCount?: number;
156
- author?: string;
157
- year?: string;
158
- rarity?: ChristianityCardRarity;
159
- frontTemplate?: string;
160
- backTemplate?: string;
161
- i18n?: Record<string, ChristianityCardTranslation>;
162
- status?: string;
163
- sourceNotes?: string;
164
- bibleCredit?: string;
165
- }
166
- export interface ChristianityCharacterInstance {
167
- instanceId: string;
168
- cardId: string;
169
- name: string;
170
- owner: ChristianitySeat;
171
- controller: ChristianitySeat;
172
- slot?: number;
173
- attack: number;
174
- currentHp: number;
175
- maxHp: number;
176
- canAttack: boolean;
177
- equippedTools?: string[];
178
- effects?: ChristianityCardEffect[];
179
- combatAttackBuff?: number;
180
- }
181
- export interface ChristianityOfferingInstance {
182
- instanceId: string;
183
- cardId: string;
184
- name: string;
185
- owner: ChristianitySeat;
186
- ready: boolean;
187
- value: number;
188
- abilityName?: string;
189
- abilityText?: string;
190
- abilityCost?: number;
191
- abilityUsedThisTurn?: boolean;
192
- }
193
- export interface ChristianityPlayerState {
194
- seat: ChristianitySeat;
195
- displayName: string;
196
- avatar?: string;
197
- avatarColor?: string;
198
- leaderCardId?: string;
199
- leaderName: string;
200
- leaderHp: number;
201
- leaderMaxHp: number;
202
- offerings: ChristianityOfferingInstance[];
203
- temporaryOfferingReserve?: number;
204
- offeringPlayedThisTurn: boolean;
205
- hand?: string[];
206
- handCount?: number;
207
- battleZone: ChristianityCharacterInstance[];
208
- costModifiers?: Array<{
209
- sourceId: string;
210
- cardType: ChristianityCardType;
211
- delta: number;
212
- }>;
213
- handRevealed?: boolean;
214
- }
215
- export interface ChristianityGameState {
216
- gameId: string;
217
- status: ChristianityGameStatus;
218
- mode: ChristianityGameMode;
219
- turnOwner: ChristianitySeat;
220
- revision: number;
221
- turnCount: number;
222
- matchScore: Record<ChristianitySeat, number>;
223
- sharedDeck: string[];
224
- placeZone: string[];
225
- historyZone: string[];
226
- players: Record<ChristianitySeat, ChristianityPlayerState>;
227
- log: string[];
228
- }
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "4.0.936";
5
+ export declare const VERSION = "4.0.938";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "4.0.936",
3
+ "version": "4.0.938",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -375,8 +375,6 @@ export * from './lib/components/organisms/member-import-modal/member-import-moda
375
375
  export * from './lib/components/organisms/role-manager/role-manager.component';
376
376
  export * from './lib/components/organisms/role-manager/types';
377
377
  export * from './lib/components/organisms/mini-games/mini-games.i18n';
378
- export * from './lib/components/organisms/mini-games/christianity-rules';
379
- export * from './lib/components/organisms/mini-games/christianity-game.component';
380
378
  export * from './lib/components/organisms/mini-games/bubble-blitz-game.component';
381
379
  export * from './lib/components/organisms/mini-games/memory-game.component';
382
380
  export * from './lib/components/organisms/mini-games/mini-game-callout.component';
@@ -1,5 +1,13 @@
1
1
  # Game Art Assets
2
2
 
3
+ > **Nota (2026-08-23):** esta carpeta ya no guarda arte de ningun juego. El de
4
+ > Chessimals vive en `frontend/chessimals/src/assets`, y el de Christianity en
5
+ > `frontend/christianity/src/assets`, cada uno en su propio proyecto. La
6
+ > libreria la consumen todas las apps del factory: el arte de un producto no
7
+ > puede vivir aca, porque las demas se lo llevan en su build sin usarlo. Esta
8
+ > guia se conserva porque describe el flujo de generacion, que sigue vigente.
9
+
10
+
3
11
  Guia breve para generar, limpiar y guardar arte raster para mini juegos.
4
12
 
5
13
  ## Cuando usar este flujo
@@ -1,94 +0,0 @@
1
- import { canPlayCard, cleanupDestroyed, playCardFromHand as playChristianityCardFromHand, } from './christianity-rules';
2
- export function resolveBotPlays(game, log, nameResolver = c => c.name, cardById = id => ({
3
- id,
4
- name: id,
5
- type: 'character',
6
- cost: 0,
7
- life: 0,
8
- attack: 0,
9
- })) {
10
- const hand = [...(game.players.P2.hand ?? [])];
11
- const offeringId = hand.find(cardId => {
12
- const card = cardById(cardId);
13
- return card.type === 'offering' && canPlayCard(game, 'P2', card);
14
- });
15
- if (offeringId) {
16
- const card = cardById(offeringId);
17
- const result = playChristianityCardFromHand(game, 'P2', card, {
18
- displayName: nameResolver(card),
19
- lookup: id => {
20
- const d = cardById(id);
21
- return d.id === id ? d : null;
22
- },
23
- });
24
- if (result.played) {
25
- Object.assign(game, result.game);
26
- log.push(...result.log);
27
- }
28
- }
29
- // Juega personajes mientras le alcance la reserva y haya slots libres (canPlayCard valida ambos).
30
- // Prioriza el de mayor ataque para presionar el tablero.
31
- for (;;) {
32
- const character = [...(game.players.P2.hand ?? [])]
33
- .map(cardId => cardById(cardId))
34
- .filter(card => card.type === 'character' && canPlayCard(game, 'P2', card))
35
- .sort((l, r) => (r.attack ?? 0) - (l.attack ?? 0) || (r.life ?? 0) - (l.life ?? 0))[0];
36
- if (!character)
37
- break;
38
- const result = playChristianityCardFromHand(game, 'P2', character, {
39
- displayName: nameResolver(character),
40
- lookup: id => {
41
- const d = cardById(id);
42
- return d.id === id ? d : null;
43
- },
44
- });
45
- if (!result.played)
46
- break;
47
- Object.assign(game, result.game);
48
- log.push(...result.log);
49
- }
50
- }
51
- export function resolveBotAttack(game, log, impacts, messages) {
52
- const bot = game.players.P2;
53
- const player = game.players.P1;
54
- // Ataca con TODOS los personajes listos, en orden de slot. El tablero cambia entre
55
- // ataques (mueren personajes), por eso se re-evalúan objetivos en cada iteración.
56
- const attackers = bot.battleZone
57
- .filter(card => card.canAttack && card.attack > 0)
58
- .sort((l, r) => (l.slot ?? 0) - (r.slot ?? 0));
59
- if (!attackers.length) {
60
- log.push(messages.botNoAttackers);
61
- return;
62
- }
63
- for (const attacker of attackers) {
64
- // Puede haber muerto en un combate previo de este mismo turno.
65
- if (attacker.currentHp <= 0 || !attacker.canAttack)
66
- continue;
67
- if (player.leaderHp <= 0)
68
- break;
69
- const defenders = player.battleZone.filter(card => card.currentHp > 0);
70
- if (defenders.length) {
71
- // Prioriza un defensor que pueda matar (el más amenazante entre ellos); si no, el más débil.
72
- const killable = defenders
73
- .filter(d => d.currentHp <= attacker.attack)
74
- .sort((l, r) => r.attack - l.attack || l.currentHp - r.currentHp);
75
- const target = killable[0] ??
76
- [...defenders].sort((l, r) => l.currentHp - r.currentHp || (l.slot ?? 0) - (r.slot ?? 0))[0];
77
- impacts.push({ text: `-${attacker.attack}`, tone: 'damage', seat: 'P1', target: 'battle' });
78
- impacts.push({ text: `-${target.attack}`, tone: 'damage', seat: 'P2', target: 'battle' });
79
- target.currentHp -= attacker.attack;
80
- attacker.currentHp -= target.attack;
81
- attacker.canAttack = false;
82
- log.push(`${attacker.name} ${messages.combatsAgainst} ${target.name}.`);
83
- cleanupDestroyed(player, game);
84
- cleanupDestroyed(bot, game);
85
- continue;
86
- }
87
- // Sin defensores: golpea al líder.
88
- impacts.push({ text: `-${attacker.attack}`, tone: 'damage', seat: 'P1', target: 'leader' });
89
- player.leaderHp = Math.max(0, player.leaderHp - attacker.attack);
90
- attacker.canAttack = false;
91
- log.push(`${attacker.name} ${messages.attacksYourLeader}`);
92
- }
93
- }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LWJvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWluaS1nYW1lcy9jaHJpc3RpYW5pdHktYm90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGdCQUFnQixJQUFJLDRCQUE0QixHQUNqRCxNQUFNLHNCQUFzQixDQUFDO0FBZ0I5QixNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUEyQixFQUMzQixHQUFhLEVBQ2IsZUFBNkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUN4RSxXQUF1RCxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUQsRUFBRTtJQUNGLElBQUksRUFBRSxFQUFFO0lBQ1IsSUFBSSxFQUFFLFdBQVc7SUFDakIsSUFBSSxFQUFFLENBQUM7SUFDUCxJQUFJLEVBQUUsQ0FBQztJQUNQLE1BQU0sRUFBRSxDQUFDO0NBQ1YsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDcEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFH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RUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLCBDaHJpc3RpYW5pdHlHYW1lU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIGNhblBsYXlDYXJkLFxuICBjbGVhbnVwRGVzdHJveWVkLFxuICBwbGF5Q2FyZEZyb21IYW5kIGFzIHBsYXlDaHJpc3RpYW5pdHlDYXJkRnJvbUhhbmQsXG59IGZyb20gJy4vY2hyaXN0aWFuaXR5LXJ1bGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBDaHJpc3RpYW5pdHlCb3RNZXNzYWdlcyB7XG4gIGJvdE5vQXR0YWNrZXJzOiBzdHJpbmc7XG4gIGNvbWJhdHNBZ2FpbnN0OiBzdHJpbmc7XG4gIGF0dGFja3NZb3VyTGVhZGVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hyaXN0aWFuaXR5SW1wYWN0RXZlbnQge1xuICBpZDogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHRvbmU6ICdkYW1hZ2UnIHwgJ2hlYWwnIHwgJ3Jlc291cmNlJztcbiAgc2VhdDogJ1AxJyB8ICdQMic7XG4gIHRhcmdldDogJ2xlYWRlcicgfCAnYmF0dGxlJyB8ICdvZmZlcmluZ3MnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJvdFBsYXlzKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGxvZzogc3RyaW5nW10sXG4gIG5hbWVSZXNvbHZlcjogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmcgPSBjID0+IGMubmFtZSxcbiAgY2FyZEJ5SWQ6IChpZDogc3RyaW5nKSA9PiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiA9IGlkID0+ICh7XG4gICAgaWQsXG4gICAgbmFtZTogaWQsXG4gICAgdHlwZTogJ2NoYXJhY3RlcicsXG4gICAgY29zdDogMCxcbiAgICBsaWZlOiAwLFxuICAgIGF0dGFjazogMCxcbiAgfSlcbik6IHZvaWQge1xuICBjb25zdCBoYW5kID0gWy4uLihnYW1lLnBsYXllcnMuUDIuaGFuZCA/PyBbXSldO1xuXG4gIGNvbnN0IG9mZmVyaW5nSWQgPSBoYW5kLmZpbmQoY2FyZElkID0+IHtcbiAgICBjb25zdCBjYXJkID0gY2FyZEJ5SWQoY2FyZElkKTtcbiAgICByZXR1cm4gY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnICYmIGNhblBsYXlDYXJkKGdhbWUsICdQMicsIGNhcmQpO1xuICB9KTtcbiAgaWYgKG9mZmVyaW5nSWQpIHtcbiAgICBjb25zdCBjYXJkID0gY2FyZEJ5SWQob2ZmZXJpbmdJZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gcGxheUNocmlzdGlhbml0eUNhcmRGcm9tSGFuZChnYW1lLCAnUDInLCBjYXJkLCB7XG4gICAgICBkaXNwbGF5TmFtZTogbmFtZVJlc29sdmVyKGNhcmQpLFxuICAgICAgbG9va3VwOiBpZCA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSBjYXJkQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZCA/IGQgOiBudWxsO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LnBsYXllZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihnYW1lLCByZXN1bHQuZ2FtZSk7XG4gICAgICBsb2cucHVzaCguLi5yZXN1bHQubG9nKTtcbiAgICB9XG4gIH1cblxuICAvLyBKdWVnYSBwZXJzb25hamVzIG1pZW50cmFzIGxlIGFsY2FuY2UgbGEgcmVzZXJ2YSB5IGhheWEgc2xvdHMgbGlicmVzIChjYW5QbGF5Q2FyZCB2YWxpZGEgYW1ib3MpLlxuICAvLyBQcmlvcml6YSBlbCBkZSBtYXlvciBhdGFxdWUgcGFyYSBwcmVzaW9uYXIgZWwgdGFibGVyby5cbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IFsuLi4oZ2FtZS5wbGF5ZXJzLlAyLmhhbmQgPz8gW10pXVxuICAgICAgLm1hcChjYXJkSWQgPT4gY2FyZEJ5SWQoY2FyZElkKSlcbiAgICAgIC5maWx0ZXIoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdjaGFyYWN0ZXInICYmIGNhblBsYXlDYXJkKGdhbWUsICdQMicsIGNhcmQpKVxuICAgICAgLnNvcnQoKGwsIHIpID0+IChyLmF0dGFjayA/PyAwKSAtIChsLmF0dGFjayA/PyAwKSB8fCAoci5saWZlID8/IDApIC0gKGwubGlmZSA/PyAwKSlbMF07XG4gICAgaWYgKCFjaGFyYWN0ZXIpIGJyZWFrO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gcGxheUNocmlzdGlhbml0eUNhcmRGcm9tSGFuZChnYW1lLCAnUDInLCBjaGFyYWN0ZXIsIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBuYW1lUmVzb2x2ZXIoY2hhcmFjdGVyKSxcbiAgICAgIGxvb2t1cDogaWQgPT4ge1xuICAgICAgICBjb25zdCBkID0gY2FyZEJ5SWQoaWQpO1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQgPyBkIDogbnVsbDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQucGxheWVkKSBicmVhaztcbiAgICBPYmplY3QuYXNzaWduKGdhbWUsIHJlc3VsdC5nYW1lKTtcbiAgICBsb2cucHVzaCguLi5yZXN1bHQubG9nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJvdEF0dGFjayhcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBsb2c6IHN0cmluZ1tdLFxuICBpbXBhY3RzOiBBcnJheTxPbWl0PENocmlzdGlhbml0eUltcGFjdEV2ZW50LCAnaWQnPj4sXG4gIG1lc3NhZ2VzOiBDaHJpc3RpYW5pdHlCb3RNZXNzYWdlc1xuKTogdm9pZCB7XG4gIGNvbnN0IGJvdCA9IGdhbWUucGxheWVycy5QMjtcbiAgY29uc3QgcGxheWVyID0gZ2FtZS5wbGF5ZXJzLlAxO1xuXG4gIC8vIEF0YWNhIGNvbiBUT0RPUyBsb3MgcGVyc29uYWplcyBsaXN0b3MsIGVuIG9yZGVuIGRlIHNsb3QuIEVsIHRhYmxlcm8gY2FtYmlhIGVudHJlXG4gIC8vIGF0YXF1ZXMgKG11ZXJlbiBwZXJzb25hamVzKSwgcG9yIGVzbyBzZSByZS1ldmFsw7phbiBvYmpldGl2b3MgZW4gY2FkYSBpdGVyYWNpw7NuLlxuICBjb25zdCBhdHRhY2tlcnMgPSBib3QuYmF0dGxlWm9uZVxuICAgIC5maWx0ZXIoY2FyZCA9PiBjYXJkLmNhbkF0dGFjayAmJiBjYXJkLmF0dGFjayA+IDApXG4gICAgLnNvcnQoKGwsIHIpID0+IChsLnNsb3QgPz8gMCkgLSAoci5zbG90ID8/IDApKTtcblxuICBpZiAoIWF0dGFja2Vycy5sZW5ndGgpIHtcbiAgICBsb2cucHVzaChtZXNzYWdlcy5ib3ROb0F0dGFja2Vycyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBhdHRhY2tlciBvZiBhdHRhY2tlcnMpIHtcbiAgICAvLyBQdWVkZSBoYWJlciBtdWVydG8gZW4gdW4gY29tYmF0ZSBwcmV2aW8gZGUgZXN0ZSBtaXNtbyB0dXJuby5cbiAgICBpZiAoYXR0YWNrZXIuY3VycmVudEhwIDw9IDAgfHwgIWF0dGFja2VyLmNhbkF0dGFjaykgY29udGludWU7XG4gICAgaWYgKHBsYXllci5sZWFkZXJIcCA8PSAwKSBicmVhaztcblxuICAgIGNvbnN0IGRlZmVuZGVycyA9IHBsYXllci5iYXR0bGVab25lLmZpbHRlcihjYXJkID0+IGNhcmQuY3VycmVudEhwID4gMCk7XG5cbiAgICBpZiAoZGVmZW5kZXJzLmxlbmd0aCkge1xuICAgICAgLy8gUHJpb3JpemEgdW4gZGVmZW5zb3IgcXVlIHB1ZWRhIG1hdGFyIChlbCBtw6FzIGFtZW5hemFudGUgZW50cmUgZWxsb3MpOyBzaSBubywgZWwgbcOhcyBkw6liaWwuXG4gICAgICBjb25zdCBraWxsYWJsZSA9IGRlZmVuZGVyc1xuICAgICAgICAuZmlsdGVyKGQgPT4gZC5jdXJyZW50SHAgPD0gYXR0YWNrZXIuYXR0YWNrKVxuICAgICAgICAuc29ydCgobCwgcikgPT4gci5hdHRhY2sgLSBsLmF0dGFjayB8fCBsLmN1cnJlbnRIcCAtIHIuY3VycmVudEhwKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgIGtpbGxhYmxlWzBdID8/XG4gICAgICAgIFsuLi5kZWZlbmRlcnNdLnNvcnQoXG4gICAgICAgICAgKGwsIHIpID0+IGwuY3VycmVudEhwIC0gci5jdXJyZW50SHAgfHwgKGwuc2xvdCA/PyAwKSAtIChyLnNsb3QgPz8gMClcbiAgICAgICAgKVswXTtcblxuICAgICAgaW1wYWN0cy5wdXNoKHsgdGV4dDogYC0ke2F0dGFja2VyLmF0dGFja31gLCB0b25lOiAnZGFtYWdlJywgc2VhdDogJ1AxJywgdGFyZ2V0OiAnYmF0dGxlJyB9KTtcbiAgICAgIGltcGFjdHMucHVzaCh7IHRleHQ6IGAtJHt0YXJnZXQuYXR0YWNrfWAsIHRvbmU6ICdkYW1hZ2UnLCBzZWF0OiAnUDInLCB0YXJnZXQ6ICdiYXR0bGUnIH0pO1xuICAgICAgdGFyZ2V0LmN1cnJlbnRIcCAtPSBhdHRhY2tlci5hdHRhY2s7XG4gICAgICBhdHRhY2tlci5jdXJyZW50SHAgLT0gdGFyZ2V0LmF0dGFjaztcbiAgICAgIGF0dGFja2VyLmNhbkF0dGFjayA9IGZhbHNlO1xuICAgICAgbG9nLnB1c2goYCR7YXR0YWNrZXIubmFtZX0gJHttZXNzYWdlcy5jb21iYXRzQWdhaW5zdH0gJHt0YXJnZXQubmFtZX0uYCk7XG4gICAgICBjbGVhbnVwRGVzdHJveWVkKHBsYXllciwgZ2FtZSk7XG4gICAgICBjbGVhbnVwRGVzdHJveWVkKGJvdCwgZ2FtZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTaW4gZGVmZW5zb3JlczogZ29scGVhIGFsIGzDrWRlci5cbiAgICBpbXBhY3RzLnB1c2goeyB0ZXh0OiBgLSR7YXR0YWNrZXIuYXR0YWNrfWAsIHRvbmU6ICdkYW1hZ2UnLCBzZWF0OiAnUDEnLCB0YXJnZXQ6ICdsZWFkZXInIH0pO1xuICAgIHBsYXllci5sZWFkZXJIcCA9IE1hdGgubWF4KDAsIHBsYXllci5sZWFkZXJIcCAtIGF0dGFja2VyLmF0dGFjayk7XG4gICAgYXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gICAgbG9nLnB1c2goYCR7YXR0YWNrZXIubmFtZX0gJHttZXNzYWdlcy5hdHRhY2tzWW91ckxlYWRlcn1gKTtcbiAgfVxufVxuIl19