UNPKG

angular-xml-editor

Version:
136 lines (135 loc) 24.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { XmlRuleElement } from '../../code/xml-rules-check/xmlRuleElement.class'; import { XmlEditRuleCheckElements } from '../../code/xml-rules-check/xmlEditRuleCheckElements.class'; import { AngularXmlEditorService } from '../../angular-xml-editor.service'; import { Xml2html } from '../../code/xml-html-converter/xml2html.class'; export class XmlEditorToolbarComponent { /** * @param {?} editorService */ constructor(editorService) { this.editorService = editorService; this.elementGroups = []; } /** * @return {?} */ get config() { if (this.editorContext !== undefined && this.editorContext.config !== undefined) { return this.editorContext && this.editorContext.config; } return undefined; } /** * @param {?} value * @return {?} */ set editorContextId(value) { if (!value) { return; } this.editorContext = this.editorService.getEditorContext(value); this.actualCursorPosChangedSubscription = this.editorContext.actualCursorChanged.subscribe(pos => { this.elementGroups = this.GetElementGroupsForCursorPos(pos.StartPos); }); } /** * inserts an element at the actual cursor pos * @param {?} element * @return {?} */ insertElement(element) { /** @type {?} */ const html = new Xml2html(this.editorContext.config.rules).createNewElementHtml(element); this.editorContext.domInsertHtml(html); } /** * @return {?} */ ngAfterViewInit() { } /** * @return {?} */ ngOnChanges() { } /** * @return {?} */ ngOnDestroy() { this.actualCursorPosChangedSubscription.unsubscribe(); } /** * @param {?} pos * @return {?} */ GetElementGroupsForCursorPos(pos) { /** @type {?} */ const allowedElements = new XmlEditRuleCheckElements(this.editorContext.config.xmlSchema.xsdNodes).ElementsAllowedAtThisCursorPos(pos); return this.GetAllElementGroups() .map(g => { return /** @type {?} */ ({ title: g.title, elements: g.elements.filter(e => allowedElements.includes(e.tagName)) }); }) .filter(g => g.elements.length > 0); } /** * @return {?} */ GetAllElementGroups() { /** @type {?} */ const unusedElements = XmlRuleElement.Sorted(Array.from(this.editorContext.config.rules.ruleElements.values()).filter(elem => this.editorContext.config.elementGroups.some(group => !group.elementNames.includes(elem.tagName)))); /** @type {?} */ const otherElementsGroup = /** @type {?} */ ({ title: 'other', elements: unusedElements }); return this.editorContext.config.elementGroups .map(g => { return /** @type {?} */ ({ title: g.title, elements: XmlRuleElement.Sorted(g.elementNames.map(elementName => this.editorContext.config.rules.ruleElements.get(elementName)).filter(e => e !== undefined)) }); }) .concat(otherElementsGroup) .filter(g => g.elements.length !== 0); } } XmlEditorToolbarComponent.decorators = [ { type: Component, args: [{ selector: 'axed-toolbar', template: "<div class=\"sws-xml-editor-toolbar\">\r\n <h3>Insert element</h3>\r\n\r\n <!--\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button type=\"button\" title=\"Undo\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('undo')\"><i class='fa fa-undo'></i></button>\r\n <button type=\"button\" title=\"Redo\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('redo')\"><i class='fa fa-repeat'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'bold-'+id\" type=\"button\" title=\"Bold\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('bold')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-bold'></i></button>\r\n <button [id]=\"'italic-'+id\" type=\"button\" title=\"Italic\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('italic')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-italic'></i></button>\r\n <button [id]=\"'underline-'+id\" type=\"button\" title=\"Underline\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('underline')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-underline'></i></button>\r\n <button [id]=\"'strikeThrough-'+id\" type=\"button\" title=\"Strikethrough\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('strikeThrough')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-strikethrough'></i></button>\r\n <button [id]=\"'subscript-'+id\" type=\"button\" title=\"Subscript\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('subscript')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-subscript'></i></button>\r\n <button [id]=\"'superscript-'+id\" type=\"button\" title=\"Superscript\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('superscript')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-superscript'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'justifyLeft-'+id\" type=\"button\" title=\"Justify Left\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('justifyLeft')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-align-left'></i></button>\r\n <button [id]=\"'justifyCenter-'+id\" type=\"button\" title=\"Justify Center\" class=\"angular-editor-button\" (click)=\"triggerCommand('justifyCenter')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-align-center'></i></button>\r\n <button [id]=\"'justifyRight-'+id\" type=\"button\" title=\"Justify Right\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('justifyRight')\"\r\n [disabled]=\"htmlMode\">\r\n <i class='fa fa-align-right'></i></button>\r\n <button [id]=\"'justifyFull-'+id\" type=\"button\" title=\"Justify Full\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('justifyFull')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-align-justify'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'indent-'+id\" type=\"button\" title=\"Indent\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('indent')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-indent'></i></button>\r\n <button [id]=\"'outdent-'+id\" type=\"button\" title=\"Outdent\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('outdent')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-outdent'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'insertUnorderedList-'+id\" type=\"button\" title=\"Unordered List\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('insertUnorderedList')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-list-ul'></i></button>\r\n <button [id]=\"'insertOrderedList-'+id\" type=\"button\" title=\"Ordered List\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('insertOrderedList')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-list-ol'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'heading-'+id\" class=\"block-label\"></label>\r\n <select title=\"Formatting\" [id]=\"'heading-'+id\" class=\"select-heading\" [(ngModel)]=\"block\" (change)=\"triggerCommand(block)\"\r\n [disabled]=\"htmlMode\">\r\n <optgroup label=\"Formatting\"></optgroup>\r\n <option class=\"h1\" value=\"h1\">Heading 1</option>\r\n <option class=\"h2\" value=\"h2\">Heading 2</option>\r\n <option class=\"h3\" value=\"h3\">Heading 3</option>\r\n <option class=\"h4\" value=\"h4\">Heading 4</option>\r\n <option class=\"h5\" value=\"h5\">Heading 5</option>\r\n <option class=\"h6\" value=\"h6\">Heading 6</option>\r\n <option class=\"p\" value=\"p\">Paragraph</option>\r\n <option class=\"pre\" value=\"pre\">Predefined</option>\r\n <option class=\"div\" value=\"div\">Standard</option>\r\n <option class=\"default\" value=\"default\">Default</option>\r\n </select>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'fontSelector-'+id\" class=\"block-label\"></label>\r\n <select title=\"Font Name\" [id]=\"'fontSelector-'+id\" class=\"select-font\" [(ngModel)]=\"fontName\" (change)=\"setFontName(fontName)\"\r\n [disabled]=\"htmlMode\">\r\n <optgroup label=\"Font Name\"></optgroup>\r\n <option class=\"arial\" value=\"Arial\">Arial</option>\r\n <option class=\"calibri\" value=\"Calibri\">Calibri</option>\r\n <option class=\"comic-sans-ms\" value=\"Comic Sans MS\">Comic Sans MS</option>\r\n <option class=\"times-new-roman\" value=\"Times New Roman\">Times New Roman</option>\r\n </select>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'fontSizeSelector-'+id\" class=\"block-label\"></label>\r\n <select title=\"Font Size\" [id]=\"'fontSizeSelector-'+id\" class=\"select-font-size\" [(ngModel)]=\"fontSize\" (change)=\"setFontSize(fontSize)\"\r\n [disabled]=\"htmlMode\">\r\n <optgroup label=\"Font Sizing\"></optgroup>\r\n <option class=\"size1\" value=\"1\">1</option>\r\n <option class=\"size2\" value=\"2\">2</option>\r\n <option class=\"size3\" value=\"3\">3</option>\r\n <option class=\"size4\" value=\"4\">4</option>\r\n <option class=\"size5\" value=\"5\">5</option>\r\n <option class=\"size6\" value=\"6\">6</option>\r\n <option class=\"size7\" value=\"7\">7</option>\r\n </select>\r\n </div>\r\n <div class=\"angular-editor-toolbar-set\">\r\n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(fgInput.value, 'textColor')\" #fgInput>\r\n <button [id]=\"'foregroundColorPicker-'+id\" type=\"button\" class=\"sws-xml-editor-button\" (click)=\"fgInput.click()\"\r\n title=\"Text Color\" [disabled]=\"htmlMode\"><span class=\"color-label foreground\"><i class=\"fa fa-font\"></i></span></button>\r\n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(bgInput.value, 'backgroundColor')\" #bgInput>\r\n <button [id]=\"'backgroundColorPicker-'+id\" type=\"button\" class=\"sws-xml-editor-button\" (click)=\"bgInput.click()\"\r\n title=\"Background Color\" [disabled]=\"htmlMode\"><span class=\"color-label background\"><i class=\"fa fa-font\"></i></span></button>\r\n </div>\r\n <div *ngIf=\"customClasses\" class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'customClassSelector-'+id\" class=\"block-label\"></label>\r\n <select title=\"Custom Style\" [id]=\"'customClassSelector-'+id\" class=\"select-custom-style\" [(ngModel)]=\"customClassId\"\r\n (change)=\"setCustomClass(customClassId)\" [disabled]=\"htmlMode\">\r\n <optgroup label=\"Custom Class\"></optgroup>\r\n <option class=\"\" value=-1>Clear Class</option>\r\n <option *ngFor=\"let item of customClasses; let i = index\" [class]=\"item.class\" [value]=\"i\">{{item.name}}</option>\r\n </select>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'link-'+id\" type=\"button\" class=\"sws-xml-editor-button\" (click)=\"insertUrl()\" title=\"Insert Link\"\r\n [disabled]=\"htmlMode\">\r\n <i class=\"fa fa-link\"></i>\r\n </button>\r\n <button type=\"button\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('unlink')\" title=\"Unlink\" [disabled]=\"htmlMode\">\r\n <i class=\"fa fa-chain-broken\"></i>\r\n </button>\r\n <input style=\"display: none\" type=\"file\" (change)=\"onFileChanged($event)\" #fileInput>\r\n <button type=\"button\" class=\"sws-xml-editor-button\" (click)=\"fileInput.click()\" title=\"Insert Image\" [disabled]=\"htmlMode\"><i\r\n class=\"fa fa-image\"></i></button>\r\n\r\n <button type=\"button\" title=\"Horizontal Line\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('insertElement_STAR')\"\r\n [disabled]=\"htmlMode\"><i class=\"fa fa-minus\"></i> STAR</button>\r\n </div>\r\n -->\r\n\r\n\r\n\r\n <div class=\"sws-xml-editor-toolbar-set\" *ngFor=\"let group of elementGroups\">\r\n <label class=\"sws-editor-toolbar-grouplabel\" *ngIf=\"group.title\">{{ group.title }}:</label>\r\n <button *ngFor=\"let elem of group.elements\" type=\"button\" title=\"{{elem.title}}\" class=\"sws-xml-editor-button\"\r\n (click)=\"insertElement(elem)\">\r\n <span *ngIf=\"elem.iconClass\"><i class=\"{{elem.iconClass}}\"></i>&nbsp;</span>{{ elem.tagName }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button type=\"button\" title=\"remove tag\" class=\"sws-xml-editor-button\"><i class=\"fa fa-remove\"></i> remove</button>\r\n </div>\r\n\r\n <!--\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'toggleEditorMode-'+id\" type=\"button\" title=\"HTML Code\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('toggleEditorMode')\"><i\r\n class='fa fa-code'></i></button>\r\n </div>\r\n -->\r\n</div>\r\n", styles: [".sws-xml-editor-toolbar{display:inline-block}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set{border-radius:5px;background-color:#fff;margin-right:5px;margin-bottom:5px;border:1px solid #ddd;clear:both;float:left;display:block;position:relative}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set .sws-editor-toolbar-grouplabel{display:block;font-weight:700;background-color:transparent;float:left;padding:.5em .5em 0}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set .sws-xml-editor-button{border-radius:5px;background-color:transparent;margin:2px;padding:.6em;min-width:3em;float:left;border:.5px solid #eee}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set .sws-xml-editor-button:hover{cursor:pointer;background-color:#ff8c00;transition:.2s}"] }] } ]; /** @nocollapse */ XmlEditorToolbarComponent.ctorParameters = () => [ { type: AngularXmlEditorService } ]; XmlEditorToolbarComponent.propDecorators = { config: [{ type: Input, args: ['config',] }], editorContextId: [{ type: Input, args: ['editorContextId',] }] }; if (false) { /** @type {?} */ XmlEditorToolbarComponent.prototype.editorContext; /** @type {?} */ XmlEditorToolbarComponent.prototype.elementGroups; /** @type {?} */ XmlEditorToolbarComponent.prototype.actualCursorPosChangedSubscription; /** @type {?} */ XmlEditorToolbarComponent.prototype.editorService; } /** * @record */ export function ToolbarElementGroup() { } /** @type {?} */ ToolbarElementGroup.prototype.title; /** @type {?} */ ToolbarElementGroup.prototype.elements; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sLWVkaXRvci10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3htbC1lZGl0b3ItdG9vbGJhci94bWwtZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFtQyxLQUFLLEVBQXVDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVqRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUkzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFPeEUsTUFBTTs7OztJQWdDSixZQUFvQixhQUFzQztRQUF0QyxrQkFBYSxHQUFiLGFBQWEsQ0FBeUI7NkJBVm5CLEVBQUU7S0FVcUI7Ozs7SUE3QjlELElBQ0ksTUFBTTtRQUNSLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQy9FLE9BQU8sSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUN4RDtRQUNELE9BQU8sU0FBUyxDQUFDO0tBQ2xCOzs7OztJQUVELElBQ0ksZUFBZSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FB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Z0JBQ3hCLHMxVEFBa0Q7O2FBRW5EOzs7O1lBVlEsdUJBQXVCOzs7cUJBYzdCLEtBQUssU0FBQyxRQUFROzhCQVFkLEtBQUssU0FBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBSZW5kZXJlcjIsIElucHV0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBYbWxSdWxlRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvZGUveG1sLXJ1bGVzLWNoZWNrL3htbFJ1bGVFbGVtZW50LmNsYXNzJztcclxuaW1wb3J0IHsgWG1sQ3Vyc29yUG9zIH0gZnJvbSAnLi4vLi4vY29kZS9jdXJzb3IveG1sQ3Vyc29yUG9zLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzIH0gZnJvbSAnLi4vLi4vY29kZS94bWwtcnVsZXMtY2hlY2sveG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzLmNsYXNzJztcclxuaW1wb3J0IHsgQW5ndWxhclhtbEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9hbmd1bGFyLXhtbC1lZGl0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBYbWxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29kZS94bWxFZGl0b3JDb250ZXh0LmNsYXNzJztcclxuaW1wb3J0IHsgWG1sRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29kZS94bWxFZGl0b3JDb25maWcnO1xyXG5pbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uLy4uL2NvZGUveG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXhlZC10b29sYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4veG1sLWVkaXRvci10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi94bWwtZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgWG1sRWRpdG9yVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGVkaXRvckNvbnRleHQ6IFhtbEVkaXRvckNvbnRleHQ7XHJcblxyXG4gIEBJbnB1dCgnY29uZmlnJylcclxuICBnZXQgY29uZmlnKCk6IFhtbEVkaXRvckNvbmZpZyB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3JDb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRleHQgJiYgdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZztcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoJ2VkaXRvckNvbnRleHRJZCcpXHJcbiAgc2V0IGVkaXRvckNvbnRleHRJZCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdG9yQ29udGV4dCA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRFZGl0b3JDb250ZXh0KHZhbHVlKTtcclxuICAgIHRoaXMuYWN0dWFsQ3Vyc29yUG9zQ2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMuZWRpdG9yQ29udGV4dC5hY3R1YWxDdXJzb3JDaGFuZ2VkLnN1YnNjcmliZShwb3MgPT4ge1xyXG4gICAgICB0aGlzLmVsZW1lbnRHcm91cHMgPSB0aGlzLkdldEVsZW1lbnRHcm91cHNGb3JDdXJzb3JQb3MocG9zLlN0YXJ0UG9zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZWxlbWVudEdyb3VwczogVG9vbGJhckVsZW1lbnRHcm91cFtdID0gW107XHJcblxyXG4gIGFjdHVhbEN1cnNvclBvc0NoYW5nZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqIGluc2VydHMgYW4gZWxlbWVudCBhdCB0aGUgYWN0dWFsIGN1cnNvciBwb3MgKi9cclxuICBpbnNlcnRFbGVtZW50KGVsZW1lbnQ6IFhtbFJ1bGVFbGVtZW50KSB7XHJcbiAgICBjb25zdCBodG1sID0gbmV3IFhtbDJodG1sKHRoaXMuZWRpdG9yQ29udGV4dC5jb25maWcucnVsZXMpLmNyZWF0ZU5ld0VsZW1lbnRIdG1sKGVsZW1lbnQpO1xyXG4gICAgdGhpcy5lZGl0b3JDb250ZXh0LmRvbUluc2VydEh0bWwoaHRtbCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVkaXRvclNlcnZpY2U6IEFuZ3VsYXJYbWxFZGl0b3JTZXJ2aWNlKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7fVxyXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge31cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdHVhbEN1cnNvclBvc0NoYW5nZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIEdldEVsZW1lbnRHcm91cHNGb3JDdXJzb3JQb3MocG9zOiBYbWxDdXJzb3JQb3MpOiBUb29sYmFyRWxlbWVudEdyb3VwW10ge1xyXG4gICAgY29uc3QgYWxsb3dlZEVsZW1lbnRzID0gbmV3IFhtbEVkaXRSdWxlQ2hlY2tFbGVtZW50cyh0aGlzLmVkaXRvckNvbnRleHQuY29uZmlnLnhtbFNjaGVtYS54c2ROb2RlcykuRWxlbWVudHNBbGxvd2VkQXRUaGlzQ3Vyc29yUG9zKHBvcyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuR2V0QWxsRWxlbWVudEdyb3VwcygpXHJcbiAgICAgIC5tYXAoZyA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRpdGxlOiBnLnRpdGxlLFxyXG4gICAgICAgICAgZWxlbWVudHM6IGcuZWxlbWVudHMuZmlsdGVyKGUgPT4gYWxsb3dlZEVsZW1lbnRzLmluY2x1ZGVzKGUudGFnTmFtZSkpXHJcbiAgICAgICAgfSBhcyBUb29sYmFyRWxlbWVudEdyb3VwO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKGcgPT4gZy5lbGVtZW50cy5sZW5ndGggPiAwKTtcclxuICB9XHJcblxyXG4gIEdldEFsbEVsZW1lbnRHcm91cHMoKTogVG9vbGJhckVsZW1lbnRHcm91cFtdIHtcclxuICAgIGNvbnN0IHVudXNlZEVsZW1lbnRzID0gWG1sUnVsZUVsZW1lbnQuU29ydGVkKFxyXG4gICAgICBBcnJheS5mcm9tKHRoaXMuZWRpdG9yQ29udGV4dC5jb25maWcucnVsZXMucnVsZUVsZW1lbnRzLnZhbHVlcygpKS5maWx0ZXIoZWxlbSA9PlxyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGV4dC5jb25maWcuZWxlbWVudEdyb3Vwcy5zb21lKGdyb3VwID0+ICFncm91cC5lbGVtZW50TmFtZXMuaW5jbHVkZXMoZWxlbS50YWdOYW1lKSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBvdGhlckVsZW1lbnRzR3JvdXAgPSB7XHJcbiAgICAgIHRpdGxlOiAnb3RoZXInLFxyXG4gICAgICBlbGVtZW50czogdW51c2VkRWxlbWVudHNcclxuICAgIH0gYXMgVG9vbGJhckVsZW1lbnRHcm91cDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZy5lbGVtZW50R3JvdXBzXHJcbiAgICAgIC5tYXAoZyA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRpdGxlOiBnLnRpdGxlLFxyXG4gICAgICAgICAgZWxlbWVudHM6IFhtbFJ1bGVFbGVtZW50LlNvcnRlZChnLmVsZW1lbnROYW1lcy5tYXAoZWxlbWVudE5hbWUgPT4gdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZy5ydWxlcy5ydWxlRWxlbWVudHMuZ2V0KGVsZW1lbnROYW1lKSkuZmlsdGVyKGUgPT4gZSAhPT0gdW5kZWZpbmVkKSlcclxuICAgICAgICB9IGFzIFRvb2xiYXJFbGVtZW50R3JvdXA7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jb25jYXQob3RoZXJFbGVtZW50c0dyb3VwKVxyXG4gICAgICAuZmlsdGVyKGcgPT4gZy5lbGVtZW50cy5sZW5ndGggIT09IDApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUb29sYmFyRWxlbWVudEdyb3VwIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGVsZW1lbnRzOiBYbWxSdWxlRWxlbWVudFtdO1xyXG59XHJcbiJdfQ==