dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
657 lines • 58.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { EventEmitter, Injectable } from '@angular/core';
import { MatSnackBar } from '@angular/material';
import { CurrentService, ElementsService, ProjectService, BillOperate } from 'dbweb-core';
import { forkJoin, Subject } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { TabsService } from '../../home/tabs.service';
import { EleViewBackFaceService } from '../../services/eleview/eleview-backface';
import { map2WithLetter } from '../../services/eleview/mapletter';
import { OwnerByEnum } from '../../services/eleview/types/model';
import { ElementViewDigest } from '../model/element-columns-digest';
import { Order } from '../model/model';
import { DataType, Operates } from '../model/operate';
import { BackFaceService } from './backface';
import { combLabelColumnsItem, ServiceData, ConditionalTemplateRunner, defaultColumnsItem } from './data';
export class EditView {
/**
* @param {?} svr
*/
constructor(svr) {
this.svr = svr;
this.titleInput = true;
this.isAdd = true;
this.addOwnerBy = OwnerByEnum.ownerByUser; // 仅新增时用到
this.modify = false; // current是否被修改过
// current是否被修改过
this.currentChange = new EventEmitter();
}
/**
* @return {?}
*/
get current() {
return this._current;
}
/**
* @param {?} val
* @return {?}
*/
set current(val) {
/** @type {?} */
const process = (/**
* @return {?}
*/
() => {
this._current = val;
this.Readonly = !this._current.canModify(this.svr.current.data.UserName, this.svr.current.data.Dept.Code);
this.currentChange.emit();
});
if (val === combLabelColumnsItem) {
this.svr.backface.comboLabelsView().subscribe((/**
* @param {?} cols
* @return {?}
*/
cols => {
this.SelectedColumns = cols.map((/**
* @param {?} col
* @return {?}
*/
col => ({
Name: col,
Hidden: false,
Order: Order.OrderNone
})));
}));
process();
}
else {
this.svr.backface.getViewColumns(val).subscribe((/**
* @param {?} cols
* @return {?}
*/
cols => {
this.SelectedColumns = cols;
process();
}));
}
}
/**
* @return {?}
*/
done() {
if (this.isAdd) {
/** @type {?} */
const view = {
Name: this.title,
OwnerBy: this.addOwnerBy,
Owner: this.addOwnerBy === OwnerByEnum.ownerByDept
? this.svr.current.data.Dept.Code
: this.svr.current.data.UserName
};
return this.svr.backface.addView(view).pipe(map((/**
* @return {?}
*/
() => {
/** @type {?} */
const dView = ElementViewDigest.fromInterface(view);
this.svr.data.viewList.push(dView);
this.current = dView;
this.titleInput = false;
return true;
})));
}
else {
return this.svr.backface
.updateViewName({
OldName: this.current.Name,
Name: this.title,
OwnerBy: this.current.OwnerBy,
Owner: this.current.Owner
})
.pipe(map((/**
* @param {?} v
* @return {?}
*/
v => {
this.current.Name = this.title;
this.titleInput = false;
return true;
})));
}
}
/**
* @return {?}
*/
remove() {
this.svr.backface.removeView(this.current).subscribe((/**
* @return {?}
*/
() => {
/** @type {?} */
const num = this.svr.data.viewList.findIndex((/**
* @param {?} v
* @return {?}
*/
v => v === this.current));
this.svr.data.viewList.splice(num, 1);
if (this.svr.data.viewList.length > 0) {
if (num < this.svr.data.viewList.length) {
this.current = this.svr.data.viewList[num];
}
else {
this.current = this.svr.data.viewList[this.svr.data.viewList.length - 1];
}
}
else {
this.current = this.svr.data.constViewItems[0];
}
}));
}
/**
* @return {?}
*/
add() {
this.title = '新的视图';
this.isAdd = true;
this.titleInput = true;
}
/**
* @return {?}
*/
edit() {
this.title = this._current.Name;
this.isAdd = false;
this.titleInput = true;
}
/**
* @return {?}
*/
cancel() {
this.titleInput = false;
if (!this.current) {
if (this.svr.data.viewList && this.svr.data.viewList.length > 0) {
this.current = this.svr.data.viewList[0];
}
else {
this.current = this.svr.data.constViewItems[0];
}
}
}
/**
* @return {?}
*/
save() {
return this.svr.backface
.updateView({
Name: this.current.Name,
OwnerBy: this.current.OwnerBy,
Owner: this.current.Owner,
Columns: this.SelectedColumns
})
.pipe(tap((/**
* @return {?}
*/
() => {
this.modify = false;
})));
}
}
if (false) {
/** @type {?} */
EditView.prototype.titleInput;
/** @type {?} */
EditView.prototype.isAdd;
/** @type {?} */
EditView.prototype.addOwnerBy;
/** @type {?} */
EditView.prototype.title;
/**
* @type {?}
* @private
*/
EditView.prototype._current;
/** @type {?} */
EditView.prototype.Readonly;
/** @type {?} */
EditView.prototype.SelectedColumns;
/** @type {?} */
EditView.prototype.modify;
/** @type {?} */
EditView.prototype.currentChange;
/**
* @type {?}
* @private
*/
EditView.prototype.svr;
}
/**
* @record
*/
export function RefreshDataConfig() { }
if (false) {
/** @type {?|undefined} */
RefreshDataConfig.prototype.keepDivide;
/** @type {?|undefined} */
RefreshDataConfig.prototype.keepRowCount;
}
export class ServiceService {
/**
* @param {?} data
* @param {?} prj
* @param {?} backface
* @param {?} tabs
* @param {?} eles
* @param {?} current
* @param {?} eleview
* @param {?} snackBar
* @param {?} curr
*/
constructor(data, prj, backface, tabs, eles, current, eleview, snackBar, curr) {
this.data = data;
this.prj = prj;
this.backface = backface;
this.tabs = tabs;
this.eles = eles;
this.current = current;
this.eleview = eleview;
this.snackBar = snackBar;
this.curr = curr;
this.subscribe = [];
this.editView = new EditView(this);
this.paramsChange = new Subject(); // 参数发生变化,一般是初始化时一次,切换处理地一次
// 参数发生变化,一般是初始化时一次,切换处理地一次
// 标签定义界面的数据
this.refreshDataEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscribe.forEach((/**
* @param {?} v
* @return {?}
*/
v => v.unsubscribe()));
}
/**
* @param {?} element
* @param {?} title
* @param {?} condition
* @return {?}
*/
initByCondition(element, title, condition) {
this.backface.eleName = element.Name;
// 如果没有条件,则直接初始化
if (!title && !condition) {
this.init(element, this.prj.apiURL(element.Name));
}
else {
this.backface
.buildRecordViewURL({
Title: title,
Condition: condition
})
.subscribe((/**
* @param {?} str
* @return {?}
*/
str => {
this.init(element, str);
}));
}
}
/**
* @param {?} element
* @param {?} url
* @return {?}
*/
init(element, url) {
this.element = element;
this.backface.eleName = element.Name;
this.backface.url = url;
this.subscribe.push(this.curr.change$.subscribe((/**
* @return {?}
*/
() => {
// tslint:disable-next-line: deprecation
forkJoin(this.backface.fetParamCache(), this.eleview.fetchElementAllCategories(element.Name), this.backface.fetchElementViewList(), this.backface.fetchAllColumns()).subscribe((/**
* @param {?} __0
* @return {?}
*/
([param, categories, columnsList, allColumns]) => {
if (param.Processes) {
// 注册相关的element,必须是第一时间注册,后面会引用到
param.Processes.forEach((/**
* @param {?} v
* @return {?}
*/
v => {
this.eles.addElement(Object.assign({}, v.Element, { NotMenu: true }));
}));
this.data.rowProcesses = this.withDefaultIconProcess(param.Processes.filter((/**
* @param {?} one
* @return {?}
*/
one => one.BindRecord)));
this.data.toolbarProcesses = this.withDefaultIconProcess(param.Processes.filter((/**
* @param {?} one
* @return {?}
*/
one => !one.BindRecord)));
}
else {
this.data.rowProcesses = [];
this.data.toolbarProcesses = [];
}
this.data.uniqueFields = param.UniqueField;
if (param.ConditionalTemplates) {
this.data.conditionalTemplates = param.ConditionalTemplates.map((/**
* @param {?} v
* @return {?}
*/
v => ConditionalTemplateRunner.fromInterface(v)));
}
this.data.categories = categories;
this.data.viewList = columnsList;
this.data.selectedView = defaultColumnsItem;
this.data.allColumns = allColumns;
this.data.allColumnNames = allColumns.map((/**
* @param {?} v
* @return {?}
*/
v => v.Name));
this.data.allColumnsWithLetter = map2WithLetter(this.data.allColumnNames);
this.paramsChange.next();
this.refreshData().subscribe();
}), (/**
* @param {?} err
* @return {?}
*/
(err) => {
console.log(err);
if (err.error.Err.Message) {
this.snackBar.open(err.error.Err.Message, '确定', { horizontalPosition: 'right' });
}
}));
})));
}
/**
* @param {?} process
* @return {?}
*/
withDefaultIconProcess(process) {
return process.map((/**
* @param {?} pro
* @return {?}
*/
pro => {
/** @type {?} */
const rev = pro;
if (!pro.Icon) {
/** @type {?} */
const ele = this.eles.get(pro.ElementName);
if (ele.Bill) {
switch (pro.Element.BillOperate) {
case BillOperate.Add:
rev.Icon = 'add';
break;
case BillOperate.Edit:
rev.Icon = 'outlined:create';
break;
case BillOperate.Browse:
rev.Icon = 'outlined:visibility';
break;
case BillOperate.Delete:
rev.Icon = 'outlined:delete';
rev.Color = 'warn';
break;
}
}
else {
rev.Icon = '';
}
}
return rev;
}));
}
/**
* @return {?}
*/
refreshRowCount() {
this.data.fetchParam.View = this.data.selectedView;
this.data.fetchParam.Labels = this.data.selectedLabels;
this.data.fetchParam.SelKeys = this.data.tableRowSelection.selected;
this.data.refreshRowCountProgress = true;
if (this.data.conditionalTemplates) {
this.data.fetchParam.ConditionalTemplate = this.data.conditionalTemplates
.filter((/**
* @param {?} v
* @return {?}
*/
v => v.enable))
.map((/**
* @param {?} v
* @return {?}
*/
v => v.Data));
}
return this.backface.fetchRowCount(this.data.fetchParam).pipe(map((/**
* @param {?} v
* @return {?}
*/
v => {
this.data.rowCount = v.RowCount;
this.data.refreshRowCountProgress = false;
return true;
})));
}
// seek 指明是不是没有动过条件,仅仅翻页
/**
* @param {?=} config
* @return {?}
*/
refreshData(config) {
if (config && config.keepDivide) {
this.data.prevFetchDivide = this.data.fetchParam.Divide;
this.data.prevFetchRowNum = this.data.fetchParam.DivideRowNum;
}
else {
this.data.prevFetchDivide = undefined;
this.data.prevFetchRowNum = undefined;
this.data.fetchParam.Divide = undefined;
this.data.fetchParam.DivideRowNum = undefined;
this.data.upDivide = undefined;
this.data.upRowNum = undefined;
}
this.data.fetchParam.View = this.data.selectedView;
this.data.fetchParam.Labels = this.data.selectedLabels;
this.data.fetchParam.SelKeys = this.data.tableRowSelection.selected;
this.data.refreshDataProgress = true;
if (this.data.conditionalTemplates) {
this.data.fetchParam.ConditionalTemplate = this.data.conditionalTemplates
.filter((/**
* @param {?} v
* @return {?}
*/
v => v.enable))
.map((/**
* @param {?} v
* @return {?}
*/
v => v.Data));
}
return this.backface.fetchData(this.data.fetchParam).pipe(map((/**
* @param {?} v
* @return {?}
*/
v => {
if (v.Error) {
this.snackBar.open(v.Error, '确定', { duration: 5000 });
this.data.refreshDataProgress = false;
return { ok: false, error: v.Error };
}
// console.log('=======:', v.FData);
this.data.tableData = v.FData;
this.data.timeConsuming = v.TimeConsuming;
this.data.nextPageDisable =
(v.FData.RowCount === 0 && v.FData.Rows.length === 0) || v.FData.RowCount > 0;
this.data.prevPageDisable =
(v.FData.RowCount === 0 && v.FData.Rows.length === 0) || v.FData.Rows[0].RowNum === 1;
this.registerURLS();
if (v.FData.RowCount >= 0) {
this.data.rowCount = v.FData.RowCount;
}
else {
if (!config || !config.keepRowCount) {
this.data.rowCount = -1; // 放这里可以防止界面无必要刷新
}
}
// 如果后端返回title,则说明是需要动态改变title值
if (v.FData.Title) {
this.tabs.active.titleObservable.next(v.FData.Title);
}
this.refreshDataEvent.emit(config);
this.data.refreshDataProgress = false;
return { ok: true };
})));
}
// 注册相关的url的签名
/**
* @return {?}
*/
registerURLS() {
Object.keys(this.data.tableData.Processes).forEach((/**
* @param {?} v
* @return {?}
*/
v => {
this.eles.setURLSign(this.data.tableData.Processes[v].URL, this.data.tableData.Processes[v].Sign);
}));
this.data.tableData.Rows.forEach((/**
* @param {?} row
* @return {?}
*/
row => {
Object.keys(row.Processes).forEach((/**
* @param {?} v
* @return {?}
*/
v => {
this.eles.setURLSign(row.Processes[v].URL, row.Processes[v].Sign);
}));
}));
}
// 获取指定列允许使用的运算符
/**
* @private
* @param {?} col
* @return {?}
*/
getOperates(col) {
if (!col) {
return [];
}
/** @type {?} */
const colType = DataType[this.data.tableData.Columns.find((/**
* @param {?} c
* @return {?}
*/
c => c.Name === col)).Type];
return [
(/** @type {?} */ ({
Name: '',
Label: '(无)'
})),
...Operates.filter((/**
* @param {?} v
* @return {?}
*/
v => v.AllowTypes.includes(colType)))
];
}
/**
* @param {?} colName
* @return {?}
*/
onColumnChange(colName) {
this.data.Operates = this.getOperates(colName);
// 如果之前的运算符已经不在列表中,则默认为 无
if (this.data.fetchParam.Opt && !this.data.Operates.find((/**
* @param {?} v
* @return {?}
*/
v => v.Name === this.data.fetchParam.Opt))) {
this.data.fetchParam.Opt = null;
}
}
}
ServiceService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ServiceService.ctorParameters = () => [
{ type: ServiceData },
{ type: ProjectService },
{ type: BackFaceService },
{ type: TabsService },
{ type: ElementsService },
{ type: CurrentService },
{ type: EleViewBackFaceService },
{ type: MatSnackBar },
{ type: CurrentService }
];
if (false) {
/**
* @type {?}
* @private
*/
ServiceService.prototype.subscribe;
/** @type {?} */
ServiceService.prototype.element;
/** @type {?} */
ServiceService.prototype.editView;
/** @type {?} */
ServiceService.prototype.paramsChange;
/** @type {?} */
ServiceService.prototype.refreshDataEvent;
/** @type {?} */
ServiceService.prototype.data;
/**
* @type {?}
* @private
*/
ServiceService.prototype.prj;
/** @type {?} */
ServiceService.prototype.backface;
/**
* @type {?}
* @private
*/
ServiceService.prototype.tabs;
/**
* @type {?}
* @private
*/
ServiceService.prototype.eles;
/** @type {?} */
ServiceService.prototype.current;
/**
* @type {?}
* @private
*/
ServiceService.prototype.eleview;
/**
* @type {?}
* @private
*/
ServiceService.prototype.snackBar;
/**
* @type {?}
* @private
*/
ServiceService.prototype.curr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL3JlY29yZC12aWV3L3NlcnZpY2Uvc2VydmljZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBVyxlQUFlLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRyxPQUFPLEVBQUUsUUFBUSxFQUFnQixPQUFPLEVBQU0sTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQWtCLEtBQUssRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsUUFBUSxFQUFXLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUcxRyxNQUFNLE9BQU8sUUFBUTs7OztJQW1DcEIsWUFBb0Is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LEdBQUcsUUFBUSxDQUFDLE1BQU07Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFDO1NBQ3ZELENBQUM7SUFDSCxDQUFDOzs7OztJQUNELGNBQWMsQ0FBQyxPQUFlO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MseUJBQXlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUMsRUFBRTtZQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ2hDO0lBQ0YsQ0FBQzs7O1lBbk9ELFVBQVU7Ozs7WUFwSW9CLFdBQVc7WUFYUyxjQUFjO1lBVXhELGVBQWU7WUFQZixXQUFXO1lBSGMsZUFBZTtZQUF4QyxjQUFjO1lBSWQsc0JBQXNCO1lBTHRCLFdBQVc7WUFDWCxjQUFjOzs7Ozs7O0lBaUp0QixtQ0FBdUM7O0lBQ3ZDLGlDQUFpQjs7SUFDakIsa0NBQThCOztJQUM5QixzQ0FBNkI7O0lBRTdCLDBDQUF5RDs7SUFFeEQsOEJBQXdCOzs7OztJQUN4Qiw2QkFBMkI7O0lBQzNCLGtDQUFnQzs7Ozs7SUFDaEMsOEJBQXlCOzs7OztJQUN6Qiw4QkFBNkI7O0lBQzdCLGlDQUE4Qjs7Ozs7SUFDOUIsaUNBQXVDOzs7OztJQUN2QyxrQ0FBNkI7Ozs7O0lBQzdCLDhCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBDdXJyZW50U2VydmljZSwgRWxlbWVudCwgRWxlbWVudHNTZXJ2aWNlLCBQcm9qZWN0U2VydmljZSwgQmlsbE9wZXJhdGUgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgZm9ya0pvaW4sIFN1YnNjcmlwdGlvbiwgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRhYnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaG9tZS90YWJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbGVWaWV3QmFja0ZhY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy9lbGV2aWV3LWJhY2tmYWNlJztcclxuaW1wb3J0IHsgbWFwMldpdGhMZXR0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbGV2aWV3L21hcGxldHRlcic7XHJcbmltcG9ydCB7IE93bmVyQnlFbnVtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9tb2RlbCc7XHJcbmltcG9ydCB7IEVsZW1lbnRWaWV3RGlnZXN0IH0gZnJvbSAnLi4vbW9kZWwvZWxlbWVudC1jb2x1bW5zLWRpZ2VzdCc7XHJcbmltcG9ydCB7IElEaXNwbGF5Q29sdW1uLCBPcmRlciwgSVJlY29yZFZpZXdQcm9jZXNzIH0gZnJvbSAnLi4vbW9kZWwvbW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZSwgT3BlcmF0ZSwgT3BlcmF0ZXMgfSBmcm9tICcuLi9tb2RlbC9vcGVyYXRlJztcclxuaW1wb3J0IHsgQmFja0ZhY2VTZXJ2aWNlIH0gZnJvbSAnLi9iYWNrZmFjZSc7XHJcbmltcG9ydCB7IGNvbWJMYWJlbENvbHVtbnNJdGVtLCBTZXJ2aWNlRGF0YSwgQ29uZGl0aW9uYWxUZW1wbGF0ZVJ1bm5lciwgZGVmYXVsdENvbHVtbnNJdGVtIH0gZnJvbSAnLi9kYXRhJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdFZpZXcge1xyXG5cdHRpdGxlSW5wdXQgPSB0cnVlO1xyXG5cdGlzQWRkID0gdHJ1ZTtcclxuXHRhZGRPd25lckJ5ID0gT3duZXJCeUVudW0ub3duZXJCeVVzZXI7IC8vIOS7heaWsOWinuaXtueUqOWIsFxyXG5cdHRpdGxlPzogc3RyaW5nO1xyXG5cdHByaXZhdGUgX2N1cnJlbnQ/OiBFbGVtZW50Vmlld0RpZ2VzdDtcclxuXHRSZWFkb25seT86IGJvb2xlYW47XHJcblx0U2VsZWN0ZWRDb2x1bW5zPzogSURpc3BsYXlDb2x1bW5bXTtcclxuXHRtb2RpZnkgPSBmYWxzZTsgLy8gY3VycmVudOaYr+WQpuiiq+S/ruaUuei/h1xyXG5cdGN1cnJlbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblx0Z2V0IGN1cnJlbnQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fY3VycmVudDtcclxuXHR9XHJcblx0c2V0IGN1cnJlbnQodmFsOiBFbGVtZW50Vmlld0RpZ2VzdCkge1xyXG5cdFx0Y29uc3QgcHJvY2VzcyA9ICgpID0+IHtcclxuXHRcdFx0dGhpcy5fY3VycmVudCA9IHZhbDtcclxuXHRcdFx0dGhpcy5SZWFkb25seSA9ICF0aGlzLl9jdXJyZW50LmNhbk1vZGlmeSh0aGlzLnN2ci5jdXJyZW50LmRhdGEuVXNlck5hbWUsIHRoaXMuc3ZyLmN1cnJlbnQuZGF0YS5EZXB0LkNvZGUpO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRDaGFuZ2UuZW1pdCgpO1xyXG5cdFx0fTtcclxuXHRcdGlmICh2YWwgPT09IGNvbWJMYWJlbENvbHVtbnNJdGVtKSB7XHJcblx0XHRcdHRoaXMuc3ZyLmJhY2tmYWNlLmNvbWJvTGFiZWxzVmlldygpLnN1YnNjcmliZShjb2xzID0+IHtcclxuXHRcdFx0XHR0aGlzLlNlbGVjdGVkQ29sdW1ucyA9IGNvbHMubWFwPElEaXNwbGF5Q29sdW1uPihjb2wgPT4gKHtcclxuXHRcdFx0XHRcdE5hbWU6IGNvbCxcclxuXHRcdFx0XHRcdEhpZGRlbjogZmFsc2UsXHJcblx0XHRcdFx0XHRPcmRlcjogT3JkZXIuT3JkZXJOb25lXHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0cHJvY2VzcygpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zdnIuYmFja2ZhY2UuZ2V0Vmlld0NvbHVtbnModmFsKS5zdWJzY3JpYmUoY29scyA9PiB7XHJcblx0XHRcdFx0dGhpcy5TZWxlY3RlZENvbHVtbnMgPSBjb2xzO1xyXG5cdFx0XHRcdHByb2Nlc3MoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgc3ZyOiBTZXJ2aWNlU2VydmljZSkge31cclxuXHJcblx0ZG9uZSgpIHtcclxuXHRcdGlmICh0aGlzLmlzQWRkKSB7XHJcblx0XHRcdGNvbnN0IHZpZXcgPSB7XHJcblx0XHRcdFx0TmFtZTogdGhpcy50aXRsZSxcclxuXHRcdFx0XHRPd25lckJ5OiB0aGlzLmFkZE93bmVyQnksXHJcblx0XHRcdFx0T3duZXI6XHJcblx0XHRcdFx0XHR0aGlzLmFkZE93bmVyQnkgPT09IE93bmVyQnlFbnVtLm93bmVyQnlEZXB0XHJcblx0XHRcdFx0XHRcdD8gdGhpcy5zdnIuY3VycmVudC5kYXRhLkRlcHQuQ29kZVxyXG5cdFx0XHRcdFx0XHQ6IHRoaXMuc3ZyLmN1cnJlbnQuZGF0YS5Vc2VyTmFtZVxyXG5cdFx0XHR9O1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5zdnIuYmFja2ZhY2UuYWRkVmlldyh2aWV3KS5waXBlKFxyXG5cdFx0XHRcdG1hcCgoKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBkVmlldyA9IEVsZW1lbnRWaWV3RGlnZXN0LmZyb21JbnRlcmZhY2Uodmlldyk7XHJcblx0XHRcdFx0XHR0aGlzLnN2ci5kYXRhLnZpZXdMaXN0LnB1c2goZFZpZXcpO1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50ID0gZFZpZXc7XHJcblx0XHRcdFx0XHR0aGlzLnRpdGxlSW5wdXQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5zdnIuYmFja2ZhY2VcclxuXHRcdFx0XHQudXBkYXRlVmlld05hbWUoe1xyXG5cdFx0XHRcdFx0T2xkTmFtZTogdGhpcy5jdXJyZW50Lk5hbWUsXHJcblx0XHRcdFx0XHROYW1lOiB0aGlzLnRpdGxlLFxyXG5cdFx0XHRcdFx0T3duZXJCeTogdGhpcy5jdXJyZW50Lk93bmVyQnksXHJcblx0XHRcdFx0XHRPd25lcjogdGhpcy5jdXJyZW50Lk93bmVyXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQucGlwZShcclxuXHRcdFx0XHRcdG1hcCh2ID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5jdXJyZW50Lk5hbWUgPSB0aGlzLnRpdGxlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRpdGxlSW5wdXQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJlbW92ZSgpIHtcclxuXHRcdHRoaXMuc3ZyLmJhY2tmYWNlLnJlbW92ZVZpZXcodGhpcy5jdXJyZW50KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBudW0gPSB0aGlzLnN2ci5kYXRhLnZpZXdMaXN0LmZpbmRJbmRleCh2ID0+IHYgPT09IHRoaXMuY3VycmVudCk7XHJcblx0XHRcdHRoaXMuc3ZyLmRhdGEudmlld0xpc3Quc3BsaWNlKG51bSwgMSk7XHJcblx0XHRcdGlmICh0aGlzLnN2ci5kYXRhLnZpZXdMaXN0Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRpZiAobnVtIDwgdGhpcy5zdnIuZGF0YS52aWV3TGlzdC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudCA9IHRoaXMuc3ZyLmRhdGEudmlld0xpc3RbbnVtXTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50ID0gdGhpcy5zdnIuZGF0YS52aWV3TGlzdFt0aGlzLnN2ci5kYXRhLnZpZXdMaXN0Lmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnQgPSB0aGlzLnN2ci5kYXRhLmNvbnN0Vmlld0l0ZW1zWzBdO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0YWRkKCkge1xyXG5cdFx0dGhpcy50aXRsZSA9ICfmlrDnmoTop4blm74nO1xyXG5cdFx0dGhpcy5pc0FkZCA9IHRydWU7XHJcblx0XHR0aGlzLnRpdGxlSW5wdXQgPSB0cnVlO1xyXG5cdH1cclxuXHRlZGl0KCkge1xyXG5cdFx0dGhpcy50aXRsZSA9IHRoaXMuX2N1cnJlbnQuTmFtZTtcclxuXHRcdHRoaXMuaXNBZGQgPSBmYWxzZTtcclxuXHRcdHRoaXMudGl0bGVJbnB1dCA9IHRydWU7XHJcblx0fVxyXG5cdGNhbmNlbCgpIHtcclxuXHRcdHRoaXMudGl0bGVJbnB1dCA9IGZhbHNlO1xyXG5cdFx0aWYgKCF0aGlzLmN1cnJlbnQpIHtcclxuXHRcdFx0aWYgKHRoaXMuc3ZyLmRhdGEudmlld0xpc3QgJiYgdGhpcy5zdnIuZGF0YS52aWV3TGlzdC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50ID0gdGhpcy5zdnIuZGF0YS52aWV3TGlzdFswXTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnQgPSB0aGlzLnN2ci5kYXRhLmNvbnN0Vmlld0l0ZW1zWzBdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHNhdmUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zdnIuYmFja2ZhY2VcclxuXHRcdFx0LnVwZGF0ZVZpZXcoe1xyXG5cdFx0XHRcdE5hbWU6IHRoaXMuY3VycmVudC5OYW1lLFxyXG5cdFx0XHRcdE93bmVyQnk6IHRoaXMuY3VycmVudC5Pd25lckJ5LFxyXG5cdFx0XHRcdE93bmVyOiB0aGlzLmN1cnJlbnQuT3duZXIsXHJcblx0XHRcdFx0Q29sdW1uczogdGhpcy5TZWxlY3RlZENvbHVtbnNcclxuXHRcdFx0fSlcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKCgpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMubW9kaWZ5ID0gZmFsc2U7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVmcmVzaERhdGFDb25maWcge1xyXG5cdGtlZXBEaXZpZGU/OiBib29sZWFuO1xyXG5cdGtlZXBSb3dDb3VudD86IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHRwcml2YXRlIHN1YnNjcmliZTogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHRlbGVtZW50OiBFbGVtZW50O1xyXG5cdGVkaXRWaWV3ID0gbmV3IEVkaXRWaWV3KHRoaXMpO1xyXG5cdHBhcmFtc0NoYW5nZSA9IG5ldyBTdWJqZWN0KCk7IC8vIOWPguaVsOWPkeeUn+WPmOWMlu+8jOS4gOiIrOaYr+WIneWni+WMluaXtuS4gOasoe+8jOWIh+aNouWkhOeQhuWcsOS4gOasoVxyXG5cdC8vIOagh+etvuWumuS5ieeVjOmdoueahOaVsOaNrlxyXG5cdHJlZnJlc2hEYXRhRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlZnJlc2hEYXRhQ29uZmlnPigpO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIGRhdGE6IFNlcnZpY2VEYXRhLFxyXG5cdFx0cHJpdmF0ZSBwcmo6IFByb2plY3RTZXJ2aWNlLFxyXG5cdFx0cHVibGljIGJhY2tmYWNlOiBCYWNrRmFjZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHRhYnM6IFRhYnNTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbGVzOiBFbGVtZW50c1NlcnZpY2UsXHJcblx0XHRwdWJsaWMgY3VycmVudDogQ3VycmVudFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGVsZXZpZXc6IEVsZVZpZXdCYWNrRmFjZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuXHRcdHByaXZhdGUgY3VycjogQ3VycmVudFNlcnZpY2VcclxuXHQpIHt9XHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmliZS5mb3JFYWNoKHYgPT4gdi51bnN1YnNjcmliZSgpKTtcclxuXHR9XHJcblx0aW5pdEJ5Q29uZGl0aW9uKGVsZW1lbnQ6IEVsZW1lbnQsIHRpdGxlOiBzdHJpbmcsIGNvbmRpdGlvbjogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmJhY2tmYWNlLmVsZU5hbWUgPSBlbGVtZW50Lk5hbWU7XHJcblx0XHQvLyDlpoLmnpzmsqHmnInmnaHku7bvvIzliJnnm7TmjqXliJ3lp4vljJZcclxuXHRcdGlmICghdGl0bGUgJiYgIWNvbmRpdGlvbikge1xyXG5cdFx0XHR0aGlzLmluaXQoZWxlbWVudCwgdGhpcy5wcmouYXBpVVJMKGVsZW1lbnQuTmFtZSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5iYWNrZmFjZVxyXG5cdFx0XHRcdC5idWlsZFJlY29yZFZpZXdVUkwoe1xyXG5cdFx0XHRcdFx0VGl0bGU6IHRpdGxlLFxyXG5cdFx0XHRcdFx0Q29uZGl0aW9uOiBjb25kaXRpb25cclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoc3RyID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuaW5pdChlbGVtZW50LCBzdHIpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRpbml0KGVsZW1lbnQ6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG5cdFx0dGhpcy5iYWNrZmFjZS5lbGVOYW1lID0gZWxlbWVudC5OYW1lO1xyXG5cdFx0dGhpcy5iYWNrZmFjZS51cmwgPSB1cmw7XHJcblx0XHR0aGlzLnN1YnNjcmliZS5wdXNoKFxyXG5cdFx0XHR0aGlzLmN1cnIuY2hhbmdlJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuXHRcdFx0XHRmb3JrSm9pbihcclxuXHRcdFx0XHRcdHRoaXMuYmFja2ZhY2UuZmV0UGFyYW1DYWNoZSgpLFxyXG5cdFx0XHRcdFx0dGhpcy5lbGV2aWV3LmZldGNoRWxlbWVudEFsbENhdGVnb3JpZXMoZWxlbWVudC5OYW1lKSxcclxuXHRcdFx0XHRcdHRoaXMuYmFja2ZhY2UuZmV0Y2hFbGVtZW50Vmlld0xpc3QoKSxcclxuXHRcdFx0XHRcdHRoaXMuYmFja2ZhY2UuZmV0Y2hBbGxDb2x1bW5zKClcclxuXHRcdFx0XHQpLnN1YnNjcmliZShcclxuXHRcdFx0XHRcdChbcGFyYW0sIGNhdGVnb3JpZXMsIGNvbHVtbnNMaXN0LCBhbGxDb2x1bW5zXSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAocGFyYW0uUHJvY2Vzc2VzKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8g5rOo5YaM55u45YWz55qEZWxlbWVudCzlv4XpobvmmK/nrKzkuIDml7bpl7Tms6jlhozvvIzlkI7pnaLkvJrlvJXnlKjliLBcclxuXHRcdFx0XHRcdFx0XHRwYXJhbS5Qcm9jZXNzZXMuZm9yRWFjaCh2ID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZWxlcy5hZGRFbGVtZW50KHsgLi4udi5FbGVtZW50LCBOb3RNZW51OiB0cnVlIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS5yb3dQcm9jZXNzZXMgPSB0aGlzLndpdGhEZWZhdWx0SWNvblByb2Nlc3MoXHJcblx0XHRcdFx0XHRcdFx0XHRwYXJhbS5Qcm9jZXNzZXMuZmlsdGVyKG9uZSA9PiBvbmUuQmluZFJlY29yZClcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS50b29sYmFyUHJvY2Vzc2VzID0gdGhpcy53aXRoRGVmYXVsdEljb25Qcm9jZXNzKFxyXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW0uUHJvY2Vzc2VzLmZpbHRlcihvbmUgPT4gIW9uZS5CaW5kUmVjb3JkKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kYXRhLnJvd1Byb2Nlc3NlcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS50b29sYmFyUHJvY2Vzc2VzID0gW107XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGhpcy5kYXRhLnVuaXF1ZUZpZWxkcyA9IHBhcmFtLlVuaXF1ZUZpZWxkO1xyXG5cdFx0XHRcdFx0XHRpZiAocGFyYW0uQ29uZGl0aW9uYWxUZW1wbGF0