@tetacom/ng-components 1.1.18 → 1.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/assets/icons.svg +726 -950
  2. package/component/property-grid/property-grid/property-grid-group/property-grid-group.component.d.ts +10 -7
  3. package/component/property-grid/property-grid/property-grid-item/property-grid-item.component.d.ts +8 -8
  4. package/component/property-grid/property-grid/property-grid.component.d.ts +3 -4
  5. package/component/table/contract/i-cell-instance.d.ts +4 -0
  6. package/component/table/contract/table-column.d.ts +3 -9
  7. package/component/table/service/table.service.d.ts +0 -2
  8. package/component/table/table-head/visibility-dropdown-tab/visibility-dropdown-tab.component.d.ts +6 -7
  9. package/esm2022/component/property-grid/property-grid/property-grid-group/property-grid-group.component.mjs +32 -11
  10. package/esm2022/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +15 -10
  11. package/esm2022/component/property-grid/property-grid/property-grid.component.mjs +10 -5
  12. package/esm2022/component/table/base/cell-component-base.mjs +4 -3
  13. package/esm2022/component/table/contract/i-cell-instance.mjs +1 -1
  14. package/esm2022/component/table/contract/table-column.mjs +1 -7
  15. package/esm2022/component/table/service/table.service.mjs +6 -19
  16. package/esm2022/component/table/table-head/visibility-dropdown-tab/visibility-dropdown-tab.component.mjs +10 -12
  17. package/esm2022/util/bool-or-func.mjs +13 -0
  18. package/esm2022/util/is-function.mjs +4 -0
  19. package/esm2022/util/public-api.mjs +4 -2
  20. package/fesm2022/tetacom-ng-components.mjs +72 -53
  21. package/fesm2022/tetacom-ng-components.mjs.map +1 -1
  22. package/package.json +1 -1
  23. package/util/bool-or-func.d.ts +1 -0
  24. package/util/is-function.d.ts +1 -0
  25. package/util/public-api.d.ts +3 -1
@@ -1,10 +1,12 @@
1
- import { EventEmitter, OnInit, QueryList } from '@angular/core';
2
- import { TableColumn } from '../../../table/contract/table-column';
1
+ import { EventEmitter, QueryList } from '@angular/core';
2
+ import { ControlContainer, FormGroup } from '@angular/forms';
3
3
  import { IDictionary } from '../../../../common/contract/i-dictionary';
4
4
  import { IIdName } from '../../../../common/contract/i-id-name';
5
- import { PropertyGridItemDescriptionDirective } from "../property-grid-item-description.directive";
5
+ import { TableColumn } from '../../../table/contract/table-column';
6
+ import { PropertyGridItemDescriptionDirective } from '../property-grid-item-description.directive';
6
7
  import * as i0 from "@angular/core";
7
- export declare class PropertyGridGroupComponent<T> implements OnInit {
8
+ export declare class PropertyGridGroupComponent<T> {
9
+ private _formGroup;
8
10
  column: TableColumn;
9
11
  hideNonEditable: boolean;
10
12
  dict: IDictionary<IIdName<any>[]>;
@@ -13,9 +15,10 @@ export declare class PropertyGridGroupComponent<T> implements OnInit {
13
15
  controlValueChange: EventEmitter<IIdName<any>>;
14
16
  decimalPart: number;
15
17
  itemTemplates: QueryList<PropertyGridItemDescriptionDirective>;
16
- constructor();
17
- ngOnInit(): void;
18
+ get formGroup(): FormGroup;
19
+ get editable(): boolean;
20
+ constructor(_formGroup: ControlContainer);
18
21
  trackColumns(index: number, column: TableColumn): any;
19
- static ɵfac: i0.ɵɵFactoryDeclaration<PropertyGridGroupComponent<any>, never>;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<PropertyGridGroupComponent<any>, [{ optional: true; }]>;
20
23
  static ɵcmp: i0.ɵɵComponentDeclaration<PropertyGridGroupComponent<any>, "teta-property-grid-group", never, { "column": { "alias": "column"; "required": false; }; "hideNonEditable": { "alias": "hideNonEditable"; "required": false; }; "dict": { "alias": "dict"; "required": false; }; "item": { "alias": "item"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; "decimalPart": { "alias": "decimalPart"; "required": false; }; "itemTemplates": { "alias": "itemTemplates"; "required": false; }; }, { "controlValueChange": "controlValueChange"; }, never, never, false, never>;
21
24
  }
@@ -1,14 +1,14 @@
1
- import { EventEmitter, OnChanges, OnDestroy, OnInit, QueryList, SimpleChanges } from '@angular/core';
2
- import { TableColumn } from '../../../table/contract/table-column';
3
- import { IDictionary } from '../../../../common/contract/i-dictionary';
4
- import { IIdName } from '../../../../common/contract/i-id-name';
5
- import { FilterType } from '../../../filter/enum/filter-type.enum';
1
+ import { EventEmitter, OnChanges, OnDestroy, QueryList, SimpleChanges } from '@angular/core';
6
2
  import { ControlContainer, FormGroup } from '@angular/forms';
7
3
  import { TranslocoService } from '@ngneat/transloco';
4
+ import { IDictionary } from '../../../../common/contract/i-dictionary';
5
+ import { IIdName } from '../../../../common/contract/i-id-name';
8
6
  import { Align } from '../../../../common/enum/align.enum';
9
- import { PropertyGridItemDescriptionDirective } from "../property-grid-item-description.directive";
7
+ import { FilterType } from '../../../filter/enum/filter-type.enum';
8
+ import { TableColumn } from '../../../table/contract/table-column';
9
+ import { PropertyGridItemDescriptionDirective } from '../property-grid-item-description.directive';
10
10
  import * as i0 from "@angular/core";
11
- export declare class PropertyGridItemComponent<T> implements OnInit, OnDestroy, OnChanges {
11
+ export declare class PropertyGridItemComponent<T> implements OnDestroy, OnChanges {
12
12
  private _transloco;
13
13
  private _formGroup;
14
14
  column: TableColumn;
@@ -19,6 +19,7 @@ export declare class PropertyGridItemComponent<T> implements OnInit, OnDestroy,
19
19
  itemTemplates: QueryList<PropertyGridItemDescriptionDirective>;
20
20
  get template(): PropertyGridItemDescriptionDirective;
21
21
  get formGroup(): FormGroup;
22
+ get editable(): boolean;
22
23
  horizontal: boolean;
23
24
  controlValueChange: EventEmitter<IIdName<any>>;
24
25
  align: typeof Align;
@@ -30,7 +31,6 @@ export declare class PropertyGridItemComponent<T> implements OnInit, OnDestroy,
30
31
  getDict(): IIdName<any>[];
31
32
  controlIsInvalid(controlName: string): boolean;
32
33
  getError(column: TableColumn): string;
33
- ngOnInit(): void;
34
34
  ngOnDestroy(): void;
35
35
  ngOnChanges(changes: SimpleChanges): void;
36
36
  static ɵfac: i0.ɵɵFactoryDeclaration<PropertyGridItemComponent<any>, [null, { optional: true; }]>;
@@ -1,11 +1,11 @@
1
- import { AfterViewInit, EventEmitter, OnDestroy, OnInit, QueryList } from '@angular/core';
1
+ import { EventEmitter, OnDestroy, QueryList } from '@angular/core';
2
2
  import { ControlContainer, FormGroup } from '@angular/forms';
3
3
  import { IDictionary } from '../../../common/contract/i-dictionary';
4
4
  import { IIdName } from '../../../common/contract/i-id-name';
5
5
  import { TableColumn } from '../../table/contract/table-column';
6
6
  import { PropertyGridItemDescriptionDirective } from './property-grid-item-description.directive';
7
7
  import * as i0 from "@angular/core";
8
- export declare class PropertyGridComponent<T> implements OnInit, OnDestroy, AfterViewInit {
8
+ export declare class PropertyGridComponent<T> implements OnDestroy {
9
9
  private _formGroup;
10
10
  formClass: boolean;
11
11
  itemTemplates: QueryList<PropertyGridItemDescriptionDirective>;
@@ -21,12 +21,11 @@ export declare class PropertyGridComponent<T> implements OnInit, OnDestroy, Afte
21
21
  private _item;
22
22
  get formGroup(): FormGroup;
23
23
  constructor(_formGroup: ControlContainer);
24
+ getEditable(column: TableColumn): boolean;
24
25
  onControlValueChange(event: IIdName<any>): void;
25
- ngOnInit(): void;
26
26
  ngOnDestroy(): void;
27
27
  trackColumns(index: number, column: TableColumn): any;
28
28
  private getDictValue;
29
- ngAfterViewInit(): void;
30
29
  static ɵfac: i0.ɵɵFactoryDeclaration<PropertyGridComponent<any>, [{ optional: true; }]>;
31
30
  static ɵcmp: i0.ɵɵComponentDeclaration<PropertyGridComponent<any>, "teta-property-grid", never, { "hideNonEditable": { "alias": "hideNonEditable"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "dict": { "alias": "dict"; "required": false; }; "item": { "alias": "item"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; }; "decimalPart": { "alias": "decimalPart"; "required": false; }; }, { "controlValueChange": "controlValueChange"; }, ["itemTemplates"], never, false, never>;
32
31
  }
@@ -1,5 +1,9 @@
1
1
  import { TableColumn } from './table-column';
2
2
  import { TableRow } from './table-row';
3
+ export interface IColumnRow<T> {
4
+ row?: T;
5
+ column: TableColumn;
6
+ }
3
7
  export interface ICellInstance<T> {
4
8
  row?: TableRow<T>;
5
9
  column: TableColumn;
@@ -7,7 +7,7 @@ import { StringFilterType } from '../../filter/enum/string-filter-type.enum';
7
7
  import { CellComponentBase } from '../base/cell-component-base';
8
8
  import { AggregationType } from '../enum/aggregation-type.enum';
9
9
  import { HeadDropdownTabConfig } from './head-dropdown-tab';
10
- import { ICellInstance } from './i-cell-instance';
10
+ import { IColumnRow } from './i-cell-instance';
11
11
  export interface ITableColumnOptions extends IFilterItemOptions {
12
12
  width?: number;
13
13
  flex?: number;
@@ -31,7 +31,7 @@ export interface ITableColumnOptions extends IFilterItemOptions {
31
31
  headCellClass?: string[];
32
32
  cellClass?: string[];
33
33
  data?: any;
34
- editable?: boolean | ((coordinates: ICellInstance<any>) => boolean);
34
+ editable?: boolean | ((coordinates: IColumnRow<any>) => boolean);
35
35
  objectType?: boolean;
36
36
  cellComponent?: Type<CellComponentBase<any>>;
37
37
  headCellComponent?: any;
@@ -58,16 +58,10 @@ export declare class TableColumn extends FilterItem {
58
58
  * Стобец закреплен
59
59
  */
60
60
  locked: boolean;
61
- /**
62
- * Название столбца в строке результатов
63
- */
64
61
  /**
65
62
  * Название столбца родителя
66
63
  */
67
64
  parentName: string;
68
- /**
69
- * Название столбца для заголовка таблицы
70
- */
71
65
  /**
72
66
  * Единицы измерения
73
67
  */
@@ -89,7 +83,7 @@ export declare class TableColumn extends FilterItem {
89
83
  /**
90
84
  * Колонка доступна для редактирования
91
85
  */
92
- editable: boolean | ((coordinates: ICellInstance<any>) => boolean);
86
+ editable: boolean | ((coordinates: IColumnRow<any>) => boolean);
93
87
  /**
94
88
  * Компонент для рендера ячейки
95
89
  */
@@ -127,14 +127,12 @@ export declare class TableService<T> {
127
127
  };
128
128
  getColumnByName(columnName: string): any;
129
129
  scrollToIndex(index: number): void;
130
- boolOrFuncCallback<M>(variable: boolean | ((row: M | undefined) => boolean)): (args: M) => boolean;
131
130
  getVisibleColumns(): any[];
132
131
  getCellInstance(coords: ICellCoordinates): ICellInstance<T> | null;
133
132
  private getFlatColumns;
134
133
  private findParent;
135
134
  private findParentColumn;
136
135
  getTableElement(element: HTMLElement): Element;
137
- private isFunction;
138
136
  private setColumnAutoWidth;
139
137
  private clearValue;
140
138
  static ɵfac: i0.ɵɵFactoryDeclaration<TableService<any>, never>;
@@ -1,13 +1,13 @@
1
- import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit } from '@angular/core';
2
- import { TableColumn } from '../../contract/table-column';
3
- import { FilterState } from '../../../filter/contarct/filter-state';
1
+ import { ChangeDetectorRef, ElementRef, OnDestroy } from '@angular/core';
4
2
  import { Observable } from 'rxjs';
3
+ import { ITreeData } from '../../../../common/contract/i-tree-data';
4
+ import { TetaConfigService } from '../../../../locale/teta-config.service';
5
5
  import { TetaLocalisation } from '../../../../locale/teta-localisation';
6
+ import { FilterState } from '../../../filter/contarct/filter-state';
7
+ import { TableColumn } from '../../contract/table-column';
6
8
  import { TableService } from '../../service/table.service';
7
- import { TetaConfigService } from '../../../../locale/teta-config.service';
8
- import { ITreeData } from '../../../../common/contract/i-tree-data';
9
9
  import * as i0 from "@angular/core";
10
- export declare class VisibilityDropdownTabComponent<T> implements OnInit, OnDestroy {
10
+ export declare class VisibilityDropdownTabComponent<T> implements OnDestroy {
11
11
  private _svc;
12
12
  private _config;
13
13
  private _elementRef;
@@ -38,7 +38,6 @@ export declare class VisibilityDropdownTabComponent<T> implements OnInit, OnDest
38
38
  hideColumn(column: TableColumn, hiddenColumns: string[]): void;
39
39
  showColumn(column: TableColumn, hiddenColumns: string[]): void;
40
40
  private findParentColumn;
41
- ngOnInit(): void;
42
41
  ngOnDestroy(): void;
43
42
  static ɵfac: i0.ɵɵFactoryDeclaration<VisibilityDropdownTabComponent<any>, never>;
44
43
  static ɵcmp: i0.ɵɵComponentDeclaration<VisibilityDropdownTabComponent<any>, "teta-visibility-dropdown-tab", never, { "columns": { "alias": "columns"; "required": false; }; "column": { "alias": "column"; "required": false; }; "state": { "alias": "state"; "required": false; }; "data": { "alias": "data"; "required": false; }; "close": { "alias": "close"; "required": false; }; }, {}, never, never, false, never>;
@@ -1,9 +1,14 @@
1
- import { Component, EventEmitter, Input, Output, } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Optional, Output, } from '@angular/core';
2
+ import { FormGroup, NgForm } from '@angular/forms';
3
+ import { boolOrFuncCallback } from '../../../../util/bool-or-func';
4
+ import { FormsUtil } from '../../../../util/forms-util';
2
5
  import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "../../../expand-card/expand-item/expand-item.component";
5
- import * as i3 from "../property-grid-item/property-grid-item.component";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "../../../expand-card/expand-item/expand-item.component";
9
+ import * as i4 from "../property-grid-item/property-grid-item.component";
6
10
  export class PropertyGridGroupComponent {
11
+ _formGroup;
7
12
  column;
8
13
  hideNonEditable;
9
14
  dict;
@@ -12,20 +17,36 @@ export class PropertyGridGroupComponent {
12
17
  controlValueChange = new EventEmitter();
13
18
  decimalPart;
14
19
  itemTemplates;
15
- constructor() {
20
+ get formGroup() {
21
+ if (this._formGroup instanceof FormGroup) {
22
+ return this._formGroup;
23
+ }
24
+ if (this._formGroup instanceof NgForm) {
25
+ return this._formGroup.form;
26
+ }
27
+ return null;
16
28
  }
17
- ngOnInit() {
29
+ get editable() {
30
+ return boolOrFuncCallback(this.column.editable)({
31
+ column: this.column,
32
+ row: this.formGroup?.getRawValue(),
33
+ });
34
+ }
35
+ constructor(_formGroup) {
36
+ this._formGroup = _formGroup;
18
37
  }
19
38
  trackColumns(index, column) {
20
39
  return column.name;
21
40
  }
22
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: PropertyGridGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: PropertyGridGroupComponent, selector: "teta-property-grid-group", inputs: { column: "column", hideNonEditable: "hideNonEditable", dict: "dict", item: "item", horizontal: "horizontal", decimalPart: "decimalPart", itemTemplates: "itemTemplates" }, outputs: { controlValueChange: "controlValueChange" }, ngImport: i0, template: "<teta-expand-item>\n <span ngProjectAs='head'>\n {{column.caption}}\n </span>\n <div class=\"form-container\">\n <ng-container *ngFor=\"let col of column.columns; trackBy: trackColumns\">\n <ng-container *ngIf=\"col.columns?.length < 1\">\n <teta-property-grid-item *ngIf=\"column.editable || !hideNonEditable\"\n [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n (controlValueChange)=\"controlValueChange.emit($event)\"\n [horizontal]=\"horizontal\"></teta-property-grid-item>\n </ng-container>\n <ng-container *ngIf=\"col.columns?.length > 0\">\n <teta-property-grid-group [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n [horizontal]=\"horizontal\"\n (controlValueChange)=\"controlValueChange.emit($event)\"></teta-property-grid-group>\n </ng-container>\n </ng-container>\n </div>\n</teta-expand-item>\n", styles: [":host{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ExpandItemComponent, selector: "teta-expand-item", inputs: ["open"], outputs: ["openChange"], exportAs: ["expand-item"] }, { kind: "component", type: PropertyGridGroupComponent, selector: "teta-property-grid-group", inputs: ["column", "hideNonEditable", "dict", "item", "horizontal", "decimalPart", "itemTemplates"], outputs: ["controlValueChange"] }, { kind: "component", type: i3.PropertyGridItemComponent, selector: "teta-property-grid-item", inputs: ["column", "hideNonEditable", "dict", "decimalPart", "item", "itemTemplates", "horizontal"], outputs: ["controlValueChange"] }] });
41
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: PropertyGridGroupComponent, deps: [{ token: i1.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component });
42
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: PropertyGridGroupComponent, selector: "teta-property-grid-group", inputs: { column: "column", hideNonEditable: "hideNonEditable", dict: "dict", item: "item", horizontal: "horizontal", decimalPart: "decimalPart", itemTemplates: "itemTemplates" }, outputs: { controlValueChange: "controlValueChange" }, ngImport: i0, template: "<teta-expand-item>\n <span ngProjectAs='head'>\n {{column.caption}}\n </span>\n <div class=\"form-container\">\n <ng-container *ngFor=\"let col of column.columns; trackBy: trackColumns\">\n <ng-container *ngIf=\"col.columns?.length < 1\">\n <teta-property-grid-item *ngIf=\"column.editable || !hideNonEditable\"\n [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n (controlValueChange)=\"controlValueChange.emit($event)\"\n [horizontal]=\"horizontal\"></teta-property-grid-item>\n </ng-container>\n <ng-container *ngIf=\"col.columns?.length > 0\">\n <teta-property-grid-group [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n [horizontal]=\"horizontal\"\n (controlValueChange)=\"controlValueChange.emit($event)\"></teta-property-grid-group>\n </ng-container>\n </ng-container>\n </div>\n</teta-expand-item>\n", styles: [":host{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ExpandItemComponent, selector: "teta-expand-item", inputs: ["open"], outputs: ["openChange"], exportAs: ["expand-item"] }, { kind: "component", type: PropertyGridGroupComponent, selector: "teta-property-grid-group", inputs: ["column", "hideNonEditable", "dict", "item", "horizontal", "decimalPart", "itemTemplates"], outputs: ["controlValueChange"] }, { kind: "component", type: i4.PropertyGridItemComponent, selector: "teta-property-grid-item", inputs: ["column", "hideNonEditable", "dict", "decimalPart", "item", "itemTemplates", "horizontal"], outputs: ["controlValueChange"] }], viewProviders: [FormsUtil.formProvider] });
24
43
  }
25
44
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: PropertyGridGroupComponent, decorators: [{
26
45
  type: Component,
27
- args: [{ selector: 'teta-property-grid-group', template: "<teta-expand-item>\n <span ngProjectAs='head'>\n {{column.caption}}\n </span>\n <div class=\"form-container\">\n <ng-container *ngFor=\"let col of column.columns; trackBy: trackColumns\">\n <ng-container *ngIf=\"col.columns?.length < 1\">\n <teta-property-grid-item *ngIf=\"column.editable || !hideNonEditable\"\n [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n (controlValueChange)=\"controlValueChange.emit($event)\"\n [horizontal]=\"horizontal\"></teta-property-grid-item>\n </ng-container>\n <ng-container *ngIf=\"col.columns?.length > 0\">\n <teta-property-grid-group [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n [horizontal]=\"horizontal\"\n (controlValueChange)=\"controlValueChange.emit($event)\"></teta-property-grid-group>\n </ng-container>\n </ng-container>\n </div>\n</teta-expand-item>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
28
- }], ctorParameters: function () { return []; }, propDecorators: { column: [{
46
+ args: [{ selector: 'teta-property-grid-group', viewProviders: [FormsUtil.formProvider], template: "<teta-expand-item>\n <span ngProjectAs='head'>\n {{column.caption}}\n </span>\n <div class=\"form-container\">\n <ng-container *ngFor=\"let col of column.columns; trackBy: trackColumns\">\n <ng-container *ngIf=\"col.columns?.length < 1\">\n <teta-property-grid-item *ngIf=\"column.editable || !hideNonEditable\"\n [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n (controlValueChange)=\"controlValueChange.emit($event)\"\n [horizontal]=\"horizontal\"></teta-property-grid-item>\n </ng-container>\n <ng-container *ngIf=\"col.columns?.length > 0\">\n <teta-property-grid-group [id]=\"col.name\"\n [dict]=\"dict\"\n [column]=\"col\"\n [item]=\"item\"\n [itemTemplates]=\"itemTemplates\"\n [decimalPart]=\"decimalPart\"\n [hideNonEditable]=\"hideNonEditable\"\n [horizontal]=\"horizontal\"\n (controlValueChange)=\"controlValueChange.emit($event)\"></teta-property-grid-group>\n </ng-container>\n </ng-container>\n </div>\n</teta-expand-item>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
47
+ }], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
48
+ type: Optional
49
+ }] }]; }, propDecorators: { column: [{
29
50
  type: Input
30
51
  }], hideNonEditable: [{
31
52
  type: Input
@@ -42,4 +63,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
42
63
  }], itemTemplates: [{
43
64
  type: Input
44
65
  }] } });
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkLWdyb3VwL3Byb3BlcnR5LWdyaWQtZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC1ncm91cC9wcm9wZXJ0eS1ncmlkLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7Ozs7O0FBV3ZCLE1BQU0sT0FBTywwQkFBMEI7SUFDNUIsTUFBTSxDQUFjO0lBQ3BCLGVBQWUsQ0FBVTtJQUN6QixJQUFJLENBQThCO0lBQ2xDLElBQUksQ0FBSTtJQUNSLFVBQVUsQ0FBVTtJQUNuQixrQkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztJQUN2RCxXQUFXLENBQVM7SUFDcEIsYUFBYSxDQUFrRDtJQUV4RTtJQUNBLENBQUM7SUFFRCxRQUFRO0lBQ1IsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBbUI7UUFDN0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7dUdBbEJVLDBCQUEwQjsyRkFBMUIsMEJBQTBCLDJTQ2pCdkMsMG9EQWdDQSwrZERmYSwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UsMEJBQTBCOzBFQUszQixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNFLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsIFF1ZXJ5TGlzdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RhYmxlQ29sdW1ufSBmcm9tICcuLi8uLi8uLi90YWJsZS9jb250cmFjdC90YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHtJRGljdGlvbmFyeX0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL2NvbnRyYWN0L2ktZGljdGlvbmFyeSc7XG5pbXBvcnQge0lJZE5hbWV9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9jb250cmFjdC9pLWlkLW5hbWUnO1xuaW1wb3J0IHtQcm9wZXJ0eUdyaWRJdGVtRGVzY3JpcHRpb25EaXJlY3RpdmV9IGZyb20gXCIuLi9wcm9wZXJ0eS1ncmlkLWl0ZW0tZGVzY3JpcHRpb24uZGlyZWN0aXZlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RldGEtcHJvcGVydHktZ3JpZC1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0eS1ncmlkLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvcGVydHktZ3JpZC1ncm91cC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUdyaWRHcm91cENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbHVtbjogVGFibGVDb2x1bW47XG4gIEBJbnB1dCgpIGhpZGVOb25FZGl0YWJsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZGljdDogSURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+O1xuICBASW5wdXQoKSBpdGVtOiBUO1xuICBASW5wdXQoKSBob3Jpem9udGFsOiBib29sZWFuO1xuICBAT3V0cHV0KCkgY29udHJvbFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJSWROYW1lPGFueT4+KCk7XG4gIEBJbnB1dCgpIGRlY2ltYWxQYXJ0OiBudW1iZXI7XG4gIEBJbnB1dCgpIGl0ZW1UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxQcm9wZXJ0eUdyaWRJdGVtRGVzY3JpcHRpb25EaXJlY3RpdmU+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gIH1cblxuICB0cmFja0NvbHVtbnMoaW5kZXg6IG51bWJlciwgY29sdW1uOiBUYWJsZUNvbHVtbik6IGFueSB7XG4gICAgcmV0dXJuIGNvbHVtbi5uYW1lO1xuICB9XG59XG4iLCI8dGV0YS1leHBhbmQtaXRlbT5cbiAgPHNwYW4gbmdQcm9qZWN0QXM9J2hlYWQnPlxuICAgIHt7Y29sdW1uLmNhcHRpb259fVxuICA8L3NwYW4+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW4uY29sdW1uczsgdHJhY2tCeTogdHJhY2tDb2x1bW5zXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmNvbHVtbnM/Lmxlbmd0aCA8IDFcIj5cbiAgICAgICAgPHRldGEtcHJvcGVydHktZ3JpZC1pdGVtICpuZ0lmPVwiY29sdW1uLmVkaXRhYmxlIHx8ICFoaWRlTm9uRWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImNvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWN0XT1cImRpY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVRlbXBsYXRlc109XCJpdGVtVGVtcGxhdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWNpbWFsUGFydF09XCJkZWNpbWFsUGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU5vbkVkaXRhYmxlXT1cImhpZGVOb25FZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbFZhbHVlQ2hhbmdlKT1cImNvbnRyb2xWYWx1ZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hvcml6b250YWxdPVwiaG9yaXpvbnRhbFwiPjwvdGV0YS1wcm9wZXJ0eS1ncmlkLWl0ZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuY29sdW1ucz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICA8dGV0YS1wcm9wZXJ0eS1ncmlkLWdyb3VwIFtpZF09XCJjb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpY3RdPVwiZGljdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtVGVtcGxhdGVzXT1cIml0ZW1UZW1wbGF0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWNpbWFsUGFydF09XCJkZWNpbWFsUGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVOb25FZGl0YWJsZV09XCJoaWRlTm9uRWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtob3Jpem9udGFsXT1cImhvcml6b250YWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sVmFsdWVDaGFuZ2UpPVwiY29udHJvbFZhbHVlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPjwvdGV0YS1wcm9wZXJ0eS1ncmlkLWdyb3VwPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC90ZXRhLWV4cGFuZC1pdGVtPlxuIl19
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkLWdyb3VwL3Byb3BlcnR5LWdyaWQtZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC1ncm91cC9wcm9wZXJ0eS1ncmlkLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBb0IsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXJFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7O0FBVXhELE1BQU0sT0FBTywwQkFBMEI7SUEyQkw7SUExQnZCLE1BQU0sQ0FBYztJQUNwQixlQUFlLENBQVU7SUFDekIsSUFBSSxDQUE4QjtJQUNsQyxJQUFJLENBQUk7SUFDUixVQUFVLENBQVU7SUFDbkIsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7SUFDdkQsV0FBVyxDQUFTO0lBQ3BCLGFBQWEsQ0FBa0Q7SUFFeEUsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxZQUFZLFNBQVMsRUFBRTtZQUN4QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLFlBQVksTUFBTSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRTtTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBZ0MsVUFBNEI7UUFBNUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7SUFBRyxDQUFDO0lBRWhFLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBbUI7UUFDN0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7dUdBL0JVLDBCQUEwQjsyRkFBMUIsMEJBQTBCLDJTQ3ZCdkMsMG9EQWdDQSwrZERUYSwwQkFBMEIsc2FBRnRCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQzs7MkZBRTVCLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSwwQkFBMEIsaUJBR3JCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQzs7MEJBNkIxQixRQUFROzRDQTFCWixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNFLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBJRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9jb250cmFjdC9pLWRpY3Rpb25hcnknO1xuaW1wb3J0IHsgSUlkTmFtZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9jb250cmFjdC9pLWlkLW5hbWUnO1xuaW1wb3J0IHsgYm9vbE9yRnVuY0NhbGxiYWNrIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbC9ib29sLW9yLWZ1bmMnO1xuaW1wb3J0IHsgRm9ybXNVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbC9mb3Jtcy11dGlsJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vLi4vdGFibGUvY29udHJhY3QvdGFibGUtY29sdW1uJztcbmltcG9ydCB7IFByb3BlcnR5R3JpZEl0ZW1EZXNjcmlwdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL3Byb3BlcnR5LWdyaWQtaXRlbS1kZXNjcmlwdGlvbi5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0ZXRhLXByb3BlcnR5LWdyaWQtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvcGVydHktZ3JpZC1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Byb3BlcnR5LWdyaWQtZ3JvdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW0Zvcm1zVXRpbC5mb3JtUHJvdmlkZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUdyaWRHcm91cENvbXBvbmVudDxUPiB7XG4gIEBJbnB1dCgpIGNvbHVtbjogVGFibGVDb2x1bW47XG4gIEBJbnB1dCgpIGhpZGVOb25FZGl0YWJsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZGljdDogSURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+O1xuICBASW5wdXQoKSBpdGVtOiBUO1xuICBASW5wdXQoKSBob3Jpem9udGFsOiBib29sZWFuO1xuICBAT3V0cHV0KCkgY29udHJvbFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJSWROYW1lPGFueT4+KCk7XG4gIEBJbnB1dCgpIGRlY2ltYWxQYXJ0OiBudW1iZXI7XG4gIEBJbnB1dCgpIGl0ZW1UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxQcm9wZXJ0eUdyaWRJdGVtRGVzY3JpcHRpb25EaXJlY3RpdmU+O1xuXG4gIGdldCBmb3JtR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICBpZiAodGhpcy5fZm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZm9ybUdyb3VwIGluc3RhbmNlb2YgTmdGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwLmZvcm07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGVkaXRhYmxlKCkge1xuICAgIHJldHVybiBib29sT3JGdW5jQ2FsbGJhY2sodGhpcy5jb2x1bW4uZWRpdGFibGUpKHtcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICByb3c6IHRoaXMuZm9ybUdyb3VwPy5nZXRSYXdWYWx1ZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZm9ybUdyb3VwOiBDb250cm9sQ29udGFpbmVyKSB7fVxuXG4gIHRyYWNrQ29sdW1ucyhpbmRleDogbnVtYmVyLCBjb2x1bW46IFRhYmxlQ29sdW1uKTogYW55IHtcbiAgICByZXR1cm4gY29sdW1uLm5hbWU7XG4gIH1cbn1cbiIsIjx0ZXRhLWV4cGFuZC1pdGVtPlxuICA8c3BhbiBuZ1Byb2plY3RBcz0naGVhZCc+XG4gICAge3tjb2x1bW4uY2FwdGlvbn19XG4gIDwvc3Bhbj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbi5jb2x1bW5zOyB0cmFja0J5OiB0cmFja0NvbHVtbnNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuY29sdW1ucz8ubGVuZ3RoIDwgMVwiPlxuICAgICAgICA8dGV0YS1wcm9wZXJ0eS1ncmlkLWl0ZW0gKm5nSWY9XCJjb2x1bW4uZWRpdGFibGUgfHwgIWhpZGVOb25FZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpY3RdPVwiZGljdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtVGVtcGxhdGVzXT1cIml0ZW1UZW1wbGF0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQYXJ0XT1cImRlY2ltYWxQYXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlTm9uRWRpdGFibGVdPVwiaGlkZU5vbkVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sVmFsdWVDaGFuZ2UpPVwiY29udHJvbFZhbHVlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaG9yaXpvbnRhbF09XCJob3Jpem9udGFsXCI+PC90ZXRhLXByb3BlcnR5LWdyaWQtaXRlbT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5jb2x1bW5zPy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDx0ZXRhLXByb3BlcnR5LWdyaWQtZ3JvdXAgW2lkXT1cImNvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGljdF09XCJkaWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1UZW1wbGF0ZXNdPVwiaXRlbVRlbXBsYXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQYXJ0XT1cImRlY2ltYWxQYXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU5vbkVkaXRhYmxlXT1cImhpZGVOb25FZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hvcml6b250YWxdPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRyb2xWYWx1ZUNoYW5nZSk9XCJjb250cm9sVmFsdWVDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+PC90ZXRhLXByb3BlcnR5LWdyaWQtZ3JvdXA+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L3RldGEtZXhwYW5kLWl0ZW0+XG4iXX0=
@@ -1,9 +1,10 @@
1
1
  import { Component, EventEmitter, Input, Optional, Output, } from '@angular/core';
2
- import { FilterType } from '../../../filter/enum/filter-type.enum';
3
2
  import { FormGroup, NgForm } from '@angular/forms';
4
- import { FormsUtil } from '../../../../util/forms-util';
3
+ import { takeWhile } from 'rxjs/operators';
5
4
  import { Align } from '../../../../common/enum/align.enum';
6
- import { takeWhile } from "rxjs/operators";
5
+ import { boolOrFuncCallback } from '../../../../util/bool-or-func';
6
+ import { FormsUtil } from '../../../../util/forms-util';
7
+ import { FilterType } from '../../../filter/enum/filter-type.enum';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@ngneat/transloco";
9
10
  import * as i2 from "@angular/forms";
@@ -23,7 +24,7 @@ export class PropertyGridItemComponent {
23
24
  item;
24
25
  itemTemplates;
25
26
  get template() {
26
- return this.itemTemplates.find((item) => item.name === this.column.name);
27
+ return this.itemTemplates.find(item => item.name === this.column.name);
27
28
  }
28
29
  get formGroup() {
29
30
  if (this._formGroup instanceof FormGroup) {
@@ -34,6 +35,12 @@ export class PropertyGridItemComponent {
34
35
  }
35
36
  return null;
36
37
  }
38
+ get editable() {
39
+ return boolOrFuncCallback(this.column.editable)({
40
+ column: this.column,
41
+ row: this.formGroup?.getRawValue(),
42
+ });
43
+ }
37
44
  horizontal;
38
45
  controlValueChange = new EventEmitter();
39
46
  align = Align;
@@ -77,8 +84,6 @@ export class PropertyGridItemComponent {
77
84
  });
78
85
  }
79
86
  }
80
- ngOnInit() {
81
- }
82
87
  ngOnDestroy() {
83
88
  this._alive = false;
84
89
  this._formSub?.unsubscribe();
@@ -89,7 +94,7 @@ export class PropertyGridItemComponent {
89
94
  this._formSub?.unsubscribe();
90
95
  this._formSub = this.formGroup?.controls[this.column.name]?.valueChanges
91
96
  .pipe(takeWhile(() => this._alive))
92
- .subscribe((_) => {
97
+ .subscribe(_ => {
93
98
  this.controlValueChange.emit({
94
99
  id: _,
95
100
  name: this.column.name,
@@ -98,11 +103,11 @@ export class PropertyGridItemComponent {
98
103
  }
99
104
  }
100
105
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: PropertyGridItemComponent, deps: [{ token: i1.TranslocoService }, { token: i2.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component });
101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: PropertyGridItemComponent, selector: "teta-property-grid-item", inputs: { column: "column", hideNonEditable: "hideNonEditable", dict: "dict", decimalPart: "decimalPart", item: "item", itemTemplates: "itemTemplates", horizontal: "horizontal" }, outputs: { controlValueChange: "controlValueChange" }, usesOnChanges: true, ngImport: i0, template: "<teta-input [label]=\"caption\"\n [hint]=\"column.hint\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"column.editable || !hideNonEditable\">\n <ng-container *ngIf=\"template; else default\">\n <ng-container *ngTemplateOutlet=\"template.template;context: {$implicit: formGroup?.get(column.name)}\"></ng-container>\n </ng-container>\n <ng-template #default>\n <ng-container [ngSwitch]=\"column.filterType\"\n *ngIf=\"formGroup?.get(column.name)\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">\n {{column.caption}}\n </teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n\n [decimalPart]=\"column.filterType === filterTypeEnum.number ? decimalPart : null\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n </ng-template>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.DatePickerComponent, selector: "teta-date-picker", inputs: ["date", "locale", "showTime", "minDate", "maxDate", "invalid", "disabled", "align", "verticalAlign", "viewType", "appendToBody", "backdrop", "allowNull", "firstDayOfWeek", "disabledDates", "disabledPeriods", "disabledDays", "minYearDate", "maxYearDate"], outputs: ["selectDate"] }, { kind: "component", type: i5.SelectComponent, selector: "teta-select", inputs: ["multiple", "options", "invalid", "align", "verticalAlign", "autoClose", "autoCloseIgnore", "disabled", "itemSize", "virtual", "icon", "placeholder", "appendToBody", "allowNull", "viewType", "notFoundText", "valueRef", "textRef", "searchRef"] }, { kind: "component", type: i6.InputComponent, selector: "teta-input", inputs: ["label", "hint", "viewType", "horizontal", "required"] }, { kind: "component", type: i7.TextFieldComponent, selector: "teta-text-field", inputs: ["placeholder", "leftIconName", "disabled", "onlyNumber", "decimalPart", "invalid"] }, { kind: "component", type: i8.ToggleComponent, selector: "teta-toggle", inputs: ["palette", "noLabel", "disabled"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], viewProviders: [FormsUtil.formProvider] });
106
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: PropertyGridItemComponent, selector: "teta-property-grid-item", inputs: { column: "column", hideNonEditable: "hideNonEditable", dict: "dict", decimalPart: "decimalPart", item: "item", itemTemplates: "itemTemplates", horizontal: "horizontal" }, outputs: { controlValueChange: "controlValueChange" }, usesOnChanges: true, ngImport: i0, template: "<teta-input [label]=\"caption\"\n [hint]=\"column.hint\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"editable || !hideNonEditable\">\n <ng-container *ngIf=\"template; else default\">\n <ng-container *ngTemplateOutlet=\"template.template;context: {$implicit: formGroup?.get(column.name)}\"></ng-container>\n </ng-container>\n <ng-template #default>\n <ng-container [ngSwitch]=\"column.filterType\"\n *ngIf=\"formGroup?.get(column.name)\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">\n {{column.caption}}\n </teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n [decimalPart]=\"column.filterType === filterTypeEnum.number ? decimalPart : null\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n </ng-template>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.DatePickerComponent, selector: "teta-date-picker", inputs: ["date", "locale", "showTime", "minDate", "maxDate", "invalid", "disabled", "align", "verticalAlign", "viewType", "appendToBody", "backdrop", "allowNull", "firstDayOfWeek", "disabledDates", "disabledPeriods", "disabledDays", "minYearDate", "maxYearDate"], outputs: ["selectDate"] }, { kind: "component", type: i5.SelectComponent, selector: "teta-select", inputs: ["multiple", "options", "invalid", "align", "verticalAlign", "autoClose", "autoCloseIgnore", "disabled", "itemSize", "virtual", "icon", "placeholder", "appendToBody", "allowNull", "viewType", "notFoundText", "valueRef", "textRef", "searchRef"] }, { kind: "component", type: i6.InputComponent, selector: "teta-input", inputs: ["label", "hint", "viewType", "horizontal", "required"] }, { kind: "component", type: i7.TextFieldComponent, selector: "teta-text-field", inputs: ["placeholder", "leftIconName", "disabled", "onlyNumber", "decimalPart", "invalid"] }, { kind: "component", type: i8.ToggleComponent, selector: "teta-toggle", inputs: ["palette", "noLabel", "disabled"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], viewProviders: [FormsUtil.formProvider] });
102
107
  }
103
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: PropertyGridItemComponent, decorators: [{
104
109
  type: Component,
105
- args: [{ selector: 'teta-property-grid-item', viewProviders: [FormsUtil.formProvider], template: "<teta-input [label]=\"caption\"\n [hint]=\"column.hint\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"column.editable || !hideNonEditable\">\n <ng-container *ngIf=\"template; else default\">\n <ng-container *ngTemplateOutlet=\"template.template;context: {$implicit: formGroup?.get(column.name)}\"></ng-container>\n </ng-container>\n <ng-template #default>\n <ng-container [ngSwitch]=\"column.filterType\"\n *ngIf=\"formGroup?.get(column.name)\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">\n {{column.caption}}\n </teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n\n [decimalPart]=\"column.filterType === filterTypeEnum.number ? decimalPart : null\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n </ng-template>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n" }]
110
+ args: [{ selector: 'teta-property-grid-item', viewProviders: [FormsUtil.formProvider], template: "<teta-input [label]=\"caption\"\n [hint]=\"column.hint\"\n [formGroup]=\"formGroup\"\n [horizontal]=\"horizontal\"\n [required]=\"column.required\"\n *ngIf=\"editable || !hideNonEditable\">\n <ng-container *ngIf=\"template; else default\">\n <ng-container *ngTemplateOutlet=\"template.template;context: {$implicit: formGroup?.get(column.name)}\"></ng-container>\n </ng-container>\n <ng-template #default>\n <ng-container [ngSwitch]=\"column.filterType\"\n *ngIf=\"formGroup?.get(column.name)\">\n <teta-select class=\"row_auto\"\n *ngSwitchCase=\"filterTypeEnum.list\"\n [searchRef]=\"getDict()?.length > 10 ? 'name' : ''\"\n [allowNull]=\"!column.required\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"\n [options]=\"getDict()\"\n [valueRef]=\"'id'\"\n [textRef]=\"'name'\"\n [multiple]=\"false\"></teta-select>\n <teta-date-picker *ngSwitchCase=\"filterTypeEnum.date\"\n class=\"row_auto\"\n [appendToBody]=\"true\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-date-picker>\n <teta-toggle *ngSwitchCase=\"filterTypeEnum.boolean\"\n [formControlName]=\"column.name\">\n {{column.caption}}\n </teta-toggle>\n <teta-text-field class=\"row_auto\"\n *ngSwitchDefault\n [decimalPart]=\"column.filterType === filterTypeEnum.number ? decimalPart : null\"\n [onlyNumber]=\"column.filterType === filterTypeEnum.number\"\n [placeholder]=\"column.caption\"\n [invalid]=\"controlIsInvalid(column.name)\"\n [formControlName]=\"column.name\"></teta-text-field>\n </ng-container>\n </ng-template>\n <div *ngIf=\"controlIsInvalid(column.name)\"\n ngProjectAs=\"message\"\n class=\"color-red-50\">\n {{getError(column)}}\n </div>\n</teta-input>\n" }]
106
111
  }], ctorParameters: function () { return [{ type: i1.TranslocoService }, { type: i2.ControlContainer, decorators: [{
107
112
  type: Optional
108
113
  }] }]; }, propDecorators: { column: [{
@@ -122,4 +127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
122
127
  }], controlValueChange: [{
123
128
  type: Output
124
129
  }] } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnQvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQtaXRlbS9wcm9wZXJ0eS1ncmlkLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC1pdGVtL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUcsUUFBUSxFQUNoQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pFLE9BQU8sRUFBbUIsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUd0RCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBUXpDLE1BQU0sT0FBTyx5QkFBeUI7SUF3Q2hCO0lBQ1k7SUF4Q3ZCLE1BQU0sQ0FBYztJQUNwQixlQUFlLENBQVU7SUFDekIsSUFBSSxDQUE4QjtJQUNsQyxXQUFXLENBQVM7SUFDcEIsSUFBSSxDQUFJO0lBQ1IsYUFBYSxDQUFrRDtJQUV4RSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLENB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S0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQWdCRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLGtCQUFrQjtzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCwgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCwgT3B0aW9uYWwsXG4gIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VGFibGVDb2x1bW59IGZyb20gJy4uLy4uLy4uL3RhYmxlL2NvbnRyYWN0L3RhYmxlLWNvbHVtbic7XG5pbXBvcnQge0lEaWN0aW9uYXJ5fSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1kaWN0aW9uYXJ5JztcbmltcG9ydCB7SUlkTmFtZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL2NvbnRyYWN0L2ktaWQtbmFtZSc7XG5pbXBvcnQge0ZpbHRlclR5cGV9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9lbnVtL2ZpbHRlci10eXBlLmVudW0nO1xuaW1wb3J0IHtDb250cm9sQ29udGFpbmVyLCBGb3JtR3JvdXAsIE5nRm9ybX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtGb3Jtc1V0aWx9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWwvZm9ybXMtdXRpbCc7XG5pbXBvcnQge1RyYW5zbG9jb1NlcnZpY2V9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWxpZ259IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9lbnVtL2FsaWduLmVudW0nO1xuaW1wb3J0IHtQcm9wZXJ0eUdyaWRJdGVtRGVzY3JpcHRpb25EaXJlY3RpdmV9IGZyb20gXCIuLi9wcm9wZXJ0eS1ncmlkLWl0ZW0tZGVzY3JpcHRpb24uZGlyZWN0aXZlXCI7XG5pbXBvcnQge3Rha2VXaGlsZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RldGEtcHJvcGVydHktZ3JpZC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbRm9ybXNVdGlsLmZvcm1Qcm92aWRlcl0sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29sdW1uOiBUYWJsZUNvbHVtbjtcbiAgQElucHV0KCkgaGlkZU5vbkVkaXRhYmxlOiBib29sZWFuO1xuICBASW5wdXQoKSBkaWN0OiBJRGljdGlvbmFyeTxJSWROYW1lPGFueT5bXT47XG4gIEBJbnB1dCgpIGRlY2ltYWxQYXJ0OiBudW1iZXI7XG4gIEBJbnB1dCgpIGl0ZW06IFQ7XG4gIEBJbnB1dCgpIGl0ZW1UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxQcm9wZXJ0eUdyaWRJdGVtRGVzY3JpcHRpb25EaXJlY3RpdmU+O1xuXG4gIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtVGVtcGxhdGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gdGhpcy5jb2x1bW4ubmFtZSlcbiAgfVxuXG4gIGdldCBmb3JtR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICBpZiAodGhpcy5fZm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZm9ybUdyb3VwIGluc3RhbmNlb2YgTmdGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwLmZvcm07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgQElucHV0KCkgaG9yaXpvbnRhbDogYm9vbGVhbjtcbiAgQE91dHB1dCgpIGNvbnRyb2xWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUlkTmFtZTxhbnk+PigpO1xuICBhbGlnbiA9IEFsaWduO1xuICBmaWx0ZXJUeXBlRW51bSA9IEZpbHRlclR5cGU7XG5cbiAgcHJpdmF0ZSBfZm9ybVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuYm9vbGVhbikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5jb2x1bW4uY2FwdGlvbn0ke1xuICAgICAgdGhpcy5jb2x1bW4udW5pdCA/IGAsICR7dGhpcy5jb2x1bW4udW5pdH1gIDogJydcbiAgICB9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaXZlID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF90cmFuc2xvY286IFRyYW5zbG9jb1NlcnZpY2UsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2Zvcm1Hcm91cDogQ29udHJvbENvbnRhaW5lcikge1xuICB9XG5cbiAgZ2V0RGljdCgpIHtcbiAgICBjb25zdCBkaWN0ID0gdGhpcy5kaWN0ID8gdGhpcy5kaWN0W3RoaXMuY29sdW1uLm5hbWVdIDogW107XG4gICAgaWYgKHRoaXMuY29sdW1uLnBhcmVudE5hbWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkaWN0Py5maWx0ZXIoXG4gICAgICAgIChkaWN0SXRlbTogSUlkTmFtZTxhbnk+KSA9PlxuICAgICAgICAgIGRpY3RJdGVtLnBhcmVudElkID09PVxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwPy5nZXRSYXdWYWx1ZSgpW3RoaXMuY29sdW1uLnBhcmVudE5hbWVdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGljdDtcbiAgfVxuXG4gIGNvbnRyb2xJc0ludmFsaWQoY29udHJvbE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBGb3Jtc1V0aWwuY29udHJvbElzSW52YWxpZCh0aGlzLmZvcm1Hcm91cCwgY29udHJvbE5hbWUpO1xuICB9XG5cbiAgZ2V0RXJyb3IoY29sdW1uOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5nZXQoY29sdW1uLm5hbWUpO1xuICAgIGlmIChjb250cm9sPy5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbG9jby50cmFuc2xhdGUoJ2Vycm9ycy5maWVsZF9pc19yZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoY29udHJvbD8uaGFzRXJyb3IoJ21pbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsb2NvLnRyYW5zbGF0ZSgnZXJyb3JzLm1pbl92YWx1ZScsIHtcbiAgICAgICAgdmFsdWU6IGNvbHVtbi5taW5WYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY29udHJvbD8uaGFzRXJyb3IoJ21heCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsb2NvLnRyYW5zbGF0ZSgnZXJyb3JzLm1heF92YWx1ZScsIHtcbiAgICAgICAgdmFsdWU6IGNvbHVtbi5tYXhWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9mb3JtU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLmNvbHVtbiAmJiB0aGlzLml0ZW0pIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnJlZ2lzdGVyQ29udHJvbCh0aGlzLmNvbHVtbi5uYW1lLCBGb3Jtc1V0aWwuaW5pdENvbnRyb2xGcm9tQ29sdW1uKHRoaXMuY29sdW1uLCB0aGlzLml0ZW0pKTtcbiAgICAgIHRoaXMuX2Zvcm1TdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9mb3JtU3ViID0gdGhpcy5mb3JtR3JvdXA/LmNvbnRyb2xzW3RoaXMuY29sdW1uLm5hbWVdPy52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRyb2xWYWx1ZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGlkOiBfLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5jb2x1bW4ubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8dGV0YS1pbnB1dCBbbGFiZWxdPVwiY2FwdGlvblwiXG4gICAgICAgICAgICBbaGludF09XCJjb2x1bW4uaGludFwiXG4gICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgICAgICBbaG9yaXpvbnRhbF09XCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxuICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZWRpdGFibGUgfHwgIWhpZGVOb25FZGl0YWJsZVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidGVtcGxhdGU7IGVsc2UgZGVmYXVsdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZS50ZW1wbGF0ZTtjb250ZXh0OiB7JGltcGxpY2l0OiBmb3JtR3JvdXA/LmdldChjb2x1bW4ubmFtZSl9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHQ+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLmZpbHRlclR5cGVcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXA/LmdldChjb2x1bW4ubmFtZSlcIj5cbiAgICAgIDx0ZXRhLXNlbGVjdCBjbGFzcz1cInJvd19hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZmlsdGVyVHlwZUVudW0ubGlzdFwiXG4gICAgICAgICAgICAgICAgICAgW3NlYXJjaFJlZl09XCJnZXREaWN0KCk/Lmxlbmd0aCA+IDEwID8gJ25hbWUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgIFthbGxvd051bGxdPVwiIWNvbHVtbi5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvQm9keV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJjb250cm9sSXNJbnZhbGlkKGNvbHVtbi5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0RGljdCgpXCJcbiAgICAgICAgICAgICAgICAgICBbdmFsdWVSZWZdPVwiJ2lkJ1wiXG4gICAgICAgICAgICAgICAgICAgW3RleHRSZWZdPVwiJ25hbWUnXCJcbiAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIj48L3RldGEtc2VsZWN0PlxuICAgICAgPHRldGEtZGF0ZS1waWNrZXIgKm5nU3dpdGNoQ2FzZT1cImZpbHRlclR5cGVFbnVtLmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3dfYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9Cb2R5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiY29udHJvbElzSW52YWxpZChjb2x1bW4ubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiPjwvdGV0YS1kYXRlLXBpY2tlcj5cbiAgICAgIDx0ZXRhLXRvZ2dsZSAqbmdTd2l0Y2hDYXNlPVwiZmlsdGVyVHlwZUVudW0uYm9vbGVhblwiXG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICB7e2NvbHVtbi5jYXB0aW9ufX1cbiAgICAgIDwvdGV0YS10b2dnbGU+XG4gICAgICA8dGV0YS10ZXh0LWZpZWxkIGNsYXNzPVwicm93X2F1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQYXJ0XT1cImNvbHVtbi5maWx0ZXJUeXBlID09PSBmaWx0ZXJUeXBlRW51bS5udW1iZXIgPyBkZWNpbWFsUGFydCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbb25seU51bWJlcl09XCJjb2x1bW4uZmlsdGVyVHlwZSA9PT0gZmlsdGVyVHlwZUVudW0ubnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiY29udHJvbElzSW52YWxpZChjb2x1bW4ubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbHVtbi5uYW1lXCI+PC90ZXRhLXRleHQtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxkaXYgKm5nSWY9XCJjb250cm9sSXNJbnZhbGlkKGNvbHVtbi5uYW1lKVwiXG4gICAgICAgbmdQcm9qZWN0QXM9XCJtZXNzYWdlXCJcbiAgICAgICBjbGFzcz1cImNvbG9yLXJlZC01MFwiPlxuICAgIHt7Z2V0RXJyb3IoY29sdW1uKX19XG4gIDwvZGl2PlxuPC90ZXRhLWlucHV0PlxuIl19
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnQvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQtaXRlbS9wcm9wZXJ0eS1ncmlkLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC1pdGVtL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW9CLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7Ozs7QUFVbkUsTUFBTSxPQUFPLHlCQUF5QjtJQWdEMUI7SUFDWTtJQWhEYixNQUFNLENBQWM7SUFDcEIsZUFBZSxDQUFVO0lBQ3pCLElBQUksQ0FBOEI7SUFDbEMsV0FBVyxDQUFTO0lBQ3BCLElBQUksQ0FBSTtJQUNSLGFBQWEsQ0FBa0Q7SUFFeEUsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxZQUFZLFNBQVMsRUFBRTtZQUN4QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLFlBQVksTUFBTSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRTtTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVEsVUFBVSxDQUFVO0lBQ25CLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO0lBQ2hFLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxjQUFjLEdBQUcsVUFBVSxDQUFDO0lBRXBCLFFBQVEsQ0FBZTtJQUUvQixJQUFJLE9BQU87UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUU7WUFDakQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDL0MsRUFBRSxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFFdEIsWUFDVSxVQUE0QixFQUNoQixVQUE0QjtRQUR4QyxlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUNoQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtJQUMvQyxDQUFDO0lBRUosT0FBTztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN0QyxPQUFPLElBQUksRUFBRSxNQUFNLENBQ2pCLENBQUMsUUFBc0IsRUFBRSxFQUFFLENBQ3pCLFFBQVEsQ0FBQyxRQUFRO2dCQUNqQixJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQ3hELENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdCQUFnQixDQUFDLFdBQW1CO1FBQ2xDLE9BQU8sU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFtQjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsSUFBSSxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUM5RDtRQUNELElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFO2dCQUNuRCxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVE7YUFDdkIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDbkQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQ3ZCLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUNoQixTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3hELENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZO2lCQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNiLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLEVBQUUsRUFBRSxDQUFDO29CQUNMLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7aUJBQ3ZCLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO3VHQTFHVSx5QkFBeUI7MkZBQXpCLHlCQUF5QiwrVEMvQnRDLHV2RUErQ0EsbXVFRGxCaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDOzsyRkFFNUIseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNFLHlCQUF5QixpQkFHcEIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDOzswQkFtRHBDLFFBQVE7NENBaERGLE1BQU07c0JBQWQsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQXVCRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLGtCQUFrQjtzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBGb3JtR3JvdXAsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbG9jb1NlcnZpY2UgfSBmcm9tICdAbmduZWF0L3RyYW5zbG9jbyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgSURpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1kaWN0aW9uYXJ5JztcbmltcG9ydCB7IElJZE5hbWUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vY29udHJhY3QvaS1pZC1uYW1lJztcbmltcG9ydCB7IEFsaWduIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL2VudW0vYWxpZ24uZW51bSc7XG5pbXBvcnQgeyBib29sT3JGdW5jQ2FsbGJhY2sgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsL2Jvb2wtb3ItZnVuYyc7XG5pbXBvcnQgeyBGb3Jtc1V0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsL2Zvcm1zLXV0aWwnO1xuaW1wb3J0IHsgRmlsdGVyVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9lbnVtL2ZpbHRlci10eXBlLmVudW0nO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi8uLi90YWJsZS9jb250cmFjdC90YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgUHJvcGVydHlHcmlkSXRlbURlc2NyaXB0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vcHJvcGVydHktZ3JpZC1pdGVtLWRlc2NyaXB0aW9uLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RldGEtcHJvcGVydHktZ3JpZC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbRm9ybXNVdGlsLmZvcm1Qcm92aWRlcl0sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbHVtbjogVGFibGVDb2x1bW47XG4gIEBJbnB1dCgpIGhpZGVOb25FZGl0YWJsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZGljdDogSURpY3Rpb25hcnk8SUlkTmFtZTxhbnk+W10+O1xuICBASW5wdXQoKSBkZWNpbWFsUGFydDogbnVtYmVyO1xuICBASW5wdXQoKSBpdGVtOiBUO1xuICBASW5wdXQoKSBpdGVtVGVtcGxhdGVzOiBRdWVyeUxpc3Q8UHJvcGVydHlHcmlkSXRlbURlc2NyaXB0aW9uRGlyZWN0aXZlPjtcblxuICBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVRlbXBsYXRlcy5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSB0aGlzLmNvbHVtbi5uYW1lKTtcbiAgfVxuXG4gIGdldCBmb3JtR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICBpZiAodGhpcy5fZm9ybUdyb3VwIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZm9ybUdyb3VwIGluc3RhbmNlb2YgTmdGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwLmZvcm07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGVkaXRhYmxlKCkge1xuICAgIHJldHVybiBib29sT3JGdW5jQ2FsbGJhY2sodGhpcy5jb2x1bW4uZWRpdGFibGUpKHtcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICByb3c6IHRoaXMuZm9ybUdyb3VwPy5nZXRSYXdWYWx1ZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KCkgaG9yaXpvbnRhbDogYm9vbGVhbjtcbiAgQE91dHB1dCgpIGNvbnRyb2xWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUlkTmFtZTxhbnk+PigpO1xuICBhbGlnbiA9IEFsaWduO1xuICBmaWx0ZXJUeXBlRW51bSA9IEZpbHRlclR5cGU7XG5cbiAgcHJpdmF0ZSBfZm9ybVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29sdW1uLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuYm9vbGVhbikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5jb2x1bW4uY2FwdGlvbn0ke1xuICAgICAgdGhpcy5jb2x1bW4udW5pdCA/IGAsICR7dGhpcy5jb2x1bW4udW5pdH1gIDogJydcbiAgICB9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaXZlID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90cmFuc2xvY286IFRyYW5zbG9jb1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZm9ybUdyb3VwOiBDb250cm9sQ29udGFpbmVyXG4gICkge31cblxuICBnZXREaWN0KCkge1xuICAgIGNvbnN0IGRpY3QgPSB0aGlzLmRpY3QgPyB0aGlzLmRpY3RbdGhpcy5jb2x1bW4ubmFtZV0gOiBbXTtcbiAgICBpZiAodGhpcy5jb2x1bW4ucGFyZW50TmFtZT8ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRpY3Q/LmZpbHRlcihcbiAgICAgICAgKGRpY3RJdGVtOiBJSWROYW1lPGFueT4pID0+XG4gICAgICAgICAgZGljdEl0ZW0ucGFyZW50SWQgPT09XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXA/LmdldFJhd1ZhbHVlKClbdGhpcy5jb2x1bW4ucGFyZW50TmFtZV1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkaWN0O1xuICB9XG5cbiAgY29udHJvbElzSW52YWxpZChjb250cm9sTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIEZvcm1zVXRpbC5jb250cm9sSXNJbnZhbGlkKHRoaXMuZm9ybUdyb3VwLCBjb250cm9sTmFtZSk7XG4gIH1cblxuICBnZXRFcnJvcihjb2x1bW46IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXA/LmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKGNvbnRyb2w/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsb2NvLnRyYW5zbGF0ZSgnZXJyb3JzLmZpZWxkX2lzX3JlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChjb250cm9sPy5oYXNFcnJvcignbWluJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xvY28udHJhbnNsYXRlKCdlcnJvcnMubWluX3ZhbHVlJywge1xuICAgICAgICB2YWx1ZTogY29sdW1uLm1pblZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb250cm9sPy5oYXNFcnJvcignbWF4JykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xvY28udHJhbnNsYXRlKCdlcnJvcnMubWF4X3ZhbHVlJywge1xuICAgICAgICB2YWx1ZTogY29sdW1uLm1heFZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9mb3JtU3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLmNvbHVtbiAmJiB0aGlzLml0ZW0pIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnJlZ2lzdGVyQ29udHJvbChcbiAgICAgICAgdGhpcy5jb2x1bW4ubmFtZSxcbiAgICAgICAgRm9ybXNVdGlsLmluaXRDb250cm9sRnJvbUNvbHVtbih0aGlzLmNvbHVtbiwgdGhpcy5pdGVtKVxuICAgICAgKTtcbiAgICAgIHRoaXMuX2Zvcm1TdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9mb3JtU3ViID0gdGhpcy5mb3JtR3JvdXA/LmNvbnRyb2xzW3RoaXMuY29sdW1uLm5hbWVdPy52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgICAgLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRyb2xWYWx1ZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGlkOiBfLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5jb2x1bW4ubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8dGV0YS1pbnB1dCBbbGFiZWxdPVwiY2FwdGlvblwiXG4gICAgICAgICAgICBbaGludF09XCJjb2x1bW4uaGludFwiXG4gICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgICAgICBbaG9yaXpvbnRhbF09XCJob3Jpem9udGFsXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxuICAgICAgICAgICAgKm5nSWY9XCJlZGl0YWJsZSB8fCAhaGlkZU5vbkVkaXRhYmxlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZTsgZWxzZSBkZWZhdWx0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlLnRlbXBsYXRlO2NvbnRleHQ6IHskaW1wbGljaXQ6IGZvcm1Hcm91cD8uZ2V0KGNvbHVtbi5uYW1lKX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdD5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4uZmlsdGVyVHlwZVwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cD8uZ2V0KGNvbHVtbi5uYW1lKVwiPlxuICAgICAgPHRldGEtc2VsZWN0IGNsYXNzPVwicm93X2F1dG9cIlxuICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaWx0ZXJUeXBlRW51bS5saXN0XCJcbiAgICAgICAgICAgICAgICAgICBbc2VhcmNoUmVmXT1cImdldERpY3QoKT8ubGVuZ3RoID4gMTAgPyAnbmFtZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgW2FsbG93TnVsbF09XCIhY29sdW1uLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9Cb2R5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgIFtpbnZhbGlkXT1cImNvbnRyb2xJc0ludmFsaWQoY29sdW1uLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXREaWN0KClcIlxuICAgICAgICAgICAgICAgICAgIFt2YWx1ZVJlZl09XCInaWQnXCJcbiAgICAgICAgICAgICAgICAgICBbdGV4dFJlZl09XCInbmFtZSdcIlxuICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiPjwvdGV0YS1zZWxlY3Q+XG4gICAgICA8dGV0YS1kYXRlLXBpY2tlciAqbmdTd2l0Y2hDYXNlPVwiZmlsdGVyVHlwZUVudW0uZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvd19hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb0JvZHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJjb250cm9sSXNJbnZhbGlkKGNvbHVtbi5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbHVtbi5uYW1lXCI+PC90ZXRhLWRhdGUtcGlja2VyPlxuICAgICAgPHRldGEtdG9nZ2xlICpuZ1N3aXRjaENhc2U9XCJmaWx0ZXJUeXBlRW51bS5ib29sZWFuXCJcbiAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICAgIHt7Y29sdW1uLmNhcHRpb259fVxuICAgICAgPC90ZXRhLXRvZ2dsZT5cbiAgICAgIDx0ZXRhLXRleHQtZmllbGQgY2xhc3M9XCJyb3dfYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQYXJ0XT1cImNvbHVtbi5maWx0ZXJUeXBlID09PSBmaWx0ZXJUeXBlRW51bS5udW1iZXIgPyBkZWNpbWFsUGFydCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbb25seU51bWJlcl09XCJjb2x1bW4uZmlsdGVyVHlwZSA9PT0gZmlsdGVyVHlwZUVudW0ubnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiY29udHJvbElzSW52YWxpZChjb2x1bW4ubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbHVtbi5uYW1lXCI+PC90ZXRhLXRleHQtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxkaXYgKm5nSWY9XCJjb250cm9sSXNJbnZhbGlkKGNvbHVtbi5uYW1lKVwiXG4gICAgICAgbmdQcm9qZWN0QXM9XCJtZXNzYWdlXCJcbiAgICAgICBjbGFzcz1cImNvbG9yLXJlZC01MFwiPlxuICAgIHt7Z2V0RXJyb3IoY29sdW1uKX19XG4gIDwvZGl2PlxuPC90ZXRhLWlucHV0PlxuIl19