@adobe/cq-angular-editable-components
Version:
* [API](#api) * [Documentation](#documentation) * [Changelog](#changelog)
235 lines (234 loc) • 24.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/*
* ADOBE CONFIDENTIAL
*
* Copyright 2018 Adobe Systems Incorporated
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any. The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
*/
import { Directive, Input, Renderer2, NgZone, ViewContainerRef, ComponentFactoryResolver } from '@angular/core';
import { ComponentMapping } from "./component-mapping";
import { PageModelManager } from '@adobe/cq-spa-page-model-manager';
import { Constants } from "./constants";
import { Utils } from "./utils";
const /** @type {?} */ PLACEHOLDER_CLASS_NAME = 'cq-placeholder';
const /** @type {?} */ DRAG_DROP_REGEX = /cq-dd-([^ ])+/g;
const /** @type {?} */ DRAG_DROP_CLASS_NAME = 'cq-dd-';
export class AEMComponentDirective {
/**
* @param {?} renderer
* @param {?} viewContainer
* @param {?} factoryResolver
* @param {?} ngZone
*/
constructor(renderer, viewContainer, factoryResolver, ngZone) {
this.renderer = renderer;
this.viewContainer = viewContainer;
this.factoryResolver = factoryResolver;
this.ngZone = ngZone;
}
/**
* @return {?}
*/
ngOnInit() {
this.renderComponent(ComponentMapping.get(this.type));
}
/**
* Returns the type of the cqModel if exists.
* @return {?}
*/
get type() {
return this.cqModel && this.cqModel[":type"];
}
/**
* Returns the column classes of the cqModel
* @return {?}
*/
get columnClasses() {
return this.cqModel && (this.cqModel.columnClassNames || '');
}
/**
* Updates the cqModel
* @return {?}
*/
updateCqModel() {
let /** @type {?} */ self = this;
// Fetching the latest data for the item at the given path
this.getCqModel().then(model => {
this.ngZone.run(() => {
model[Constants.DATA_PATH_PROP] = this.path;
this.cqModel = model;
this.updateComponentData();
this.setupElement();
let /** @type {?} */ editConfig = ComponentMapping.getEditConfig(ComponentMapping.get(this.type));
if (editConfig) {
this.setupPlaceholder(editConfig);
}
});
});
}
/**
* Returns the Cq Model
*
* @return {?}
*/
getCqModel() {
return PageModelManager.getData({ pagePath: this.pagePath, dataPath: this.path });
}
/**
* Renders a component dynamically based on the component definition
*
* @param {?} componentDefinition The component definition to render
* @return {?}
*/
renderComponent(componentDefinition) {
if (componentDefinition) {
const /** @type {?} */ factory = this.factoryResolver.resolveComponentFactory(componentDefinition);
this.viewContainer.clear();
this._component = this.viewContainer.createComponent(factory);
this.updateComponentData();
this.setupElement();
let /** @type {?} */ editConfig = ComponentMapping.getEditConfig(componentDefinition);
if (editConfig && Utils.isInEditor) {
this.setupPlaceholder(editConfig);
}
PageModelManager.removeListener({ pagePath: this.pagePath, dataPath: this.path, callback: this.updateCqModel.bind(this) });
PageModelManager.addListener({ pagePath: this.pagePath, dataPath: this.path, callback: this.updateCqModel.bind(this) });
}
}
/**
* Updates the data of the component based the data of the directive
* @return {?}
*/
updateComponentData() {
this._component.instance.cqModel = this.cqModel;
this._component.instance.path = this.path;
this._component.instance.pagePath = this.pagePath;
this._component.instance.modelName = this.modelName;
}
/**
* Setups the DOM element, setting the classes and attributes needed for the AEM editor.
* @return {?}
*/
setupElement() {
if (this._oldClasses) {
let /** @type {?} */ oldClasses = this._oldClasses.split(' ');
oldClasses.forEach((columnClass) => {
this.renderer.removeClass(this._component.location.nativeElement, columnClass);
});
}
this._oldClasses = this.columnClasses;
// Manually add the classes
if (this.columnClasses) {
let /** @type {?} */ classes = this.columnClasses.split(' ');
classes.forEach((columnClass) => {
this.renderer.addClass(this._component.location.nativeElement, columnClass);
});
}
if (this.path) {
this.renderer.setAttribute(this._component.location.nativeElement, "data-cq-data-path", this.path);
}
}
/**
* Setups the placeholder of needed for the AEM editor
*
* @param {?} editConfig - the editConfig, which will dictate the classes to be added on.
* @return {?}
*/
setupPlaceholder(editConfig) {
// Remove previous drag and drop class names
this.renderer.removeClass(this._component.location.nativeElement, DRAG_DROP_CLASS_NAME + editConfig.dragDropName);
if (editConfig.dragDropName && editConfig.dragDropName.trim().length > 0) {
this.renderer.addClass(this._component.location.nativeElement, DRAG_DROP_CLASS_NAME + editConfig.dragDropName);
}
if (this.usePlaceholder(editConfig)) {
this.renderer.addClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME);
this._component.location.nativeElement.dataset.emptytext = editConfig.emptyLabel;
}
else {
this.renderer.removeClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME);
delete this._component.location.nativeElement.dataset.emptytext;
}
}
/**
* Determines if the placeholder should e displayed.
*
* @param {?} editConfig - the edit config of the directive
* @return {?}
*/
usePlaceholder(editConfig) {
return editConfig.isEmpty && typeof editConfig.isEmpty === "function" && editConfig.isEmpty(this.cqModel);
}
/**
* @return {?}
*/
ngOnDestroy() {
PageModelManager.removeListener({ pagePath: this.pagePath, dataPath: this.path, callback: this.updateCqModel.bind(this) });
this._component && this._component.destroy();
}
}
AEMComponentDirective.decorators = [
{ type: Directive, args: [{
selector: '[aemComponent]'
},] },
];
/** @nocollapse */
AEMComponentDirective.ctorParameters = () => [
{ type: Renderer2, },
{ type: ViewContainerRef, },
{ type: ComponentFactoryResolver, },
{ type: NgZone, },
];
AEMComponentDirective.propDecorators = {
"cqModel": [{ type: Input },],
"path": [{ type: Input },],
"pagePath": [{ type: Input },],
"modelName": [{ type: Input },],
"aemComponent": [{ type: Input },],
};
function AEMComponentDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
AEMComponentDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
AEMComponentDirective.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
AEMComponentDirective.propDecorators;
/** @type {?} */
AEMComponentDirective.prototype._component;
/** @type {?} */
AEMComponentDirective.prototype._oldClasses;
/** @type {?} */
AEMComponentDirective.prototype.cqModel;
/** @type {?} */
AEMComponentDirective.prototype.path;
/** @type {?} */
AEMComponentDirective.prototype.pagePath;
/** @type {?} */
AEMComponentDirective.prototype.modelName;
/** @type {?} */
AEMComponentDirective.prototype.aemComponent;
/** @type {?} */
AEMComponentDirective.prototype.renderer;
/** @type {?} */
AEMComponentDirective.prototype.viewContainer;
/** @type {?} */
AEMComponentDirective.prototype.factoryResolver;
/** @type {?} */
AEMComponentDirective.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVtLWNvbXBvbmVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRvYmUvY3EtYW5ndWxhci1lZGl0YWJsZS1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsibGliL2xheW91dC9hZW0tY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBd0IsU0FBUyxFQUFFLE1BQU0sRUFBcUIsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBRXZMLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUdoQyx1QkFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNoRCx1QkFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsdUJBQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDO0FBTXRDLE1BQU07Ozs7Ozs7SUFVSixZQUNVLFVBQ0EsZUFDQSxpQkFDQTtRQUhBLGFBQVEsR0FBUixRQUFRO1FBQ1Isa0JBQWEsR0FBYixhQUFhO1FBQ2Isb0JBQWUsR0FBZixlQUFlO1FBQ2YsV0FBTSxHQUFOLE1BQU07S0FDZjs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN2RDs7Ozs7SUFLRCxJQUFJLElBQUk7UUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlDOzs7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Ozs7SUFHNUcsV0FBVztRQUNULGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUgsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQzlDOzs7WUFoS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0I7Ozs7WUFoQmdELFNBQVM7WUFBNkIsZ0JBQWdCO1lBQUUsd0JBQXdCO1lBQXJFLE1BQU07Ozt3QkFzQi9ELEtBQUs7cUJBQ0wsS0FBSzt5QkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBRE9CRSBDT05GSURFTlRJQUxcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBOT1RJQ0U6ICBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcbiAqIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBhbmQgaXRzIHN1cHBsaWVycyxcbiAqIGlmIGFueS4gIFRoZSBpbnRlbGxlY3R1YWwgYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWRcbiAqIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIGl0c1xuICogc3VwcGxpZXJzIGFuZCBtYXkgYmUgY292ZXJlZCBieSBVLlMuIGFuZCBGb3JlaWduIFBhdGVudHMsXG4gKiBwYXRlbnRzIGluIHByb2Nlc3MsIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRlIHNlY3JldCBvciBjb3B5cmlnaHQgbGF3LlxuICogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4gKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxuICogZnJvbSBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBOZ1pvbmUsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGluZyB9IGZyb20gXCIuL2NvbXBvbmVudC1tYXBwaW5nXCI7XG5cbmltcG9ydCB7IFBhZ2VNb2RlbE1hbmFnZXIgfSBmcm9tICdAYWRvYmUvY3Etc3BhLXBhZ2UtbW9kZWwtbWFuYWdlcic7XG5cbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5cbmNvbnN0IFBMQUNFSE9MREVSX0NMQVNTX05BTUUgPSAnY3EtcGxhY2Vob2xkZXInO1xuY29uc3QgRFJBR19EUk9QX1JFR0VYID0gL2NxLWRkLShbXiBdKSsvZztcbmNvbnN0IERSQUdfRFJPUF9DTEFTU19OQU1FID0gJ2NxLWRkLSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thZW1Db21wb25lbnRdJ1xufSlcblxuZXhwb3J0IGNsYXNzIEFFTUNvbXBvbmVudERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgX2NvbXBvbmVudDpDb21wb25lbnRSZWY8YW55PjtcbiAgcHJpdmF0ZSBfb2xkQ2xhc3NlczpzdHJpbmc7XG5cbiAgQElucHV0KCkgY3FNb2RlbDphbnk7XG4gIEBJbnB1dCgpIHBhdGg6c3RyaW5nO1xuICBASW5wdXQoKSBwYWdlUGF0aDpzdHJpbmc7XG4gIEBJbnB1dCgpIG1vZGVsTmFtZTpzdHJpbmc7XG4gIEBJbnB1dCgpIGFlbUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJDb21wb25lbnQoQ29tcG9uZW50TWFwcGluZy5nZXQodGhpcy50eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3FNb2RlbCBpZiBleGlzdHMuXG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcU1vZGVsICYmIHRoaXMuY3FNb2RlbFtcIjp0eXBlXCJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiBjbGFzc2VzIG9mIHRoZSBjcU1vZGVsXG4gICAqL1xuICBnZXQgY29sdW1uQ2xhc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcU1vZGVsICYmICh0aGlzLmNxTW9kZWwuY29sdW1uQ2xhc3NOYW1lcyB8fCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY3FNb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDcU1vZGVsKCkge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAvLyBGZXRjaGluZyB0aGUgbGF0ZXN0IGRhdGEgZm9yIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwYXRoXG4gICAgdGhpcy5nZXRDcU1vZGVsKCkudGhlbihtb2RlbCA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbW9kZWxbQ29uc3RhbnRzLkRBVEFfUEFUSF9QUk9QXSA9IHRoaXMucGF0aDtcbiAgICAgICAgICB0aGlzLmNxTW9kZWwgPSBtb2RlbDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgICAgICAgICB0aGlzLnNldHVwRWxlbWVudCgpO1xuICAgICAgICAgIGxldCBlZGl0Q29uZmlnID0gQ29tcG9uZW50TWFwcGluZy5nZXRFZGl0Q29uZmlnKENvbXBvbmVudE1hcHBpbmcuZ2V0KHRoaXMudHlwZSkpO1xuICAgICAgICAgIGlmIChlZGl0Q29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwUGxhY2Vob2xkZXIoZWRpdENvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBDcSBNb2RlbFxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDcU1vZGVsKCkge1xuICAgICAgcmV0dXJuIFBhZ2VNb2RlbE1hbmFnZXIuZ2V0RGF0YSh7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGh9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgY29tcG9uZW50IGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvblxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50RGVmaW5pdGlvbiBUaGUgY29tcG9uZW50IGRlZmluaXRpb24gdG8gcmVuZGVyXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uOmFueSkge1xuICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG5cbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50RGF0YSgpO1xuICAgICAgdGhpcy5zZXR1cEVsZW1lbnQoKTtcbiAgICAgIGxldCBlZGl0Q29uZmlnID0gQ29tcG9uZW50TWFwcGluZy5nZXRFZGl0Q29uZmlnKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgaWYgKGVkaXRDb25maWcgJiYgVXRpbHMuaXNJbkVkaXRvcikge1xuICAgICAgICB0aGlzLnNldHVwUGxhY2Vob2xkZXIoZWRpdENvbmZpZyk7XG4gICAgICB9XG4gICAgICBQYWdlTW9kZWxNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHtwYWdlUGF0aDogdGhpcy5wYWdlUGF0aCwgZGF0YVBhdGg6IHRoaXMucGF0aCwgY2FsbGJhY2s6IHRoaXMudXBkYXRlQ3FNb2RlbC5iaW5kKHRoaXMpIH0pO1xuICAgICAgUGFnZU1vZGVsTWFuYWdlci5hZGRMaXN0ZW5lcih7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGgsIGNhbGxiYWNrOiB0aGlzLnVwZGF0ZUNxTW9kZWwuYmluZCh0aGlzKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIHRoZSBkYXRhIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50RGF0YSgpIHtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UuY3FNb2RlbCA9IHRoaXMuY3FNb2RlbDtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UucGF0aCA9IHRoaXMucGF0aDtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UucGFnZVBhdGggPSB0aGlzLnBhZ2VQYXRoO1xuICAgIHRoaXMuX2NvbXBvbmVudC5pbnN0YW5jZS5tb2RlbE5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwcyB0aGUgRE9NIGVsZW1lbnQsIHNldHRpbmcgdGhlIGNsYXNzZXMgYW5kIGF0dHJpYnV0ZXMgbmVlZGVkIGZvciB0aGUgQUVNIGVkaXRvci5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBFbGVtZW50KCkgIHtcbiAgICBpZiAodGhpcy5fb2xkQ2xhc3Nlcykge1xuICAgICAgbGV0IG9sZENsYXNzZXMgPSB0aGlzLl9vbGRDbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgICBvbGRDbGFzc2VzLmZvckVhY2goKGNvbHVtbkNsYXNzKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGNvbHVtbkNsYXNzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX29sZENsYXNzZXMgPSB0aGlzLmNvbHVtbkNsYXNzZXM7XG4gICAgLy8gTWFudWFsbHkgYWRkIHRoZSBjbGFzc2VzXG4gICAgaWYgKHRoaXMuY29sdW1uQ2xhc3Nlcykge1xuICAgICAgbGV0IGNsYXNzZXMgPSB0aGlzLmNvbHVtbkNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgIGNsYXNzZXMuZm9yRWFjaCgoY29sdW1uQ2xhc3MpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgY29sdW1uQ2xhc3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0aCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIFwiZGF0YS1jcS1kYXRhLXBhdGhcIiAsdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgdGhlIHBsYWNlaG9sZGVyIG9mIG5lZWRlZCBmb3IgdGhlIEFFTSBlZGl0b3JcbiAgICpcbiAgICogQHBhcmFtIGVkaXRDb25maWcgLSB0aGUgZWRpdENvbmZpZywgd2hpY2ggd2lsbCBkaWN0YXRlIHRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgZHJhZyBhbmQgZHJvcCBjbGFzcyBuYW1lc1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIERSQUdfRFJPUF9DTEFTU19OQU1FICsgZWRpdENvbmZpZy5kcmFnRHJvcE5hbWUpO1xuXG4gICAgaWYgKGVkaXRDb25maWcuZHJhZ0Ryb3BOYW1lICYmIGVkaXRDb25maWcuZHJhZ0Ryb3BOYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIERSQUdfRFJPUF9DTEFTU19OQU1FICsgZWRpdENvbmZpZy5kcmFnRHJvcE5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZVBsYWNlaG9sZGVyKGVkaXRDb25maWcpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIFBMQUNFSE9MREVSX0NMQVNTX05BTUUpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudC5kYXRhc2V0LmVtcHR5dGV4dCA9IGVkaXRDb25maWcuZW1wdHlMYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBQTEFDRUhPTERFUl9DTEFTU19OQU1FKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmRhdGFzZXQuZW1wdHl0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwbGFjZWhvbGRlciBzaG91bGQgZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlZGl0Q29uZmlnIC0gdGhlIGVkaXQgY29uZmlnIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXNlUGxhY2Vob2xkZXIoZWRpdENvbmZpZykge1xuICAgIHJldHVybiBlZGl0Q29uZmlnLmlzRW1wdHkgJiYgdHlwZW9mIGVkaXRDb25maWcuaXNFbXB0eSA9PT0gXCJmdW5jdGlvblwiICYmIGVkaXRDb25maWcuaXNFbXB0eSh0aGlzLmNxTW9kZWwpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgUGFnZU1vZGVsTWFuYWdlci5yZW1vdmVMaXN0ZW5lcih7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGgsIGNhbGxiYWNrOiB0aGlzLnVwZGF0ZUNxTW9kZWwuYmluZCh0aGlzKSB9KTtcbiAgICB0aGlzLl9jb21wb25lbnQgJiYgdGhpcy5fY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgfVxuXG59XG4iXX0=