@annalib/anna-core 1.0.0 → 1.0.2
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.
- package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +6 -6
- package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +35 -0
- package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +6 -6
- package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +6 -6
- package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +6 -6
- package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +4 -4
- package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +6 -6
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +3 -2
- package/esm2020/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +281 -0
- package/esm2020/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +27 -0
- package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
- package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
- package/esm2020/lib/anna-core-shared-lib/models/anna-manage-users.model.mjs +8 -0
- package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +11 -3
- package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +7 -2
- package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +5 -3
- package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +26 -0
- package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +23 -8
- package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +25 -0
- package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +16 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +52 -34
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +165 -260
- package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +95 -8
- package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +4 -5
- package/esm2020/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +41 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +60 -0
- package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +12 -6
- package/esm2020/lib/anna-core.module.mjs +178 -0
- package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +23 -12
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +27 -23
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +1105 -580
- package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +29 -20
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +7 -7
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +5 -5
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +3 -3
- package/esm2020/public-api.mjs +48 -4
- package/fesm2015/annalib-anna-core.mjs +3989 -2922
- package/fesm2015/annalib-anna-core.mjs.map +1 -1
- package/fesm2020/annalib-anna-core.mjs +3956 -2893
- package/fesm2020/annalib-anna-core.mjs.map +1 -1
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +1 -1
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +16 -0
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +1 -1
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +1 -1
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +1 -1
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +1 -1
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +1 -1
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +2 -1
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -0
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +9 -0
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +1 -0
- package/lib/anna-core-shared-lib/models/anna-manage-users.model.d.ts +6 -0
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +44 -2
- package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +5 -0
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +4 -2
- package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -0
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +1 -1
- package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -0
- package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -0
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +2 -0
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +13 -19
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +20 -4
- package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +7 -0
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +8 -0
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +2 -0
- package/lib/anna-core.module.d.ts +36 -0
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +8 -6
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +5 -2
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +134 -27
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +8 -5
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +3 -3
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +1 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +1 -1
- package/package.json +11 -34
- package/public-api.d.ts +35 -3
- package/src/lib/anna-assets/images/bg-heads.png +0 -0
- package/src/lib/anna-common-scss/_animate.scss +27 -0
- package/src/lib/anna-common-scss/_application-spacing.scss +6 -0
- package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +25 -0
- package/src/lib/anna-common-scss/_colors.scss +107 -0
- package/src/lib/anna-common-scss/_customDropdown.scss +129 -0
- package/src/lib/anna-common-scss/_dashboard-partials.scss +104 -0
- package/src/lib/anna-common-scss/_date-picker-form.scss +87 -0
- package/src/lib/anna-common-scss/_filters.scss +641 -0
- package/src/lib/anna-common-scss/_font.scss +10 -0
- package/src/lib/anna-common-scss/_fonts.scss +86 -0
- package/src/lib/anna-common-scss/_generic-table-common.scss +112 -0
- package/src/lib/anna-common-scss/_legend.scss +11 -0
- package/src/lib/anna-common-scss/_mixins.scss +188 -0
- package/src/lib/anna-common-scss/_modal.scss +37 -0
- package/src/lib/anna-common-scss/_ng-select.scss +176 -0
- package/src/lib/anna-common-scss/_sort.scss +30 -0
- package/src/lib/anna-common-scss/_toggle.scss +84 -0
- package/src/lib/anna-common-scss/style.scss +1 -0
- package/esm2020/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +0 -59
- package/esm2020/lib/anna-core-shared-lib/index.mjs +0 -2
- package/esm2020/lib/anna-core-shared-lib/public-api.mjs +0 -26
- package/esm2020/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +0 -43
- package/esm2020/lib/anna-dropdown-lib/index.mjs +0 -2
- package/esm2020/lib/anna-dropdown-lib/public-api.mjs +0 -6
- package/esm2020/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +0 -86
- package/esm2020/lib/anna-generic-table-lib/index.mjs +0 -2
- package/esm2020/lib/anna-generic-table-lib/public-api.mjs +0 -10
- package/esm2020/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +0 -59
- package/esm2020/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -5
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -15
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -21
- package/esm2020/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
- package/esm2020/src/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -34
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -3
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-sort.model.mjs +0 -2
- package/esm2020/src/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +0 -28
- package/esm2020/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -31
- package/esm2020/src/lib/anna-core-shared-lib/public-api.mjs +0 -26
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -180
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -588
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -48
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -133
- package/esm2020/src/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -145
- package/esm2020/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +0 -43
- package/esm2020/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -5
- package/esm2020/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -90
- package/esm2020/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -360
- package/esm2020/src/lib/anna-dropdown-lib/public-api.mjs +0 -6
- package/esm2020/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +0 -86
- package/esm2020/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -5
- package/esm2020/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -1392
- package/esm2020/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -55
- package/esm2020/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -189
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +0 -2
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
- package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +0 -2
- package/esm2020/src/lib/anna-generic-table-lib/public-api.mjs +0 -10
- package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -1307
- package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +0 -1
- package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -486
- package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +0 -1
- package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -2222
- package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +0 -1
- package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -1307
- package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +0 -1
- package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -484
- package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +0 -1
- package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -2221
- package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +0 -1
- package/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +0 -14
- package/lib/anna-core-shared-lib/index.d.ts +0 -1
- package/lib/anna-core-shared-lib/public-api.d.ts +0 -19
- package/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +0 -11
- package/lib/anna-dropdown-lib/index.d.ts +0 -1
- package/lib/anna-dropdown-lib/public-api.d.ts +0 -3
- package/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +0 -21
- package/lib/anna-generic-table-lib/index.d.ts +0 -1
- package/lib/anna-generic-table-lib/public-api.d.ts +0 -6
- package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +0 -14
- package/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.d.ts +0 -5
- package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +0 -8
- package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +0 -8
- package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +0 -11
- package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +0 -8
- package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +0 -11
- package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +0 -8
- package/src/lib/anna-core-shared-lib/constants/shared.constant.d.ts +0 -32
- package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +0 -8
- package/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +0 -95
- package/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +0 -70
- package/src/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +0 -6
- package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +0 -23
- package/src/lib/anna-core-shared-lib/package.json +0 -10
- package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +0 -9
- package/src/lib/anna-core-shared-lib/public-api.d.ts +0 -19
- package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +0 -25
- package/src/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +0 -80
- package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +0 -14
- package/src/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +0 -21
- package/src/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +0 -14
- package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +0 -11
- package/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.d.ts +0 -5
- package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +0 -32
- package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +0 -67
- package/src/lib/anna-dropdown-lib/package.json +0 -10
- package/src/lib/anna-dropdown-lib/public-api.d.ts +0 -3
- package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +0 -21
- package/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.d.ts +0 -5
- package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +0 -191
- package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +0 -14
- package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +0 -141
- package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +0 -89
- package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +0 -1
- package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +0 -45
- package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +0 -1
- package/src/lib/anna-generic-table-lib/package.json +0 -10
- package/src/lib/anna-generic-table-lib/public-api.d.ts +0 -6
- /package/{annalib-anna-core.d.ts → index.d.ts} +0 -0
|
@@ -1,588 +0,0 @@
|
|
|
1
|
-
import { Injectable } from "@angular/core";
|
|
2
|
-
// Third party import statements
|
|
3
|
-
import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from "lodash-es";
|
|
4
|
-
import moment from "moment";
|
|
5
|
-
// User defined import statements
|
|
6
|
-
import { AllSelectedStatus, tooltipModelForColumnLevelFiltering } from "../models/anna-tooltip.model";
|
|
7
|
-
import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "./anna-date-time-format.service";
|
|
10
|
-
export class AnnaFilterService {
|
|
11
|
-
constructor(dateTimeFormatService) {
|
|
12
|
-
this.dateTimeFormatService = dateTimeFormatService;
|
|
13
|
-
this.tooltipMap = new Map();
|
|
14
|
-
this.tooltipSelectedMap = new Map();
|
|
15
|
-
this.appliedFiltersArray = [];
|
|
16
|
-
this.sliderCurrencySet = new Set(["booked", "cpp", "cpm", "rcvPreempt", "osPreempt", "postedAdu", "scheduledAdu", "audienceDeficit", "Rate"]);
|
|
17
|
-
this.percentTranslateFunction = (data) => {
|
|
18
|
-
const val = data.toFixed(1) + "%";
|
|
19
|
-
return val;
|
|
20
|
-
};
|
|
21
|
-
this.currencyTranslateFunction = (data) => {
|
|
22
|
-
if (data >= 1000) {
|
|
23
|
-
const val = (data / 1000).toFixed(1) + "k";
|
|
24
|
-
return "$" + val;
|
|
25
|
-
}
|
|
26
|
-
else if (data != Math.floor(data)) {
|
|
27
|
-
return data.toFixed(1).toString();
|
|
28
|
-
}
|
|
29
|
-
return "$" + data;
|
|
30
|
-
};
|
|
31
|
-
this.normalTranslateFunction = (data) => {
|
|
32
|
-
if (data >= 1000) {
|
|
33
|
-
const val = (data / 1000).toFixed(1) + "k";
|
|
34
|
-
return val;
|
|
35
|
-
}
|
|
36
|
-
else if (data != Math.floor(data)) {
|
|
37
|
-
return data.toFixed(1).toString();
|
|
38
|
-
}
|
|
39
|
-
return data.toString();
|
|
40
|
-
};
|
|
41
|
-
console.log("AnnaFilterService service created.");
|
|
42
|
-
const sliderArr = [
|
|
43
|
-
"rcvPreempt",
|
|
44
|
-
"osPreempt",
|
|
45
|
-
"rcvUnderDly",
|
|
46
|
-
"postedAudPercent",
|
|
47
|
-
"booked",
|
|
48
|
-
"spots",
|
|
49
|
-
"grp",
|
|
50
|
-
"cpp",
|
|
51
|
-
"imps",
|
|
52
|
-
"cpm",
|
|
53
|
-
"osUnderDly",
|
|
54
|
-
"totalWeeks",
|
|
55
|
-
"WeekNumber",
|
|
56
|
-
"Rate",
|
|
57
|
-
"OrderedRatingsOrImpressions",
|
|
58
|
-
"PostedRatingsOrImpressions", ,
|
|
59
|
-
"postedAudPercent",
|
|
60
|
-
"postedAdu",
|
|
61
|
-
"scheduledAdu",
|
|
62
|
-
"audienceDeficit",
|
|
63
|
-
"offeredMGs",
|
|
64
|
-
"outstandingPE",
|
|
65
|
-
"offeredADUs",
|
|
66
|
-
"udDeficitValue",
|
|
67
|
-
"bookedValue",
|
|
68
|
-
"bookedSpots",
|
|
69
|
-
"userChanges"
|
|
70
|
-
];
|
|
71
|
-
const calendarArr = ["period", "AirDate", "flightStartDate", "flightEndDate", "date", "startDate", "endDate"];
|
|
72
|
-
const timeArr = ["StartTimeForFilter", "EndTimeForFilter",
|
|
73
|
-
"start_time_for_filter", "end_time_for_filter", "startEndTimeMulti", "startEndTime"];
|
|
74
|
-
this.sliderSet = new Set(sliderArr);
|
|
75
|
-
this.calendarSet = new Set(calendarArr);
|
|
76
|
-
this.timeSet = new Set(timeArr);
|
|
77
|
-
}
|
|
78
|
-
returnMaxAndMinValue(data, key, isMin) {
|
|
79
|
-
data = data.filter((obj) => !["", "-", null].includes(obj[key]));
|
|
80
|
-
const values = data.map((x) => x[key]);
|
|
81
|
-
let valueToReturn = isMin ? min(values) : max(values);
|
|
82
|
-
return valueToReturn;
|
|
83
|
-
}
|
|
84
|
-
returnMinAndMaxDate(data, key) {
|
|
85
|
-
data = data.filter((obj) => !["", "-", null].includes(obj[key]));
|
|
86
|
-
let DateArr = data.map((obj) => moment(obj[key]));
|
|
87
|
-
let minDate = moment.min(DateArr);
|
|
88
|
-
let maxDate = moment.max(DateArr);
|
|
89
|
-
return [minDate, maxDate];
|
|
90
|
-
}
|
|
91
|
-
isTooltipActive(header, sortMap) {
|
|
92
|
-
let set = new Set(this.appliedFiltersArray);
|
|
93
|
-
if (header.length == 1) {
|
|
94
|
-
return ((sortMap.size > 0 && sortMap.get(header[0]) != "DEFAULT") || set.has(header[0]));
|
|
95
|
-
}
|
|
96
|
-
return ((sortMap.size > 0 && sortMap.get(header[0]) != "DEFAULT") || (sortMap.size > 0 && sortMap.get(header[1]) != "DEFAULT") || set.has(header[0]) || set.has(header[1]));
|
|
97
|
-
}
|
|
98
|
-
clearColumnFilter() {
|
|
99
|
-
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
100
|
-
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
101
|
-
appliedFilterSet.delete(this.selectedRadio);
|
|
102
|
-
this.appliedFiltersArray = [...appliedFilterSet];
|
|
103
|
-
}
|
|
104
|
-
populateSliderTooltip(completeData, filteredData) {
|
|
105
|
-
let minValue;
|
|
106
|
-
let maxValue;
|
|
107
|
-
if (this.appliedFiltersArray.length > 0 &&
|
|
108
|
-
this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
|
|
109
|
-
let subsetData;
|
|
110
|
-
let subfilterApplied = false;
|
|
111
|
-
//applying all filterexcept the current filter
|
|
112
|
-
if (this.selectedRadio === "postedAdu" && this.tooltipSelectedMap.has("isAudRequired")) {
|
|
113
|
-
this.tooltipSelectedMap.delete("isAudRequired");
|
|
114
|
-
subfilterApplied = true;
|
|
115
|
-
}
|
|
116
|
-
subsetData = this.filterData(completeData, this.selectedRadio);
|
|
117
|
-
//need to find min and max value for
|
|
118
|
-
minValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, true);
|
|
119
|
-
maxValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, false);
|
|
120
|
-
if (this.selectedRadio === "postedAdu" && subfilterApplied) {
|
|
121
|
-
this.tooltipSelectedMap.set("isAudRequired", [false]);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
minValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, true);
|
|
126
|
-
maxValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, false);
|
|
127
|
-
}
|
|
128
|
-
this.ngxSliderObj = this.setOptionValues(minValue, maxValue);
|
|
129
|
-
if (this.translateFunc === "normal") {
|
|
130
|
-
this.ngxSliderObj.translate = this.normalTranslateFunction;
|
|
131
|
-
}
|
|
132
|
-
else if (this.translateFunc === "percent") {
|
|
133
|
-
this.ngxSliderObj.translate = this.percentTranslateFunction;
|
|
134
|
-
}
|
|
135
|
-
else if (this.translateFunc === "currency") {
|
|
136
|
-
this.ngxSliderObj.translate = this.currencyTranslateFunction;
|
|
137
|
-
}
|
|
138
|
-
return this.ngxSliderObj;
|
|
139
|
-
}
|
|
140
|
-
setOptionValues(minValue, maxValue) {
|
|
141
|
-
return {
|
|
142
|
-
floor: minValue,
|
|
143
|
-
ceil: maxValue,
|
|
144
|
-
disabled: true,
|
|
145
|
-
translate: this.normalTranslateFunction
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
populateTooltip(selectedColumnName, completeData, filteredData) {
|
|
149
|
-
let tooltipData;
|
|
150
|
-
if (this.appliedFiltersArray.length === 0) {
|
|
151
|
-
tooltipData = this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
|
|
152
|
-
tooltipData.forEach((item) => (item.isHidden = false));
|
|
153
|
-
}
|
|
154
|
-
else if (selectedColumnName === this.appliedFiltersArray[this.appliedFiltersArray.length - 1]) {
|
|
155
|
-
let subsetData = this.filterData(completeData, selectedColumnName); //filter the data without applying the latest filter
|
|
156
|
-
tooltipData = this.showHideFilterCheckbox(subsetData, selectedColumnName);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
//if it is not the latest filter
|
|
160
|
-
//then filtered Data will be used
|
|
161
|
-
//create the option data
|
|
162
|
-
if (!this.tooltipMap.has(selectedColumnName)) {
|
|
163
|
-
this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
|
|
164
|
-
}
|
|
165
|
-
tooltipData = this.showHideFilterCheckbox(filteredData, selectedColumnName);
|
|
166
|
-
}
|
|
167
|
-
return tooltipData;
|
|
168
|
-
}
|
|
169
|
-
populateTooltipDataBasedOnSelectedRadio(value, originalData) {
|
|
170
|
-
//if the initial tooltip data is already present fetch from the map
|
|
171
|
-
if (this.tooltipMap.has(value[0])) {
|
|
172
|
-
return this.tooltipMap.get(value[0]);
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
//get the unique values from the column and save it in the map
|
|
176
|
-
this.selectedRadio = value[0];
|
|
177
|
-
const data = sortBy(originalData.map((u) => u[this.selectedRadio])).filter((n) => n !== null); //sorting the data in alphabetical order
|
|
178
|
-
const dataSet = new Set(data); //created a set from the data
|
|
179
|
-
const toolTipdata = [...dataSet].map((x) => new tooltipModelForColumnLevelFiltering(x));
|
|
180
|
-
this.tooltipMap.set(value[0], toolTipdata); //setting the key value pair in the tooltipMap
|
|
181
|
-
this.tooltipSelectedMap.set(value[0], map(toolTipdata, "data")); //setting the key value pair in tooltipSelectedMap
|
|
182
|
-
return toolTipdata;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
showHideFilterCheckbox(arr, selectedColumnName) {
|
|
186
|
-
let currentSubsetData = uniq(arr.map((u) => u[selectedColumnName]));
|
|
187
|
-
//get the initial tooltip Data
|
|
188
|
-
let tooltipData = this.tooltipMap.get(selectedColumnName);
|
|
189
|
-
//show or hide the value
|
|
190
|
-
tooltipData.forEach((value) => {
|
|
191
|
-
//if the element is not present then hide the element
|
|
192
|
-
let elementToFindIndex = currentSubsetData.findIndex((n) => n === value.data);
|
|
193
|
-
if (elementToFindIndex === -1) {
|
|
194
|
-
value.isHidden = true;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
//show the element
|
|
198
|
-
value.isHidden = false;
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
return tooltipData;
|
|
202
|
-
}
|
|
203
|
-
isAllOptionsSelected() {
|
|
204
|
-
let allSelected;
|
|
205
|
-
let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
206
|
-
let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
|
|
207
|
-
if (selectedOptionsCount === 0) {
|
|
208
|
-
allSelected = AllSelectedStatus.none;
|
|
209
|
-
}
|
|
210
|
-
else if (selectedOptionsCount > 0 && selectedOptionsCount < totalOptionsCount) {
|
|
211
|
-
allSelected = AllSelectedStatus.fewSelected;
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
allSelected = AllSelectedStatus.allSelected;
|
|
215
|
-
}
|
|
216
|
-
return allSelected;
|
|
217
|
-
}
|
|
218
|
-
populateDatePickerTooltipWithData(completeData, filteredData) {
|
|
219
|
-
let enabledDates;
|
|
220
|
-
//some filter is applied and the latest filter is the date filter
|
|
221
|
-
if (this.appliedFiltersArray.length > 0 &&
|
|
222
|
-
this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
|
|
223
|
-
let subsetData;
|
|
224
|
-
//applying all filterexcept thec current filter
|
|
225
|
-
if (this.selectedRadio === "period") {
|
|
226
|
-
subsetData = this.filterData(completeData, "period");
|
|
227
|
-
let minStartDate = this.returnMinAndMaxDate(subsetData, "startDate");
|
|
228
|
-
let maxEndDate = this.returnMinAndMaxDate(subsetData, "endDate");
|
|
229
|
-
enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
|
|
230
|
-
}
|
|
231
|
-
else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
|
|
232
|
-
this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
|
|
233
|
-
subsetData = this.filterData(completeData, this.selectedRadio);
|
|
234
|
-
let minAndMaxDate = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
|
|
235
|
-
enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
subsetData = this.filterData(completeData, this.selectedRadio);
|
|
239
|
-
//need to find min and max date for start and end date
|
|
240
|
-
//enabledDates is an arr of minDate and maxDate
|
|
241
|
-
enabledDates = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
if (this.selectedRadio === "period") {
|
|
246
|
-
let minStartDate = this.returnMinAndMaxDate(filteredData, "startDate");
|
|
247
|
-
let maxEndDate = this.returnMinAndMaxDate(filteredData, "endDate");
|
|
248
|
-
enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
|
|
249
|
-
}
|
|
250
|
-
else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
|
|
251
|
-
this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
|
|
252
|
-
let minAndMaxDate = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
|
|
253
|
-
enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
//need to find min and max date for start and end date.
|
|
257
|
-
// enabledDates is an arr of minDate and maxDate
|
|
258
|
-
enabledDates = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
return enabledDates;
|
|
262
|
-
}
|
|
263
|
-
findUniqueDatesWithData(data) {
|
|
264
|
-
let uniqueDates = uniq(data.map((u) => u["date"]));
|
|
265
|
-
let uniqueDatesInNgbDateFormat = [];
|
|
266
|
-
uniqueDates.forEach((date) => {
|
|
267
|
-
uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(moment(date, "MM/DD/YY").format("MM/DD/YYYY")));
|
|
268
|
-
});
|
|
269
|
-
return uniqueDatesInNgbDateFormat;
|
|
270
|
-
}
|
|
271
|
-
isCheckboxSelected(selectedData) {
|
|
272
|
-
selectedData.isSelected = !selectedData.isSelected;
|
|
273
|
-
let allSelected = this.isAllOptionsSelected();
|
|
274
|
-
return allSelected;
|
|
275
|
-
}
|
|
276
|
-
allOptionsClicked(status) {
|
|
277
|
-
let header = this.selectedRadio;
|
|
278
|
-
if (status === 1) {
|
|
279
|
-
this.tooltipMap.get(header).forEach((item) => {
|
|
280
|
-
if (!item.isHidden) {
|
|
281
|
-
item.isSelected = true;
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
this.tooltipSelectedMap.set(header, this.tooltipMap
|
|
285
|
-
.get(header)
|
|
286
|
-
.filter((x) => x.isSelected)
|
|
287
|
-
.map((x) => x.data));
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
this.tooltipMap.get(header).forEach((item) => {
|
|
291
|
-
if (!item.isHidden) {
|
|
292
|
-
item.isSelected = false;
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
this.tooltipSelectedMap.delete(header);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
|
|
299
|
-
let isFiltered = true;
|
|
300
|
-
isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
|
|
301
|
-
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
302
|
-
}
|
|
303
|
-
checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
|
|
304
|
-
if (this.selectedRadio == "user" && !this.tooltipMap.has("user")) {
|
|
305
|
-
isFiltered = cloneDeep(isHierarchialUserFiltered);
|
|
306
|
-
}
|
|
307
|
-
else if (this.selectedRadio == "StartTimeForFilter" || this.selectedRadio == "EndTimeForFilter"
|
|
308
|
-
|| this.selectedRadio == "start_time_for_filter" || this.selectedRadio == "end_time_for_filter" || this.selectedRadio == "startEndTimeMulti") {
|
|
309
|
-
isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
|
|
310
|
-
}
|
|
311
|
-
else if (this.selectedRadio == "startEndTime" || this.selectedRadio == "TimeBand") {
|
|
312
|
-
isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
|
|
313
|
-
}
|
|
314
|
-
else if (this.sliderSet.has(this.selectedRadio)) {
|
|
315
|
-
isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
|
|
316
|
-
if (this.selectedRadio == "postedAdu" && this.subRadioButton == "notRequired") {
|
|
317
|
-
isFiltered = true;
|
|
318
|
-
}
|
|
319
|
-
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
320
|
-
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
else if (this.selectedRadio == "startDate" ||
|
|
324
|
-
this.selectedRadio == "endDate" ||
|
|
325
|
-
this.selectedRadio == "period" ||
|
|
326
|
-
this.selectedRadio == "AirDate" ||
|
|
327
|
-
this.selectedRadio === "flightStartDate" ||
|
|
328
|
-
this.selectedRadio === "flightEndDate" ||
|
|
329
|
-
this.selectedRadio == "date") {
|
|
330
|
-
isFiltered =
|
|
331
|
-
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) &&
|
|
332
|
-
!isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
|
|
333
|
-
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
334
|
-
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
339
|
-
let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
|
|
340
|
-
isFiltered = selectedOptionsCount > 0 && selectedOptionsCount != totalOptionsCount ? true : false;
|
|
341
|
-
}
|
|
342
|
-
return isFiltered;
|
|
343
|
-
}
|
|
344
|
-
removeOrChangeLatestFilterIndex(isFiltered) {
|
|
345
|
-
let set = new Set(this.appliedFiltersArray);
|
|
346
|
-
if (isFiltered && !set.has(this.selectedRadio)) {
|
|
347
|
-
set.add(this.selectedRadio);
|
|
348
|
-
}
|
|
349
|
-
else if (isFiltered && set.has(this.selectedRadio)) {
|
|
350
|
-
set.delete(this.selectedRadio);
|
|
351
|
-
set.add(this.selectedRadio);
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
set.delete(this.selectedRadio);
|
|
355
|
-
}
|
|
356
|
-
this.appliedFiltersArray = [...set];
|
|
357
|
-
}
|
|
358
|
-
filterData(originalData, keyToSkip) {
|
|
359
|
-
let filteredData = [...originalData];
|
|
360
|
-
this.tooltipSelectedMap.forEach((value, key) => {
|
|
361
|
-
if (key != keyToSkip) {
|
|
362
|
-
if (this.sliderSet.has(key)) {
|
|
363
|
-
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
364
|
-
}
|
|
365
|
-
else if (key === "startDate" || key === "endDate" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date") {
|
|
366
|
-
filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
|
|
367
|
-
}
|
|
368
|
-
else if (key === "period") {
|
|
369
|
-
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
370
|
-
}
|
|
371
|
-
else if (key === "StartTimeForFilter" || key === "EndTimeForFilter"
|
|
372
|
-
|| key === "start_time_for_filter" || key === "end_time_for_filter") {
|
|
373
|
-
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
374
|
-
}
|
|
375
|
-
else if (key === "startEndTimeMulti" || key == "startEndTime" || key === "TimeBand") {
|
|
376
|
-
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
377
|
-
}
|
|
378
|
-
else if (value.length > 0) {
|
|
379
|
-
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
});
|
|
383
|
-
return filteredData;
|
|
384
|
-
}
|
|
385
|
-
returnOrdersInTheRange(order, range, key) {
|
|
386
|
-
let isDateBetweenTheSelectedRange = moment(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
|
|
387
|
-
let isDateSameAsTheMinSelectedDate = moment(order[key]).isSame(range.minSelectedDate);
|
|
388
|
-
let isDateSameAsTheMaxSelectedDate = moment(order[key]).isSame(range.maxSelectedDate);
|
|
389
|
-
return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
|
|
390
|
-
}
|
|
391
|
-
returnDataForTimeRange(obj, selectedData) {
|
|
392
|
-
let format = "HH:mm:ss";
|
|
393
|
-
let selectedStartDate = moment(selectedData.startTime, format);
|
|
394
|
-
let selectedEndDate = moment(selectedData.endTime, format);
|
|
395
|
-
let startTime = moment(obj.startTime, format);
|
|
396
|
-
let endTime = moment(obj.endTime, format);
|
|
397
|
-
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
|
|
398
|
-
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
|
|
399
|
-
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
|
|
400
|
-
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
|
|
401
|
-
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
402
|
-
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
403
|
-
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
404
|
-
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
405
|
-
}
|
|
406
|
-
returnDataForFromAndToTimeRange(obj, selectedData, key) {
|
|
407
|
-
let format = "HH:mm:ss";
|
|
408
|
-
let selectedFromTime = moment(selectedData.fromTime, format);
|
|
409
|
-
let selectedToTime = moment(selectedData.toTime, format);
|
|
410
|
-
let objTime = obj[key];
|
|
411
|
-
if (["", "-", null].includes(objTime)) {
|
|
412
|
-
return false;
|
|
413
|
-
}
|
|
414
|
-
if (selectedData.includeMulti && obj[key] == "<multi>") {
|
|
415
|
-
return true;
|
|
416
|
-
}
|
|
417
|
-
if (!selectedData.includeMulti && obj[key] == "<multi>") {
|
|
418
|
-
return false;
|
|
419
|
-
}
|
|
420
|
-
if (selectedData.includeZero && obj[key] == "0") {
|
|
421
|
-
return true;
|
|
422
|
-
}
|
|
423
|
-
if (!selectedData.includeZero && obj[key] == "0") {
|
|
424
|
-
return false;
|
|
425
|
-
}
|
|
426
|
-
if (!selectedData.includeTimeRange) {
|
|
427
|
-
return false;
|
|
428
|
-
}
|
|
429
|
-
// objTime = this.dateTimeFormatService.formatToTwelveHrs(objTime, true);
|
|
430
|
-
// objTime = this.dateTimeFormatService.convertTotwentyFourHrsFormat(
|
|
431
|
-
// objTime[0] + ":" + objTime[1] + " " + objTime[2],
|
|
432
|
-
// true
|
|
433
|
-
// );
|
|
434
|
-
// objTime = objTime[0] + ":" + objTime[1] + ":00";
|
|
435
|
-
// objTime = moment(objTime, format);
|
|
436
|
-
let momentTime = moment(objTime, format);
|
|
437
|
-
console.log(momentTime);
|
|
438
|
-
console.log(selectedFromTime);
|
|
439
|
-
console.log(selectedToTime);
|
|
440
|
-
let isObjTimeSameAsSelectedFromTime = momentTime.isSame(selectedFromTime);
|
|
441
|
-
let isObjTimeSameAsSelectedToTime = momentTime.isSame(selectedToTime);
|
|
442
|
-
let isObjTimeBetweenSelectedFromTimeAndToTime = momentTime.isBetween(selectedFromTime, selectedToTime);
|
|
443
|
-
return (isObjTimeSameAsSelectedFromTime ||
|
|
444
|
-
isObjTimeSameAsSelectedToTime ||
|
|
445
|
-
isObjTimeBetweenSelectedFromTimeAndToTime);
|
|
446
|
-
}
|
|
447
|
-
returnDataForStartAndEndTimeRange(obj, selectedData, key) {
|
|
448
|
-
let format = "HH:mm:ss";
|
|
449
|
-
let selectedFromTime = moment(selectedData.fromTime, format);
|
|
450
|
-
let selectedToTime = moment(selectedData.toTime, format);
|
|
451
|
-
if (selectedData.includeMulti && obj[key][0] == "<multi>") {
|
|
452
|
-
return true;
|
|
453
|
-
}
|
|
454
|
-
if (!selectedData.includeMulti && obj[key][0] == "<multi>") {
|
|
455
|
-
return false;
|
|
456
|
-
}
|
|
457
|
-
if (selectedData.includeZero && obj[key][0] == "0") {
|
|
458
|
-
return true;
|
|
459
|
-
}
|
|
460
|
-
if (!selectedData.includeZero && obj[key][0] == "0") {
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
if (!selectedData.includeTimeRange) {
|
|
464
|
-
return false;
|
|
465
|
-
}
|
|
466
|
-
let startTime = moment(obj[key][1], format);
|
|
467
|
-
let endTime = moment(obj[key][2], format);
|
|
468
|
-
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
|
|
469
|
-
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
|
|
470
|
-
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
|
|
471
|
-
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
|
|
472
|
-
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
473
|
-
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
474
|
-
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
475
|
-
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
476
|
-
}
|
|
477
|
-
getDataInTheDateRange(obj, value, key) {
|
|
478
|
-
let parsingFormat;
|
|
479
|
-
if (key === "period") {
|
|
480
|
-
parsingFormat = "YYYY-MM-DD";
|
|
481
|
-
let momentStartDate = moment(obj.startDate);
|
|
482
|
-
let momentEndDate = moment(obj.endDate);
|
|
483
|
-
let startDateIsBetweenSelDate = momentStartDate.isBetween(value.fromDate, value.toDate);
|
|
484
|
-
let endDateIsBetweenSelDate = momentEndDate.isBetween(value.fromDate, value.toDate);
|
|
485
|
-
console.log(moment(obj.startDate, parsingFormat));
|
|
486
|
-
let startDateIsSameAsSelStartDate = value.fromDate.isSame(momentStartDate);
|
|
487
|
-
let endDateIsSameAsSelEndDate = value.toDate.isSame(momentEndDate);
|
|
488
|
-
return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
|
|
489
|
-
(endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
|
|
490
|
-
}
|
|
491
|
-
else if (key === "AirDate" || key === "flightStartDate" || key === "flightEndDate") {
|
|
492
|
-
parsingFormat = "MM/DD/YYYY";
|
|
493
|
-
let dateIsBetweenSelDate = moment(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
494
|
-
let dateIsSameAsSelStartDate = moment(obj[key], parsingFormat).isSame(value.minSelectedDate);
|
|
495
|
-
let dateIsSameAsSelEndDate = moment(obj[key], parsingFormat).isSame(value.maxSelectedDate);
|
|
496
|
-
return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
initializeTimeFilterData(clonedData, key = "startEndTime") {
|
|
500
|
-
let startTimeArr = map(clonedData, "startTime");
|
|
501
|
-
let endTimeArr = map(clonedData, "endTime");
|
|
502
|
-
startTimeArr.sort((a, b) => {
|
|
503
|
-
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
504
|
-
});
|
|
505
|
-
endTimeArr.sort((a, b) => {
|
|
506
|
-
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
507
|
-
});
|
|
508
|
-
let initialStartEndTime = {
|
|
509
|
-
startTime: startTimeArr[0],
|
|
510
|
-
endTime: endTimeArr[0],
|
|
511
|
-
};
|
|
512
|
-
this.initialValueMap.set(key, initialStartEndTime);
|
|
513
|
-
}
|
|
514
|
-
returnColumnFilterStatus(data, headerName) {
|
|
515
|
-
if (headerName == "startEndTime") {
|
|
516
|
-
let time = data.map(u => u[headerName][0]);
|
|
517
|
-
let uniqTime = uniq(time);
|
|
518
|
-
return uniqTime.length == 0;
|
|
519
|
-
}
|
|
520
|
-
return uniq(data.map((u) => u[headerName])).length > 1 ? false : true;
|
|
521
|
-
}
|
|
522
|
-
getFilterOptionsData(data, clonedData) {
|
|
523
|
-
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
524
|
-
console.log("appliedFilterSet");
|
|
525
|
-
console.log(appliedFilterSet);
|
|
526
|
-
if (appliedFilterSet.has(this.selectedRadio)) {
|
|
527
|
-
return this.filterData(clonedData, this.selectedRadio);
|
|
528
|
-
}
|
|
529
|
-
else {
|
|
530
|
-
return data;
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
reOrderAppliedFiltersState(clonedData, value) {
|
|
534
|
-
let isFiltered = true;
|
|
535
|
-
isFiltered = this.checkIfFilterIsApplied(clonedData, value);
|
|
536
|
-
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
537
|
-
return isFiltered;
|
|
538
|
-
}
|
|
539
|
-
checkIfFilterIsApplied(clonedData, value) {
|
|
540
|
-
let initialValueOfColumn = sortBy(clonedData.map(item => item[this.selectedRadio]));
|
|
541
|
-
let currentValueOfColumn = sortBy(this.applyFilter(clonedData, value).map(item => item[this.selectedRadio]));
|
|
542
|
-
return !isEqual(initialValueOfColumn, currentValueOfColumn);
|
|
543
|
-
}
|
|
544
|
-
applyFilter(data, value) {
|
|
545
|
-
let filteredData = data;
|
|
546
|
-
let key = this.selectedRadio;
|
|
547
|
-
if (this.sliderSet.has(key)) {
|
|
548
|
-
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
549
|
-
}
|
|
550
|
-
else if (key === "startDate" || key === "endDate" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date") {
|
|
551
|
-
filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
|
|
552
|
-
}
|
|
553
|
-
else if (key === "period") {
|
|
554
|
-
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
555
|
-
}
|
|
556
|
-
else if (key === "StartTimeForFilter" || key === "EndTimeForFilter"
|
|
557
|
-
|| key === "start_time_for_filter" || key === "end_time_for_filter") {
|
|
558
|
-
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
559
|
-
}
|
|
560
|
-
else if (key === "startEndTimeMulti" || key == "startEndTime" || key === "TimeBand") {
|
|
561
|
-
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
562
|
-
}
|
|
563
|
-
else if (value.length > 0) {
|
|
564
|
-
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
565
|
-
}
|
|
566
|
-
return filteredData;
|
|
567
|
-
}
|
|
568
|
-
isObjectInTheRange(obj, value, key) {
|
|
569
|
-
let objVal = obj[key];
|
|
570
|
-
let momentDate = moment(objVal);
|
|
571
|
-
console.log(objVal);
|
|
572
|
-
console.log(value.fromDate);
|
|
573
|
-
let isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
|
|
574
|
-
let isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
|
|
575
|
-
let isDateBetweenTheStartAndEndOfRange = momentDate.isBetween(value.fromDate, value.toDate);
|
|
576
|
-
return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
AnnaFilterService.bufferSize = 20;
|
|
580
|
-
AnnaFilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
581
|
-
AnnaFilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, providedIn: 'root' });
|
|
582
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, decorators: [{
|
|
583
|
-
type: Injectable,
|
|
584
|
-
args: [{
|
|
585
|
-
providedIn: 'root'
|
|
586
|
-
}]
|
|
587
|
-
}], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }]; } });
|
|
588
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRHLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFLekYsTUFBTSxPQUFPLGlCQUFpQjtJQTBCNUIsWUFBb0IscUJBQWdEO1FBQWhELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBMkI7UUF4QnBFLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBSW5DLHNCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsWUFBWSxFQUFDLFdBQVcsRUFBQyxXQUFXLEVBQUMsY0FBYyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUF5SGpJLDZCQUF3QixHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUU7WUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxD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TSxDQUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSwyQkFBMkIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRSxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksa0NBQWtDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRixPQUFPLDJCQUEyQixJQUFJLHlCQUF5QixJQUFJLGtDQUFrQyxDQUFDO0lBQ3hHLENBQUM7O0FBL25CYSw0QkFBVSxHQUFHLEVBQUcsQ0FBQTs4R0F4Qm5CLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07MkZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyLXNsaWRlci9uZ3gtc2xpZGVyJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBUaGlyZCBwYXJ0eSBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBtaW4sIG1heCwgbWFwLCBzb3J0QnksIHVuaXEsIGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHMgXHJcbmltcG9ydCB7IEFsbFNlbGVjdGVkU3RhdHVzLCB0b29sdGlwTW9kZWxGb3JDb2x1bW5MZXZlbEZpbHRlcmluZyB9IGZyb20gXCIuLi9tb2RlbHMvYW5uYS10b29sdGlwLm1vZGVsXCI7XHJcbmltcG9ydCB7IFNvcnRUeXBlIH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsIE5nYkRhdGVUeXBlIH0gZnJvbSAnLi9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hRmlsdGVyU2VydmljZSB7XHJcblxyXG4gIHRvb2x0aXBNYXAgPSBuZXcgTWFwKCk7XHJcbiAgdG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gIGluaXRpYWxWYWx1ZU1hcDogTWFwPHN0cmluZywgYW55PjtcclxuICB0cmFuc2xhdGVGdW5jOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRSYWRpbzogc3RyaW5nO1xyXG4gIHN1YlJhZGlvQnV0dG9uOiBzdHJpbmc7XHJcblxyXG4gIGNhbGVuZGFyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICBzbGlkZXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gIHRpbWVTZXQ6IFNldDxzdHJpbmc+O1xyXG5cclxuICBpbmNsdWRlTXVsdGlUaW1lOiBib29sZWFuO1xyXG4gIGluY2x1ZGVaZXJvVGltZTogYm9vbGVhbjtcclxuICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xyXG5cclxuICBhcHBsaWVkRmlsdGVyc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZsaWdodERhdGVSYW5nZTogeyBtaW5TZWxlY3RlZERhdGU6IGFueSwgbWF4U2VsZWN0ZWREYXRlOiBhbnkgfTtcclxuICBzbGlkZXJEYXRhOiB7IG1pbjogYW55LCBtYXg6IGFueSB9O1xyXG4gIG5neFNsaWRlck9iajogT3B0aW9ucztcclxuICBzbGlkZXJDdXJyZW5jeVNldCA9IG5ldyBTZXQoW1wiYm9va2VkXCIsXCJjcHBcIixcImNwbVwiLFwicmN2UHJlZW1wdFwiLFwib3NQcmVlbXB0XCIsXCJwb3N0ZWRBZHVcIixcInNjaGVkdWxlZEFkdVwiLFwiYXVkaWVuY2VEZWZpY2l0XCIsXCJSYXRlXCJdKTtcclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgYnVmZmVyU2l6ZSA9IDIwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJBbm5hRmlsdGVyU2VydmljZSBzZXJ2aWNlIGNyZWF0ZWQuXCIpXHJcbiAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgIFwicmN2UHJlZW1wdFwiLFxyXG4gICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICBcInJjdlVuZGVyRGx5XCIsXHJcbiAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICBcImJvb2tlZFwiLFxyXG4gICAgICBcInNwb3RzXCIsXHJcbiAgICAgIFwiZ3JwXCIsXHJcbiAgICAgIFwiY3BwXCIsXHJcbiAgICAgIFwiaW1wc1wiLFxyXG4gICAgICBcImNwbVwiLFxyXG4gICAgICBcIm9zVW5kZXJEbHlcIixcclxuICAgICAgXCJ0b3RhbFdlZWtzXCIsXHJcbiAgICAgIFwiV2Vla051bWJlclwiLFxyXG4gICAgICBcIlJhdGVcIixcclxuICAgICAgXCJPcmRlcmVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIixcclxuICAgICAgXCJQb3N0ZWRSYXRpbmdzT3JJbXByZXNzaW9uc1wiLCAsXHJcbiAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICBcInBvc3RlZEFkdVwiLFxyXG4gICAgICBcInNjaGVkdWxlZEFkdVwiLFxyXG4gICAgICBcImF1ZGllbmNlRGVmaWNpdFwiLFxyXG4gICAgICBcIm9mZmVyZWRNR3NcIixcclxuICAgICAgXCJvdXRzdGFuZGluZ1BFXCIsXHJcbiAgICAgIFwib2ZmZXJlZEFEVXNcIixcclxuICAgICAgXCJ1ZERlZmljaXRWYWx1ZVwiLFxyXG4gICAgICBcImJvb2tlZFZhbHVlXCIsXHJcbiAgICAgIFwiYm9va2VkU3BvdHNcIixcclxuICAgICAgXCJ1c2VyQ2hhbmdlc1wiXHJcbiAgICBdO1xyXG4gICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXCJwZXJpb2RcIiwgXCJBaXJEYXRlXCIsIFwiZmxpZ2h0U3RhcnREYXRlXCIsIFwiZmxpZ2h0RW5kRGF0ZVwiLFwiZGF0ZVwiLCBcInN0YXJ0RGF0ZVwiLCBcImVuZERhdGVcIl07XHJcbiAgICBjb25zdCB0aW1lQXJyID0gW1wiU3RhcnRUaW1lRm9yRmlsdGVyXCIsIFwiRW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLCBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiwgXCJzdGFydEVuZFRpbWVNdWx0aVwiLCBcInN0YXJ0RW5kVGltZVwiXTtcclxuICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcclxuICB9XHJcblxyXG4gIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBtb21lbnQob2JqW2tleV0pKTtcclxuICAgIGxldCBtaW5EYXRlID0gbW9tZW50Lm1pbihEYXRlQXJyKTtcclxuICAgIGxldCBtYXhEYXRlID0gbW9tZW50Lm1heChEYXRlQXJyKTtcclxuICAgIHJldHVybiBbbWluRGF0ZSwgbWF4RGF0ZV07XHJcbiAgfVxyXG5cclxuICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSwgc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgIGlmKGhlYWRlci5sZW5ndGggPT0gMSl7XHJcbiAgICAgIHJldHVybiAoIChzb3J0TWFwLnNpemUgPiAwICYmIHNvcnRNYXAuZ2V0KGhlYWRlclswXSkgIT0gXCJERUZBVUxUXCIpIHx8IHNldC5oYXMoaGVhZGVyWzBdKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKCAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmdldChoZWFkZXJbMF0pICE9IFwiREVGQVVMVFwiKSB8fCAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmdldChoZWFkZXJbMV0pICE9IFwiREVGQVVMVFwiKSB8fCBzZXQuaGFzKGhlYWRlclswXSkgfHwgc2V0LmhhcyhoZWFkZXJbMV0pKTsgXHJcblxyXG4gIH1cclxuXHJcbiAgY2xlYXJDb2x1bW5GaWx0ZXIoKSB7XHJcbiAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIFxyXG4gICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5hcHBsaWVkRmlsdGVyU2V0XTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlU2xpZGVyVG9vbHRpcChjb21wbGV0ZURhdGE6IGFueVtdLCBmaWx0ZXJlZERhdGE6IGFueVtdKSB7XHJcbiAgICBsZXQgbWluVmFsdWU7XHJcbiAgICBsZXQgbWF4VmFsdWU7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheVt0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoIC0gMV0gPT09IHRoaXMuc2VsZWN0ZWRSYWRpb1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBzdWJzZXREYXRhO1xyXG4gICAgICBsZXQgc3ViZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gICAgICAvL2FwcGx5aW5nIGFsbCBmaWx0ZXJleGNlcHQgdGhlIGN1cnJlbnQgZmlsdGVyXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicG9zdGVkQWR1XCIgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKFwiaXNBdWRSZXF1aXJlZFwiKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShcImlzQXVkUmVxdWlyZWRcIik7XHJcbiAgICAgICAgc3ViZmlsdGVyQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIC8vbmVlZCB0byBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlIGZvclxyXG4gICAgICBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCB0cnVlKTtcclxuICAgICAgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKHN1YnNldERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInBvc3RlZEFkdVwiICYmIHN1YmZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQoXCJpc0F1ZFJlcXVpcmVkXCIsIFtmYWxzZV0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtaW5WYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMubmd4U2xpZGVyT2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZUZ1bmMgPT09IFwibm9ybWFsXCIpIHtcclxuICAgICAgdGhpcy5uZ3hTbGlkZXJPYmoudHJhbnNsYXRlID0gdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2xhdGVGdW5jID09PSBcInBlcmNlbnRcIikge1xyXG4gICAgICB0aGlzLm5neFNsaWRlck9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2xhdGVGdW5jID09PSBcImN1cnJlbmN5XCIpIHtcclxuICAgICAgdGhpcy5uZ3hTbGlkZXJPYmoudHJhbnNsYXRlID0gdGhpcy5jdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubmd4U2xpZGVyT2JqO1xyXG4gIH1cclxuXHJcbiAgc2V0T3B0aW9uVmFsdWVzKG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZsb29yOiBtaW5WYWx1ZSxcclxuICAgICAgY2VpbDogbWF4VmFsdWUsXHJcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgICB0cmFuc2xhdGU6IHRoaXMubm9ybWFsVHJhbnNsYXRlRnVuY3Rpb25cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwZXJjZW50VHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IHZhbCA9IGRhdGEudG9GaXhlZCgxKSArIFwiJVwiO1xyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9O1xyXG5cclxuICBjdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArIFwia1wiO1xyXG4gICAgICByZXR1cm4gXCIkXCIgKyB2YWw7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCIkXCIgKyBkYXRhO1xyXG4gIH07XHJcblxyXG4gIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArIFwia1wiO1xyXG4gICAgICByZXR1cm4gdmFsO1xyXG4gICAgfSBlbHNlIGlmIChkYXRhICE9IE1hdGguZmxvb3IoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGEudG9GaXhlZCgxKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcclxuICB9O1xyXG5cclxuICBwb3B1bGF0ZVRvb2x0aXAoc2VsZWN0ZWRDb2x1bW5OYW1lOiBzdHJpbmcsIGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCB0b29sdGlwRGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0b29sdGlwRGF0YSA9IHRoaXMucG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKFtzZWxlY3RlZENvbHVtbk5hbWVdLCBjb21wbGV0ZURhdGEpO1xyXG4gICAgICB0b29sdGlwRGF0YS5mb3JFYWNoKChpdGVtOiB7IGlzSGlkZGVuOiBib29sZWFuIH0pID0+IChpdGVtLmlzSGlkZGVuID0gZmFsc2UpKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb2x1bW5OYW1lID09PSB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXlbdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCAtIDFdKSB7XHJcbiAgICAgIGxldCBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgc2VsZWN0ZWRDb2x1bW5OYW1lKTsgLy9maWx0ZXIgdGhlIGRhdGEgd2l0aG91dCBhcHBseWluZyB0aGUgbGF0ZXN0IGZpbHRlclxyXG4gICAgICB0b29sdGlwRGF0YSA9IHRoaXMuc2hvd0hpZGVGaWx0ZXJDaGVja2JveChzdWJzZXREYXRhLCBzZWxlY3RlZENvbHVtbk5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9pZiBpdCBpcyBub3QgdGhlIGxhdGVzdCBmaWx0ZXJcclxuICAgICAgLy90aGVuIGZpbHRlcmVkIERhdGEgd2lsbCBiZSB1c2VkXHJcbiAgICAgIC8vY3JlYXRlIHRoZSBvcHRpb24gZGF0YVxyXG4gICAgICBpZiAoIXRoaXMudG9vbHRpcE1hcC5oYXMoc2VsZWN0ZWRDb2x1bW5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVUb29sdGlwRGF0YUJhc2VkT25TZWxlY3RlZFJhZGlvKFtzZWxlY3RlZENvbHVtbk5hbWVdLCBjb21wbGV0ZURhdGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b29sdGlwRGF0YSA9IHRoaXMuc2hvd0hpZGVGaWx0ZXJDaGVja2JveChmaWx0ZXJlZERhdGEsIHNlbGVjdGVkQ29sdW1uTmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9vbHRpcERhdGE7XHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZVRvb2x0aXBEYXRhQmFzZWRPblNlbGVjdGVkUmFkaW8odmFsdWU6IHN0cmluZ1tdLCBvcmlnaW5hbERhdGE6IGFueSkge1xyXG4gICAgLy9pZiB0aGUgaW5pdGlhbCB0b29sdGlwIGRhdGEgaXMgYWxyZWFkeSBwcmVzZW50IGZldGNoIGZyb20gdGhlIG1hcFxyXG4gICAgaWYgKHRoaXMudG9vbHRpcE1hcC5oYXModmFsdWVbMF0pKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvb2x0aXBNYXAuZ2V0KHZhbHVlWzBdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vZ2V0IHRoZSB1bmlxdWUgdmFsdWVzIGZyb20gdGhlIGNvbHVtbiBhbmQgc2F2ZSBpdCBpbiB0aGUgbWFwXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9IHZhbHVlWzBdO1xyXG4gICAgICBjb25zdCBkYXRhID0gc29ydEJ5KG9yaWdpbmFsRGF0YS5tYXAoKHU6IGFueSkgPT4gdVt0aGlzLnNlbGVjdGVkUmFkaW9dKSkuZmlsdGVyKChuOmFueSkgPT4gbiAhPT0gbnVsbCk7IC8vc29ydGluZyB0aGUgZGF0YSBpbiBhbHBoYWJldGljYWwgb3JkZXJcclxuICAgICAgY29uc3QgZGF0YVNldCA9IG5ldyBTZXQoZGF0YSk7IC8vY3JlYXRlZCBhIHNldCBmcm9tIHRoZSBkYXRhXHJcbiAgICAgIGNvbnN0IHRvb2xUaXBkYXRhID0gWy4uLmRhdGFTZXRdLm1hcCgoeDogc3RyaW5nKSA9PiBuZXcgdG9vbHRpcE1vZGVsRm9yQ29sdW1uTGV2ZWxGaWx0ZXJpbmcoeCkpO1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuc2V0KHZhbHVlWzBdLCB0b29sVGlwZGF0YSk7IC8vc2V0dGluZyB0aGUga2V5IHZhbHVlIHBhaXIgaW4gdGhlIHRvb2x0aXBNYXBcclxuICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuc2V0KHZhbHVlWzBdLCBtYXAodG9vbFRpcGRhdGEsIFwiZGF0YVwiKSk7IC8vc2V0dGluZyB0aGUga2V5IHZhbHVlIHBhaXIgaW4gdG9vbHRpcFNlbGVjdGVkTWFwXHJcbiAgICAgIHJldHVybiB0b29sVGlwZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dIaWRlRmlsdGVyQ2hlY2tib3goYXJyOiBhbnlbXSwgc2VsZWN0ZWRDb2x1bW5OYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCBjdXJyZW50U3Vic2V0RGF0YSA9IHVuaXEoYXJyLm1hcCgodSkgPT4gdVtzZWxlY3RlZENvbHVtbk5hbWVdKSk7XHJcblxyXG4gICAgLy9nZXQgdGhlIGluaXRpYWwgdG9vbHRpcCBEYXRhXHJcbiAgICBsZXQgdG9vbHRpcERhdGEgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHNlbGVjdGVkQ29sdW1uTmFtZSk7XHJcblxyXG4gICAgLy9zaG93IG9yIGhpZGUgdGhlIHZhbHVlXHJcbiAgICB0b29sdGlwRGF0YS5mb3JFYWNoKCh2YWx1ZTogeyBkYXRhOiBzdHJpbmcgfCBudW1iZXI7IGlzSGlkZGVuOiBib29sZWFuOyB9KSA9PiB7XHJcbiAgICAgIC8vaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgdGhlbiBoaWRlIHRoZSBlbGVtZW50XHJcbiAgICAgIGxldCBlbGVtZW50VG9GaW5kSW5kZXggPSBjdXJyZW50U3Vic2V0RGF0YS5maW5kSW5kZXgoKG46IHN0cmluZyB8IG51bWJlcikgPT4gbiA9PT0gdmFsdWUuZGF0YSk7XHJcbiAgICAgIGlmIChlbGVtZW50VG9GaW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdmFsdWUuaXNIaWRkZW4gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vc2hvdyB0aGUgZWxlbWVudFxyXG4gICAgICAgIHZhbHVlLmlzSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0b29sdGlwRGF0YTtcclxuICB9XHJcblxyXG4gIGlzQWxsT3B0aW9uc1NlbGVjdGVkKCkge1xyXG4gICAgbGV0IGFsbFNlbGVjdGVkO1xyXG4gICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgbGV0IHNlbGVjdGVkT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgIGlmIChzZWxlY3RlZE9wdGlvbnNDb3VudCA9PT0gMCkge1xyXG4gICAgICBhbGxTZWxlY3RlZCA9IEFsbFNlbGVjdGVkU3RhdHVzLm5vbmU7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkT3B0aW9uc0NvdW50ID4gMCAmJiBzZWxlY3RlZE9wdGlvbnNDb3VudCA8IHRvdGFsT3B0aW9uc0NvdW50KSB7XHJcbiAgICAgIGFsbFNlbGVjdGVkID0gQWxsU2VsZWN0ZWRTdGF0dXMuZmV3U2VsZWN0ZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbGxTZWxlY3RlZCA9IEFsbFNlbGVjdGVkU3RhdHVzLmFsbFNlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVEYXRlUGlja2VyVG9vbHRpcFdpdGhEYXRhKGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCBlbmFibGVkRGF0ZXM7XHJcbiAgICAvL3NvbWUgZmlsdGVyIGlzIGFwcGxpZWQgYW5kIHRoZSBsYXRlc3QgZmlsdGVyIGlzIHRoZSBkYXRlIGZpbHRlclxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXlbdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCAtIDFdID09PSB0aGlzLnNlbGVjdGVkUmFkaW9cclxuICAgICkge1xyXG4gICAgICBsZXQgc3Vic2V0RGF0YTtcclxuICAgICAgLy9hcHBseWluZyBhbGwgZmlsdGVyZXhjZXB0IHRoZWMgY3VycmVudCAgZmlsdGVyXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgXCJwZXJpb2RcIik7XHJcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCBcImVuZERhdGVcIik7XHJcbiAgICAgICAgZW5hYmxlZERhdGVzID0geyBtaW5TdGFydERhdGU6IG1pblN0YXJ0RGF0ZVswXSwgbWF4RW5kRGF0ZTogbWF4RW5kRGF0ZVsxXSB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJBaXJEYXRlXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodEVuZERhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJkYXRlXCIpIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICBsZXQgbWluQW5kTWF4RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHsgbWluU3RhcnREYXRlOiBtaW5BbmRNYXhEYXRlWzBdLCBtYXhFbmREYXRlOiBtaW5BbmRNYXhEYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgLy9uZWVkIHRvIGZpbmQgbWluIGFuZCBtYXggZGF0ZSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRlXHJcbiAgICAgICAgLy9lbmFibGVkRGF0ZXMgaXMgYW4gYXJyIG9mIG1pbkRhdGUgYW5kIG1heERhdGVcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgIGxldCBtaW5TdGFydERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShmaWx0ZXJlZERhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluU3RhcnREYXRlWzBdLCBtYXhFbmREYXRlOiBtYXhFbmREYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkFpckRhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIikge1xyXG4gICAgICAgIGxldCBtaW5BbmRNYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKGZpbHRlcmVkRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluQW5kTWF4RGF0ZVswXSwgbWF4RW5kRGF0ZTogbWluQW5kTWF4RGF0ZVsxXSB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vbmVlZCB0byBmaW5kIG1pbiBhbmQgbWF4IGRhdGUgZm9yIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cclxuICAgICAgICAvLyBlbmFibGVkRGF0ZXMgaXMgYW4gYXJyIG9mIG1pbkRhdGUgYW5kIG1heERhdGVcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW5hYmxlZERhdGVzO1xyXG4gIH1cclxuXHJcbiAgZmluZFVuaXF1ZURhdGVzV2l0aERhdGEoZGF0YTogYW55W10pIHtcclxuICAgIGxldCB1bmlxdWVEYXRlcyA9IHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbXCJkYXRlXCJdKSk7XHJcbiAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcclxuICAgIHVuaXF1ZURhdGVzLmZvckVhY2goKGRhdGU6IGFueSkgPT4ge1xyXG4gICAgICB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdC5wdXNoKFxyXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChtb21lbnQoZGF0ZSwgXCJNTS9ERC9ZWVwiKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBpc0NoZWNrYm94U2VsZWN0ZWQoc2VsZWN0ZWREYXRhOiBhbnkpIHtcclxuICAgIHNlbGVjdGVkRGF0YS5pc1NlbGVjdGVkID0gIXNlbGVjdGVkRGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgbGV0IGFsbFNlbGVjdGVkID0gdGhpcy5pc0FsbE9wdGlvbnNTZWxlY3RlZCgpO1xyXG4gICAgcmV0dXJuIGFsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgYWxsT3B0aW9uc0NsaWNrZWQoc3RhdHVzOiBudW1iZXIpIHtcclxuICAgIGxldCBoZWFkZXIgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICBpZiAoc3RhdHVzID09PSAxKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5nZXQoaGVhZGVyKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0uaXNIaWRkZW4pIHtcclxuICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuc2V0KFxyXG4gICAgICAgIGhlYWRlcixcclxuICAgICAgICB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgIC5nZXQoaGVhZGVyKVxyXG4gICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiB4LmlzU2VsZWN0ZWQpXHJcbiAgICAgICAgICAubWFwKCh4OiBhbnkpID0+IHguZGF0YSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcE1hcC5nZXQoaGVhZGVyKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWl0ZW0uaXNIaWRkZW4pIHtcclxuICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShoZWFkZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVPcmRlckFwcGxpZWRGaWx0ZXJzQXJyYXkoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQsIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQsIGRhdGUpO1xyXG4gICAgdGhpcy5yZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJ1c2VyXCIgJiYgIXRoaXMudG9vbHRpcE1hcC5oYXMoXCJ1c2VyXCIpKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIlxyXG4gICAgICB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRFbmRUaW1lTXVsdGlcIikge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gIWlzRXF1YWwoXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgKSB8fCAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHwgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSkgfHwgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8ICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInBvc3RlZEFkdVwiICYmIHRoaXMuc3ViUmFkaW9CdXR0b24gPT0gXCJub3RSZXF1aXJlZFwiKSB7XHJcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc0ZpbHRlcmVkICYmIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZGF0ZVwiXHJcbiAgICApIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9XHJcbiAgICAgICAgIWlzRXF1YWwodGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pKSAmJlxyXG4gICAgICAgICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKS5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4gJiYgeC5pc1NlbGVjdGVkKS5sZW5ndGg7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSBzZWxlY3RlZE9wdGlvbnNDb3VudCA+IDAgJiYgc2VsZWN0ZWRPcHRpb25zQ291bnQgIT0gdG90YWxPcHRpb25zQ291bnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIHJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZDogYm9vbGVhbikge1xyXG4gICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICBpZiAoaXNGaWx0ZXJlZCAmJiAhc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGaWx0ZXJlZCAmJiBzZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uc2V0XTtcclxuICB9XHJcblxyXG4gIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcpIHtcclxuICAgIGxldCBmaWx0ZXJlZERhdGEgPSBbLi4ub3JpZ2luYWxEYXRhXTtcclxuXHJcbiAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgIGlmIChrZXkgIT0ga2V5VG9Ta2lwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldID49IHZhbHVlLm1pbiAmJiBvYmpba2V5XSA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnREYXRlXCIgfHwga2V5ID09PSBcImVuZERhdGVcIiB8fCBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IGtleSA9PSBcImRhdGVcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmlzT2JqZWN0SW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIiApIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fCBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiXHJcbiAgICAgICAgICB8fCBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVNdWx0aVwiIHx8IGtleSA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIHJldHVybk9yZGVyc0luVGhlUmFuZ2Uob3JkZXI6IGFueSwgcmFuZ2U6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU2VsZWN0ZWRSYW5nZSA9IG1vbWVudChvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSA9IG1vbWVudChvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGUgPSBtb21lbnQob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICByZXR1cm4gaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgfHwgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlIHx8IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZTtcclxuICB9XHJcblxyXG4gIHJldHVybkRhdGFGb3JUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG4gICAgbGV0IHNlbGVjdGVkU3RhcnREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRFbmREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0YS5lbmRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IG1vbWVudChvYmouc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IGVuZFRpbWUgPSBtb21lbnQob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkU3RhcnREYXRlKTtcclxuICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEuZnJvbVRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBtb21lbnQoc2VsZWN0ZWREYXRhLnRvVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcbiAgICBcclxuICAgIGlmIChbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialRpbWUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gXCIwXCIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XSA9PSBcIjBcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gb2JqVGltZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKG9ialRpbWUsIHRydWUpO1xyXG5cclxuICAgIC8vIG9ialRpbWUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgLy8gICBvYmpUaW1lWzBdICsgXCI6XCIgKyBvYmpUaW1lWzFdICsgXCIgXCIgKyBvYmpUaW1lWzJdLFxyXG4gICAgLy8gICB0cnVlXHJcbiAgICAvLyApO1xyXG4gICAgLy8gb2JqVGltZSA9IG9ialRpbWVbMF0gKyBcIjpcIiArIG9ialRpbWVbMV0gKyBcIjowMFwiO1xyXG5cclxuICAgIC8vIG9ialRpbWUgPSBtb21lbnQob2JqVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBtb21lbnRUaW1lID0gbW9tZW50KG9ialRpbWUsZm9ybWF0KTtcclxuICAgIGNvbnNvbGUubG9nKG1vbWVudFRpbWUpO1xyXG4gICAgY29uc29sZS5sb2coc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICBjb25zb2xlLmxvZyhzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgPSBtb21lbnRUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IG1vbWVudFRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZSA9IG1vbWVudFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lIHx8XHJcbiAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XHJcbiAgICAgIGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6YW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gbW9tZW50KHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG4gICAgXHJcbiAgICBpZihzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XVswXSA9PSBcIjBcIikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gXCIwXCIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBsZXQgc3RhcnRUaW1lID0gbW9tZW50KG9ialtrZXldWzFdLCBmb3JtYXQpO1xyXG4gICAgbGV0IGVuZFRpbWUgPSBtb21lbnQob2JqW2tleV1bMl0sIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgKTtcclxuXHJcbn1cclxuXHJcbiAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgcGFyc2luZ0Zvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xyXG4gICAgICBcclxuICAgICAgbGV0IG1vbWVudFN0YXJ0RGF0ZSA9IG1vbWVudChvYmouc3RhcnREYXRlKTtcclxuICAgICAgbGV0IG1vbWVudEVuZERhdGUgPSBtb21lbnQob2JqLmVuZERhdGUpO1xyXG4gICAgICBcclxuICAgICAgbGV0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnRTdGFydERhdGUuaXNCZXR3ZWVuKFxyXG4gICAgICAgIHZhbHVlLmZyb21EYXRlLFxyXG4gICAgICAgIHZhbHVlLnRvRGF0ZVxyXG4gICAgICApO1xyXG4gICAgICBsZXQgZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnRFbmREYXRlLmlzQmV0d2VlbihcclxuICAgICAgICB2YWx1ZS5mcm9tRGF0ZSxcclxuICAgICAgICB2YWx1ZS50b0RhdGVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIFxyXG4gICAgICBjb25zb2xlLmxvZyhtb21lbnQob2JqLnN0YXJ0RGF0ZSwgcGFyc2luZ0Zvcm1hdCkpO1xyXG4gICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUobW9tZW50U3RhcnREYXRlKTtcclxuICAgICAgbGV0IGVuZERhdGVJc1NhbWVBc1NlbEVuZERhdGUgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG1vbWVudEVuZERhdGUpO1xyXG5cclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcclxuICAgICAgICAoZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkFpckRhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHwga2V5ID09PSBcImZsaWdodEVuZERhdGVcIikge1xyXG4gICAgICBwYXJzaW5nRm9ybWF0ID0gXCJNTS9ERC9ZWVlZXCI7XHJcbiAgICAgIGxldCBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IG1vbWVudChvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNCZXR3ZWVuKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSwgdmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSBtb21lbnQob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IG1vbWVudChvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1heFNlbGVjdGVkRGF0ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlIHx8IGRhdGVJc1NhbWVBc1NlbEVuZERhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGluaXRpYWxpemVUaW1lRmlsdGVyRGF0YShjbG9uZWREYXRhOiBhbnlbXSwga2V5ID0gXCJzdGFydEVuZFRpbWVcIikge1xyXG4gICAgbGV0IHN0YXJ0VGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcInN0YXJ0VGltZVwiKTtcclxuICAgIGxldCBlbmRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsIFwiZW5kVGltZVwiKTtcclxuICBcclxuICAgIHN0YXJ0VGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBlbmRUaW1lQXJyLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBsZXQgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICBlbmRUaW1lOiBlbmRUaW1lQXJyWzBdLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIGluaXRpYWxTdGFydEVuZFRpbWUpO1xyXG4gIH0gXHJcblxyXG4gIHJldHVybkNvbHVtbkZpbHRlclN0YXR1cyhkYXRhOiBhbnlbXSwgaGVhZGVyTmFtZTogc3RyaW5nIHwgbnVtYmVyKSB7XHJcblxyXG4gICAgaWYoaGVhZGVyTmFtZSA9PSBcInN0YXJ0RW5kVGltZVwiKXtcclxuICAgICAgbGV0IHRpbWUgPSBkYXRhLm1hcCh1ID0+IHVbaGVhZGVyTmFtZV1bMF0pO1xyXG4gICAgICBsZXQgdW5pcVRpbWUgPSB1bmlxKHRpbWUpO1xyXG4gICAgICByZXR1cm4gdW5pcVRpbWUubGVuZ3RoID09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV0pKS5sZW5ndGggPiAxID8gZmFsc2UgOiB0cnVlO1xyXG4gIH1cclxuICBcclxuICBnZXRGaWx0ZXJPcHRpb25zRGF0YShkYXRhOiBhbnlbXSwgY2xvbmVkRGF0YTogYW55W10pe1xyXG4gICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICBjb25zb2xlLmxvZyhcImFwcGxpZWRGaWx0ZXJTZXRcIik7XHJcbiAgICBjb25zb2xlLmxvZyhhcHBsaWVkRmlsdGVyU2V0KTtcclxuICAgIGlmKGFwcGxpZWRGaWx0ZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpe1xyXG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEYXRhKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KXtcclxuICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YSx2YWx1ZSk7XHJcbiAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YTogYW55W10sdmFsdWU6IGFueSl7XHJcbiAgICBsZXQgaW5pdGlhbFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkoY2xvbmVkRGF0YS5tYXAoaXRlbSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgIGxldCBjdXJyZW50VmFsdWVPZkNvbHVtbiA9IHNvcnRCeSh0aGlzLmFwcGx5RmlsdGVyKGNsb25lZERhdGEsdmFsdWUpLm1hcChpdGVtID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xyXG4gICAgcmV0dXJuICFpc0VxdWFsKGluaXRpYWxWYWx1ZU9mQ29sdW1uLCBjdXJyZW50VmFsdWVPZkNvbHVtbik7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcihkYXRhOiBhbnlbXSx2YWx1ZTogYW55KXtcclxuICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgbGV0IGtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChrZXkgPT09IFwic3RhcnREYXRlXCIgfHwga2V5ID09PSBcImVuZERhdGVcIiB8fCBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IGtleSA9PSBcImRhdGVcIikge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInBlcmlvZFwiICkge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5nZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IGtleSA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCJcclxuICAgICAgICB8fCBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIikge1xyXG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVNdWx0aVwiIHx8IGtleSA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTsgIFxyXG4gIH1cclxuXHJcbiAgaXNPYmplY3RJblRoZVJhbmdlKG9iajogYW55LCB2YWx1ZToge2Zyb21EYXRlOiBtb21lbnQuTW9tZW50LCB0b0RhdGU6IG1vbWVudC5Nb21lbnR9LGtleTpzdHJpbmcpe1xyXG4gICAgbGV0IG9ialZhbCA9IG9ialtrZXldO1xyXG4gICAgbGV0IG1vbWVudERhdGUgPSBtb21lbnQob2JqVmFsKTtcclxuICAgIGNvbnNvbGUubG9nKG9ialZhbCk7XHJcbiAgICBjb25zb2xlLmxvZyh2YWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICBsZXQgaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICBsZXQgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlID0gbW9tZW50RGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsdmFsdWUudG9EYXRlKTtcclxuICAgIHJldHVybiBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgfHwgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSB8fCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlO1xyXG4gIH1cclxuICAgIFxyXG59XHJcbiJdfQ==
|