@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
99 lines • 17.3 kB
JavaScript
import { CardType, GameTag, Zone } from '@firestone-hs/reference-data';
import { Map } from 'immutable';
import { AttackAction } from '../../models/action/attack-action';
import { DamageAction } from '../../models/action/damage-action';
import { HealingAction } from '../../models/action/healing-action';
import { PowerTargetAction } from '../../models/action/power-target-action';
import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item';
import { ActionButtonUsedAction, CardPlayedFromHandAction, FullEntityHistoryItem, GameHepler, } from '../../models/models';
import { ActionHelper } from './action-helper';
export class DamageParser {
constructor(allCards) {
this.allCards = allCards;
}
applies(item) {
return item instanceof TagChangeHistoryItem && item.tag.tag === GameTag.DAMAGE;
}
parse(item, currentTurn, entitiesBeforeAction, history) {
const entity = entitiesBeforeAction.get(item.tag.entity);
// Damage is reset to 0 after an entity dies, and we don't want to show this
if (!entity || entity.getTag(GameTag.ZONE) !== Zone.PLAY) {
return [];
}
// Ignore damage to locations
if (entity.getTag(GameTag.CARDTYPE) === CardType?.LOCATION) {
return [];
}
const previousDamageTag = entity.getTag(GameTag.DAMAGE);
const previousDamage = !previousDamageTag || previousDamageTag === -1 ? 0 : previousDamageTag;
const damageTaken = item.tag.value - previousDamage;
// If we are in battlegrounds, things are a bit trickier. We don't want to show the
// damage taken by the opponent hero at the start of a battle
const gameEntity = GameHepler.getGameEntity(entitiesBeforeAction);
if (gameEntity.isBattlegrounds()) {
const historyIndex = history.indexOf(item);
if (historyIndex > 0) {
const previous = history[historyIndex - 1];
if (previous instanceof FullEntityHistoryItem &&
previous.entityDefintion.cardID &&
previous.entityDefintion.cardID.indexOf('TB_BaconShop_HP_') !== -1) {
return [];
}
}
}
if (entity.id === 641) {
// console.log('adding damage action', item, damageTaken, previousDamageTag, entity.tags.toJS());
}
if (damageTaken > 0) {
return [
DamageAction.create({
timestamp: item.timestamp,
index: item.index,
damages: Map.of(item.tag.entity, damageTaken),
}, this.allCards),
];
}
else if (damageTaken < 0) {
return [
HealingAction.create({
timestamp: item.timestamp,
index: item.index,
damages: Map.of(item.tag.entity, damageTaken),
}, this.allCards),
];
}
return [];
}
reduce(actions) {
return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current));
}
shouldMergeActions(previousAction, currentAction) {
if (currentAction instanceof DamageAction) {
return (previousAction instanceof DamageAction || // Merge all damages into a single action
previousAction instanceof AttackAction || // Add damage to the attack causing the damage
previousAction instanceof PowerTargetAction || // Add damages to the power causing the damage
previousAction instanceof ActionButtonUsedAction ||
previousAction instanceof CardPlayedFromHandAction // It's usually teh same "action"
);
}
else if (currentAction instanceof HealingAction) {
return (previousAction instanceof HealingAction || // Merge all heals into a single action
previousAction instanceof AttackAction || // Add heal to the attack causing the heal
previousAction instanceof PowerTargetAction || // Add heals to the power causing the heal
previousAction instanceof ActionButtonUsedAction || // Add heals to the power causing the heal
previousAction instanceof CardPlayedFromHandAction // It's usually teh same "action"
);
}
}
mergeActions(previousAction, currentAction) {
return this.mergeDamageIntoAction(previousAction, currentAction);
}
mergeDamageIntoAction(previousAction, currentAction) {
const result = ActionHelper.mergeIntoFirstAction(previousAction, currentAction, {
index: currentAction.index,
entities: currentAction.entities,
});
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFtYWdlLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vZGFtYWdlLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRzVFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3BGLE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUVyQixVQUFVLEdBQ1YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsTUFBTSxPQUFPLFlBQVk7SUFDeEIsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFBRyxDQUFDO0lBRTFDLE9BQU8sQ0FBQyxJQUFpQjtRQUMvQixPQUFPLElBQUksWUFBWSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ2hGLENBQUM7SUFFTSxLQUFLLENBQ1gsSUFBMEIsRUFDMUIsV0FBbUIsRUFDbkIsb0JBQXlDLEVBQ3pDLE9BQStCO1FBRS9CLE1BQU0sTUFBTSxHQUFHLG9CQUFvQixD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O0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGNBQXNCLEVBQUUsYUFBcUI7UUFDdkUsSUFBSSxhQUFhLFlBQVksWUFBWSxFQUFFO1lBQzFDLE9BQU8sQ0FDTixjQUFjLFlBQVksWUFBWSxJQUFJLHlDQUF5QztnQkFDbkYsY0FBYyxZQUFZLFlBQVksSUFBSSw4Q0FBOEM7Z0JBQ3hGLGNBQWMsWUFBWSxpQkFBaUIsSUFBSSw4Q0FBOEM7Z0JBQzdGLGNBQWMsWUFBWSxzQkFBc0I7Z0JBQ2hELGNBQWMsWUFBWSx3QkFBd0IsQ0FBQyxpQ0FBaUM7YUFDcEYsQ0FBQztTQUNGO2FBQU0sSUFBSSxhQUFhLFlBQVksYUFBYSxFQUFFO1lBQ2xELE9BQU8sQ0FDTixjQUFjLFlBQVksYUFBYSxJQUFJLHVDQUF1QztnQkFDbEYsY0FBYyxZQUFZLFlBQVksSUFBSSwwQ0FBMEM7Z0JBQ3BGLGNBQWMsWUFBWSxpQkFBaUIsSUFBSSwwQ0FBMEM7Z0JBQ3pGLGNBQWMsWUFBWSxzQkFBc0IsSUFBSSwwQ0FBMEM7Z0JBQzlGLGNBQWMsWUFBWSx3QkFBd0IsQ0FBQyxpQ0FBaUM7YUFDcEYsQ0FBQztTQUNGO0lBQ0YsQ0FBQztJQUVPLFlBQVksQ0FBQyxjQUFzQixFQUFFLGFBQXFCO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxhQUE2QixDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVPLHFCQUFxQixDQUFDLGNBQXNCLEVBQUUsYUFBMkI7UUFDaEYsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUU7WUFDL0UsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO1lBQzFCLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtTQUN0QixDQUFDLENBQUM7UUFDYixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhcmRUeXBlLCBHYW1lVGFnLCBab25lIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYWN0aW9uJztcclxuaW1wb3J0IHsgQXR0YWNrQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9hdHRhY2stYWN0aW9uJztcclxuaW1wb3J0IHsgRGFtYWdlQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9kYW1hZ2UtYWN0aW9uJztcclxuaW1wb3J0IHsgSGVhbGluZ0FjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vaGVhbGluZy1hY3Rpb24nO1xyXG5pbXBvcnQgeyBQb3dlclRhcmdldEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vcG93ZXItdGFyZ2V0LWFjdGlvbic7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL2VudGl0eSc7XHJcbmltcG9ydCB7IEhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS90YWctY2hhbmdlLWhpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7XHJcblx0QWN0aW9uQnV0dG9uVXNlZEFjdGlvbixcclxuXHRDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24sXHJcblx0RnVsbEVudGl0eUhpc3RvcnlJdGVtLFxyXG5cdEdhbWVFbnRpdHksXHJcblx0R2FtZUhlcGxlcixcclxufSBmcm9tICcuLi8uLi9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgQWxsQ2FyZHNTZXJ2aWNlIH0gZnJvbSAnLi4vYWxsLWNhcmRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3Rpb25IZWxwZXIgfSBmcm9tICcuL2FjdGlvbi1oZWxwZXInO1xyXG5pbXBvcnQgeyBQYXJzZXIgfSBmcm9tICcuL3BhcnNlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgRGFtYWdlUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFsbENhcmRzOiBBbGxDYXJkc1NlcnZpY2UpIHt9XHJcblxyXG5cdHB1YmxpYyBhcHBsaWVzKGl0ZW06IEhpc3RvcnlJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtICYmIGl0ZW0udGFnLnRhZyA9PT0gR2FtZVRhZy5EQU1BR0U7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcGFyc2UoXHJcblx0XHRpdGVtOiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSxcclxuXHRcdGN1cnJlbnRUdXJuOiBudW1iZXIsXHJcblx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbjogTWFwPG51bWJlciwgRW50aXR5PixcclxuXHRcdGhpc3Rvcnk6IHJlYWRvbmx5IEhpc3RvcnlJdGVtW10sXHJcblx0KTogQWN0aW9uW10ge1xyXG5cdFx0Y29uc3QgZW50aXR5ID0gZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0udGFnLmVudGl0eSk7XHJcblx0XHQvLyBEYW1hZ2UgaXMgcmVzZXQgdG8gMCBhZnRlciBhbiBlbnRpdHkgZGllcywgYW5kIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0aGlzXHJcblx0XHRpZiAoIWVudGl0eSB8fCBlbnRpdHkuZ2V0VGFnKEdhbWVUYWcuWk9ORSkgIT09IFpvbmUuUExBWSkge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblx0XHQvLyBJZ25vcmUgZGFtYWdlIHRvIGxvY2F0aW9uc1xyXG5cdFx0aWYgKGVudGl0eS5nZXRUYWcoR2FtZVRhZy5DQVJEVFlQRSkgPT09IENhcmRUeXBlPy5MT0NBVElPTikge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNEYW1hZ2VUYWcgPSBlbnRpdHkuZ2V0VGFnKEdhbWVUYWcuREFNQUdFKTtcclxuXHRcdGNvbnN0IHByZXZpb3VzRGFtYWdlID0gIXByZXZpb3VzRGFtYWdlVGFnIHx8IHByZXZpb3VzRGFtYWdlVGFnID09PSAtMSA/IDAgOiBwcmV2aW91c0RhbWFnZVRhZztcclxuXHRcdGNvbnN0IGRhbWFnZVRha2VuID0gaXRlbS50YWcudmFsdWUgLSBwcmV2aW91c0RhbWFnZTtcclxuXHRcdC8vIElmIHdlIGFyZSBpbiBiYXR0bGVncm91bmRzLCB0aGluZ3MgYXJlIGEgYml0IHRyaWNraWVyLiBXZSBkb24ndCB3YW50IHRvIHNob3cgdGhlXHJcblx0XHQvLyBkYW1hZ2UgdGFrZW4gYnkgdGhlIG9wcG9uZW50IGhlcm8gYXQgdGhlIHN0YXJ0IG9mIGEgYmF0dGxlXHJcblx0XHRjb25zdCBnYW1lRW50aXR5OiBHYW1lRW50aXR5ID0gR2FtZUhlcGxlci5nZXRHYW1lRW50aXR5KGVudGl0aWVzQmVmb3JlQWN0aW9uKSBhcyBHYW1lRW50aXR5O1xyXG5cdFx0aWYgKGdhbWVFbnRpdHkuaXNCYXR0bGVncm91bmRzKCkpIHtcclxuXHRcdFx0Y29uc3QgaGlzdG9yeUluZGV4ID0gaGlzdG9yeS5pbmRleE9mKGl0ZW0pO1xyXG5cdFx0XHRpZiAoaGlzdG9yeUluZGV4ID4gMCkge1xyXG5cdFx0XHRcdGNvbnN0IHByZXZpb3VzID0gaGlzdG9yeVtoaXN0b3J5SW5kZXggLSAxXTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRwcmV2aW91cyBpbnN0YW5jZW9mIEZ1bGxFbnRpdHlIaXN0b3J5SXRlbSAmJlxyXG5cdFx0XHRcdFx0cHJldmlvdXMuZW50aXR5RGVmaW50aW9uLmNhcmRJRCAmJlxyXG5cdFx0XHRcdFx0cHJldmlvdXMuZW50aXR5RGVmaW50aW9uLmNhcmRJRC5pbmRleE9mKCdUQl9CYWNvblNob3BfSFBfJykgIT09IC0xXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGVudGl0eS5pZCA9PT0gNjQxKSB7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdhZGRpbmcgZGFtYWdlIGFjdGlvbicsIGl0ZW0sIGRhbWFnZVRha2VuLCBwcmV2aW91c0RhbWFnZVRhZywgZW50aXR5LnRhZ3MudG9KUygpKTtcclxuXHRcdH1cclxuXHRcdGlmIChkYW1hZ2VUYWtlbiA+IDApIHtcclxuXHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHREYW1hZ2VBY3Rpb24uY3JlYXRlKFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdFx0XHRpbmRleDogaXRlbS5pbmRleCxcclxuXHRcdFx0XHRcdFx0ZGFtYWdlczogTWFwLm9mKGl0ZW0udGFnLmVudGl0eSwgZGFtYWdlVGFrZW4pLFxyXG5cdFx0XHRcdFx0fSBhcyBBY3Rpb24sXHJcblx0XHRcdFx0XHR0aGlzLmFsbENhcmRzLFxyXG5cdFx0XHRcdCksXHJcblx0XHRcdF07XHJcblx0XHR9IGVsc2UgaWYgKGRhbWFnZVRha2VuIDwgMCkge1xyXG5cdFx0XHRyZXR1cm4gW1xyXG5cdFx0XHRcdEhlYWxpbmdBY3Rpb24uY3JlYXRlKFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdFx0XHRpbmRleDogaXRlbS5pbmRleCxcclxuXHRcdFx0XHRcdFx0ZGFtYWdlczogTWFwLm9mKGl0ZW0udGFnLmVudGl0eSwgZGFtYWdlVGFrZW4pLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHRoaXMuYWxsQ2FyZHMsXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyByZWR1Y2UoYWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10pOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLmNvbWJpbmVBY3Rpb25zPEFjdGlvbj4oXHJcblx0XHRcdGFjdGlvbnMsXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5zaG91bGRNZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0XHQocHJldmlvdXMsIGN1cnJlbnQpID0+IHRoaXMubWVyZ2VBY3Rpb25zKHByZXZpb3VzLCBjdXJyZW50KSxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91c0FjdGlvbjogQWN0aW9uLCBjdXJyZW50QWN0aW9uOiBBY3Rpb24pOiBib29sZWFuIHtcclxuXHRcdGlmIChjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgRGFtYWdlQWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBEYW1hZ2VBY3Rpb24gfHwgLy8gTWVyZ2UgYWxsIGRhbWFnZXMgaW50byBhIHNpbmdsZSBhY3Rpb25cclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEF0dGFja0FjdGlvbiB8fCAvLyBBZGQgZGFtYWdlIHRvIHRoZSBhdHRhY2sgY2F1c2luZyB0aGUgZGFtYWdlXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbiB8fCAvLyBBZGQgZGFtYWdlcyB0byB0aGUgcG93ZXIgY2F1c2luZyB0aGUgZGFtYWdlXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uIHx8XHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24gLy8gSXQncyB1c3VhbGx5IHRlaCBzYW1lIFwiYWN0aW9uXCJcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSBpZiAoY3VycmVudEFjdGlvbiBpbnN0YW5jZW9mIEhlYWxpbmdBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIChcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEhlYWxpbmdBY3Rpb24gfHwgLy8gTWVyZ2UgYWxsIGhlYWxzIGludG8gYSBzaW5nbGUgYWN0aW9uXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBdHRhY2tBY3Rpb24gfHwgLy8gQWRkIGhlYWwgdG8gdGhlIGF0dGFjayBjYXVzaW5nIHRoZSBoZWFsXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbiB8fCAvLyBBZGQgaGVhbHMgdG8gdGhlIHBvd2VyIGNhdXNpbmcgdGhlIGhlYWxcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkJ1dHRvblVzZWRBY3Rpb24gfHwgLy8gQWRkIGhlYWxzIHRvIHRoZSBwb3dlciBjYXVzaW5nIHRoZSBoZWFsXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24gLy8gSXQncyB1c3VhbGx5IHRlaCBzYW1lIFwiYWN0aW9uXCJcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbWVyZ2VBY3Rpb25zKHByZXZpb3VzQWN0aW9uOiBBY3Rpb24sIGN1cnJlbnRBY3Rpb246IEFjdGlvbik6IEFjdGlvbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5tZXJnZURhbWFnZUludG9BY3Rpb24ocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24gYXMgRGFtYWdlQWN0aW9uKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbWVyZ2VEYW1hZ2VJbnRvQWN0aW9uKHByZXZpb3VzQWN0aW9uOiBBY3Rpb24sIGN1cnJlbnRBY3Rpb246IERhbWFnZUFjdGlvbik6IEFjdGlvbiB7XHJcblx0XHRjb25zdCByZXN1bHQgPSBBY3Rpb25IZWxwZXIubWVyZ2VJbnRvRmlyc3RBY3Rpb24ocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24sIHtcclxuXHRcdFx0aW5kZXg6IGN1cnJlbnRBY3Rpb24uaW5kZXgsXHJcblx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0fSBhcyBBY3Rpb24pO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcbn1cclxuIl19