@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.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.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs
ADDED
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { NgStyle } from '@angular/common';
|
|
2
|
+
import { Component, DestroyRef, EnvironmentInjector, NgZone, computed, inject, signal } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { FocusTrapFactory } from '@angular/cdk/a11y';
|
|
5
|
+
import { Overlay } from '@angular/cdk/overlay';
|
|
6
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
7
|
+
import { combineLatest, debounceTime, fromEvent } from 'rxjs';
|
|
8
|
+
import { disableBodyScroll, enableBodyScroll } from '../../../../core/utils/body-scroll.util';
|
|
9
|
+
import { SpotlightComponent } from '../../spotlight.component';
|
|
10
|
+
import { SpotlightTourService } from '../../services/spotlight-tour.service';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
const POPOVER_WIDTH = 342;
|
|
13
|
+
const SPOTLIGHT_PADDING = 8;
|
|
14
|
+
const ARROW_HALF_SIZE = 8;
|
|
15
|
+
const ARROW_OFFSET_MIN = 4;
|
|
16
|
+
const ARROW_OFFSET_MAX = POPOVER_WIDTH - 4 - 16;
|
|
17
|
+
const MASK_BG = 'rgba(0,0,0,0.5)';
|
|
18
|
+
const MASK_TRANSITION = 'all 0.2s ease';
|
|
19
|
+
const OVERLAY_Z = '10000';
|
|
20
|
+
const POPOVER_Z = '10001';
|
|
21
|
+
function createMaskBaseStyle() {
|
|
22
|
+
return {
|
|
23
|
+
position: 'fixed',
|
|
24
|
+
'z-index': OVERLAY_Z,
|
|
25
|
+
background: MASK_BG,
|
|
26
|
+
transition: MASK_TRANSITION,
|
|
27
|
+
cursor: 'default'
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function createHiddenMaskStyle() {
|
|
31
|
+
return {
|
|
32
|
+
...createMaskBaseStyle(),
|
|
33
|
+
top: '0',
|
|
34
|
+
left: '0',
|
|
35
|
+
width: '0',
|
|
36
|
+
height: '0'
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function toConnectedPositions(position) {
|
|
40
|
+
const [direction, alignment] = position.split('-');
|
|
41
|
+
const padding = SPOTLIGHT_PADDING + 2;
|
|
42
|
+
const horizontalAlignment = alignment;
|
|
43
|
+
const verticalAlignmentMap = {
|
|
44
|
+
start: 'top',
|
|
45
|
+
center: 'center',
|
|
46
|
+
end: 'bottom'
|
|
47
|
+
};
|
|
48
|
+
const verticalAlignment = verticalAlignmentMap[alignment] ?? 'center';
|
|
49
|
+
let primary;
|
|
50
|
+
let opposite;
|
|
51
|
+
switch (direction) {
|
|
52
|
+
case 'top':
|
|
53
|
+
primary = {
|
|
54
|
+
originX: horizontalAlignment,
|
|
55
|
+
originY: 'top',
|
|
56
|
+
overlayX: horizontalAlignment,
|
|
57
|
+
overlayY: 'bottom',
|
|
58
|
+
offsetY: -padding
|
|
59
|
+
};
|
|
60
|
+
opposite = {
|
|
61
|
+
originX: horizontalAlignment,
|
|
62
|
+
originY: 'bottom',
|
|
63
|
+
overlayX: horizontalAlignment,
|
|
64
|
+
overlayY: 'top',
|
|
65
|
+
offsetY: padding
|
|
66
|
+
};
|
|
67
|
+
break;
|
|
68
|
+
case 'right':
|
|
69
|
+
primary = {
|
|
70
|
+
originX: 'end',
|
|
71
|
+
originY: verticalAlignment,
|
|
72
|
+
overlayX: 'start',
|
|
73
|
+
overlayY: verticalAlignment,
|
|
74
|
+
offsetX: padding
|
|
75
|
+
};
|
|
76
|
+
opposite = {
|
|
77
|
+
originX: 'start',
|
|
78
|
+
originY: verticalAlignment,
|
|
79
|
+
overlayX: 'end',
|
|
80
|
+
overlayY: verticalAlignment,
|
|
81
|
+
offsetX: -padding
|
|
82
|
+
};
|
|
83
|
+
break;
|
|
84
|
+
case 'left':
|
|
85
|
+
primary = {
|
|
86
|
+
originX: 'start',
|
|
87
|
+
originY: verticalAlignment,
|
|
88
|
+
overlayX: 'end',
|
|
89
|
+
overlayY: verticalAlignment,
|
|
90
|
+
offsetX: -padding
|
|
91
|
+
};
|
|
92
|
+
opposite = {
|
|
93
|
+
originX: 'end',
|
|
94
|
+
originY: verticalAlignment,
|
|
95
|
+
overlayX: 'start',
|
|
96
|
+
overlayY: verticalAlignment,
|
|
97
|
+
offsetX: padding
|
|
98
|
+
};
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
primary = {
|
|
102
|
+
originX: horizontalAlignment,
|
|
103
|
+
originY: 'bottom',
|
|
104
|
+
overlayX: horizontalAlignment,
|
|
105
|
+
overlayY: 'top',
|
|
106
|
+
offsetY: padding
|
|
107
|
+
};
|
|
108
|
+
opposite = {
|
|
109
|
+
originX: horizontalAlignment,
|
|
110
|
+
originY: 'top',
|
|
111
|
+
overlayX: horizontalAlignment,
|
|
112
|
+
overlayY: 'bottom',
|
|
113
|
+
offsetY: -padding
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return [
|
|
117
|
+
primary,
|
|
118
|
+
opposite,
|
|
119
|
+
{ originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: padding },
|
|
120
|
+
{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -padding },
|
|
121
|
+
{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: padding },
|
|
122
|
+
{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -padding }
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
export class SpotlightOverlayComponent {
|
|
126
|
+
tourService = inject(SpotlightTourService);
|
|
127
|
+
destroyRef = inject(DestroyRef);
|
|
128
|
+
zone = inject(NgZone);
|
|
129
|
+
overlay = inject(Overlay);
|
|
130
|
+
environmentInjector = inject(EnvironmentInjector);
|
|
131
|
+
focusTrapFactory = inject(FocusTrapFactory);
|
|
132
|
+
isActive = this.tourService.isActive;
|
|
133
|
+
currentStep = this.tourService.currentStep;
|
|
134
|
+
currentIndex = this.tourService.currentIndex;
|
|
135
|
+
totalSteps = this.tourService.totalSteps;
|
|
136
|
+
targetRect = signal(null);
|
|
137
|
+
topMaskStyle = computed(() => {
|
|
138
|
+
const rect = this.targetRect();
|
|
139
|
+
const base = createMaskBaseStyle();
|
|
140
|
+
if (!rect) {
|
|
141
|
+
return { ...base, top: '0', left: '0', right: '0', bottom: '0' };
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
...base,
|
|
145
|
+
top: '0',
|
|
146
|
+
left: '0',
|
|
147
|
+
right: '0',
|
|
148
|
+
height: `${Math.max(0, rect.top - SPOTLIGHT_PADDING)}px`
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
leftMaskStyle = computed(() => {
|
|
152
|
+
const rect = this.targetRect();
|
|
153
|
+
if (!rect) {
|
|
154
|
+
return createHiddenMaskStyle();
|
|
155
|
+
}
|
|
156
|
+
const top = Math.max(0, rect.top - SPOTLIGHT_PADDING);
|
|
157
|
+
const bottom = Math.min(window.innerHeight, rect.bottom + SPOTLIGHT_PADDING);
|
|
158
|
+
const left = Math.max(0, rect.left - SPOTLIGHT_PADDING);
|
|
159
|
+
return {
|
|
160
|
+
position: 'fixed',
|
|
161
|
+
'z-index': OVERLAY_Z,
|
|
162
|
+
background: MASK_BG,
|
|
163
|
+
transition: MASK_TRANSITION,
|
|
164
|
+
cursor: 'default',
|
|
165
|
+
top: `${top}px`,
|
|
166
|
+
left: '0',
|
|
167
|
+
width: `${left}px`,
|
|
168
|
+
height: `${bottom - top}px`
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
rightMaskStyle = computed(() => {
|
|
172
|
+
const rect = this.targetRect();
|
|
173
|
+
if (!rect) {
|
|
174
|
+
return createHiddenMaskStyle();
|
|
175
|
+
}
|
|
176
|
+
const top = Math.max(0, rect.top - SPOTLIGHT_PADDING);
|
|
177
|
+
const bottom = Math.min(window.innerHeight, rect.bottom + SPOTLIGHT_PADDING);
|
|
178
|
+
const right = Math.min(window.innerWidth, rect.right + SPOTLIGHT_PADDING);
|
|
179
|
+
return {
|
|
180
|
+
position: 'fixed',
|
|
181
|
+
'z-index': OVERLAY_Z,
|
|
182
|
+
background: MASK_BG,
|
|
183
|
+
transition: MASK_TRANSITION,
|
|
184
|
+
cursor: 'default',
|
|
185
|
+
top: `${top}px`,
|
|
186
|
+
left: `${right}px`,
|
|
187
|
+
right: '0',
|
|
188
|
+
height: `${bottom - top}px`
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
bottomMaskStyle = computed(() => {
|
|
192
|
+
const rect = this.targetRect();
|
|
193
|
+
if (!rect) {
|
|
194
|
+
return createHiddenMaskStyle();
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
position: 'fixed',
|
|
198
|
+
'z-index': OVERLAY_Z,
|
|
199
|
+
background: MASK_BG,
|
|
200
|
+
transition: MASK_TRANSITION,
|
|
201
|
+
cursor: 'default',
|
|
202
|
+
top: `${Math.min(window.innerHeight, rect.bottom + SPOTLIGHT_PADDING)}px`,
|
|
203
|
+
left: '0',
|
|
204
|
+
right: '0',
|
|
205
|
+
bottom: '0'
|
|
206
|
+
};
|
|
207
|
+
});
|
|
208
|
+
transparentBlockerStyle = computed(() => ({
|
|
209
|
+
position: 'fixed',
|
|
210
|
+
top: '0',
|
|
211
|
+
left: '0',
|
|
212
|
+
right: '0',
|
|
213
|
+
bottom: '0',
|
|
214
|
+
'z-index': OVERLAY_Z,
|
|
215
|
+
cursor: 'default'
|
|
216
|
+
}));
|
|
217
|
+
resizeObserver = null;
|
|
218
|
+
popoverOverlayRef = null;
|
|
219
|
+
popoverComponentRef = null;
|
|
220
|
+
popoverSubscriptions = [];
|
|
221
|
+
focusTrap = null;
|
|
222
|
+
previouslyFocusedElement = null;
|
|
223
|
+
constructor() {
|
|
224
|
+
combineLatest([
|
|
225
|
+
toObservable(this.currentStep),
|
|
226
|
+
toObservable(this.isActive),
|
|
227
|
+
toObservable(this.tourService.registrationVersion)
|
|
228
|
+
])
|
|
229
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
230
|
+
.subscribe(([step, active]) => {
|
|
231
|
+
this.disconnectResizeObserver();
|
|
232
|
+
if (!step || !active) {
|
|
233
|
+
this.targetRect.set(null);
|
|
234
|
+
this.destroyPopoverOverlay();
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const element = this.tourService.getElement(step.stepId);
|
|
238
|
+
if (element?.nativeElement) {
|
|
239
|
+
element.nativeElement.scrollIntoView({ block: 'nearest' });
|
|
240
|
+
this.syncResolvedElement(element.nativeElement, step);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
this.targetRect.set(null);
|
|
244
|
+
this.updatePopoverOverlay(null, step);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
ngOnInit() {
|
|
248
|
+
this.zone.runOutsideAngular(() => {
|
|
249
|
+
this.subscribeToViewportUpdates();
|
|
250
|
+
this.subscribeToEscapeKey();
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
ngOnDestroy() {
|
|
254
|
+
this.destroyPopoverOverlay();
|
|
255
|
+
}
|
|
256
|
+
onNext() {
|
|
257
|
+
this.tourService.next();
|
|
258
|
+
}
|
|
259
|
+
onPrevious() {
|
|
260
|
+
this.tourService.previous();
|
|
261
|
+
}
|
|
262
|
+
onClose() {
|
|
263
|
+
this.tourService.stop();
|
|
264
|
+
}
|
|
265
|
+
onDismiss() {
|
|
266
|
+
const step = this.currentStep();
|
|
267
|
+
if (!step || step.dismissible === false) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
this.tourService.stop({
|
|
271
|
+
reason: this.totalSteps() === 1 ? 'dismissed' : 'interrupted',
|
|
272
|
+
doNotShowAgain: false
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
updatePopoverOverlay(target, step) {
|
|
276
|
+
const strategy = target
|
|
277
|
+
? this.overlay
|
|
278
|
+
.position()
|
|
279
|
+
.flexibleConnectedTo(target)
|
|
280
|
+
.withPositions(toConnectedPositions(step.position ?? 'bottom-center'))
|
|
281
|
+
.withFlexibleDimensions(false)
|
|
282
|
+
.withPush(true)
|
|
283
|
+
.withViewportMargin(8)
|
|
284
|
+
: this.overlay.position().global().centerHorizontally().centerVertically();
|
|
285
|
+
if (!this.popoverOverlayRef) {
|
|
286
|
+
this.popoverOverlayRef = this.overlay.create({
|
|
287
|
+
hasBackdrop: false,
|
|
288
|
+
scrollStrategy: target
|
|
289
|
+
? this.overlay.scrollStrategies.reposition()
|
|
290
|
+
: this.overlay.scrollStrategies.noop(),
|
|
291
|
+
positionStrategy: strategy,
|
|
292
|
+
width: POPOVER_WIDTH
|
|
293
|
+
});
|
|
294
|
+
this.setPopoverZIndex();
|
|
295
|
+
this.attachPopoverPortal(step);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
this.popoverOverlayRef.updatePositionStrategy(strategy);
|
|
299
|
+
this.popoverOverlayRef.updatePosition();
|
|
300
|
+
this.updatePopoverInputs(step);
|
|
301
|
+
if (target) {
|
|
302
|
+
this.scheduleSync();
|
|
303
|
+
}
|
|
304
|
+
this.scheduleFocusTrapRefocus();
|
|
305
|
+
}
|
|
306
|
+
setPopoverZIndex() {
|
|
307
|
+
if (!this.popoverOverlayRef) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
this.popoverOverlayRef.overlayElement.style.zIndex = POPOVER_Z;
|
|
311
|
+
const host = this.popoverOverlayRef.hostElement;
|
|
312
|
+
if (host !== this.popoverOverlayRef.overlayElement) {
|
|
313
|
+
host.style.zIndex = POPOVER_Z;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
attachPopoverPortal(step) {
|
|
317
|
+
this.previouslyFocusedElement = document.activeElement;
|
|
318
|
+
this.popoverComponentRef = this.popoverOverlayRef?.attach(new ComponentPortal(SpotlightComponent, null, this.environmentInjector)) ?? null;
|
|
319
|
+
this.updatePopoverInputs(step);
|
|
320
|
+
this.scheduleSync();
|
|
321
|
+
if (this.totalSteps() > 1) {
|
|
322
|
+
this.activateTourMode();
|
|
323
|
+
}
|
|
324
|
+
if (!this.popoverComponentRef) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
this.popoverSubscriptions.push(this.popoverComponentRef.instance.next.subscribe(() => {
|
|
328
|
+
const doNotShowAgain = this.popoverComponentRef?.instance.isDoNotShowAgainChecked() ?? false;
|
|
329
|
+
this.tourService.next(doNotShowAgain);
|
|
330
|
+
}), this.popoverComponentRef.instance.previous.subscribe(() => this.tourService.previous()), this.popoverComponentRef.instance.closed.subscribe(() => this.tourService.stop({
|
|
331
|
+
reason: this.totalSteps() === 1 ? 'dismissed' : 'interrupted',
|
|
332
|
+
doNotShowAgain: false
|
|
333
|
+
})), this.popoverComponentRef.instance.understand.subscribe(() => {
|
|
334
|
+
const doNotShowAgain = this.popoverComponentRef?.instance.isDoNotShowAgainChecked() ?? false;
|
|
335
|
+
this.tourService.stop({ reason: 'completed', doNotShowAgain });
|
|
336
|
+
}));
|
|
337
|
+
}
|
|
338
|
+
updatePopoverInputs(step) {
|
|
339
|
+
if (!this.popoverComponentRef) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
this.popoverComponentRef.setInput('title', step.title);
|
|
343
|
+
this.popoverComponentRef.setInput('message', step.message);
|
|
344
|
+
this.popoverComponentRef.setInput('position', step.position ?? 'bottom-center');
|
|
345
|
+
this.popoverComponentRef.setInput('currentStep', this.currentIndex() + 1);
|
|
346
|
+
this.popoverComponentRef.setInput('totalSteps', this.totalSteps());
|
|
347
|
+
this.popoverComponentRef.setInput('content', step.content ?? null);
|
|
348
|
+
this.popoverComponentRef.setInput('actions', step.actions ?? []);
|
|
349
|
+
this.popoverComponentRef.setInput('showDoNotShowAgain', step.showDoNotShowAgain ?? true);
|
|
350
|
+
this.popoverComponentRef.setInput('arrowOffsetPx', null);
|
|
351
|
+
}
|
|
352
|
+
scheduleSync() {
|
|
353
|
+
this.zone.runOutsideAngular(() => {
|
|
354
|
+
requestAnimationFrame(() => {
|
|
355
|
+
this.zone.run(() => this.syncDirectionAndArrow());
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
activateTourMode() {
|
|
360
|
+
disableBodyScroll();
|
|
361
|
+
this.zone.runOutsideAngular(() => {
|
|
362
|
+
requestAnimationFrame(() => {
|
|
363
|
+
this.zone.run(() => {
|
|
364
|
+
const paneElement = this.popoverOverlayRef?.overlayElement;
|
|
365
|
+
if (!paneElement) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
this.focusTrap = this.focusTrapFactory.create(paneElement);
|
|
369
|
+
this.focusTrap.focusInitialElementWhenReady();
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
scheduleFocusTrapRefocus() {
|
|
375
|
+
if (!this.focusTrap) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
this.zone.runOutsideAngular(() => {
|
|
379
|
+
requestAnimationFrame(() => {
|
|
380
|
+
this.zone.run(() => this.focusTrap?.focusFirstTabbableElement());
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
subscribeToViewportUpdates() {
|
|
385
|
+
fromEvent(document, 'scroll', { capture: true, passive: true })
|
|
386
|
+
.pipe(debounceTime(16), takeUntilDestroyed(this.destroyRef))
|
|
387
|
+
.subscribe(() => this.runOverlayRefresh());
|
|
388
|
+
fromEvent(window, 'resize', { passive: true })
|
|
389
|
+
.pipe(debounceTime(16), takeUntilDestroyed(this.destroyRef))
|
|
390
|
+
.subscribe(() => this.runOverlayRefresh());
|
|
391
|
+
}
|
|
392
|
+
subscribeToEscapeKey() {
|
|
393
|
+
fromEvent(document, 'keydown')
|
|
394
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
395
|
+
.subscribe((event) => {
|
|
396
|
+
if (event.key === 'Escape') {
|
|
397
|
+
this.zone.run(() => this.onDismiss());
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
runOverlayRefresh() {
|
|
402
|
+
this.zone.run(() => {
|
|
403
|
+
this.refreshRect();
|
|
404
|
+
this.popoverOverlayRef?.updatePosition();
|
|
405
|
+
this.scheduleSync();
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
syncResolvedElement(target, step) {
|
|
409
|
+
this.zone.runOutsideAngular(() => {
|
|
410
|
+
requestAnimationFrame(() => {
|
|
411
|
+
this.zone.run(() => this.applyResolvedElement(target, step));
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
applyResolvedElement(target, step) {
|
|
416
|
+
if (!this.isActive()) {
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
this.updateTargetRect(target);
|
|
420
|
+
this.observeElement(target);
|
|
421
|
+
this.updatePopoverOverlay(target, step);
|
|
422
|
+
}
|
|
423
|
+
syncDirectionAndArrow() {
|
|
424
|
+
const ref = this.popoverComponentRef;
|
|
425
|
+
const pane = this.popoverOverlayRef?.overlayElement.getBoundingClientRect();
|
|
426
|
+
const rect = this.targetRect();
|
|
427
|
+
if (!ref || !pane || !rect) {
|
|
428
|
+
ref?.setInput('arrowOffsetPx', null);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
const direction = this.computeDirection(pane, rect);
|
|
432
|
+
ref.setInput('position', `${direction}-center`);
|
|
433
|
+
const offset = this.computeArrowOffset(pane, rect, direction);
|
|
434
|
+
ref.setInput('arrowOffsetPx', Math.max(ARROW_OFFSET_MIN, Math.min(ARROW_OFFSET_MAX, offset)));
|
|
435
|
+
}
|
|
436
|
+
computeDirection(pane, rect) {
|
|
437
|
+
const tolerance = SPOTLIGHT_PADDING + 4;
|
|
438
|
+
if (pane.top >= rect.bottom - tolerance) {
|
|
439
|
+
return 'bottom';
|
|
440
|
+
}
|
|
441
|
+
if (pane.bottom <= rect.top + tolerance) {
|
|
442
|
+
return 'top';
|
|
443
|
+
}
|
|
444
|
+
if (pane.left >= rect.right - tolerance) {
|
|
445
|
+
return 'right';
|
|
446
|
+
}
|
|
447
|
+
if (pane.right <= rect.left + tolerance) {
|
|
448
|
+
return 'left';
|
|
449
|
+
}
|
|
450
|
+
return this.computeDirectionByDistance(pane, rect);
|
|
451
|
+
}
|
|
452
|
+
computeDirectionByDistance(pane, rect) {
|
|
453
|
+
const paneCenterY = pane.top + pane.height / 2;
|
|
454
|
+
const rectCenterY = rect.top + rect.height / 2;
|
|
455
|
+
const paneCenterX = pane.left + pane.width / 2;
|
|
456
|
+
const rectCenterX = rect.left + rect.width / 2;
|
|
457
|
+
const deltaY = Math.abs(paneCenterY - rectCenterY);
|
|
458
|
+
const deltaX = Math.abs(paneCenterX - rectCenterX);
|
|
459
|
+
const isVerticalPreferred = deltaY >= deltaX;
|
|
460
|
+
const isAboveTarget = paneCenterY < rectCenterY;
|
|
461
|
+
const verticalDirection = isAboveTarget ? 'top' : 'bottom';
|
|
462
|
+
const horizontalDirection = paneCenterX < rectCenterX ? 'left' : 'right';
|
|
463
|
+
return isVerticalPreferred ? verticalDirection : horizontalDirection;
|
|
464
|
+
}
|
|
465
|
+
computeArrowOffset(pane, rect, direction) {
|
|
466
|
+
const targetCenterX = rect.left + rect.width / 2;
|
|
467
|
+
const targetCenterY = rect.top + rect.height / 2;
|
|
468
|
+
return direction === 'top' || direction === 'bottom'
|
|
469
|
+
? targetCenterX - pane.left - ARROW_HALF_SIZE
|
|
470
|
+
: targetCenterY - pane.top - ARROW_HALF_SIZE;
|
|
471
|
+
}
|
|
472
|
+
destroyPopoverOverlay() {
|
|
473
|
+
this.popoverSubscriptions.forEach((subscription) => subscription.unsubscribe());
|
|
474
|
+
this.popoverSubscriptions = [];
|
|
475
|
+
this.popoverComponentRef = null;
|
|
476
|
+
if (this.focusTrap) {
|
|
477
|
+
this.focusTrap.destroy();
|
|
478
|
+
this.focusTrap = null;
|
|
479
|
+
}
|
|
480
|
+
enableBodyScroll();
|
|
481
|
+
if (this.previouslyFocusedElement) {
|
|
482
|
+
this.previouslyFocusedElement.focus();
|
|
483
|
+
this.previouslyFocusedElement = null;
|
|
484
|
+
}
|
|
485
|
+
if (this.popoverOverlayRef) {
|
|
486
|
+
this.popoverOverlayRef.detach();
|
|
487
|
+
this.popoverOverlayRef.dispose();
|
|
488
|
+
this.popoverOverlayRef = null;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
updateTargetRect(element) {
|
|
492
|
+
this.targetRect.set(element.getBoundingClientRect());
|
|
493
|
+
}
|
|
494
|
+
refreshRect() {
|
|
495
|
+
const step = this.currentStep();
|
|
496
|
+
if (!step || !this.isActive()) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
const element = this.tourService.getElement(step.stepId);
|
|
500
|
+
if (element?.nativeElement) {
|
|
501
|
+
this.updateTargetRect(element.nativeElement);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
observeElement(element) {
|
|
505
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
506
|
+
this.zone.run(() => this.updateTargetRect(element));
|
|
507
|
+
});
|
|
508
|
+
this.resizeObserver.observe(element);
|
|
509
|
+
}
|
|
510
|
+
disconnectResizeObserver() {
|
|
511
|
+
this.resizeObserver?.disconnect();
|
|
512
|
+
this.resizeObserver = null;
|
|
513
|
+
}
|
|
514
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
515
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpotlightOverlayComponent, isStandalone: true, selector: "sdc-spotlight-overlay", ngImport: i0, template: "@if (isActive() && currentStep(); as step) {\n@if (step.showBackdrop !== false) {\n<button\n type=\"button\"\n [ngStyle]=\"topMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n\n@if (targetRect()) {\n<button\n type=\"button\"\n [ngStyle]=\"leftMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"rightMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"bottomMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n\n@if (step.showBackdrop === false) {\n@if (step.dismissible === false) {\n<div [ngStyle]=\"transparentBlockerStyle()\"></div>\n} @else {\n<button\n type=\"button\"\n [ngStyle]=\"transparentBlockerStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n}\n", dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
516
|
+
}
|
|
517
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightOverlayComponent, decorators: [{
|
|
518
|
+
type: Component,
|
|
519
|
+
args: [{ selector: 'sdc-spotlight-overlay', standalone: true, imports: [NgStyle], template: "@if (isActive() && currentStep(); as step) {\n@if (step.showBackdrop !== false) {\n<button\n type=\"button\"\n [ngStyle]=\"topMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n\n@if (targetRect()) {\n<button\n type=\"button\"\n [ngStyle]=\"leftMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"rightMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"bottomMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n\n@if (step.showBackdrop === false) {\n@if (step.dismissible === false) {\n<div [ngStyle]=\"transparentBlockerStyle()\"></div>\n} @else {\n<button\n type=\"button\"\n [ngStyle]=\"transparentBlockerStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n}\n" }]
|
|
520
|
+
}], ctorParameters: () => [] });
|
|
521
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9zcG90bGlnaHQvY29tcG9uZW50cy9zcG90bGlnaHQtb3ZlcmxheS9zcG90bGlnaHQtb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Nwb3RsaWdodC9jb21wb25lbnRzL3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsTUFBTSxFQUdOLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7O0FBSTdFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztB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NEZBQXpCLHlCQUF5QixpRkN4SnRDLHV3QkF1Q0EsNENEOEdZLE9BQU87OzRGQUdOLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRGVzdHJveVJlZixcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZGlzYWJsZUJvZHlTY3JvbGwsIGVuYWJsZUJvZHlTY3JvbGwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL2JvZHktc2Nyb2xsLnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBTcG90bGlnaHRQb3NpdGlvbiwgU3BvdGxpZ2h0U3RlcCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdHlwZXMvc3BvdGxpZ2h0LnR5cGUnO1xuaW1wb3J0IHsgU3BvdGxpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3BvdGxpZ2h0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcG90bGlnaHRUb3VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Nwb3RsaWdodC10b3VyLnNlcnZpY2UnO1xuXG50eXBlIFNwb3RsaWdodERpcmVjdGlvbiA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuXG5jb25zdCBQT1BPVkVSX1dJRFRIID0gMzQyO1xuY29uc3QgU1BPVExJR0hUX1BBRERJTkcgPSA4O1xuY29uc3QgQVJST1dfSEFMRl9TSVpFID0gODtcbmNvbnN0IEFSUk9XX09GRlNFVF9NSU4gPSA0O1xuY29uc3QgQVJST1dfT0ZGU0VUX01BWCA9IFBPUE9WRVJfV0lEVEggLSA0IC0gMTY7XG5jb25zdCBNQVNLX0JHID0gJ3JnYmEoMCwwLDAsMC41KSc7XG5jb25zdCBNQVNLX1RSQU5TSVRJT04gPSAnYWxsIDAuMnMgZWFzZSc7XG5jb25zdCBPVkVSTEFZX1ogPSAnMTAwMDAnO1xuY29uc3QgUE9QT1ZFUl9aID0gJzEwMDAxJztcblxuZnVuY3Rpb24gY3JlYXRlTWFza0Jhc2VTdHlsZSgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIaWRkZW5NYXNrU3R5bGUoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiB7XG4gICAgLi4uY3JlYXRlTWFza0Jhc2VTdHlsZSgpLFxuICAgIHRvcDogJzAnLFxuICAgIGxlZnQ6ICcwJyxcbiAgICB3aWR0aDogJzAnLFxuICAgIGhlaWdodDogJzAnXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvQ29ubmVjdGVkUG9zaXRpb25zKHBvc2l0aW9uOiBTcG90bGlnaHRQb3NpdGlvbik6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICBjb25zdCBbZGlyZWN0aW9uLCBhbGlnbm1lbnRdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgY29uc3QgcGFkZGluZyA9IFNQT1RMSUdIVF9QQURESU5HICsgMjtcbiAgY29uc3QgaG9yaXpvbnRhbEFsaWdubWVudCA9IGFsaWdubWVudCBhcyAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgY29uc3QgdmVydGljYWxBbGlnbm1lbnRNYXA6IFJlY29yZDxzdHJpbmcsICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJz4gPSB7XG4gICAgc3RhcnQ6ICd0b3AnLFxuICAgIGNlbnRlcjogJ2NlbnRlcicsXG4gICAgZW5kOiAnYm90dG9tJ1xuICB9O1xuICBjb25zdCB2ZXJ0aWNhbEFsaWdubWVudCA9IHZlcnRpY2FsQWxpZ25tZW50TWFwW2FsaWdubWVudF0gPz8gJ2NlbnRlcic7XG5cbiAgbGV0IHByaW1hcnk6IENvbm5lY3RlZFBvc2l0aW9uO1xuICBsZXQgb3Bwb3NpdGU6IENvbm5lY3RlZFBvc2l0aW9uO1xuXG4gIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHByaW1hcnkgPSB7XG4gICAgICAgIG9yaWdpblg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogaG9yaXpvbnRhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICBvZmZzZXRZOiAtcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIG9wcG9zaXRlID0ge1xuICAgICAgICBvcmlnaW5YOiBob3Jpem9udGFsQWxpZ25tZW50LFxuICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgb2Zmc2V0WTogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHByaW1hcnkgPSB7XG4gICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb2Zmc2V0WDogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIG9wcG9zaXRlID0ge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICBvdmVybGF5WTogdmVydGljYWxBbGlnbm1lbnQsXG4gICAgICAgIG9mZnNldFg6IC1wYWRkaW5nXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICBwcmltYXJ5ID0ge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICBvdmVybGF5WTogdmVydGljYWxBbGlnbm1lbnQsXG4gICAgICAgIG9mZnNldFg6IC1wYWRkaW5nXG4gICAgICB9O1xuICAgICAgb3Bwb3NpdGUgPSB7XG4gICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb2Zmc2V0WDogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwcmltYXJ5ID0ge1xuICAgICAgICBvcmlnaW5YOiBob3Jpem9udGFsQWxpZ25tZW50LFxuICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgb2Zmc2V0WTogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIG9wcG9zaXRlID0ge1xuICAgICAgICBvcmlnaW5YOiBob3Jpem9udGFsQWxpZ25tZW50LFxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgb2Zmc2V0WTogLXBhZGRpbmdcbiAgICAgIH07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHByaW1hcnksXG4gICAgb3Bwb3NpdGUsXG4gICAgeyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICd0b3AnLCBvZmZzZXRZOiBwYWRkaW5nIH0sXG4gICAgeyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtcGFkZGluZyB9LFxuICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiBwYWRkaW5nIH0sXG4gICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IC1wYWRkaW5nIH1cbiAgXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXNwb3RsaWdodC1vdmVybGF5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nU3R5bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodE92ZXJsYXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdG91clNlcnZpY2UgPSBpbmplY3QoU3BvdGxpZ2h0VG91clNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb2N1c1RyYXBGYWN0b3J5ID0gaW5qZWN0KEZvY3VzVHJhcEZhY3RvcnkpO1xuXG4gIHJlYWRvbmx5IGlzQWN0aXZlID0gdGhpcy50b3VyU2VydmljZS5pc0FjdGl2ZTtcbiAgcmVhZG9ubHkgY3VycmVudFN0ZXAgPSB0aGlzLnRvdXJTZXJ2aWNlLmN1cnJlbnRTdGVwO1xuICByZWFkb25seSBjdXJyZW50SW5kZXggPSB0aGlzLnRvdXJTZXJ2aWNlLmN1cnJlbnRJbmRleDtcbiAgcmVhZG9ubHkgdG90YWxTdGVwcyA9IHRoaXMudG91clNlcnZpY2UudG90YWxTdGVwcztcbiAgcmVhZG9ubHkgdGFyZ2V0UmVjdCA9IHNpZ25hbDxET01SZWN0IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgdG9wTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcbiAgICBjb25zdCBiYXNlID0gY3JlYXRlTWFza0Jhc2VTdHlsZSgpO1xuXG4gICAgaWYgKCFyZWN0KSB7XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCB0b3A6ICcwJywgbGVmdDogJzAnLCByaWdodDogJzAnLCBib3R0b206ICcwJyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICByaWdodDogJzAnLFxuICAgICAgaGVpZ2h0OiBgJHtNYXRoLm1heCgwLCByZWN0LnRvcCAtIFNQT1RMSUdIVF9QQURESU5HKX1weGBcbiAgICB9O1xuICB9KTtcblxuICByZWFkb25seSBsZWZ0TWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgIGlmICghcmVjdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUhpZGRlbk1hc2tTdHlsZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wIC0gU1BPVExJR0hUX1BBRERJTkcpO1xuICAgIGNvbnN0IGJvdHRvbSA9IE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20gKyBTUE9UTElHSFRfUEFERElORyk7XG4gICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCAtIFNQT1RMSUdIVF9QQURESU5HKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgd2lkdGg6IGAke2xlZnR9cHhgLFxuICAgICAgaGVpZ2h0OiBgJHtib3R0b20gLSB0b3B9cHhgXG4gICAgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcmlnaHRNYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuXG4gICAgaWYgKCFyZWN0KSB7XG4gICAgICByZXR1cm4gY3JlYXRlSGlkZGVuTWFza1N0eWxlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBTUE9UTElHSFRfUEFERElORyk7XG4gICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSArIFNQT1RMSUdIVF9QQURESU5HKTtcbiAgICBjb25zdCByaWdodCA9IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCByZWN0LnJpZ2h0ICsgU1BPVExJR0hUX1BBRERJTkcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgJ3otaW5kZXgnOiBPVkVSTEFZX1osXG4gICAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgICAgdHJhbnNpdGlvbjogTUFTS19UUkFOU0lUSU9OLFxuICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICB0b3A6IGAke3RvcH1weGAsXG4gICAgICBsZWZ0OiBgJHtyaWdodH1weGAsXG4gICAgICByaWdodDogJzAnLFxuICAgICAgaGVpZ2h0OiBgJHtib3R0b20gLSB0b3B9cHhgXG4gICAgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYm90dG9tTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgIGlmICghcmVjdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUhpZGRlbk1hc2tTdHlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgdG9wOiBgJHtNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgU1BPVExJR0hUX1BBRERJTkcpfXB4YCxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICBib3R0b206ICcwJ1xuICAgIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRyYW5zcGFyZW50QmxvY2tlclN0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4gKHtcbiAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICB0b3A6ICcwJyxcbiAgICBsZWZ0OiAnMCcsXG4gICAgcmlnaHQ6ICcwJyxcbiAgICBib3R0b206ICcwJyxcbiAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICB9KSk7XG5cbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb3BvdmVyT3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTcG90bGlnaHRDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9wb3ZlclN1YnNjcmlwdGlvbnM6IEFycmF5PHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9PiA9IFtdO1xuICBwcml2YXRlIGZvY3VzVHJhcDogRm9jdXNUcmFwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuY3VycmVudFN0ZXApLFxuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuaXNBY3RpdmUpLFxuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMudG91clNlcnZpY2UucmVnaXN0cmF0aW9uVmVyc2lvbilcbiAgICBdKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChbc3RlcCwgYWN0aXZlXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpO1xuXG4gICAgICAgIGlmICghc3RlcCB8fCAhYWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy50YXJnZXRSZWN0LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRvdXJTZXJ2aWNlLmdldEVsZW1lbnQoc3RlcC5zdGVwSWQpO1xuXG4gICAgICAgIGlmIChlbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcblxuICAgICAgICAgIHRoaXMuc3luY1Jlc29sdmVkRWxlbWVudChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHN0ZXApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkobnVsbCwgc3RlcCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvVmlld3BvcnRVcGRhdGVzKCk7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvRXNjYXBlS2V5KCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdXJTZXJ2aWNlLm5leHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblByZXZpb3VzKCk6IHZvaWQge1xuICAgIHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGlzbWlzcygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5jdXJyZW50U3RlcCgpO1xuXG4gICAgaWYgKCFzdGVwIHx8IHN0ZXAuZGlzbWlzc2libGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50b3VyU2VydmljZS5zdG9wKHtcbiAgICAgIHJlYXNvbjogdGhpcy50b3RhbFN0ZXBzKCkgPT09IDEgPyAnZGlzbWlzc2VkJyA6ICdpbnRlcnJ1cHRlZCcsXG4gICAgICBkb05vdFNob3dBZ2FpbjogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9wb3Zlck92ZXJsYXkodGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwsIHN0ZXA6IFNwb3RsaWdodFN0ZXApOiB2b2lkIHtcbiAgICBjb25zdCBzdHJhdGVneSA9IHRhcmdldFxuICAgICAgPyB0aGlzLm92ZXJsYXlcbiAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0KVxuICAgICAgICAud2l0aFBvc2l0aW9ucyh0b0Nvbm5lY3RlZFBvc2l0aW9ucyhzdGVwLnBvc2l0aW9uID8/ICdib3R0b20tY2VudGVyJykpXG4gICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAud2l0aFB1c2godHJ1ZSlcbiAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgOiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCk7XG5cbiAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogdGFyZ2V0XG4gICAgICAgICAgPyB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKClcbiAgICAgICAgICA6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgICAgIHdpZHRoOiBQT1BPVkVSX1dJRFRIXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRQb3BvdmVyWkluZGV4KCk7XG4gICAgICB0aGlzLmF0dGFjaFBvcG92ZXJQb3J0YWwoc3RlcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHN0cmF0ZWd5KTtcbiAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXApO1xuXG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgdGhpcy5zY2hlZHVsZVN5bmMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlRm9jdXNUcmFwUmVmb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3BvdmVyWkluZGV4KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyT3ZlcmxheVJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUuekluZGV4ID0gUE9QT1ZFUl9aO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmhvc3RFbGVtZW50O1xuXG4gICAgaWYgKGhvc3QgIT09IHRoaXMucG9wb3Zlck92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQpIHtcbiAgICAgIGhvc3Quc3R5bGUuekluZGV4ID0gUE9QT1ZFUl9aO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoUG9wb3ZlclBvcnRhbChzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8uYXR0YWNoKFxuICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChTcG90bGlnaHRDb21wb25lbnQsIG51bGwsIHRoaXMuZW52aXJvbm1lbnRJbmplY3RvcilcbiAgICApID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXApO1xuICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG5cbiAgICBpZiAodGhpcy50b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlVG91ck1vZGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucG9wb3ZlclN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5uZXh0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvTm90U2hvd0FnYWluID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpID8/IGZhbHNlO1xuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLm5leHQoZG9Ob3RTaG93QWdhaW4pO1xuICAgICAgfSksXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UucHJldmlvdXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKSksXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuY2xvc2VkLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnN0b3Aoe1xuICAgICAgICAgIHJlYXNvbjogdGhpcy50b3RhbFN0ZXBzKCkgPT09IDEgPyAnZGlzbWlzc2VkJyA6ICdpbnRlcnJ1cHRlZCcsXG4gICAgICAgICAgZG9Ob3RTaG93QWdhaW46IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLnVuZGVyc3RhbmQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgZG9Ob3RTaG93QWdhaW4gPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWY/Lmluc3RhbmNlLmlzRG9Ob3RTaG93QWdhaW5DaGVja2VkKCkgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7IHJlYXNvbjogJ2NvbXBsZXRlZCcsIGRvTm90U2hvd0FnYWluIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXA6IFNwb3RsaWdodFN0ZXAgJiB7IHNob3dEb05vdFNob3dBZ2Fpbj86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLnNldElucHV0KCd0aXRsZScsIHN0ZXAudGl0bGUpO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnbWVzc2FnZScsIHN0ZXAubWVzc2FnZSk7XG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLnNldElucHV0KCdwb3NpdGlvbicsIHN0ZXAucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKTtcbiAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2N1cnJlbnRTdGVwJywgdGhpcy5jdXJyZW50SW5kZXgoKSArIDEpO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5zZXRJbnB1dCgndG90YWxTdGVwcycsIHRoaXMudG90YWxTdGVwcygpKTtcbiAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbnRlbnQnLCBzdGVwLmNvbnRlbnQgPz8gbnVsbCk7XG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLnNldElucHV0KCdhY3Rpb25zJywgc3RlcC5hY3Rpb25zID8/IFtdKTtcbiAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3Nob3dEb05vdFNob3dBZ2FpbicsIHN0ZXAuc2hvd0RvTm90U2hvd0FnYWluID8/IHRydWUpO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXJyb3dPZmZzZXRQeCcsIG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5zeW5jRGlyZWN0aW9uQW5kQXJyb3coKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVUb3VyTW9kZSgpOiB2b2lkIHtcbiAgICBkaXNhYmxlQm9keVNjcm9sbCgpO1xuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhbmVFbGVtZW50ID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoIXBhbmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSB0aGlzLmZvY3VzVHJhcEZhY3RvcnkuY3JlYXRlKHBhbmVFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlRm9jdXNUcmFwUmVmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c1RyYXA/LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9WaWV3cG9ydFVwZGF0ZXMoKTogdm9pZCB7XG4gICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0gYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ydW5PdmVybGF5UmVmcmVzaCgpKTtcblxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNiksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJ1bk92ZXJsYXlSZWZyZXNoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0VzY2FwZUtleSgpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25EaXNtaXNzKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcnVuT3ZlcmxheVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hSZWN0KCk7XG4gICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgdGhpcy5zY2hlZHVsZVN5bmMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Jlc29sdmVkRWxlbWVudCh0YXJnZXQ6IEhUTUxFbGVtZW50LCBzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5hcHBseVJlc29sdmVkRWxlbWVudCh0YXJnZXQsIHN0ZXApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJlc29sdmVkRWxlbWVudCh0YXJnZXQ6IEhUTUxFbGVtZW50LCBzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QodGFyZ2V0KTtcbiAgICB0aGlzLm9ic2VydmVFbGVtZW50KHRhcmdldCk7XG4gICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheSh0YXJnZXQsIHN0ZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jRGlyZWN0aW9uQW5kQXJyb3coKTogdm9pZCB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmO1xuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG5cbiAgICBpZiAoIXJlZiB8fCAhcGFuZSB8fCAhcmVjdCkge1xuICAgICAgcmVmPy5zZXRJbnB1dCgnYXJyb3dPZmZzZXRQeCcsIG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuY29tcHV0ZURpcmVjdGlvbihwYW5lLCByZWN0KTtcbiAgICByZWYuc2V0SW5wdXQoJ3Bvc2l0aW9uJywgYCR7ZGlyZWN0aW9ufS1jZW50ZXJgKTtcblxuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY29tcHV0ZUFycm93T2Zmc2V0KHBhbmUsIHJlY3QsIGRpcmVjdGlvbik7XG4gICAgcmVmLnNldElucHV0KCdhcnJvd09mZnNldFB4JywgTWF0aC5tYXgoQVJST1dfT0ZGU0VUX01JTiwgTWF0aC5taW4oQVJST1dfT0ZGU0VUX01BWCwgb2Zmc2V0KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRGlyZWN0aW9uKHBhbmU6IERPTVJlY3QsIHJlY3Q6IERPTVJlY3QpOiBTcG90bGlnaHREaXJlY3Rpb24ge1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IFNQT1RMSUdIVF9QQURESU5HICsgNDtcblxuICAgIGlmIChwYW5lLnRvcCA+PSByZWN0LmJvdHRvbSAtIHRvbGVyYW5jZSkge1xuICAgICAgcmV0dXJuICdib3R0b20nO1xuICAgIH1cbiAgICBpZiAocGFuZS5ib3R0b20gPD0gcmVjdC50b3AgKyB0b2xlcmFuY2UpIHtcbiAgICAgIHJldHVybiAndG9wJztcbiAgICB9XG4gICAgaWYgKHBhbmUubGVmdCA+PSByZWN0LnJpZ2h0IC0gdG9sZXJhbmNlKSB7XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gICAgaWYgKHBhbmUucmlnaHQgPD0gcmVjdC5sZWZ0ICsgdG9sZXJhbmNlKSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVEaXJlY3Rpb25CeURpc3RhbmNlKHBhbmUsIHJlY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRGlyZWN0aW9uQnlEaXN0YW5jZShwYW5lOiBET01SZWN0LCByZWN0OiBET01SZWN0KTogU3BvdGxpZ2h0RGlyZWN0aW9uIHtcbiAgICBjb25zdCBwYW5lQ2VudGVyWSA9IHBhbmUudG9wICsgcGFuZS5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IHJlY3RDZW50ZXJZID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDI7XG4gICAgY29uc3QgcGFuZUNlbnRlclggPSBwYW5lLmxlZnQgKyBwYW5lLndpZHRoIC8gMjtcbiAgICBjb25zdCByZWN0Q2VudGVyWCA9IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyO1xuXG4gICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnMocGFuZUNlbnRlclkgLSByZWN0Q2VudGVyWSk7XG4gICAgY29uc3QgZGVsdGFYID0gTWF0aC5hYnMocGFuZUNlbnRlclggLSByZWN0Q2VudGVyWCk7XG5cbiAgICBjb25zdCBpc1ZlcnRpY2FsUHJlZmVycmVkID0gZGVsdGFZID49IGRlbHRhWDtcbiAgICBjb25zdCBpc0Fib3ZlVGFyZ2V0ID0gcGFuZUNlbnRlclkgPCByZWN0Q2VudGVyWTtcbiAgICBjb25zdCB2ZXJ0aWNhbERpcmVjdGlvbjogU3BvdGxpZ2h0RGlyZWN0aW9uID0gaXNBYm92ZVRhcmdldCA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgY29uc3QgaG9yaXpvbnRhbERpcmVjdGlvbjogU3BvdGxpZ2h0RGlyZWN0aW9uID0gcGFuZUNlbnRlclggPCByZWN0Q2VudGVyWCA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cbiAgICByZXR1cm4gaXNWZXJ0aWNhbFByZWZlcnJlZCA/IHZlcnRpY2FsRGlyZWN0aW9uIDogaG9yaXpvbnRhbERpcmVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUFycm93T2Zmc2V0KHBhbmU6IERPTVJlY3QsIHJlY3Q6IERPTVJlY3QsIGRpcmVjdGlvbjogU3BvdGxpZ2h0RGlyZWN0aW9uKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YXJnZXRDZW50ZXJYID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgY29uc3QgdGFyZ2V0Q2VudGVyWSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuXG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3RvcCcgfHwgZGlyZWN0aW9uID09PSAnYm90dG9tJ1xuICAgICAgPyB0YXJnZXRDZW50ZXJYIC0gcGFuZS5sZWZ0IC0gQVJST1dfSEFMRl9TSVpFXG4gICAgICA6IHRhcmdldENlbnRlclkgLSBwYW5lLnRvcCAtIEFSUk9XX0hBTEZfU0laRTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVBvcG92ZXJPdmVybGF5KCk6IHZvaWQge1xuICAgIHRoaXMucG9wb3ZlclN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5wb3BvdmVyU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZm9jdXNUcmFwID0gbnVsbDtcbiAgICB9XG5cbiAgICBlbmFibGVCb2R5U2Nyb2xsKCk7XG5cbiAgICBpZiAodGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFyZ2V0UmVjdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hSZWN0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICBpZiAoIXN0ZXAgfHwgIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRvdXJTZXJ2aWNlLmdldEVsZW1lbnQoc3RlcC5zdGVwSWQpO1xuICAgIGlmIChlbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QoZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudXBkYXRlVGFyZ2V0UmVjdChlbGVtZW50KSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICB9XG59XG4iLCJAaWYgKGlzQWN0aXZlKCkgJiYgY3VycmVudFN0ZXAoKTsgYXMgc3RlcCkge1xuQGlmIChzdGVwLnNob3dCYWNrZHJvcCAhPT0gZmFsc2UpIHtcbjxidXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtuZ1N0eWxlXT1cInRvcE1hc2tTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cblxuQGlmICh0YXJnZXRSZWN0KCkpIHtcbjxidXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtuZ1N0eWxlXT1cImxlZnRNYXNrU3R5bGUoKVwiXG4gIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4+PC9idXR0b24+XG48YnV0dG9uXG4gIHR5cGU9XCJidXR0b25cIlxuICBbbmdTdHlsZV09XCJyaWdodE1hc2tTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cbjxidXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtuZ1N0eWxlXT1cImJvdHRvbU1hc2tTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cbn1cbn1cblxuQGlmIChzdGVwLnNob3dCYWNrZHJvcCA9PT0gZmFsc2UpIHtcbkBpZiAoc3RlcC5kaXNtaXNzaWJsZSA9PT0gZmFsc2UpIHtcbjxkaXYgW25nU3R5bGVdPVwidHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUoKVwiPjwvZGl2PlxufSBAZWxzZSB7XG48YnV0dG9uXG4gIHR5cGU9XCJidXR0b25cIlxuICBbbmdTdHlsZV09XCJ0cmFuc3BhcmVudEJsb2NrZXJTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cbn1cbn1cbn1cbiJdfQ==
|