ngx-ui-hero
Version:
Simple, fast and reliable utilities for Angular.
481 lines • 78.5 kB
JavaScript
import { orderBy } from 'lodash-es';
import { EventEmitter, Injectable, RendererFactory2 } from '@angular/core';
import { NavigationStart, Router } from '@angular/router';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
export class TutorialService {
constructor(rendererFactory, router) {
this.rendererFactory = rendererFactory;
this.router = router;
this.onStepChanged = new EventEmitter();
this.onStart = new EventEmitter();
this.onExit = new EventEmitter();
this._currentTaskIndex = -1;
this.OVERLAY_ID = 'tutorial-orverlay';
this.BLOCKER_ID = 'element-blocker';
this.BLOCK_ID = 'element-tutorial-block';
this.BLOCK_ARROW_ID = 'element-tutorial-block-arrow';
this.BLOCK_TITLE_ID = 'element-tutorial-block-title';
this.BLOCK_BODY_ID = 'element-tutorial-block-body';
this.BLOCK_CONTROLS_ID = 'element-tutorial-block-controls';
this.BLOCK_CONTROL_PREV_ID = 'element-tutorial-block-prev-control';
this.BLOCK_CONTROL_NEXT_ID = 'element-tutorial-block-next-control';
this.BLOCK_CONTROL_INFO_ID = 'element-tutorial-block-info-control';
this.BLOCK_CONTROL_EXIT_ID = 'element-tutorial-block-exit-control';
this._render = rendererFactory.createRenderer(null, null);
this.router.events.subscribe((event) => {
if (event instanceof NavigationStart) {
this.resetTasks();
}
});
}
addAction(action, element) {
let index = -1;
if (!this._tasks) {
this._tasks = new Array();
}
else {
for (let i = 0; i < this._tasks.length; i++) {
if (this._tasks[i].element.nativeElement.tagName == element.nativeElement.tagName
&& this._tasks[i].action.title == action.title
&& this._tasks[i].action.text == action.text) {
index = i;
break;
}
}
}
let task = {
action: action,
element: element
};
if (index >= 0) {
this._tasks[index] = task;
}
else {
this._tasks.push(task);
}
}
playAll() {
if (this._currentTaskIndex >= 0)
return;
setTimeout(() => {
let tasks = this._tasks.filter(x => x.element && x.element.nativeElement && x.element.nativeElement.isConnected);
if (!tasks || tasks.length == 0)
return;
tasks = orderBy(tasks, ['action.order'], ['asc']);
this.play(tasks);
});
}
playByKey(key, onlyOnce) {
if (this._currentTaskIndex >= 0)
return;
setTimeout(() => {
if (onlyOnce && this.getLocalStorage(key))
return;
let tasks = this._tasks.filter(x => x.element && x.element.nativeElement && x.element.nativeElement.isConnected && x.action.key == key);
if (!tasks || tasks.length == 0)
return;
tasks = orderBy(tasks, ['action.order'], ['asc']);
this.play(tasks);
if (onlyOnce) {
this.setLocalStorage(key, key);
}
});
}
moveNext() {
if (this._currentTaskIndex >= this._runningTasks.length - 1) {
this.exit();
return;
}
this.destroyCurrentTask();
this._currentTaskIndex += 1;
this.renderCurrentTask();
this.notifyStepHasChanged();
}
movePrev() {
if (this._currentTaskIndex == 0)
return;
this.destroyCurrentTask();
this._currentTaskIndex -= 1;
this.renderCurrentTask();
this.notifyStepHasChanged();
}
exit() {
this.destroyCurrentTask();
this.destroyOverlay();
this.stopListeningKeyboardArrows();
this._currentTaskIndex = -1;
this._runningTasks = null;
this.onExit.emit();
}
resetTasks() {
this._tasks = new Array();
}
play(tasks) {
this.onStart.emit();
this._currentTaskIndex = 0;
this._runningTasks = tasks;
this.renderOverlay();
this.renderCurrentTask();
this.notifyStepHasChanged();
this.startListeningKeyboardArrows();
}
//rendering
renderCurrentTask() {
if (this._currentTaskIndex < 0)
return;
let task = this._runningTasks[this._currentTaskIndex];
this.renderElement(task);
this.scrollToCurrentElementBlock();
}
renderElement(task) {
this._render.setStyle(task.element.nativeElement, 'position', 'relative');
this._render.setStyle(task.element.nativeElement, 'zIndex', '9001');
this.renderElementBlocker(task.element);
this.renderElementColorWhiteIfText(task.element);
this.renderElementTutorialBlock(task);
}
renderElementBlocker(el) {
let blocker = this.createElementBlocker();
this._render.insertBefore(el.nativeElement.parentNode, blocker, el.nativeElement);
}
renderElementTutorialBlock(task) {
let block = this.createTutorialBlockElement(task);
this.handleTutorialBlockPosition(block, task.element);
this._render.insertBefore(task.element.nativeElement.parentNode, block, task.element.nativeElement);
}
renderElementColorWhiteIfText(el) {
if (this.isCurrentElementText()) {
this.colorPlaceholder = getComputedStyle(el.nativeElement, null).getPropertyValue('color');
this._render.setStyle(el.nativeElement, 'color', '#FFF');
}
}
renderOverlay() {
let overlay = this.createOverLay();
this._render.appendChild(document.body, overlay);
}
//element creations
createOverLay() {
let overlay = this._render.createElement('div');
this._render.setAttribute(overlay, 'id', this.OVERLAY_ID);
this._render.setStyle(overlay, 'position', 'fixed');
this._render.setStyle(overlay, 'width', '100%');
this._render.setStyle(overlay, 'height', '100%');
this._render.setStyle(overlay, 'backgroundColor', 'rgba(41, 41, 41, 0.89)');
this._render.setStyle(overlay, 'top', '0');
this._render.setStyle(overlay, 'zIndex', '9000');
this._render.setStyle(document.body, 'overflow', 'hidden');
return overlay;
}
createElementBlocker() {
let blocker = this._render.createElement('div');
this._render.setAttribute(blocker, 'id', this.BLOCKER_ID);
this._render.setStyle(blocker, 'background-color', '#00000024');
this._render.setStyle(blocker, 'position', 'fixed');
this._render.setStyle(blocker, 'top', '0');
this._render.setStyle(blocker, 'left', '0');
this._render.setStyle(blocker, 'bottom', '0');
this._render.setStyle(blocker, 'right', '0');
this._render.setStyle(blocker, 'zIndex', '9002');
return blocker;
}
createTutorialBlockElement(task) {
let block = this._render.createElement('div');
this._render.setAttribute(block, 'id', this.BLOCK_ID);
this._render.setStyle(block, 'position', 'fixed');
this._render.setStyle(block, 'zIndex', '9003');
this._render.setStyle(block, 'border', '3px solid #FFF');
this._render.setStyle(block, 'borderRadius', '5px');
this._render.setStyle(block, 'minWidth', '200px');
this._render.setStyle(block, 'maxWidth', '350px');
this._render.setStyle(block, 'transition', 'opacity .3s ease-in-out');
this.hideTutorialBlockElement(block);
this._render.appendChild(block, this.createTutorialBlockArrow());
if (task.action.title) {
this._render.appendChild(block, this.createTutorialBlockTitleElement(task.action.title));
}
this._render.appendChild(block, this.createTutorialBlockBodyElement(task.action.text));
this._render.appendChild(block, this.createTutorialBlockControls());
return block;
}
createTutorialBlockArrow() {
let arrow = this._render.createElement('div');
this._render.setAttribute(arrow, 'id', this.BLOCK_ARROW_ID);
this._render.setStyle(arrow, 'position', 'absolute');
this._render.setStyle(arrow, 'zIndex', '9003');
this._render.setStyle(arrow, 'width', '0');
this._render.setStyle(arrow, 'height', '0');
this._render.setStyle(arrow, 'border-top', '12px solid transparent');
this._render.setStyle(arrow, 'border-bottom', '12px solid transparent');
return arrow;
}
createTutorialBlockTitleElement(title) {
let blockTitle = this._render.createElement('div');
let blockTitleText = this._render.createText(title);
let btnExit = this.createTutorialBlockExitControl();
this._render.setAttribute(blockTitle, 'id', this.BLOCK_TITLE_ID);
this._render.setStyle(blockTitle, 'display', 'flex');
this._render.setStyle(blockTitle, 'align-items', 'center');
this._render.setStyle(blockTitle, 'backgroundColor', '#EEEEEE');
this._render.setStyle(blockTitle, 'color', 'rgb(84, 84, 84)');
this._render.setStyle(blockTitle, 'padding', '10px 12px');
this._render.setStyle(blockTitle, 'borderRadius', '5px 5px 0px 0px');
this._render.setStyle(blockTitle, 'borderBottom', '1px solid rgb(214, 214, 214)');
this._render.setStyle(blockTitle, 'font-size', '16px');
this._render.setStyle(blockTitle, 'font-weight', '600');
this._render.setStyle(blockTitle, 'text-transform', 'uppercase');
this._render.setStyle(blockTitle, 'margin', '-2px -2px 0px -2px');
if (blockTitleText) {
this._render.setStyle(blockTitle, 'fontSize', '16px');
this._render.setStyle(blockTitle, 'fontWeight', '600');
this._render.appendChild(blockTitle, blockTitleText);
}
this._render.appendChild(blockTitle, btnExit);
return blockTitle;
}
createTutorialBlockBodyElement(text) {
let blockBody = this._render.createElement('div');
let blockBodyText = this._render.createText(text);
this._render.setAttribute(blockBody, 'id', this.BLOCK_BODY_ID);
this._render.setStyle(blockBody, 'backgroundColor', '#FFF');
this._render.setStyle(blockBody, 'padding', '10px 10px 20px 10px');
if (blockBodyText) {
this._render.setStyle(blockBody, 'fontSize', '14px');
this._render.setStyle(blockBody, 'fontWeight', 'normal');
this._render.appendChild(blockBody, blockBodyText);
}
return blockBody;
}
createTutorialBlockControls() {
let controls = this._render.createElement('div');
this._render.setAttribute(controls, 'id', this.BLOCK_CONTROLS_ID);
this._render.setStyle(controls, 'backgroundColor', '#FFF');
this._render.setStyle(controls, 'padding', '10px 12px');
this._render.setStyle(controls, 'borderRadius', '0px 0px 5px 5px');
this._render.setStyle(controls, 'margin', '0 -2px -2px -2px');
this._render.setStyle(controls, 'display', 'flex');
this._render.setStyle(controls, 'align-items', 'center');
this._render.setStyle(controls, 'justify-content', 'flex-end');
this._render.appendChild(controls, this.createTutorialBlockInfoControl());
this._render.appendChild(controls, this.createTutorialBlockPrevControl());
this._render.appendChild(controls, this.createTutorialBlockNextControl());
return controls;
}
createTutorialBlockPrevControl() {
let button = this._render.createElement('button');
let icone = this._render.createElement('i');
this._render.setAttribute(button, 'id', this.BLOCK_CONTROL_PREV_ID);
this._render.addClass(button, 'btn');
this._render.addClass(button, 'btn-sm');
this._render.addClass(button, 'btn-primary');
this._render.addClass(button, 'mr-1');
this._render.addClass(icone, 'fa');
this._render.addClass(icone, 'fa-arrow-left');
this._render.appendChild(button, icone);
if (this._currentTaskIndex == 0) {
this._render.setAttribute(button, 'disabled', 'disabled');
}
else {
this._render.listen(button, 'click', () => {
this.movePrev();
});
}
return button;
}
createTutorialBlockNextControl() {
let button = this._render.createElement('button');
let icone = this._render.createElement('i');
this._render.setAttribute(button, 'id', this.BLOCK_CONTROL_NEXT_ID);
this._render.addClass(button, 'btn');
this._render.addClass(button, 'btn-sm');
this._render.addClass(button, 'mr-1');
this._render.addClass(icone, 'fa');
this._render.appendChild(button, icone);
if (this._currentTaskIndex >= this._runningTasks.length - 1) {
this._render.addClass(icone, 'fa-times');
this._render.addClass(button, 'btn-outline-primary');
}
else {
this._render.addClass(icone, 'fa-arrow-right');
this._render.addClass(button, 'btn-primary');
}
this._render.listen(button, 'click', () => {
this.moveNext();
});
return button;
}
createTutorialBlockExitControl() {
let icone = this._render.createElement('i');
this._render.setAttribute(icone, 'id', this.BLOCK_CONTROL_EXIT_ID);
this._render.addClass(icone, 'ml-auto');
this._render.addClass(icone, 'fa');
this._render.addClass(icone, 'fa-times');
this._render.setStyle(icone, 'cursor', 'pointer');
this._render.listen(icone, 'click', () => {
this.exit();
});
return icone;
}
createTutorialBlockInfoControl() {
let span = this._render.createElement('small');
this._render.setAttribute(span, 'id', this.BLOCK_CONTROL_INFO_ID);
this._render.addClass(span, 'mr-auto');
this._render.setStyle(span, 'fontSize', '12px');
this._render.setStyle(span, 'fontWeight', 'normal');
this._render.appendChild(span, this._render.createText(`${this._currentTaskIndex + 1}/${this._runningTasks.length}`));
return span;
}
//element destroy
destroyCurrentTask() {
this.destroyElementById(this.BLOCKER_ID);
this.destroyElementById(this.BLOCK_ID);
let currentElement = this._runningTasks[this._currentTaskIndex].element;
if (this.isCurrentElementText() && this.colorPlaceholder) {
this._render.setStyle(currentElement.nativeElement, 'color', this.colorPlaceholder);
this.colorPlaceholder = null;
}
this._render.removeStyle(currentElement.nativeElement, 'position');
this._render.removeStyle(currentElement.nativeElement, 'zIndex');
}
destroyOverlay() {
this.destroyElementById(this.OVERLAY_ID);
this._render.removeStyle(document.body, 'overflow');
}
destroyElementById(id) {
let el = document.getElementById(id);
this._render.removeChild(el.parentNode, el);
}
//aux
handleTutorialBlockPosition(block, el) {
setTimeout(() => {
this.setTutorialBlockPosition(block, el);
}, 0);
this._render.listen(window, 'resize', () => {
this.setTutorialBlockPosition(block, el);
});
}
setTutorialBlockPosition(block, el) {
let arrow = document.getElementById(this.BLOCK_ARROW_ID);
let elementRect = el.nativeElement.getBoundingClientRect();
let top = elementRect.top;
let left = elementRect.left + elementRect.width + 20;
let blockHeight = $(block).height();
let blockWidth = $(block).width();
let isCurrentBlockOnBottomOfScreen = this.isCurrentBlockOnBottomOfScreen();
let isCurrentBlockOnRightOfScreen = this.isCurrentBlockOnRightOfScreen();
let arrowBorder = isCurrentBlockOnRightOfScreen ? 'border-left' : 'border-right';
let arrowPositionX = isCurrentBlockOnRightOfScreen ? 'right' : 'left';
let arrowPositionY = isCurrentBlockOnBottomOfScreen ? 'bottom' : 'top';
let arrowColor = isCurrentBlockOnBottomOfScreen ? '#FFF' : '#EEE';
if (isCurrentBlockOnBottomOfScreen) {
top -= blockHeight - 32;
}
if (isCurrentBlockOnRightOfScreen) {
left -= blockWidth + elementRect.width + 45;
}
if ((left + blockWidth) >= document.body.clientWidth) {
left -= blockWidth + 45;
}
if (arrow) {
this._render.setStyle(arrow, arrowBorder, `15px solid ${arrowColor}`);
this._render.setStyle(arrow, arrowPositionX, `-17px`);
this._render.setStyle(arrow, arrowPositionY, `8px`);
}
this._render.setStyle(block, 'top', this.getNumberInPx(top));
this._render.setStyle(block, 'left', this.getNumberInPx(left));
}
getNumberInPx(value) {
return value + 'px';
}
scrollToCurrentElementBlock() {
setTimeout(() => {
let block = document.getElementById(this.BLOCK_ID);
let el = this._runningTasks[this._currentTaskIndex].element;
let offsetTopFromBody = $(el.nativeElement).offset().top;
let elementY = offsetTopFromBody - 150;
$('html').animate({
scrollTop: elementY,
duration: 0
}, () => {
this.setTutorialBlockPosition(block, el);
this.fadeInTutorialBlockElement(block);
});
});
}
hideTutorialBlockElement(block) {
this._render.setStyle(block, 'opacity', '0');
}
fadeInTutorialBlockElement(block) {
this._render.setStyle(block, 'opacity', '1');
}
isCurrentBlockOnBottomOfScreen() {
if (this._currentTaskIndex < 0)
return false;
let el = this._runningTasks[this._currentTaskIndex].element;
let elementRect = el.nativeElement.getBoundingClientRect();
let top = elementRect.top;
let offsetTopFromBody = $(el.nativeElement).offset().top;
return top > document.body.scrollHeight - offsetTopFromBody;
}
isCurrentBlockOnRightOfScreen() {
if (this._currentTaskIndex < 0)
return false;
let el = this._runningTasks[this._currentTaskIndex].element;
let offsetLeftFromBody = $(el.nativeElement).offset().left;
return offsetLeftFromBody >= document.body.clientWidth / 2;
}
isCurrentElementText() {
if (this._currentTaskIndex < 0)
return false;
const allowedTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'span', 'small', 'p'];
let el = this._runningTasks[this._currentTaskIndex].element;
return allowedTags.filter(x => x.toUpperCase() == el.nativeElement.tagName).length == 1;
}
notifyStepHasChanged() {
this.onStepChanged.emit(this._runningTasks[this._currentTaskIndex]);
}
startListeningKeyboardArrows() {
this.unlistenKeyboardArrows = this._render.listen(document.body, 'keyup', (event) => {
switch (event.keyCode) {
case 27:
this.exit();
break;
case 37:
this.movePrev();
break;
case 13:
case 39:
this.moveNext();
break;
}
event.stopImmediatePropagation();
});
}
stopListeningKeyboardArrows() {
this.unlistenKeyboardArrows();
}
//localstorage
getLocalStorage(key) {
const result = localStorage.getItem(`Ui-Hero-Turorial-${key}`);
if (typeof result === 'string') {
return result;
}
else {
return JSON.parse(result);
}
}
setLocalStorage(key, value) {
if (typeof value === 'string') {
localStorage.setItem(`Ui-Hero-Turorial-${key}`, value);
}
else {
localStorage.setItem(`Ui-Hero-Turorial-${key}`, JSON.stringify(value));
}
}
}
TutorialService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialService, deps: [{ token: i0.RendererFactory2 }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
TutorialService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.RendererFactory2 }, { type: i1.Router }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHV0b3JpYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC11aS1oZXJvL3NyYy9saWIvdWkvc2VydmljZXMvdHV0b3JpYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFhLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQVMxRCxNQUFNLE9BQU8sZUFBZTtJQXdCeEIsWUFDWSxlQUFpQyxFQUNqQyxNQUFjO1FBRGQsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBQ2pDLFdBQU0sR0FBTixNQUFNLENBQVE7UUF6QjFCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDakQsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJcEIsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFLL0IsZUFBVSxHQUFHLG1CQUFtQixDQUFDO1FBQ2pDLGVBQVUsR0FBRyxpQkFBaUIsQ0FBQztRQUMvQixhQUFRLEdBQUcsd0JBQXdCLENBQUM7UUFDcEMsbUJBQWMsR0FBRyw4QkFBOEIsQ0FBQztRQUNoRCxtQkFBYyxHQUFHLDhCQUE4QixDQUFDO1FBQ2hELGtCQUFhLEdBQUcsNkJBQTZCLENBQUM7UUFDOUMsc0JBQWlCLEdBQUcsaUNBQWlDLENBQUM7UUFDdEQsMEJBQXFCLEdBQUcscUNBQXFDLENBQUM7UUFDOUQsMEJBQXFCLEdBQUcscUNBQXFDLENBQUM7UUFDOUQsMEJBQXFCLEdBQUcscUNBQXFDLENBQUM7UUFDOUQsMEJBQXFCLEdBQUcscUNBQXFDLENBQUM7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Q0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNoQixNQUFNO2FBQ2I7WUFFRCxLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDTywyQkFBMkI7UUFDL0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGNBQWM7SUFDTixlQUFlLENBQUMsR0FBVztRQUMvQixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzVCLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBQ08sZUFBZSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzNDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzNCLFlBQVksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzFEO2FBQU07WUFDSCxZQUFZLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDMUU7SUFDTCxDQUFDOzs2R0FoaUJRLGVBQWU7aUhBQWYsZUFBZTs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IFR1dG9yaWFsQWN0aW9uIH0gZnJvbSAnLi4vY2xhc3Nlcy90dXRvcmlhbC1hY3Rpb24nO1xuaW1wb3J0IHsgVHV0b3JpYWxUYXNrIH0gZnJvbSAnLi4vY2xhc3Nlcy90dXRvcmlhbC10YXNrJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuZGVjbGFyZSB2YXIgbG9jYWxTdG9yYWdlOiBhbnk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUdXRvcmlhbFNlcnZpY2Uge1xuICAgIG9uU3RlcENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFR1dG9yaWFsVGFzaz4oKTtcbiAgICBvblN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIG9uRXhpdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByaXZhdGUgX3Rhc2tzOiBBcnJheTxUdXRvcmlhbFRhc2s+O1xuICAgIHByaXZhdGUgX3J1bm5pbmdUYXNrczogQXJyYXk8VHV0b3JpYWxUYXNrPjtcbiAgICBwcml2YXRlIF9jdXJyZW50VGFza0luZGV4OiBudW1iZXIgPSAtMTtcbiAgICBwcml2YXRlIF9yZW5kZXI6IFJlbmRlcmVyMjtcbiAgICBwcml2YXRlIGNvbG9yUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBwcml2YXRlIHVubGlzdGVuS2V5Ym9hcmRBcnJvd3M6IEZ1bmN0aW9uO1xuXG4gICAgcHJpdmF0ZSBPVkVSTEFZX0lEID0gJ3R1dG9yaWFsLW9ydmVybGF5JztcbiAgICBwcml2YXRlIEJMT0NLRVJfSUQgPSAnZWxlbWVudC1ibG9ja2VyJztcbiAgICBwcml2YXRlIEJMT0NLX0lEID0gJ2VsZW1lbnQtdHV0b3JpYWwtYmxvY2snO1xuICAgIHByaXZhdGUgQkxPQ0tfQVJST1dfSUQgPSAnZWxlbWVudC10dXRvcmlhbC1ibG9jay1hcnJvdyc7XG4gICAgcHJpdmF0ZSBCTE9DS19USVRMRV9JRCA9ICdlbGVtZW50LXR1dG9yaWFsLWJsb2NrLXRpdGxlJztcbiAgICBwcml2YXRlIEJMT0NLX0JPRFlfSUQgPSAnZWxlbWVudC10dXRvcmlhbC1ibG9jay1ib2R5JztcbiAgICBwcml2YXRlIEJMT0NLX0NPTlRST0xTX0lEID0gJ2VsZW1lbnQtdHV0b3JpYWwtYmxvY2stY29udHJvbHMnO1xuICAgIHByaXZhdGUgQkxPQ0tfQ09OVFJPTF9QUkVWX0lEID0gJ2VsZW1lbnQtdHV0b3JpYWwtYmxvY2stcHJldi1jb250cm9sJztcbiAgICBwcml2YXRlIEJMT0NLX0NPTlRST0xfTkVYVF9JRCA9ICdlbGVtZW50LXR1dG9yaWFsLWJsb2NrLW5leHQtY29udHJvbCc7XG4gICAgcHJpdmF0ZSBCTE9DS19DT05UUk9MX0lORk9fSUQgPSAnZWxlbWVudC10dXRvcmlhbC1ibG9jay1pbmZvLWNvbnRyb2wnO1xuICAgIHByaXZhdGUgQkxPQ0tfQ09OVFJPTF9FWElUX0lEID0gJ2VsZW1lbnQtdHV0b3JpYWwtYmxvY2stZXhpdC1jb250cm9sJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICAgICkge1xuICAgICAgICB0aGlzLl9yZW5kZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRUYXNrcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRBY3Rpb24oYWN0aW9uOiBUdXRvcmlhbEFjdGlvbiwgZWxlbWVudDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IC0xO1xuXG4gICAgICAgIGlmICghdGhpcy5fdGFza3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tzID0gbmV3IEFycmF5PFR1dG9yaWFsVGFzaz4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFza3NbaV0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnRhZ05hbWUgPT0gZWxlbWVudC5uYXRpdmVFbGVtZW50LnRhZ05hbWVcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fdGFza3NbaV0uYWN0aW9uLnRpdGxlID09IGFjdGlvbi50aXRsZSBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fdGFza3NbaV0uYWN0aW9uLnRleHQgPT0gYWN0aW9uLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhc2sgPSB7IFxuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sIFxuICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl90YXNrc1tpbmRleF0gPSB0YXNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYXlBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VGFza0luZGV4ID49IDApIHJldHVybjtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCB0YXNrcyA9IHRoaXMuX3Rhc2tzLmZpbHRlcih4ID0+IHguZWxlbWVudCAmJiB4LmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5pc0Nvbm5lY3RlZCk7XG4gICAgICAgICAgICBpZiAoIXRhc2tzIHx8IHRhc2tzLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRhc2tzID0gb3JkZXJCeSh0YXNrcywgWydhY3Rpb24ub3JkZXInXSwgWydhc2MnXSk7XG5cbiAgICAgICAgICAgIHRoaXMucGxheSh0YXNrcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwbGF5QnlLZXkoa2V5OiBzdHJpbmcsIG9ubHlPbmNlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhc2tJbmRleCA+PSAwKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvbmx5T25jZSAmJiB0aGlzLmdldExvY2FsU3RvcmFnZShrZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCB0YXNrcyA9IHRoaXMuX3Rhc2tzLmZpbHRlcih4ID0+IHguZWxlbWVudCAmJiB4LmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5pc0Nvbm5lY3RlZCAmJiB4LmFjdGlvbi5rZXkgPT0ga2V5KTtcbiAgICAgICAgICAgIGlmICghdGFza3MgfHwgdGFza3MubGVuZ3RoID09IDApIHJldHVybjtcblxuICAgICAgICAgICAgdGFza3MgPSBvcmRlckJ5KHRhc2tzLCBbJ2FjdGlvbi5vcmRlciddLCBbJ2FzYyddKTtcblxuICAgICAgICAgICAgdGhpcy5wbGF5KHRhc2tzKTtcblxuICAgICAgICAgICAgaWYgKG9ubHlPbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoa2V5LCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW92ZU5leHQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VGFza0luZGV4ID49IHRoaXMuX3J1bm5pbmdUYXNrcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmV4aXQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJveUN1cnJlbnRUYXNrKCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXNrSW5kZXggKz0gMTtcbiAgICAgICAgdGhpcy5yZW5kZXJDdXJyZW50VGFzaygpO1xuICAgICAgICB0aGlzLm5vdGlmeVN0ZXBIYXNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIG1vdmVQcmV2KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhc2tJbmRleCA9PSAwKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5kZXN0cm95Q3VycmVudFRhc2soKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhc2tJbmRleCAtPSAxO1xuICAgICAgICB0aGlzLnJlbmRlckN1cnJlbnRUYXNrKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RlcEhhc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgZXhpdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95Q3VycmVudFRhc2soKTtcbiAgICAgICAgdGhpcy5kZXN0cm95T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5pbmdLZXlib2FyZEFycm93cygpO1xuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXNrSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5fcnVubmluZ1Rhc2tzID0gbnVsbDtcblxuICAgICAgICB0aGlzLm9uRXhpdC5lbWl0KCk7XG4gICAgfVxuICAgIHJlc2V0VGFza3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tzID0gbmV3IEFycmF5PFR1dG9yaWFsVGFzaz4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYXkodGFza3M6IEFycmF5PFR1dG9yaWFsVGFzaz4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblN0YXJ0LmVtaXQoKTtcblxuICAgICAgICB0aGlzLl9jdXJyZW50VGFza0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fcnVubmluZ1Rhc2tzID0gdGFza3M7XG4gICAgICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnJlbmRlckN1cnJlbnRUYXNrKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RlcEhhc0NoYW5nZWQoKTtcbiAgICAgICAgdGhpcy5zdGFydExpc3RlbmluZ0tleWJvYXJkQXJyb3dzKCk7XG4gICAgfVxuXG4gICAgLy9yZW5kZXJpbmdcbiAgICBwcml2YXRlIHJlbmRlckN1cnJlbnRUYXNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhc2tJbmRleCA8IDApIHJldHVybjtcblxuICAgICAgICBsZXQgdGFzayA9IHRoaXMuX3J1bm5pbmdUYXNrc1t0aGlzLl9jdXJyZW50VGFza0luZGV4XTtcblxuICAgICAgICB0aGlzLnJlbmRlckVsZW1lbnQodGFzayk7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9DdXJyZW50RWxlbWVudEJsb2NrKCk7XG4gICAgfVxuICAgIHByaXZhdGUgcmVuZGVyRWxlbWVudCh0YXNrOiBUdXRvcmlhbFRhc2spOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKHRhc2suZWxlbWVudC5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKHRhc2suZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnekluZGV4JywgJzkwMDEnKTtcblxuICAgICAgICB0aGlzLnJlbmRlckVsZW1lbnRCbG9ja2VyKHRhc2suZWxlbWVudCk7XG4gICAgICAgIHRoaXMucmVuZGVyRWxlbWVudENvbG9yV2hpdGVJZlRleHQodGFzay5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5yZW5kZXJFbGVtZW50VHV0b3JpYWxCbG9jayh0YXNrKTtcbiAgICB9XG4gICAgcHJpdmF0ZSByZW5kZXJFbGVtZW50QmxvY2tlcihlbDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgICAgICBsZXQgYmxvY2tlciA9IHRoaXMuY3JlYXRlRWxlbWVudEJsb2NrZXIoKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIuaW5zZXJ0QmVmb3JlKGVsLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZSwgYmxvY2tlciwgZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIHByaXZhdGUgcmVuZGVyRWxlbWVudFR1dG9yaWFsQmxvY2sodGFzazogVHV0b3JpYWxUYXNrKTogdm9pZCB7XG4gICAgICAgIGxldCBibG9jayA9IHRoaXMuY3JlYXRlVHV0b3JpYWxCbG9ja0VsZW1lbnQodGFzayk7XG4gICAgICAgIHRoaXMuaGFuZGxlVHV0b3JpYWxCbG9ja1Bvc2l0aW9uKGJsb2NrLCB0YXNrLmVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlci5pbnNlcnRCZWZvcmUodGFzay5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZSwgYmxvY2ssIHRhc2suZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgcHJpdmF0ZSByZW5kZXJFbGVtZW50Q29sb3JXaGl0ZUlmVGV4dChlbDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0N1cnJlbnRFbGVtZW50VGV4dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yUGxhY2Vob2xkZXIgPSBnZXRDb21wdXRlZFN0eWxlKGVsLm5hdGl2ZUVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2NvbG9yJyk7XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShlbC5uYXRpdmVFbGVtZW50LCAnY29sb3InLCAnI0ZGRicpO1xuICAgICAgICB9ICAgICAgICBcbiAgICB9XG4gICAgcHJpdmF0ZSByZW5kZXJPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICBsZXQgb3ZlcmxheSA9IHRoaXMuY3JlYXRlT3ZlckxheSgpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBvdmVybGF5KTtcbiAgICB9XG4gICAgXG4gICAgLy9lbGVtZW50IGNyZWF0aW9uc1xuICAgIHByaXZhdGUgY3JlYXRlT3ZlckxheSgpOiBhbnkge1xuICAgICAgICBsZXQgb3ZlcmxheSA9IHRoaXMuX3JlbmRlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldEF0dHJpYnV0ZShvdmVybGF5LCAnaWQnLCB0aGlzLk9WRVJMQVlfSUQpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUob3ZlcmxheSwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShvdmVybGF5LCAnd2lkdGgnLCAnMTAwJScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUob3ZlcmxheSwgJ2hlaWdodCcsICcxMDAlJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShvdmVybGF5LCAnYmFja2dyb3VuZENvbG9yJywgJ3JnYmEoNDEsIDQxLCA0MSwgMC44OSknKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKG92ZXJsYXksICd0b3AnLCAnMCcpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUob3ZlcmxheSwgJ3pJbmRleCcsICc5MDAwJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XG5cbiAgICAgICAgcmV0dXJuIG92ZXJsYXk7XG4gICAgfVxuICAgIHByaXZhdGUgY3JlYXRlRWxlbWVudEJsb2NrZXIoKTogYW55IHtcbiAgICAgICAgbGV0IGJsb2NrZXIgPSB0aGlzLl9yZW5kZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRBdHRyaWJ1dGUoYmxvY2tlciwgJ2lkJywgdGhpcy5CTE9DS0VSX0lEKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrZXIsICdiYWNrZ3JvdW5kLWNvbG9yJywgJyMwMDAwMDAyNCcpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2tlciwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja2VyLCAndG9wJywgJzAnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrZXIsICdsZWZ0JywgJzAnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrZXIsICdib3R0b20nLCAnMCcpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2tlciwgJ3JpZ2h0JywgJzAnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrZXIsICd6SW5kZXgnLCAnOTAwMicpO1xuXG4gICAgICAgIHJldHVybiBibG9ja2VyO1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0ZVR1dG9yaWFsQmxvY2tFbGVtZW50KHRhc2s6IFR1dG9yaWFsVGFzayk6IGFueSB7XG4gICAgICAgIGxldCBibG9jayA9IHRoaXMuX3JlbmRlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldEF0dHJpYnV0ZShibG9jaywgJ2lkJywgdGhpcy5CTE9DS19JRCk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ3pJbmRleCcsICc5MDAzJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ2JvcmRlcicsICczcHggc29saWQgI0ZGRicpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2ssICdib3JkZXJSYWRpdXMnLCAnNXB4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ21pbldpZHRoJywgJzIwMHB4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ21heFdpZHRoJywgJzM1MHB4Jyk7ICAgICAgICBcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrLCAndHJhbnNpdGlvbicsICdvcGFjaXR5IC4zcyBlYXNlLWluLW91dCcpO1xuXG4gICAgICAgIHRoaXMuaGlkZVR1dG9yaWFsQmxvY2tFbGVtZW50KGJsb2NrKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3JlbmRlci5hcHBlbmRDaGlsZChibG9jaywgdGhpcy5jcmVhdGVUdXRvcmlhbEJsb2NrQXJyb3coKSk7XG5cbiAgICAgICAgaWYgKHRhc2suYWN0aW9uLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIuYXBwZW5kQ2hpbGQoYmxvY2ssIHRoaXMuY3JlYXRlVHV0b3JpYWxCbG9ja1RpdGxlRWxlbWVudCh0YXNrLmFjdGlvbi50aXRsZSkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLl9yZW5kZXIuYXBwZW5kQ2hpbGQoYmxvY2ssIHRoaXMuY3JlYXRlVHV0b3JpYWxCbG9ja0JvZHlFbGVtZW50KHRhc2suYWN0aW9uLnRleHQpKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLmFwcGVuZENoaWxkKGJsb2NrLCB0aGlzLmNyZWF0ZVR1dG9yaWFsQmxvY2tDb250cm9scygpKTtcblxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgfVxuICAgIHByaXZhdGUgY3JlYXRlVHV0b3JpYWxCbG9ja0Fycm93KCk6IGFueSB7XG4gICAgICAgIGxldCBhcnJvdyA9IHRoaXMuX3JlbmRlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0QXR0cmlidXRlKGFycm93LCAnaWQnLCB0aGlzLkJMT0NLX0FSUk9XX0lEKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGFycm93LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGFycm93LCAnekluZGV4JywgJzkwMDMnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGFycm93LCAnd2lkdGgnLCAnMCcpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYXJyb3csICdoZWlnaHQnLCAnMCcpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYXJyb3csICdib3JkZXItdG9wJywgJzEycHggc29saWQgdHJhbnNwYXJlbnQnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGFycm93LCAnYm9yZGVyLWJvdHRvbScsICcxMnB4IHNvbGlkIHRyYW5zcGFyZW50Jyk7ICAgICAgICBcblxuICAgICAgICByZXR1cm4gYXJyb3c7XG4gICAgfVxuICAgIHByaXZhdGUgY3JlYXRlVHV0b3JpYWxCbG9ja1RpdGxlRWxlbWVudCh0aXRsZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgbGV0IGJsb2NrVGl0bGUgPSB0aGlzLl9yZW5kZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGxldCBibG9ja1RpdGxlVGV4dCA9IHRoaXMuX3JlbmRlci5jcmVhdGVUZXh0KHRpdGxlKTtcbiAgICAgICAgbGV0IGJ0bkV4aXQgPSB0aGlzLmNyZWF0ZVR1dG9yaWFsQmxvY2tFeGl0Q29udHJvbCgpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRBdHRyaWJ1dGUoYmxvY2tUaXRsZSwgJ2lkJywgdGhpcy5CTE9DS19USVRMRV9JRCk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAnZGlzcGxheScsICdmbGV4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAnYWxpZ24taXRlbXMnLCAnY2VudGVyJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAnYmFja2dyb3VuZENvbG9yJywgJyNFRUVFRUUnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrVGl0bGUsICdjb2xvcicsICdyZ2IoODQsIDg0LCA4NCknKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrVGl0bGUsICdwYWRkaW5nJywgJzEwcHggMTJweCcpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2tUaXRsZSwgJ2JvcmRlclJhZGl1cycsICc1cHggNXB4IDBweCAwcHgnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrVGl0bGUsICdib3JkZXJCb3R0b20nLCAnMXB4IHNvbGlkIHJnYigyMTQsIDIxNCwgMjE0KScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2tUaXRsZSwgJ2ZvbnQtc2l6ZScsICcxNnB4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAnZm9udC13ZWlnaHQnLCAnNjAwJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAndGV4dC10cmFuc2Zvcm0nLCAndXBwZXJjYXNlJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAnbWFyZ2luJywgJy0ycHggLTJweCAwcHggLTJweCcpOyAgICAgICAgXG5cbiAgICAgICAgaWYgKGJsb2NrVGl0bGVUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2tUaXRsZSwgJ2ZvbnRTaXplJywgJzE2cHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja1RpdGxlLCAnZm9udFdlaWdodCcsICc2MDAnKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5hcHBlbmRDaGlsZChibG9ja1RpdGxlLCBibG9ja1RpdGxlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3JlbmRlci5hcHBlbmRDaGlsZChibG9ja1RpdGxlLCBidG5FeGl0KTtcblxuICAgICAgICByZXR1cm4gYmxvY2tUaXRsZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjcmVhdGVUdXRvcmlhbEJsb2NrQm9keUVsZW1lbnQodGV4dDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgbGV0IGJsb2NrQm9keSA9IHRoaXMuX3JlbmRlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbGV0IGJsb2NrQm9keVRleHQgPSB0aGlzLl9yZW5kZXIuY3JlYXRlVGV4dCh0ZXh0KTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0QXR0cmlidXRlKGJsb2NrQm9keSwgJ2lkJywgdGhpcy5CTE9DS19CT0RZX0lEKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrQm9keSwgJ2JhY2tncm91bmRDb2xvcicsICcjRkZGJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja0JvZHksICdwYWRkaW5nJywgJzEwcHggMTBweCAyMHB4IDEwcHgnKTtcblxuICAgICAgICBpZiAoYmxvY2tCb2R5VGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGJsb2NrQm9keSwgJ2ZvbnRTaXplJywgJzE0cHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9ja0JvZHksICdmb250V2VpZ2h0JywgJ25vcm1hbCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyLmFwcGVuZENoaWxkKGJsb2NrQm9keSwgYmxvY2tCb2R5VGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmxvY2tCb2R5O1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0ZVR1dG9yaWFsQmxvY2tDb250cm9scygpOiBhbnkge1xuICAgICAgICBsZXQgY29udHJvbHMgPSB0aGlzLl9yZW5kZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldEF0dHJpYnV0ZShjb250cm9scywgJ2lkJywgdGhpcy5CTE9DS19DT05UUk9MU19JRCk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShjb250cm9scywgJ2JhY2tncm91bmRDb2xvcicsICcjRkZGJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShjb250cm9scywgJ3BhZGRpbmcnLCAnMTBweCAxMnB4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShjb250cm9scywgJ2JvcmRlclJhZGl1cycsICcwcHggMHB4IDVweCA1cHgnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGNvbnRyb2xzLCAnbWFyZ2luJywgJzAgLTJweCAtMnB4IC0ycHgnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGNvbnRyb2xzLCAnZGlzcGxheScsICdmbGV4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShjb250cm9scywgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoY29udHJvbHMsICdqdXN0aWZ5LWNvbnRlbnQnLCAnZmxleC1lbmQnKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIuYXBwZW5kQ2hpbGQoY29udHJvbHMsIHRoaXMuY3JlYXRlVHV0b3JpYWxCbG9ja0luZm9Db250cm9sKCkpOyAgIFxuICAgICAgICB0aGlzLl9yZW5kZXIuYXBwZW5kQ2hpbGQoY29udHJvbHMsIHRoaXMuY3JlYXRlVHV0b3JpYWxCbG9ja1ByZXZDb250cm9sKCkpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYXBwZW5kQ2hpbGQoY29udHJvbHMsIHRoaXMuY3JlYXRlVHV0b3JpYWxCbG9ja05leHRDb250cm9sKCkpOyAgICAgXG5cbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzO1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0ZVR1dG9yaWFsQmxvY2tQcmV2Q29udHJvbCgpOiBhbnkge1xuICAgICAgICBsZXQgYnV0dG9uID0gdGhpcy5fcmVuZGVyLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICBsZXQgaWNvbmUgPSB0aGlzLl9yZW5kZXIuY3JlYXRlRWxlbWVudCgnaScpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldEF0dHJpYnV0ZShidXR0b24sICdpZCcsIHRoaXMuQkxPQ0tfQ09OVFJPTF9QUkVWX0lEKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLmFkZENsYXNzKGJ1dHRvbiwgJ2J0bicpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoYnV0dG9uLCAnYnRuLXNtJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5hZGRDbGFzcyhidXR0b24sICdidG4tcHJpbWFyeScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoYnV0dG9uLCAnbXItMScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoaWNvbmUsICdmYScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoaWNvbmUsICdmYS1hcnJvdy1sZWZ0Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5hcHBlbmRDaGlsZChidXR0b24sIGljb25lKTtcblxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhc2tJbmRleCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIuc2V0QXR0cmlidXRlKGJ1dHRvbiwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIubGlzdGVuKGJ1dHRvbiwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZVByZXYoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBjcmVhdGVUdXRvcmlhbEJsb2NrTmV4dENvbnRyb2woKTogYW55IHtcbiAgICAgICAgbGV0IGJ1dHRvbiA9IHRoaXMuX3JlbmRlci5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgbGV0IGljb25lID0gdGhpcy5fcmVuZGVyLmNyZWF0ZUVsZW1lbnQoJ2knKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAnaWQnLCB0aGlzLkJMT0NLX0NPTlRST0xfTkVYVF9JRCk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5hZGRDbGFzcyhidXR0b24sICdidG4nKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLmFkZENsYXNzKGJ1dHRvbiwgJ2J0bi1zbScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoYnV0dG9uLCAnbXItMScpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoaWNvbmUsICdmYScpOyAgICAgICAgXG4gICAgICAgIHRoaXMuX3JlbmRlci5hcHBlbmRDaGlsZChidXR0b24sIGljb25lKTtcblxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhc2tJbmRleCA+PSB0aGlzLl9ydW5uaW5nVGFza3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyLmFkZENsYXNzKGljb25lLCAnZmEtdGltZXMnKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5hZGRDbGFzcyhidXR0b24sICdidG4tb3V0bGluZS1wcmltYXJ5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoaWNvbmUsICdmYS1hcnJvdy1yaWdodCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyLmFkZENsYXNzKGJ1dHRvbiwgJ2J0bi1wcmltYXJ5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW5kZXIubGlzdGVuKGJ1dHRvbiwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb3ZlTmV4dCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cbiAgICBwcml2YXRlIGNyZWF0ZVR1dG9yaWFsQmxvY2tFeGl0Q29udHJvbCgpOiBhbnkge1xuICAgICAgICBsZXQgaWNvbmUgPSB0aGlzLl9yZW5kZXIuY3JlYXRlRWxlbWVudCgnaScpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldEF0dHJpYnV0ZShpY29uZSwgJ2lkJywgdGhpcy5CTE9DS19DT05UUk9MX0VYSVRfSUQpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3MoaWNvbmUsICdtbC1hdXRvJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5hZGRDbGFzcyhpY29uZSwgJ2ZhJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5hZGRDbGFzcyhpY29uZSwgJ2ZhLXRpbWVzJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShpY29uZSwgJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyLmxpc3RlbihpY29uZSwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leGl0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpY29uZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjcmVhdGVUdXRvcmlhbEJsb2NrSW5mb0NvbnRyb2woKTogYW55IHtcbiAgICAgICAgbGV0IHNwYW4gPSB0aGlzLl9yZW5kZXIuY3JlYXRlRWxlbWVudCgnc21hbGwnKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRBdHRyaWJ1dGUoc3BhbiwgJ2lkJywgdGhpcy5CTE9DS19DT05UUk9MX0lORk9fSUQpO1xuICAgICAgICB0aGlzLl9yZW5kZXIuYWRkQ2xhc3Moc3BhbiwgJ21yLWF1dG8nKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKHNwYW4sICdmb250U2l6ZScsICcxMnB4Jyk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShzcGFuLCAnZm9udFdlaWdodCcsICdub3JtYWwnKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyLmFwcGVuZENoaWxkKHNwYW4sIHRoaXMuX3JlbmRlci5jcmVhdGVUZXh0KGAke3RoaXMuX2N1cnJlbnRUYXNrSW5kZXggKyAxfS8ke3RoaXMuX3J1bm5pbmdUYXNrcy5sZW5ndGh9YCkpO1xuXG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cblxuICAgIC8vZWxlbWVudCBkZXN0cm95XG4gICAgcHJpdmF0ZSBkZXN0cm95Q3VycmVudFRhc2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveUVsZW1lbnRCeUlkKHRoaXMuQkxPQ0tFUl9JRCk7XG4gICAgICAgIHRoaXMuZGVzdHJveUVsZW1lbnRCeUlkKHRoaXMuQkxPQ0tfSUQpO1xuXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IHRoaXMuX3J1bm5pbmdUYXNrc1t0aGlzLl9jdXJyZW50VGFza0luZGV4XS5lbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmlzQ3VycmVudEVsZW1lbnRUZXh0KCkgJiYgdGhpcy5jb2xvclBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NvbG9yJywgdGhpcy5jb2xvclBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgIHRoaXMuY29sb3JQbGFjZWhvbGRlciA9IG51bGw7XG4gICAgICAgIH0gXG5cbiAgICAgICAgdGhpcy5fcmVuZGVyLnJlbW92ZVN0eWxlKGN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicpO1xuICAgICAgICB0aGlzLl9yZW5kZXIucmVtb3ZlU3R5bGUoY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3pJbmRleCcpO1xuICAgIH1cbiAgICBwcml2YXRlIGRlc3Ryb3lPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3lFbGVtZW50QnlJZCh0aGlzLk9WRVJMQVlfSUQpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlci5yZW1vdmVTdHlsZShkb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBkZXN0cm95RWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLl9yZW5kZXIucmVtb3ZlQ2hpbGQoZWwucGFyZW50Tm9kZSwgZWwpO1xuICAgIH1cblxuICAgIC8vYXV4XG4gICAgcHJpdmF0ZSBoYW5kbGVUdXRvcmlhbEJsb2NrUG9zaXRpb24oYmxvY2s6IGFueSwgZWw6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFR1dG9yaWFsQmxvY2tQb3NpdGlvbihibG9jaywgZWwpO1xuICAgICAgICB9LCAwKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIubGlzdGVuKHdpbmRvdywgJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VHV0b3JpYWxCbG9ja1Bvc2l0aW9uKGJsb2NrLCBlbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIHNldFR1dG9yaWFsQmxvY2tQb3NpdGlvbihibG9jazogYW55LCBlbDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgICAgICBsZXQgYXJyb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJMT0NLX0FSUk9XX0lEKTtcbiAgICAgICAgbGV0IGVsZW1lbnRSZWN0ID0gZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IHRvcDogbnVtYmVyID0gZWxlbWVudFJlY3QudG9wO1xuICAgICAgICBsZXQgbGVmdDogbnVtYmVyID0gZWxlbWVudFJlY3QubGVmdCArIGVsZW1lbnRSZWN0LndpZHRoICsgMjA7XG4gICAgICAgIGxldCBibG9ja0hlaWdodCA9ICQoYmxvY2spLmhlaWdodCgpO1xuICAgICAgICBsZXQgYmxvY2tXaWR0aCA9ICQoYmxvY2spLndpZHRoKCk7XG4gICAgICAgIGxldCBpc0N1cnJlbnRCbG9ja09uQm90dG9tT2ZTY3JlZW4gPSB0aGlzLmlzQ3VycmVudEJsb2NrT25Cb3R0b21PZlNjcmVlbigpO1xuICAgICAgICBsZXQgaXNDdXJyZW50QmxvY2tPblJpZ2h0T2ZTY3JlZW4gPSB0aGlzLmlzQ3VycmVudEJsb2NrT25SaWdodE9mU2NyZWVuKCk7XG4gICAgICAgIGxldCBhcnJvd0JvcmRlcjogc3RyaW5nID0gaXNDdXJyZW50QmxvY2tPblJpZ2h0T2ZTY3JlZW4gPyAnYm9yZGVyLWxlZnQnIDogJ2JvcmRlci1yaWdodCc7XG4gICAgICAgIGxldCBhcnJvd1Bvc2l0aW9uWDogc3RyaW5nID0gaXNDdXJyZW50QmxvY2tPblJpZ2h0T2ZTY3JlZW4gPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICBsZXQgYXJyb3dQb3NpdGlvblk6IHN0cmluZyA9IGlzQ3VycmVudEJsb2NrT25Cb3R0b21PZlNjcmVlbiA/ICdib3R0b20nIDogJ3RvcCc7XG4gICAgICAgIGxldCBhcnJvd0NvbG9yOiBzdHJpbmcgPSBpc0N1cnJlbnRCbG9ja09uQm90dG9tT2ZTY3JlZW4gPyAnI0ZGRicgOiAnI0VFRSc7XG5cbiAgICAgICAgaWYgKGlzQ3VycmVudEJsb2NrT25Cb3R0b21PZlNjcmVlbikge1xuICAgICAgICAgICAgdG9wIC09IGJsb2NrSGVpZ2h0IC0gMzI7ICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmVudEJsb2NrT25SaWdodE9mU2NyZWVuKSB7XG4gICAgICAgICAgICBsZWZ0IC09IGJsb2NrV2lkdGggKyBlbGVtZW50UmVjdC53aWR0aCArIDQ1OyAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgobGVmdCArIGJsb2NrV2lkdGgpID49IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGxlZnQgLT0gYmxvY2tXaWR0aCArIDQ1OyAgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyb3cpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShhcnJvdywgYXJyb3dCb3JkZXIsIGAxNXB4IHNvbGlkICR7YXJyb3dDb2xvcn1gKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShhcnJvdywgYXJyb3dQb3NpdGlvblgsIGAtMTdweGApO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyLnNldFN0eWxlKGFycm93LCBhcnJvd1Bvc2l0aW9uWSwgYDhweGApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2ssICd0b3AnLCB0aGlzLmdldE51bWJlckluUHgodG9wKSk7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ2xlZnQnLCB0aGlzLmdldE51bWJlckluUHgobGVmdCkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldE51bWJlckluUHgodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB2YWx1ZSArICdweCc7XG4gICAgfVxuICAgIHByaXZhdGUgc2Nyb2xsVG9DdXJyZW50RWxlbWVudEJsb2NrKCkgeyBcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJMT0NLX0lEKTtcbiAgICAgICAgICAgIGxldCBlbCA9IHRoaXMuX3J1bm5pbmdUYXNrc1t0aGlzLl9jdXJyZW50VGFza0luZGV4XS5lbGVtZW50O1xuICAgICAgICAgICAgbGV0IG9mZnNldFRvcEZyb21Cb2R5OiBudW1iZXIgPSAkKGVsLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgIGxldCBlbGVtZW50WTogbnVtYmVyID0gb2Zmc2V0VG9wRnJvbUJvZHkgLSAxNTA7XG5cbiAgICAgICAgICAgICQoJ2h0bWwnKS5hbmltYXRlKHtcbiAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IGVsZW1lbnRZLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUdXRvcmlhbEJsb2NrUG9zaXRpb24oYmxvY2ssIGVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZhZGVJblR1dG9yaWFsQmxvY2tFbGVtZW50KGJsb2NrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBoaWRlVHV0b3JpYWxCbG9ja0VsZW1lbnQoYmxvY2s6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXIuc2V0U3R5bGUoYmxvY2ssICdvcGFjaXR5JywgJzAnKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBmYWRlSW5UdXRvcmlhbEJsb2NrRWxlbWVudChibG9jazogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlbmRlci5zZXRTdHlsZShibG9jaywgJ29wYWNpdHknLCAnMScpO1xuICAgIH1cbiAgICBwcml2YXRlIGlzQ3VycmVudEJsb2NrT25Cb3R0b21PZlNjcmVlbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUYXNrSW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsID0gdGhpcy5fcnVubmluZ1Rhc2tzW3RoaXMuX2N1cnJlbnRUYXNrSW5kZXhdLmVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtZW50UmVjdCA9IGVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCB0b3A6IG51bWJlciA9IGVsZW1lbnRSZWN0LnRvcDtcbiAgICAgICAgbGV0IG9mZnNldFRvcEZyb21Cb2R5OiBudW1iZXIgPSAkKGVsLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcDtcblxuICAgICAgICByZXR1cm4gdG9wID4gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgLSBvZmZzZXRUb3BGcm9tQm9keTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpc0N1cnJlbnRCbG9ja09uUmlnaHRPZlNjcmVlbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUYXNrSW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgZWwgPSB0aGlzLl9ydW5uaW5nVGFza3NbdGhpcy5fY3VycmVudFRhc2tJbmRleF0uZWxlbWVudDtcbiAgICAgICAgbGV0IG9mZnNldExlZnRGcm9tQm9keTogbnVtYmVyID0gJChlbC5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0O1xuXG4gICAgICAgIHJldHVybiBvZmZzZXRMZWZ0RnJvbUJvZHkgPj0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCAvIDI7XG4gICAgfVxuICAgIHByaXZhdGUgaXNDdXJyZW50RWxlbWVudFRleHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VGFza0luZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgYWxsb3dlZFRhZ3MgPSBbJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ3NwYW4nLCAnc21hbGwnLCAncCddO1xuICAgICAgICBsZXQgZWwgPSB0aGlzLl9ydW5uaW5nVGFza3NbdGhpcy5fY3VycmVudFRhc2tJbmRleF0uZWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhbGxvd2VkVGFncy5maWx0ZXIoeCA9PiB4LnRvVXBwZXJDYXNlKCkgPT0gZWwubmF0aXZlRWxlbWVudC50YWdOYW1lKS5sZW5ndGggPT0gMTtcbiAgICB9XG4gICAgcHJpdmF0ZSBub3RpZnlTdGVwSGFzQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblN0ZXBDaGFuZ2VkLmVtaXQodGhpcy5fcnVubmluZ1Rhc2tzW3RoaXMuX2N1cnJlbnRUYXNrSW5kZXhdKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGFydExpc3RlbmluZ0tleWJvYXJkQXJyb3dzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVubGlzdGVuS2V5Ym9hcmRBcnJvd3MgPSB0aGlzLl9yZW5kZXIubGlzdGVuKGRvY3VtZW50LmJvZHksICdrZXl1cCcsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVByZXYoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RvcExpc3RlbmluZ0tleWJvYXJkQXJyb3dzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVubGlzdGVuS2V5Ym9hcmRBcnJvd3MoKTtcbiAgICB9XG5cbiAgICAvL2xvY2Fsc3RvcmFnZVxuICAgIHByaXZhdGUgZ2V0TG9jYWxTdG9yYWdlKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYFVpLUhlcm8tVHVyb3JpYWwtJHtrZXl9YCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHNldExvY2FsU3RvcmFnZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYFVpLUhlcm8tVHVyb3JpYWwtJHtrZXl9YCwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYFVpLUhlcm8tVHVyb3JpYWwtJHtrZXl9YCwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==