bp-prism-game
Version:
The BP Prism Game
130 lines • 16.4 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { AssetAlignVerticalEnum } from '../../../asset/enum/asset-align-vertical.enum';
import { AssetAlignEnum } from '../../../asset/enum/asset-align.enum';
import { NumberClass } from '../number.class';
import * as i0 from "@angular/core";
import * as i1 from "../../../service/game.service";
import * as i2 from "@angular/common";
/**
* The Alien Component
*/
export class NumberComponent {
/**
* The Constructor
* @param gameService The GameService from DI
*/
constructor(gameService) {
this.gameService = gameService;
this.assets = [
{
key: 'zero',
name: '0'
},
{
key: 'one',
name: '1'
},
{
key: 'two',
name: '2'
},
{
key: 'three',
name: '3'
},
{
key: 'four',
name: '4'
},
{
key: 'five',
name: '5'
},
{
key: 'six',
name: '6'
},
{
key: 'seven',
name: '7'
},
{
key: 'eight',
name: '8'
},
{
key: 'nine',
name: '9'
}
];
}
/**
* On Init
*/
ngOnInit() {
const rows = 31;
const cols = 31;
const gameBoard = Array.from({ length: rows }, () => Array(cols).fill(0));
this.ctx = this.gameService.initBoard(this.canvas, rows, cols, 25, gameBoard);
this.addNumber();
this.animate();
}
/**
* Add the letters
*/
addNumber() {
const numberClass = new NumberClass(this.gameService, this.ctx);
numberClass.move(numberClass.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
numberClass.setNumber(0, false);
numberClass.isDestroyed = true;
this.number = numberClass;
}
/**
* Animate the object once
*/
animateAsset() {
this.number.isDestroyed = false;
this.number.move(this.number.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
cancelAnimationFrame(this.requestId);
this.animate();
}
/**
* Draw the board
*/
draw() {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.gameService.addOutlines(this.ctx, 1, 0.025);
}
/**
* Animate
*/
animate() {
this.draw();
this.number.animate();
this.requestId = requestAnimationFrame(this.animate.bind(this));
}
/**
* toggleAssets
*
* @param key The asset to display
*/
toggleAssets(key) {
this.draw();
this.assets.map((asset, $index) => {
if (key === asset.key) {
this.number.setNumber($index, false);
}
});
this.animateAsset();
}
}
NumberComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: NumberComponent, deps: [{ token: i1.GameService }], target: i0.ɵɵFactoryTarget.Component });
NumberComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: NumberComponent, selector: "bp-prism-number", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Numbers</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: NumberComponent, decorators: [{
type: Component,
args: [{ selector: 'bp-prism-number', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Numbers</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"] }]
}], ctorParameters: function () { return [{ type: i1.GameService }]; }, propDecorators: { canvas: [{
type: ViewChild,
args: ['board', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaXNtL3NyYy9saWIvdGV4dC9udW1iZXIvdGVzdC1jb21wb25lbnQvbnVtYmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaXNtL3NyYy9saWIvdGV4dC9udW1iZXIvdGVzdC1jb21wb25lbnQvbnVtYmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRTlDOztHQUVHO0FBTUgsTUFBTSxPQUFPLGVBQWU7SUEyQjFCOzs7T0FHRztJQUNILFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWjtnQkFDRSxHQUFHLEVBQUUsTUFBTTtnQkFDWCxJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsT0FBTztnQkFDWixJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsTUFBTTtnQkFDWCxJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsTUFBTTtnQkFDWCxJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsT0FBTztnQkFDWixJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsT0FBTztnQkFDWixJQUFJLEVBQUUsR0FBRzthQUNpQjtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsTUFBTTtnQkFDWCxJQUFJLEVBQUUsR0FBRzthQUNpQjtTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBYSxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEMsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxJQUFJO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNaLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQXlCLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxHQUFXO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBOEIsRUFBRSxNQUFjLEVBQUUsRUFBRTtZQUNqRSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs0R0E5SVUsZUFBZTtnR0FBZixlQUFlLHNLQ2hCNUIsMmZBY0E7MkZERWEsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxpQkFBaUI7a0dBUzNCLE1BQU07c0JBREwsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0gfSBmcm9tICcuLi8uLi8uLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLXZlcnRpY2FsLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRBbGlnbkVudW0gfSBmcm9tICcuLi8uLi8uLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE51bWJlckNsYXNzIH0gZnJvbSAnLi4vbnVtYmVyLmNsYXNzJztcblxuLyoqXG4gKiBUaGUgQWxpZW4gQ29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLXByaXNtLW51bWJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9udW1iZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9udW1iZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbnZhc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9hcmQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBDVFNcbiAgICovXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgLyoqXG4gICAqIHJlcXVlc3QgSWRcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdElkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsZXR0ZXJcbiAgICovXG4gIHByaXZhdGUgbnVtYmVyOiBOdW1iZXJDbGFzcztcblxuICAvKipcbiAgICogRGVidWcgQXNzZXRzXG4gICAqL1xuICBwdWJsaWMgYXNzZXRzOiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGdhbWVTZXJ2aWNlIFRoZSBHYW1lU2VydmljZSBmcm9tIERJXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSkge1xuICAgIHRoaXMuYXNzZXRzID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICd6ZXJvJyxcbiAgICAgICAgbmFtZTogJzAnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdvbmUnLFxuICAgICAgICBuYW1lOiAnMSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3R3bycsXG4gICAgICAgIG5hbWU6ICcyJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndGhyZWUnLFxuICAgICAgICBuYW1lOiAnMydcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvdXInLFxuICAgICAgICBuYW1lOiAnNCdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpdmUnLFxuICAgICAgICBuYW1lOiAnNSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NpeCcsXG4gICAgICAgIG5hbWU6ICc2J1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2V2ZW4nLFxuICAgICAgICBuYW1lOiAnNydcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2VpZ2h0JyxcbiAgICAgICAgbmFtZTogJzgnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICduaW5lJyxcbiAgICAgICAgbmFtZTogJzknXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBJbml0XG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCByb3dzID0gMzE7XG4gICAgY29uc3QgY29scyA9IDMxO1xuICAgIGNvbnN0IGdhbWVCb2FyZCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJvd3MgfSwgKCkgPT4gQXJyYXkoY29scykuZmlsbCgwKSBhcyBudW1iZXJbXSk7XG5cbiAgICB0aGlzLmN0eCA9IHRoaXMuZ2FtZVNlcnZpY2UuaW5pdEJvYXJkKHRoaXMuY2FudmFzLCByb3dzLCBjb2xzLCAyNSwgZ2FtZUJvYXJkKTtcbiAgICB0aGlzLmFkZE51bWJlcigpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgbGV0dGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGROdW1iZXIoKTogdm9pZCB7XG4gICAgY29uc3QgbnVtYmVyQ2xhc3MgPSBuZXcgTnVtYmVyQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgpO1xuICAgIG51bWJlckNsYXNzLm1vdmUobnVtYmVyQ2xhc3MucG9zaXRpb25Bc3NldChBc3NldEFsaWduRW51bS5jZW50ZXIsIEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0ubWlkZGxlKSk7XG4gICAgbnVtYmVyQ2xhc3Muc2V0TnVtYmVyKDAsIGZhbHNlKTtcbiAgICBudW1iZXJDbGFzcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICB0aGlzLm51bWJlciA9IG51bWJlckNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGUgdGhlIG9iamVjdCBvbmNlXG4gICAqL1xuICBhbmltYXRlQXNzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5udW1iZXIuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLm51bWJlci5tb3ZlKHRoaXMubnVtYmVyLnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmVxdWVzdElkKTtcbiAgICB0aGlzLmFuaW1hdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBib2FyZFxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3KCkge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuYWRkT3V0bGluZXModGhpcy5jdHgsIDEsIDAuMDI1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlXG4gICAqL1xuICBwdWJsaWMgYW5pbWF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICB0aGlzLm51bWJlci5hbmltYXRlKCk7XG4gICAgdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlLmJpbmQodGhpcykgYXMgRnJhbWVSZXF1ZXN0Q2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvZ2dsZUFzc2V0c1xuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBhc3NldCB0byBkaXNwbGF5XG4gICAqL1xuICB0b2dnbGVBc3NldHMoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICB0aGlzLmFzc2V0cy5tYXAoKGFzc2V0OiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCwgJGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChrZXkgPT09IGFzc2V0LmtleSkge1xuICAgICAgICB0aGlzLm51bWJlci5zZXROdW1iZXIoJGluZGV4LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFuaW1hdGVBc3NldCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2FtZS1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImFzc2V0LXRpdGxlXCI+TnVtYmVyczwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZ2FtZS1ib2FyZC1jb250YWluZXJcIj5cbiAgICA8Y2FudmFzICNib2FyZCBjbGFzcz1cImdhbWUtYm9hcmRcIj48L2NhbnZhcz5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiYW5pbWF0ZUFzc2V0KClcIiBjbGFzcz1cImFuaW1hdGlvbi1idXR0b24gYnV0dG9uXCI+QW5pbWF0ZTwvYnV0dG9uPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGFzc2V0IG9mIGFzc2V0c1wiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlQXNzZXRzKGFzc2V0LmtleSlcIiBjbGFzcz1cImFuaW1hdGlvbi1idXR0b24gYnV0dG9uXCI+XG4gICAgICAgIHt7IGFzc2V0Lm5hbWUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19