@ethlete/cdk 2.3.3 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/esm2022/lib/components/accordion/components/accordion/accordion.component.mjs +3 -3
- package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-hint/accordion-hint.directive.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-label/accordion-label.directive.mjs +3 -3
- package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.mjs +3 -3
- package/esm2022/lib/components/bracket/components/bracket/bracket.component.mjs +3 -3
- package/esm2022/lib/components/bracket/directives/bracket-match/bracket-match.directive.mjs +3 -3
- package/esm2022/lib/components/bracket/directives/bracket-round/bracket-round.directive.mjs +3 -3
- package/esm2022/lib/components/bracket/partials/bracket-match/bracket-match.component.mjs +3 -3
- package/esm2022/lib/components/bracket/partials/bracket-round-header/bracket-round-header.component.mjs +3 -3
- package/esm2022/lib/components/button/components/button/button.component.mjs +3 -3
- package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +3 -3
- package/esm2022/lib/components/button/directives/button/button.directive.mjs +3 -3
- package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/components/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/checkbox-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/input-field/input-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/password-input-toggle.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/input/partials/search-input-clear/search-input-clear.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/label/components/label/label.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/label/directives/label-suffix/label-suffix.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/components/radio/radio.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/components/radio-field/radio-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/components/radio-group/radio-group.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/segmented-button.component.mjs +4 -5
- package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/segmented-button-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/segmented-button-group.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/combobox/combobox.imports.mjs +12 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +556 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/components/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/components/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +26 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +49 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +64 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/public-api.mjs +3 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/public-api.mjs +4 -0
- package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/native-select-option.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/native-select-option.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/select/components/public-api.mjs +2 -1
- package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +18 -31
- package/esm2022/lib/components/forms/components/select/components/select/directives/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/public-api.mjs +4 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +449 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +61 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/public-api.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +121 -0
- package/esm2022/lib/components/forms/components/select/components/select/partials/public-api.mjs +1 -2
- package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +22 -7
- package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.mjs +14 -8
- package/esm2022/lib/components/forms/components/select/components/select/public-api.mjs +2 -1
- package/esm2022/lib/components/forms/components/select/components/select/select.imports.mjs +2 -3
- package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/slide-toggle.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/slide-toggle-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.mjs +3 -3
- package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +3 -3
- package/esm2022/lib/components/forms/components/slider/components/slider-field/slider-field.component.mjs +3 -3
- package/esm2022/lib/components/forms/directives/dynamic-form-field/dynamic-form-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/dynamic-form-group/dynamic-form-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/input/input.directive.mjs +47 -32
- package/esm2022/lib/components/forms/directives/input-prefix/input-prefix.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/input-suffix/input-suffix.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/native-input-ref/native-input-ref.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/static-form-group/static-form-group.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/services/default-validator-errors.service.mjs +3 -3
- package/esm2022/lib/components/forms/services/form-field-state.service.mjs +3 -3
- package/esm2022/lib/components/forms/services/form-group-state.service.mjs +3 -3
- package/esm2022/lib/components/forms/services/input-state.service.mjs +3 -3
- package/esm2022/lib/components/forms/utils/decorated-form-field.base.mjs +3 -3
- package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +4 -4
- package/esm2022/lib/components/forms/utils/input.base.mjs +8 -8
- package/esm2022/lib/components/icons/chevron-icon/chevron-icon.component.mjs +3 -3
- package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +3 -3
- package/esm2022/lib/components/masonry/partials/masonry-item/masonry-item.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/bottom-sheet-container.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/bottom-sheet-title.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-swipe-handler.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/dialog-container.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/dialog-close.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/dialog-title.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/services/dialog-base.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/dialog/services/dialog.service.mjs +3 -3
- package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/toggletip.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +3 -3
- package/esm2022/lib/components/overlay/services/dynamic-overlay.service.mjs +3 -3
- package/esm2022/lib/components/pagination/components/pagination/pagination.component.mjs +3 -3
- package/esm2022/lib/components/pagination/partials/pagination-link/pagination-link.directive.mjs +3 -3
- package/esm2022/lib/components/pagination/services/pagination-head.service.mjs +3 -3
- package/esm2022/lib/components/picture/picture-data.directive.mjs +3 -3
- package/esm2022/lib/components/picture/picture.component.mjs +3 -3
- package/esm2022/lib/components/progress-spinner/progress-spinner.component.mjs +3 -3
- package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +55 -8
- package/esm2022/lib/components/skeleton/components/skeleton/skeleton.component.mjs +3 -3
- package/esm2022/lib/components/skeleton/partials/skeleton-item/skeleton-item.component.mjs +3 -3
- package/esm2022/lib/components/sort/components/sort-header/sort-header.component.mjs +3 -3
- package/esm2022/lib/components/sort/partials/sort/sort.directive.mjs +3 -3
- package/esm2022/lib/components/sort/services/sort-header-intl.mjs +3 -3
- package/esm2022/lib/components/table/components/table/table.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/cell/cell.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/cell-def/cell-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/column-def/column-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/footer-cell/footer-cell.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/footer-cell-def/footer-cell-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/header-cell/header-cell.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/header-cell-def/header-cell-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/cells/text-column/text-column.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/footer-row/footer-row.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/footer-row-def/footer-row-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/header-row/header-row.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/header-row-def/header-row-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/no-data-row/no-data-row.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/recycle-rows/recycle-rows.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/row/row.component.mjs +3 -3
- package/esm2022/lib/components/table/partials/rows/row-def/row-def.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/table-busy/table-busy.directive.mjs +3 -3
- package/esm2022/lib/components/table/partials/table-busy-outlet/table-busy-outlet.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/components/inline-tabs/inline-tabs.component.mjs +3 -3
- package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/inline-tab.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/inline-tab-body.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/inline-tab-body-host.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/inline-tab-content.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/inline-tab-label.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/inline-tab-label-wrapper.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/nav-tab-link.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/nav-tabs-outlet.component.mjs +3 -3
- package/esm2022/lib/components/tabs/utils/active-tab-underline.util.mjs +3 -3
- package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +3 -3
- package/esm2022/lib/services/swipe-handler.service.mjs +3 -3
- package/fesm2022/ethlete-cdk.mjs +2035 -718
- package/fesm2022/ethlete-cdk.mjs.map +1 -1
- package/lib/components/forms/components/select/components/combobox/combobox.imports.d.ts +5 -0
- package/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.d.ts +84 -0
- package/lib/components/forms/components/select/components/combobox/components/combobox/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/components/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/components/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.d.ts +7 -0
- package/lib/components/forms/components/select/components/combobox/directives/combobox/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/directives/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.d.ts +16 -0
- package/lib/components/forms/components/select/components/combobox/partials/combobox-body/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.d.ts +16 -0
- package/lib/components/forms/components/select/components/combobox/partials/combobox-option/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/partials/combobox-option/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/partials/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/partials/public-api.d.ts +2 -0
- package/lib/components/forms/components/select/components/combobox/public-api.d.ts +3 -0
- package/lib/components/forms/components/select/components/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/components/select/select.component.d.ts +8 -11
- package/lib/components/forms/components/select/components/select/directives/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/public-api.d.ts +3 -0
- package/lib/components/forms/components/select/components/select/directives/select/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/select/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/select/select.directive.d.ts +95 -0
- package/lib/components/forms/components/select/components/select/directives/select-body/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/select-body/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.d.ts +14 -0
- package/lib/components/forms/components/select/components/select/directives/select-option/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/select-option/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.d.ts +29 -0
- package/lib/components/forms/components/select/components/select/partials/public-api.d.ts +0 -1
- package/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.d.ts +6 -1
- package/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.d.ts +4 -1
- package/lib/components/forms/components/select/components/select/public-api.d.ts +1 -0
- package/lib/components/forms/components/select/components/select/select.imports.d.ts +2 -2
- package/lib/components/forms/components/slider/components/slider/slider.component.d.ts +1 -1
- package/lib/components/forms/directives/input/input.directive.d.ts +3 -1
- package/lib/components/forms/utils/decorated-input.base.d.ts +1 -1
- package/lib/components/forms/utils/input.base.d.ts +2 -4
- package/lib/components/scrollable/components/scrollable/scrollable.component.d.ts +13 -5
- package/package.json +5 -5
- package/esm2022/lib/components/forms/components/select/components/select/partials/tree-select-option/public-api.mjs +0 -2
- package/esm2022/lib/components/forms/components/select/components/select/partials/tree-select-option/tree-select-option.component.mjs +0 -23
- package/lib/components/forms/components/select/components/select/partials/tree-select-option/public-api.d.ts +0 -1
- package/lib/components/forms/components/select/components/select/partials/tree-select-option/tree-select-option.component.d.ts +0 -5
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { DOWN_ARROW, ENTER, ESCAPE, TAB, UP_ARROW } from '@angular/cdk/keycodes';
|
|
3
|
+
import { AsyncPipe, NgFor, NgIf } from '@angular/common';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, InjectionToken, Input, Output, ViewEncapsulation, inject, isDevMode, } from '@angular/core';
|
|
5
|
+
import { AnimatedOverlayDirective, LetDirective, clone } from '@ethlete/core';
|
|
6
|
+
import { BehaviorSubject, catchError, combineLatest, debounceTime, distinctUntilChanged, map, of, shareReplay, skip, takeUntil, tap, throwError, } from 'rxjs';
|
|
7
|
+
import { ChevronIconComponent } from '../../../../../../../icons';
|
|
8
|
+
import { INPUT_TOKEN, InputDirective, NativeInputRefDirective } from '../../../../../../directives';
|
|
9
|
+
import { DecoratedInputBase } from '../../../../../../utils';
|
|
10
|
+
import { ComboboxBodyComponent } from '../../partials';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "../../../../../../directives/input/input.directive";
|
|
13
|
+
import * as i2 from "@ethlete/core";
|
|
14
|
+
export class RuntimeError extends Error {
|
|
15
|
+
constructor(code, message, data = '__ET_NO_DATA__') {
|
|
16
|
+
super(formatRuntimeError(code, message));
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.data = data;
|
|
19
|
+
if (data !== '__ET_NO_DATA__') {
|
|
20
|
+
try {
|
|
21
|
+
const _data = clone(data);
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
console.error(_data);
|
|
24
|
+
}, 1);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
console.error(data);
|
|
29
|
+
}, 1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function formatRuntimeError(code, message) {
|
|
35
|
+
// prefix code with zeros if it's less than 100
|
|
36
|
+
const codeWithZeros = code < 10 ? `00${code}` : code < 100 ? `0${code}` : code;
|
|
37
|
+
const fullCode = `ET${codeWithZeros}`;
|
|
38
|
+
return `${fullCode}${message ? ': ' + message : ''}`;
|
|
39
|
+
}
|
|
40
|
+
const COMBOBOX_ERRORS = {
|
|
41
|
+
1: 'Expected options to be an array of objects. This is due to "bindLabel" and "bindValue" being set.',
|
|
42
|
+
2: 'Expected options to be an array of primitives. This is due to "bindLabel" and "bindValue" not being set or "allowCustomValues" being set to true.',
|
|
43
|
+
};
|
|
44
|
+
const comboboxError = (code, data) => {
|
|
45
|
+
const message = `<et-combobox>: ${COMBOBOX_ERRORS[code]}`;
|
|
46
|
+
throw new RuntimeError(code, message, data);
|
|
47
|
+
};
|
|
48
|
+
const isPrimitiveArray = (value) => {
|
|
49
|
+
if (!Array.isArray(value))
|
|
50
|
+
return false;
|
|
51
|
+
const first = value[0];
|
|
52
|
+
const last = value[value.length - 1];
|
|
53
|
+
if (!first || !last)
|
|
54
|
+
return false;
|
|
55
|
+
return typeof first !== 'object' && typeof last !== 'object';
|
|
56
|
+
};
|
|
57
|
+
const isObjectArray = (value) => {
|
|
58
|
+
if (!Array.isArray(value))
|
|
59
|
+
return false;
|
|
60
|
+
const first = value[0];
|
|
61
|
+
const last = value[value.length - 1];
|
|
62
|
+
if (!first || !last)
|
|
63
|
+
return false;
|
|
64
|
+
return typeof first === 'object' && typeof last === 'object';
|
|
65
|
+
};
|
|
66
|
+
const isEmptyArray = (value) => {
|
|
67
|
+
return Array.isArray(value) && value.length === 0;
|
|
68
|
+
};
|
|
69
|
+
const isObject = (value) => {
|
|
70
|
+
return typeof value === 'object' && value !== null;
|
|
71
|
+
};
|
|
72
|
+
const ComboboxOptionType = {
|
|
73
|
+
Primitive: 'primitive',
|
|
74
|
+
Object: 'object',
|
|
75
|
+
};
|
|
76
|
+
const ComboboxInputValueType = {
|
|
77
|
+
Single: 'single',
|
|
78
|
+
Array: 'array',
|
|
79
|
+
};
|
|
80
|
+
const getObjectProperty = (obj, prop) => {
|
|
81
|
+
const hasDotNotation = prop.includes('.');
|
|
82
|
+
if (!hasDotNotation)
|
|
83
|
+
return obj[prop];
|
|
84
|
+
const props = prop.split('.');
|
|
85
|
+
let value = obj;
|
|
86
|
+
for (const prop of props) {
|
|
87
|
+
if (!isObject(value))
|
|
88
|
+
return undefined;
|
|
89
|
+
value = value[prop];
|
|
90
|
+
}
|
|
91
|
+
return value;
|
|
92
|
+
};
|
|
93
|
+
export const COMBOBOX_TOKEN = new InjectionToken('ET_COMBOBOX_TOKEN');
|
|
94
|
+
class ComboboxComponent extends DecoratedInputBase {
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region Inputs
|
|
97
|
+
get options() {
|
|
98
|
+
return this._options$.value;
|
|
99
|
+
}
|
|
100
|
+
set options(value) {
|
|
101
|
+
this._options$.next(value);
|
|
102
|
+
}
|
|
103
|
+
get initialValue() {
|
|
104
|
+
return this._initialValue$.value;
|
|
105
|
+
}
|
|
106
|
+
set initialValue(value) {
|
|
107
|
+
this._initialValue$.next(value);
|
|
108
|
+
this._updateSelectedOptionsViaInitialValue();
|
|
109
|
+
}
|
|
110
|
+
get loading() {
|
|
111
|
+
return this._loading$.value;
|
|
112
|
+
}
|
|
113
|
+
set loading(value) {
|
|
114
|
+
this._loading$.next(coerceBooleanProperty(value));
|
|
115
|
+
}
|
|
116
|
+
get error() {
|
|
117
|
+
return this._error$.value;
|
|
118
|
+
}
|
|
119
|
+
set error(value) {
|
|
120
|
+
this._error$.next(value);
|
|
121
|
+
}
|
|
122
|
+
get placeholder() {
|
|
123
|
+
return this._placeholder$.value;
|
|
124
|
+
}
|
|
125
|
+
set placeholder(value) {
|
|
126
|
+
this._placeholder$.next(value);
|
|
127
|
+
}
|
|
128
|
+
get multiple() {
|
|
129
|
+
return this._multiple$.value;
|
|
130
|
+
}
|
|
131
|
+
set multiple(value) {
|
|
132
|
+
this._multiple$.next(coerceBooleanProperty(value));
|
|
133
|
+
}
|
|
134
|
+
get bindLabel() {
|
|
135
|
+
return this._bindLabel$.value;
|
|
136
|
+
}
|
|
137
|
+
set bindLabel(value) {
|
|
138
|
+
this._bindLabel$.next(value);
|
|
139
|
+
}
|
|
140
|
+
get bindValue() {
|
|
141
|
+
return this._bindValue$.value;
|
|
142
|
+
}
|
|
143
|
+
set bindValue(value) {
|
|
144
|
+
this._bindValue$.next(value);
|
|
145
|
+
}
|
|
146
|
+
get allowCustomValues() {
|
|
147
|
+
return this._allowCustomValues$.value;
|
|
148
|
+
}
|
|
149
|
+
set allowCustomValues(value) {
|
|
150
|
+
this._allowCustomValues$.next(coerceBooleanProperty(value));
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region Members
|
|
154
|
+
get _rawSelectedOptions() {
|
|
155
|
+
return this._rawSelectedOptions$.value;
|
|
156
|
+
}
|
|
157
|
+
get _currentFilter() {
|
|
158
|
+
return this._currentFilter$.value;
|
|
159
|
+
}
|
|
160
|
+
get _isOpen() {
|
|
161
|
+
return this._animatedOverlay.isMounted;
|
|
162
|
+
}
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region Lifecycle
|
|
165
|
+
constructor() {
|
|
166
|
+
super();
|
|
167
|
+
//#region Injects
|
|
168
|
+
this._input = inject(INPUT_TOKEN);
|
|
169
|
+
this._animatedOverlay = inject(AnimatedOverlayDirective);
|
|
170
|
+
this._options$ = new BehaviorSubject([]);
|
|
171
|
+
this.options$ = this._options$.asObservable();
|
|
172
|
+
this._initialValue$ = new BehaviorSubject(null);
|
|
173
|
+
this._loading$ = new BehaviorSubject(false);
|
|
174
|
+
this.loading$ = this._loading$.asObservable();
|
|
175
|
+
this._error$ = new BehaviorSubject(null);
|
|
176
|
+
this._placeholder$ = new BehaviorSubject(null);
|
|
177
|
+
this._multiple$ = new BehaviorSubject(false);
|
|
178
|
+
this._bindLabel$ = new BehaviorSubject(null);
|
|
179
|
+
this._bindValue$ = new BehaviorSubject(null);
|
|
180
|
+
this._allowCustomValues$ = new BehaviorSubject(false);
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region Outputs
|
|
183
|
+
this.filterChange = new EventEmitter();
|
|
184
|
+
this._rawSelectedOptions$ = new BehaviorSubject([]);
|
|
185
|
+
this._currentFilter$ = new BehaviorSubject('');
|
|
186
|
+
this._isOpen$ = this._animatedOverlay.isMounted$;
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region Computes
|
|
189
|
+
this._allOptions$ = combineLatest([this._options$, this._rawSelectedOptions$]).pipe(map(([options, rawSelectedOptions]) => [...options, ...rawSelectedOptions]), shareReplay({ bufferSize: 1, refCount: true }));
|
|
190
|
+
this.expectedOptionType$ = combineLatest([
|
|
191
|
+
this._bindLabel$,
|
|
192
|
+
this._bindValue$,
|
|
193
|
+
this._allowCustomValues$,
|
|
194
|
+
]).pipe(map(([bindLabel, bindValue, allowCustomValues]) => {
|
|
195
|
+
const shouldBeObjects = bindLabel && bindValue && !allowCustomValues;
|
|
196
|
+
if (shouldBeObjects) {
|
|
197
|
+
return ComboboxOptionType.Object;
|
|
198
|
+
}
|
|
199
|
+
return ComboboxOptionType.Primitive;
|
|
200
|
+
}));
|
|
201
|
+
this.expectedInputValueType$ = this._multiple$.pipe(map((multiple) => (multiple ? ComboboxInputValueType.Array : ComboboxInputValueType.Single)));
|
|
202
|
+
this.selectedOptions$ = combineLatest([
|
|
203
|
+
this._input.value$,
|
|
204
|
+
this.expectedInputValueType$,
|
|
205
|
+
this._allOptions$,
|
|
206
|
+
]).pipe(map(([inputValue, expectedInputValueType, allOptions]) => {
|
|
207
|
+
if (expectedInputValueType === ComboboxInputValueType.Single) {
|
|
208
|
+
if (Array.isArray(inputValue)) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const option = this._findOptionByValue(inputValue, allOptions);
|
|
212
|
+
return [option];
|
|
213
|
+
}
|
|
214
|
+
else if (expectedInputValueType === ComboboxInputValueType.Array) {
|
|
215
|
+
if (!Array.isArray(inputValue)) {
|
|
216
|
+
return [];
|
|
217
|
+
}
|
|
218
|
+
const options = inputValue.map((value) => this._findOptionByValue(value, allOptions)).filter((v) => !!v);
|
|
219
|
+
if (!options.length)
|
|
220
|
+
return [];
|
|
221
|
+
return options;
|
|
222
|
+
}
|
|
223
|
+
return [];
|
|
224
|
+
}), map((options) => options.filter((v) => !!v)));
|
|
225
|
+
this._bindings.push({
|
|
226
|
+
attribute: 'class.et-combobox--loading',
|
|
227
|
+
observable: this._loading$,
|
|
228
|
+
});
|
|
229
|
+
this._bindings.push({
|
|
230
|
+
attribute: 'class.et-combobox--error',
|
|
231
|
+
observable: this._error$.pipe(map((v) => !!v)),
|
|
232
|
+
});
|
|
233
|
+
this._bindings.push({
|
|
234
|
+
attribute: 'class.et-combobox--open',
|
|
235
|
+
observable: this._isOpen$,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
ngOnInit() {
|
|
239
|
+
this._initDispatchFilterChanges();
|
|
240
|
+
this._initRepositionOnValueChanges();
|
|
241
|
+
if (isDevMode()) {
|
|
242
|
+
this._debugValidateComboboxConfig();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region Public Methods
|
|
247
|
+
getOptionLabel(option) {
|
|
248
|
+
if (!this.bindLabel || !isObject(option)) {
|
|
249
|
+
return of(option);
|
|
250
|
+
}
|
|
251
|
+
return this._bindLabel$.pipe(map((label) => {
|
|
252
|
+
if (!label)
|
|
253
|
+
return option;
|
|
254
|
+
return getObjectProperty(option, label) ?? option;
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
getOptionValue(option) {
|
|
258
|
+
if (!this.bindValue || !isObject(option)) {
|
|
259
|
+
return of(option);
|
|
260
|
+
}
|
|
261
|
+
return this._bindValue$.pipe(map((value) => {
|
|
262
|
+
if (!value)
|
|
263
|
+
return option;
|
|
264
|
+
return getObjectProperty(option, value) ?? option;
|
|
265
|
+
}));
|
|
266
|
+
}
|
|
267
|
+
removeSelectedOption(option) {
|
|
268
|
+
this.input._markAsTouched();
|
|
269
|
+
const selectedOptions = this._rawSelectedOptions;
|
|
270
|
+
const optionValue = this._getOptionValueSync(option);
|
|
271
|
+
const index = selectedOptions.findIndex((v) => {
|
|
272
|
+
const val = this._getOptionValueSync(v);
|
|
273
|
+
return val === optionValue;
|
|
274
|
+
});
|
|
275
|
+
if (index === -1)
|
|
276
|
+
return;
|
|
277
|
+
selectedOptions.splice(index, 1);
|
|
278
|
+
this._rawSelectedOptions$.next(selectedOptions);
|
|
279
|
+
this._removeOrClearInputValue(optionValue);
|
|
280
|
+
}
|
|
281
|
+
open() {
|
|
282
|
+
// if (!this._selectBodyConfig) return;
|
|
283
|
+
if (this._isOpen || this.input.disabled)
|
|
284
|
+
return;
|
|
285
|
+
// this._setSelectedOptionActive();
|
|
286
|
+
const instance = this._animatedOverlay.mount({
|
|
287
|
+
component: ComboboxBodyComponent,
|
|
288
|
+
mirrorWidth: true,
|
|
289
|
+
// data: { _bodyTemplate: this._selectBodyConfig.template },
|
|
290
|
+
});
|
|
291
|
+
if (!instance)
|
|
292
|
+
return;
|
|
293
|
+
// this._selectBodyId$.next(instance.selectBody.id);
|
|
294
|
+
}
|
|
295
|
+
close() {
|
|
296
|
+
if (!this._isOpen)
|
|
297
|
+
return;
|
|
298
|
+
this._animatedOverlay.unmount();
|
|
299
|
+
// this._selectBodyId$.next(null);
|
|
300
|
+
}
|
|
301
|
+
writeValueFromOption(option) {
|
|
302
|
+
this.input._markAsTouched();
|
|
303
|
+
const optionValue = this._getOptionValueSync(option);
|
|
304
|
+
if (this._findOptionByValue(optionValue, this._rawSelectedOptions)) {
|
|
305
|
+
if (this.multiple) {
|
|
306
|
+
this.removeSelectedOption(option);
|
|
307
|
+
this._removeOrClearInputValue(optionValue);
|
|
308
|
+
}
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
this._setOrAddToInputValue(optionValue);
|
|
312
|
+
this._addSelectedOption(option);
|
|
313
|
+
if (!this.multiple) {
|
|
314
|
+
this.close();
|
|
315
|
+
this._setFilterFromInputValue();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
isOptionSelected(option) {
|
|
319
|
+
return combineLatest([this._rawSelectedOptions$, this.getOptionValue(option)]).pipe(map(([selectedOptions, value]) => !!this._findOptionByValue(value, selectedOptions)));
|
|
320
|
+
}
|
|
321
|
+
//#endregion
|
|
322
|
+
//#region Protected Methods
|
|
323
|
+
processKeydownEvent(event) {
|
|
324
|
+
const keyCode = event.keyCode;
|
|
325
|
+
const isOpen = this._isOpen;
|
|
326
|
+
const isMultiple = this.multiple;
|
|
327
|
+
const canAddCustomValue = this.allowCustomValues;
|
|
328
|
+
const value = event.target.value;
|
|
329
|
+
const hasValue = !!value;
|
|
330
|
+
// The user typed a custom value and pressed enter. Add it to the selected options.
|
|
331
|
+
if (keyCode === ENTER && canAddCustomValue && hasValue) {
|
|
332
|
+
// Don't add the value if it already exists.
|
|
333
|
+
if (!this._findOptionByValue(value, this._rawSelectedOptions)) {
|
|
334
|
+
this._addSelectedOption(value);
|
|
335
|
+
this._setOrAddToInputValue(value);
|
|
336
|
+
}
|
|
337
|
+
if (this.multiple) {
|
|
338
|
+
this._updateFilter('');
|
|
339
|
+
}
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (keyCode === ESCAPE) {
|
|
343
|
+
if (isOpen) {
|
|
344
|
+
this.close();
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
if (!isMultiple) {
|
|
348
|
+
this._removeOrClearInputValue(null);
|
|
349
|
+
this._updateFilter('');
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
if (keyCode === TAB) {
|
|
355
|
+
this.close();
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (!isOpen) {
|
|
359
|
+
this.open();
|
|
360
|
+
}
|
|
361
|
+
if (keyCode === DOWN_ARROW) {
|
|
362
|
+
// TODO: Implement
|
|
363
|
+
}
|
|
364
|
+
if (keyCode === UP_ARROW) {
|
|
365
|
+
// TODO: Implement
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
processInputEvent(event) {
|
|
369
|
+
const value = event.target.value;
|
|
370
|
+
this._updateFilter(value);
|
|
371
|
+
}
|
|
372
|
+
handleBlurEvent() {
|
|
373
|
+
this.input._markAsTouched();
|
|
374
|
+
this.input._setShouldDisplayError(true);
|
|
375
|
+
if (this.multiple)
|
|
376
|
+
return;
|
|
377
|
+
if (this._currentFilter === '') {
|
|
378
|
+
this._removeOrClearInputValue(null);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
this._setFilterFromInputValue();
|
|
382
|
+
}
|
|
383
|
+
//#endregion
|
|
384
|
+
//#region Private Methods
|
|
385
|
+
_initDispatchFilterChanges() {
|
|
386
|
+
this._currentFilter$
|
|
387
|
+
.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this._destroy$), tap((v) => this.filterChange.emit(v)))
|
|
388
|
+
.subscribe();
|
|
389
|
+
}
|
|
390
|
+
_initRepositionOnValueChanges() {
|
|
391
|
+
this.input.valueChange$
|
|
392
|
+
.pipe(takeUntil(this._destroy$), debounceTime(0), tap(() => this._animatedOverlay._reposition()))
|
|
393
|
+
.subscribe();
|
|
394
|
+
}
|
|
395
|
+
_updateSelectedOptionsViaInitialValue() {
|
|
396
|
+
if (this.initialValue !== null && this.initialValue !== undefined) {
|
|
397
|
+
if (Array.isArray(this.initialValue)) {
|
|
398
|
+
this._addSelectedOptions(this.initialValue);
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
this._addSelectedOption(this.initialValue);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
_addSelectedOption(option) {
|
|
406
|
+
if (this.multiple) {
|
|
407
|
+
this._rawSelectedOptions$.next([...this._rawSelectedOptions, option]);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
this._rawSelectedOptions$.next([option]);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
_addSelectedOptions(options) {
|
|
414
|
+
if (!this.multiple) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
this._rawSelectedOptions$.next([...this._rawSelectedOptions, ...options]);
|
|
418
|
+
}
|
|
419
|
+
_findOptionByValue(value, allOptions) {
|
|
420
|
+
const option = allOptions.find((option) => {
|
|
421
|
+
if (isObject(option) && this.bindValue) {
|
|
422
|
+
return getObjectProperty(option, this.bindValue) === value;
|
|
423
|
+
}
|
|
424
|
+
return option === value;
|
|
425
|
+
});
|
|
426
|
+
return option;
|
|
427
|
+
}
|
|
428
|
+
_setOrAddToInputValue(value) {
|
|
429
|
+
if (this.multiple) {
|
|
430
|
+
if (Array.isArray(this._input.value)) {
|
|
431
|
+
this._input._updateValue([...this._input.value, value]);
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
this._input._updateValue([value]);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
this._input._updateValue(value);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
_removeOrClearInputValue(value) {
|
|
442
|
+
if (this.multiple) {
|
|
443
|
+
if (Array.isArray(this._input.value)) {
|
|
444
|
+
this._input._updateValue(this._input.value.filter((v) => v !== value));
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
this._input._updateValue([]);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
this._input._updateValue(null);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
_updateFilter(value) {
|
|
455
|
+
if (this.input.nativeInputRef && this.input.nativeInputRef.element.nativeElement.value !== value) {
|
|
456
|
+
this.input.nativeInputRef.element.nativeElement.value = value;
|
|
457
|
+
}
|
|
458
|
+
if (this._currentFilter === value)
|
|
459
|
+
return;
|
|
460
|
+
this._currentFilter$.next(value);
|
|
461
|
+
}
|
|
462
|
+
_getOptionValueSync(option) {
|
|
463
|
+
if (!this.bindValue || !isObject(option)) {
|
|
464
|
+
return option;
|
|
465
|
+
}
|
|
466
|
+
return getObjectProperty(option, this.bindValue) ?? option;
|
|
467
|
+
}
|
|
468
|
+
_getOptionLabelSync(option) {
|
|
469
|
+
if (!this.bindLabel || !isObject(option)) {
|
|
470
|
+
return option;
|
|
471
|
+
}
|
|
472
|
+
return getObjectProperty(option, this.bindLabel) ?? option;
|
|
473
|
+
}
|
|
474
|
+
_setFilterFromInputValue() {
|
|
475
|
+
if (this.multiple)
|
|
476
|
+
return;
|
|
477
|
+
const value = this.input.value;
|
|
478
|
+
if (!value || Array.isArray(value)) {
|
|
479
|
+
this._updateFilter('');
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const option = this._findOptionByValue(value, this._rawSelectedOptions);
|
|
483
|
+
if (!option)
|
|
484
|
+
return;
|
|
485
|
+
const label = this._getOptionLabelSync(option);
|
|
486
|
+
if (typeof label !== 'string')
|
|
487
|
+
return;
|
|
488
|
+
this._updateFilter(label);
|
|
489
|
+
}
|
|
490
|
+
//#endregion
|
|
491
|
+
//#region Dev mode
|
|
492
|
+
_debugValidateComboboxConfig(isRetry = false) {
|
|
493
|
+
this.expectedOptionType$
|
|
494
|
+
.pipe(skip(isRetry ? 1 : 0), // Skip if retrying to avoid infinite loop
|
|
495
|
+
debounceTime(0), takeUntil(this._destroy$), tap((expectedOptionType) => {
|
|
496
|
+
if (isEmptyArray(this.options)) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
if (expectedOptionType === ComboboxOptionType.Object) {
|
|
500
|
+
if (!isObjectArray(this.options)) {
|
|
501
|
+
throw comboboxError(1, this.options);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else if (expectedOptionType === ComboboxOptionType.Primitive) {
|
|
505
|
+
if (!isPrimitiveArray(this.options)) {
|
|
506
|
+
throw comboboxError(2, this.options);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}), catchError((e) => {
|
|
510
|
+
this._debugValidateComboboxConfig(true);
|
|
511
|
+
return throwError(() => e);
|
|
512
|
+
}))
|
|
513
|
+
.subscribe();
|
|
514
|
+
}
|
|
515
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
516
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", inputs: { options: "options", initialValue: "initialValue", loading: "loading", error: "error", placeholder: "placeholder", multiple: "multiple", bindLabel: "bindLabel", bindValue: "bindValue", allowCustomValues: "allowCustomValues" }, outputs: { filterChange: "filterChange" }, host: { classAttribute: "et-combobox" }, providers: [
|
|
517
|
+
{
|
|
518
|
+
provide: COMBOBOX_TOKEN,
|
|
519
|
+
useExisting: ComboboxComponent,
|
|
520
|
+
},
|
|
521
|
+
], usesInheritance: true, hostDirectives: [{ directive: i1.InputDirective }, { directive: i2.AnimatedOverlayDirective }], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
522
|
+
}
|
|
523
|
+
export { ComboboxComponent };
|
|
524
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
525
|
+
type: Component,
|
|
526
|
+
args: [{ selector: 'et-combobox', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
527
|
+
class: 'et-combobox',
|
|
528
|
+
}, imports: [NgIf, NativeInputRefDirective, AsyncPipe, ChevronIconComponent, LetDirective, NgFor], hostDirectives: [{ directive: InputDirective }, AnimatedOverlayDirective], providers: [
|
|
529
|
+
{
|
|
530
|
+
provide: COMBOBOX_TOKEN,
|
|
531
|
+
useExisting: ComboboxComponent,
|
|
532
|
+
},
|
|
533
|
+
], template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
|
|
534
|
+
}], ctorParameters: function () { return []; }, propDecorators: { options: [{
|
|
535
|
+
type: Input,
|
|
536
|
+
args: [{ required: true }]
|
|
537
|
+
}], initialValue: [{
|
|
538
|
+
type: Input
|
|
539
|
+
}], loading: [{
|
|
540
|
+
type: Input
|
|
541
|
+
}], error: [{
|
|
542
|
+
type: Input
|
|
543
|
+
}], placeholder: [{
|
|
544
|
+
type: Input
|
|
545
|
+
}], multiple: [{
|
|
546
|
+
type: Input
|
|
547
|
+
}], bindLabel: [{
|
|
548
|
+
type: Input
|
|
549
|
+
}], bindValue: [{
|
|
550
|
+
type: Input
|
|
551
|
+
}], allowCustomValues: [{
|
|
552
|
+
type: Input
|
|
553
|
+
}], filterChange: [{
|
|
554
|
+
type: Output
|
|
555
|
+
}] } });
|
|
556
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxJQUFJLEVBQ0osU0FB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LDBYQVBqQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixXQUFXLEVBQUUsaUJBQWlCO2FBQy9CO1NBQ0YsaUpDeEpILHE3QkE2QkEsMDFDRG9IWSxJQUFJLDZGQUFFLHVCQUF1QiwrSUFBRSxTQUFTLDhDQUFFLG9CQUFvQiw0REFBZ0IsS0FBSzs7U0FTbEYsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBbkI3QixTQUFTOytCQUNFLGFBQWEsY0FHWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osS0FBSyxFQUFFLGFBQWE7cUJBQ3JCLFdBQ1EsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQzlFLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEVBQUUsd0JBQXdCLENBQUMsYUFDOUQ7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLFdBQVcsbUJBQW1CO3lCQUMvQjtxQkFDRjswRUFhRyxPQUFPO3NCQURWLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVdyQixZQUFZO3NCQURmLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQVdGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBVUYsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFNBQVM7c0JBRFosS0FBSztnQkFVRixTQUFTO3NCQURaLEtBQUs7Z0JBVUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNhLFlBQVk7c0JBRDlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBUQUIsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlLCBMZXREaXJlY3RpdmUsIGNsb25lIH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgb2YsXG4gIHNoYXJlUmVwbGF5LFxuICBza2lwLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uLy4uL2ljb25zJztcbmltcG9ydCB7IElOUFVUX1RPS0VOLCBJbnB1dERpcmVjdGl2ZSwgTmF0aXZlSW5wdXRSZWZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IERlY29yYXRlZElucHV0QmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbWJvYm94Qm9keUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhcnRpYWxzJztcblxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvcjxUIGV4dGVuZHMgbnVtYmVyPiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvZGU6IFQsIG1lc3NhZ2U6IG51bGwgfCBmYWxzZSB8IHN0cmluZywgcHVibGljIGRhdGE6IHVua25vd24gPSAnX19FVF9OT19EQVRBX18nKSB7XG4gICAgc3VwZXIoZm9ybWF0UnVudGltZUVycm9yPFQ+KGNvZGUsIG1lc3NhZ2UpKTtcblxuICAgIGlmIChkYXRhICE9PSAnX19FVF9OT19EQVRBX18nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBfZGF0YSA9IGNsb25lKGRhdGEpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoX2RhdGEpO1xuICAgICAgICB9LCAxKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGRhdGEpO1xuICAgICAgICB9LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJ1bnRpbWVFcnJvcjxUIGV4dGVuZHMgbnVtYmVyPihjb2RlOiBULCBtZXNzYWdlOiBudWxsIHwgZmFsc2UgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBwcmVmaXggY29kZSB3aXRoIHplcm9zIGlmIGl0J3MgbGVzcyB0aGFuIDEwMFxuICBjb25zdCBjb2RlV2l0aFplcm9zID0gY29kZSA8IDEwID8gYDAwJHtjb2RlfWAgOiBjb2RlIDwgMTAwID8gYDAke2NvZGV9YCA6IGNvZGU7XG5cbiAgY29uc3QgZnVsbENvZGUgPSBgRVQke2NvZGVXaXRoWmVyb3N9YDtcblxuICByZXR1cm4gYCR7ZnVsbENvZGV9JHttZXNzYWdlID8gJzogJyArIG1lc3NhZ2UgOiAnJ31gO1xufVxuXG5jb25zdCBDT01CT0JPWF9FUlJPUlMgPSB7XG4gIDE6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgYmVpbmcgc2V0LicsXG4gIDI6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgbm90IGJlaW5nIHNldCBvciBcImFsbG93Q3VzdG9tVmFsdWVzXCIgYmVpbmcgc2V0IHRvIHRydWUuJyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNvbWJvYm94RXJyb3IgPSAoY29kZToga2V5b2YgdHlwZW9mIENPTUJPQk9YX0VSUk9SUywgZGF0YTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gYDxldC1jb21ib2JveD46ICR7Q09NQk9CT1hfRVJST1JTW2NvZGVdfWA7XG5cbiAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihjb2RlLCBtZXNzYWdlLCBkYXRhKTtcbn07XG5cbmNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdCA9IHZhbHVlWzBdO1xuICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKCFmaXJzdCB8fCAhbGFzdCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0eXBlb2YgZmlyc3QgIT09ICdvYmplY3QnICYmIHR5cGVvZiBsYXN0ICE9PSAnb2JqZWN0Jztcbn07XG5cbmNvbnN0IGlzT2JqZWN0QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xuXG4gIGlmICghZmlyc3QgfHwgIWxhc3QpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCc7XG59O1xuXG5jb25zdCBpc0VtcHR5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBbXSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG59O1xuXG5jb25zdCBpc09iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59O1xuXG5jb25zdCBDb21ib2JveE9wdGlvblR5cGUgPSB7XG4gIFByaW1pdGl2ZTogJ3ByaW1pdGl2ZScsXG4gIE9iamVjdDogJ29iamVjdCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBDb21ib2JveElucHV0VmFsdWVUeXBlID0ge1xuICBTaW5nbGU6ICdzaW5nbGUnLFxuICBBcnJheTogJ2FycmF5Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGdldE9iamVjdFByb3BlcnR5ID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHByb3A6IHN0cmluZykgPT4ge1xuICBjb25zdCBoYXNEb3ROb3RhdGlvbiA9IHByb3AuaW5jbHVkZXMoJy4nKTtcblxuICBpZiAoIWhhc0RvdE5vdGF0aW9uKSByZXR1cm4gb2JqW3Byb3BdO1xuXG4gIGNvbnN0IHByb3BzID0gcHJvcC5zcGxpdCgnLicpO1xuXG4gIGxldCB2YWx1ZTogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHZhbHVlID0gdmFsdWVbcHJvcF07XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgQ09NQk9CT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tYm9ib3hDb21wb25lbnQ+KCdFVF9DT01CT0JPWF9UT0tFTicpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbWJvYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1jb21ib2JveCcsXG4gIH0sXG4gIGltcG9ydHM6IFtOZ0lmLCBOYXRpdmVJbnB1dFJlZkRpcmVjdGl2ZSwgQXN5bmNQaXBlLCBDaGV2cm9uSWNvbkNvbXBvbmVudCwgTGV0RGlyZWN0aXZlLCBOZ0Zvcl0sXG4gIGhvc3REaXJlY3RpdmVzOiBbeyBkaXJlY3RpdmU6IElucHV0RGlyZWN0aXZlIH0sIEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENPTUJPQk9YX1RPS0VOLFxuICAgICAgdXNlRXhpc3Rpbmc6IENvbWJvYm94Q29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGV4dGVuZHMgRGVjb3JhdGVkSW5wdXRCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8jcmVnaW9uIEluamVjdHNcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dCA9IGluamVjdChJTlBVVF9UT0tFTik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FuaW1hdGVkT3ZlcmxheSA9IGluamVjdDxBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmU8Q29tYm9ib3hCb2R5Q29tcG9uZW50Pj4oQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlKTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5wdXRzXG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMkLnZhbHVlO1xuICB9XG4gIHNldCBvcHRpb25zKHZhbHVlOiB1bmtub3duW10pIHtcbiAgICB0aGlzLl9vcHRpb25zJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9vcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bltdPihbXSk7XG4gIHJlYWRvbmx5IG9wdGlvbnMkID0gdGhpcy5fb3B0aW9ucyQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGluaXRpYWxWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbFZhbHVlJC52YWx1ZTtcbiAgfVxuICBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5faW5pdGlhbFZhbHVlJC5uZXh0KHZhbHVlKTtcblxuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkT3B0aW9uc1ZpYUluaXRpYWxWYWx1ZSgpO1xuICB9XG4gIHByaXZhdGUgX2luaXRpYWxWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC52YWx1ZTtcbiAgfVxuICBzZXQgbG9hZGluZyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbG9hZGluZyQubmV4dChjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9sb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3IkLnZhbHVlO1xuICB9XG4gIHNldCBlcnJvcih2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX2Vycm9yJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXIkLnZhbHVlO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGUkLnZhbHVlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlwbGUkLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfbXVsdGlwbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGJpbmRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluZExhYmVsJC52YWx1ZTtcbiAgfVxuICBzZXQgYmluZExhYmVsKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fYmluZExhYmVsJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9iaW5kTGFiZWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoKVxuICBnZXQgYmluZFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9iaW5kVmFsdWUkLnZhbHVlO1xuICB9XG4gIHNldCBiaW5kVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9iaW5kVmFsdWUkLm5leHQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2JpbmRWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBhbGxvd0N1c3RvbVZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLnZhbHVlO1xuICB9XG4gIHNldCBhbGxvd0N1c3RvbVZhbHVlcyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWxsb3dDdXN0b21WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE91dHB1dHNcblxuICBAT3V0cHV0KClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNZW1iZXJzXG5cbiAgcHJpdmF0ZSBnZXQgX3Jhd1NlbGVjdGVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9yYXdTZWxlY3RlZE9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx1bmtub3duW10+KFtdKTtcblxuICBwcml2YXRlIGdldCBfY3VycmVudEZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlciQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudEZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHByaXZhdGUgZ2V0IF9pc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQ7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNPcGVuJCA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQkO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb21wdXRlc1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FsbE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fb3B0aW9ucyQsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyRdKS5waXBlKFxuICAgIG1hcCgoW29wdGlvbnMsIHJhd1NlbGVjdGVkT3B0aW9uc10pID0+IFsuLi5vcHRpb25zLCAuLi5yYXdTZWxlY3RlZE9wdGlvbnNdKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBleHBlY3RlZE9wdGlvblR5cGUkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fYmluZExhYmVsJCxcbiAgICB0aGlzLl9iaW5kVmFsdWUkLFxuICAgIHRoaXMuX2FsbG93Q3VzdG9tVmFsdWVzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5kTGFiZWwsIGJpbmRWYWx1ZSwgYWxsb3dDdXN0b21WYWx1ZXNdKSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRCZU9iamVjdHMgPSBiaW5kTGFiZWwgJiYgYmluZFZhbHVlICYmICFhbGxvd0N1c3RvbVZhbHVlcztcblxuICAgICAgaWYgKHNob3VsZEJlT2JqZWN0cykge1xuICAgICAgICByZXR1cm4gQ29tYm9ib3hPcHRpb25UeXBlLk9iamVjdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmU7XG4gICAgfSksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cGVjdGVkSW5wdXRWYWx1ZVR5cGUkID0gdGhpcy5fbXVsdGlwbGUkLnBpcGUoXG4gICAgbWFwKChtdWx0aXBsZSkgPT4gKG11bHRpcGxlID8gQ29tYm9ib3hJbnB1dFZhbHVlVHlwZS5BcnJheSA6IENvbWJvYm94SW5wdXRWYWx1ZVR5cGUuU2luZ2xlKSksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9pbnB1dC52YWx1ZSQsXG4gICAgdGhpcy5leHBlY3RlZElucHV0VmFsdWVUeXBlJCxcbiAgICB0aGlzLl9hbGxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dFZhbHVlLCBleHBlY3RlZElucHV0VmFsdWVUeXBlLCBhbGxPcHRpb25zXSkgPT4ge1xuICAgICAgaWYgKGV4cGVjdGVkSW5wdXRWYWx1ZVR5cGUgPT09IENvbWJvYm94SW5wdXRWYWx1ZVR5cGUuU2luZ2xlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUoaW5wdXRWYWx1ZSwgYWxsT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIFtvcHRpb25dO1xuICAgICAgfSBlbHNlIGlmIChleHBlY3RlZElucHV0VmFsdWVUeXBlID09PSBDb21ib2JveElucHV0VmFsdWVUeXBlLkFycmF5KSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnB1dFZhbHVlLm1hcCgodmFsdWUpID0+IHRoaXMuX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlLCBhbGxPcHRpb25zKSkuZmlsdGVyKCh2KSA9PiAhIXYpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pLFxuICAgIG1hcCgob3B0aW9ucykgPT4gb3B0aW9ucy5maWx0ZXIoKHYpID0+ICEhdikpLFxuICApO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYmluZGluZ3MucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC0tbG9hZGluZycsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9sb2FkaW5nJCxcbiAgICB9KTtcblxuICAgIHRoaXMuX2JpbmRpbmdzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtY29tYm9ib3gtLWVycm9yJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2Vycm9yJC5waXBlKG1hcCgodikgPT4gISF2KSksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LWNvbWJvYm94LS1vcGVuJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2lzT3BlbiQsXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0RGlzcGF0Y2hGaWx0ZXJDaGFuZ2VzKCk7XG4gICAgdGhpcy5faW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpO1xuXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aGlzLl9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICBnZXRPcHRpb25MYWJlbChvcHRpb246IHVua25vd24pIHtcbiAgICBpZiAoIXRoaXMuYmluZExhYmVsIHx8ICFpc09iamVjdChvcHRpb24pKSB7XG4gICAgICByZXR1cm4gb2Yob3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYmluZExhYmVsJC5waXBlKFxuICAgICAgbWFwKChsYWJlbCkgPT4ge1xuICAgICAgICBpZiAoIWxhYmVsKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIGxhYmVsKSA/PyBvcHRpb247XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKCF0aGlzLmJpbmRWYWx1ZSB8fCAhaXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9mKG9wdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2JpbmRWYWx1ZSQucGlwZShcbiAgICAgIG1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCB2YWx1ZSkgPz8gb3B0aW9uO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogdW5rbm93bikge1xuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuX2dldE9wdGlvblZhbHVlU3luYyhvcHRpb24pO1xuXG4gICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZE9wdGlvbnMuZmluZEluZGV4KCh2KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRPcHRpb25WYWx1ZVN5bmModik7XG5cbiAgICAgIHJldHVybiB2YWwgPT09IG9wdGlvblZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgc2VsZWN0ZWRPcHRpb25zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICB0aGlzLl9yYXdTZWxlY3RlZE9wdGlvbnMkLm5leHQoc2VsZWN0ZWRPcHRpb25zKTtcblxuICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG9wdGlvblZhbHVlKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgLy8gaWYgKCF0aGlzLl9zZWxlY3RCb2R5Q29uZmlnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5faXNPcGVuIHx8IHRoaXMuaW5wdXQuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIC8vIHRoaXMuX3NldFNlbGVjdGVkT3B0aW9uQWN0aXZlKCk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5tb3VudCh7XG4gICAgICBjb21wb25lbnQ6IENvbWJvYm94Qm9keUNvbXBvbmVudCxcbiAgICAgIG1pcnJvcldpZHRoOiB0cnVlLFxuICAgICAgLy8gZGF0YTogeyBfYm9keVRlbXBsYXRlOiB0aGlzLl9zZWxlY3RCb2R5Q29uZmlnLnRlbXBsYXRlIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyB0aGlzLl9zZWxlY3RCb2R5SWQkLm5leHQoaW5zdGFuY2Uuc2VsZWN0Qm9keS5pZCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LnVubW91bnQoKTtcblxuICAgIC8vIHRoaXMuX3NlbGVjdEJvZHlJZCQubmV4dChudWxsKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWVGcm9tT3B0aW9uKG9wdGlvbjogdW5rbm93bikge1xuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5fZ2V0T3B0aW9uVmFsdWVTeW5jKG9wdGlvbik7XG5cbiAgICBpZiAodGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUob3B0aW9uVmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucykpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlT3JDbGVhcklucHV0VmFsdWUob3B0aW9uVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0T3JBZGRUb0lucHV0VmFsdWUob3B0aW9uVmFsdWUpO1xuICAgIHRoaXMuX2FkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG5cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IHVua25vd24pIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJCwgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24pXSkucGlwZShcbiAgICAgIG1hcCgoW3NlbGVjdGVkT3B0aW9ucywgdmFsdWVdKSA9PiAhIXRoaXMuX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlLCBzZWxlY3RlZE9wdGlvbnMpKSxcbiAgICApO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NLZXlkb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICBjb25zdCBpc09wZW4gPSB0aGlzLl9pc09wZW47XG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG4gICAgY29uc3QgY2FuQWRkQ3VzdG9tVmFsdWUgPSB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBjb25zdCBoYXNWYWx1ZSA9ICEhdmFsdWU7XG5cbiAgICAvLyBUaGUgdXNlciB0eXBlZCBhIGN1c3RvbSB2YWx1ZSBhbmQgcHJlc3NlZCBlbnRlci4gQWRkIGl0IHRvIHRoZSBzZWxlY3RlZCBvcHRpb25zLlxuICAgIGlmIChrZXlDb2RlID09PSBFTlRFUiAmJiBjYW5BZGRDdXN0b21WYWx1ZSAmJiBoYXNWYWx1ZSkge1xuICAgICAgLy8gRG9uJ3QgYWRkIHRoZSB2YWx1ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgIGlmICghdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUodmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucykpIHtcbiAgICAgICAgdGhpcy5fYWRkU2VsZWN0ZWRPcHRpb24odmFsdWUpO1xuICAgICAgICB0aGlzLl9zZXRPckFkZFRvSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRVNDQVBFKSB7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaXNNdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFRBQikge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNPcGVuKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnRcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0lucHV0RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgdGhpcy5fdXBkYXRlRmlsdGVyKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVCbHVyRXZlbnQoKSB7XG4gICAgdGhpcy5pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuaW5wdXQuX3NldFNob3VsZERpc3BsYXlFcnJvcih0cnVlKTtcblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fY3VycmVudEZpbHRlciA9PT0gJycpIHtcbiAgICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJpdmF0ZSBNZXRob2RzXG5cbiAgcHJpdmF0ZSBfaW5pdERpc3BhdGNoRmlsdGVyQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHYpID0+IHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodikpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpIHtcbiAgICB0aGlzLmlucHV0LnZhbHVlQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5fcmVwb3NpdGlvbigpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGVjdGVkT3B0aW9uc1ZpYUluaXRpYWxWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUgIT09IG51bGwgJiYgdGhpcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbml0aWFsVmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2FkZFNlbGVjdGVkT3B0aW9ucyh0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZGRTZWxlY3RlZE9wdGlvbih0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyQubmV4dChbLi4udGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zLCBvcHRpb25dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC5uZXh0KFtvcHRpb25dKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hZGRTZWxlY3RlZE9wdGlvbnMob3B0aW9uczogdW5rbm93bltdKSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC5uZXh0KFsuLi50aGlzLl9yYXdTZWxlY3RlZE9wdGlvbnMsIC4uLm9wdGlvbnNdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlOiB1bmtub3duLCBhbGxPcHRpb25zOiB1bmtub3duW10pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhbGxPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbikgJiYgdGhpcy5iaW5kVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGdldE9iamVjdFByb3BlcnR5KG9wdGlvbiwgdGhpcy5iaW5kVmFsdWUpID09PSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbiA9PT0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3JBZGRUb0lucHV0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5faW5wdXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZShbLi4udGhpcy5faW5wdXQudmFsdWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUoW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlT3JDbGVhcklucHV0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5faW5wdXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh0aGlzLl9pbnB1dC52YWx1ZS5maWx0ZXIoKHYpID0+IHYgIT09IHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUoW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pbnB1dC5uYXRpdmVJbnB1dFJlZiAmJiB0aGlzLmlucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlSW5wdXRSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGaWx0ZXIgPT09IHZhbHVlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE9wdGlvblZhbHVlU3luYyhvcHRpb246IHVua25vd24pIHtcbiAgICBpZiAoIXRoaXMuYmluZFZhbHVlIHx8ICFpc09iamVjdChvcHRpb24pKSB7XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIHRoaXMuYmluZFZhbHVlKSA/PyBvcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRPcHRpb25MYWJlbFN5bmMob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKCF0aGlzLmJpbmRMYWJlbCB8fCAhaXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCB0aGlzLmJpbmRMYWJlbCkgPz8gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RmlsdGVyRnJvbUlucHV0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnB1dC52YWx1ZTtcblxuICAgIGlmICghdmFsdWUgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUodmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyk7XG5cbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9nZXRPcHRpb25MYWJlbFN5bmMob3B0aW9uKTtcblxuICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVGaWx0ZXIobGFiZWwpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIERldiBtb2RlXG5cbiAgcHJpdmF0ZSBfZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKGlzUmV0cnkgPSBmYWxzZSkge1xuICAgIHRoaXMuZXhwZWN0ZWRPcHRpb25UeXBlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHNraXAoaXNSZXRyeSA/IDEgOiAwKSwgLy8gU2tpcCBpZiByZXRyeWluZyB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKChleHBlY3RlZE9wdGlvblR5cGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNFbXB0eUFycmF5KHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRPcHRpb25UeXBlID09PSBDb21ib2JveE9wdGlvblR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0QXJyYXkodGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgICB0aHJvdyBjb21ib2JveEVycm9yKDEsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZE9wdGlvblR5cGUgPT09IENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGlmICghaXNQcmltaXRpdmVBcnJheSh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgIHRocm93IGNvbWJvYm94RXJyb3IoMiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKHRydWUpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0UHJlZml4XVwiIC8+XG5cbjxkaXYgY2xhc3M9XCJldC1jb21ib2JveC13cmFwcGVyXCI+XG4gIDx1bCAqbmdJZj1cIm11bHRpcGxlXCIgY2xhc3M9XCJldC1jb21ib2JveC1zZWxlY3RlZC1vcHRpb25zXCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkT3B0aW9ucyQgfCBhc3luY1wiIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uXCI+XG4gICAgICB7eyBnZXRPcHRpb25MYWJlbChpdGVtKSB8IGFzeW5jIH19XG4gICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRPcHRpb24oaXRlbSlcIiBjbGFzcz1cImV0LWNvbWJvYm94LXNlbGVjdGVkLW9wdGlvbi1yZW1vdmVcIiB0YWJpbmRleD1cIi0xXCI+IHggPC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGlucHV0XG4gICAgKGtleWRvd24pPVwicHJvY2Vzc0tleWRvd25FdmVudCgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwib3BlbigpXCJcbiAgICAoYmx1cik9XCJoYW5kbGVCbHVyRXZlbnQoKVwiXG4gICAgKGlucHV0KT1cInByb2Nlc3NJbnB1dEV2ZW50KCRldmVudClcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBldE5hdGl2ZUlucHV0UmVmXG4gIC8+XG5cbiAgPGV0LWNoZXZyb24taWNvbiBjbGFzcz1cImV0LWNvbWJvYm94LWNoZXZyb25cIiAvPlxuPC9kaXY+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0U3VmZml4XVwiIC8+XG5cbjxuZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|