@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
112 lines • 17.9 kB
JavaScript
import { Injectable } from '@angular/core';
import { GameTag, Mulligan, Step } from '@firestone-hs/reference-data';
import { ActionTurn } from '../../models/game/action-turn';
import { Game } from '../../models/game/game';
import { GameEntity } from '../../models/game/game-entity';
import { MulliganTurn } from '../../models/game/mulligan-turn';
import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item';
import { PlayerHistoryItem } from '../../models/models';
import * as i0 from "@angular/core";
export class TurnParserService {
constructor() { }
createTurns(game, history) {
let turns = game.turns;
let turnNumber = turns.size;
// // console.log('last history item', history[history.length - 1]);
for (const item of history) {
if (turnNumber === 0 && this.isMulligan(item, game)) {
// // console.log('adding mulligan turn', item);
const mulliganTurn = this.parseMulliganTurn(item, turns);
turns = turns.set(0, mulliganTurn);
turnNumber++;
}
else if (turnNumber === 0 && this.isMulliganDone(item, game)) {
// The proper mulligan input could not be parsed
// console.warn('Could not detect mulligan input, creating mulligan turn');
const mulliganTurn = this.parseMulliganTurn(item, turns);
turns = turns.set(0, mulliganTurn);
turnNumber++;
}
else if (this.isStartOfTurn(item, game)) {
// // console.log('adding new turn', turnNumber);
// Used for instance in Bob's encounters
if (!turns.has(0)) {
// // console.log('creating fake mulligan turn', turns, turns.toJS());
const mulliganTurn = this.parseMulliganTurn(item, turns);
turns = turns.set(0, mulliganTurn);
turnNumber++;
}
const turn = this.parseTurn(turnNumber, item, turns);
turns = turns.set(turnNumber, turn);
turnNumber++;
}
}
// // console.log('created turns', turns.toJS());
return Game.createGame(game, { turns });
}
parseTurn(currentTurnNumber, item, turns) {
const itemIndex = item.tag.index;
// Turn 1 is mulligan in the log, while for us mulligan is turn 0
let turn = turns.get(currentTurnNumber, Object.assign(new ActionTurn(), {
turn: `${currentTurnNumber}`,
timestamp: item.timestamp,
index: itemIndex,
activePlayer: undefined,
actions: [],
}));
turn = Object.assign(new ActionTurn(), turn, {
index: Math.max(turn.index, itemIndex),
});
return turn;
}
parseMulliganTurn(item, turns) {
const itemIndex = item instanceof TagChangeHistoryItem ? item.tag.index : item.index;
let mulliganTurn = turns.get(0, Object.assign(new MulliganTurn(), {
turn: 'mulligan',
timestamp: item.timestamp,
index: itemIndex,
actions: [],
}));
mulliganTurn = Object.assign(new MulliganTurn(), mulliganTurn, {
index: Math.max(mulliganTurn.index, itemIndex),
});
return mulliganTurn;
}
isMulligan(item, game) {
return (item instanceof TagChangeHistoryItem &&
item.tag.tag === GameTag.MULLIGAN_STATE &&
item.tag.value === Mulligan.INPUT);
}
isMulliganDone(item, game) {
return ((item instanceof PlayerHistoryItem &&
item.entityDefintion.tags.get(GameTag[GameTag.MULLIGAN_STATE]) === Mulligan.DONE) ||
(item instanceof TagChangeHistoryItem &&
item.tag.tag === GameTag.MULLIGAN_STATE &&
item.tag.value === Mulligan.DONE));
}
isStartOfTurn(item, game) {
if (!(item instanceof TagChangeHistoryItem)) {
return false;
}
const startOfTurn = item.tag.tag === GameTag.STEP && item.tag.value === Step.MAIN_READY;
if (startOfTurn) {
// // console.log('start of turn, isGameEntity?', item.tag.entity, game.getLatestParsedState()?.toJS())
}
return this.isGameEntity(item.tag.entity, game) && startOfTurn;
}
// private isPlayerEntity(entityId: number, game: Game) {
// return game.entities.get(entityId) instanceof PlayerEntity;
// }
isGameEntity(entityId, game) {
return game.getLatestParsedState().get(entityId) instanceof GameEntity;
}
}
TurnParserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
TurnParserService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVybi1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9nYW1lcGlwZWxpbmUvdHVybi1wYXJzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLeEQsTUFBTSxPQUFPLGlCQUFpQjtJQUM3QixnQkFBZSxDQUFDO0lBRVQsV0FBVyxDQUFDLElBQVUsRUFBRSxPQUErQjtRQUM3RCxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzVCLG9FQUFvRTtRQUNwRSxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLFVBQVUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BELGdEQUFnRDtnQkFDaEQsTUFBTSxZQUFZLEdBQWlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUE0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SSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hGLElBQUksV0FBVyxFQUFFO1lBQ2hCLHVHQUF1RztTQUN2RztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUM7SUFDaEUsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCwrREFBK0Q7SUFDL0QsSUFBSTtJQUVJLFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQVU7UUFDaEQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksVUFBVSxDQUFDO0lBQ3hFLENBQUM7OzhHQXRHVyxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQUZqQixNQUFNOzJGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEdhbWVUYWcsIE11bGxpZ2FuLCBTdGVwIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvblR1cm4gfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9hY3Rpb24tdHVybic7XHJcbmltcG9ydCB7IEdhbWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9nYW1lJztcclxuaW1wb3J0IHsgR2FtZUVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL2dhbWUtZW50aXR5JztcclxuaW1wb3J0IHsgTXVsbGlnYW5UdXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvbXVsbGlnYW4tdHVybic7XHJcbmltcG9ydCB7IFR1cm4gfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS90dXJuJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L3RhZy1jaGFuZ2UtaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgUGxheWVySGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvbW9kZWxzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUdXJuUGFyc2VyU2VydmljZSB7XHJcblx0Y29uc3RydWN0b3IoKSB7fVxyXG5cclxuXHRwdWJsaWMgY3JlYXRlVHVybnMoZ2FtZTogR2FtZSwgaGlzdG9yeTogcmVhZG9ubHkgSGlzdG9yeUl0ZW1bXSk6IEdhbWUge1xyXG5cdFx0bGV0IHR1cm5zOiBNYXA8bnVtYmVyLCBUdXJuPiA9IGdhbWUudHVybnM7XHJcblx0XHRsZXQgdHVybk51bWJlciA9IHR1cm5zLnNpemU7XHJcblx0XHQvLyAvLyBjb25zb2xlLmxvZygnbGFzdCBoaXN0b3J5IGl0ZW0nLCBoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV0pO1xyXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGhpc3RvcnkpIHtcclxuXHRcdFx0aWYgKHR1cm5OdW1iZXIgPT09IDAgJiYgdGhpcy5pc011bGxpZ2FuKGl0ZW0sIGdhbWUpKSB7XHJcblx0XHRcdFx0Ly8gLy8gY29uc29sZS5sb2coJ2FkZGluZyBtdWxsaWdhbiB0dXJuJywgaXRlbSk7XHJcblx0XHRcdFx0Y29uc3QgbXVsbGlnYW5UdXJuOiBNdWxsaWdhblR1cm4gPSB0aGlzLnBhcnNlTXVsbGlnYW5UdXJuKGl0ZW0gYXMgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sIHR1cm5zKTtcclxuXHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCgwLCBtdWxsaWdhblR1cm4pO1xyXG5cdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0fSBlbHNlIGlmICh0dXJuTnVtYmVyID09PSAwICYmIHRoaXMuaXNNdWxsaWdhbkRvbmUoaXRlbSwgZ2FtZSkpIHtcclxuXHRcdFx0XHQvLyBUaGUgcHJvcGVyIG11bGxpZ2FuIGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWRcclxuXHRcdFx0XHQvLyBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBkZXRlY3QgbXVsbGlnYW4gaW5wdXQsIGNyZWF0aW5nIG11bGxpZ2FuIHR1cm4nKTtcclxuXHRcdFx0XHRjb25zdCBtdWxsaWdhblR1cm46IE11bGxpZ2FuVHVybiA9IHRoaXMucGFyc2VNdWxsaWdhblR1cm4oaXRlbSBhcyBQbGF5ZXJIaXN0b3J5SXRlbSwgdHVybnMpO1xyXG5cdFx0XHRcdHR1cm5zID0gdHVybnMuc2V0KDAsIG11bGxpZ2FuVHVybik7XHJcblx0XHRcdFx0dHVybk51bWJlcisrO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXNTdGFydE9mVHVybihpdGVtLCBnYW1lKSkge1xyXG5cdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdhZGRpbmcgbmV3IHR1cm4nLCB0dXJuTnVtYmVyKTtcclxuXHRcdFx0XHQvLyBVc2VkIGZvciBpbnN0YW5jZSBpbiBCb2IncyBlbmNvdW50ZXJzXHJcblx0XHRcdFx0aWYgKCF0dXJucy5oYXMoMCkpIHtcclxuXHRcdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdjcmVhdGluZyBmYWtlIG11bGxpZ2FuIHR1cm4nLCB0dXJucywgdHVybnMudG9KUygpKTtcclxuXHRcdFx0XHRcdGNvbnN0IG11bGxpZ2FuVHVybjogTXVsbGlnYW5UdXJuID0gdGhpcy5wYXJzZU11bGxpZ2FuVHVybihpdGVtIGFzIFRhZ0NoYW5nZUhpc3RvcnlJdGVtLCB0dXJucyk7XHJcblx0XHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCgwLCBtdWxsaWdhblR1cm4pO1xyXG5cdFx0XHRcdFx0dHVybk51bWJlcisrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCB0dXJuOiBBY3Rpb25UdXJuID0gdGhpcy5wYXJzZVR1cm4odHVybk51bWJlciwgaXRlbSBhcyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSwgdHVybnMpO1xyXG5cdFx0XHRcdHR1cm5zID0gdHVybnMuc2V0KHR1cm5OdW1iZXIsIHR1cm4pO1xyXG5cdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gLy8gY29uc29sZS5sb2coJ2NyZWF0ZWQgdHVybnMnLCB0dXJucy50b0pTKCkpO1xyXG5cdFx0cmV0dXJuIEdhbWUuY3JlYXRlR2FtZShnYW1lLCB7IHR1cm5zIH0gYXMgR2FtZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHBhcnNlVHVybihjdXJyZW50VHVybk51bWJlcjogbnVtYmVyLCBpdGVtOiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSwgdHVybnM6IE1hcDxudW1iZXIsIFR1cm4+KTogQWN0aW9uVHVybiB7XHJcblx0XHRjb25zdCBpdGVtSW5kZXggPSAoaXRlbSBhcyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSkudGFnLmluZGV4O1xyXG5cdFx0Ly8gVHVybiAxIGlzIG11bGxpZ2FuIGluIHRoZSBsb2csIHdoaWxlIGZvciB1cyBtdWxsaWdhbiBpcyB0dXJuIDBcclxuXHRcdGxldCB0dXJuOiBBY3Rpb25UdXJuID0gdHVybnMuZ2V0KGN1cnJlbnRUdXJuTnVtYmVyLCBPYmplY3QuYXNzaWduKG5ldyBBY3Rpb25UdXJuKCksIHtcclxuXHRcdFx0dHVybjogYCR7Y3VycmVudFR1cm5OdW1iZXJ9YCxcclxuXHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0aW5kZXg6IGl0ZW1JbmRleCxcclxuXHRcdFx0YWN0aXZlUGxheWVyOiB1bmRlZmluZWQsXHJcblx0XHRcdGFjdGlvbnM6IFtdLFxyXG5cdFx0fSkgYXMgQWN0aW9uVHVybikgYXMgQWN0aW9uVHVybjtcclxuXHRcdHR1cm4gPSBPYmplY3QuYXNzaWduKG5ldyBBY3Rpb25UdXJuKCksIHR1cm4sIHtcclxuXHRcdFx0aW5kZXg6IE1hdGgubWF4KHR1cm4uaW5kZXgsIGl0ZW1JbmRleCksXHJcblx0XHR9KTtcclxuXHRcdHJldHVybiB0dXJuO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBwYXJzZU11bGxpZ2FuVHVybihpdGVtOiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSB8IFBsYXllckhpc3RvcnlJdGVtLCB0dXJuczogTWFwPG51bWJlciwgVHVybj4pOiBNdWxsaWdhblR1cm4ge1xyXG5cdFx0Y29uc3QgaXRlbUluZGV4ID0gaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtID8gaXRlbS50YWcuaW5kZXggOiBpdGVtLmluZGV4O1xyXG5cdFx0bGV0IG11bGxpZ2FuVHVybjogTXVsbGlnYW5UdXJuID0gdHVybnMuZ2V0KDAsIE9iamVjdC5hc3NpZ24obmV3IE11bGxpZ2FuVHVybigpLCB7XHJcblx0XHRcdHR1cm46ICdtdWxsaWdhbicsXHJcblx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdGluZGV4OiBpdGVtSW5kZXgsXHJcblx0XHRcdGFjdGlvbnM6IFtdLFxyXG5cdFx0fSkgYXMgTXVsbGlnYW5UdXJuKSBhcyBNdWxsaWdhblR1cm47XHJcblx0XHRtdWxsaWdhblR1cm4gPSBPYmplY3QuYXNzaWduKG5ldyBNdWxsaWdhblR1cm4oKSwgbXVsbGlnYW5UdXJuLCB7XHJcblx0XHRcdGluZGV4OiBNYXRoLm1heChtdWxsaWdhblR1cm4uaW5kZXgsIGl0ZW1JbmRleCksXHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBtdWxsaWdhblR1cm47XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGlzTXVsbGlnYW4oaXRlbTogSGlzdG9yeUl0ZW0sIGdhbWU6IEdhbWUpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGl0ZW0gaW5zdGFuY2VvZiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSAmJlxyXG5cdFx0XHRpdGVtLnRhZy50YWcgPT09IEdhbWVUYWcuTVVMTElHQU5fU1RBVEUgJiZcclxuXHRcdFx0aXRlbS50YWcudmFsdWUgPT09IE11bGxpZ2FuLklOUFVUXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc011bGxpZ2FuRG9uZShpdGVtOiBIaXN0b3J5SXRlbSwgZ2FtZTogR2FtZSkge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0KGl0ZW0gaW5zdGFuY2VvZiBQbGF5ZXJIaXN0b3J5SXRlbSAmJlxyXG5cdFx0XHRcdGl0ZW0uZW50aXR5RGVmaW50aW9uLnRhZ3MuZ2V0KEdhbWVUYWdbR2FtZVRhZy5NVUxMSUdBTl9TVEFURV0pID09PSBNdWxsaWdhbi5ET05FKSB8fFxyXG5cdFx0XHQoaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtICYmXHJcblx0XHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLk1VTExJR0FOX1NUQVRFICYmXHJcblx0XHRcdFx0aXRlbS50YWcudmFsdWUgPT09IE11bGxpZ2FuLkRPTkUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc1N0YXJ0T2ZUdXJuKGl0ZW06IEhpc3RvcnlJdGVtLCBnYW1lOiBHYW1lKSB7XHJcblx0XHRpZiAoIShpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHN0YXJ0T2ZUdXJuID0gaXRlbS50YWcudGFnID09PSBHYW1lVGFnLlNURVAgJiYgaXRlbS50YWcudmFsdWUgPT09IFN0ZXAuTUFJTl9SRUFEWTtcclxuXHRcdGlmIChzdGFydE9mVHVybikge1xyXG5cdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnc3RhcnQgb2YgdHVybiwgaXNHYW1lRW50aXR5PycsIGl0ZW0udGFnLmVudGl0eSwgZ2FtZS5nZXRMYXRlc3RQYXJzZWRTdGF0ZSgpPy50b0pTKCkpXHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5pc0dhbWVFbnRpdHkoaXRlbS50YWcuZW50aXR5LCBnYW1lKSAmJiBzdGFydE9mVHVybjtcclxuXHR9XHJcblxyXG5cdC8vIHByaXZhdGUgaXNQbGF5ZXJFbnRpdHkoZW50aXR5SWQ6IG51bWJlciwgZ2FtZTogR2FtZSkge1xyXG5cdC8vIFx0cmV0dXJuIGdhbWUuZW50aXRpZXMuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIFBsYXllckVudGl0eTtcclxuXHQvLyB9XHJcblxyXG5cdHByaXZhdGUgaXNHYW1lRW50aXR5KGVudGl0eUlkOiBudW1iZXIsIGdhbWU6IEdhbWUpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBnYW1lLmdldExhdGVzdFBhcnNlZFN0YXRlKCkuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIEdhbWVFbnRpdHk7XHJcblx0fVxyXG59XHJcbiJdfQ==