@annalib/anna-core 4.4.4 → 4.5.0

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 (27) hide show
  1. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +4 -4
  2. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +1 -1
  3. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +39 -41
  4. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +34 -47
  5. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +77 -5
  6. package/esm2020/lib/anna-core.module.mjs +4 -9
  7. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +14 -16
  8. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +33 -27
  9. package/esm2020/public-api.mjs +1 -3
  10. package/fesm2015/annalib-anna-core.mjs +199 -467
  11. package/fesm2015/annalib-anna-core.mjs.map +1 -1
  12. package/fesm2020/annalib-anna-core.mjs +199 -463
  13. package/fesm2020/annalib-anna-core.mjs.map +1 -1
  14. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +1 -1
  15. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +2 -2
  16. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +4 -4
  17. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +15 -1
  18. package/lib/anna-core.module.d.ts +11 -12
  19. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +13 -4
  20. package/package.json +2 -2
  21. package/public-api.d.ts +0 -2
  22. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +25 -0
  23. package/src/lib/anna-common-scss/_generic-table-common.scss +59 -0
  24. package/esm2020/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +0 -282
  25. package/esm2020/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +0 -41
  26. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +0 -34
  27. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +0 -7
@@ -20,7 +20,7 @@ export interface IHeaderInfo {
20
20
  tooltip?: ITooltip;
21
21
  joinedFilterSortObjectKeys?: string;
22
22
  }
23
- declare type DATATYPE = "CHECKBOX" | "ICON" | "STRING" | "RADIO" | "" | "SVG_ICON" | "TEXT_ACTIONS" | "CLICKABLE_DATA";
23
+ declare type DATATYPE = "CHECKBOX" | "ICON" | "STRING" | "RADIO" | "" | "SVG_ICON" | "TEXT_ACTIONS" | "CLICKABLE_DATA" | "STRING__TEXT_ACTION";
24
24
  declare type FILTERTYPE = "CHECKBOX" | "SLIDER" | "DATE" | "TIME" | "WEEK";
25
25
  export interface ITotalRowInfo {
26
26
  colspan: number;
@@ -17,8 +17,8 @@ export declare class AnnaDateTimeFormatService {
17
17
  sortByTimeDescending(a: any, b: any): number;
18
18
  convertNgbDateToMoment(ngbDate: NgbDate | NgbDateType): string;
19
19
  compareDate(a: string, b: string, isAsc: boolean): number;
20
- static formatTwentyFourHourTimeToHHMMAFormat(value: any, date?: string): string;
21
- static formatTwelveHourTimeToHHMMAFormat(timeValue: any, date?: string): string;
20
+ static formatTwentyFourHourTimeToHHMMAFormat(value: any): string;
21
+ static formatTwelveHourTimeToHHMMAFormat(value: any): string;
22
22
  formatDateAndHHMMATimeToStandardFormat(dateAndTime: any): string;
23
23
  compare(a: number | string, b: number | string, isAsc: boolean): number;
24
24
  sortDataByBroadcastTimeAsc(firstParamTime: string, secondParamTime: string, broadcastTime: string): number;
@@ -1,5 +1,5 @@
1
1
  import { Options } from '@angular-slider/ngx-slider';
2
- import dayjs from "dayjs";
2
+ import moment from "moment";
3
3
  import { SortType } from '../models/anna-sort.model';
4
4
  import { AnnaDateTimeFormatService, NgbDateType } from './anna-date-time-format.service';
5
5
  import { AnnaSortService } from './anna-sort.service';
@@ -34,7 +34,7 @@ export declare class AnnaFilterService {
34
34
  isFilterSortActive: any;
35
35
  constructor(dateTimeFormatService: AnnaDateTimeFormatService, annaSortService: AnnaSortService);
36
36
  returnMaxAndMinValue(data: any[], key: string, isMin: boolean): any;
37
- returnMinAndMaxDate(data: any[], key: string): dayjs.Dayjs[];
37
+ returnMinAndMaxDate(data: any[], key: string): moment.Moment[];
38
38
  isTooltipActive(header: string[], sortMap: Map<string, SortType>): boolean;
39
39
  clearColumnFilter(): void;
40
40
  setOptionValues(minValue: number, maxValue: number): {
@@ -63,8 +63,8 @@ export declare class AnnaFilterService {
63
63
  checkIfFilterIsApplied(clonedData: any[], value: any): boolean;
64
64
  applyFilter(data: any[], value: any): any[];
65
65
  isObjectInTheRange(obj: any, value: {
66
- fromDate: dayjs.Dayjs;
67
- toDate: dayjs.Dayjs;
66
+ fromDate: moment.Moment;
67
+ toDate: moment.Moment;
68
68
  }, key: string): boolean;
69
69
  updateStateOfTheCurrentFilterTab(sortMap: Map<string, SortType>): void;
70
70
  updateStateOfAllTheKeys(sortMap: Map<string, SortType>): void;
@@ -1,14 +1,28 @@
1
+ import { ActivatedRoute, Router } from '@angular/router';
1
2
  import { Subject } from "rxjs";
2
3
  import { AnnaFilterService } from "./anna-filter.service";
3
4
  import { AnnaSortService } from "./anna-sort.service";
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class AnnaGenericTableService {
6
7
  private annaFilterService;
8
+ private router;
9
+ private route;
7
10
  private annaSortService;
8
11
  virtualScrollSubject: Subject<unknown>;
9
- constructor(annaFilterService: AnnaFilterService, annaSortService: AnnaSortService);
12
+ constructor(annaFilterService: AnnaFilterService, router: Router, route: ActivatedRoute, annaSortService: AnnaSortService);
10
13
  calculateNumberOfSkeletonColumnsForTable(tableHeaders: any[]): number[][];
11
14
  initColumnFilterAndSorting(): void;
15
+ enableOrDisableClearAllBtn(): boolean;
16
+ updateFiltersInURL(): void;
17
+ prepareQueryParamsOnFilter(): {
18
+ appliedFilters: string[];
19
+ selectedFilterData: string;
20
+ sortState: string;
21
+ };
22
+ initTableFilters(clonedTableData: any): void;
23
+ initFilters(): void;
24
+ setDataAsPerPersistingFilter(isPersistingFilter: boolean, clonedTable: any, filters: any): any;
25
+ callSort(usersTable: any): any;
12
26
  static ɵfac: i0.ɵɵFactoryDeclaration<AnnaGenericTableService, never>;
13
27
  static ɵprov: i0.ɵɵInjectableDeclaration<AnnaGenericTableService>;
14
28
  }
@@ -18,19 +18,18 @@ import * as i16 from "./anna-generic-table-lib/directives/anna-virtual-table/ann
18
18
  import * as i17 from "./anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component";
19
19
  import * as i18 from "./anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component";
20
20
  import * as i19 from "./anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive";
21
- import * as i20 from "./anna-core-shared-lib/directives/digits-only/digits-only.directive";
22
- import * as i21 from "@angular/common";
23
- import * as i22 from "@ng-bootstrap/ng-bootstrap";
24
- import * as i23 from "@angular/forms";
25
- import * as i24 from "@angular/material/radio";
26
- import * as i25 from "@angular/material/button-toggle";
27
- import * as i26 from "@angular/material/table";
28
- import * as i27 from "@angular-slider/ngx-slider";
29
- import * as i28 from "ngx-skeleton-loader";
30
- import * as i29 from "@angular/cdk/scrolling";
31
- import * as i30 from "ng-circle-progress";
21
+ import * as i20 from "@angular/common";
22
+ import * as i21 from "@ng-bootstrap/ng-bootstrap";
23
+ import * as i22 from "@angular/forms";
24
+ import * as i23 from "@angular/material/radio";
25
+ import * as i24 from "@angular/material/button-toggle";
26
+ import * as i25 from "@angular/material/table";
27
+ import * as i26 from "@angular-slider/ngx-slider";
28
+ import * as i27 from "ngx-skeleton-loader";
29
+ import * as i28 from "@angular/cdk/scrolling";
30
+ import * as i29 from "ng-circle-progress";
32
31
  export declare class AnnaCoreModule {
33
32
  static ɵfac: i0.ɵɵFactoryDeclaration<AnnaCoreModule, never>;
34
- static ɵmod: i0.ɵɵNgModuleDeclaration<AnnaCoreModule, [typeof i1.AnnaNoDataComponent, typeof i2.AnnaFilterSearchedTextPipe, typeof i3.AnnaConvertZeroOrNullOrUndefinedPipe, typeof i4.AnnaTypeofDataPipe, typeof i2.AnnaFilterSearchedTextPipe, typeof i5.AnnaReplaceCharPipe, typeof i6.AnnaBuyerApprovalIconTemplateComponent, typeof i7.AnnaLiveIconTemplateComponent, typeof i8.AnnaNotifyIconTemplateComponent, typeof i9.AnnaPayForPerformanceIconTemplateComponent, typeof i10.AnnaRejectedIconTemplateComponent, typeof i11.showEllipsisTextOnHoverDirective, typeof i12.AnnaIconColumnComponent, typeof i13.AnnaWeekCalendarComponent, typeof i14.AnnaCalendarFilterComponent, typeof i15.AnnaSortComponent, typeof i16.AnnaVirtualTableDirective, typeof i17.AnnaNonEditableGenericTableComponent, typeof i18.AnnaTableVirtualScrollViewportComponent, typeof i19.AnnaFixedRowSizeTableVirtualScrollStrategyDirective, typeof i20.DigitOnlyDirective], [typeof i21.CommonModule, typeof i22.NgbModule, typeof i23.FormsModule, typeof i24.MatRadioModule, typeof i25.MatButtonToggleModule, typeof i26.MatTableModule, typeof i27.NgxSliderModule, typeof i28.NgxSkeletonLoaderModule, typeof i29.ScrollingModule, typeof i30.NgCircleProgressModule], [typeof i1.AnnaNoDataComponent, typeof i2.AnnaFilterSearchedTextPipe, typeof i3.AnnaConvertZeroOrNullOrUndefinedPipe, typeof i4.AnnaTypeofDataPipe, typeof i5.AnnaReplaceCharPipe, typeof i2.AnnaFilterSearchedTextPipe, typeof i6.AnnaBuyerApprovalIconTemplateComponent, typeof i7.AnnaLiveIconTemplateComponent, typeof i8.AnnaNotifyIconTemplateComponent, typeof i9.AnnaPayForPerformanceIconTemplateComponent, typeof i10.AnnaRejectedIconTemplateComponent, typeof i11.showEllipsisTextOnHoverDirective, typeof i12.AnnaIconColumnComponent, typeof i13.AnnaWeekCalendarComponent, typeof i14.AnnaCalendarFilterComponent, typeof i15.AnnaSortComponent, typeof i16.AnnaVirtualTableDirective, typeof i17.AnnaNonEditableGenericTableComponent, typeof i18.AnnaTableVirtualScrollViewportComponent, typeof i19.AnnaFixedRowSizeTableVirtualScrollStrategyDirective, typeof i20.DigitOnlyDirective]>;
33
+ static ɵmod: i0.ɵɵNgModuleDeclaration<AnnaCoreModule, [typeof i1.AnnaNoDataComponent, typeof i2.AnnaFilterSearchedTextPipe, typeof i3.AnnaConvertZeroOrNullOrUndefinedPipe, typeof i4.AnnaTypeofDataPipe, typeof i2.AnnaFilterSearchedTextPipe, typeof i5.AnnaReplaceCharPipe, typeof i6.AnnaBuyerApprovalIconTemplateComponent, typeof i7.AnnaLiveIconTemplateComponent, typeof i8.AnnaNotifyIconTemplateComponent, typeof i9.AnnaPayForPerformanceIconTemplateComponent, typeof i10.AnnaRejectedIconTemplateComponent, typeof i11.showEllipsisTextOnHoverDirective, typeof i12.AnnaIconColumnComponent, typeof i13.AnnaWeekCalendarComponent, typeof i14.AnnaCalendarFilterComponent, typeof i15.AnnaSortComponent, typeof i16.AnnaVirtualTableDirective, typeof i17.AnnaNonEditableGenericTableComponent, typeof i18.AnnaTableVirtualScrollViewportComponent, typeof i19.AnnaFixedRowSizeTableVirtualScrollStrategyDirective], [typeof i20.CommonModule, typeof i21.NgbModule, typeof i22.FormsModule, typeof i23.MatRadioModule, typeof i24.MatButtonToggleModule, typeof i25.MatTableModule, typeof i26.NgxSliderModule, typeof i27.NgxSkeletonLoaderModule, typeof i28.ScrollingModule, typeof i29.NgCircleProgressModule], [typeof i1.AnnaNoDataComponent, typeof i2.AnnaFilterSearchedTextPipe, typeof i3.AnnaConvertZeroOrNullOrUndefinedPipe, typeof i4.AnnaTypeofDataPipe, typeof i5.AnnaReplaceCharPipe, typeof i2.AnnaFilterSearchedTextPipe, typeof i6.AnnaBuyerApprovalIconTemplateComponent, typeof i7.AnnaLiveIconTemplateComponent, typeof i8.AnnaNotifyIconTemplateComponent, typeof i9.AnnaPayForPerformanceIconTemplateComponent, typeof i10.AnnaRejectedIconTemplateComponent, typeof i11.showEllipsisTextOnHoverDirective, typeof i12.AnnaIconColumnComponent, typeof i13.AnnaWeekCalendarComponent, typeof i14.AnnaCalendarFilterComponent, typeof i15.AnnaSortComponent, typeof i16.AnnaVirtualTableDirective, typeof i17.AnnaNonEditableGenericTableComponent, typeof i18.AnnaTableVirtualScrollViewportComponent, typeof i19.AnnaFixedRowSizeTableVirtualScrollStrategyDirective]>;
35
34
  static ɵinj: i0.ɵɵInjectorDeclaration<AnnaCoreModule>;
36
35
  }
@@ -1,5 +1,5 @@
1
1
  import { OnInit, QueryList, EventEmitter, SimpleChanges, OnChanges, ChangeDetectorRef, ElementRef, AfterViewChecked } from '@angular/core';
2
- import dayjs from "dayjs";
2
+ import moment from "moment";
3
3
  import { Options } from '@angular-slider/ngx-slider';
4
4
  import { IGtGeneralConfig, IGtTableHeader, IHeaderInfo, ITotalRowInfo } from '../../../anna-core-shared-lib/models/anna-non-editable-gt-models';
5
5
  import { AnnaDateTimeFormatService, NgbDateType } from '../../../anna-core-shared-lib/services/anna-date-time-format.service';
@@ -38,6 +38,7 @@ export declare class AnnaNonEditableGenericTableComponent implements OnInit, OnC
38
38
  downloadInProgress: boolean;
39
39
  percentDone: number;
40
40
  starredInProgress: boolean;
41
+ clickableRow: boolean;
41
42
  toggleCheckbox: EventEmitter<any>;
42
43
  toggleRowCheckbox: EventEmitter<any>;
43
44
  toggleHeaderCheckbox: EventEmitter<any>;
@@ -53,6 +54,7 @@ export declare class AnnaNonEditableGenericTableComponent implements OnInit, OnC
53
54
  gtTextActionClicked: EventEmitter<any>;
54
55
  gtViewDetailClicked: EventEmitter<any>;
55
56
  downloadSpotDetails: EventEmitter<any>;
57
+ clickableDataClicked: EventEmitter<any>;
56
58
  tableDataWrapper: any[];
57
59
  rowChecked: boolean;
58
60
  isAllRowsChecked: boolean;
@@ -147,6 +149,11 @@ export declare class AnnaNonEditableGenericTableComponent implements OnInit, OnC
147
149
  heightOfCheckboxTooltipFilter: number;
148
150
  isNoDataToDisplaySubject$: BehaviorSubject<boolean>;
149
151
  selectedStarredOrderId: string;
152
+ userActionTableMetaData: {
153
+ lastEmailResentAt: string;
154
+ passwordValidity: string;
155
+ status: string;
156
+ };
150
157
  constructor(cdRef: ChangeDetectorRef, annaSortService: AnnaSortService, annaDateTimeFormatService: AnnaDateTimeFormatService, annaFilterService: AnnaFilterService, annaGenericTableService: AnnaGenericTableService);
151
158
  ngAfterViewChecked(): void;
152
159
  ngOnInit(): void;
@@ -175,8 +182,8 @@ export declare class AnnaNonEditableGenericTableComponent implements OnInit, OnC
175
182
  createListForCheckboxFilter(header: string): TooltipModel[];
176
183
  selectUnselectListCheckbox(tooltipOptions: TooltipModel[], header: string): void;
177
184
  getCalendarData(): void;
178
- createRangeForTheDateFilter(): dayjs.Dayjs[];
179
- createStartEndDateRange(optionData: any[]): dayjs.Dayjs[];
185
+ createRangeForTheDateFilter(): moment.Moment[];
186
+ createStartEndDateRange(optionData: any[]): moment.Moment[];
180
187
  selectRangeForTheDateFilter(minMaxDate: any[], parsingFormat: string): void;
181
188
  getTimeFilterData(header: string): void;
182
189
  setTimeFilterDataForComponentsOtherThanRatingsPage(header: string): void;
@@ -266,6 +273,8 @@ export declare class AnnaNonEditableGenericTableComponent implements OnInit, OnC
266
273
  setInitialRowsForTable(): void;
267
274
  spotDetailsDownloadClicked(parentChildOrTotalRow: "DATAROW" | "TOTALROW", rowdata?: any): void;
268
275
  tableContainerScrolled(event: any): void;
276
+ mouseEnterOnStringTextActionType(rowData: any): void;
277
+ onClickableDataClicked(Rowdata: any, id: number): void;
269
278
  static ɵfac: i0.ɵɵFactoryDeclaration<AnnaNonEditableGenericTableComponent, never>;
270
- static ɵcmp: i0.ɵɵComponentDeclaration<AnnaNonEditableGenericTableComponent, "anna-core-non-editable-generic-table-lib", never, { "showSkeletonLoading": "showSkeletonLoading"; "tableHeaders": "tableHeaders"; "tableData": "tableData"; "clonedTableData": "clonedTableData"; "numberOfSkeletonRows": "numberOfSkeletonRows"; "numberOfSkeletonColumns": "numberOfSkeletonColumns"; "gtGeneralConfig": "gtGeneralConfig"; "totalRowInfo": "totalRowInfo"; "gtDimension": "gtDimension"; "tableClass": "tableClass"; "maximumRowsWhichCanBeRenderedWithoutScroll": "maximumRowsWhichCanBeRenderedWithoutScroll"; "limit": "limit"; "includeBorderInTableHeight": "includeBorderInTableHeight"; "downloadInProgress": "downloadInProgress"; "percentDone": "percentDone"; "starredInProgress": "starredInProgress"; }, { "toggleCheckbox": "toggleCheckbox"; "toggleRowCheckbox": "toggleRowCheckbox"; "toggleHeaderCheckbox": "toggleHeaderCheckbox"; "undoIconClicked": "undoIconClicked"; "filterAppliedToTable": "filterAppliedToTable"; "sortingAppliedToTable": "sortingAppliedToTable"; "rowClicked": "rowClicked"; "radioButtonSelected": "radioButtonSelected"; "columnFilterOpened": "columnFilterOpened"; "columnFilterClosed": "columnFilterClosed"; "gtIconClicked": "gtIconClicked"; "gtSVGIconClicked": "gtSVGIconClicked"; "gtTextActionClicked": "gtTextActionClicked"; "gtViewDetailClicked": "gtViewDetailClicked"; "downloadSpotDetails": "downloadSpotDetails"; }, never, never>;
279
+ static ɵcmp: i0.ɵɵComponentDeclaration<AnnaNonEditableGenericTableComponent, "anna-core-non-editable-generic-table-lib", never, { "showSkeletonLoading": "showSkeletonLoading"; "tableHeaders": "tableHeaders"; "tableData": "tableData"; "clonedTableData": "clonedTableData"; "numberOfSkeletonRows": "numberOfSkeletonRows"; "numberOfSkeletonColumns": "numberOfSkeletonColumns"; "gtGeneralConfig": "gtGeneralConfig"; "totalRowInfo": "totalRowInfo"; "gtDimension": "gtDimension"; "tableClass": "tableClass"; "maximumRowsWhichCanBeRenderedWithoutScroll": "maximumRowsWhichCanBeRenderedWithoutScroll"; "limit": "limit"; "includeBorderInTableHeight": "includeBorderInTableHeight"; "downloadInProgress": "downloadInProgress"; "percentDone": "percentDone"; "starredInProgress": "starredInProgress"; "clickableRow": "clickableRow"; }, { "toggleCheckbox": "toggleCheckbox"; "toggleRowCheckbox": "toggleRowCheckbox"; "toggleHeaderCheckbox": "toggleHeaderCheckbox"; "undoIconClicked": "undoIconClicked"; "filterAppliedToTable": "filterAppliedToTable"; "sortingAppliedToTable": "sortingAppliedToTable"; "rowClicked": "rowClicked"; "radioButtonSelected": "radioButtonSelected"; "columnFilterOpened": "columnFilterOpened"; "columnFilterClosed": "columnFilterClosed"; "gtIconClicked": "gtIconClicked"; "gtSVGIconClicked": "gtSVGIconClicked"; "gtTextActionClicked": "gtTextActionClicked"; "gtViewDetailClicked": "gtViewDetailClicked"; "downloadSpotDetails": "downloadSpotDetails"; "clickableDataClicked": "clickableDataClicked"; }, never, never>;
271
280
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@annalib/anna-core",
3
- "version": "4.4.4",
3
+ "version": "4.5.0",
4
4
  "peerDependencies": {
5
5
  "@angular-slider/ngx-slider": "2.0.3",
6
6
  "@angular/common": "^13.2.0",
@@ -8,7 +8,7 @@
8
8
  "@angular/material": "^13.2.6",
9
9
  "@ng-bootstrap/ng-bootstrap": "^9.0.1",
10
10
  "lodash-es": "^4.17.21",
11
- "dayjs": "^1.11.6",
11
+ "moment": "^2.24.0",
12
12
  "ngx-skeleton-loader": "^2.10.1",
13
13
  "ng-circle-progress": "^1.6.0"
14
14
  },
package/public-api.d.ts CHANGED
@@ -11,7 +11,6 @@ export * from "./lib/anna-core-shared-lib/services/anna-global-config.service";
11
11
  export * from "./lib/anna-core-shared-lib/services/anna-filter.service";
12
12
  export * from "./lib/anna-core-shared-lib/services/anna-sort.service";
13
13
  export * from "./lib/anna-core-shared-lib/services/anna-generic-table.service";
14
- export * from "./lib/anna-core-shared-lib/services/anna-number-format.service";
15
14
  export * from "./lib/anna-core-shared-lib/models/anna-generic-data-type.model";
16
15
  export * from "./lib/anna-core-shared-lib/models/anna-global-dropdown-config.model";
17
16
  export * from "./lib/anna-core-shared-lib/models/anna-non-editable-gt-models";
@@ -23,7 +22,6 @@ export * from "./lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined
23
22
  export * from "./lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe";
24
23
  export * from "./lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe";
25
24
  export * from "./lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive";
26
- export * from './lib/anna-core-shared-lib/directives/digits-only/digits-only.directive';
27
25
  export * from "./lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component";
28
26
  export * from "./lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component";
29
27
  export * from "./lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component";
@@ -0,0 +1,25 @@
1
+ @mixin common-bootstrap-tooltip() {
2
+ opacity: 1 !important;
3
+ .tooltip-inner {
4
+ color: #4a4a4a;
5
+ text-align: left;
6
+ padding: 8px !important;
7
+ border-radius: $fs-2;
8
+ background: white !important;
9
+ box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.3), 0 2px 2px 0 rgba(0, 0, 0, 0.2);
10
+ @include fonts(Roboto, 12px, normal, normal, normal, normal, normal);
11
+ }
12
+
13
+ &.bs-tooltip-top .arrow::before {
14
+ border-top: 6px solid white
15
+ }
16
+ &.bs-tooltip-left .arrow::before {
17
+ border-left:6px solid white
18
+ }
19
+ &.bs-tooltip-bottom .arrow::before {
20
+ border-bottom: 6px solid white
21
+ }
22
+ &.bs-tooltip-right .arrow::before {
23
+ border-right:5px solid white
24
+ }
25
+ }
@@ -0,0 +1,59 @@
1
+ @mixin no-data-to-display-gt($tableHeight, $rowHeight, $noDataMarginTop) {
2
+ .table-container {
3
+ height: calc($tableHeight) !important;
4
+ table {
5
+ tbody {
6
+ border-top: none;
7
+ border-left: 1px solid #d3d3d3;
8
+ border-right: 1px solid #d3d3d3;
9
+ border-bottom: 1px solid #d3d3d3;
10
+
11
+ tr.no-border-tr:first-of-type {
12
+ height: $rowHeight !important;
13
+
14
+ td {
15
+ box-shadow: none !important;
16
+ }
17
+ }
18
+
19
+ tr:nth-child(n+1) {
20
+ td {
21
+ box-shadow: none !important;
22
+ }
23
+ }
24
+ }
25
+ }
26
+ }
27
+
28
+ .no-data {
29
+ margin-top: $noDataMarginTop !important;
30
+ }
31
+ }
32
+
33
+ @mixin resetFilterStyle() {
34
+ padding: 0;
35
+ border: none;
36
+ display: block;
37
+ text-align: right;
38
+ margin-left: auto;
39
+ background-color: white;
40
+ text-decoration: underline;
41
+ color: #268bff;
42
+ border: none;
43
+ &:hover:enabled {
44
+ color: #4a4a4a;
45
+ }
46
+ &:disabled {
47
+ color: #4a4a4a;
48
+ opacity: 0.5;
49
+ cursor: not-allowed;
50
+ }
51
+ }
52
+
53
+ @mixin table-ellipses {
54
+ div {
55
+ text-overflow: ellipsis !important;
56
+ overflow: hidden !important;
57
+ white-space:nowrap !important;
58
+ }
59
+ }
@@ -1,282 +0,0 @@
1
- import { Directive, ElementRef, HostListener, Input, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DigitOnlyDirective {
4
- constructor(el) {
5
- this.el = el;
6
- this.hasDecimalPoint = false;
7
- this.hasNegativeSign = false;
8
- this.navigationKeys = [
9
- 'Backspace',
10
- 'Delete',
11
- 'Tab',
12
- 'Escape',
13
- 'Enter',
14
- 'Home',
15
- 'End',
16
- 'ArrowLeft',
17
- 'ArrowRight',
18
- 'Clear',
19
- 'Copy',
20
- 'Paste',
21
- ];
22
- this.decimal = false;
23
- this.decimalSeparator = '.';
24
- this.allowNegatives = false;
25
- this.allowPaste = true;
26
- this.negativeSign = '-';
27
- this.min = -Infinity;
28
- this.max = Infinity;
29
- this.regex = null;
30
- this.inputElement = el.nativeElement;
31
- }
32
- ngOnChanges(changes) {
33
- if (changes['pattern']) {
34
- this.regex = this.pattern ? RegExp(this.pattern) : null;
35
- }
36
- if (changes['min']) {
37
- const maybeMin = Number(this.min);
38
- this.min = isNaN(maybeMin) ? -Infinity : maybeMin;
39
- }
40
- if (changes['max']) {
41
- const maybeMax = Number(this.max);
42
- this.max = isNaN(maybeMax) ? Infinity : maybeMax;
43
- }
44
- }
45
- onBeforeInput(e) {
46
- if (isNaN(Number(e.data))) {
47
- if (e.data === this.decimalSeparator ||
48
- (e.data === this.negativeSign && this.allowNegatives)) {
49
- return; // go on
50
- }
51
- e.preventDefault();
52
- e.stopPropagation();
53
- }
54
- }
55
- onKeyDown(e) {
56
- console.log("called");
57
- if (this.navigationKeys.indexOf(e.key) > -1 || // Allow: navigation keys: backspace, delete, arrows etc.
58
- ((e.key === 'a' || e.code === 'KeyA') && e.ctrlKey === true) || // Allow: Ctrl+A
59
- ((e.key === 'c' || e.code === 'KeyC') && e.ctrlKey === true) || // Allow: Ctrl+C
60
- ((e.key === 'v' || e.code === 'KeyV') && e.ctrlKey === true) || // Allow: Ctrl+V
61
- ((e.key === 'x' || e.code === 'KeyX') && e.ctrlKey === true) || // Allow: Ctrl+X
62
- ((e.key === 'a' || e.code === 'KeyA') && e.metaKey === true) || // Allow: Cmd+A (Mac)
63
- ((e.key === 'c' || e.code === 'KeyC') && e.metaKey === true) || // Allow: Cmd+C (Mac)
64
- ((e.key === 'v' || e.code === 'KeyV') && e.metaKey === true) || // Allow: Cmd+V (Mac)
65
- ((e.key === 'x' || e.code === 'KeyX') && e.metaKey === true) // Allow: Cmd+X (Mac)
66
- ) {
67
- // let it happen, don't do anything
68
- return;
69
- }
70
- let newValue = '';
71
- if (this.decimal && e.key === this.decimalSeparator) {
72
- newValue = this.forecastValue(e.key);
73
- if (newValue.split(this.decimalSeparator).length > 2) {
74
- // has two or more decimal points
75
- e.preventDefault();
76
- return;
77
- }
78
- else {
79
- this.hasDecimalPoint = newValue.indexOf(this.decimalSeparator) > -1;
80
- return; // Allow: only one decimal point
81
- }
82
- }
83
- if (e.key === this.negativeSign && this.allowNegatives) {
84
- newValue = this.forecastValue(e.key);
85
- if (newValue.charAt(0) !== this.negativeSign ||
86
- newValue.split(this.negativeSign).length > 2) {
87
- e.preventDefault();
88
- return;
89
- }
90
- else {
91
- this.hasNegativeSign = newValue.split(this.negativeSign).length > -1;
92
- return;
93
- }
94
- }
95
- // Ensure that it is a number and stop the keypress
96
- if (e.key === ' ' || isNaN(Number(e.key))) {
97
- e.preventDefault();
98
- return;
99
- }
100
- newValue = newValue || this.forecastValue(e.key);
101
- // check the input pattern RegExp
102
- if (this.regex) {
103
- if (!this.regex.test(newValue)) {
104
- e.preventDefault();
105
- return;
106
- }
107
- }
108
- const newNumber = Number(newValue);
109
- if (newNumber > this.max || newNumber < this.min) {
110
- e.preventDefault();
111
- }
112
- }
113
- onPaste(event) {
114
- if (this.allowPaste === true) {
115
- let pastedInput = '';
116
- if (window['clipboardData']) {
117
- // Browser is IE
118
- pastedInput = window['clipboardData'].getData('text');
119
- }
120
- else if (event.clipboardData && event.clipboardData.getData) {
121
- // Other browsers
122
- pastedInput = event.clipboardData.getData('text/plain');
123
- }
124
- this.pasteData(pastedInput);
125
- event.preventDefault();
126
- }
127
- else {
128
- // this prevents the paste
129
- event.preventDefault();
130
- event.stopPropagation();
131
- }
132
- }
133
- onDrop(event) {
134
- const textData = event.dataTransfer?.getData('text') ?? '';
135
- this.inputElement.focus();
136
- this.pasteData(textData);
137
- event.preventDefault();
138
- }
139
- pasteData(pastedContent) {
140
- const sanitizedContent = this.sanitizeInput(pastedContent);
141
- if (sanitizedContent.includes(this.negativeSign) &&
142
- this.hasNegativeSign &&
143
- !this.getSelection().includes(this.negativeSign)) {
144
- return;
145
- }
146
- const pasted = document.execCommand('insertText', false, sanitizedContent);
147
- if (!pasted) {
148
- if (this.inputElement.setRangeText) {
149
- const { selectionStart: start, selectionEnd: end } = this.inputElement;
150
- this.inputElement.setRangeText(sanitizedContent, start ?? 0, end ?? 0, 'end');
151
- // Angular's Reactive Form relies on "input" event, but on Firefox, the setRangeText method doesn't trigger it
152
- // so we have to trigger it ourself.
153
- if (typeof window['InstallTrigger'] !==
154
- 'undefined') {
155
- this.inputElement.dispatchEvent(new Event('input', { cancelable: true }));
156
- }
157
- }
158
- else {
159
- // Browser does not support setRangeText, e.g. IE
160
- this.insertAtCursor(this.inputElement, sanitizedContent);
161
- }
162
- }
163
- if (this.decimal) {
164
- this.hasDecimalPoint =
165
- this.inputElement.value.indexOf(this.decimalSeparator) > -1;
166
- }
167
- this.hasNegativeSign =
168
- this.inputElement.value.indexOf(this.negativeSign) > -1;
169
- }
170
- // The following 2 methods were added from the below article for browsers that do not support setRangeText
171
- // https://stackoverflow.com/questions/11076975/how-to-insert-text-into-the-textarea-at-the-current-cursor-position
172
- insertAtCursor(myField, myValue) {
173
- const startPos = myField.selectionStart ?? 0;
174
- const endPos = myField.selectionEnd ?? 0;
175
- myField.value =
176
- myField.value.substring(0, startPos) +
177
- myValue +
178
- myField.value.substring(endPos, myField.value.length);
179
- const pos = startPos + myValue.length;
180
- myField.focus();
181
- myField.setSelectionRange(pos, pos);
182
- this.triggerEvent(myField, 'input');
183
- }
184
- triggerEvent(el, type) {
185
- if ('createEvent' in document) {
186
- // modern browsers, IE9+
187
- const e = document.createEvent('HTMLEvents');
188
- e.initEvent(type, false, true);
189
- el.dispatchEvent(e);
190
- }
191
- }
192
- // end stack overflow code
193
- sanitizeInput(input) {
194
- let result = '';
195
- let regex;
196
- if (this.decimal && this.isValidDecimal(input)) {
197
- regex = new RegExp(`${this.getNegativeSignRegExp()}[^0-9${this.decimalSeparator}]`, 'g');
198
- }
199
- else {
200
- regex = new RegExp(`${this.getNegativeSignRegExp()}[^0-9]`, 'g');
201
- }
202
- result = input.replace(regex, '');
203
- const maxLength = this.inputElement.maxLength;
204
- if (maxLength > 0) {
205
- // the input element has maxLength limit
206
- const allowedLength = maxLength -
207
- this.inputElement.value.length +
208
- (result.includes(`${this.negativeSign}`) ? 1 : 0);
209
- result = allowedLength > 0 ? result.substring(0, allowedLength) : '';
210
- }
211
- return result;
212
- }
213
- getNegativeSignRegExp() {
214
- return this.allowNegatives &&
215
- (!this.hasNegativeSign || this.getSelection().includes(this.negativeSign))
216
- ? `(?!^${this.negativeSign})`
217
- : '';
218
- }
219
- isValidDecimal(string) {
220
- if (!this.hasDecimalPoint) {
221
- return string.split(this.decimalSeparator).length <= 2;
222
- }
223
- else {
224
- // the input element already has a decimal separator
225
- const selectedText = this.getSelection();
226
- if (selectedText && selectedText.indexOf(this.decimalSeparator) > -1) {
227
- return string.split(this.decimalSeparator).length <= 2;
228
- }
229
- else {
230
- return string.indexOf(this.decimalSeparator) < 0;
231
- }
232
- }
233
- }
234
- getSelection() {
235
- return this.inputElement.value.substring(this.inputElement.selectionStart ?? 0, this.inputElement.selectionEnd ?? 0);
236
- }
237
- forecastValue(key) {
238
- const selectionStart = this.inputElement.selectionStart ?? 0;
239
- const selectionEnd = this.inputElement.selectionEnd ?? 0;
240
- const oldValue = this.inputElement.value;
241
- return (oldValue.substring(0, selectionStart) +
242
- key +
243
- oldValue.substring(selectionEnd));
244
- }
245
- }
246
- DigitOnlyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DigitOnlyDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
247
- DigitOnlyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: DigitOnlyDirective, selector: "[digitOnly]", inputs: { decimal: "decimal", decimalSeparator: "decimalSeparator", allowNegatives: "allowNegatives", allowPaste: "allowPaste", negativeSign: "negativeSign", min: "min", max: "max", pattern: "pattern" }, host: { listeners: { "beforeinput": "onBeforeInput($event)", "keydown": "onKeyDown($event)", "paste": "onPaste($event)", "drop": "onDrop($event)" } }, usesOnChanges: true, ngImport: i0 });
248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DigitOnlyDirective, decorators: [{
249
- type: Directive,
250
- args: [{
251
- selector: '[digitOnly]',
252
- }]
253
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { decimal: [{
254
- type: Input
255
- }], decimalSeparator: [{
256
- type: Input
257
- }], allowNegatives: [{
258
- type: Input
259
- }], allowPaste: [{
260
- type: Input
261
- }], negativeSign: [{
262
- type: Input
263
- }], min: [{
264
- type: Input
265
- }], max: [{
266
- type: Input
267
- }], pattern: [{
268
- type: Input
269
- }], onBeforeInput: [{
270
- type: HostListener,
271
- args: ['beforeinput', ['$event']]
272
- }], onKeyDown: [{
273
- type: HostListener,
274
- args: ['keydown', ['$event']]
275
- }], onPaste: [{
276
- type: HostListener,
277
- args: ['paste', ['$event']]
278
- }], onDrop: [{
279
- type: HostListener,
280
- args: ['drop', ['$event']]
281
- }] } });
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnaXRzLW9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5uYS1jb3JlL3NyYy9saWIvYW5uYS1jb3JlLXNoYXJlZC1saWIvZGlyZWN0aXZlcy9kaWdpdHMtb25seS9kaWdpdHMtb25seS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQzs7QUFLdkIsTUFBTSxPQUFPLGtCQUFrQjtJQTZCN0IsWUFBbUIsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUE1QnpCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLG1CQUFjLEdBQUc7WUFDdkIsV0FBVztZQUNYLFFBQVE7WUFDUixLQUFLO1lBQ0wsUUFBUTtZQUNSLE9BQU87WUFDUCxNQUFNO1lBQ04sS0FBSztZQUNMLFdBQVc7WUFDWCxZQUFZO1lBQ1osT0FBTztZQUNQLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQztRQUVPLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIscUJBQWdCLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsUUFBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2hCLFFBQUcsR0FBRyxRQUFRLENBQUM7UUFFaEIsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFJbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDekQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1NBQ25EO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBR0QsYUFBYSxDQUFDLENBQWE7UUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsZ0JBQWdCO2dCQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQ3JEO2dCQUNBLE9BQU8sQ0FBQyxRQUFRO2FBQ2pCO1lBQ0QsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFHRCxTQUFTLENBQUMsQ0FBZ0I7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixJQUNFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSx5REFBeUQ7WUFDcEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxnQkFBZ0I7WUFDaEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxnQkFBZ0I7WUFDaEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxnQkFBZ0I7WUFDaEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxnQkFBZ0I7WUFDaEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxxQkFBcUI7WUFDckYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxxQkFBcUI7WUFDckYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJ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QUFRLEVBQUUsYUFBYTtpQkFDeEI7aUdBbUJVLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBeUJOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZXZDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBb0VuQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdCakMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAgXHJcbiAgQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tkaWdpdE9ubHldJyxcclxuICB9KVxyXG4gIGV4cG9ydCBjbGFzcyBEaWdpdE9ubHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICAgcHJpdmF0ZSBoYXNEZWNpbWFsUG9pbnQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaGFzTmVnYXRpdmVTaWduID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlzID0gW1xyXG4gICAgICAnQmFja3NwYWNlJyxcclxuICAgICAgJ0RlbGV0ZScsXHJcbiAgICAgICdUYWInLFxyXG4gICAgICAnRXNjYXBlJyxcclxuICAgICAgJ0VudGVyJyxcclxuICAgICAgJ0hvbWUnLFxyXG4gICAgICAnRW5kJyxcclxuICAgICAgJ0Fycm93TGVmdCcsXHJcbiAgICAgICdBcnJvd1JpZ2h0JyxcclxuICAgICAgJ0NsZWFyJyxcclxuICAgICAgJ0NvcHknLFxyXG4gICAgICAnUGFzdGUnLFxyXG4gICAgXTtcclxuICBcclxuICAgIEBJbnB1dCgpIGRlY2ltYWwgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRlY2ltYWxTZXBhcmF0b3IgPSAnLic7XHJcbiAgICBASW5wdXQoKSBhbGxvd05lZ2F0aXZlcyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgYWxsb3dQYXN0ZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBuZWdhdGl2ZVNpZ24gPSAnLSc7XHJcbiAgICBASW5wdXQoKSBtaW4gPSAtSW5maW5pdHk7XHJcbiAgICBASW5wdXQoKSBtYXggPSBJbmZpbml0eTtcclxuICAgIEBJbnB1dCgpIHBhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XHJcbiAgICBwcml2YXRlIHJlZ2V4OiBSZWdFeHAgfCBudWxsID0gbnVsbDtcclxuICAgIGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudDtcclxuICBcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLmlucHV0RWxlbWVudCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWydwYXR0ZXJuJ10pIHtcclxuICAgICAgICB0aGlzLnJlZ2V4ID0gdGhpcy5wYXR0ZXJuID8gUmVnRXhwKHRoaXMucGF0dGVybikgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGlmIChjaGFuZ2VzWydtaW4nXSkge1xyXG4gICAgICAgIGNvbnN0IG1heWJlTWluID0gTnVtYmVyKHRoaXMubWluKTtcclxuICAgICAgICB0aGlzLm1pbiA9IGlzTmFOKG1heWJlTWluKSA/IC1JbmZpbml0eSA6IG1heWJlTWluO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGlmIChjaGFuZ2VzWydtYXgnXSkge1xyXG4gICAgICAgIGNvbnN0IG1heWJlTWF4ID0gTnVtYmVyKHRoaXMubWF4KTtcclxuICAgICAgICB0aGlzLm1heCA9IGlzTmFOKG1heWJlTWF4KSA/IEluZmluaXR5IDogbWF5YmVNYXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2JlZm9yZWlucHV0JywgWyckZXZlbnQnXSlcclxuICAgIG9uQmVmb3JlSW5wdXQoZTogSW5wdXRFdmVudCk6IGFueSB7XHJcbiAgICAgIGlmIChpc05hTihOdW1iZXIoZS5kYXRhKSkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlLmRhdGEgPT09IHRoaXMuZGVjaW1hbFNlcGFyYXRvciB8fFxyXG4gICAgICAgICAgKGUuZGF0YSA9PT0gdGhpcy5uZWdhdGl2ZVNpZ24gJiYgdGhpcy5hbGxvd05lZ2F0aXZlcylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybjsgLy8gZ28gb25cclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiBhbnkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY2FsbGVkXCIpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uS2V5cy5pbmRleE9mKGUua2V5KSA+IC0xIHx8IC8vIEFsbG93OiBuYXZpZ2F0aW9uIGtleXM6IGJhY2tzcGFjZSwgZGVsZXRlLCBhcnJvd3MgZXRjLlxyXG4gICAgICAgICgoZS5rZXkgPT09ICdhJyB8fCBlLmNvZGUgPT09ICdLZXlBJykgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ3RybCtBXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ2MnIHx8IGUuY29kZSA9PT0gJ0tleUMnKSAmJiBlLmN0cmxLZXkgPT09IHRydWUpIHx8IC8vIEFsbG93OiBDdHJsK0NcclxuICAgICAgICAoKGUua2V5ID09PSAndicgfHwgZS5jb2RlID09PSAnS2V5VicpICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgLy8gQWxsb3c6IEN0cmwrVlxyXG4gICAgICAgICgoZS5rZXkgPT09ICd4JyB8fCBlLmNvZGUgPT09ICdLZXlYJykgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ3RybCtYXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ2EnIHx8IGUuY29kZSA9PT0gJ0tleUEnKSAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8IC8vIEFsbG93OiBDbWQrQSAoTWFjKVxyXG4gICAgICAgICgoZS5rZXkgPT09ICdjJyB8fCBlLmNvZGUgPT09ICdLZXlDJykgJiYgZS5tZXRhS2V5ID09PSB0cnVlKSB8fCAvLyBBbGxvdzogQ21kK0MgKE1hYylcclxuICAgICAgICAoKGUua2V5ID09PSAndicgfHwgZS5jb2RlID09PSAnS2V5VicpICYmIGUubWV0YUtleSA9PT0gdHJ1ZSkgfHwgLy8gQWxsb3c6IENtZCtWIChNYWMpXHJcbiAgICAgICAgKChlLmtleSA9PT0gJ3gnIHx8IGUuY29kZSA9PT0gJ0tleVgnKSAmJiBlLm1ldGFLZXkgPT09IHRydWUpIC8vIEFsbG93OiBDbWQrWCAoTWFjKVxyXG4gICAgICApIHtcclxuICAgICAgICAvLyBsZXQgaXQgaGFwcGVuLCBkb24ndCBkbyBhbnl0aGluZ1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBsZXQgbmV3VmFsdWUgPSAnJztcclxuICBcclxuICAgICAgaWYgKHRoaXMuZGVjaW1hbCAmJiBlLmtleSA9PT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmZvcmVjYXN0VmFsdWUoZS5rZXkpO1xyXG4gICAgICAgIGlmIChuZXdWYWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgIC8vIGhhcyB0d28gb3IgbW9yZSBkZWNpbWFsIHBvaW50c1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxQb2ludCA9IG5ld1ZhbHVlLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKSA+IC0xO1xyXG4gICAgICAgICAgcmV0dXJuOyAvLyBBbGxvdzogb25seSBvbmUgZGVjaW1hbCBwb2ludFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAoZS5rZXkgPT09IHRoaXMubmVnYXRpdmVTaWduICYmIHRoaXMuYWxsb3dOZWdhdGl2ZXMpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZm9yZWNhc3RWYWx1ZShlLmtleSk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgbmV3VmFsdWUuY2hhckF0KDApICE9PSB0aGlzLm5lZ2F0aXZlU2lnbiB8fFxyXG4gICAgICAgICAgbmV3VmFsdWUuc3BsaXQodGhpcy5uZWdhdGl2ZVNpZ24pLmxlbmd0aCA+IDJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5oYXNOZWdhdGl2ZVNpZ24gPSBuZXdWYWx1ZS5zcGxpdCh0aGlzLm5lZ2F0aXZlU2lnbikubGVuZ3RoID4gLTE7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIEVuc3VyZSB0aGF0IGl0IGlzIGEgbnVtYmVyIGFuZCBzdG9wIHRoZSBrZXlwcmVzc1xyXG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyB8fCBpc05hTihOdW1iZXIoZS5rZXkpKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSB8fCB0aGlzLmZvcmVjYXN0VmFsdWUoZS5rZXkpO1xyXG4gICAgICAvLyBjaGVjayB0aGUgaW5wdXQgcGF0dGVybiBSZWdFeHBcclxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVnZXgudGVzdChuZXdWYWx1ZSkpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgY29uc3QgbmV3TnVtYmVyID0gTnVtYmVyKG5ld1ZhbHVlKTtcclxuICAgICAgaWYgKG5ld051bWJlciA+IHRoaXMubWF4IHx8IG5ld051bWJlciA8IHRoaXMubWluKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvblBhc3RlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgaWYgKHRoaXMuYWxsb3dQYXN0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBwYXN0ZWRJbnB1dDogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKCh3aW5kb3cgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlbJ2NsaXBib2FyZERhdGEnXSkge1xyXG4gICAgICAgICAgLy8gQnJvd3NlciBpcyBJRVxyXG4gICAgICAgICAgcGFzdGVkSW5wdXQgPSAod2luZG93IGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pW1xyXG4gICAgICAgICAgICAnY2xpcGJvYXJkRGF0YSdcclxuICAgICAgICAgIF0uZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2xpcGJvYXJkRGF0YSAmJiBldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEpIHtcclxuICAgICAgICAgIC8vIE90aGVyIGJyb3dzZXJzXHJcbiAgICAgICAgICBwYXN0ZWRJbnB1dCA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICB0aGlzLnBhc3RlRGF0YShwYXN0ZWRJbnB1dCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBwYXN0ZVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxyXG4gICAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgdGV4dERhdGEgPSBldmVudC5kYXRhVHJhbnNmZXI/LmdldERhdGEoJ3RleHQnKSA/PyAnJztcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgdGhpcy5wYXN0ZURhdGEodGV4dERhdGEpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBwYXN0ZURhdGEocGFzdGVkQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplSW5wdXQocGFzdGVkQ29udGVudCk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBzYW5pdGl6ZWRDb250ZW50LmluY2x1ZGVzKHRoaXMubmVnYXRpdmVTaWduKSAmJlxyXG4gICAgICAgIHRoaXMuaGFzTmVnYXRpdmVTaWduICYmXHJcbiAgICAgICAgIXRoaXMuZ2V0U2VsZWN0aW9uKCkuaW5jbHVkZXModGhpcy5uZWdhdGl2ZVNpZ24pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYXN0ZWQgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCBzYW5pdGl6ZWRDb250ZW50KTtcclxuICAgICAgaWYgKCFwYXN0ZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnB1dEVsZW1lbnQuc2V0UmFuZ2VUZXh0KSB7XHJcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0OiBzdGFydCwgc2VsZWN0aW9uRW5kOiBlbmQgfSA9IHRoaXMuaW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2V0UmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICBzYW5pdGl6ZWRDb250ZW50LFxyXG4gICAgICAgICAgICBzdGFydCA/PyAwLFxyXG4gICAgICAgICAgICBlbmQgPz8gMCxcclxuICAgICAgICAgICAgJ2VuZCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyBBbmd1bGFyJ3MgUmVhY3RpdmUgRm9ybSByZWxpZXMgb24gXCJpbnB1dFwiIGV2ZW50LCBidXQgb24gRmlyZWZveCwgdGhlIHNldFJhbmdlVGV4dCBtZXRob2QgZG9lc24ndCB0cmlnZ2VyIGl0XHJcbiAgICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHRyaWdnZXIgaXQgb3Vyc2VsZi5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mICh3aW5kb3cgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlbJ0luc3RhbGxUcmlnZ2VyJ10gIT09XHJcbiAgICAgICAgICAgICd1bmRlZmluZWQnXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChcclxuICAgICAgICAgICAgICBuZXcgRXZlbnQoJ2lucHV0JywgeyBjYW5jZWxhYmxlOiB0cnVlIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBzZXRSYW5nZVRleHQsIGUuZy4gSUVcclxuICAgICAgICAgIHRoaXMuaW5zZXJ0QXRDdXJzb3IodGhpcy5pbnB1dEVsZW1lbnQsIHNhbml0aXplZENvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kZWNpbWFsKSB7XHJcbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsUG9pbnQgPVxyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUuaW5kZXhPZih0aGlzLmRlY2ltYWxTZXBhcmF0b3IpID4gLTE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYXNOZWdhdGl2ZVNpZ24gPVxyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLmluZGV4T2YodGhpcy5uZWdhdGl2ZVNpZ24pID4gLTE7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBUaGUgZm9sbG93aW5nIDIgbWV0aG9kcyB3ZXJlIGFkZGVkIGZyb20gdGhlIGJlbG93IGFydGljbGUgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc2V0UmFuZ2VUZXh0XHJcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTA3Njk3NS9ob3ctdG8taW5zZXJ0LXRleHQtaW50by10aGUtdGV4dGFyZWEtYXQtdGhlLWN1cnJlbnQtY3Vyc29yLXBvc2l0aW9uXHJcbiAgICBwcml2YXRlIGluc2VydEF0Q3Vyc29yKG15RmllbGQ6IEhUTUxJbnB1dEVsZW1lbnQsIG15VmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICBjb25zdCBzdGFydFBvcyA9IG15RmllbGQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcclxuICAgICAgY29uc3QgZW5kUG9zID0gbXlGaWVsZC5zZWxlY3Rpb25FbmQgPz8gMDtcclxuICBcclxuICAgICAgbXlGaWVsZC52YWx1ZSA9XHJcbiAgICAgICAgbXlGaWVsZC52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICtcclxuICAgICAgICBteVZhbHVlICtcclxuICAgICAgICBteUZpZWxkLnZhbHVlLnN1YnN0cmluZyhlbmRQb3MsIG15RmllbGQudmFsdWUubGVuZ3RoKTtcclxuICBcclxuICAgICAgY29uc3QgcG9zID0gc3RhcnRQb3MgKyBteVZhbHVlLmxlbmd0aDtcclxuICAgICAgbXlGaWVsZC5mb2N1cygpO1xyXG4gICAgICBteUZpZWxkLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcclxuICBcclxuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQobXlGaWVsZCwgJ2lucHV0Jyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIHRyaWdnZXJFdmVudChlbDogSFRNTElucHV0RWxlbWVudCwgdHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIGlmICgnY3JlYXRlRXZlbnQnIGluIGRvY3VtZW50KSB7XHJcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzLCBJRTkrXHJcbiAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XHJcbiAgICAgICAgZS5pbml0RXZlbnQodHlwZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGVuZCBzdGFjayBvdmVyZmxvdyBjb2RlXHJcbiAgXHJcbiAgICBwcml2YXRlIHNhbml0aXplSW5wdXQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgbGV0IHJlZ2V4O1xyXG4gICAgICBpZiAodGhpcy5kZWNpbWFsICYmIHRoaXMuaXNWYWxpZERlY2ltYWwoaW5wdXQpKSB7XHJcbiAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKFxyXG4gICAgICAgICAgYCR7dGhpcy5nZXROZWdhdGl2ZVNpZ25SZWdFeHAoKX1bXjAtOSR7dGhpcy5kZWNpbWFsU2VwYXJhdG9yfV1gLFxyXG4gICAgICAgICAgJ2cnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoYCR7dGhpcy5nZXROZWdhdGl2ZVNpZ25SZWdFeHAoKX1bXjAtOV1gLCAnZycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGlucHV0LnJlcGxhY2UocmVnZXgsICcnKTtcclxuICBcclxuICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5pbnB1dEVsZW1lbnQubWF4TGVuZ3RoO1xyXG4gICAgICBpZiAobWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBtYXhMZW5ndGggbGltaXRcclxuICAgICAgICBjb25zdCBhbGxvd2VkTGVuZ3RoID1cclxuICAgICAgICAgIG1heExlbmd0aCAtXHJcbiAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGggK1xyXG4gICAgICAgICAgKHJlc3VsdC5pbmNsdWRlcyhgJHt0aGlzLm5lZ2F0aXZlU2lnbn1gKSA/IDEgOiAwKTtcclxuICAgICAgICByZXN1bHQgPSBhbGxvd2VkTGVuZ3RoID4gMCA/IHJlc3VsdC5zdWJzdHJpbmcoMCwgYWxsb3dlZExlbmd0aCkgOiAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBnZXROZWdhdGl2ZVNpZ25SZWdFeHAoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWxsb3dOZWdhdGl2ZXMgJiZcclxuICAgICAgICAoIXRoaXMuaGFzTmVnYXRpdmVTaWduIHx8IHRoaXMuZ2V0U2VsZWN0aW9uKCkuaW5jbHVkZXModGhpcy5uZWdhdGl2ZVNpZ24pKVxyXG4gICAgICAgID8gYCg/IV4ke3RoaXMubmVnYXRpdmVTaWdufSlgXHJcbiAgICAgICAgOiAnJztcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgaXNWYWxpZERlY2ltYWwoc3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgaWYgKCF0aGlzLmhhc0RlY2ltYWxQb2ludCkge1xyXG4gICAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKS5sZW5ndGggPD0gMjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGUgaW5wdXQgZWxlbWVudCBhbHJlYWR5IGhhcyBhIGRlY2ltYWwgc2VwYXJhdG9yXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICYmIHNlbGVjdGVkVGV4dC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcikgPiAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLmxlbmd0aCA8PSAyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gc3RyaW5nLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKSA8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGdldFNlbGVjdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKFxyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID8/IDAsXHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kID8/IDBcclxuICAgICAgKTtcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgZm9yZWNhc3RWYWx1ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kID0gdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kID8/IDA7XHJcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgb2xkVmFsdWUuc3Vic3RyaW5nKDAsIHNlbGVjdGlvblN0YXJ0KSArXHJcbiAgICAgICAga2V5ICtcclxuICAgICAgICBvbGRWYWx1ZS5zdWJzdHJpbmcoc2VsZWN0aW9uRW5kKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0iXX0=