bp-prism-game
Version:
The BP Prism Game
347 lines • 60.9 kB
JavaScript
import { Component, ViewChild, HostListener, Inject } from '@angular/core';
import { COLS, BLOCK_SIZE, ROWS, GAMEBOARDS, LEVELWAVES, LEVELCREEP, LEVELSPEED } from './gameboard-constants';
import { PrismBaseClass } from '../base/prism-base/prism-base.class';
import { ObservableTypeEnum } from '../enum/observable-type.enum';
import { InvasionService } from '../service/invasion.service';
import { MainGunnerClass } from '../gunner/main-gunner/main-gunner.class';
import { MissileService } from '../service/missile.service';
import { TextService } from '../service/text.service';
import { PrismBlastService } from '../service/prism-blast.service';
import { SceneryService } from '../service/scenery.service';
import { GameboardService } from '../service/gameboard.service';
import { GameInstructionComponent } from '../game-instruction/game-instruction.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "../service/display-dialog.service";
import * as i3 from "../service/game-cookie.service";
import * as i4 from "../service/game.service";
import * as i5 from "@angular/common";
/**
* The Gameboard Component
*/
export class GameboardComponent {
/**
* The Constructor
*
* @param dialog The MatDialog from DI
* @param displayDialogService The Display Dialog Service from DI
* @param gameConfigurationService The Game Configuration Data from DI
* @param gameCookieService The Game Cookie Service from DI
* @param gameService The Game Service from DI
*/
constructor(dialog, displayDialogService, gameConfiguration, gameCookieService, gameService) {
// this.isDisplayGrid = false;
this.dialog = dialog;
this.displayDialogService = displayDialogService;
this.gameConfiguration = gameConfiguration;
this.gameCookieService = gameCookieService;
this.gameService = gameService;
const gameData = this.gameCookieService.getGameData();
this.highScore = gameData.highScore;
this.highLevel = gameData.level;
this.gameStarted = false;
this.dialog.open(GameInstructionComponent, {
panelClass: 'game-instruction-container',
position: {
top: '75px'
}
});
}
/**
* On Init
*/
ngOnInit() {
this.ctx = this.gameService.initBoard(this.canvas, ROWS, COLS, BLOCK_SIZE, GAMEBOARDS[0], this.gameConfiguration.addExtraScenery);
this.boardSize = this.gameService.getBoardSize();
this.textService = new TextService(this.gameService, this.ctx);
this.subscription = this.gameService.getMasterObservable().subscribe((result) => {
if (result.type === ObservableTypeEnum.prismBaseDestroyed) {
this.gameOver();
}
else if (result.type === ObservableTypeEnum.levelCompleted && result.booleanData === true) {
this.nextLevel();
}
else if (result.type === ObservableTypeEnum.imagesLoaded && result.booleanData === true) {
this.setUpGameBoard();
setTimeout(() => {
this.startAllAnimation();
});
}
});
}
/**
* On Destroy
*/
ngOnDestroy() {
this.subscription.unsubscribe();
}
/**
* Setup the game board
*/
setUpGameBoard() {
this.prismBase = new PrismBaseClass(this.gameService, this.ctx, 1);
this.prismBase.move(this.gameService.getBasePosition());
this.mainGunner = new MainGunnerClass(this.gameService, this.ctx, 1);
this.invasionService = new InvasionService(this.gameService, this.ctx);
this.sceneryService = new SceneryService(this.gameService, this.ctx);
this.gameboardService = new GameboardService(this.gameService, this.ctx);
this.missileService = new MissileService(this.gameService, this.ctx);
this.missileService.init();
this.prismBlastService = new PrismBlastService(this.gameService, this.ctx);
this.prismBlastService.init();
this.resetGame();
}
/**
* Add a new prism blast every 1000 points
*/
addNewPrismBlast() {
if (this.points % 1000 === 0) {
this.prismBlastService.addPrismBlast();
}
}
/**
* Evaluate high Score
*/
calculateScore() {
this.points += 5;
if (this.points > this.highScore) {
this.highScore = this.points;
this.textService.setHighScore(this.highScore);
}
this.textService.setScore(this.points);
}
/**
* Evaluate any damage
*/
evaluateDamage() {
this.missileService.getActiveMissiles().map((missile) => {
this.invasionService.getActiveAliens().map((alien) => {
if (missile.isDestroyed === false &&
alien.isDestroyed === false &&
alien.isAnimated === true &&
this.gameService.isHit(alien, missile)) {
this.calculateScore();
this.addNewPrismBlast();
alien.isDestroyed = true;
missile.isDestroyed = true;
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.alienDestroyed,
booleanData: true,
numberData: alien.uid
});
}
});
});
}
/**
* Start All the animation in one place
*/
startAllAnimation() {
this.draw();
this.gameboardService.animate(0);
this.invasionService.animate(0);
this.mainGunner.animate(0);
this.sceneryService.animate();
this.prismBase.animate();
this.textService.animate();
this.prismBlastService.animate(0);
}
/**
* Animate
*
* @param now The current animation time
*/
animate(now = 0) {
this.evaluateDamage();
this.draw();
this.gameboardService.animate(now);
this.invasionService.animate(now);
this.mainGunner.animate(now);
this.sceneryService.animate();
this.prismBase.animate();
this.prismBlastService.animate(now);
this.missileService.animate(now);
this.invasionService.animateDropships(now);
this.textService.animate();
this.requestId = requestAnimationFrame(this.animate.bind(this));
}
/**
* Determine if the game is over
*
*/
gameOver() {
if (this.points >= this.highScore) {
this.highScore = this.points;
this.highLevel = this.displayLevel;
this.gameCookieService.setGameData({
highScore: this.highScore,
level: this.highLevel
});
}
this.textService.setHighScore(this.highScore);
setTimeout(() => {
this.missileService.removeMissiles();
this.gameStarted = false;
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.gameOver,
booleanData: true
});
this.displayDialogService.displayGameOver({
highScore: this.highScore,
level: this.highLevel
});
}, 250);
}
/**
* Draw the board
*/
draw() {
this.ctx.clearRect(0, 0, this.boardSize.width, this.boardSize.height);
// if (this.isDisplayGrid) {
// this.gameService.addOutlines(this.ctx, BLOCK_SIZE, 0.2);
// }
}
/**
* Play the game
*/
play() {
this.gameStarted = true;
this.resetGame();
// If we have an old game running a game then cancel the old
if (this.requestId) {
cancelAnimationFrame(this.requestId);
}
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.gameOver,
booleanData: false
});
this.animate(0);
}
/**
* Reset the Game
*/
resetGame() {
this.gameLevel = 0;
this.displayLevel = 1;
this.points = 0;
this.isGamePaused = false;
this.textService.setScore(this.points);
this.textService.setHighScore(this.highScore);
this.newLevelSetup();
}
/**
* New Level Set-up
*/
newLevelSetup() {
this.gameService.setGameBoard(GAMEBOARDS[this.gameLevel]);
this.sceneryService.addScenery(this.gameLevel);
this.mainGunner.resetRotation();
this.missileService.removeMissiles();
this.textService.setLevel(this.displayLevel);
this.gameboardService.initPath();
this.invasionService.initInvasion({
alienPerWave: LEVELCREEP[this.gameLevel],
waves: LEVELWAVES[this.gameLevel],
alienSpeed: LEVELSPEED[this.gameLevel]
});
}
/**
* next level
*/
nextLevel() {
this.displayLevel++;
const displayDialogServiceRef = this.pauseGame(true);
if (this.gameLevel < 7) {
this.gameLevel++;
}
setTimeout(() => {
this.newLevelSetup();
displayDialogServiceRef.close();
this.pauseGame();
}, 2000);
}
/**
* Pause the game
*
* @param isNextLevel If you should display the next level dialog
*/
pauseGame(isNextLevel = false) {
let displayDialogServiceRef;
if (this.gameStarted) {
this.isGamePaused = !this.isGamePaused;
if (this.isGamePaused) {
displayDialogServiceRef = isNextLevel
? this.displayDialogService.displayNextLevel({
highScore: this.highScore,
level: this.displayLevel
})
: this.displayDialogService.displayGamePaused();
if (!isNextLevel) {
displayDialogServiceRef.afterClosed().subscribe(() => {
this.pauseGame(isNextLevel);
});
}
}
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.gamePaused,
booleanData: this.isGamePaused
});
}
return displayDialogServiceRef;
}
/**
* Pause the game
*/
pause() {
this.pauseGame();
}
/**
* Abstract event handlers
* @param type The input type
* @param code The key code
*/
handleEventListeners(type, code) {
if (this.gameStarted && !this.isGamePaused) {
this.gameService.emitMasterObservableEvent({
type,
stringData: code
});
}
}
/**
* The keyEvent down listener
* @param event the Keyboard event
*/
keyDownEvent(event) {
event.preventDefault();
this.handleEventListeners(ObservableTypeEnum.keyDownEvent, event.code);
}
/**
* The keyEvent uplistener
*
* @param event the Keyboard event
*/
keyUpEvent(event) {
event.preventDefault();
this.handleEventListeners(ObservableTypeEnum.keyUpEvent, event.code);
}
}
GameboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: GameboardComponent, deps: [{ token: i1.MatDialog }, { token: i2.DisplayDialogService }, { token: 'GameConfigurationData' }, { token: i3.GameCookieService }, { token: i4.GameService }], target: i0.ɵɵFactoryTarget.Component });
GameboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: GameboardComponent, selector: "bp-prism-gameboard", host: { listeners: { "window:keydown": "keyDownEvent($event)", "window:keyup": "keyUpEvent($event)" } }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <div>\n <button (click)=\"play()\" class=\"play-button button\" *ngIf=\"!gameStarted\">Play</button>\n <button (click)=\"gameOver()\" class=\"reset-button button\" *ngIf=\"gameStarted\">Reset</button>\n </div>\n <div>\n <button (click)=\"pause()\" class=\"pause-button button\" [class.button-disabled]=\"!gameStarted\">Pause</button>\n </div>\n </div>\n</div>\n", styles: [".game-container{background-color:#000;padding:10px;display:grid;grid-template-columns:850px 100px}.game-container .game-board-container{position:relative;margin:auto;display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{background-color:#000}.game-container .button-container{display:flex;flex-direction:column;justify-content:center;align-items:center}.game-container .button-container .play-button{background-color:#4caf50}.game-container .button-container .reset-button{background-color:red}.game-container .button-container .pause-button{background-color:#4caf50}.game-container .button-container .pause-button.button-disabled{background-color:#ccc}.game-container .button-container .button{margin-top:25px;font-size:16px;font-family:\"Press Start 2P\";padding:15px 30px;cursor:pointer;width:140px;height:50px;border:1px solid white}\n", "@font-face{font-family:\"Press Start 2P\";src:local(\"Press Start 2P Regular\"),local(\"PressStart2P-Regular\"),url(data:application/font-woff2;charset=utf-8;base64,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) format(\"woff2\");font-weight:400;font-style:normal}\n"], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: GameboardComponent, decorators: [{
type: Component,
args: [{ selector: 'bp-prism-gameboard', template: "<div class=\"game-container\">\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <div>\n <button (click)=\"play()\" class=\"play-button button\" *ngIf=\"!gameStarted\">Play</button>\n <button (click)=\"gameOver()\" class=\"reset-button button\" *ngIf=\"gameStarted\">Reset</button>\n </div>\n <div>\n <button (click)=\"pause()\" class=\"pause-button button\" [class.button-disabled]=\"!gameStarted\">Pause</button>\n </div>\n </div>\n</div>\n", styles: [".game-container{background-color:#000;padding:10px;display:grid;grid-template-columns:850px 100px}.game-container .game-board-container{position:relative;margin:auto;display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{background-color:#000}.game-container .button-container{display:flex;flex-direction:column;justify-content:center;align-items:center}.game-container .button-container .play-button{background-color:#4caf50}.game-container .button-container .reset-button{background-color:red}.game-container .button-container .pause-button{background-color:#4caf50}.game-container .button-container .pause-button.button-disabled{background-color:#ccc}.game-container .button-container .button{margin-top:25px;font-size:16px;font-family:\"Press Start 2P\";padding:15px 30px;cursor:pointer;width:140px;height:50px;border:1px solid white}\n", "@font-face{font-family:\"Press Start 2P\";src:local(\"Press Start 2P Regular\"),local(\"PressStart2P-Regular\"),url(data:application/font-woff2;charset=utf-8;base64,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) format(\"woff2\");font-weight:400;font-style:normal}\n"] }]
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.DisplayDialogService }, { type: undefined, decorators: [{
type: Inject,
args: ['GameConfigurationData']
}] }, { type: i3.GameCookieService }, { type: i4.GameService }]; }, propDecorators: { canvas: [{
type: ViewChild,
args: ['board', { static: true }]
}], keyDownEvent: [{
type: HostListener,
args: ['window:keydown', ['$event']]
}], keyUpEvent: [{
type: HostListener,
args: ['window:keyup', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtZWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaXNtL3NyYy9saWIvZ2FtZWJvYXJkL2dhbWVib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL2dhbWVib2FyZC9nYW1lYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQXNCLFlBQVksRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9HLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUk1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBT2hFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7O0FBRzFGOztHQUVHO0FBTUgsTUFBTSxPQUFPLGtCQUFrQjtJQXNG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S0FBb0I7UUFDN0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7OytHQW5jVSxrQkFBa0IsK0VBa0duQix1QkFBdUI7bUdBbEd0QixrQkFBa0Isa1JDbEMvQixpakJBY0E7MkZEb0JhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxvQkFBb0I7OzBCQXNHM0IsTUFBTTsyQkFBQyx1QkFBdUI7c0dBekZqQyxNQUFNO3NCQURMLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkE2YXBDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZMUMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENPTFMsIEJMT0NLX1NJWkUsIFJPV1MsIEdBTUVCT0FSRFMsIExFVkVMV0FWRVMsIExFVkVMQ1JFRVAsIExFVkVMU1BFRUQgfSBmcm9tICcuL2dhbWVib2FyZC1jb25zdGFudHMnO1xuaW1wb3J0IHsgR2FtZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2dhbWUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmlzbUJhc2VDbGFzcyB9IGZyb20gJy4uL2Jhc2UvcHJpc20tYmFzZS9wcmlzbS1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVR5cGVFbnVtIH0gZnJvbSAnLi4vZW51bS9vYnNlcnZhYmxlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBJbnZhc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2ludmFzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFpbkd1bm5lckNsYXNzIH0gZnJvbSAnLi4vZ3VubmVyL21haW4tZ3VubmVyL21haW4tZ3VubmVyLmNsYXNzJztcbmltcG9ydCB7IE1pc3NpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9taXNzaWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWlzc2lsZUNsYXNzIH0gZnJvbSAnLi4vbWlzc2lsZS9taXNzaWxlLmNsYXNzJztcbmltcG9ydCB7IEFsaWVuQ2xhc3MgfSBmcm9tICcuLi9hbGllbnMvYWxpZW4vYWxpZW4uY2xhc3MnO1xuaW1wb3J0IHsgSW52YXNpb25TZXR1cE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvaW52YXNpb24tc2V0dXAubW9kZWwnO1xuaW1wb3J0IHsgVGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3RleHQuc2VydmljZSc7XG5pbXBvcnQgeyBCb2FyZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgUHJpc21CbGFzdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3ByaXNtLWJsYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NlbmVyeVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3NjZW5lcnkuc2VydmljZSc7XG5pbXBvcnQgeyBHYW1lYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9nYW1lYm9hcmQuc2VydmljZSc7XG5pbXBvcnQgeyBHYW1lQ29va2llU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvZ2FtZS1jb29raWUuc2VydmljZSc7XG5pbXBvcnQgeyBHYW1lRGF0YU1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvZ2FtZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IERpc3BsYXlEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9kaXNwbGF5LWRpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERpc3BsYXlEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0L2Rpc3BsYXktZGlhbG9nL2Rpc3BsYXktZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1lQ29uZmlndXJhdGlvbk1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvZ2FtZS1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEdhbWVJbnN0cnVjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2dhbWUtaW5zdHJ1Y3Rpb24vZ2FtZS1pbnN0cnVjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogVGhlIEdhbWVib2FyZCBDb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnAtcHJpc20tZ2FtZWJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dhbWVib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhbWVib2FyZC5jb21wb25lbnQuc2NzcycsICcuLi9mb250cy9wcmVzcy1zdGFydC0ycC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2FtZWJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogRGlzcGxheSBHcmlkXG4gICAqL1xuICAvLyBwcml2YXRlIGlzRGlzcGxheUdyaWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY2FudmFzXG4gICAqL1xuICBAVmlld0NoaWxkKCdib2FyZCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhczogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG4gIC8qKlxuICAgKiBUaGUgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAvKipcbiAgICogQ2FudmFzIFJlbmRlcmluZyBDb250ZXh0IDJEXG4gICAqL1xuICBwcml2YXRlIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAvKipcbiAgICogVGhlIGFuaW1hdGlvbiByZXF1ZXN0IGlkXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RJZDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHBvaW50c1xuICAgKi9cbiAgcHJpdmF0ZSBwb2ludHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBoaWdoc2NvcmVcbiAgICovXG4gIHByaXZhdGUgaGlnaFNjb3JlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgaGlnaCBsZXZlbFxuICAgKi9cbiAgcHJpdmF0ZSBoaWdoTGV2ZWw6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhdXNlZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0dhbWVQYXVzZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBHYW1lIFN0YXJ0ZWQ7XG4gICAqL1xuICBwdWJsaWMgZ2FtZVN0YXJ0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTY2VuZXJ5IFNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgc2NlbmVyeVNlcnZpY2U6IFNjZW5lcnlTZXJ2aWNlO1xuICAvKipcbiAgICogSW52YXNpb24gU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBpbnZhc2lvblNlcnZpY2U6IEludmFzaW9uU2VydmljZTtcbiAgLyoqXG4gICAqIFByaXNtIEJhc2VcbiAgICovXG4gIHByaXZhdGUgcHJpc21CYXNlOiBQcmlzbUJhc2VDbGFzcztcbiAgLyoqXG4gICAqIE1haW4gR3VubmVyXG4gICAqL1xuICBwcml2YXRlIG1haW5HdW5uZXI6IE1haW5HdW5uZXJDbGFzcztcbiAgLyoqXG4gICAqIE1pc3NpbGUgU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBtaXNzaWxlU2VydmljZTogTWlzc2lsZVNlcnZpY2U7XG4gIC8qKlxuICAgKiBHYW1lYm9hcmQgU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBnYW1lYm9hcmRTZXJ2aWNlOiBHYW1lYm9hcmRTZXJ2aWNlO1xuICAvKipcbiAgICogR2FtZSBMZXZlbFxuICAgKi9cbiAgcHJpdmF0ZSBnYW1lTGV2ZWw6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5TGV2ZWxcbiAgICovXG4gIHByaXZhdGUgZGlzcGxheUxldmVsOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUZXh0IFNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgdGV4dFNlcnZpY2U6IFRleHRTZXJ2aWNlO1xuICAvKipcbiAgICogQm9hcmQgU2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBib2FyZFNpemU6IEJvYXJkTW9kZWw7XG4gIC8qKlxuICAgKiBQcmlzbSBCbGFzdCBTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIHByaXNtQmxhc3RTZXJ2aWNlOiBQcmlzbUJsYXN0U2VydmljZTtcbiAgLyoqXG4gICAqIFRoZSBDb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAcGFyYW0gZGlhbG9nIFRoZSBNYXREaWFsb2cgZnJvbSBESVxuICAgKiBAcGFyYW0gZGlzcGxheURpYWxvZ1NlcnZpY2UgVGhlIERpc3BsYXkgRGlhbG9nIFNlcnZpY2UgZnJvbSBESVxuICAgKiBAcGFyYW0gZ2FtZUNvbmZpZ3VyYXRpb25TZXJ2aWNlIFRoZSBHYW1lIENvbmZpZ3VyYXRpb24gRGF0YSBmcm9tIERJXG4gICAqIEBwYXJhbSBnYW1lQ29va2llU2VydmljZSBUaGUgR2FtZSBDb29raWUgU2VydmljZSBmcm9tIERJXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZSBTZXJ2aWNlIGZyb20gRElcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBkaXNwbGF5RGlhbG9nU2VydmljZTogRGlzcGxheURpYWxvZ1NlcnZpY2UsXG4gICAgQEluamVjdCgnR2FtZUNvbmZpZ3VyYXRpb25EYXRhJykgcHJpdmF0ZSBnYW1lQ29uZmlndXJhdGlvbjogR2FtZUNvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICBwcml2YXRlIGdhbWVDb29raWVTZXJ2aWNlOiBHYW1lQ29va2llU2VydmljZSxcbiAgICBwcml2YXRlIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZVxuICApIHtcbiAgICAvLyB0aGlzLmlzRGlzcGxheUdyaWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGdhbWVEYXRhID0gdGhpcy5nYW1lQ29va2llU2VydmljZS5nZXRHYW1lRGF0YSgpO1xuICAgIHRoaXMuaGlnaFNjb3JlID0gZ2FtZURhdGEuaGlnaFNjb3JlO1xuICAgIHRoaXMuaGlnaExldmVsID0gZ2FtZURhdGEubGV2ZWw7XG4gICAgdGhpcy5nYW1lU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5kaWFsb2cub3BlbihHYW1lSW5zdHJ1Y3Rpb25Db21wb25lbnQsIHtcbiAgICAgIHBhbmVsQ2xhc3M6ICdnYW1lLWluc3RydWN0aW9uLWNvbnRhaW5lcicsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB0b3A6ICc3NXB4J1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIEluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY3R4ID0gdGhpcy5nYW1lU2VydmljZS5pbml0Qm9hcmQoXG4gICAgICB0aGlzLmNhbnZhcyxcbiAgICAgIFJPV1MsXG4gICAgICBDT0xTLFxuICAgICAgQkxPQ0tfU0laRSxcbiAgICAgIEdBTUVCT0FSRFNbMF0sXG4gICAgICB0aGlzLmdhbWVDb25maWd1cmF0aW9uLmFkZEV4dHJhU2NlbmVyeVxuICAgICk7XG5cbiAgICB0aGlzLmJvYXJkU2l6ZSA9IHRoaXMuZ2FtZVNlcnZpY2UuZ2V0Qm9hcmRTaXplKCk7XG5cbiAgICB0aGlzLnRleHRTZXJ2aWNlID0gbmV3IFRleHRTZXJ2aWNlKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5nYW1lU2VydmljZS5nZXRNYXN0ZXJPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChyZXN1bHQ6IE9ic2VydmFibGVNb2RlbCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ucHJpc21CYXNlRGVzdHJveWVkKSB7XG4gICAgICAgIHRoaXMuZ2FtZU92ZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5sZXZlbENvbXBsZXRlZCAmJiByZXN1bHQuYm9vbGVhbkRhdGEgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5uZXh0TGV2ZWwoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5pbWFnZXNMb2FkZWQgJiYgcmVzdWx0LmJvb2xlYW5EYXRhID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuc2V0VXBHYW1lQm9hcmQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGFydEFsbEFuaW1hdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBEZXN0cm95XG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBnYW1lIGJvYXJkXG4gICAqL1xuICBwcml2YXRlIHNldFVwR2FtZUJvYXJkKCk6IHZvaWQge1xuICAgIHRoaXMucHJpc21CYXNlID0gbmV3IFByaXNtQmFzZUNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCAxKTtcbiAgICB0aGlzLnByaXNtQmFzZS5tb3ZlKHRoaXMuZ2FtZVNlcnZpY2UuZ2V0QmFzZVBvc2l0aW9uKCkpO1xuXG4gICAgdGhpcy5tYWluR3VubmVyID0gbmV3IE1haW5HdW5uZXJDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgMSk7XG5cbiAgICB0aGlzLmludmFzaW9uU2VydmljZSA9IG5ldyBJbnZhc2lvblNlcnZpY2