mdds-angular-composite
Version:
Augular Composite that compose multiple componennt to be a single page
360 lines • 31.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Directive, Input, Output, ViewContainerRef, ViewChildren, ViewChild, ComponentFactoryResolver, QueryList, EventEmitter, } from '@angular/core';
import { Router } from '@angular/router';
var CompositeDirective = /** @class */ (function () {
function CompositeDirective(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
}
CompositeDirective.decorators = [
{ type: Directive, args: [{
selector: '[composite-directive]',
},] }
];
/** @nocollapse */
CompositeDirective.ctorParameters = function () { return [
{ type: ViewContainerRef }
]; };
return CompositeDirective;
}());
export { CompositeDirective };
if (false) {
/** @type {?} */
CompositeDirective.prototype.viewContainerRef;
}
var CompositeSubmitDirective = /** @class */ (function () {
function CompositeSubmitDirective(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
}
CompositeSubmitDirective.decorators = [
{ type: Directive, args: [{
selector: '[composite-submit-directive]',
},] }
];
/** @nocollapse */
CompositeSubmitDirective.ctorParameters = function () { return [
{ type: ViewContainerRef }
]; };
return CompositeSubmitDirective;
}());
export { CompositeSubmitDirective };
if (false) {
/** @type {?} */
CompositeSubmitDirective.prototype.viewContainerRef;
}
var CompositeComponent = /** @class */ (function () {
function CompositeComponent(componentFactoryResolver, router) {
this.componentFactoryResolver = componentFactoryResolver;
this.router = router;
this.totalSteps = 0;
this.stepCompRef = [];
this.stepCompIns = [];
this.stepCompEmitter = [];
this.errorMessages = [];
this.submitting = false;
this.componentEvents = new EventEmitter();
}
/**
* @return {?}
*/
CompositeComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (!this.steps) {
console.warn("No steps defined for CompositeComponent.");
return;
}
this.totalSteps = this.steps.length;
};
/**
* @return {?}
*/
CompositeComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.compositeDirectives) {
console.warn("No composite directive for CompositeComponent.");
return;
}
setTimeout((/**
* @return {?}
*/
function () {
_this.loadAllSteps();
}), 10);
this.componentEvents.emit({
//telling parent we are ready to load steps
stepIndex: undefined,
message: {
type: 'ngAfterViewInit'
},
});
};
/**
* @param {?} index
* @param {?} stepConfig
* @return {?}
*/
CompositeComponent.prototype.reloadStep = /**
* @param {?} index
* @param {?} stepConfig
* @return {?}
*/
function (index, stepConfig) {
var _this = this;
/** @type {?} */
var directive = this.compositeDirectives.toArray()[index];
var stepTitle = stepConfig.stepTitle, stepComponent = stepConfig.stepComponent, mandatory = stepConfig.mandatory, preSelectedId = stepConfig.preSelectedId, searchObj = stepConfig.searchObj, disableActionButtions = stepConfig.disableActionButtions;
if (!stepComponent)
return; //stop handling this step.
//stop handling this step.
/** @type {?} */
var viewContainerRef = directive.viewContainerRef;
viewContainerRef.clear();
/** @type {?} */
var componentFactory = this.componentFactoryResolver.resolveComponentFactory(stepComponent);
/** @type {?} */
var componentRef = viewContainerRef.createComponent(componentFactory);
// create and insert in one call
/** @type {?} */
var componentInstance = componentRef.instance;
this.stepCompIns[index] = componentInstance;
componentInstance.inputData = {
stepTitle: stepTitle,
preSelectedId: preSelectedId,
mandatory: mandatory,
};
componentInstance.searchObj = searchObj;
componentInstance.disableActionButtions = disableActionButtions;
if (index === 0) {
componentInstance.setFocus();
}
componentInstance.eventEmitter.subscribe((/**
* @param {?} message
* @return {?}
*/
function (message) {
if (message) {
/** @type {?} */
var msg = {
stepIndex: index,
message: message,
};
_this.componentEvents.emit(msg);
}
}));
};
/**
* @return {?}
*/
CompositeComponent.prototype.loadAllSteps = /**
* @return {?}
*/
function () {
for (var index = 0; index < this.compositeDirectives.length; index++) {
if (this.stepCompIns[index])
continue; //already loaded
if (!this.stepConfigs[index])
continue; //no configuration
this.reloadStep(index, this.stepConfigs[index]);
}
;
};
/**
* @return {?}
*/
CompositeComponent.prototype.allActionsReady = /**
* @return {?}
*/
function () {
var e_1, _a;
/** @type {?} */
var ready = true;
try {
for (var _b = tslib_1.__values(this.stepConfigs.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
var _d = tslib_1.__read(_c.value, 2), index = _d[0], step = _d[1];
this.errorMessages[index] = false; // no error
if (step.mandatory) {
/** @type {?} */
var instance = this.stepCompIns[index];
if (!instance) {
return false;
}
if (instance.actionType === 'selection') {
/** @type {?} */
var value = instance.getSelectedItems();
if (value.length === 0) {
this.errorMessages[index] = true;
ready = false;
return false;
}
}
else if (instance.actionType === 'term') {
if (!instance.isTermChecked()) {
this.errorMessages[index] = true;
return false;
}
}
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return ready;
};
/**
* @return {?}
*/
CompositeComponent.prototype.onSubmit = /**
* @return {?}
*/
function () {
var _this = this;
var e_2, _a;
this.submitting = true;
if (!(this.allActionsReady())) {
return;
}
/** @type {?} */
var viewContainerRef = this.compositeSubmitDirective.viewContainerRef;
viewContainerRef.clear();
if (!this.submitCompRef) {
/** @type {?} */
var componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.submit.compoment);
this.submitCompRef = viewContainerRef.createComponent(componentFactory); // create and insert in one call
}
/** @type {?} */
var componentInstance = this.submitCompRef.instance;
/** @type {?} */
var initData = {};
var _loop_1 = function (index, step) {
/** @type {?} */
var instance = this_1.stepCompIns[index];
/** @type {?} */
var value = void 0;
if (instance.actionType === 'selection') {
value = instance.getSelectedItems();
if (value.length === 0) {
value = undefined;
}
else if (!componentInstance.arrayFields.some((/**
* @param {?} x
* @return {?}
*/
function (x) { return x[0] === step.submitFieldName; }))) { //check if the target fields is an array fields. in ['fieldName', 'Field type'] format
value = value[0]; //only get one object
}
}
else if (instance.actionType === 'term') {
value = instance.isTermChecked();
}
initData[step.submitFieldName] = value;
};
var this_1 = this;
try {
for (var _b = tslib_1.__values(this.stepConfigs.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
var _d = tslib_1.__read(_c.value, 2), index = _d[0], step = _d[1];
_loop_1(index, step);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
componentInstance.id = undefined;
componentInstance.embeddedView = true;
componentInstance.initData = initData;
componentInstance.ngOnInit();
componentInstance.onSubmit();
componentInstance.done.subscribe((/**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
_this.router.navigateByUrl(_this.submit.succeedUrl);
}
}));
};
/**
* @return {?}
*/
CompositeComponent.prototype.onCancel = /**
* @return {?}
*/
function () {
this.router.navigateByUrl(this.submit.cancelUrl);
};
CompositeComponent.decorators = [
{ type: Component, args: [{
selector: 'app-composite',
template: "<div>\n <h3 class=\"mt-3\">Class Enrollment:</h3>\n\n <div *ngFor=\"let step of steps; index as idx;\">\n <h4 class=\"mt-3\">{{idx + 1}}. {{step.stepName}}</h4>\n <ng-template composite-directive></ng-template>\n <div class=\"error-message\" *ngIf=\"errorMessages[idx]\">{{step.errorMessage}}</div>\n </div>\n\n <div class=\"action-buttons-center mt-3\">\n <button class=\"btn btn-success\" \n (click)=\"onSubmit()\">Submit</button>\n <button class=\"btn btn-outline-success\" \n type=\"button\" (click)=\"onCancel()\">Cancel</button>\n \n <div *ngIf=\"submitting && !allActionsReady()\" class=\"error-message\">Please check and fix all errors before submitting.</div>\n </div>\n\n <div style=\"display: none;\">\n <ng-template composite-submit-directive></ng-template>\n </div>\n</div>",
styles: [".action-buttons-center{width:100%;float:right;text-align:center;margin-bottom:1.25rem}.action-buttons-center .btn{display:inline-block;margin-left:2.5rem}.error-message{color:#dc3545;margin-top:1rem;font-style:italic}"]
}] }
];
/** @nocollapse */
CompositeComponent.ctorParameters = function () { return [
{ type: ComponentFactoryResolver },
{ type: Router }
]; };
CompositeComponent.propDecorators = {
steps: [{ type: Input }],
stepConfigs: [{ type: Input }],
title: [{ type: Input }],
submit: [{ type: Input }],
componentEvents: [{ type: Output }],
compositeDirectives: [{ type: ViewChildren, args: [CompositeDirective,] }],
compositeSubmitDirective: [{ type: ViewChild, args: [CompositeSubmitDirective,] }]
};
return CompositeComponent;
}());
export { CompositeComponent };
if (false) {
/** @type {?} */
CompositeComponent.prototype.steps;
/** @type {?} */
CompositeComponent.prototype.stepConfigs;
/** @type {?} */
CompositeComponent.prototype.title;
/** @type {?} */
CompositeComponent.prototype.submit;
/** @type {?} */
CompositeComponent.prototype.totalSteps;
/** @type {?} */
CompositeComponent.prototype.stepCompRef;
/** @type {?} */
CompositeComponent.prototype.stepCompIns;
/** @type {?} */
CompositeComponent.prototype.stepCompEmitter;
/** @type {?} */
CompositeComponent.prototype.submitCompRef;
/** @type {?} */
CompositeComponent.prototype.errorMessages;
/** @type {?} */
CompositeComponent.prototype.submitting;
/** @type {?} */
CompositeComponent.prototype.componentEvents;
/** @type {?} */
CompositeComponent.prototype.compositeDirectives;
/** @type {?} */
CompositeComponent.prototype.compositeSubmitDirective;
/** @type {?} */
CompositeComponent.prototype.componentFactoryResolver;
/** @type {?} */
CompositeComponent.prototype.router;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zaXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21kZHMtYW5ndWxhci1jb21wb3NpdGUvIiwic291cmNlcyI6WyJjb21wb3NpdGUvY29tcG9zaXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQUUsU0FBUyxFQUNwQixLQUFLLEVBQUUsTUFBTSxFQUViLGdCQUFnQixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQ3pDLHdCQUF3QixFQUFFLFNBQVMsRUFDbkMsWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQThCekM7SUFJSSw0QkFBbUIsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFBSSxDQUFDOztnQkFKN0QsU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSx1QkFBdUI7aUJBQ3BDOzs7O2dCQXBDRyxnQkFBZ0I7O0lBdUNwQix5QkFBQztDQUFBLEFBTEQsSUFLQztTQUZZLGtCQUFrQjs7O0lBQ2YsOENBQXlDOztBQUd6RDtJQUlJLGtDQUFtQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFJLENBQUM7O2dCQUo3RCxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLDhCQUE4QjtpQkFDM0M7Ozs7Z0JBM0NHLGdCQUFnQjs7SUE4Q3BCLCtCQUFDO0NBQUEsQUFMRCxJQUtDO1NBRlksd0JBQXdCOzs7SUFDckIsb0RBQXlDOztBQUd6RDtJQStCSSw0QkFDVyx3QkFBa0QsRUFDbEQsTUFBYztRQURkLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWxCbEIsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNq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Qzs7aUJBRTFDOzs7O2dCQW5ERyx3QkFBd0I7Z0JBR25CLE1BQU07Ozt3QkFrRFYsS0FBSzs4QkFFTCxLQUFLO3dCQUVMLEtBQUs7eUJBRUwsS0FBSztrQ0FXTCxNQUFNO3NDQUdOLFlBQVksU0FBQyxrQkFBa0I7MkNBRS9CLFNBQVMsU0FBQyx3QkFBd0I7O0lBcUp2Qyx5QkFBQztDQUFBLEFBakxELElBaUxDO1NBNUtZLGtCQUFrQjs7O0lBQzNCLG1DQUM4Qjs7SUFDOUIseUNBQzBDOztJQUMxQyxtQ0FDcUI7O0lBQ3JCLG9DQUMrQjs7SUFFL0Isd0NBQThCOztJQUM5Qix5Q0FBd0I7O0lBQ3hCLHlDQUF3Qjs7SUFDeEIsNkNBQTRCOztJQUM1QiwyQ0FBcUI7O0lBQ3JCLDJDQUFxQzs7SUFDckMsd0NBQTBCOztJQUUxQiw2Q0FDaUQ7O0lBRWpELGlEQUNtRDs7SUFDbkQsc0RBQ21EOztJQUcvQyxzREFBeUQ7O0lBQ3pELG9DQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBEaXJlY3RpdmUsXG4gICAgSW5wdXQsIE91dHB1dCxcbiAgICBPbkluaXQsIEFmdGVyVmlld0luaXQsXG4gICAgVmlld0NvbnRhaW5lclJlZiwgVmlld0NoaWxkcmVuLCBWaWV3Q2hpbGQsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBRdWVyeUxpc3QsXG4gICAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmV4cG9ydCB0eXBlIGNvbXBvc2l0ZVN0ZXAgPSB7XG4gICAgc3RlcE5hbWU6IHN0cmluZyxcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZywgLy9tZXNzYWdlcyBmb3IgcG9zc2libGUgZXJyb3Jcbn07XG5leHBvcnQgdHlwZSBjb21wb3NpdGVTdGVwQ29uZmlnID0ge1xuICAgIHN0ZXBUaXRsZTogc3RyaW5nLFxuXG4gICAgc3RlcENvbXBvbmVudDogYW55LCBcbiAgICBtYW5kYXRvcnk6IGJvb2xlYW4sXG5cbiAgICAvLyBmb3IgbGlzdCBzZWxlY3Rpb25cbiAgICBwcmVTZWxlY3RlZElkOiBzdHJpbmcsXG4gICAgbXVsdGlTZWxlY3Q6IGJvb2xlYW4sXG4gICAgLy8gZm9yIGRldGFpbCB2aWV3XG4gICAgZGlzYWJsZUFjdGlvbkJ1dHRpb25zOiBib29sZWFuLFxuXG4gICAgLy8gYm90aCBsaXN0IGFuZCBkZXRhaWxcbiAgICBzZWFyY2hPYmo6IGFueSxcblxuICAgIHN1Ym1pdEZpZWxkTmFtZTogc3RyaW5nLCAvL21hcHBpbmcgdG8gdGhlIGZpZWxkIGluIHN1Ym1pdCBjb21wb25lbnRzXG59O1xuZXhwb3J0IHR5cGUgc3VibWl0Q29tcG9uZW50ID0ge1xuICAgIGNvbXBvbWVudDogYW55LFxuICAgIHN1Y2NlZWRVcmw6IHN0cmluZyxcbiAgICBjYW5jZWxVcmw6IHN0cmluZyxcbiAgICByZXF1aXJlQ29uZmlybTogYm9vbGVhbixcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbY29tcG9zaXRlLWRpcmVjdGl2ZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7IH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbY29tcG9zaXRlLXN1Ym1pdC1kaXJlY3RpdmVdJyxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlU3VibWl0RGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWNvbXBvc2l0ZScsXG4gICAgdGVtcGxhdGVVcmw6ICdjb21wb3NpdGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydjb21wb3NpdGUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXR7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3RlcHM6IGNvbXBvc2l0ZVN0ZXBbXTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdGVwQ29uZmlnczogY29tcG9zaXRlU3RlcENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3VibWl0OiBzdWJtaXRDb21wb25lbnQ7XG5cbiAgICBwdWJsaWMgdG90YWxTdGVwczogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgc3RlcENvbXBSZWYgPSBbXTtcbiAgICBwdWJsaWMgc3RlcENvbXBJbnMgPSBbXTtcbiAgICBwdWJsaWMgc3RlcENvbXBFbWl0dGVyID0gW107XG4gICAgcHVibGljIHN1Ym1pdENvbXBSZWY7XG4gICAgcHVibGljIGVycm9yTWVzc2FnZXM6IGJvb2xlYW5bXSA9IFtdO1xuICAgIHB1YmxpYyBzdWJtaXR0aW5nID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29tcG9uZW50RXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAVmlld0NoaWxkcmVuKENvbXBvc2l0ZURpcmVjdGl2ZSlcbiAgICBjb21wb3NpdGVEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8Q29tcG9zaXRlRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKENvbXBvc2l0ZVN1Ym1pdERpcmVjdGl2ZSlcbiAgICBjb21wb3NpdGVTdWJtaXREaXJlY3RpdmU6IENvbXBvc2l0ZVN1Ym1pdERpcmVjdGl2ZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcikge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RlcHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHN0ZXBzIGRlZmluZWQgZm9yIENvbXBvc2l0ZUNvbXBvbmVudC5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3RhbFN0ZXBzID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcG9zaXRlRGlyZWN0aXZlcykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTm8gY29tcG9zaXRlIGRpcmVjdGl2ZSBmb3IgQ29tcG9zaXRlQ29tcG9uZW50LlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyAvL3VzaW5nIGEgdGltZXIgdG8gdHJpZ2dlciB2aWV3IGNoYW5nZXMgaW4gbmV4dCByb3VuZCBvZiBjaGFuZ2UgZGV0ZWN0aW9uIHR1cm4uIFByaXZlbnQgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICAgICAgICAgICAgdGhpcy5sb2FkQWxsU3RlcHMoKTtcbiAgICAgICAgfSwgMTApO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLmVtaXQoeyAvL3RlbGxpbmcgcGFyZW50IHdlIGFyZSByZWFkeSB0byBsb2FkIHN0ZXBzXG4gICAgICAgICAgICBzdGVwSW5kZXg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbmdBZnRlclZpZXdJbml0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVsb2FkU3RlcChpbmRleDogbnVtYmVyLCBzdGVwQ29uZmlnOiBjb21wb3NpdGVTdGVwQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IHRoaXMuY29tcG9zaXRlRGlyZWN0aXZlcy50b0FycmF5KClbaW5kZXhdO1xuICAgICAgICBjb25zdCB7IHN0ZXBUaXRsZSwgc3RlcENvbXBvbmVudCwgbWFuZGF0b3J5LCBwcmVTZWxlY3RlZElkLCBzZWFyY2hPYmosIGRpc2FibGVBY3Rpb25CdXR0aW9uc30gPSBzdGVwQ29uZmlnO1xuXG4gICAgICAgIGlmICghc3RlcENvbXBvbmVudCkgcmV0dXJuOyAvL3N0b3AgaGFuZGxpbmcgdGhpcyBzdGVwLlxuXG4gICAgICAgIGxldCB2aWV3Q29udGFpbmVyUmVmID0gZGlyZWN0aXZlLnZpZXdDb250YWluZXJSZWY7XG4gICAgICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcblxuICAgICAgICBsZXQgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHN0ZXBDb21wb25lbnQpO1xuICAgICAgICBsZXQgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7IC8vIGNyZWF0ZSBhbmQgaW5zZXJ0IGluIG9uZSBjYWxsXG5cbiAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOiBhbnkgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuc3RlcENvbXBJbnNbaW5kZXhdID0gY29tcG9uZW50SW5zdGFuY2U7XG5cbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5wdXREYXRhID0ge1xuICAgICAgICAgICAgc3RlcFRpdGxlLFxuICAgICAgICAgICAgcHJlU2VsZWN0ZWRJZCxcbiAgICAgICAgICAgIG1hbmRhdG9yeSxcbiAgICAgICAgfTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2Uuc2VhcmNoT2JqID0gc2VhcmNoT2JqO1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5kaXNhYmxlQWN0aW9uQnV0dGlvbnMgPSBkaXNhYmxlQWN0aW9uQnV0dGlvbnM7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2Uuc2V0Rm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5ldmVudEVtaXR0ZXIuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcEluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRFdmVudHMuZW1pdChtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkQWxsU3RlcHMoKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNvbXBvc2l0ZURpcmVjdGl2ZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGVwQ29tcEluc1tpbmRleF0pIGNvbnRpbnVlOyAvL2FscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RlcENvbmZpZ3NbaW5kZXhdKSBjb250aW51ZTsgLy9ubyBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFN0ZXAoaW5kZXgsIHRoaXMuc3RlcENvbmZpZ3NbaW5kZXhdKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhbGxBY3Rpb25zUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZWFkeSA9IHRydWU7XG4gICAgICAgIGZvcihsZXQgW2luZGV4LCBzdGVwXSBvZiB0aGlzLnN0ZXBDb25maWdzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzW2luZGV4XSA9IGZhbHNlOyAvLyBubyBlcnJvclxuICAgICAgICAgICAgaWYgKHN0ZXAubWFuZGF0b3J5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnN0ZXBDb21wSW5zW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLmFjdGlvblR5cGUgPT09ICdzZWxlY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGluc3RhbmNlLmdldFNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzW2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5hY3Rpb25UeXBlID09PSAndGVybScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWluc3RhbmNlLmlzVGVybUNoZWNrZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzW2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlYWR5O1xuICAgIH1cblxuICAgIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRpbmcgPSB0cnVlO1xuICAgICAgICBpZiAoISh0aGlzLmFsbEFjdGlvbnNSZWFkeSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3Q29udGFpbmVyUmVmID0gdGhpcy5jb21wb3NpdGVTdWJtaXREaXJlY3RpdmUudmlld0NvbnRhaW5lclJlZjtcbiAgICAgICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuXG4gICAgICAgIGlmICghdGhpcy5zdWJtaXRDb21wUmVmKSB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMuc3VibWl0LmNvbXBvbWVudCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdENvbXBSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTsgLy8gY3JlYXRlIGFuZCBpbnNlcnQgaW4gb25lIGNhbGxcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLnN1Ym1pdENvbXBSZWYuaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGluaXREYXRhID0ge307XG4gICAgICAgIGZvcihsZXQgW2luZGV4LCBzdGVwXSBvZiB0aGlzLnN0ZXBDb25maWdzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnN0ZXBDb21wSW5zW2luZGV4XTtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb25UeXBlID09PSAnc2VsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaW5zdGFuY2UuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY29tcG9uZW50SW5zdGFuY2UuYXJyYXlGaWVsZHMuc29tZSh4PT54WzBdPT09c3RlcC5zdWJtaXRGaWVsZE5hbWUpKSB7IC8vY2hlY2sgaWYgdGhlIHRhcmdldCBmaWVsZHMgaXMgYW4gYXJyYXkgZmllbGRzLiBpbiBbJ2ZpZWxkTmFtZScsICdGaWVsZCB0eXBlJ10gZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMF07IC8vb25seSBnZXQgb25lIG9iamVjdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuYWN0aW9uVHlwZSA9PT0gJ3Rlcm0nKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbnN0YW5jZS5pc1Rlcm1DaGVja2VkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbml0RGF0YVtzdGVwLnN1Ym1pdEZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuZW1iZWRkZWRWaWV3ID0gdHJ1ZTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5pdERhdGEgPSBpbml0RGF0YTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UubmdPbkluaXQoKTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2Uub25TdWJtaXQoKTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuZG9uZS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuc3VibWl0LnN1Y2NlZWRVcmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLnN1Ym1pdC5jYW5jZWxVcmwpO1xuICAgIH1cbn1cbiJdfQ==