com.phloxui
Version:
PhloxUI Ng2+ Framework
493 lines (492 loc) • 47.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, ViewChild, EventEmitter } from '@angular/core';
import { Notification, NotificationAction } from './model/models';
import { NotificationManager } from '../service/NotificationManager.service';
import { DialogService } from '../service/DialogService.service';
import { AbstractHasData } from './AbstractHasData';
import { MaterialTextBox } from '../theme/material/component/dataview/input/MaterialTextBox.component';
import { MaterialDatePicker } from '../theme/material/component/dataview/input/MaterialDatePicker.component';
import { MaterialTimePicker } from '../theme/material/component/dataview/input/MaterialTimePicker.component';
import { MaterialTextArea } from '../theme/material/component/dataview/input/MaterialTextArea.component';
import { TestComponent } from './TestComponent.component';
import { CHANGE_EVENT } from '../share/CustomEventType';
import { EventUtils } from '../share/utils/EventUtils';
var /** @type {?} */ FORM_VIEW = 'form-view';
var /** @type {?} */ TYPE_NAME = "phx-data-form";
var DataForm = /** @class */ (function (_super) {
tslib_1.__extends(DataForm, _super);
function DataForm(notifyMgr, dialogServ, elementRef) {
var _this = _super.call(this, elementRef) || this;
_this.testCount = 0;
_this.dataContainer = [];
_this.descriptions = [];
_this.changeEvent = new EventEmitter();
// for test notification
// for test notification
_this.notifyMgr = notifyMgr;
_this.dialogServ = dialogServ;
return _this;
}
/**
* @return {?}
*/
DataForm.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
_super.prototype.ngOnInit.call(this);
this.fields = ["name", "shortName", "_created", "datePickerName", "timePickerName", "areaName"];
this.labels = ["Name", "ShortName", "Create Date", "DatePickerName", "TimePickerName", "AreaName"];
this.descriptions = ["name description", "shortName description", "createDate Description",
"datePickerName description", "timePickerName description", "areaName description"];
var /** @type {?} */ nameFieldChangeEV = this.nameTextField.getChangeEvent();
if (nameFieldChangeEV !== null && typeof nameFieldChangeEV !== 'undefined') {
nameFieldChangeEV.subscribe(function (event) {
if (event.detail.data !== null && typeof event.detail.data !== 'undefined') {
if (event.detail.data.bubbleStack !== null && typeof event.detail.data.bubbleStack !== 'undefined') {
event.detail.data.bubbleStack.push(_this);
}
else {
event.detail.data.bubbleStack = [_this];
}
}
_this.onEmitChange(event);
});
}
var /** @type {?} */ shortNameChangeEV = this.shortNameTextField.getChangeEvent();
if (shortNameChangeEV !== null && typeof shortNameChangeEV !== 'undefined') {
shortNameChangeEV.subscribe(function (event) {
if (event.detail.data !== null && typeof event.detail.data !== 'undefined') {
if (event.detail.data.bubbleStack !== null && typeof event.detail.data.bubbleStack !== 'undefined') {
event.detail.data.bubbleStack.push(_this);
}
else {
event.detail.data.bubbleStack = [_this];
}
}
_this.onEmitChange(event);
});
}
this.minDate = new Date();
this.minDate.setHours(0, 0, 0, 0);
this.minDate.setMonth(5);
this.maxDate = new Date();
this.maxDate.setHours(0, 0, 0, 0);
this.maxDate.setMonth(10);
this.minTime = new Date();
this.minTime.setHours(10, 0, 0, 0);
this.maxTime = new Date();
this.maxTime.setHours(15, 0, 0, 0);
this.rows = 8;
this.cols = 100;
};
/**
* @param {?} event
* @return {?}
*/
DataForm.prototype.onEmitChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
var /** @type {?} */ data = {
source: event,
bubbleStack: [this]
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(CHANGE_EVENT, this, data, null);
this.changeEvent.emit(ev);
};
/**
* @return {?}
*/
DataForm.prototype._getDataContainer = /**
* @return {?}
*/
function () {
return this.dataContainer;
};
/**
* @return {?}
*/
DataForm.prototype.getModel = /**
* @return {?}
*/
function () {
return this.model;
};
/**
* @param {?} model
* @return {?}
*/
DataForm.prototype.setModel = /**
* @param {?} model
* @return {?}
*/
function (model) {
this.model = model;
};
/**
* @param {?} data
* @return {?}
*/
DataForm.prototype.setData = /**
* @param {?} data
* @return {?}
*/
function (data) {
// overide method
this.data = data;
if (data !== null && typeof data !== 'undefined') {
if (Array.isArray(data.objects)) {
this.dataContainer = data.objects;
}
}
// child add dataContainer instead
if (this.dataChildren !== null) {
try {
for (var _a = tslib_1.__values(this.dataChildren), _b = _a.next(); !_b.done; _b = _a.next()) {
var c = _b.value;
c.setData(this.dataContainer);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
}
var e_1, _c;
};
/**
* @param {?} $event
* @return {?}
*/
DataForm.prototype.showDataClicked = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
// test notification
if (this.notifyMgr !== null && typeof this.notifyMgr !== 'undefined') {
this.testCount += 1;
var /** @type {?} */ d = new Date();
var /** @type {?} */ clickFunc = function () {
console.log('BODY CLICKED');
};
var /** @type {?} */ notification = new Notification("", "TITLE: " + this.testCount, "description", true, "LB", d, 2000);
notification.clickHandler = clickFunc;
var /** @type {?} */ action1 = new NotificationAction('MORE', function (ev) {
console.log('first CLICKED');
if (ev !== null && typeof ev !== 'undefined') {
ev.detail.data.instance.showBody();
}
});
var /** @type {?} */ action2 = new NotificationAction('CANCEL', function () {
console.log('cancel CLICKED');
}, true);
notification.addAction(action1);
notification.addAction(action2);
notification.bodyComponent = TestComponent;
this.notifyMgr.notify(notification);
}
};
/**
* @param {?} $event
* @return {?}
*/
DataForm.prototype.saveDataClicked = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ name = this.nameTextField.getInputValue();
var /** @type {?} */ shortName = this.shortNameTextField.getInputValue();
var /** @type {?} */ dateString = this.dateTextField.getInputValue();
var /** @type {?} */ datePicker = this.datePickerTextField.getData();
var /** @type {?} */ timePicker = this.timePickerTextField.getData();
var /** @type {?} */ areaName = this.areaTextField.getInputValue();
if (this.data.editor !== null && typeof this.data.editor !== 'undefined') {
var /** @type {?} */ formView = /** @type {?} */ (this.data.editor.getViewComponentFromType(FORM_VIEW));
var /** @type {?} */ curIndex = formView.getCurrentTabIndex();
var /** @type {?} */ obj = formView.getTabData(curIndex);
if (obj !== null && obj.length > 0) {
var /** @type {?} */ objs = formView.getTabData(curIndex);
var /** @type {?} */ createdArray = [];
var /** @type {?} */ updatedArray = [];
var /** @type {?} */ objectIdField = this.data.editor.getObjectIdField();
try {
for (var objs_1 = tslib_1.__values(objs), objs_1_1 = objs_1.next(); !objs_1_1.done; objs_1_1 = objs_1.next()) {
var obj_1 = objs_1_1.value;
if (obj_1[objectIdField] !== null && typeof obj_1[objectIdField] !== 'undefined') {
updatedArray.push(obj_1);
}
else {
createdArray.push(obj_1);
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (objs_1_1 && !objs_1_1.done && (_a = objs_1.return)) _a.call(objs_1);
}
finally { if (e_2) throw e_2.error; }
}
// create data
if (createdArray.length > 0) {
this.data.editor.createData(createdArray);
}
// update data
if (updatedArray.length > 0) {
this.data.editor.updateData(updatedArray);
}
}
else {
// create new object
var /** @type {?} */ newObj = {
name: name, shortName: shortName,
_created: dateString, datePicker: datePicker,
timePicker: timePicker, areaName: areaName
};
this.data.editor.createData(newObj);
}
}
var e_2, _a;
};
/**
* @param {?} $event
* @return {?}
*/
DataForm.prototype.editDataClicked = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
// test clear all notify
if (this.notifyMgr !== null && typeof this.notifyMgr !== 'undefined') {
this.notifyMgr.clearAll();
}
};
/**
* @return {?}
*/
DataForm.prototype.getChangeEvent = /**
* @return {?}
*/
function () {
return this.changeEvent;
};
/**
* @return {?}
*/
DataForm.prototype.isSelfDataDirty = /**
* @return {?}
*/
function () {
return false;
};
/**
* @param {?} data
* @return {?}
*/
DataForm.prototype.selfSaveData = /**
* @param {?} data
* @return {?}
*/
function (data) {
};
/**
* @return {?}
*/
DataForm.prototype.selfResetData = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
DataForm.prototype.doPreload = /**
* @return {?}
*/
function () { return new Promise(function (resolve, reject) { resolve(null); }); };
/**
* @return {?}
*/
DataForm.prototype.doLoaded = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
DataForm.prototype.getFields = /**
* @return {?}
*/
function () {
return this.fields;
};
/**
* @return {?}
*/
DataForm.prototype.getLabels = /**
* @return {?}
*/
function () {
return this.labels;
};
/**
* @return {?}
*/
DataForm.prototype.getDescriptions = /**
* @return {?}
*/
function () {
return this.descriptions;
};
/**
* @return {?}
*/
DataForm.prototype.getMinDate = /**
* @return {?}
*/
function () {
return this.minDate;
};
/**
* @return {?}
*/
DataForm.prototype.getMaxDate = /**
* @return {?}
*/
function () {
return this.maxDate;
};
/**
* @return {?}
*/
DataForm.prototype.getMinTime = /**
* @return {?}
*/
function () {
return this.minTime;
};
/**
* @return {?}
*/
DataForm.prototype.getMaxTime = /**
* @return {?}
*/
function () {
return this.maxTime;
};
/**
* @return {?}
*/
DataForm.prototype.getRows = /**
* @return {?}
*/
function () {
return this.rows;
};
/**
* @return {?}
*/
DataForm.prototype.getCols = /**
* @return {?}
*/
function () {
return this.cols;
};
DataForm.TYPE_NAME = TYPE_NAME;
DataForm.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: "<div class=\"data-form\">\n\t<div class=\"header\">\n\t\t<div class=\"left\">\n\t\t\t<div class=\"table-wrapper\">\n\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t<div class=\"title\"> Payment voucher </div>\n\t\t\t\t\t<div class=\"subtitle\"> voucherNo: POXXXXXXXXX </div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"right\">\n\t\t\t<div class=\"table-wrapper\">\n\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t<div class=\"title\"> ABS Management solution </div>\n\t\t\t\t\t<div class=\"subtitle\"> address sthing </div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"body\">\n\t\t<div class=\"body-container\">\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\"><material-text-box required #nameTextField [label]=\"getLabels()[0]\" [description]=\"getDescriptions()[0]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[0]\" [dataParent]=\"this\"></material-text-box></div>\n\t\t\t</div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\"><material-text-box #shortNameTextField [label]=\"getLabels()[1]\" [description]=\"getDescriptions()[1]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[1]\" [dataParent]=\"this\"></material-text-box></div>\n\t\t\t</div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\"><material-text-box #dateTextField [label]=\"getLabels()[2]\" [description]=\"getDescriptions()[2]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[2]\" [dataParent]=\"this\"></material-text-box></div>\n\t\t\t</div>\n\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-6\">\n\t\t\t\t\t<material-date-picker [phxMin]=\"getMinDate()\" [phxMax]=\"getMaxDate()\" [description]=\"getDescriptions()[3]\"></material-date-picker>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-md-6\">\n\t\t\t\t\t<material-time-picker [phxMin]=\"getMinTime()\" [phxMax]=\"getMaxTime()\" [description]=\"getDescriptions()[4]\"></material-time-picker>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\">\n\t\t\t\t\t<material-text-area required [rows]=\"getRows()\" [cols]=\"getCols()\" #areaTextField [label]=\"getLabels()[5]\" [description]=\"getDescriptions()[5]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[5]\" [dataParent]=\"this\"></material-text-area>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-3\"><button type=\"button\" class=\"btn btn-default\" (click)=\"showDataClicked($event)\">Show Data</button></div>\n\t\t\t\t<div class=\"col-md-3\"><button type=\"button\" class=\"btn btn-default\" (click)=\"editDataClicked($event)\">Edit Data</button></div>\n\t\t\t\t<div class=\"col-md-3\"><button type=\"button\" class=\"btn btn-default\" (click)=\"saveDataClicked($event)\">Save Data</button></div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"
},] },
];
/** @nocollapse */
DataForm.ctorParameters = function () { return [
{ type: NotificationManager, },
{ type: DialogService, },
{ type: ElementRef, },
]; };
DataForm.propDecorators = {
"dataParent": [{ type: Input },],
"nameTextField": [{ type: ViewChild, args: ['nameTextField',] },],
"shortNameTextField": [{ type: ViewChild, args: ['shortNameTextField',] },],
"dateTextField": [{ type: ViewChild, args: ['dateTextField',] },],
"datePickerTextField": [{ type: ViewChild, args: ['datePickerTextField',] },],
"timePickerTextField": [{ type: ViewChild, args: ['timePickerTextField',] },],
"areaTextField": [{ type: ViewChild, args: ['areaTextField',] },],
};
return DataForm;
}(AbstractHasData));
export { DataForm };
function DataForm_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
DataForm.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
DataForm.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
DataForm.propDecorators;
/** @type {?} */
DataForm.TYPE_NAME;
/** @type {?} */
DataForm.prototype.dataParent;
/** @type {?} */
DataForm.prototype.model;
/** @type {?} */
DataForm.prototype.fields;
/** @type {?} */
DataForm.prototype.labels;
/** @type {?} */
DataForm.prototype.descriptions;
/** @type {?} */
DataForm.prototype.nameTextField;
/** @type {?} */
DataForm.prototype.shortNameTextField;
/** @type {?} */
DataForm.prototype.dateTextField;
/** @type {?} */
DataForm.prototype.datePickerTextField;
/** @type {?} */
DataForm.prototype.timePickerTextField;
/** @type {?} */
DataForm.prototype.areaTextField;
/** @type {?} */
DataForm.prototype.dataContainer;
/** @type {?} */
DataForm.prototype.changeEvent;
/** @type {?} */
DataForm.prototype.notifyMgr;
/** @type {?} */
DataForm.prototype.dialogServ;
/** @type {?} */
DataForm.prototype.minDate;
/** @type {?} */
DataForm.prototype.maxDate;
/** @type {?} */
DataForm.prototype.minTime;
/** @type {?} */
DataForm.prototype.maxTime;
/** @type {?} */
DataForm.prototype.rows;
/** @type {?} */
DataForm.prototype.cols;
/** @type {?} */
DataForm.prototype.testCount;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0RhdGFGb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQTRCLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBS3pHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELHFCQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFJOUIscUJBQU0sU0FBUyxHQUFXLGVBQWUsQ0FBQzs7SUE4RFosb0NBQWU7SUFvQzNDLGtCQUFZLFNBQThCLEVBQUUsVUFBeUIsRUFBRSxVQUFzQjtRQUE3RixZQUNFLGtCQUFNLFVBQVUsQ0FBQyxTQVFsQjswQkFYMkIsQ0FBQztRQUkzQixL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O1FBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O3lCQWpSd0IsU0FBUzs7Z0JBN0RyRCxTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUNuQixRQUFRLEVBQUUsU0FBUztvQkFDbkIsUUFBUSxFQUFFLDZ4RkFzRFg7aUJBQ0E7Ozs7Z0JBbEZRLG1CQUFtQjtnQkFDbkIsYUFBYTtnQkFITSxVQUFVOzs7K0JBeUZuQyxLQUFLO2tDQU1MLFNBQVMsU0FBQyxlQUFlO3VDQUV6QixTQUFTLFNBQUMsb0JBQW9CO2tDQUU5QixTQUFTLFNBQUMsZUFBZTt3Q0FFekIsU0FBUyxTQUFDLHFCQUFxQjt3Q0FFL0IsU0FBUyxTQUFDLHFCQUFxQjtrQ0FFL0IsU0FBUyxTQUFDLGVBQWU7O21CQXpHNUI7RUFxRjhCLGVBQWU7U0FBaEMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVudUl0ZW1Nb2RlbCwgTWVudU1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbkFjdGlvbiB9IGZyb20gJy4vbW9kZWwvbW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9zZXJ2aWNlL05vdGlmaWNhdGlvbk1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9EaWFsb2dTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuL0lIYXNEYXRhJztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4vSUhhc01vZGVsJztcbmltcG9ydCB7IEFic3RyYWN0SGFzRGF0YSB9IGZyb20gJy4vQWJzdHJhY3RIYXNEYXRhJztcbmltcG9ydCB7IE1hdGVyaWFsVGV4dEJveCB9IGZyb20gJy4uL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRleHRCb3guY29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsRGF0ZVBpY2tlciB9IGZyb20gJy4uL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbERhdGVQaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsVGltZVBpY2tlciB9IGZyb20gJy4uL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRpbWVQaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsVGV4dEFyZWEgfSBmcm9tICcuLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUZXh0QXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dEJveCB9IGZyb20gJy4vZGF0YXZpZXcvaW5wdXQvVGV4dEJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dEFyZWEgfSBmcm9tICcuL2RhdGF2aWV3L2lucHV0L1RleHRBcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJQ2hhbmdlYWJsZSB9IGZyb20gJy4vSUNoYW5nZWFibGUnO1xuaW1wb3J0IHsgRm9ybVZpZXcgfSBmcm9tICcuL2VkaXRvci9lZGl0b3IuaW50ZXJuYWwvRm9ybVZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IFRlc3RDb21wb25lbnQgfSBmcm9tICcuL1Rlc3RDb21wb25lbnQuY29tcG9uZW50JztcbmltcG9ydCB7IENIQU5HRV9FVkVOVCB9IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSdcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcblxuY29uc3QgRk9STV9WSUVXID0gJ2Zvcm0tdmlldyc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1kYXRhLWZvcm1cIjtcblxuLy8gZm9yIHRlc3Rpbmcgb25seSByZW1vdmUgdGhpcyBjb21wb25lbnQgd2hlbiBhbGwgZmlzaGlzaGVkXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiZGF0YS1mb3JtXCI+XG5cdDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibGVmdFwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGl0bGVcIj4gUGF5bWVudCB2b3VjaGVyIDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPiB2b3VjaGVyTm86IFBPWFhYWFhYWFhYIDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGl0bGVcIj4gQUJTIE1hbmFnZW1lbnQgc29sdXRpb24gPC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+IGFkZHJlc3Mgc3RoaW5nIDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImJvZHlcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiYm9keS1jb250YWluZXJcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPjxtYXRlcmlhbC10ZXh0LWJveCByZXF1aXJlZCAjbmFtZVRleHRGaWVsZCBbbGFiZWxdPVwiZ2V0TGFiZWxzKClbMF1cIiBbZGVzY3JpcHRpb25dPVwiZ2V0RGVzY3JpcHRpb25zKClbMF1cIiBbZGF0YV09XCJfZ2V0RGF0YUNvbnRhaW5lcigpXCIgW2ZpZWxkXT1cImdldEZpZWxkcygpWzBdXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvbWF0ZXJpYWwtdGV4dC1ib3g+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPjxtYXRlcmlhbC10ZXh0LWJveCAjc2hvcnROYW1lVGV4dEZpZWxkIFtsYWJlbF09XCJnZXRMYWJlbHMoKVsxXVwiIFtkZXNjcmlwdGlvbl09XCJnZXREZXNjcmlwdGlvbnMoKVsxXVwiIFtkYXRhXT1cIl9nZXREYXRhQ29udGFpbmVyKClcIiBbZmllbGRdPVwiZ2V0RmllbGRzKClbMV1cIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9tYXRlcmlhbC10ZXh0LWJveD48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+PG1hdGVyaWFsLXRleHQtYm94ICNkYXRlVGV4dEZpZWxkIFtsYWJlbF09XCJnZXRMYWJlbHMoKVsyXVwiIFtkZXNjcmlwdGlvbl09XCJnZXREZXNjcmlwdGlvbnMoKVsyXVwiIFtkYXRhXT1cIl9nZXREYXRhQ29udGFpbmVyKClcIiBbZmllbGRdPVwiZ2V0RmllbGRzKClbMl1cIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9tYXRlcmlhbC10ZXh0LWJveD48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuXHRcdFx0XHRcdDxtYXRlcmlhbC1kYXRlLXBpY2tlciBbcGh4TWluXT1cImdldE1pbkRhdGUoKVwiIFtwaHhNYXhdPVwiZ2V0TWF4RGF0ZSgpXCIgW2Rlc2NyaXB0aW9uXT1cImdldERlc2NyaXB0aW9ucygpWzNdXCI+PC9tYXRlcmlhbC1kYXRlLXBpY2tlcj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuXHRcdFx0XHRcdDxtYXRlcmlhbC10aW1lLXBpY2tlciBbcGh4TWluXT1cImdldE1pblRpbWUoKVwiIFtwaHhNYXhdPVwiZ2V0TWF4VGltZSgpXCIgW2Rlc2NyaXB0aW9uXT1cImdldERlc2NyaXB0aW9ucygpWzRdXCI+PC9tYXRlcmlhbC10aW1lLXBpY2tlcj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG5cdFx0XHRcdFx0PG1hdGVyaWFsLXRleHQtYXJlYSByZXF1aXJlZCBbcm93c109XCJnZXRSb3dzKClcIiBbY29sc109XCJnZXRDb2xzKClcIiAjYXJlYVRleHRGaWVsZCBbbGFiZWxdPVwiZ2V0TGFiZWxzKClbNV1cIiBbZGVzY3JpcHRpb25dPVwiZ2V0RGVzY3JpcHRpb25zKClbNV1cIiBbZGF0YV09XCJfZ2V0RGF0YUNvbnRhaW5lcigpXCIgW2ZpZWxkXT1cImdldEZpZWxkcygpWzVdXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvbWF0ZXJpYWwtdGV4dC1hcmVhPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cInNob3dEYXRhQ2xpY2tlZCgkZXZlbnQpXCI+U2hvdyBEYXRhPC9idXR0b24+PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cImVkaXREYXRhQ2xpY2tlZCgkZXZlbnQpXCI+RWRpdCBEYXRhPC9idXR0b24+PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cInNhdmVEYXRhQ2xpY2tlZCgkZXZlbnQpXCI+U2F2ZSBEYXRhPC9idXR0b24+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm0gZXh0ZW5kcyBBYnN0cmFjdEhhc0RhdGEgaW1wbGVtZW50cyBPbkluaXQsIElIYXNNb2RlbCwgSUNoYW5nZWFibGUge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBwcml2YXRlIG1vZGVsOiBhbnk7XG4gIHByaXZhdGUgZmllbGRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBsYWJlbHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGRlc2NyaXB0aW9uczogc3RyaW5nW107XG4gIEBWaWV3Q2hpbGQoJ25hbWVUZXh0RmllbGQnKVxuICBwcml2YXRlIG5hbWVUZXh0RmllbGQ6IE1hdGVyaWFsVGV4dEJveDtcbiAgQFZpZXdDaGlsZCgnc2hvcnROYW1lVGV4dEZpZWxkJylcbiAgcHJpdmF0ZSBzaG9ydE5hbWVUZXh0RmllbGQ6IE1hdGVyaWFsVGV4dEJveDtcbiAgQFZpZXdDaGlsZCgnZGF0ZVRleHRGaWVsZCcpXG4gIHByaXZhdGUgZGF0ZVRleHRGaWVsZDogTWF0ZXJpYWxUZXh0Qm94O1xuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyVGV4dEZpZWxkJylcbiAgcHJpdmF0ZSBkYXRlUGlja2VyVGV4dEZpZWxkOiBNYXRlcmlhbERhdGVQaWNrZXI7XG4gIEBWaWV3Q2hpbGQoJ3RpbWVQaWNrZXJUZXh0RmllbGQnKVxuICBwcml2YXRlIHRpbWVQaWNrZXJUZXh0RmllbGQ6IE1hdGVyaWFsVGltZVBpY2tlcjtcbiAgQFZpZXdDaGlsZCgnYXJlYVRleHRGaWVsZCcpXG4gIHByaXZhdGUgYXJlYVRleHRGaWVsZDogTWF0ZXJpYWxUZXh0QXJlYTtcbiAgcHJpdmF0ZSBkYXRhQ29udGFpbmVyOiBhbnlbXTtcbiAgcHJpdmF0ZSBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIHRlc3RcbiAgcHJpdmF0ZSBub3RpZnlNZ3I6IE5vdGlmaWNhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgZGlhbG9nU2VydjogRGlhbG9nU2VydmljZTtcbiAgcHJpdmF0ZSBtaW5EYXRlOiBEYXRlO1xuICBwcml2YXRlIG1heERhdGU6IERhdGU7XG4gIHByaXZhdGUgbWluVGltZTogRGF0ZTtcbiAgcHJpdmF0ZSBtYXhUaW1lOiBEYXRlO1xuICBwcml2YXRlIHJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb2xzOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSB0ZXN0Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3Iobm90aWZ5TWdyOiBOb3RpZmljYXRpb25NYW5hZ2VyLCBkaWFsb2dTZXJ2OiBEaWFsb2dTZXJ2aWNlLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZik7XG4gICAgdGhpcy5kYXRhQ29udGFpbmVyID0gW107XG4gICAgdGhpcy5kZXNjcmlwdGlvbnMgPSBbXTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLy8gZm9yIHRlc3Qgbm90aWZpY2F0aW9uXG4gICAgdGhpcy5ub3RpZnlNZ3IgPSBub3RpZnlNZ3I7XG4gICAgdGhpcy5kaWFsb2dTZXJ2ID0gZGlhbG9nU2VydjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5maWVsZHMgPSBbXCJuYW1lXCIsIFwic2hvcnROYW1lXCIsIFwiX2NyZWF0ZWRcIiwgXCJkYXRlUGlja2VyTmFtZVwiLCBcInRpbWVQaWNrZXJOYW1lXCIsIFwiYXJlYU5hbWVcIl07XG4gICAgdGhpcy5sYWJlbHMgPSBbXCJOYW1lXCIsIFwiU2hvcnROYW1lXCIsIFwiQ3JlYXRlIERhdGVcIiwgXCJEYXRlUGlja2VyTmFtZVwiLCBcIlRpbWVQaWNrZXJOYW1lXCIsIFwiQXJlYU5hbWVcIl07XG4gICAgdGhpcy5kZXNjcmlwdGlvbnMgPSBbXCJuYW1lIGRlc2NyaXB0aW9uXCIsIFwic2hvcnROYW1lIGRlc2NyaXB0aW9uXCIsIFwiY3JlYXRlRGF0ZSBEZXNjcmlwdGlvblwiXG4gICAgICAsIFwiZGF0ZVBpY2tlck5hbWUgZGVzY3JpcHRpb25cIiwgXCJ0aW1lUGlja2VyTmFtZSBkZXNjcmlwdGlvblwiLCBcImFyZWFOYW1lIGRlc2NyaXB0aW9uXCJdO1xuXG4gICAgbGV0IG5hbWVGaWVsZENoYW5nZUVWID0gdGhpcy5uYW1lVGV4dEZpZWxkLmdldENoYW5nZUV2ZW50KCk7XG4gICAgaWYgKG5hbWVGaWVsZENoYW5nZUVWICE9PSBudWxsICYmIHR5cGVvZiBuYW1lRmllbGRDaGFuZ2VFViAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG5hbWVGaWVsZENoYW5nZUVWLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGV2ZW50LmRldGFpbC5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayA9IFt0aGlzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkVtaXRDaGFuZ2UoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzaG9ydE5hbWVDaGFuZ2VFViA9IHRoaXMuc2hvcnROYW1lVGV4dEZpZWxkLmdldENoYW5nZUV2ZW50KCk7XG4gICAgaWYgKHNob3J0TmFtZUNoYW5nZUVWICE9PSBudWxsICYmIHR5cGVvZiBzaG9ydE5hbWVDaGFuZ2VFViAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHNob3J0TmFtZUNoYW5nZUVWLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGV2ZW50LmRldGFpbC5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayA9IFt0aGlzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkVtaXRDaGFuZ2UoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm1pbkRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5taW5EYXRlLnNldE1vbnRoKDUpO1xuICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5tYXhEYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHRoaXMubWF4RGF0ZS5zZXRNb250aCgxMCk7XG5cbiAgICB0aGlzLm1pblRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMubWluVGltZS5zZXRIb3VycygxMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5tYXhUaW1lID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm1heFRpbWUuc2V0SG91cnMoMTUsIDAsIDAsIDApO1xuXG4gICAgdGhpcy5yb3dzID0gODtcbiAgICB0aGlzLmNvbHMgPSAxMDA7XG4gIH1cblxuICBwcml2YXRlIG9uRW1pdENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIHNvdXJjZTogZXZlbnQsXG4gICAgICBidWJibGVTdGFjazogW3RoaXNdXG4gICAgfTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KENIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHVibGljIF9nZXREYXRhQ29udGFpbmVyKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29udGFpbmVyO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXRhKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIC8vIG92ZXJpZGUgbWV0aG9kXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5vYmplY3RzKSkge1xuICAgICAgICB0aGlzLmRhdGFDb250YWluZXIgPSBkYXRhLm9iamVjdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hpbGQgYWRkIGRhdGFDb250YWluZXIgaW5zdGVhZFxuICAgIGlmICh0aGlzLmRhdGFDaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgYyBvZiB0aGlzLmRhdGFDaGlsZHJlbikge1xuICAgICAgICBjLnNldERhdGEodGhpcy5kYXRhQ29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2hvd0RhdGFDbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyB0ZXN0IG5vdGlmaWNhdGlvblxuICAgIGlmICh0aGlzLm5vdGlmeU1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5ub3RpZnlNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnRlc3RDb3VudCArPSAxO1xuICAgICAgbGV0IGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgbGV0IGNsaWNrRnVuYzogRnVuY3Rpb24gPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdCT0RZIENMSUNLRUQnKTtcbiAgICAgIH07XG4gICAgICBsZXQgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKFwiXCIsIFwiVElUTEU6IFwiICsgdGhpcy50ZXN0Q291bnQsIFwiZGVzY3JpcHRpb25cIiwgdHJ1ZSwgXCJMQlwiLCBkLCAyMDAwKTtcbiAgICAgIG5vdGlmaWNhdGlvbi5jbGlja0hhbmRsZXIgPSBjbGlja0Z1bmM7XG4gICAgICBsZXQgYWN0aW9uMTogTm90aWZpY2F0aW9uQWN0aW9uID0gbmV3IE5vdGlmaWNhdGlvbkFjdGlvbignTU9SRScsIChldjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdmaXJzdCBDTElDS0VEJyk7XG4gICAgICAgIGlmIChldiAhPT0gbnVsbCAmJiB0eXBlb2YgZXYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZXYuZGV0YWlsLmRhdGEuaW5zdGFuY2Uuc2hvd0JvZHkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgYWN0aW9uMjogTm90aWZpY2F0aW9uQWN0aW9uID0gbmV3IE5vdGlmaWNhdGlvbkFjdGlvbignQ0FOQ0VMJywgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnY2FuY2VsIENMSUNLRUQnKTtcbiAgICAgIH0sIHRydWUpO1xuICAgICAgbm90aWZpY2F0aW9uLmFkZEFjdGlvbihhY3Rpb24xKTtcbiAgICAgIG5vdGlmaWNhdGlvbi5hZGRBY3Rpb24oYWN0aW9uMik7XG4gICAgICBub3RpZmljYXRpb24uYm9keUNvbXBvbmVudCA9IFRlc3RDb21wb25lbnQ7XG4gICAgICB0aGlzLm5vdGlmeU1nci5ub3RpZnkobm90aWZpY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZURhdGFDbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lVGV4dEZpZWxkLmdldElucHV0VmFsdWUoKTtcbiAgICBsZXQgc2hvcnROYW1lOiBzdHJpbmcgPSB0aGlzLnNob3J0TmFtZVRleHRGaWVsZC5nZXRJbnB1dFZhbHVlKCk7XG4gICAgbGV0IGRhdGVTdHJpbmc6IHN0cmluZyA9IHRoaXMuZGF0ZVRleHRGaWVsZC5nZXRJbnB1dFZhbHVlKCk7XG4gICAgbGV0IGRhdGVQaWNrZXI6IGFueSA9IHRoaXMuZGF0ZVBpY2tlclRleHRGaWVsZC5nZXREYXRhKCk7XG4gICAgbGV0IHRpbWVQaWNrZXI6IGFueSA9IHRoaXMudGltZVBpY2tlclRleHRGaWVsZC5nZXREYXRhKCk7XG4gICAgbGV0IGFyZWFOYW1lOiBzdHJpbmcgPSB0aGlzLmFyZWFUZXh0RmllbGQuZ2V0SW5wdXRWYWx1ZSgpO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5lZGl0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YS5lZGl0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgZm9ybVZpZXcgPSB0aGlzLmRhdGEuZWRpdG9yLmdldFZpZXdDb21wb25lbnRGcm9tVHlwZShGT1JNX1ZJRVcpIGFzIEZvcm1WaWV3O1xuICAgICAgbGV0IGN1ckluZGV4ID0gZm9ybVZpZXcuZ2V0Q3VycmVudFRhYkluZGV4KCk7XG5cbiAgICAgIGxldCBvYmo6IGFueSA9IGZvcm1WaWV3LmdldFRhYkRhdGEoY3VySW5kZXgpO1xuXG4gICAgICBpZiAob2JqICE9PSBudWxsICYmIG9iai5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBvYmpzOiBhbnlbXSA9IGZvcm1WaWV3LmdldFRhYkRhdGEoY3VySW5kZXgpO1xuXG4gICAgICAgIGxldCBjcmVhdGVkQXJyYXk6IGFueVtdID0gW107XG4gICAgICAgIGxldCB1cGRhdGVkQXJyYXk6IGFueVtdID0gW107XG5cbiAgICAgICAgbGV0IG9iamVjdElkRmllbGQ6IHN0cmluZyA9IHRoaXMuZGF0YS5lZGl0b3IuZ2V0T2JqZWN0SWRGaWVsZCgpO1xuICAgICAgICBmb3IgKGxldCBvYmogb2Ygb2Jqcykge1xuICAgICAgICAgIGlmIChvYmpbb2JqZWN0SWRGaWVsZF0gIT09IG51bGwgJiYgdHlwZW9mIG9ialtvYmplY3RJZEZpZWxkXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRBcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyZWF0ZWRBcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGRhdGFcbiAgICAgICAgaWYgKGNyZWF0ZWRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmVkaXRvci5jcmVhdGVEYXRhKGNyZWF0ZWRBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIGRhdGFcbiAgICAgICAgaWYgKHVwZGF0ZWRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmVkaXRvci51cGRhdGVEYXRhKHVwZGF0ZWRBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBvYmplY3RcbiAgICAgICAgbGV0IG5ld09iajogYW55ID0ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsIHNob3J0TmFtZTogc2hvcnROYW1lXG4gICAgICAgICAgLCBfY3JlYXRlZDogZGF0ZVN0cmluZywgZGF0ZVBpY2tlcjogZGF0ZVBpY2tlclxuICAgICAgICAgICwgdGltZVBpY2tlcjogdGltZVBpY2tlciwgYXJlYU5hbWU6IGFyZWFOYW1lXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGF0YS5lZGl0b3IuY3JlYXRlRGF0YShuZXdPYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlZGl0RGF0YUNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIHRlc3QgY2xlYXIgYWxsIG5vdGlmeVxuICAgIGlmICh0aGlzLm5vdGlmeU1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5ub3RpZnlNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgIHRoaXMubm90aWZ5TWdyLmNsZWFyQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIHNlbGZSZXNldERhdGEoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBkb1ByZWxvYWQoKTogUHJvbWlzZTxhbnk+IHsgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgIHJlc29sdmUobnVsbCk7ICAgICB9KTsgICB9ICBwdWJsaWMgZG9Mb2FkZWQoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYWJlbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxhYmVscztcbiAgfVxuXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXRNaW5EYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1pbkRhdGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5tYXhEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldE1pblRpbWUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMubWluVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhUaW1lKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1heFRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29scygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHM7XG4gIH1cblxufVxuIl19