@hmcts/media-viewer
Version:
178 lines • 33.5 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { distinctUntilChanged } from 'rxjs/operators';
import * as fromSelector from '../../../store/selectors/annotation.selectors';
import { HtmlTemplatesHelper } from '../../../shared/util/helpers/html-templates.helper';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "./comment.service";
import * as i3 from "../../services/tags/tags.services";
import * as i4 from "@angular/common";
import * as i5 from "@angular/forms";
import * as i6 from "./text-highlight/text-highlight.directive";
import * as i7 from "./textarea-auto-expand/textarea-auto-expand.directive";
import * as i8 from "../../tags/tags.component";
import * as i9 from "rpx-xui-translation";
import * as i10 from "../../pipes/date/date.pipe";
export class CommentComponent {
constructor(store, commentService, tagsServices) {
this.store = store;
this.commentService = commentService;
this.tagsServices = tagsServices;
this.CHAR_LIMIT = 5000;
this.totalPrevPagesHeight = 0;
this.hasUnsavedChanges = false;
this.commentClick = new EventEmitter();
this.renderComments = new EventEmitter();
this.delete = new EventEmitter();
this.updated = new EventEmitter();
this.changes = new EventEmitter();
this.rotate = 0;
this.zoom = 1;
}
ngOnInit() {
this.subscriptions = this.store.select(fromSelector.getComponentSearchText)
.pipe(distinctUntilChanged()).subscribe(searchString => this.searchString = searchString);
this.reRenderComments();
this.marginToComment$ = this.commentService.marginToCommentEmitter.asObservable();
}
ngAfterContentInit() {
if (this.tagItems && this.tagItems.length) {
this.tagsServices.updateTagItems(this.tagItems, this._comment.annotationId);
}
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
set comment(comment) {
this._comment = { ...comment };
this.page = this._comment.page;
this.lastUpdate = comment.lastModifiedDate ? comment.lastModifiedDate : comment.createdDate;
this.author = comment.createdByDetails;
this.createdBy = comment.createdBy;
this.editor = comment.lastModifiedByDetails;
this.originalComment = comment.content;
this.fullComment = this.originalComment;
this.selected = this._comment.selected;
this._editable = this._comment.editable;
this.tagItems = this._comment.tags;
const pageMarginBottom = 10;
this.totalPrevPagesHeight = 0;
for (let i = 0; i < this.page - 1; i++) {
const height = this._comment.pages[i + 1] ? this._comment.pages[i + 1].styles.height : undefined;
if (height) {
this.totalPrevPagesHeight += height + pageMarginBottom;
}
}
}
get comment() {
return this._comment;
}
set annotation(annotation) {
this._rectangle = annotation.rectangles
.reduce((prev, current) => prev.y < current.y ? prev : current);
const actualHeight = this._comment.pages[this.page].styles.height / this.zoom;
switch (this.rotate) {
case 90:
this.rectTop = this._rectangle.x;
break;
case 180:
this.rectTop = actualHeight - (this._rectangle.y + this._rectangle.height);
break;
case 270:
this.rectTop = actualHeight - (this._rectangle.x + this._rectangle.width);
break;
default: this.rectTop = this._rectangle.y;
}
this.rectLeft = this._rectangle.x;
}
get editable() {
return this._editable;
}
onCommentChange(updatedComment) {
this.hasUnsavedChanges =
this.originalComment.substring(0, this.CHAR_LIMIT) !== updatedComment.substring(0, this.CHAR_LIMIT);
this.commentService.onCommentChange(this.hasUnsavedChanges);
}
deleteOrCancel() {
if (!this.editable) {
this.delete.emit(this._comment);
}
else {
this.hasUnsavedChanges = false;
this._editable = false;
this.fullComment = this.originalComment;
this.changes.emit(false);
if (!this.author && !this.fullComment) {
this.delete.emit(this._comment);
}
}
}
editOrSave() {
if (!this.editable) {
this._editable = true;
}
else {
this._comment.content = this.fullComment.substring(0, this.CHAR_LIMIT);
const tags = this.tagsServices.getNewTags(this._comment.annotationId);
const payload = {
comment: this._comment,
tags
};
this.updated.emit(payload);
this.hasUnsavedChanges = false;
this._editable = false;
this.changes.emit(false);
}
}
onCommentClick() {
if (!this.selected) {
this.selected = true;
this._editable = false;
this.commentClick.emit({ annotationId: this._comment.annotationId, editable: this._editable, selected: true });
}
}
reRenderComments() {
this.renderComments.emit(this._comment);
}
get commentTop() {
return this.totalPrevPagesHeight + (this.rectTop * this.zoom);
}
get height() {
return HtmlTemplatesHelper.getAdjustedBoundingRect(this.form.nativeElement).height / this.zoom;
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommentComponent, deps: [{ token: i1.Store }, { token: i2.CommentService }, { token: i3.TagsServices }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CommentComponent, selector: "mv-anno-comment", inputs: { rotate: "rotate", zoom: "zoom", index: "index", page: "page", comment: "comment", annotation: "annotation" }, outputs: { commentClick: "commentClick", renderComments: "renderComments", delete: "delete", updated: "updated", changes: "changes" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "editableComment", first: true, predicate: ["editableComment"], descendants: true }], ngImport: i0, template: "<div\n #form\n (click)=\"onCommentClick()\"\n class=\"aui-comment\"\n [ngClass]=\"{ stylestoggle: (marginToComment$ | async) }\"\n [style.top.px]=\"commentTop\"\n [style.zIndex]=\"selected ? 100 : 0\"\n>\n <div id=\"detailsWrapper {{ index }}\" class=\"aui-comment__header\">\n <span *ngIf=\"author && !editor\" class=\"aui-comment__author\">\n {{ author.forename }} {{ author.surname }}\n </span>\n <span *ngIf=\"editor\" class=\"aui-comment__author\">\n {{ editor.forename }} {{ editor.surname }}\n </span>\n <time [hidden]=\"!selected && !this.editable\" class=\"aui-comment__meta\">\n {{ lastUpdate | momentDate : \"d MMMM y h:mm a\" }}\n </time>\n </div>\n <mv-tags\n [tagItems]=\"tagItems\"\n [userId]=\"createdBy\"\n [editable]=\"editable\"\n [annoId]=\"_comment.annotationId\"\n >\n </mv-tags>\n <textarea\n *ngIf=\"selected && editable\"\n #editableComment\n mvTextAreaAutoExpand\n type=\"text\"\n required\n name=\"content\"\n [maxlength]=\"CHAR_LIMIT\"\n class=\"aui-comment__content form-control mimic-focus edit-mode expanded\"\n [ngModel]=\"fullComment\"\n (ngModelChange)=\"fullComment = $event; reRenderComments(); onCommentChange($event)\"\n aria-label=\"comment\"\n >\n </textarea>\n <p\n *ngIf=\"!editable\"\n mvTextHighlight\n class=\"commentText\"\n [textToHighlight]=\"searchString\"\n >\n {{ fullComment }}\n </p>\n <div\n *ngIf=\"\n selected ||\n this.editable ||\n (!fullComment.length && tagItems && !tagItems.length)\n \"\n class=\"aui-comment__footer commentBtns\"\n >\n <button\n class=\"govuk-button\"\n type=\"button\"\n role=\"button\"\n (click)=\"editOrSave()\"\n >\n {{ !editable ? (\"Edit\" | rpxTranslate) : (\"Save\" | rpxTranslate) }}\n </button>\n <button\n type=\"button\"\n role=\"button\"\n class=\"govuk-button govuk-button--secondary\"\n (click)=\"deleteOrCancel()\"\n >\n {{ !editable ? (\"Delete\" | rpxTranslate) : (\"Cancel\" | rpxTranslate) }}\n </button>\n </div>\n <span class=\"aui-comment__private\">{{ \"private\" | rpxTranslate }}</span>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.TextHighlightDirective, selector: "[mvTextHighlight]", inputs: ["textToHighlight"] }, { kind: "directive", type: i7.TextareaAutoExpandDirective, selector: "[mvTextAreaAutoExpand]" }, { kind: "component", type: i8.TagsComponent, selector: "mv-tags", inputs: ["tagItems", "userId", "editable", "annoId"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.RpxTranslatePipe, name: "rpxTranslate" }, { kind: "pipe", type: i10.MomentDatePipe, name: "momentDate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommentComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-anno-comment', template: "<div\n #form\n (click)=\"onCommentClick()\"\n class=\"aui-comment\"\n [ngClass]=\"{ stylestoggle: (marginToComment$ | async) }\"\n [style.top.px]=\"commentTop\"\n [style.zIndex]=\"selected ? 100 : 0\"\n>\n <div id=\"detailsWrapper {{ index }}\" class=\"aui-comment__header\">\n <span *ngIf=\"author && !editor\" class=\"aui-comment__author\">\n {{ author.forename }} {{ author.surname }}\n </span>\n <span *ngIf=\"editor\" class=\"aui-comment__author\">\n {{ editor.forename }} {{ editor.surname }}\n </span>\n <time [hidden]=\"!selected && !this.editable\" class=\"aui-comment__meta\">\n {{ lastUpdate | momentDate : \"d MMMM y h:mm a\" }}\n </time>\n </div>\n <mv-tags\n [tagItems]=\"tagItems\"\n [userId]=\"createdBy\"\n [editable]=\"editable\"\n [annoId]=\"_comment.annotationId\"\n >\n </mv-tags>\n <textarea\n *ngIf=\"selected && editable\"\n #editableComment\n mvTextAreaAutoExpand\n type=\"text\"\n required\n name=\"content\"\n [maxlength]=\"CHAR_LIMIT\"\n class=\"aui-comment__content form-control mimic-focus edit-mode expanded\"\n [ngModel]=\"fullComment\"\n (ngModelChange)=\"fullComment = $event; reRenderComments(); onCommentChange($event)\"\n aria-label=\"comment\"\n >\n </textarea>\n <p\n *ngIf=\"!editable\"\n mvTextHighlight\n class=\"commentText\"\n [textToHighlight]=\"searchString\"\n >\n {{ fullComment }}\n </p>\n <div\n *ngIf=\"\n selected ||\n this.editable ||\n (!fullComment.length && tagItems && !tagItems.length)\n \"\n class=\"aui-comment__footer commentBtns\"\n >\n <button\n class=\"govuk-button\"\n type=\"button\"\n role=\"button\"\n (click)=\"editOrSave()\"\n >\n {{ !editable ? (\"Edit\" | rpxTranslate) : (\"Save\" | rpxTranslate) }}\n </button>\n <button\n type=\"button\"\n role=\"button\"\n class=\"govuk-button govuk-button--secondary\"\n (click)=\"deleteOrCancel()\"\n >\n {{ !editable ? (\"Delete\" | rpxTranslate) : (\"Cancel\" | rpxTranslate) }}\n </button>\n </div>\n <span class=\"aui-comment__private\">{{ \"private\" | rpxTranslate }}</span>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.CommentService }, { type: i3.TagsServices }], propDecorators: { commentClick: [{
type: Output
}], renderComments: [{
type: Output
}], delete: [{
type: Output
}], updated: [{
type: Output
}], changes: [{
type: Output
}], rotate: [{
type: Input
}], zoom: [{
type: Input
}], index: [{
type: Input
}], page: [{
type: Input
}], form: [{
type: ViewChild,
args: ['form', { static: false }]
}], editableComment: [{
type: ViewChild,
args: ['editableComment', { static: false }]
}], comment: [{
type: Input
}], annotation: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYS12aWV3ZXIvc3JjL2xpYi9hbm5vdGF0aW9ucy9jb21tZW50LXNldC9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvY29tbWVudC1zZXQvY29tbWVudC9jb21tZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBU3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RELE9BQU8sS0FBSyxZQUFZLE1BQU0sK0NBQStDLENBQUM7QUFHOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7OztBQU16RixNQUFNLE9BQU8sZ0JBQWdCO0lBdUMzQixZQUNVLEtBQTBDLEVBQ2pDLGNBQThCLEVBQ3ZDLFlBQTBCO1FBRjFCLFVBQUssR0FBTCxLQUFLLENBQXFDO1FBQ2pDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUN2QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXhDcEMsZUFBVSxHQUFHLElBQUksQ0FBQztRQVVsQix5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFJekIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBUWhCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFDdkQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzdDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3JDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBeUMsQ0FBQztRQUNwRSxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN2QyxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsU0FBSSxHQUFHLENBQUMsQ0FBQztJQWFmLENBQUM7SUFHSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUM7YUFDeEUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BGLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlFLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQ0ksT0FBTyxDQUFDLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBQyxHQUFHLE9BQU8sRUFBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUM1RixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNuQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7SUFFSCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUNJLFVBQVUsQ0FBQyxVQUFzQjtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVO2FBQ3BDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlFLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLEtBQUssRUFBRTtnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNO1lBQ04sS0FBSyxHQUFHO2dCQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckYsTUFBTTtZQUNOLEtBQUssR0FBRztnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BGLE1BQU07WUFDTixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxjQUFjO1FBQzVCLElBQUksQ0FBQyxpQkFBaUI7WUFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEUsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN0QixJQUFJO2FBQ0wsQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBR0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ2pHLENBQUM7a0lBeEtVLGdCQUFnQjtzSEFBaEIsZ0JBQWdCLHlmQy9CN0Isa3FFQTJFQTs7NEZENUNhLGdCQUFnQjtrQkFKNUIsU0FBUzsrQkFDRSxpQkFBaUI7a0lBMkJqQixZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRThCLElBQUk7c0JBQXZDLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDYSxlQUFlO3NCQUE3RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkE2QnpDLE9BQU87c0JBRFYsS0FBSztnQkE2QkYsVUFBVTtzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1lbnR9IGZyb20gJy4vY29tbWVudC5tb2RlbCc7XG5pbXBvcnQge1VzZXJ9IGZyb20gJy4uLy4uL21vZGVscy91c2VyLm1vZGVsJztcbmltcG9ydCB7UmVjdGFuZ2xlfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9uLXNldC9hbm5vdGF0aW9uLXZpZXcvcmVjdGFuZ2xlL3JlY3RhbmdsZS5tb2RlbCc7XG5pbXBvcnQge1NlbGVjdGlvbkFubm90YXRpb259IGZyb20gJy4uLy4uL21vZGVscy9ldmVudC1zZWxlY3QubW9kZWwnO1xuaW1wb3J0IHtDb21tZW50U2VydmljZX0gZnJvbSAnLi9jb21tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtUYWdzTW9kZWx9IGZyb20gJy4uLy4uL21vZGVscy90YWdzLm1vZGVsJztcbmltcG9ydCB7VGFnc1NlcnZpY2VzfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWdzL3RhZ3Muc2VydmljZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7U3RvcmV9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCAqIGFzIGZyb21TdG9yZSBmcm9tICcuLi8uLi8uLi9zdG9yZS9yZWR1Y2Vycy9yZWR1Y2Vycyc7XG5pbXBvcnQgKiBhcyBmcm9tU2VsZWN0b3IgZnJvbSAnLi4vLi4vLi4vc3RvcmUvc2VsZWN0b3JzL2Fubm90YXRpb24uc2VsZWN0b3JzJztcbmltcG9ydCB7IEFubm90YXRpb25TZXQgfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9uLXNldC9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uIH0gZnJvbSAnLi4vLi4vYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi12aWV3L2Fubm90YXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgSHRtbFRlbXBsYXRlc0hlbHBlciB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlsL2hlbHBlcnMvaHRtbC10ZW1wbGF0ZXMuaGVscGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtYW5uby1jb21tZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIENvbW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgQ0hBUl9MSU1JVCA9IDUwMDA7XG4gIGxhc3RVcGRhdGU6IHN0cmluZztcbiAgb3JpZ2luYWxDb21tZW50OiBzdHJpbmc7XG4gIGZ1bGxDb21tZW50OiBzdHJpbmc7XG4gIGF1dGhvcjogVXNlcjtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIGVkaXRvcjogVXNlcjtcbiAgX2NvbW1lbnQ6IENvbW1lbnQ7XG4gIF9lZGl0YWJsZTogYm9vbGVhbjtcbiAgX3JlY3RhbmdsZTtcbiAgdG90YWxQcmV2UGFnZXNIZWlnaHQgPSAwO1xuICByZWN0VG9wO1xuICByZWN0TGVmdDtcbiAgcGFnZUhlaWdodDogbnVtYmVyO1xuICBoYXNVbnNhdmVkQ2hhbmdlcyA9IGZhbHNlO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgc2VhcmNoU3RyaW5nOiBzdHJpbmc7XG4gIHB1YmxpYyB0YWdJdGVtczogVGFnc01vZGVsW107XG4gIG1hcmdpblRvQ29tbWVudCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gO1xuXG5cblxuICBAT3V0cHV0KCkgY29tbWVudENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb25Bbm5vdGF0aW9uPigpO1xuICBAT3V0cHV0KCkgcmVuZGVyQ29tbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPENvbW1lbnQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPENvbW1lbnQ+KCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29tbWVudDogQ29tbWVudCwgdGFnczogVGFnc01vZGVsW119PigpO1xuICBAT3V0cHV0KCkgY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQElucHV0KCkgcm90YXRlID0gMDtcbiAgQElucHV0KCkgem9vbSA9IDE7XG4gIEBJbnB1dCgpIGluZGV4OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2U6IG51bWJlcjtcblxuICBAVmlld0NoaWxkKCdmb3JtJywge3N0YXRpYzogZmFsc2V9KSBmb3JtOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdlZGl0YWJsZUNvbW1lbnQnLCB7c3RhdGljOiBmYWxzZX0pIGVkaXRhYmxlQ29tbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8ZnJvbVN0b3JlLkFubm90YXRpb25TZXRTdGF0ZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tZW50U2VydmljZTogQ29tbWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YWdzU2VydmljZXM6IFRhZ3NTZXJ2aWNlc1xuICApIHt9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB0aGlzLnN0b3JlLnNlbGVjdChmcm9tU2VsZWN0b3IuZ2V0Q29tcG9uZW50U2VhcmNoVGV4dClcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZShzZWFyY2hTdHJpbmcgPT4gdGhpcy5zZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmcpO1xuICAgIHRoaXMucmVSZW5kZXJDb21tZW50cygpO1xuICAgIHRoaXMubWFyZ2luVG9Db21tZW50JCA9IHRoaXMuY29tbWVudFNlcnZpY2UubWFyZ2luVG9Db21tZW50RW1pdHRlci5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50YWdJdGVtcyAmJiB0aGlzLnRhZ0l0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy50YWdzU2VydmljZXMudXBkYXRlVGFnSXRlbXModGhpcy50YWdJdGVtcywgdGhpcy5fY29tbWVudC5hbm5vdGF0aW9uSWQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbW1lbnQoY29tbWVudDogQ29tbWVudCkge1xuICAgIHRoaXMuX2NvbW1lbnQgPSB7Li4uY29tbWVudH07XG4gICAgdGhpcy5wYWdlID0gdGhpcy5fY29tbWVudC5wYWdlO1xuICAgIHRoaXMubGFzdFVwZGF0ZSA9IGNvbW1lbnQubGFzdE1vZGlmaWVkRGF0ZSA/IGNvbW1lbnQubGFzdE1vZGlmaWVkRGF0ZSA6IGNvbW1lbnQuY3JlYXRlZERhdGU7XG4gICAgdGhpcy5hdXRob3IgPSBjb21tZW50LmNyZWF0ZWRCeURldGFpbHM7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBjb21tZW50LmNyZWF0ZWRCeTtcbiAgICB0aGlzLmVkaXRvciA9IGNvbW1lbnQubGFzdE1vZGlmaWVkQnlEZXRhaWxzO1xuICAgIHRoaXMub3JpZ2luYWxDb21tZW50ID0gY29tbWVudC5jb250ZW50O1xuICAgIHRoaXMuZnVsbENvbW1lbnQgPSB0aGlzLm9yaWdpbmFsQ29tbWVudDtcbiAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5fY29tbWVudC5zZWxlY3RlZDtcbiAgICB0aGlzLl9lZGl0YWJsZSA9IHRoaXMuX2NvbW1lbnQuZWRpdGFibGU7XG4gICAgdGhpcy50YWdJdGVtcyA9IHRoaXMuX2NvbW1lbnQudGFncztcbiAgICBjb25zdCBwYWdlTWFyZ2luQm90dG9tID0gMTA7XG4gICAgdGhpcy50b3RhbFByZXZQYWdlc0hlaWdodCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhZ2UgLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuX2NvbW1lbnQucGFnZXNbaSArIDFdID8gdGhpcy5fY29tbWVudC5wYWdlc1tpICsgMV0uc3R5bGVzLmhlaWdodCA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy50b3RhbFByZXZQYWdlc0hlaWdodCArPSBoZWlnaHQgKyBwYWdlTWFyZ2luQm90dG9tO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgZ2V0IGNvbW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1lbnQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYW5ub3RhdGlvbihhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSB7XG4gICAgdGhpcy5fcmVjdGFuZ2xlID0gYW5ub3RhdGlvbi5yZWN0YW5nbGVzXG4gICAgICAucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiBwcmV2LnkgPCBjdXJyZW50LnkgPyBwcmV2IDogY3VycmVudCk7XG4gICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0gdGhpcy5fY29tbWVudC5wYWdlc1t0aGlzLnBhZ2VdLnN0eWxlcy5oZWlnaHQgLyB0aGlzLnpvb207XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0ZSkge1xuICAgICAgY2FzZSA5MDogdGhpcy5yZWN0VG9wID0gdGhpcy5fcmVjdGFuZ2xlLng7XG4gICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOiB0aGlzLnJlY3RUb3AgPSBhY3R1YWxIZWlnaHQgLSAodGhpcy5fcmVjdGFuZ2xlLnkgKyB0aGlzLl9yZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6IHRoaXMucmVjdFRvcCA9IGFjdHVhbEhlaWdodCAtICh0aGlzLl9yZWN0YW5nbGUueCArIHRoaXMuX3JlY3RhbmdsZS53aWR0aCk7XG4gICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHRoaXMucmVjdFRvcCA9IHRoaXMuX3JlY3RhbmdsZS55O1xuICAgIH1cbiAgICB0aGlzLnJlY3RMZWZ0ID0gdGhpcy5fcmVjdGFuZ2xlLng7XG4gIH1cblxuICBnZXQgZWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlO1xuICB9XG5cbiAgb25Db21tZW50Q2hhbmdlKHVwZGF0ZWRDb21tZW50KSB7XG4gICAgdGhpcy5oYXNVbnNhdmVkQ2hhbmdlcyA9XG4gICAgICB0aGlzLm9yaWdpbmFsQ29tbWVudC5zdWJzdHJpbmcoMCwgdGhpcy5DSEFSX0xJTUlUKSAhPT0gdXBkYXRlZENvbW1lbnQuc3Vic3RyaW5nKDAsIHRoaXMuQ0hBUl9MSU1JVCk7XG4gICAgdGhpcy5jb21tZW50U2VydmljZS5vbkNvbW1lbnRDaGFuZ2UodGhpcy5oYXNVbnNhdmVkQ2hhbmdlcyk7XG4gIH1cblxuICBkZWxldGVPckNhbmNlbCgpIHtcbiAgICBpZiAoIXRoaXMuZWRpdGFibGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlLmVtaXQodGhpcy5fY29tbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFzVW5zYXZlZENoYW5nZXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VkaXRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmZ1bGxDb21tZW50ID0gdGhpcy5vcmlnaW5hbENvbW1lbnQ7XG4gICAgICB0aGlzLmNoYW5nZXMuZW1pdChmYWxzZSk7XG4gICAgICBpZiAoIXRoaXMuYXV0aG9yICYmICF0aGlzLmZ1bGxDb21tZW50KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlLmVtaXQodGhpcy5fY29tbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVkaXRPclNhdmUoKSB7XG4gICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XG4gICAgICB0aGlzLl9lZGl0YWJsZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbW1lbnQuY29udGVudCA9IHRoaXMuZnVsbENvbW1lbnQuc3Vic3RyaW5nKDAsIHRoaXMuQ0hBUl9MSU1JVCk7XG4gICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdzU2VydmljZXMuZ2V0TmV3VGFncyh0aGlzLl9jb21tZW50LmFubm90YXRpb25JZCk7XG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBjb21tZW50OiB0aGlzLl9jb21tZW50LFxuICAgICAgICB0YWdzXG4gICAgICB9O1xuICAgICAgdGhpcy51cGRhdGVkLmVtaXQocGF5bG9hZCk7XG4gICAgICB0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB0aGlzLl9lZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWVudENsaWNrKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLl9lZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jb21tZW50Q2xpY2suZW1pdCh7IGFubm90YXRpb25JZDogdGhpcy5fY29tbWVudC5hbm5vdGF0aW9uSWQsIGVkaXRhYmxlOiB0aGlzLl9lZGl0YWJsZSwgc2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVSZW5kZXJDb21tZW50cygpIHtcbiAgICB0aGlzLnJlbmRlckNvbW1lbnRzLmVtaXQodGhpcy5fY29tbWVudCk7XG4gIH1cblxuICBnZXQgY29tbWVudFRvcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRvdGFsUHJldlBhZ2VzSGVpZ2h0ICsgKHRoaXMucmVjdFRvcCAqIHRoaXMuem9vbSk7XG4gIH1cblxuXG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIEh0bWxUZW1wbGF0ZXNIZWxwZXIuZ2V0QWRqdXN0ZWRCb3VuZGluZ1JlY3QodGhpcy5mb3JtLm5hdGl2ZUVsZW1lbnQpLmhlaWdodCAvIHRoaXMuem9vbTtcbiAgfVxufVxuIiwiPGRpdlxuICAjZm9ybVxuICAoY2xpY2spPVwib25Db21tZW50Q2xpY2soKVwiXG4gIGNsYXNzPVwiYXVpLWNvbW1lbnRcIlxuICBbbmdDbGFzc109XCJ7IHN0eWxlc3RvZ2dsZTogKG1hcmdpblRvQ29tbWVudCQgfCBhc3luYykgfVwiXG4gIFtzdHlsZS50b3AucHhdPVwiY29tbWVudFRvcFwiXG4gIFtzdHlsZS56SW5kZXhdPVwic2VsZWN0ZWQgPyAxMDAgOiAwXCJcbj5cbiAgPGRpdiBpZD1cImRldGFpbHNXcmFwcGVyIHt7IGluZGV4IH19XCIgY2xhc3M9XCJhdWktY29tbWVudF9faGVhZGVyXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJhdXRob3IgJiYgIWVkaXRvclwiIGNsYXNzPVwiYXVpLWNvbW1lbnRfX2F1dGhvclwiPlxuICAgICAge3sgYXV0aG9yLmZvcmVuYW1lIH19IHt7IGF1dGhvci5zdXJuYW1lIH19XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiZWRpdG9yXCIgY2xhc3M9XCJhdWktY29tbWVudF9fYXV0aG9yXCI+XG4gICAgICB7eyBlZGl0b3IuZm9yZW5hbWUgfX0ge3sgZWRpdG9yLnN1cm5hbWUgfX1cbiAgICA8L3NwYW4+XG4gICAgPHRpbWUgW2hpZGRlbl09XCIhc2VsZWN0ZWQgJiYgIXRoaXMuZWRpdGFibGVcIiBjbGFzcz1cImF1aS1jb21tZW50X19tZXRhXCI+XG4gICAgICB7eyBsYXN0VXBkYXRlIHwgbW9tZW50RGF0ZSA6IFwiZCBNTU1NIHkgaDptbSBhXCIgfX1cbiAgICA8L3RpbWU+XG4gIDwvZGl2PlxuICA8bXYtdGFnc1xuICAgIFt0YWdJdGVtc109XCJ0YWdJdGVtc1wiXG4gICAgW3VzZXJJZF09XCJjcmVhdGVkQnlcIlxuICAgIFtlZGl0YWJsZV09XCJlZGl0YWJsZVwiXG4gICAgW2Fubm9JZF09XCJfY29tbWVudC5hbm5vdGF0aW9uSWRcIlxuICA+XG4gIDwvbXYtdGFncz5cbiAgPHRleHRhcmVhXG4gICAgKm5nSWY9XCJzZWxlY3RlZCAmJiBlZGl0YWJsZVwiXG4gICAgI2VkaXRhYmxlQ29tbWVudFxuICAgIG12VGV4dEFyZWFBdXRvRXhwYW5kXG4gICAgdHlwZT1cInRleHRcIlxuICAgIHJlcXVpcmVkXG4gICAgbmFtZT1cImNvbnRlbnRcIlxuICAgIFttYXhsZW5ndGhdPVwiQ0hBUl9MSU1JVFwiXG4gICAgY2xhc3M9XCJhdWktY29tbWVudF9fY29udGVudCBmb3JtLWNvbnRyb2wgbWltaWMtZm9jdXMgZWRpdC1tb2RlIGV4cGFuZGVkXCJcbiAgICBbbmdNb2RlbF09XCJmdWxsQ29tbWVudFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwiZnVsbENvbW1lbnQgPSAkZXZlbnQ7IHJlUmVuZGVyQ29tbWVudHMoKTsgb25Db21tZW50Q2hhbmdlKCRldmVudClcIlxuICAgIGFyaWEtbGFiZWw9XCJjb21tZW50XCJcbiAgPlxuICA8L3RleHRhcmVhPlxuICA8cFxuICAgICpuZ0lmPVwiIWVkaXRhYmxlXCJcbiAgICBtdlRleHRIaWdobGlnaHRcbiAgICBjbGFzcz1cImNvbW1lbnRUZXh0XCJcbiAgICBbdGV4dFRvSGlnaGxpZ2h0XT1cInNlYXJjaFN0cmluZ1wiXG4gID5cbiAgICB7eyBmdWxsQ29tbWVudCB9fVxuICA8L3A+XG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgc2VsZWN0ZWQgfHxcbiAgICAgIHRoaXMuZWRpdGFibGUgfHxcbiAgICAgICghZnVsbENvbW1lbnQubGVuZ3RoICYmIHRhZ0l0ZW1zICYmICF0YWdJdGVtcy5sZW5ndGgpXG4gICAgXCJcbiAgICBjbGFzcz1cImF1aS1jb21tZW50X19mb290ZXIgY29tbWVudEJ0bnNcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJnb3Z1ay1idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJlZGl0T3JTYXZlKClcIlxuICAgID5cbiAgICAgIHt7ICFlZGl0YWJsZSA/IChcIkVkaXRcIiB8IHJweFRyYW5zbGF0ZSkgOiAoXCJTYXZlXCIgfCBycHhUcmFuc2xhdGUpIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiZ292dWstYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5XCJcbiAgICAgIChjbGljayk9XCJkZWxldGVPckNhbmNlbCgpXCJcbiAgICA+XG4gICAgICB7eyAhZWRpdGFibGUgPyAoXCJEZWxldGVcIiB8IHJweFRyYW5zbGF0ZSkgOiAoXCJDYW5jZWxcIiB8IHJweFRyYW5zbGF0ZSkgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxzcGFuIGNsYXNzPVwiYXVpLWNvbW1lbnRfX3ByaXZhdGVcIj57eyBcInByaXZhdGVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvc3Bhbj5cbjwvZGl2PlxuIl19