@ecip/system
Version:
323 lines • 37.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component } from '@angular/core';
import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
import { _HttpClient } from '@delon/theme';
import { FormBuilder, Validators } from '@angular/forms';
import { Observable } from 'rxjs';
import { UserService, AppsService, ResourceService } from "@ecip/service";
import { CacheService } from "@delon/cache";
export class SystemResourceEditComponent {
/**
* @param {?} modal
* @param {?} msgSrv
* @param {?} resourceService
* @param {?} userService
* @param {?} appsService
* @param {?} http
* @param {?} fb
* @param {?} cacheService
*/
constructor(modal, msgSrv, resourceService, userService, appsService, http, fb, cacheService) {
this.modal = modal;
this.msgSrv = msgSrv;
this.resourceService = resourceService;
this.userService = userService;
this.appsService = appsService;
this.http = http;
this.fb = fb;
this.cacheService = cacheService;
this.record = {};
this.isViewpermission = false;
this.defaultpermission = false;
this.loading = false;
this.stateList = this.cacheService.get(`api/dict/type/enableState`);
this.typeSrcList = this.cacheService.get(`api/dict/type/typeSrc`);
this.urlTargetList = this.cacheService.get(`api/dict/type/urlTarget`);
this.typeNodeList = this.cacheService.get(`api/dict/type/typeNode`);
this.codeAsyncValidator = (/**
* @param {?} control
* @return {?}
*/
(control) => Observable.create((/**
* @param {?} observer
* @return {?}
*/
(observer) => {
if (!control.value) {
observer.next(null);
observer.complete();
return;
}
this.resourceService.checkCode({ code: control.value, id: this.record.id }).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
if (res.valid === true) {
observer.next(null);
}
else {
observer.next({ error: true, duplicated: true });
}
observer.complete();
}));
})));
}
/**
* @return {?}
*/
ngOnInit() {
this.loading = true;
/*this.appsService.getList().subscribe(appList => {
this.optionList = appList;
});*/
this.typeSrcList.subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
if (res) {
this.typeSrc = res[0];
}
}));
this.urlTargetList.subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
if (res) {
this.urlTarget = res[0];
}
}));
this.typeNodeList.subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
if (res) {
this.typeNode = res[0];
}
}));
/** @type {?} */
let flagBreadcrumb;
/** @type {?} */
let flagMenuGroup;
/** @type {?} */
let nodeLevel;
/** @type {?} */
let pid = null;
/** @type {?} */
let path = '';
if (!this.record.id) {
if (this.isRoot) {
nodeLevel = 0;
flagBreadcrumb = false;
flagMenuGroup = true;
}
else {
this.isViewpermission = this.parent.typeNode !== 2;
flagBreadcrumb = true;
flagMenuGroup = false;
pid = this.parent.id;
/** @type {?} */
let parentPath = this.parent.path;
if (!parentPath) { //id逗号分隔,从下到上
path = `,${this.parent.id},`;
}
else {
path = `,${this.parent.id}${this.parent.path}`;
}
nodeLevel = this.parent.nodeLevel + 1;
}
}
else {
this.isViewpermission = this.record.typeNode !== 2;
}
this.form = this.fb.group({
appId: [this.appId, []],
code: [null, [Validators.required], [this.codeAsyncValidator]],
rsrcName: [null, [Validators.required]],
deptId: [null, []],
pid: [pid, []],
path: [path, []],
typeSrc: [this.typeSrc ? this.typeSrc.value : '', [Validators.required]],
typeNode: [this.typeNode ? this.typeNode.value : '', [Validators.required]],
url: [null, []],
urlTarget: [this.urlTarget ? this.urlTarget.value : '', []],
rsrcIcon: [null, []],
rsrcStatus: [1, [Validators.required]],
flagBreadcrumb: [flagBreadcrumb, [Validators.required]],
flagMenuGroup: [flagMenuGroup, [Validators.required]],
sortNm: [0, [Validators.required]],
permission: [null, []],
beginTime: [null, []],
endTime: [null, []],
nodeLevel: [nodeLevel, []],
defaultpermission: [false, [Validators.required]],
});
if (!this.record.id) {
return;
}
this.resourceService.getById(this.record.id).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.form.patchValue(res);
// this.form.patchValue({code: res.code});
this.i = res;
}));
}
/**
* @param {?} c1
* @param {?} c2
* @return {?}
*/
compareNumStr(c1, c2) {
return c1 == c2;
}
/**
* @return {?}
*/
submit() {
for (const i in this.form.controls) {
this.form.controls[i].markAsDirty();
this.form.controls[i].updateValueAndValidity();
}
if (this.form.invalid)
return;
if (!this.record.id) {
//新增
this.resourceService.post(this.form.value).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.msgSrv.success('保存成功');
if (this.form.value.defaultpermission) {
this.resourceService.addDefaultPermission(res).subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
res.children = [];
data.forEach((/**
* @param {?} it
* @return {?}
*/
it => {
res.children.push(it);
}));
}));
}
this.modal.close(res);
}));
return;
}
//修改
this.resourceService.put(this.record.id, this.form.value).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.msgSrv.success('保存成功');
// 是否新增默认权限
if (this.form.value.defaultpermission) {
// 新增默认权限
this.resourceService.addDefaultPermission(res).subscribe((/**
* @return {?}
*/
() => { }));
}
this.modal.close({ result: res, addFlag: this.form.value.defaultpermission });
}));
}
/**
* @return {?}
*/
close() {
this.modal.destroy();
}
}
SystemResourceEditComponent.decorators = [
{ type: Component, args: [{
selector: 'app-system-resource-edit',
template: "<div class=\"modal-header\">\r\n <div *ngIf=\"!record.id\" class=\"modal-title\">\u65B0\u589E\u4FE1\u606F</div>\r\n <div *ngIf=\"record.id\" class=\"modal-title\">\u7F16\u8F91 {{ record.account }} \u4FE1\u606F</div>\r\n</div>\r\n<nz-spin *ngIf=\"!i && !record.id\" class=\"modal-spin\"></nz-spin>\r\n<form *ngIf=\"!record.id || record.id && i\" nz-form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"code\">\u7F16\u7801</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"code\">\r\n <nz-form-explain *ngIf=\"form.get('code').dirty && form.get('code').errors || form.get('code').pending \">\r\n <ng-container *ngIf=\"form.get('code').hasError('required')\">\r\n \u8BF7\u8F93\u5165\u7F16\u7801\r\n </ng-container>\r\n <ng-container *ngIf=\"form.get('code').hasError('duplicated')\">\r\n \u7F16\u7801\u5DF2\u5B58\u5728\r\n </ng-container>\r\n <ng-container *ngIf=\"form.get('code').pending\">\r\n \u6821\u9A8C\u4E2D...\r\n </ng-container>\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"urlTarget\">url\u7C7B\u578B</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <nz-select [compareWith]=\"compareNumStr\" nzAllowClear formControlName=\"urlTarget\">\r\n <nz-option *ngFor=\"let urlTarget of urlTargetList | async\" [nzValue]=\"urlTarget.value\" [nzLabel]=\"urlTarget.label\"></nz-option>\r\n </nz-select>\r\n <nz-form-explain *ngIf=\"form.get('urlTarget').dirty && form.get('urlTarget').errors\">\r\n \u8BF7\u9009\u62E9url\u7C7B\u578B\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"rsrcName\">\u8D44\u6E90\u540D\u79F0</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"rsrcName\">\r\n <nz-form-explain *ngIf=\"form.get('rsrcName').dirty && form.get('rsrcName').errors\">\r\n \u8BF7\u8F93\u5165\u8D44\u6E90\u540D\u79F0\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"typeSrc\">\u8D44\u6E90\u5206\u7C7B</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <nz-select [compareWith]=\"compareNumStr\" nzAllowClear formControlName=\"typeSrc\">\r\n <nz-option *ngFor=\"let typeSrc of typeSrcList | async\" [nzValue]=\"typeSrc.value\" [nzLabel]=\"typeSrc.label\"></nz-option>\r\n </nz-select>\r\n <nz-form-explain *ngIf=\"form.get('typeSrc').dirty && form.get('typeSrc').errors\">\r\n \u8BF7\u9009\u62E9\u8D44\u6E90\u5206\u7C7B\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"typeNode\">\u8D44\u6E90\u7C7B\u578B</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <nz-select [compareWith]=\"compareNumStr\" nzAllowClear formControlName=\"typeNode\">\r\n <nz-option *ngFor=\"let typeNode of typeNodeList | async\" [nzValue]=\"typeNode.value\" [nzLabel]=\"typeNode.label\"></nz-option>\r\n </nz-select>\r\n <nz-form-explain *ngIf=\"form.get('typeNode').dirty && form.get('typeNode').errors\">\r\n \u8BF7\u9009\u62E9\u8D44\u6E90\u7C7B\u578B\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"url\">URL</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"url\">\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"rsrcIcon\">\u8D44\u6E90\u6837\u5F0F</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"rsrcIcon\">\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"permission\">\u6743\u9650\u6807\u5FD7</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"permission\">\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"flagBreadcrumb\">\u663E\u793A\u5728\u9762\u5305\u5C51</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"flagBreadcrumb\">\r\n <label nz-radio [nzValue]=\"true\">\u663E\u793A</label>\r\n <label nz-radio [nzValue]=\"false\">\u4E0D\u663E\u793A</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('flagBreadcrumb').dirty && form.get('flagBreadcrumb').errors\">\r\n \u8BF7\u9009\u62E9\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"flagMenuGroup\">\u662F\u5426\u83DC\u5355\u7EC4</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"flagMenuGroup\">\r\n <label nz-radio [nzValue]=\"true\">\u662F</label>\r\n <label nz-radio [nzValue]=\"false\">\u5426</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('flagMenuGroup').dirty && form.get('flagMenuGroup').errors\">\r\n \u8BF7\u9009\u62E9\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"sortNm\">\u6392\u5E8F</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"sortNm\">\r\n <nz-form-explain *ngIf=\"form.get('sortNm').dirty && form.get('sortNm').errors\">\r\n \u8BF7\u8F93\u5165\u6392\u5E8F\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"rsrcStatus\">\u542F\u7528\u72B6\u6001</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"rsrcStatus\">\r\n <label nz-radio *ngFor=\"let state of stateList | async\" [nzValue]=\"state.value\">{{state.label}}</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('rsrcStatus').dirty && form.get('rsrcStatus').errors\">\r\n \u8BF7\u9009\u62E9\u542F\u7528\u72B6\u6001\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div nz-row *ngIf=\"this.isViewpermission\">\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"defaultpermission\">\u65B0\u589E\u9ED8\u8BA4\u6743\u9650</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"defaultpermission\">\r\n <label nz-radio [nzValue]=\"true\">\u662F</label>\r\n <label nz-radio [nzValue]=\"false\">\u5426</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('defaultpermission').dirty && form.get('defaultpermission').errors\">\r\n \u8BF7\u9009\u62E9\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button nz-button type=\"button\" (click)=\"close()\">\u5173\u95ED</button>\r\n <button nz-button type=\"submit\" [disabled]=\"!form.valid\" nzType=\"primary\" [nzLoading]=\"http.loading\">\u4FDD\u5B58</button>\r\n </div>\r\n</form>\r\n"
}] }
];
/** @nocollapse */
SystemResourceEditComponent.ctorParameters = () => [
{ type: NzModalRef },
{ type: NzMessageService },
{ type: ResourceService },
{ type: UserService },
{ type: AppsService },
{ type: _HttpClient },
{ type: FormBuilder },
{ type: CacheService }
];
if (false) {
/** @type {?} */
SystemResourceEditComponent.prototype.record;
/** @type {?} */
SystemResourceEditComponent.prototype.i;
/** @type {?} */
SystemResourceEditComponent.prototype.appId;
/** @type {?} */
SystemResourceEditComponent.prototype.isRoot;
/** @type {?} */
SystemResourceEditComponent.prototype.isViewpermission;
/** @type {?} */
SystemResourceEditComponent.prototype.form;
/** @type {?} */
SystemResourceEditComponent.prototype.defaultpermission;
/** @type {?} */
SystemResourceEditComponent.prototype.parent;
/** @type {?} */
SystemResourceEditComponent.prototype.loading;
/** @type {?} */
SystemResourceEditComponent.prototype.stateList;
/** @type {?} */
SystemResourceEditComponent.prototype.typeSrcList;
/** @type {?} */
SystemResourceEditComponent.prototype.urlTargetList;
/** @type {?} */
SystemResourceEditComponent.prototype.typeNodeList;
/** @type {?} */
SystemResourceEditComponent.prototype.typeSrc;
/** @type {?} */
SystemResourceEditComponent.prototype.urlTarget;
/** @type {?} */
SystemResourceEditComponent.prototype.typeNode;
/** @type {?} */
SystemResourceEditComponent.prototype.codeAsyncValidator;
/**
* @type {?}
* @private
*/
SystemResourceEditComponent.prototype.modal;
/** @type {?} */
SystemResourceEditComponent.prototype.msgSrv;
/** @type {?} */
SystemResourceEditComponent.prototype.resourceService;
/** @type {?} */
SystemResourceEditComponent.prototype.userService;
/** @type {?} */
SystemResourceEditComponent.prototype.appsService;
/** @type {?} */
SystemResourceEditComponent.prototype.http;
/**
* @type {?}
* @private
*/
SystemResourceEditComponent.prototype.fb;
/**
* @type {?}
* @private
*/
SystemResourceEditComponent.prototype.cacheService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZWNpcC9zeXN0ZW0vIiwic291cmNlcyI6WyJzcmMvcmVzb3VyY2UvZWRpdC9lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUE4QixXQUFXLEVBQUUsVUFBVSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDakcsT0FBTyxFQUE0QixVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFM0QsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFNMUMsTUFBTSxPQUFPLDJCQUEyQjs7Ozs7Ozs7Ozs7SUFvQnRDLFlBQ1UsS0FBaUIsRUFDbEIsTUFBd0IsRUFDeEIsZUFBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsV0FBd0IsRUFDeEIsSUFBaUIsRUFDaEIsRUFBZSxFQUNmLFlBQTBCO1FBUDFCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFDeEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDaEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBM0JwQyxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBSWpCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVsQyxzQkFBaUIsR0FB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QixDQUFDOzs7WUFoTEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLHlyU0FBb0M7YUFDckM7Ozs7WUFYUSxVQUFVO1lBQUUsZ0JBQWdCO1lBS0gsZUFBZTtZQUF6QyxXQUFXO1lBQUUsV0FBVztZQUp2QixXQUFXO1lBQ2lCLFdBQVc7WUFJeEMsWUFBWTs7OztJQU9sQiw2Q0FBaUI7O0lBQ2pCLHdDQUFPOztJQUNQLDRDQUFXOztJQUNYLDZDQUFnQjs7SUFDaEIsdURBQWtDOztJQUNsQywyQ0FBZ0I7O0lBQ2hCLHdEQUFtQzs7SUFDbkMsNkNBQU87O0lBRVAsOENBQXlCOztJQUN6QixnREFBK0Q7O0lBQy9ELGtEQUE2RDs7SUFDN0Qsb0RBQWlFOztJQUNqRSxtREFBK0Q7O0lBRS9ELDhDQUFhOztJQUNiLGdEQUFlOztJQUNmLCtDQUFjOztJQXFHZCx5REFlSzs7Ozs7SUFqSEgsNENBQXlCOztJQUN6Qiw2Q0FBK0I7O0lBQy9CLHNEQUF1Qzs7SUFDdkMsa0RBQStCOztJQUMvQixrREFBK0I7O0lBQy9CLDJDQUF3Qjs7Ozs7SUFDeEIseUNBQXVCOzs7OztJQUN2QixtREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOek1vZGFsUmVmLCBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XHJcbmltcG9ydCB7IF9IdHRwQ2xpZW50IH0gZnJvbSAnQGRlbG9uL3RoZW1lJztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JzLCBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBGb3JtQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2ZXIsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1VzZXJTZXJ2aWNlLCBBcHBzU2VydmljZSwgUmVzb3VyY2VTZXJ2aWNlfSBmcm9tIFwiQGVjaXAvc2VydmljZVwiO1xyXG5pbXBvcnQge0NhY2hlU2VydmljZX0gZnJvbSBcIkBkZWxvbi9jYWNoZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc3lzdGVtLXJlc291cmNlLWVkaXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0LmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN5c3RlbVJlc291cmNlRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcmVjb3JkOiBhbnkgPSB7fTtcclxuICBpOiBhbnk7XHJcbiAgYXBwSWQ6IGFueTtcclxuICBpc1Jvb3Q6IGJvb2xlYW47XHJcbiAgaXNWaWV3cGVybWlzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBkZWZhdWx0cGVybWlzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBhcmVudDtcclxuXHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXRlTGlzdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldChgYXBpL2RpY3QvdHlwZS9lbmFibGVTdGF0ZWApO1xyXG4gIHR5cGVTcmNMaXN0ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KGBhcGkvZGljdC90eXBlL3R5cGVTcmNgKTtcclxuICB1cmxUYXJnZXRMaXN0ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KGBhcGkvZGljdC90eXBlL3VybFRhcmdldGApO1xyXG4gIHR5cGVOb2RlTGlzdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldChgYXBpL2RpY3QvdHlwZS90eXBlTm9kZWApO1xyXG5cclxuICB0eXBlU3JjOiBhbnk7XHJcbiAgdXJsVGFyZ2V0OiBhbnk7XHJcbiAgdHlwZU5vZGU6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1vZGFsOiBOek1vZGFsUmVmLFxyXG4gICAgcHVibGljIG1zZ1NydjogTnpNZXNzYWdlU2VydmljZSxcclxuICAgIHB1YmxpYyByZXNvdXJjZVNlcnZpY2U6IFJlc291cmNlU2VydmljZSxcclxuICAgIHB1YmxpYyB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgYXBwc1NlcnZpY2U6IEFwcHNTZXJ2aWNlLFxyXG4gICAgcHVibGljIGh0dHA6IF9IdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAvKnRoaXMuYXBwc1NlcnZpY2UuZ2V0TGlzdCgpLnN1YnNjcmliZShhcHBMaXN0ID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25MaXN0ID0gYXBwTGlzdDtcclxuICAgIH0pOyovXHJcbiAgICB0aGlzLnR5cGVTcmNMaXN0LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy50eXBlU3JjID0gcmVzWzBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXJsVGFyZ2V0TGlzdC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMudXJsVGFyZ2V0ID0gcmVzWzBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudHlwZU5vZGVMaXN0LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy50eXBlTm9kZSA9IHJlc1swXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBsZXQgZmxhZ0JyZWFkY3J1bWIgO1xyXG4gICAgbGV0IGZsYWdNZW51R3JvdXA7XHJcbiAgICBsZXQgbm9kZUxldmVsO1xyXG4gICAgbGV0IHBpZCA9IG51bGw7XHJcbiAgICBsZXQgcGF0aCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLnJlY29yZC5pZCkge1xyXG4gICAgICBpZiAodGhpcy5pc1Jvb3QpIHtcclxuICAgICAgICBub2RlTGV2ZWwgPSAwO1xyXG4gICAgICAgIGZsYWdCcmVhZGNydW1iID0gZmFsc2U7XHJcbiAgICAgICAgZmxhZ01lbnVHcm91cCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdwZXJtaXNzaW9uID0gdGhpcy5wYXJlbnQudHlwZU5vZGUgIT09IDI7XHJcbiAgICAgICAgZmxhZ0JyZWFkY3J1bWIgPSB0cnVlO1xyXG4gICAgICAgIGZsYWdNZW51R3JvdXAgPSBmYWxzZTtcclxuICAgICAgICBwaWQgPSB0aGlzLnBhcmVudC5pZDtcclxuICAgICAgICBsZXQgcGFyZW50UGF0aCA9IHRoaXMucGFyZW50LnBhdGg7XHJcbiAgICAgICAgaWYgKCFwYXJlbnRQYXRoKSB7IC8vaWTpgJflj7fliIbpmpTvvIzku47kuIvliLDkuIpcclxuICAgICAgICAgIHBhdGggPSBgLCR7dGhpcy5wYXJlbnQuaWR9LGA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBhdGggPSBgLCR7dGhpcy5wYXJlbnQuaWR9JHt0aGlzLnBhcmVudC5wYXRofWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlTGV2ZWwgPSB0aGlzLnBhcmVudC5ub2RlTGV2ZWwgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuaXNWaWV3cGVybWlzc2lvbiA9IHRoaXMucmVjb3JkLnR5cGVOb2RlICE9PSAyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYXBwSWQ6IFt0aGlzLmFwcElkLCBbXV0sXHJcbiAgICAgIGNvZGU6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLmNvZGVBc3luY1ZhbGlkYXRvcl1dLFxyXG4gICAgICByc3JjTmFtZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGRlcHRJZDogW251bGwsIFtdXSxcclxuICAgICAgcGlkOiBbcGlkLCBbXV0sXHJcbiAgICAgIHBhdGg6IFtwYXRoLCBbXV0sXHJcbiAgICAgIHR5cGVTcmM6IFt0aGlzLnR5cGVTcmMgPyB0aGlzLnR5cGVTcmMudmFsdWUgOiAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgdHlwZU5vZGU6IFt0aGlzLnR5cGVOb2RlID8gdGhpcy50eXBlTm9kZS52YWx1ZSA6ICcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICB1cmw6IFtudWxsLCBbXV0sXHJcbiAgICAgIHVybFRhcmdldDogW3RoaXMudXJsVGFyZ2V0ID8gdGhpcy51cmxUYXJnZXQudmFsdWUgOiAnJywgW11dLFxyXG4gICAgICByc3JjSWNvbjogW251bGwsIFtdXSxcclxuICAgICAgcnNyY1N0YXR1czogWzEsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGZsYWdCcmVhZGNydW1iOiBbZmxhZ0JyZWFkY3J1bWIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGZsYWdNZW51R3JvdXA6IFtmbGFnTWVudUdyb3VwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBzb3J0Tm06IFswLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBwZXJtaXNzaW9uOiBbbnVsbCwgW11dLFxyXG4gICAgICBiZWdpblRpbWU6IFtudWxsLCBbXV0sXHJcbiAgICAgIGVuZFRpbWU6IFtudWxsLCBbXV0sXHJcbiAgICAgIG5vZGVMZXZlbDogW25vZGVMZXZlbCwgW11dLFxyXG4gICAgICBkZWZhdWx0cGVybWlzc2lvbjogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlY29yZC5pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc291cmNlU2VydmljZS5nZXRCeUlkKHRoaXMucmVjb3JkLmlkKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcclxuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUocmVzKTtcclxuICAgICAgLy8gdGhpcy5mb3JtLnBhdGNoVmFsdWUoe2NvZGU6IHJlcy5jb2RlfSk7XHJcbiAgICAgIHRoaXMuaSA9IHJlcztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29tcGFyZU51bVN0cihjMTogYW55LCBjMjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYzEgPT0gYzI7XHJcbiAgfVxyXG5cclxuICBjb2RlQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnM+KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuY2hlY2tDb2RlKHtjb2RlOiBjb250cm9sLnZhbHVlLCBpZDogdGhpcy5yZWNvcmQuaWR9KS5zdWJzY3JpYmUoKHJlczphbnkpPT4ge1xyXG4gICAgICAgIGlmIChyZXMudmFsaWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgZm9yIChjb25zdCBpIGluIHRoaXMuZm9ybS5jb250cm9scykge1xyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbaV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2ldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkgcmV0dXJuO1xyXG4gICAgaWYgKCF0aGlzLnJlY29yZC5pZCkge1xyXG4gICAgICAvL+aWsOWinlxyXG4gICAgICB0aGlzLnJlc291cmNlU2VydmljZS5wb3N0KHRoaXMuZm9ybS52YWx1ZSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMubXNnU3J2LnN1Y2Nlc3MoJ+S/neWtmOaIkOWKnycpO1xyXG4gICAgICAgIGlmKHRoaXMuZm9ybS52YWx1ZS5kZWZhdWx0cGVybWlzc2lvbil7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlU2VydmljZS5hZGREZWZhdWx0UGVybWlzc2lvbihyZXMpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJlcy5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgICAgICBkYXRhLmZvckVhY2goaXQgPT4ge1xyXG4gICAgICAgICAgICAgIHJlcy5jaGlsZHJlbi5wdXNoKGl0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tb2RhbC5jbG9zZShyZXMpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy/kv67mlLlcclxuICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLnB1dCh0aGlzLnJlY29yZC5pZCwgdGhpcy5mb3JtLnZhbHVlICkuc3Vic2NyaWJlKCAocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tc2dTcnYuc3VjY2Vzcygn5L+d5a2Y5oiQ5YqfJyk7XHJcbiAgICAgIC8vIOaYr+WQpuaWsOWinum7mOiupOadg+mZkFxyXG4gICAgICBpZih0aGlzLmZvcm0udmFsdWUuZGVmYXVsdHBlcm1pc3Npb24pe1xyXG4gICAgICAgIC8vIOaWsOWinum7mOiupOadg+mZkFxyXG4gICAgICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLmFkZERlZmF1bHRQZXJtaXNzaW9uKHJlcykuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1vZGFsLmNsb3NlKHtyZXN1bHQ6IHJlcywgYWRkRmxhZzogdGhpcy5mb3JtLnZhbHVlLmRlZmF1bHRwZXJtaXNzaW9ufSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5tb2RhbC5kZXN0cm95KCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==