angular-xml-editor
Version:
XML editor component for Angular
259 lines (258 loc) • 27.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { XMLCursorPositions } from './code/cursor/xmlCursorPos.class';
import { DomDummyNodeManager } from './code/dummyNodes/domDummyNodeManager.class';
import { Component, Input, ViewChild, Output, EventEmitter, Renderer2, forwardRef, ViewEncapsulation, ElementRef } from '@angular/core';
import { AngularXmlEditorService } from './angular-xml-editor.service';
import { Xml2html } from './code/xml-html-converter/xml2html.class';
import { Html2xml } from './code/xml-html-converter/html2xml.class';
export class AngularXmlEditorComponent {
/**
* @param {?} _renderer
* @param {?} editorService
*/
constructor(_renderer, editorService) {
this._renderer = _renderer;
this.editorService = editorService;
this.isDebugMode = false;
this.valueChange = new EventEmitter();
// actualXmlCursor: XmlCursor = new XmlCursor();
this.domDummyNodeManager = new DomDummyNodeManager();
}
/**
* @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);
}
/**
* @param {?} value
* @return {?}
*/
set debugMode(value) {
this.isDebugMode = value;
}
/**
* @return {?}
*/
ngOnChanges() { }
/**
* @return {?}
*/
ngOnDestroy() { }
/**
* @return {?}
*/
onLostFocus() {
this.editorContext.saveSelection(); // save selection on lost focus
if (typeof this.onTouchedFunction === 'function') {
this.onTouchedFunction();
}
return;
}
/**
* @return {?}
*/
onGotFocus() {
this.editorContext.restoreSelection();
this.textArea.nativeElement.focus(); // set focus to the text area
}
/**
* @return {?}
*/
clicked() { }
/**
* @return {?}
*/
mousedown() { }
/**
* @param {?} mouseEvent
* @return {?}
*/
mouseup(mouseEvent) {
return this.editorContext.mouseUp(mouseEvent);
}
/**
* @param {?} text
* @return {?}
*/
pasted(text) {
return this.editorContext.pasted(text);
}
/**
* @return {?}
*/
copied() {
return this.editorContext.copied();
}
/**
* @param {?} event
* @return {?}
*/
keyDown(event) {
return this.editorContext.keyDown(event);
}
/**
* @param {?} event
* @return {?}
*/
keyUp(event) {
return this.editorContext.keyUp(event);
}
/**
* @param {?} xml
* @return {?}
*/
showXml(xml) {
if (this.textArea && this.editorContext && this.editorContext.config && this.editorContext.config.rules) {
if (xml === undefined) {
return;
}
/** @type {?} */
const xml2html = new Xml2html(this.editorContext.config.rules);
/** @type {?} */
const html = xml2html.ToHtml(xml);
/** @type {?} */
const normalizedValue = xml === null ? '' : html;
this._renderer.setProperty(this.textArea.nativeElement, 'innerHTML', normalizedValue);
}
}
/**
* Sets the function called when the control gets a change event
* @param {?} func
* @return {?}
*/
registerOnChange(func) {
this.onChangeFunction = func;
}
/**
* Sets the function called when the control gets a touch event
* @param {?} func
* @return {?}
*/
registerOnTouched(func) {
this.onTouchedFunction = func;
}
/**
* Write the new value to the element
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (this.editorContext && this.editorContext.config) {
if (value === null || value === undefined || value === '') {
value = undefined;
}
this.showXml(value);
if (value === undefined) {
this.editorContext.actualCursor.xmlDocumentRootNode = undefined;
}
else {
/** @type {?} */
const el = /** @type {?} */ (this.textArea.nativeElement);
/** @type {?} */
const node = /** @type {?} */ (el.firstChild);
this.editorContext.actualCursor.xmlDocumentRootNode = node;
this.editorContext.actualCursor.StartPos.SetCursor(this.editorContext.actualCursor.xmlDocumentRootNode, XMLCursorPositions.CursorOnCompleteNode);
this.domDummyNodeManager.UpdateDummyNodes(this.editorContext.actualCursor.xmlDocumentRootNode);
}
}
}
/**
* Executed from the contenteditable section while the input property changes
* @param {?} html html string from contenteditable
* @return {?}
*/
onContentChange(html) {
if (typeof this.onChangeFunction === 'function') {
/** @type {?} */
const html2xml = new Html2xml(this.editorContext.config.rules);
/** @type {?} */
const xml = html2xml.ToXml(html);
/** @type {?} */
const normalizedValue = xml === null ? '' : xml;
this.onChangeFunction(normalizedValue);
}
return;
}
/**
* sets the disabled state for this element
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
/** @type {?} */
const div = this.textArea.nativeElement;
/** @type {?} */
const action = isDisabled ? 'addClass' : 'removeClass';
this._renderer[action](div, 'disabled');
}
}
AngularXmlEditorComponent.decorators = [
{ type: Component, args: [{
selector: 'axed-editor',
template: "<div\r\n *ngIf=\"config\"\r\n #editor\r\n class=\"axed axed-textarea showtags debugOff\"\r\n (focus)=\"onGotFocus()\"\r\n [attr.contenteditable]=\"true\"\r\n [style.height]=\"config.height\"\r\n [style.width]=\"config.width\"\r\n (input)=\"onContentChange($event.target.innerHTML)\"\r\n (blur)=\"onLostFocus()\"\r\n (click)=\"clicked()\"\r\n (mousedown)=\"mousedown()\"\r\n (mouseup)=\"mouseup($event)\"\r\n (keyup)=\"keyUp($event)\"\r\n (keydown)=\"keyDown($event)\"\r\n (copy)=\"copied()\"\r\n (paste)=\"pasted($event.clipboardData.getData('text/plain'))\"\r\n></div>\r\n",
encapsulation: ViewEncapsulation.None,
// to prevent the scss to rename the class names and not match the new generated xml dom
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AngularXmlEditorComponent),
multi: true
}
],
styles: ["a{cursor:pointer}.axed-textarea{min-height:150px;overflow:auto;margin-top:5px;resize:vertical;outline:0;--font-size:15px;--topBottomTagPadding:2px;--tagIndent:20px;font-size:var(--font-size);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}.axed-textarea.showtags{line-height:calc(var(--font-size) + (var(--topBottomTagPadding) * 2) + 10px)}.axed-textarea.showtags div::after,.axed-textarea.showtags div::before{background:orange;white-space:pre-wrap;border:1px solid #778899}.axed-textarea.showtags div::after,.axed-textarea.showtags div:not(.xmlTagNoClosing)::before{content:\" \" attr(data-tagname) \" \";padding:var(--topBottomTagPadding) 0 var(--topBottomTagPadding);margin:0 2px 2px}.axed-textarea.showtags div:not(.xmlTagNoClosing)::after{content:\" \" attr(data-tagname);padding-right:7px;border-radius:10px 0 0 10px}.axed-textarea.showtags div:not(.xmlTagNoClosing)::before{border-radius:0 10px 10px 0}.axed-textarea.showtags div[data-attributes].xmlTagNoClosing:not([data-attributes=''])::after,.axed-textarea.showtags div[data-attributes]:not([data-attributes='']):not(.xmlTagNoClosing)::before{content:\" \" attr(data-tagname) \" \" attr(data-attributes) \" \"}.axed-textarea.showtags div.comment::after,.axed-textarea.showtags div.comment::before{content:' ' 'comment' ' ';background-color:#d3d3d3}.axed-textarea div div:not(.floating){margin-left:var(--tagIndent)}.tagElement>.dummyNode.parent{color:red}div.floating{display:inline}span.dummyNode.beforefirstTag{float:left;width:0}.axed-textarea.debug span.dummyNode{background-color:red;width:inherit}.axed-textarea.debug span.dummyNode.beforefirstTag{background-color:violet;width:inherit}.axed-textarea.showtags div.selected,.axed-textarea.showtags div.selected::after,.axed-textarea.showtags div.selected::before{background:#add8e6!important;color:#fff}[data-tagname=parsererror],[data-tagname=parsererror] div,[data-tagname=parsererror] div ::after,[data-tagname=parsererror] div::before,[data-tagname=parsererror]::after,[data-tagname=parsererror]::before{background:red!important;color:#fff!important;font-weight:700!important;font-size:20px!important;line-height:32px!important}.angular-editor{position:relative}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868e96;opacity:1}.angular-editor .axed-wrapper{position:relative}.angular-editor .axed-wrapper .axed-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border:1px solid #ddd;background-color:transparent;overflow-x:hidden;overflow-y:auto;z-index:2;position:relative}.angular-editor .axed-wrapper .axed-textarea.focus,.angular-editor .axed-wrapper .axed-textarea:focus{outline:0}.angular-editor .axed-wrapper .axed-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .axed-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .axed-wrapper .axed-placeholder{display:none;position:absolute;top:0;padding:.5rem .8rem 1rem .9rem;z-index:1;color:#6c757d;opacity:.75}.angular-editor .axed-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .axed-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.axed-attribute-editor-toolbar{min-height:100px;font:100 .8rem/15px Roboto,Arial,sans-serif;background-color:#f5f5f5;padding:15px;border:1px solid #ddd;margin:0}.axed-attribute-editor-toolbar input,.axed-attribute-editor-toolbar select{width:100%}"]
}] }
];
/** @nocollapse */
AngularXmlEditorComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: AngularXmlEditorService }
];
AngularXmlEditorComponent.propDecorators = {
config: [{ type: Input, args: ['config',] }],
editorContextId: [{ type: Input, args: ['editorContextId',] }],
debugMode: [{ type: Input, args: ['debugMode',] }],
textArea: [{ type: ViewChild, args: ['editor',] }],
editorWrapper: [{ type: ViewChild, args: ['editorWrapper',] }],
valueChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
AngularXmlEditorComponent.prototype.editorContext;
/** @type {?} */
AngularXmlEditorComponent.prototype.isDebugMode;
/** @type {?} */
AngularXmlEditorComponent.prototype.textArea;
/** @type {?} */
AngularXmlEditorComponent.prototype.editorWrapper;
/** @type {?} */
AngularXmlEditorComponent.prototype.valueChange;
/** @type {?} */
AngularXmlEditorComponent.prototype.domDummyNodeManager;
/** @type {?} */
AngularXmlEditorComponent.prototype.onTouchedFunction;
/** @type {?} */
AngularXmlEditorComponent.prototype.onChangeFunction;
/** @type {?} */
AngularXmlEditorComponent.prototype._renderer;
/** @type {?} */
AngularXmlEditorComponent.prototype.editorService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci14bWwtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLXhtbC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBYSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUosT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQWdCcEUsTUFBTTs7Ozs7SUF1Q0osWUFBb0IsU0FBb0IsRUFBVSxhQUFzQztRQUFwRSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQXlCOzJCQXJDMUUsS0FBSzsyQkE2QkUsSUFBSSxZQUFZLEVBQUU7O21DQUdqQixJQUFJLG1CQUFtQixFQUFFO0tBSzZDOzs7O0lBbkM1RixJQUNJLE1BQU07UUFDUixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUMvRSxPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7U0FDeEQ7UUFDRCxPQUFP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LENBQUM7U0FDeEM7UUFDRCxPQUFPO0tBQ1I7Ozs7OztJQUtELGdCQUFnQixDQUFDLFVBQW1COztRQUNsQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQzs7UUFDeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUN6Qzs7O1lBdExGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIseWxCQUFrRDtnQkFFbEQsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2dCQUNyQyxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQzt3QkFDeEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7O2FBQ0Y7Ozs7WUFuQnNFLFNBQVM7WUFDdkUsdUJBQXVCOzs7cUJBdUI3QixLQUFLLFNBQUMsUUFBUTs4QkFRZCxLQUFLLFNBQUMsaUJBQWlCO3dCQVF2QixLQUFLLFNBQUMsV0FBVzt1QkFLakIsU0FBUyxTQUFDLFFBQVE7NEJBRWxCLFNBQVMsU0FBQyxlQUFlOzBCQUd6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBYbWxFZGl0b3JDb25maWcgfSBmcm9tICcuL2NvZGUveG1sRWRpdG9yQ29uZmlnJztcclxuaW1wb3J0IHsgWE1MQ3Vyc29yUG9zaXRpb25zIH0gZnJvbSAnLi9jb2RlL2N1cnNvci94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBEb21EdW1teU5vZGVNYW5hZ2VyIH0gZnJvbSAnLi9jb2RlL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25DaGFuZ2VzLCBJbnB1dCwgVmlld0NoaWxkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBmb3J3YXJkUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgT25EZXN0cm95LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuZ3VsYXJYbWxFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLXhtbC1lZGl0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFhtbEVkaXRvckNvbnRleHQgfSBmcm9tICcuL2NvZGUveG1sRWRpdG9yQ29udGV4dC5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi9jb2RlL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcbmltcG9ydCB7IEh0bWwyeG1sIH0gZnJvbSAnLi9jb2RlL3htbC1odG1sLWNvbnZlcnRlci9odG1sMnhtbC5jbGFzcyc7XHJcbmltcG9ydCB7IERlYnVnQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvc3JjL3ZpZXcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdheGVkLWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZ3VsYXIteG1sLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5ndWxhci14bWwtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSwgLy8gdG8gcHJldmVudCB0aGUgc2NzcyB0byByZW5hbWUgdGhlIGNsYXNzIG5hbWVzIGFuZCBub3QgbWF0Y2ggdGhlIG5ldyBnZW5lcmF0ZWQgeG1sIGRvbVxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQW5ndWxhclhtbEVkaXRvckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclhtbEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBlZGl0b3JDb250ZXh0OiBYbWxFZGl0b3JDb250ZXh0O1xyXG4gIGlzRGVidWdNb2RlID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgnY29uZmlnJylcclxuICBnZXQgY29uZmlnKCk6IFhtbEVkaXRvckNvbmZpZyB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3JDb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRleHQgJiYgdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZztcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoJ2VkaXRvckNvbnRleHRJZCcpXHJcbiAgc2V0IGVkaXRvckNvbnRleHRJZCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdG9yQ29udGV4dCA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRFZGl0b3JDb250ZXh0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgnZGVidWdNb2RlJylcclxuICBzZXQgZGVidWdNb2RlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzRGVidWdNb2RlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdlZGl0b3InKVxyXG4gIHRleHRBcmVhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcldyYXBwZXInKVxyXG4gIGVkaXRvcldyYXBwZXI6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gYWN0dWFsWG1sQ3Vyc29yOiBYbWxDdXJzb3IgPSBuZXcgWG1sQ3Vyc29yKCk7XHJcbiAgZG9tRHVtbXlOb2RlTWFuYWdlciA9IG5ldyBEb21EdW1teU5vZGVNYW5hZ2VyKCk7XHJcblxyXG4gIHByaXZhdGUgb25Ub3VjaGVkRnVuY3Rpb246ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUZ1bmN0aW9uOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBBbmd1bGFyWG1sRWRpdG9yU2VydmljZSkge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHt9XHJcblxyXG4gIG9uTG9zdEZvY3VzKCkge1xyXG4gICAgdGhpcy5lZGl0b3JDb250ZXh0LnNhdmVTZWxlY3Rpb24oKTsgLy8gc2F2ZSBzZWxlY3Rpb24gb24gbG9zdCBmb2N1c1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uVG91Y2hlZEZ1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMub25Ub3VjaGVkRnVuY3Rpb24oKTtcclxuICAgIH1cclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIG9uR290Rm9jdXMoKSB7XHJcbiAgICB0aGlzLmVkaXRvckNvbnRleHQucmVzdG9yZVNlbGVjdGlvbigpO1xyXG4gICAgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IC8vIHNldCBmb2N1cyB0byB0aGUgdGV4dCBhcmVhXHJcbiAgfVxyXG5cclxuICBjbGlja2VkKCkge31cclxuXHJcbiAgbW91c2Vkb3duKCkge31cclxuXHJcbiAgbW91c2V1cChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZXh0Lm1vdXNlVXAobW91c2VFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwYXN0ZWQodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZXh0LnBhc3RlZCh0ZXh0KTtcclxuICB9XHJcblxyXG4gIGNvcGllZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRleHQuY29waWVkKCk7XHJcbiAgfVxyXG5cclxuICBrZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZXh0LmtleURvd24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAga2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRleHQua2V5VXAoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gZXhlYygpOiBib29sZWFuIHtcclxuICAvLyAgIGxldCB1c2VyU2VsZWN0aW9uOiBTZWxlY3Rpb247XHJcbiAgLy8gICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gIC8vICAgICB1c2VyU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gIC8vICAgICB0aGlzLmVkaXRvckJyZWFkQ3J1bWIuc2hvd1NlbGVjdGlvbih1c2VyU2VsZWN0aW9uKTtcclxuICAvLyAgICAgdGhpcy5hY3R1YWxYbWxDdXJzb3IuU3RhcnRQb3MuU2V0Q3Vyc29yKHVzZXJTZWxlY3Rpb24uYW5jaG9yTm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25lbi5DdXJzb3JJbnNpZGVUZXh0Tm9kZSwgdXNlclNlbGVjdGlvbi5hbmNob3JPZmZzZXQpO1xyXG4gIC8vICAgICB0aGlzLmNvbW1hbmRlci5zZXRDdXJzb3JQb3ModGhpcy5hY3R1YWxYbWxDdXJzb3IuU3RhcnRQb3MpO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHRoaXMuZG9tRHVtbXlOb2RlTWFuYWdlci5VcGRhdGVEdW1teU5vZGVzKHRoaXMuYWN0dWFsWG1sQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIGZhbHNlKTtcclxuXHJcbiAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gfVxyXG5cclxuICBzaG93WG1sKHhtbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy50ZXh0QXJlYSAmJiB0aGlzLmVkaXRvckNvbnRleHQgJiYgdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZyAmJiB0aGlzLmVkaXRvckNvbnRleHQuY29uZmlnLnJ1bGVzKSB7XHJcbiAgICAgIGlmICh4bWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgeG1sMmh0bWwgPSBuZXcgWG1sMmh0bWwodGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgIGNvbnN0IGh0bWwgPSB4bWwyaHRtbC5Ub0h0bWwoeG1sKTtcclxuICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0geG1sID09PSBudWxsID8gJycgOiBodG1sO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQsICdpbm5lckhUTUwnLCBub3JtYWxpemVkVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU1RBUlQgT0YgQ29udHJvbFZhbHVlQWNjZXNzb3IgIChzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Db250cm9sVmFsdWVBY2Nlc3NvciApICovXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGdldHMgYSBjaGFuZ2UgZXZlbnRcclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZ1bmM6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUZ1bmN0aW9uID0gZnVuYztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGdldHMgYSB0b3VjaCBldmVudFxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZ1bmM6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWRGdW5jdGlvbiA9IGZ1bmM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZSB0aGUgbmV3IHZhbHVlIHRvIHRoZSBlbGVtZW50XHJcbiAgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3JDb250ZXh0ICYmIHRoaXMuZWRpdG9yQ29udGV4dC5jb25maWcpIHtcclxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2hvd1htbCh2YWx1ZSk7XHJcblxyXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGV4dC5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBlbC5maXJzdENoaWxkIGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JDb250ZXh0LmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlID0gbm9kZTtcclxuICAgICAgICB0aGlzLmVkaXRvckNvbnRleHQuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlNldEN1cnNvcih0aGlzLmVkaXRvckNvbnRleHQuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZSk7XHJcbiAgICAgICAgdGhpcy5kb21EdW1teU5vZGVNYW5hZ2VyLlVwZGF0ZUR1bW15Tm9kZXModGhpcy5lZGl0b3JDb250ZXh0LmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZWQgZnJvbSB0aGUgY29udGVudGVkaXRhYmxlIHNlY3Rpb24gd2hpbGUgdGhlIGlucHV0IHByb3BlcnR5IGNoYW5nZXNcclxuICAgKiBAcGFyYW0gaHRtbCBodG1sIHN0cmluZyBmcm9tIGNvbnRlbnRlZGl0YWJsZVxyXG4gICAqL1xyXG4gIG9uQ29udGVudENoYW5nZShodG1sOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5vbkNoYW5nZUZ1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGh0bWwyeG1sID0gbmV3IEh0bWwyeG1sKHRoaXMuZWRpdG9yQ29udGV4dC5jb25maWcucnVsZXMpO1xyXG4gICAgICBjb25zdCB4bWwgPSBodG1sMnhtbC5Ub1htbChodG1sKTtcclxuICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0geG1sID09PSBudWxsID8gJycgOiB4bWw7XHJcbiAgICAgIHRoaXMub25DaGFuZ2VGdW5jdGlvbihub3JtYWxpemVkVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgZm9yIHRoaXMgZWxlbWVudFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgZGl2ID0gdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgYWN0aW9uID0gaXNEaXNhYmxlZCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnO1xyXG4gICAgdGhpcy5fcmVuZGVyZXJbYWN0aW9uXShkaXYsICdkaXNhYmxlZCcpO1xyXG4gIH1cclxuXHJcbiAgLyogRU5EIE9GIENvbnRyb2xWYWx1ZUFjY2Vzc29yICovXHJcbn1cclxuIl19