@elderbyte/ngx-starter 18.12.2 → 18.12.3
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/esm2022/lib/common/enums/elder-enum-translation.service.mjs +3 -3
- package/esm2022/lib/common/forms/elder-form-field-control-base.directive.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-customizable-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-entity-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-multi-entity-base.mjs +3 -3
- package/esm2022/lib/common/forms/form-field-base.component.mjs +3 -3
- package/esm2022/lib/common/forms/multi-model-base.component.mjs +3 -3
- package/esm2022/lib/common/forms/template-composite-control.mjs +3 -3
- package/esm2022/lib/common/forms/value-accessor-base.mjs +3 -3
- package/esm2022/lib/common/http/http-client-builder.service.mjs +3 -3
- package/esm2022/lib/common/http/http-client-pristine.mjs +3 -3
- package/esm2022/lib/common/http/transfer/data-transfer-factory.mjs +3 -3
- package/esm2022/lib/common/time/temporal-util.mjs +13 -1
- package/esm2022/lib/common/url/elder-router.service.mjs +3 -3
- package/esm2022/lib/common/url/elder-url-fragment-params.service.mjs +3 -3
- package/esm2022/lib/components/access-denied/elder-access-denied.component.mjs +3 -3
- package/esm2022/lib/components/access-denied/elder-access-denied.module.mjs +4 -4
- package/esm2022/lib/components/auditing/audited-entity/elder-audited-entity.component.mjs +3 -3
- package/esm2022/lib/components/auditing/elder-audit.module.mjs +4 -4
- package/esm2022/lib/components/badge/elder-badge/elder-badge.component.mjs +9 -9
- package/esm2022/lib/components/badge/elder-badge.directive.mjs +3 -3
- package/esm2022/lib/components/badge/elder-badge.module.mjs +4 -4
- package/esm2022/lib/components/button-group/elder-button-group/elder-button-group.component.mjs +3 -3
- package/esm2022/lib/components/button-group/elder-button-group.module.mjs +4 -4
- package/esm2022/lib/components/card-organizer/card-organizer/elder-card-organizer.component.mjs +3 -3
- package/esm2022/lib/components/card-organizer/card-organizer/elder-stack-card.directive.mjs +3 -3
- package/esm2022/lib/components/card-organizer/card-stack/elder-card-stack.component.mjs +3 -3
- package/esm2022/lib/components/card-organizer/elder-card-organizer.module.mjs +4 -4
- package/esm2022/lib/components/cards/elder-card/elder-card-header/elder-card-header.component.mjs +3 -3
- package/esm2022/lib/components/cards/elder-card/elder-card.component.mjs +18 -18
- package/esm2022/lib/components/cards/elder-card/elder-card.module.mjs +4 -4
- package/esm2022/lib/components/chips/elder-chip-label.directive.mjs +3 -3
- package/esm2022/lib/components/chips/elder-chips.module.mjs +4 -4
- package/esm2022/lib/components/connectivity/elder-connectivity.module.mjs +4 -4
- package/esm2022/lib/components/connectivity/elder-connectivity.service.mjs +3 -3
- package/esm2022/lib/components/connectivity/offline-indicator/elder-offline-indicator.component.mjs +3 -3
- package/esm2022/lib/components/containers/elder-containers.module.mjs +4 -4
- package/esm2022/lib/components/containers/elder-scroll-container/elder-scroll-container.component.mjs +3 -3
- package/esm2022/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.mjs +3 -3
- package/esm2022/lib/components/csv/elder-csv-stream-exporter-builder.service.mjs +3 -3
- package/esm2022/lib/components/csv/elder-csv.module.mjs +4 -4
- package/esm2022/lib/components/currency/elder-currency.module.mjs +4 -4
- package/esm2022/lib/components/currency/elder-currency.pipe.mjs +3 -3
- package/esm2022/lib/components/data-transfer/elder-data-transfer.module.mjs +4 -4
- package/esm2022/lib/components/data-transfer/elder-data-transfer.service.mjs +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer/http-data-transfer.component.mjs +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer-aggregate/http-data-transfer-aggregate.component.mjs +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.mjs +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.mjs +3 -3
- package/esm2022/lib/components/data-view/base/elder-data-view-base.mjs +3 -3
- package/esm2022/lib/components/data-view/common/composite-sort/composite-sort-dc.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/common/composite-sort/elder-composite-sort/elder-composite-sort.component.mjs +3 -3
- package/esm2022/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.mjs +3 -3
- package/esm2022/lib/components/data-view/common/elder-data-common.module.mjs +4 -4
- package/esm2022/lib/components/data-view/common/elder-data-toolbar/elder-data-toolbar.component.mjs +6 -6
- package/esm2022/lib/components/data-view/common/elder-single-sort/elder-single-sort.component.mjs +3 -3
- package/esm2022/lib/components/data-view/common/selection/data-context-selection.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/common/selection/elder-selection-master-checkbox/elder-selection-master-checkbox.component.mjs +3 -3
- package/esm2022/lib/components/data-view/grid/elder-grid/elder-grid.component.mjs +9 -9
- package/esm2022/lib/components/data-view/grid/elder-grid.module.mjs +4 -4
- package/esm2022/lib/components/data-view/master-detail/elder-detail-dialog/elder-detail-dialog.component.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-detail.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master-activation.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.component.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.module.mjs +4 -4
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.service.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.component.mjs +3 -3
- package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.module.mjs +4 -4
- package/esm2022/lib/components/data-view/table/activation/elder-delete-active.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/activation/elder-table-activation.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-center-cell.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-number-cell.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-paginator-intl.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table/elder-table-toolbar.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-column.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-extension.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-root.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-row.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-sort.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table.module.mjs +4 -4
- package/esm2022/lib/components/data-view/table/model/elder-table-model.mjs +3 -3
- package/esm2022/lib/components/dialogs/confirm-dialog/elder-confirm-dialog.component.mjs +3 -3
- package/esm2022/lib/components/dialogs/elder-dialog.module.mjs +4 -4
- package/esm2022/lib/components/dialogs/elder-dialog.service.mjs +3 -3
- package/esm2022/lib/components/dialogs/question-dialog/elder-question-dialog.component.mjs +3 -3
- package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog/elder-selection-dialog.component.mjs +3 -3
- package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog.directive.mjs +3 -3
- package/esm2022/lib/components/errors/elder-error.module.mjs +4 -4
- package/esm2022/lib/components/errors/exception-detail/elder-exception-detail.component.mjs +3 -3
- package/esm2022/lib/components/expand-toggle-button/elder-expand-toggle-button.component.mjs +3 -3
- package/esm2022/lib/components/expand-toggle-button/elder-expand-toggle-button.module.mjs +4 -4
- package/esm2022/lib/components/files/blob-viewer/elder-blob-viewer.component.mjs +3 -3
- package/esm2022/lib/components/files/drag-n-drop/elder-drop-zone/elder-drop-zone.component.mjs +3 -3
- package/esm2022/lib/components/files/drag-n-drop/global-drag-drop.service.mjs +3 -3
- package/esm2022/lib/components/files/elder-file-drop-zone.directive.mjs +3 -3
- package/esm2022/lib/components/files/elder-file-select.directive.mjs +3 -3
- package/esm2022/lib/components/files/elder-file.module.mjs +4 -4
- package/esm2022/lib/components/files/file-select/file-select.component.mjs +3 -3
- package/esm2022/lib/components/files/file-upload/file-upload.component.mjs +3 -3
- package/esm2022/lib/components/forms/clipboard/elder-clipboard.service.mjs +3 -3
- package/esm2022/lib/components/forms/directives/base/elder-class-hostbinding-base.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-clipboard-put.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-delayed-focus.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-dense.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-label.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-no-hint.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-no-spinner.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-forms-directives.module.mjs +4 -4
- package/esm2022/lib/components/forms/directives/elder-initial-value.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-input-pattern.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-key-event.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-next-focusable.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-plug-parent-form.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-stop-event-propagation.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-tab-focus-trap.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-touched.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-triple-state-checkbox.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/elder-validation-error.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/strategies/common-validation-message-strategy.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/strategies/dynamic-validation-message-strategy.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validation-message-renderer.service.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-max.validator.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-min.validator.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-required-ignore-zero.validator.mjs +3 -3
- package/esm2022/lib/components/forms/elder-forms.module.mjs +4 -4
- package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +3 -3
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +3 -3
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search.module.mjs +4 -4
- package/esm2022/lib/components/forms/search/search-box/elder-search-box.component.mjs +3 -3
- package/esm2022/lib/components/forms/search/search-box/elder-search-panel.component.mjs +3 -3
- package/esm2022/lib/components/global-search/elder-global-search.component.mjs +3 -3
- package/esm2022/lib/components/global-search/elder-global-search.module.mjs +4 -4
- package/esm2022/lib/components/global-search/elder-global-search.service.mjs +3 -3
- package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.component.mjs +3 -3
- package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.module.mjs +4 -4
- package/esm2022/lib/components/headers/elder-header/elder-header.component.mjs +3 -3
- package/esm2022/lib/components/headers/elder-header.module.mjs +4 -4
- package/esm2022/lib/components/http-support/elder-http-client.service.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-i18n-entities.module.mjs +4 -4
- package/esm2022/lib/components/i18n/entities/elder-localized-input/elder-localized-input.component.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog/elder-localized-input-dialog.component.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog.service.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input-table/elder-localized-input-table.component.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-text-column.directive.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-texts.directive.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/picker/i18n-pick-async.pipe.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/picker/i18n-pick.pipe.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/picker/localisation-picker.service.mjs +3 -3
- package/esm2022/lib/components/i18n/language/elder-language-interceptor.mjs +3 -3
- package/esm2022/lib/components/i18n/language/elder-language.module.mjs +4 -4
- package/esm2022/lib/components/i18n/language/elder-language.service.mjs +3 -3
- package/esm2022/lib/components/i18n/language/language-switcher/elder-language-switcher.component.mjs +3 -3
- package/esm2022/lib/components/i18n/locales/elder-locales-de-ch.module.mjs +4 -4
- package/esm2022/lib/components/iframes/data-view/data-view-iframe/data-view-iframe.component.mjs +3 -3
- package/esm2022/lib/components/iframes/data-view/data-view-iframe-adapter.directive.mjs +3 -3
- package/esm2022/lib/components/iframes/elder-iframe.module.mjs +4 -4
- package/esm2022/lib/components/iframes/iframe-close.directive.mjs +3 -3
- package/esm2022/lib/components/iframes/iframe-dialog/iframe-dialog.component.mjs +3 -3
- package/esm2022/lib/components/iframes/iframe-host/iframe-host.component.mjs +3 -3
- package/esm2022/lib/components/iframes/iframe-side-content/iframe-side-content.component.mjs +3 -3
- package/esm2022/lib/components/iframes/iframe.service.mjs +3 -3
- package/esm2022/lib/components/infinitescroll/elder-infinite-autocomplete.directive.mjs +3 -3
- package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.directive.mjs +3 -3
- package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.module.mjs +4 -4
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete/elder-suggestion-panel.component.mjs +3 -3
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete-many.directive.mjs +3 -3
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete.directive.mjs +3 -3
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete.module.mjs +4 -4
- package/esm2022/lib/components/labels/elder-labels.module.mjs +4 -4
- package/esm2022/lib/components/labels/labels-input/labels-input.component.mjs +3 -3
- package/esm2022/lib/components/measures/dimensions/dimensions-input/elder-dimensions-input.component.mjs +3 -3
- package/esm2022/lib/components/measures/dimensions/validation/elder-required-dimensions.validator.mjs +3 -3
- package/esm2022/lib/components/measures/directives/elder-unit-select.directive.mjs +3 -3
- package/esm2022/lib/components/measures/elder-measures.module.mjs +8 -8
- package/esm2022/lib/components/measures/elder-quantity-transform.pipe.mjs +3 -3
- package/esm2022/lib/components/measures/elder-quantity.pipe.mjs +3 -3
- package/esm2022/lib/components/measures/elder-unit.service.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/quantity-form-field/elder-quantity-form-field.component.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/quantity-input-control/elder-quantity-input-control.component.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/validation/elder-quantity-range.validator.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/validation/elder-required-quantity.validator.mjs +3 -3
- package/esm2022/lib/components/measures/util/elder-quantity.service.mjs +3 -3
- package/esm2022/lib/components/navigation/bread-crumbs/bread-crumbs/elder-bread-crumbs.component.mjs +3 -3
- package/esm2022/lib/components/navigation/bread-crumbs/elder-bread-crumbs.module.mjs +4 -4
- package/esm2022/lib/components/navigation/nav/elder-nav.module.mjs +4 -4
- package/esm2022/lib/components/navigation/nav/nav-group/elder-nav-group.component.mjs +3 -3
- package/esm2022/lib/components/navigation/nav/nav-link/elder-nav-link.component.mjs +3 -3
- package/esm2022/lib/components/navigation/nav/nav-list/elder-nav-list.component.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar-column.directive.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar.module.mjs +4 -4
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar.service.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/toolbar/elder-toolbar.component.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.component.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.service.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay-origin.directive.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay-ref.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay-trigger.directive.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay.component.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay.module.mjs +4 -4
- package/esm2022/lib/components/page/exit-guard/page-exit-guard.module.mjs +4 -4
- package/esm2022/lib/components/page/exit-guard/page-exit-guard.service.mjs +3 -3
- package/esm2022/lib/components/page/exit-guard/page-exit-lock/page-exit-lock.component.mjs +3 -3
- package/esm2022/lib/components/page/exit-guard/page-exit-lock-indicator/page-exit-lock-indicator.component.mjs +3 -3
- package/esm2022/lib/components/page/exit-guard/page-exit-lock-overview/page-exit-lock-overview.component.mjs +3 -3
- package/esm2022/lib/components/panels/card-panel/elder-card-panel.component.mjs +3 -3
- package/esm2022/lib/components/panels/elder-dialog-panel/elder-dialog-panel.component.mjs +3 -3
- package/esm2022/lib/components/panels/elder-panel.module.mjs +4 -4
- package/esm2022/lib/components/panels/flat/elder-panel.component.mjs +3 -3
- package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel-trigger.directive.mjs +3 -3
- package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel.component.mjs +9 -9
- package/esm2022/lib/components/scrollbar/elder-scrollbar.directive.mjs +3 -3
- package/esm2022/lib/components/scrollbar/elder-scrollbar.module.mjs +4 -4
- package/esm2022/lib/components/select/auto/elder-auto-select-first.directive.mjs +3 -3
- package/esm2022/lib/components/select/auto/elder-auto-select-first.service.mjs +3 -3
- package/esm2022/lib/components/select/auto/elder-auto-select-suggest-first.directive.mjs +3 -3
- package/esm2022/lib/components/select/elder-select-base.mjs +3 -3
- package/esm2022/lib/components/select/elder-select-chip.directive.mjs +9 -9
- package/esm2022/lib/components/select/elder-select-on-tab.directive.mjs +3 -3
- package/esm2022/lib/components/select/elder-select-value.directive.mjs +3 -3
- package/esm2022/lib/components/select/elder-select.module.mjs +4 -4
- package/esm2022/lib/components/select/filter/elder-chips-include-exclude.directive.mjs +3 -3
- package/esm2022/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-chip-select-option/elder-select-option.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-base.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-form-field.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-mutli-select-all-directive.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-search-include-exclude.directive.mjs +3 -3
- package/esm2022/lib/components/select/popup/selection-model-popup-trigger-adapter.directive.mjs +3 -3
- package/esm2022/lib/components/select/popup/selection-model-popup.directive.mjs +3 -3
- package/esm2022/lib/components/select/popup/templated-selection-dialog/templated-selection-dialog.component.mjs +3 -3
- package/esm2022/lib/components/select/single/elder-clear-select.directive.mjs +3 -3
- package/esm2022/lib/components/select/single/elder-select/elder-select.component.mjs +3 -3
- package/esm2022/lib/components/select/single/elder-select-form-field.mjs +3 -3
- package/esm2022/lib/components/select-chip-list/chip-list-select/elder-chip-list-select.component.mjs +3 -3
- package/esm2022/lib/components/select-chip-list/elder-chip-list-select.module.mjs +4 -4
- package/esm2022/lib/components/shell/drawers/elder-route-outlet-drawer.service.mjs +3 -3
- package/esm2022/lib/components/shell/drawers/elder-router-outlet.service.mjs +3 -3
- package/esm2022/lib/components/shell/elder-shell-slot.directive.mjs +3 -3
- package/esm2022/lib/components/shell/elder-shell.module.mjs +4 -4
- package/esm2022/lib/components/shell/elder-shell.service.mjs +3 -3
- package/esm2022/lib/components/shell/header/elder-app-header/elder-app-header.component.mjs +3 -3
- package/esm2022/lib/components/shell/shell/elder-shell.component.mjs +12 -12
- package/esm2022/lib/components/shell/shell-navigation-toggle/elder-shell-navigation-toggle.component.mjs +3 -3
- package/esm2022/lib/components/tabs/elder-tab/elder-tab.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/elder-tab-group-routing/elder-tab-group-routing.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/elder-tab.module.mjs +4 -4
- package/esm2022/lib/components/theme/elder-theme-applier.directive.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme-preference.service.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme-toggle/elder-theme-toggle.component.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme.directive.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme.module.mjs +4 -4
- package/esm2022/lib/components/theme/elder-theme.service.mjs +3 -3
- package/esm2022/lib/components/time/date-adapters/custom-date-adapter.mjs +3 -3
- package/esm2022/lib/components/time/duration/elder-duration-input/elder-duration-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-date-switcher/elder-date-switcher.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-date-time-input/elder-date-time-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-interval-input/elder-interval-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +7 -12
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +83 -81
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +82 -99
- package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.mjs +284 -0
- package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model.mjs +445 -0
- package/esm2022/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.mjs +37 -0
- package/esm2022/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.mjs +25 -0
- package/esm2022/lib/components/time/elder-local-date-input/elder-local-date-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-local-time-input/elder-local-time-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-time.module.mjs +4 -4
- package/esm2022/lib/components/time/period/elder-period-input/elder-period-input.component.mjs +3 -3
- package/esm2022/lib/components/time/pipes/to-iso-date-string.pipe.mjs +3 -3
- package/esm2022/lib/components/toasts/elder-toast.module.mjs +4 -4
- package/esm2022/lib/components/toasts/elder-toast.service.mjs +3 -3
- package/esm2022/lib/components/toasts/standard-toast/standard-toast.component.mjs +3 -3
- package/esm2022/lib/components/url-fragment/elder-url-fragment.module.mjs +4 -4
- package/esm2022/lib/components/url-fragment/url-fragment-switcher/elder-url-fragment-switcher.component.mjs +3 -3
- package/esm2022/lib/components/viewers/elder-svg-viewer/elder-svg-viewer.component.mjs +3 -3
- package/esm2022/lib/components/viewers/elder-viewers.module.mjs +4 -4
- package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.service.mjs +3 -3
- package/esm2022/lib/features/event-source/standard/elder-event-source.service.mjs +3 -3
- package/esm2022/lib/features/kafent/access-token-provider.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent-config.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent-event-stream.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent-event.service.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent.module.mjs +4 -4
- package/esm2022/lib/features/kafent/sse/kafent-event-stream-sse.service.mjs +3 -3
- package/esm2022/lib/pipes/bytes.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-pipes.module.mjs +10 -10
- package/esm2022/lib/pipes/elder-repeat.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-round.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-safe-url.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-truncate.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-duration.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-interval-parse.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-interval.pipe.mjs +3 -3
- package/esm2022/lib/pipes/time-ago.pipe.mjs +3 -3
- package/esm2022/lib/pipes/time-duration.pipe.mjs +3 -3
- package/esm2022/lib/pipes/weight.pipe.mjs +3 -3
- package/fesm2022/elderbyte-ngx-starter.mjs +1643 -1575
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/time/temporal-util.d.ts +2 -0
- package/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.d.ts +3 -6
- package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +25 -18
- package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +19 -25
- package/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.d.ts +77 -0
- package/lib/components/time/elder-interval-picker/model/interval-picker-model.d.ts +113 -0
- package/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.d.ts +7 -0
- package/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.d.ts +4 -0
- package/package.json +1 -1
- package/src/assets/i18n/fr.json +123 -0
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.service.mjs +0 -708
- package/lib/components/time/elder-interval-picker/elder-interval-picker.service.d.ts +0 -132
|
@@ -1,708 +0,0 @@
|
|
|
1
|
-
import { computed, effect, EventEmitter, Injectable, signal, } from '@angular/core';
|
|
2
|
-
import { DateRange } from '@angular/material/datepicker';
|
|
3
|
-
import { LoggerFactory } from '@elderbyte/ts-logger';
|
|
4
|
-
import { Temporal } from '@js-temporal/polyfill';
|
|
5
|
-
import { Interval } from '../../../common/time/interval';
|
|
6
|
-
import { TemporalPlainDateInterval } from '../../../common/time/temporal-plain-date-interval';
|
|
7
|
-
import { TemporalUtil } from '../../../common/time/temporal-util';
|
|
8
|
-
import { TimeUtil } from '../../../common/time/time-util';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
const defaultCalendarMode = 'days';
|
|
11
|
-
export class ElderIntervalPickerService {
|
|
12
|
-
constructor() {
|
|
13
|
-
/***************************************************************************
|
|
14
|
-
* *
|
|
15
|
-
* Fields *
|
|
16
|
-
* *
|
|
17
|
-
**************************************************************************/
|
|
18
|
-
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
19
|
-
this._dateChangeEmitter = new EventEmitter();
|
|
20
|
-
this.calendarMode = signal(defaultCalendarMode);
|
|
21
|
-
this.startDate = signal(null);
|
|
22
|
-
this.endDate = signal(null);
|
|
23
|
-
this.baseReferenceDate = signal(Temporal.Now.plainDateISO());
|
|
24
|
-
this.baseReferenceTime = signal(Temporal.Now.plainTimeISO());
|
|
25
|
-
this.fixedAnchorDate = signal(null);
|
|
26
|
-
this.fixedAnchorTime = signal(Temporal.PlainTime.from('00:00'));
|
|
27
|
-
this.startTime = signal(Temporal.PlainTime.from('00:00'));
|
|
28
|
-
this.endTime = signal(Temporal.PlainTime.from('00:00'));
|
|
29
|
-
this._inputInterval = null;
|
|
30
|
-
this._inputAnchorDateTime = null;
|
|
31
|
-
this.isEmittingOnChange = signal(true);
|
|
32
|
-
this.isUpdatingIntervalOnAnchorChange = signal(false);
|
|
33
|
-
this.isFixedAnchorDateSet = computed(() => {
|
|
34
|
-
return !!this.fixedAnchorDate();
|
|
35
|
-
});
|
|
36
|
-
this.anchorDate = computed(() => {
|
|
37
|
-
if (this.fixedAnchorDate()) {
|
|
38
|
-
return this.fixedAnchorDate();
|
|
39
|
-
}
|
|
40
|
-
return this.baseReferenceDate();
|
|
41
|
-
});
|
|
42
|
-
this.anchorTime = computed(() => {
|
|
43
|
-
if (this.fixedAnchorDate() && this.fixedAnchorTime()) {
|
|
44
|
-
return this.fixedAnchorTime();
|
|
45
|
-
}
|
|
46
|
-
return this.baseReferenceTime();
|
|
47
|
-
});
|
|
48
|
-
this.anchorDateTime = computed(() => {
|
|
49
|
-
return this.anchorDate().toPlainDateTime(this.anchorTime());
|
|
50
|
-
});
|
|
51
|
-
this.dateRange = computed(() => {
|
|
52
|
-
if (!this.isStartAndEndDatesSet()) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
return new TemporalPlainDateInterval(this.startDate(), this.endDate());
|
|
56
|
-
});
|
|
57
|
-
this.dateRangeForCalendar = computed(() => {
|
|
58
|
-
if (!this.isStartAndEndDatesSet()) {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
const startDate = TemporalUtil.getJSDateFromPlainDateTime(this.startDate());
|
|
62
|
-
const endDate = TemporalUtil.getJSDateFromPlainDateTime(this.endDate());
|
|
63
|
-
return new DateRange(startDate, endDate);
|
|
64
|
-
});
|
|
65
|
-
this.dateRangeInDays = computed(() => {
|
|
66
|
-
if (!this.dateRange()) {
|
|
67
|
-
return 0;
|
|
68
|
-
}
|
|
69
|
-
return this.dateRange().getDurationInDays();
|
|
70
|
-
});
|
|
71
|
-
this.isStartAndEndDatesEmpty = computed(() => {
|
|
72
|
-
return !this.startDate() && !this.endDate();
|
|
73
|
-
});
|
|
74
|
-
this.isStartAndEndDatesSet = computed(() => {
|
|
75
|
-
return !!(this.startDate() && this.endDate());
|
|
76
|
-
});
|
|
77
|
-
this.isRangeNotSet = computed(() => {
|
|
78
|
-
return !this.isStartAndEndDatesSet();
|
|
79
|
-
});
|
|
80
|
-
this.startDateTime = computed(() => {
|
|
81
|
-
if (!this.startDate()) {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
if (this.startTime()) {
|
|
85
|
-
return this.startDate().toPlainDateTime(this.startTime());
|
|
86
|
-
}
|
|
87
|
-
return this.startDate();
|
|
88
|
-
});
|
|
89
|
-
this.endDateTime = computed(() => {
|
|
90
|
-
if (!this.endDate()) {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
if (this.endTime()) {
|
|
94
|
-
return this.endDate().toPlainDateTime(this.endTime());
|
|
95
|
-
}
|
|
96
|
-
return this.endDate();
|
|
97
|
-
});
|
|
98
|
-
this.startDateAsJSDate = computed(() => {
|
|
99
|
-
if (!this.startDate()) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
return TemporalUtil.getJSDateFromPlainDateTime(this.startDate());
|
|
103
|
-
});
|
|
104
|
-
this.endDateAsJSDate = computed(() => {
|
|
105
|
-
if (!this.endDate()) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
return TemporalUtil.getJSDateFromPlainDateTime(this.endDate());
|
|
109
|
-
});
|
|
110
|
-
this.startDateTimeAsJSDate = computed(() => {
|
|
111
|
-
if (!this.startDateTime()) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
return TemporalUtil.getJSDateFromPlainDateTime(this.startDateTime());
|
|
115
|
-
});
|
|
116
|
-
this.endDateTimeAsJSDate = computed(() => {
|
|
117
|
-
if (!this.endDateTime()) {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
return TemporalUtil.getJSDateFromPlainDateTime(this.endDateTime());
|
|
121
|
-
});
|
|
122
|
-
this.getCalendarWeek = computed(() => {
|
|
123
|
-
if (!this.startDate()) {
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
return this.startDate().weekOfYear;
|
|
127
|
-
});
|
|
128
|
-
this.isFullCalenderWeekSelected = computed(() => {
|
|
129
|
-
if (!this.isStartAndEndDatesSet()) {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
if (!TemporalUtil.isFirstDayOfWeek(this.startDate())) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
const duration = this.startDate().until(this.endDate());
|
|
136
|
-
if (duration.days !== 7) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
return this.startDate().weekOfYear;
|
|
140
|
-
});
|
|
141
|
-
this.viewIntervalMessage = computed(() => {
|
|
142
|
-
if (this.isRangeNotSet()) {
|
|
143
|
-
return '-';
|
|
144
|
-
}
|
|
145
|
-
if (this.calendarMode() === 'quarters') {
|
|
146
|
-
const quarter = TemporalUtil.getQuarterForDate(this.startDate());
|
|
147
|
-
return `Q${quarter}, ${this.startDate().year}`;
|
|
148
|
-
}
|
|
149
|
-
if (this.calendarMode() === 'months') {
|
|
150
|
-
const monthName = this.startDate().month;
|
|
151
|
-
return `1m (${monthName}, ${this.startDate().year})`;
|
|
152
|
-
}
|
|
153
|
-
if (this.calendarMode() === 'years') {
|
|
154
|
-
const year = this.startDate().year;
|
|
155
|
-
return `1y (${year})`;
|
|
156
|
-
}
|
|
157
|
-
if (this.calendarMode() === 'weeks') {
|
|
158
|
-
return `1w (CW ${this.getCalendarWeek()}, ${this.endDate().year})`;
|
|
159
|
-
}
|
|
160
|
-
if (this.calendarMode() === 'days') {
|
|
161
|
-
return `${this.dateRangeInDays()}d`;
|
|
162
|
-
}
|
|
163
|
-
return '';
|
|
164
|
-
});
|
|
165
|
-
this.deltaAsTemporalDuration = computed(() => {
|
|
166
|
-
const startDateTime = this.startDateTime();
|
|
167
|
-
const endDateTime = this.endDateTime();
|
|
168
|
-
if (!startDateTime || !endDateTime) {
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
const duration = startDateTime.until(endDateTime);
|
|
172
|
-
return duration;
|
|
173
|
-
});
|
|
174
|
-
this.deltaHumanReadable = computed(() => {
|
|
175
|
-
if (this.isStartAndEndDatesEmpty()) {
|
|
176
|
-
return '';
|
|
177
|
-
}
|
|
178
|
-
const duration = this.deltaAsTemporalDuration();
|
|
179
|
-
if (!duration) {
|
|
180
|
-
return '∞';
|
|
181
|
-
}
|
|
182
|
-
const tmp = [];
|
|
183
|
-
if (duration.days) {
|
|
184
|
-
tmp.push(`${duration.days}d`);
|
|
185
|
-
}
|
|
186
|
-
if (duration.hours) {
|
|
187
|
-
tmp.push(`${duration.hours}h`);
|
|
188
|
-
}
|
|
189
|
-
if (duration.minutes) {
|
|
190
|
-
tmp.push(`${duration.minutes}min`);
|
|
191
|
-
}
|
|
192
|
-
if (duration.seconds) {
|
|
193
|
-
tmp.push(`${duration.seconds}s`);
|
|
194
|
-
}
|
|
195
|
-
if (!tmp.length) {
|
|
196
|
-
return '0s';
|
|
197
|
-
}
|
|
198
|
-
return tmp.join(', ');
|
|
199
|
-
});
|
|
200
|
-
this.getStartTimeString = computed(() => {
|
|
201
|
-
return TemporalUtil.getHtmlTimeStringFromPlainTime(this.startTime());
|
|
202
|
-
});
|
|
203
|
-
this.getEndTimeString = computed(() => {
|
|
204
|
-
return TemporalUtil.getHtmlTimeStringFromPlainTime(this.endTime());
|
|
205
|
-
});
|
|
206
|
-
this.getAnchorTimeString = computed(() => {
|
|
207
|
-
return TemporalUtil.getHtmlTimeStringFromPlainTime(this.fixedAnchorTime());
|
|
208
|
-
});
|
|
209
|
-
this.getAnchorPointAsLocaleDate = computed(() => {
|
|
210
|
-
const anchorPoint = this.fixedAnchorDate();
|
|
211
|
-
if (!anchorPoint) {
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
const jsDate = TemporalUtil.getJSDateFromPlainDateTime(anchorPoint);
|
|
215
|
-
const localeDate = TimeUtil.dateToLocalDate(jsDate);
|
|
216
|
-
return localeDate;
|
|
217
|
-
});
|
|
218
|
-
this.startDateHtmlString = computed(() => {
|
|
219
|
-
return TemporalUtil.getHtmlDateString(this.startDateTime());
|
|
220
|
-
});
|
|
221
|
-
this.endDateHtmlString = computed(() => {
|
|
222
|
-
return TemporalUtil.getHtmlDateString(this.endDateTime());
|
|
223
|
-
});
|
|
224
|
-
this.isStartTimeSetAndNotMidnight = computed(() => {
|
|
225
|
-
if (!this.startTime()) {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
return (this.startTime().hour !== 0 || this.startTime().minute !== 0 || this.startTime().second !== 0);
|
|
229
|
-
});
|
|
230
|
-
this.isEndTimeSetAndNotMidnight = computed(() => {
|
|
231
|
-
if (!this.endTime()) {
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
return this.endTime().hour !== 0 || this.endTime().minute !== 0 || this.endTime().second !== 0;
|
|
235
|
-
});
|
|
236
|
-
this.isFixedAnchorTimeSetAndNotMidnight = computed(() => {
|
|
237
|
-
if (!this.fixedAnchorTime()) {
|
|
238
|
-
return false;
|
|
239
|
-
}
|
|
240
|
-
return (this.fixedAnchorTime().hour !== 0 ||
|
|
241
|
-
this.fixedAnchorTime().minute !== 0 ||
|
|
242
|
-
this.fixedAnchorTime().second !== 0);
|
|
243
|
-
});
|
|
244
|
-
/***************************************************************************
|
|
245
|
-
* *
|
|
246
|
-
* Effects *
|
|
247
|
-
* *
|
|
248
|
-
**************************************************************************/
|
|
249
|
-
this._autoEmitOnDateTimesChangeEffect = effect(() => {
|
|
250
|
-
const startDateTime = this.startDateTime();
|
|
251
|
-
const endDateTime = this.endDateTime();
|
|
252
|
-
if (this.isEmittingOnChange()) {
|
|
253
|
-
this.emitMainDates();
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
/***************************************************************************
|
|
258
|
-
* *
|
|
259
|
-
* Public API *
|
|
260
|
-
* *
|
|
261
|
-
**************************************************************************/
|
|
262
|
-
setStartDateFromHtmlString(htmlString) {
|
|
263
|
-
const date = TemporalUtil.getPlainDateFromHtmlDateString(htmlString);
|
|
264
|
-
if (!date) {
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
this.calendarMode.set('days');
|
|
268
|
-
this.startDate.set(date);
|
|
269
|
-
}
|
|
270
|
-
setEndDateFromHtmlString(htmlString) {
|
|
271
|
-
const date = TemporalUtil.getPlainDateFromHtmlDateString(htmlString);
|
|
272
|
-
if (!date) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
this.calendarMode.set('days');
|
|
276
|
-
this.endDate.set(date);
|
|
277
|
-
}
|
|
278
|
-
setupInputInterval(s) {
|
|
279
|
-
this._inputInterval = s;
|
|
280
|
-
}
|
|
281
|
-
setupInputAnchorDateTime(s) {
|
|
282
|
-
this._inputAnchorDateTime = s;
|
|
283
|
-
}
|
|
284
|
-
setupEventEmitter(e) {
|
|
285
|
-
this._dateChangeEmitter = e;
|
|
286
|
-
}
|
|
287
|
-
setStartTimeFromString(timeStr, formControl) {
|
|
288
|
-
const time = TemporalUtil.getPlainTimeFromHtmlTimeString(timeStr);
|
|
289
|
-
if (time) {
|
|
290
|
-
this.startTime.set(time);
|
|
291
|
-
}
|
|
292
|
-
if (!this.startDate()) {
|
|
293
|
-
this.startDate.set(Temporal.Now.plainDateISO());
|
|
294
|
-
}
|
|
295
|
-
this.calendarMode.set('days');
|
|
296
|
-
}
|
|
297
|
-
setEndTimeFromString(timeStr, formControl) {
|
|
298
|
-
const time = TemporalUtil.getPlainTimeFromHtmlTimeString(timeStr);
|
|
299
|
-
if (time) {
|
|
300
|
-
this.endTime.set(time);
|
|
301
|
-
}
|
|
302
|
-
if (!this.endDate()) {
|
|
303
|
-
this.endDate.set(Temporal.Now.plainDateISO());
|
|
304
|
-
}
|
|
305
|
-
this.calendarMode.set('days');
|
|
306
|
-
}
|
|
307
|
-
resetCalendarMode() {
|
|
308
|
-
this.calendarMode.set(defaultCalendarMode);
|
|
309
|
-
}
|
|
310
|
-
pullInputInterval() {
|
|
311
|
-
if (!this._inputInterval) {
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
this.setDateTimesFromElderInterval(this._inputInterval());
|
|
315
|
-
}
|
|
316
|
-
pullInputAnchorDateTime() {
|
|
317
|
-
if (!this._inputAnchorDateTime) {
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
this.setAnchorDateTimeFromJsDate(this._inputAnchorDateTime());
|
|
321
|
-
}
|
|
322
|
-
setDateTimesFromElderInterval(interval) {
|
|
323
|
-
if (!interval) {
|
|
324
|
-
this.startDate.set(null);
|
|
325
|
-
this.endDate.set(null);
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
if (interval.start) {
|
|
329
|
-
const startDateAsJSDate = TimeUtil.date(interval.start);
|
|
330
|
-
this.startDate.set(TemporalUtil.getPlainDateFromJSDate(startDateAsJSDate));
|
|
331
|
-
this.startTime.set(TemporalUtil.getPlainTimeFromJSDate(startDateAsJSDate));
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
this.startDate.set(null);
|
|
335
|
-
}
|
|
336
|
-
if (interval.end) {
|
|
337
|
-
const endDateAsJSDate = TimeUtil.date(interval.end);
|
|
338
|
-
this.endDate.set(TemporalUtil.getPlainDateFromJSDate(endDateAsJSDate));
|
|
339
|
-
this.endTime.set(TemporalUtil.getPlainTimeFromJSDate(endDateAsJSDate));
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
this.endDate.set(null);
|
|
343
|
-
}
|
|
344
|
-
this.log.debug(`Pulled input interval:`, interval);
|
|
345
|
-
}
|
|
346
|
-
setAnchorDateTimeFromJsDate(dateTime) {
|
|
347
|
-
if (!dateTime) {
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
const date = TemporalUtil.getPlainDateFromJSDate(dateTime);
|
|
351
|
-
const time = TemporalUtil.getPlainTimeFromJSDate(dateTime);
|
|
352
|
-
this.fixedAnchorDate.set(date);
|
|
353
|
-
this.fixedAnchorTime.set(time);
|
|
354
|
-
}
|
|
355
|
-
setFixedAnchorPointToStartDateTime() {
|
|
356
|
-
if (!this.startDate()) {
|
|
357
|
-
this.resetFixedAnchorPoint();
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
if (this.startDate()) {
|
|
361
|
-
this.fixedAnchorDate.set(this.startDate());
|
|
362
|
-
}
|
|
363
|
-
if (this.startTime()) {
|
|
364
|
-
this.fixedAnchorTime.set(this.startTime());
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
setFixedAnchorPointToEndDateTime() {
|
|
368
|
-
if (!this.endDate()) {
|
|
369
|
-
this.resetFixedAnchorPoint();
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
if (this.endDate()) {
|
|
373
|
-
this.fixedAnchorDate.set(this.endDate());
|
|
374
|
-
}
|
|
375
|
-
if (this.endTime()) {
|
|
376
|
-
this.fixedAnchorTime.set(this.endTime());
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
resetFixedAnchorPoint() {
|
|
380
|
-
this.fixedAnchorDate.set(null);
|
|
381
|
-
this.fixedAnchorTime.set(Temporal.PlainTime.from('00:00'));
|
|
382
|
-
if (this.isUpdatingIntervalOnAnchorChange() && this.isStartAndEndDatesSet()) {
|
|
383
|
-
this.shiftRangeEndToToday();
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
setAnchorDateFromForm(dateArg) {
|
|
387
|
-
if (!dateArg) {
|
|
388
|
-
this.fixedAnchorDate.set(null);
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
const jsDate = TimeUtil.localDateToDate(dateArg);
|
|
392
|
-
const plainDate = TemporalUtil.getPlainDateFromJSDate(jsDate);
|
|
393
|
-
if (!plainDate) {
|
|
394
|
-
this.log.warn('Invalid date', plainDate);
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
this.fixedAnchorDate.set(plainDate);
|
|
398
|
-
if (!this.isUpdatingIntervalOnAnchorChange()) {
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
if (this.fixedAnchorDate()) {
|
|
402
|
-
this.shiftSelectionToAnchorDate();
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
clearStartDateTime() {
|
|
406
|
-
this.startDate.set(null);
|
|
407
|
-
this.startTime.set(null);
|
|
408
|
-
}
|
|
409
|
-
clearEndDateTime() {
|
|
410
|
-
this.endDate.set(null);
|
|
411
|
-
this.endTime.set(null);
|
|
412
|
-
}
|
|
413
|
-
clearStartTime() {
|
|
414
|
-
this.startTime.set(null);
|
|
415
|
-
}
|
|
416
|
-
clearEndTime() {
|
|
417
|
-
this.endTime.set(null);
|
|
418
|
-
}
|
|
419
|
-
resetFixedAnchorTime() {
|
|
420
|
-
this.fixedAnchorTime.set(Temporal.PlainTime.from('00:00'));
|
|
421
|
-
}
|
|
422
|
-
setAnchorTimeFromForm(htmlString) {
|
|
423
|
-
const time = TemporalUtil.getPlainTimeFromHtmlTimeString(htmlString);
|
|
424
|
-
if (!time) {
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
if (!this.fixedAnchorDate()) {
|
|
428
|
-
this.fixedAnchorDate.set(Temporal.Now.plainDateISO());
|
|
429
|
-
}
|
|
430
|
-
this.fixedAnchorTime.set(time);
|
|
431
|
-
if (!this.isUpdatingIntervalOnAnchorChange()) {
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
if (this.fixedAnchorTime()) {
|
|
435
|
-
this.shiftSelectionToAnchorTime();
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
emitMainDates() {
|
|
439
|
-
const interval = this.createElderInterval();
|
|
440
|
-
this._dateChangeEmitter.emit(interval);
|
|
441
|
-
}
|
|
442
|
-
// date shifts
|
|
443
|
-
shiftDay(days) {
|
|
444
|
-
this.setDatesFromRange(this.dateRange().shiftDays(days));
|
|
445
|
-
if (this.calendarMode() === 'weeks' && (days === 7 || days === -7)) {
|
|
446
|
-
this.calendarMode.set('weeks');
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
this.calendarMode.set('days');
|
|
450
|
-
}
|
|
451
|
-
shiftMonth(months, staticMode = false) {
|
|
452
|
-
this.setDatesFromRange(this.dateRange().shiftMonths(months));
|
|
453
|
-
if (staticMode && this.calendarMode() !== 'months') {
|
|
454
|
-
this.calendarMode.set('days');
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
this.resetTimeRange();
|
|
458
|
-
this.calendarMode.set('months');
|
|
459
|
-
}
|
|
460
|
-
shiftYear(years, staticMode = false) {
|
|
461
|
-
this.setDatesFromRange(this.dateRange().shiftYears(years));
|
|
462
|
-
if (staticMode && this.calendarMode() !== 'years') {
|
|
463
|
-
this.calendarMode.set('days');
|
|
464
|
-
return;
|
|
465
|
-
}
|
|
466
|
-
this.resetTimeRange();
|
|
467
|
-
this.calendarMode.set('years');
|
|
468
|
-
}
|
|
469
|
-
shiftTime(amount, unit) {
|
|
470
|
-
if (!this.isStartAndEndDatesSet()) {
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
const newStartDateTime = this.startDateTime().add({ [unit]: amount });
|
|
474
|
-
const newEndDateTime = this.endDateTime().add({ [unit]: amount });
|
|
475
|
-
this.startDate.set(Temporal.PlainDate.from(newStartDateTime));
|
|
476
|
-
this.startTime.set(Temporal.PlainTime.from(newStartDateTime));
|
|
477
|
-
this.endDate.set(Temporal.PlainDate.from(newEndDateTime));
|
|
478
|
-
this.endTime.set(Temporal.PlainTime.from(newEndDateTime));
|
|
479
|
-
}
|
|
480
|
-
smartShift(direction = 1) {
|
|
481
|
-
if (this.calendarMode() === 'quarters') {
|
|
482
|
-
const newRange = this.dateRange().shiftMonths(direction * 3);
|
|
483
|
-
this.setDatesFromRange(newRange);
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
if (this.calendarMode() === 'months') {
|
|
487
|
-
const newRange = this.dateRange().shiftMonths(direction);
|
|
488
|
-
this.setDatesFromRange(newRange);
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
if (this.calendarMode() === 'years') {
|
|
492
|
-
const newRange = this.dateRange().shiftYears(direction);
|
|
493
|
-
this.setDatesFromRange(newRange);
|
|
494
|
-
return;
|
|
495
|
-
}
|
|
496
|
-
if (this.calendarMode() === 'weeks') {
|
|
497
|
-
const newRange = this.dateRange().shiftDays(7 * direction);
|
|
498
|
-
this.setDatesFromRange(newRange);
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
const daysDiff = this.dateRange().getDurationInDays();
|
|
502
|
-
const newRange = this.dateRange().shiftDays(daysDiff * direction);
|
|
503
|
-
this.setDatesFromRange(newRange);
|
|
504
|
-
}
|
|
505
|
-
// time range selections
|
|
506
|
-
selectLastHour() {
|
|
507
|
-
this.refreshBaseReferenceDateTime();
|
|
508
|
-
const end = this.anchorDateTime();
|
|
509
|
-
const start = end.subtract({ hours: 1 });
|
|
510
|
-
this.endDate.set(this.anchorDate());
|
|
511
|
-
this.endTime.set(this.anchorTime());
|
|
512
|
-
const startPlainDate = Temporal.PlainDate.from(start);
|
|
513
|
-
const startPlainTime = Temporal.PlainTime.from(start);
|
|
514
|
-
this.startDate.set(startPlainDate);
|
|
515
|
-
this.startTime.set(startPlainTime);
|
|
516
|
-
this.calendarMode.set('days');
|
|
517
|
-
}
|
|
518
|
-
selectLast24Hours() {
|
|
519
|
-
this.refreshBaseReferenceDateTime();
|
|
520
|
-
const end = this.anchorDateTime();
|
|
521
|
-
const start = end.subtract({ days: 1 });
|
|
522
|
-
this.endDate.set(this.anchorDate());
|
|
523
|
-
this.endTime.set(this.anchorTime());
|
|
524
|
-
const startPlainDate = Temporal.PlainDate.from(start);
|
|
525
|
-
const startPlainTime = Temporal.PlainTime.from(start);
|
|
526
|
-
this.startDate.set(startPlainDate);
|
|
527
|
-
this.startTime.set(startPlainTime);
|
|
528
|
-
this.calendarMode.set('days');
|
|
529
|
-
}
|
|
530
|
-
selectLastFiveMinutes() {
|
|
531
|
-
this.refreshBaseReferenceDateTime();
|
|
532
|
-
const end = this.anchorDateTime();
|
|
533
|
-
const start = end.subtract({ minutes: 5 });
|
|
534
|
-
this.endDate.set(this.anchorDate());
|
|
535
|
-
this.endTime.set(this.anchorTime());
|
|
536
|
-
const startPlainDate = Temporal.PlainDate.from(start);
|
|
537
|
-
const startPlainTime = Temporal.PlainTime.from(start);
|
|
538
|
-
this.startDate.set(startPlainDate);
|
|
539
|
-
this.startTime.set(startPlainTime);
|
|
540
|
-
this.calendarMode.set('days');
|
|
541
|
-
}
|
|
542
|
-
// date range selections
|
|
543
|
-
selectCurrentDay() {
|
|
544
|
-
this.setDatesFromRange(TemporalUtil.getCurrentDay(this.anchorDate()));
|
|
545
|
-
this.calendarMode.set('days');
|
|
546
|
-
this.resetTimeRange();
|
|
547
|
-
}
|
|
548
|
-
selectYesterday() {
|
|
549
|
-
this.setDatesFromRange(TemporalUtil.getYesterday(this.anchorDate()));
|
|
550
|
-
this.calendarMode.set('days');
|
|
551
|
-
this.resetTimeRange();
|
|
552
|
-
}
|
|
553
|
-
selectCurrentWeek() {
|
|
554
|
-
this.setDatesFromRange(TemporalUtil.getCurrentWeek(this.anchorDate()));
|
|
555
|
-
this.calendarMode.set('weeks');
|
|
556
|
-
this.resetTimeRange();
|
|
557
|
-
}
|
|
558
|
-
selectPreviousWeek() {
|
|
559
|
-
this.setDatesFromRange(TemporalUtil.getPreviousWeek(this.anchorDate()));
|
|
560
|
-
this.calendarMode.set('weeks');
|
|
561
|
-
this.resetTimeRange();
|
|
562
|
-
}
|
|
563
|
-
selectLastSevenDaysExcludingToday() {
|
|
564
|
-
this.setDatesFromRange(TemporalUtil.getLastSevenDays(this.anchorDate()));
|
|
565
|
-
this.calendarMode.set('days');
|
|
566
|
-
this.resetTimeRange();
|
|
567
|
-
}
|
|
568
|
-
selectLastSevenDaysIncludingToday() {
|
|
569
|
-
this.setDatesFromRange(TemporalUtil.getLastSevenDaysIncludingToday(this.anchorDate()));
|
|
570
|
-
this.calendarMode.set('days');
|
|
571
|
-
this.resetTimeRange();
|
|
572
|
-
}
|
|
573
|
-
selectCurrentMonth() {
|
|
574
|
-
this.setDatesFromRange(TemporalUtil.getCurrentMonth(this.anchorDate()));
|
|
575
|
-
this.calendarMode.set('months');
|
|
576
|
-
this.resetTimeRange();
|
|
577
|
-
}
|
|
578
|
-
selectPreviousMonth() {
|
|
579
|
-
this.setDatesFromRange(TemporalUtil.getPreviousMonth(this.anchorDate()));
|
|
580
|
-
this.calendarMode.set('months');
|
|
581
|
-
this.resetTimeRange();
|
|
582
|
-
}
|
|
583
|
-
selectLastThirtyDaysExcludingToday() {
|
|
584
|
-
this.setDatesFromRange(TemporalUtil.getLastThirtyDays(this.anchorDate()));
|
|
585
|
-
this.calendarMode.set('days');
|
|
586
|
-
this.resetTimeRange();
|
|
587
|
-
}
|
|
588
|
-
selectLastThirtyDaysIncludingToday() {
|
|
589
|
-
this.setDatesFromRange(TemporalUtil.getLastThirtyDaysIncludingToday(this.anchorDate()));
|
|
590
|
-
this.calendarMode.set('days');
|
|
591
|
-
this.resetTimeRange();
|
|
592
|
-
}
|
|
593
|
-
selectCurrentYear() {
|
|
594
|
-
this.setDatesFromRange(TemporalUtil.getCurrentYear(this.anchorDate()));
|
|
595
|
-
this.calendarMode.set('years');
|
|
596
|
-
this.resetTimeRange();
|
|
597
|
-
}
|
|
598
|
-
selectPreviousYear() {
|
|
599
|
-
this.setDatesFromRange(TemporalUtil.getPreviousYear(this.anchorDate()));
|
|
600
|
-
this.calendarMode.set('years');
|
|
601
|
-
this.resetTimeRange();
|
|
602
|
-
}
|
|
603
|
-
selectLast365Days() {
|
|
604
|
-
this.setDatesFromRange(TemporalUtil.getLast365Days(this.anchorDate()));
|
|
605
|
-
this.calendarMode.set('days');
|
|
606
|
-
this.resetTimeRange();
|
|
607
|
-
}
|
|
608
|
-
selectCurrentQuarter() {
|
|
609
|
-
this.setDatesFromRange(TemporalUtil.getCurrentQuarter(this.anchorDate()));
|
|
610
|
-
this.calendarMode.set('quarters');
|
|
611
|
-
this.resetTimeRange();
|
|
612
|
-
}
|
|
613
|
-
selectPreviousQuarter() {
|
|
614
|
-
this.setDatesFromRange(TemporalUtil.getPreviousQuarter(this.anchorDate()));
|
|
615
|
-
this.calendarMode.set('quarters');
|
|
616
|
-
this.resetTimeRange();
|
|
617
|
-
}
|
|
618
|
-
// Anchor point shift selections
|
|
619
|
-
shiftSelectionToAnchorDate() {
|
|
620
|
-
if (!this.isStartAndEndDatesSet() || !this.fixedAnchorDate()) {
|
|
621
|
-
return;
|
|
622
|
-
}
|
|
623
|
-
const range = new TemporalPlainDateInterval(this.startDate(), this.endDate());
|
|
624
|
-
const endDate = this.fixedAnchorDate();
|
|
625
|
-
const startDate = endDate.subtract({ days: range.getDurationInDays() });
|
|
626
|
-
this.startDate.set(startDate);
|
|
627
|
-
this.endDate.set(endDate);
|
|
628
|
-
if (this.calendarMode() === 'months') {
|
|
629
|
-
this.selectCurrentMonth();
|
|
630
|
-
}
|
|
631
|
-
if (this.calendarMode() === 'years') {
|
|
632
|
-
this.selectCurrentYear();
|
|
633
|
-
}
|
|
634
|
-
if (this.calendarMode() === 'weeks') {
|
|
635
|
-
this.selectCurrentWeek();
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
shiftSelectionToAnchorTime() {
|
|
639
|
-
if (!this.isStartAndEndDatesSet() || !this.fixedAnchorTime()) {
|
|
640
|
-
return;
|
|
641
|
-
}
|
|
642
|
-
const duration = this.startDateTime().until(this.endDateTime());
|
|
643
|
-
const newStartDateTime = this.anchorDateTime().subtract(duration);
|
|
644
|
-
const newEndDateTime = this.anchorDateTime();
|
|
645
|
-
this.startDate.set(Temporal.PlainDate.from(newStartDateTime));
|
|
646
|
-
this.startTime.set(Temporal.PlainTime.from(newStartDateTime));
|
|
647
|
-
this.endDate.set(Temporal.PlainDate.from(newEndDateTime));
|
|
648
|
-
this.endTime.set(Temporal.PlainTime.from(newEndDateTime));
|
|
649
|
-
if (this.calendarMode() === 'months') {
|
|
650
|
-
this.selectCurrentMonth();
|
|
651
|
-
}
|
|
652
|
-
if (this.calendarMode() === 'years') {
|
|
653
|
-
this.selectCurrentYear();
|
|
654
|
-
}
|
|
655
|
-
if (this.calendarMode() === 'weeks') {
|
|
656
|
-
this.selectCurrentWeek();
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
/***************************************************************************
|
|
660
|
-
* *
|
|
661
|
-
* Private methods *
|
|
662
|
-
* *
|
|
663
|
-
**************************************************************************/
|
|
664
|
-
createElderInterval() {
|
|
665
|
-
let start, end = null;
|
|
666
|
-
if (this.startDateTime()) {
|
|
667
|
-
const jsDate = TemporalUtil.getJSDateFromPlainDateTime(this.startDateTime());
|
|
668
|
-
start = TimeUtil.instant(jsDate);
|
|
669
|
-
}
|
|
670
|
-
if (this.endDateTime()) {
|
|
671
|
-
const jsDate = TemporalUtil.getJSDateFromPlainDateTime(this.endDateTime());
|
|
672
|
-
end = TimeUtil.instant(jsDate);
|
|
673
|
-
}
|
|
674
|
-
if (!start && !end) {
|
|
675
|
-
return new Interval(null, null);
|
|
676
|
-
}
|
|
677
|
-
return new Interval(start, end);
|
|
678
|
-
}
|
|
679
|
-
setDatesFromRange(range) {
|
|
680
|
-
this.startDate.set(range.start);
|
|
681
|
-
this.endDate.set(range.end);
|
|
682
|
-
}
|
|
683
|
-
refreshBaseReferenceDateTime() {
|
|
684
|
-
const dateTime = Temporal.Now.zonedDateTimeISO();
|
|
685
|
-
const date = Temporal.PlainDate.from(dateTime);
|
|
686
|
-
const time = Temporal.PlainTime.from(dateTime);
|
|
687
|
-
this.baseReferenceDate.set(date);
|
|
688
|
-
this.baseReferenceTime.set(time);
|
|
689
|
-
}
|
|
690
|
-
resetTimeRange() {
|
|
691
|
-
this.startTime.set(Temporal.PlainTime.from('00:00'));
|
|
692
|
-
this.endTime.set(Temporal.PlainTime.from('00:00'));
|
|
693
|
-
}
|
|
694
|
-
shiftRangeEndToToday() {
|
|
695
|
-
if (!this.isStartAndEndDatesSet()) {
|
|
696
|
-
return;
|
|
697
|
-
}
|
|
698
|
-
const duration = this.startDate().until(this.endDate());
|
|
699
|
-
this.endDate.set(Temporal.Now.plainDateISO());
|
|
700
|
-
this.startDate.set(this.endDate().subtract(duration));
|
|
701
|
-
}
|
|
702
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
703
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService }); }
|
|
704
|
-
}
|
|
705
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService, decorators: [{
|
|
706
|
-
type: Injectable
|
|
707
|
-
}] });
|
|
708
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL2VsZGVyLWludGVydmFsLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFlBQVksRUFDWixVQUFVLEVBRVYsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQTtBQUM3RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFBOztBQUd6RCxNQUFNLG1CQUFtQixHQUFpQixNQUFNLENBQUE7QUFHaEQsTUFBTSxPQUFPLDBCQUEwQjtJQUR2QztRQUVFOzs7O29GQUk0RTtRQUUzRCxRQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTdELHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUE7UUFFaEQsaUJBQVksR0FBRyxNQUFNLENBQWUsbUJBQW1CLENBQUMsQ0FBQTtRQUV4RCxjQUFTLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQTtR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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztZQUNsQyxPQUFNO1FBQ1IsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUN2RCxDQUFDOzhHQTV6QlUsMEJBQTBCO2tIQUExQiwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFZmZlY3RSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0YWJsZSxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJ1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJ1xuaW1wb3J0IHsgTG9jYWxEYXRlIH0gZnJvbSAnQGpzLWpvZGEvY29yZSdcbmltcG9ydCB7IFRlbXBvcmFsIH0gZnJvbSAnQGpzLXRlbXBvcmFsL3BvbHlmaWxsJ1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS9pbnRlcnZhbCdcbmltcG9ydCB7IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS90ZW1wb3JhbC1wbGFpbi1kYXRlLWludGVydmFsJ1xuaW1wb3J0IHsgVGVtcG9yYWxVdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3RpbWUvdGVtcG9yYWwtdXRpbCdcbmltcG9ydCB7IFRpbWVVdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3RpbWUvdGltZS11dGlsJ1xuXG50eXBlIGNhbGVuZGFyTW9kZSA9ICdkYXlzJyB8ICd3ZWVrcycgfCAnbW9udGhzJyB8ICdxdWFydGVycycgfCAneWVhcnMnXG5jb25zdCBkZWZhdWx0Q2FsZW5kYXJNb2RlOiBjYWxlbmRhck1vZGUgPSAnZGF5cydcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEVsZGVySW50ZXJ2YWxQaWNrZXJTZXJ2aWNlIHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG5cbiAgcHJpdmF0ZSBfZGF0ZUNoYW5nZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVydmFsPigpXG5cbiAgcmVhZG9ubHkgY2FsZW5kYXJNb2RlID0gc2lnbmFsPGNhbGVuZGFyTW9kZT4oZGVmYXVsdENhbGVuZGFyTW9kZSlcblxuICByZWFkb25seSBzdGFydERhdGUgPSBzaWduYWw8VGVtcG9yYWwuUGxhaW5EYXRlPihudWxsKVxuICByZWFkb25seSBlbmREYXRlID0gc2lnbmFsPFRlbXBvcmFsLlBsYWluRGF0ZT4obnVsbClcblxuICByZWFkb25seSBiYXNlUmVmZXJlbmNlRGF0ZSA9IHNpZ25hbChUZW1wb3JhbC5Ob3cucGxhaW5EYXRlSVNPKCkpXG4gIHJlYWRvbmx5IGJhc2VSZWZlcmVuY2VUaW1lID0gc2lnbmFsKFRlbXBvcmFsLk5vdy5wbGFpblRpbWVJU08oKSlcblxuICByZWFkb25seSBmaXhlZEFuY2hvckRhdGUgPSBzaWduYWw8VGVtcG9yYWwuUGxhaW5EYXRlPihudWxsKVxuICByZWFkb25seSBmaXhlZEFuY2hvclRpbWUgPSBzaWduYWwoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oJzAwOjAwJykpXG5cbiAgcmVhZG9ubHkgc3RhcnRUaW1lID0gc2lnbmFsKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKVxuICByZWFkb25seSBlbmRUaW1lID0gc2lnbmFsKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKVxuXG4gIHByaXZhdGUgX2lucHV0SW50ZXJ2YWw6IFNpZ25hbDxJbnRlcnZhbD4gPSBudWxsXG4gIHByaXZhdGUgX2lucHV0QW5jaG9yRGF0ZVRpbWU6IFNpZ25hbDxEYXRlPiA9IG51bGxcblxuICByZWFkb25seSBpc0VtaXR0aW5nT25DaGFuZ2UgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSlcbiAgcmVhZG9ubHkgaXNVcGRhdGluZ0ludGVydmFsT25BbmNob3JDaGFuZ2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpXG5cbiAgcmVhZG9ubHkgaXNGaXhlZEFuY2hvckRhdGVTZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5maXhlZEFuY2hvckRhdGUoKVxuICB9KVxuXG4gIHJlYWRvbmx5IGFuY2hvckRhdGUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWRBbmNob3JEYXRlKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFzZVJlZmVyZW5jZURhdGUoKVxuICB9KVxuXG4gIHJlYWRvbmx5IGFuY2hvclRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpblRpbWU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5maXhlZEFuY2hvckRhdGUoKSAmJiB0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maXhlZEFuY2hvclRpbWUoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlUmVmZXJlbmNlVGltZSgpXG4gIH0pXG5cbiAgcmVhZG9ubHkgYW5jaG9yRGF0ZVRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYW5jaG9yRGF0ZSgpLnRvUGxhaW5EYXRlVGltZSh0aGlzLmFuY2hvclRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBkYXRlUmFuZ2UgPSBjb21wdXRlZDxUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsIHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsKHRoaXMuc3RhcnREYXRlKCksIHRoaXMuZW5kRGF0ZSgpKVxuICB9KVxuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZUZvckNhbGVuZGFyID0gY29tcHV0ZWQ8RGF0ZVJhbmdlPERhdGU+IHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3Qgc3RhcnREYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlKCkpXG4gICAgY29uc3QgZW5kRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLmVuZERhdGUoKSlcbiAgICByZXR1cm4gbmV3IERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlSW5EYXlzID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmRhdGVSYW5nZSgpKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRlUmFuZ2UoKS5nZXREdXJhdGlvbkluRGF5cygpXG4gIH0pXG5cbiAgcmVhZG9ubHkgaXNTdGFydEFuZEVuZERhdGVzRW1wdHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuICF0aGlzLnN0YXJ0RGF0ZSgpICYmICF0aGlzLmVuZERhdGUoKVxuICB9KVxuXG4gIHJlYWRvbmx5IGlzU3RhcnRBbmRFbmREYXRlc1NldCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gISEodGhpcy5zdGFydERhdGUoKSAmJiB0aGlzLmVuZERhdGUoKSlcbiAgfSlcblxuICByZWFkb25seSBpc1JhbmdlTm90U2V0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIHJldHVybiAhdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKVxuICB9KVxuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZVRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5zdGFydFRpbWUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnREYXRlKCkudG9QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnRUaW1lKCkpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZSgpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZW5kRGF0ZVRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kVGltZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmREYXRlKCkudG9QbGFpbkRhdGVUaW1lKHRoaXMuZW5kVGltZSgpKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmREYXRlKClcbiAgfSlcblxuICByZWFkb25seSBzdGFydERhdGVBc0pTRGF0ZSA9IGNvbXB1dGVkPERhdGUgfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZW5kRGF0ZUFzSlNEYXRlID0gY29tcHV0ZWQ8RGF0ZSB8IG51bGw+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuZW5kRGF0ZSgpKVxuICB9KVxuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZVRpbWVBc0pTRGF0ZSA9IGNvbXB1dGVkPERhdGUgfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZVRpbWUoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLnN0YXJ0RGF0ZVRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBlbmREYXRlVGltZUFzSlNEYXRlID0gY29tcHV0ZWQ8RGF0ZSB8IG51bGw+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW5kRGF0ZVRpbWUoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLmVuZERhdGVUaW1lKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0Q2FsZW5kYXJXZWVrID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFydERhdGUoKS53ZWVrT2ZZZWFyXG4gIH0pXG5cbiAgcmVhZG9ubHkgaXNGdWxsQ2FsZW5kZXJXZWVrU2VsZWN0ZWQgPSBjb21wdXRlZDxib29sZWFuIHwgbnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzU3RhcnRBbmRFbmREYXRlc1NldCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIVRlbXBvcmFsVXRpbC5pc0ZpcnN0RGF5T2ZXZWVrKHRoaXMuc3RhcnREYXRlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuc3RhcnREYXRlKCkudW50aWwodGhpcy5lbmREYXRlKCkpXG5cbiAgICBpZiAoZHVyYXRpb24uZGF5cyAhPT0gNykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnREYXRlKCkud2Vla09mWWVhclxuICB9KVxuXG4gIHJlYWRvbmx5IHZpZXdJbnRlcnZhbE1lc3NhZ2UgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pc1JhbmdlTm90U2V0KCkpIHtcbiAgICAgIHJldHVybiAnLSdcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3F1YXJ0ZXJzJykge1xuICAgICAgY29uc3QgcXVhcnRlciA9IFRlbXBvcmFsVXRpbC5nZXRRdWFydGVyRm9yRGF0ZSh0aGlzLnN0YXJ0RGF0ZSgpKVxuICAgICAgcmV0dXJuIGBRJHtxdWFydGVyfSwgJHt0aGlzLnN0YXJ0RGF0ZSgpLnllYXJ9YFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgY29uc3QgbW9udGhOYW1lID0gdGhpcy5zdGFydERhdGUoKS5tb250aFxuICAgICAgcmV0dXJuIGAxbSAoJHttb250aE5hbWV9LCAke3RoaXMuc3RhcnREYXRlKCkueWVhcn0pYFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5zdGFydERhdGUoKS55ZWFyXG4gICAgICByZXR1cm4gYDF5ICgke3llYXJ9KWBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgcmV0dXJuIGAxdyAoQ1cgJHt0aGlzLmdldENhbGVuZGFyV2VlaygpfSwgJHt0aGlzLmVuZERhdGUoKS55ZWFyfSlgXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdkYXlzJykge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZGF0ZVJhbmdlSW5EYXlzKCl9ZGBcbiAgICB9XG5cbiAgICByZXR1cm4gJydcbiAgfSlcblxuICByZWFkb25seSBkZWx0YUFzVGVtcG9yYWxEdXJhdGlvbiA9IGNvbXB1dGVkPFRlbXBvcmFsLkR1cmF0aW9uPigoKSA9PiB7XG4gICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IHRoaXMuc3RhcnREYXRlVGltZSgpXG4gICAgY29uc3QgZW5kRGF0ZVRpbWUgPSB0aGlzLmVuZERhdGVUaW1lKClcblxuICAgIGlmICghc3RhcnREYXRlVGltZSB8fCAhZW5kRGF0ZVRpbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBzdGFydERhdGVUaW1lLnVudGlsKGVuZERhdGVUaW1lKVxuICAgIHJldHVybiBkdXJhdGlvblxuICB9KVxuXG4gIHJlYWRvbmx5IGRlbHRhSHVtYW5SZWFkYWJsZSA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzU3RhcnRBbmRFbmREYXRlc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZGVsdGFBc1RlbXBvcmFsRHVyYXRpb24oKVxuICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgIHJldHVybiAn4oieJ1xuICAgIH1cbiAgICBjb25zdCB0bXAgPSBbXVxuICAgIGlmIChkdXJhdGlvbi5kYXlzKSB7XG4gICAgICB0bXAucHVzaChgJHtkdXJhdGlvbi5kYXlzfWRgKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24uaG91cnMpIHtcbiAgICAgIHRtcC5wdXNoKGAke2R1cmF0aW9uLmhvdXJzfWhgKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24ubWludXRlcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24ubWludXRlc31taW5gKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24uc2Vjb25kcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24uc2Vjb25kc31zYClcbiAgICB9XG5cbiAgICBpZiAoIXRtcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnMHMnXG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcC5qb2luKCcsICcpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0U3RhcnRUaW1lU3RyaW5nID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRIdG1sVGltZVN0cmluZ0Zyb21QbGFpblRpbWUodGhpcy5zdGFydFRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBnZXRFbmRUaW1lU3RyaW5nID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRIdG1sVGltZVN0cmluZ0Zyb21QbGFpblRpbWUodGhpcy5lbmRUaW1lKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0QW5jaG9yVGltZVN0cmluZyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SHRtbFRpbWVTdHJpbmdGcm9tUGxhaW5UaW1lKHRoaXMuZml4ZWRBbmNob3JUaW1lKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0QW5jaG9yUG9pbnRBc0xvY2FsZURhdGUgPSBjb21wdXRlZDxMb2NhbERhdGU+KCgpID0+IHtcbiAgICBjb25zdCBhbmNob3JQb2ludCA9IHRoaXMuZml4ZWRBbmNob3JEYXRlKClcbiAgICBpZiAoIWFuY2hvclBvaW50KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBjb25zdCBqc0RhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoYW5jaG9yUG9pbnQpXG4gICAgY29uc3QgbG9jYWxlRGF0ZSA9IFRpbWVVdGlsLmRhdGVUb0xvY2FsRGF0ZShqc0RhdGUpXG4gICAgcmV0dXJuIGxvY2FsZURhdGVcbiAgfSlcblxuICByZWFkb25seSBzdGFydERhdGVIdG1sU3RyaW5nID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRIdG1sRGF0ZVN0cmluZyh0aGlzLnN0YXJ0RGF0ZVRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBlbmREYXRlSHRtbFN0cmluZyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SHRtbERhdGVTdHJpbmcodGhpcy5lbmREYXRlVGltZSgpKVxuICB9KVxuXG4gIHJlYWRvbmx5IGlzU3RhcnRUaW1lU2V0QW5kTm90TWlkbmlnaHQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0VGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhcnRUaW1lKCkuaG91ciAhPT0gMCB8fCB0aGlzLnN0YXJ0VGltZSgpLm1pbnV0ZSAhPT0gMCB8fCB0aGlzLnN0YXJ0VGltZSgpLnNlY29uZCAhPT0gMFxuICAgIClcbiAgfSlcblxuICByZWFkb25seSBpc0VuZFRpbWVTZXRBbmROb3RNaWRuaWdodCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW5kVGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5kVGltZSgpLmhvdXIgIT09IDAgfHwgdGhpcy5lbmRUaW1lKCkubWludXRlICE9PSAwIHx8IHRoaXMuZW5kVGltZSgpLnNlY29uZCAhPT0gMFxuICB9KVxuXG4gIHJlYWRvbmx5IGlzRml4ZWRBbmNob3JUaW1lU2V0QW5kTm90TWlkbmlnaHQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lKCkuaG91ciAhPT0gMCB8fFxuICAgICAgdGhpcy5maXhlZEFuY2hvclRpbWUoKS5taW51dGUgIT09IDAgfHxcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lKCkuc2Vjb25kICE9PSAwXG4gICAgKVxuICB9KVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHNldFN0YXJ0RGF0ZUZyb21IdG1sU3RyaW5nKGh0bWxTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUh0bWxEYXRlU3RyaW5nKGh0bWxTdHJpbmcpXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSlcbiAgfVxuXG4gIHNldEVuZERhdGVGcm9tSHRtbFN0cmluZyhodG1sU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21IdG1sRGF0ZVN0cmluZyhodG1sU3RyaW5nKVxuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5lbmREYXRlLnNldChkYXRlKVxuICB9XG5cbiAgc2V0dXBJbnB1dEludGVydmFsKHM6IFNpZ25hbDxJbnRlcnZhbD4pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnB1dEludGVydmFsID0gc1xuICB9XG5cbiAgc2V0dXBJbnB1dEFuY2hvckRhdGVUaW1lKHM6IFNpZ25hbDxEYXRlPik6IHZvaWQge1xuICAgIHRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUgPSBzXG4gIH1cblxuICBzZXR1cEV2ZW50RW1pdHRlcihlOiBFdmVudEVtaXR0ZXI8SW50ZXJ2YWw+KTogdm9pZCB7XG4gICAgdGhpcy5fZGF0ZUNoYW5nZUVtaXR0ZXIgPSBlXG4gIH1cblxuICBzZXRTdGFydFRpbWVGcm9tU3RyaW5nKHRpbWVTdHI6IHN0cmluZywgZm9ybUNvbnRyb2w/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21IdG1sVGltZVN0cmluZyh0aW1lU3RyKVxuXG4gICAgaWYgKHRpbWUpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lLnNldCh0aW1lKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KFRlbXBvcmFsLk5vdy5wbGFpbkRhdGVJU08oKSlcbiAgICB9XG5cbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICB9XG5cbiAgc2V0RW5kVGltZUZyb21TdHJpbmcodGltZVN0cjogc3RyaW5nLCBmb3JtQ29udHJvbD86IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHRpbWUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5UaW1lRnJvbUh0bWxUaW1lU3RyaW5nKHRpbWVTdHIpXG5cbiAgICBpZiAodGltZSkge1xuICAgICAgdGhpcy5lbmRUaW1lLnNldCh0aW1lKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQoVGVtcG9yYWwuTm93LnBsYWluRGF0ZUlTTygpKVxuICAgIH1cblxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICByZXNldENhbGVuZGFyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoZGVmYXVsdENhbGVuZGFyTW9kZSlcbiAgfVxuXG4gIHB1bGxJbnB1dEludGVydmFsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW5wdXRJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zZXREYXRlVGltZXNGcm9tRWxkZXJJbnRlcnZhbCh0aGlzLl9pbnB1dEludGVydmFsKCkpXG4gIH1cblxuICBwdWxsSW5wdXRBbmNob3JEYXRlVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2V0QW5jaG9yRGF0ZVRpbWVGcm9tSnNEYXRlKHRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUoKSlcbiAgfVxuXG4gIHNldERhdGVUaW1lc0Zyb21FbGRlckludGVydmFsKGludGVydmFsOiBJbnRlcnZhbCk6IHZvaWQge1xuICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChudWxsKVxuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGludGVydmFsLnN0YXJ0KSB7XG4gICAgICBjb25zdCBzdGFydERhdGVBc0pTRGF0ZSA9IFRpbWVVdGlsLmRhdGUoaW50ZXJ2YWwuc3RhcnQpXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21KU0RhdGUoc3RhcnREYXRlQXNKU0RhdGUpKVxuICAgICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSlNEYXRlKHN0YXJ0RGF0ZUFzSlNEYXRlKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KG51bGwpXG4gICAgfVxuXG4gICAgaWYgKGludGVydmFsLmVuZCkge1xuICAgICAgY29uc3QgZW5kRGF0ZUFzSlNEYXRlID0gVGltZVV0aWwuZGF0ZShpbnRlcnZhbC5lbmQpXG4gICAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVGcm9tSlNEYXRlKGVuZERhdGVBc0pTRGF0ZSkpXG4gICAgICB0aGlzLmVuZFRpbWUuc2V0KFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSlNEYXRlKGVuZERhdGVBc0pTRGF0ZSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQobnVsbClcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUHVsbGVkIGlucHV0IGludGVydmFsOmAsIGludGVydmFsKVxuICB9XG5cbiAgc2V0QW5jaG9yRGF0ZVRpbWVGcm9tSnNEYXRlKGRhdGVUaW1lOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKCFkYXRlVGltZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUpTRGF0ZShkYXRlVGltZSlcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21KU0RhdGUoZGF0ZVRpbWUpXG4gICAgdGhpcy5maXhlZEFuY2hvckRhdGUuc2V0KGRhdGUpXG4gICAgdGhpcy5maXhlZEFuY2hvclRpbWUuc2V0KHRpbWUpXG4gIH1cblxuICBzZXRGaXhlZEFuY2hvclBvaW50VG9TdGFydERhdGVUaW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5yZXNldEZpeGVkQW5jaG9yUG9pbnQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQodGhpcy5zdGFydERhdGUoKSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhcnRUaW1lKCkpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldCh0aGlzLnN0YXJ0VGltZSgpKVxuICAgIH1cbiAgfVxuXG4gIHNldEZpeGVkQW5jaG9yUG9pbnRUb0VuZERhdGVUaW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMucmVzZXRGaXhlZEFuY2hvclBvaW50KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldCh0aGlzLmVuZERhdGUoKSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kVGltZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yVGltZS5zZXQodGhpcy5lbmRUaW1lKCkpXG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaXhlZEFuY2hvclBvaW50KCk6IHZvaWQge1xuICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChudWxsKVxuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldChUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSlcbiAgICBpZiAodGhpcy5pc1VwZGF0aW5nSW50ZXJ2YWxPbkFuY2hvckNoYW5nZSgpICYmIHRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkpIHtcbiAgICAgIHRoaXMuc2hpZnRSYW5nZUVuZFRvVG9kYXkoKVxuICAgIH1cbiAgfVxuXG4gIHNldEFuY2hvckRhdGVGcm9tRm9ybShkYXRlQXJnOiBMb2NhbERhdGUpOiB2b2lkIHtcbiAgICBpZiAoIWRhdGVBcmcpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QganNEYXRlID0gVGltZVV0aWwubG9jYWxEYXRlVG9EYXRlKGRhdGVBcmcpXG4gICAgY29uc3QgcGxhaW5EYXRlID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21KU0RhdGUoanNEYXRlKVxuXG4gICAgaWYgKCFwbGFpbkRhdGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oJ0ludmFsaWQgZGF0ZScsIHBsYWluRGF0ZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChwbGFpbkRhdGUpXG5cbiAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ0ludGVydmFsT25BbmNob3JDaGFuZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZml4ZWRBbmNob3JEYXRlKCkpIHtcbiAgICAgIHRoaXMuc2hpZnRTZWxlY3Rpb25Ub0FuY2hvckRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyU3RhcnREYXRlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQobnVsbClcbiAgICB0aGlzLnN0YXJ0VGltZS5zZXQobnVsbClcbiAgfVxuXG4gIGNsZWFyRW5kRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5lbmREYXRlLnNldChudWxsKVxuICAgIHRoaXMuZW5kVGltZS5zZXQobnVsbClcbiAgfVxuXG4gIGNsZWFyU3RhcnRUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRUaW1lLnNldChudWxsKVxuICB9XG5cbiAgY2xlYXJFbmRUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZW5kVGltZS5zZXQobnVsbClcbiAgfVxuXG4gIHJlc2V0Rml4ZWRBbmNob3JUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldChUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSlcbiAgfVxuXG4gIHNldEFuY2hvclRpbWVGcm9tRm9ybShodG1sU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21IdG1sVGltZVN0cmluZyhodG1sU3RyaW5nKVxuICAgIGlmICghdGltZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpeGVkQW5jaG9yRGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQoVGVtcG9yYWwuTm93LnBsYWluRGF0ZUlTTygpKVxuICAgIH1cblxuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldCh0aW1lKVxuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRpbmdJbnRlcnZhbE9uQW5jaG9yQ2hhbmdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICB0aGlzLnNoaWZ0U2VsZWN0aW9uVG9BbmNob3JUaW1lKClcbiAgICB9XG4gIH1cblxuICBlbWl0TWFpbkRhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5jcmVhdGVFbGRlckludGVydmFsKClcbiAgICB0aGlzLl9kYXRlQ2hhbmdlRW1pdHRlci5lbWl0KGludGVydmFsKVxuICB9XG5cbiAgLy8gZGF0ZSBzaGlmdHNcbiAgc2hpZnREYXkoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0RGF5cyhkYXlzKSlcbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJyAmJiAoZGF5cyA9PT0gNyB8fCBkYXlzID09PSAtNykpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnd2Vla3MnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICBzaGlmdE1vbnRoKG1vbnRoczogbnVtYmVyLCBzdGF0aWNNb2RlID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRNb250aHMobW9udGhzKSlcbiAgICBpZiAoc3RhdGljTW9kZSAmJiB0aGlzLmNhbGVuZGFyTW9kZSgpICE9PSAnbW9udGhzJykge1xuICAgICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ21vbnRocycpXG4gIH1cblxuICBzaGlmdFllYXIoeWVhcnM6IG51bWJlciwgc3RhdGljTW9kZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0WWVhcnMoeWVhcnMpKVxuICAgIGlmIChzdGF0aWNNb2RlICYmIHRoaXMuY2FsZW5kYXJNb2RlKCkgIT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd5ZWFycycpXG4gIH1cblxuICBzaGlmdFRpbWUoYW1vdW50OiBudW1iZXIsIHVuaXQ6ICdob3VycycgfCAnbWludXRlcycpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZVRpbWUoKS5hZGQoeyBbdW5pdF06IGFtb3VudCB9KVxuICAgIGNvbnN0IG5ld0VuZERhdGVUaW1lID0gdGhpcy5lbmREYXRlVGltZSgpLmFkZCh7IFt1bml0XTogYW1vdW50IH0pXG5cbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3U3RhcnREYXRlVGltZSkpXG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUgYXMgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSkpXG5cbiAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld0VuZERhdGVUaW1lKSlcbiAgICB0aGlzLmVuZFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld0VuZERhdGVUaW1lIGFzIFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUpKVxuICB9XG5cbiAgc21hcnRTaGlmdChkaXJlY3Rpb24gPSAxKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdxdWFydGVycycpIHtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdE1vbnRocyhkaXJlY3Rpb24gKiAzKVxuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0TW9udGhzKGRpcmVjdGlvbilcbiAgICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3llYXJzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0WWVhcnMoZGlyZWN0aW9uKVxuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnd2Vla3MnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnREYXlzKDcgKiBkaXJlY3Rpb24pXG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0RpZmYgPSB0aGlzLmRhdGVSYW5nZSgpLmdldER1cmF0aW9uSW5EYXlzKClcbiAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnREYXlzKGRheXNEaWZmICogZGlyZWN0aW9uKVxuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpXG4gIH1cblxuICAvLyB0aW1lIHJhbmdlIHNlbGVjdGlvbnNcbiAgc2VsZWN0TGFzdEhvdXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKClcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKVxuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KHsgaG91cnM6IDEgfSlcbiAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuYW5jaG9yRGF0ZSgpKVxuICAgIHRoaXMuZW5kVGltZS5zZXQodGhpcy5hbmNob3JUaW1lKCkpXG5cbiAgICBjb25zdCBzdGFydFBsYWluRGF0ZSA9IFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKHN0YXJ0KVxuICAgIGNvbnN0IHN0YXJ0UGxhaW5UaW1lID0gVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oc3RhcnQpXG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0UGxhaW5EYXRlKVxuICAgIHRoaXMuc3RhcnRUaW1lLnNldChzdGFydFBsYWluVGltZSlcblxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICBzZWxlY3RMYXN0MjRIb3VycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hCYXNlUmVmZXJlbmNlRGF0ZVRpbWUoKVxuXG4gICAgY29uc3QgZW5kID0gdGhpcy5hbmNob3JEYXRlVGltZSgpXG4gICAgY29uc3Qgc3RhcnQgPSBlbmQuc3VidHJhY3QoeyBkYXlzOiAxIH0pXG4gICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLmFuY2hvckRhdGUoKSlcbiAgICB0aGlzLmVuZFRpbWUuc2V0KHRoaXMuYW5jaG9yVGltZSgpKVxuXG4gICAgY29uc3Qgc3RhcnRQbGFpbkRhdGUgPSBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShzdGFydClcblxuICAgIGNvbnN0IHN0YXJ0UGxhaW5UaW1lID0gVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oc3RhcnQpXG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0UGxhaW5EYXRlKVxuICAgIHRoaXMuc3RhcnRUaW1lLnNldChzdGFydFBsYWluVGltZSlcblxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICBzZWxlY3RMYXN0Rml2ZU1pbnV0ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKClcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKVxuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KHsgbWludXRlczogNSB9KVxuICAgIHRoaXMuZW5kRGF0ZS5zZXQodGhpcy5hbmNob3JEYXRlKCkpXG4gICAgdGhpcy5lbmRUaW1lLnNldCh0aGlzLmFuY2hvclRpbWUoKSlcblxuICAgIGNvbnN0IHN0YXJ0UGxhaW5EYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oc3RhcnQpXG4gICAgY29uc3Qgc3RhcnRQbGFpblRpbWUgPSBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShzdGFydClcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoc3RhcnRQbGFpbkRhdGUpXG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KHN0YXJ0UGxhaW5UaW1lKVxuXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgfVxuXG4gIC8vIGRhdGUgcmFuZ2Ugc2VsZWN0aW9uc1xuICBzZWxlY3RDdXJyZW50RGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnREYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RZZXN0ZXJkYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0WWVzdGVyZGF5KHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0Q3VycmVudFdlZWsoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFdlZWsodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnd2Vla3MnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNXZWVrKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzV2Vlayh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd3ZWVrcycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RMYXN0U2V2ZW5EYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFNldmVuRGF5cyh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHNlbGVjdExhc3RTZXZlbkRheXNJbmNsdWRpbmdUb2RheSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRMYXN0U2V2ZW5EYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RDdXJyZW50TW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudE1vbnRoKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ21vbnRocycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzTW9udGgodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnbW9udGhzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHNlbGVjdExhc3RUaGlydHlEYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFRoaXJ0eURheXModGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RMYXN0VGhpcnR5RGF5c0luY2x1ZGluZ1RvZGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3RUaGlydHlEYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RDdXJyZW50WWVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRDdXJyZW50WWVhcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd5ZWFycycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RQcmV2aW91c1llYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0UHJldmlvdXNZZWFyKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ3llYXJzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHNlbGVjdExhc3QzNjVEYXlzKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3QzNjVEYXlzKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0Q3VycmVudFF1YXJ0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFF1YXJ0ZXIodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgncXVhcnRlcnMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNRdWFydGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzUXVhcnRlcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdxdWFydGVycycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICAvLyBBbmNob3IgcG9pbnQgc2hpZnQgc2VsZWN0aW9uc1xuICBwcml2YXRlIHNoaWZ0U2VsZWN0aW9uVG9BbmNob3JEYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSB8fCAhdGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSBuZXcgVGVtcG9yYWxQbGFpbkRhdGVJbnRlcnZhbCh0aGlzLnN0YXJ0RGF0ZSgpLCB0aGlzLmVuZERhdGUoKSlcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5maXhlZEFuY2hvckRhdGUoKVxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGVuZERhdGUuc3VidHJhY3QoeyBkYXlzOiByYW5nZS5nZXREdXJhdGlvbkluRGF5cygpIH0pXG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0RGF0ZSlcbiAgICB0aGlzLmVuZERhdGUuc2V0KGVuZERhdGUpXG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudE1vbnRoKClcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFllYXIoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50V2VlaygpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaGlmdFNlbGVjdGlvblRvQW5jaG9yVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkgfHwgIXRoaXMuZml4ZWRBbmNob3JUaW1lKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGVUaW1lKCkudW50aWwodGhpcy5lbmREYXRlVGltZSgpKVxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKCkuc3VidHJhY3QoZHVyYXRpb24pXG4gICAgY29uc3QgbmV3RW5kRGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKClcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3U3RhcnREYXRlVGltZSkpXG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUpKVxuICAgIHRoaXMuZW5kRGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3RW5kRGF0ZVRpbWUpKVxuICAgIHRoaXMuZW5kVGltZS5zZXQoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20obmV3RW5kRGF0ZVRpbWUpKVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdtb250aHMnKSB7XG4gICAgICB0aGlzLnNlbGVjdEN1cnJlbnRNb250aCgpXG4gICAgfVxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICB0aGlzLnNlbGVjdEN1cnJlbnRZZWFyKClcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFdlZWsoKVxuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgY3JlYXRlRWxkZXJJbnRlcnZhbCgpOiBJbnRlcnZhbCB7XG4gICAgbGV0IHN0YXJ0LFxuICAgICAgZW5kID0gbnVsbFxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZVRpbWUoKSkge1xuICAgICAgY29uc3QganNEYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlVGltZSgpKVxuICAgICAgc3RhcnQgPSBUaW1lVXRpbC5pbnN0YW50KGpzRGF0ZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZVRpbWUoKSkge1xuICAgICAgY29uc3QganNEYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuZW5kRGF0ZVRpbWUoKSlcbiAgICAgIGVuZCA9IFRpbWVVdGlsLmluc3RhbnQoanNEYXRlKVxuICAgIH1cbiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwobnVsbCwgbnVsbClcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbnRlcnZhbChzdGFydCwgZW5kKVxuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRlc0Zyb21SYW5nZShyYW5nZTogVGVtcG9yYWxQbGFpbkRhdGVJbnRlcnZhbCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnREYXRlLnNldChyYW5nZS5zdGFydClcbiAgICB0aGlzLmVuZERhdGUuc2V0KHJhbmdlLmVuZClcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaEJhc2VSZWZlcmVuY2VEYXRlVGltZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlVGltZSA9IFRlbXBvcmFsLk5vdy56b25lZERhdGVUaW1lSVNPKClcbiAgICBjb25zdCBkYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oZGF0ZVRpbWUpXG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKGRhdGVUaW1lKVxuICAgIHRoaXMuYmFzZVJlZmVyZW5jZURhdGUuc2V0KGRhdGUpXG4gICAgdGhpcy5iYXNlUmVmZXJlbmNlVGltZS5zZXQodGltZSlcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRUaW1lUmFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKVxuICAgIHRoaXMuZW5kVGltZS5zZXQoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oJzAwOjAwJykpXG4gIH1cblxuICBwcml2YXRlIHNoaWZ0UmFuZ2VFbmRUb1RvZGF5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGUoKS51bnRpbCh0aGlzLmVuZERhdGUoKSlcbiAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsLk5vdy5wbGFpbkRhdGVJU08oKSlcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQodGhpcy5lbmREYXRlKCkuc3VidHJhY3QoZHVyYXRpb24pKVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEVmZmVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYXV0b0VtaXRPbkRhdGVUaW1lc0NoYW5nZUVmZmVjdDogRWZmZWN0UmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGVUaW1lKClcbiAgICBjb25zdCBlbmREYXRlVGltZSA9IHRoaXMuZW5kRGF0ZVRpbWUoKVxuXG4gICAgaWYgKHRoaXMuaXNFbWl0dGluZ09uQ2hhbmdlKCkpIHtcbiAgICAgIHRoaXMuZW1pdE1haW5EYXRlcygpXG4gICAgfVxuICB9KVxufVxuIl19
|