ontimize-web-ngx 15.7.0 → 15.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/app-header/o-app-header.component.mjs +4 -4
- package/esm2020/lib/components/app-header/o-app-header.module.mjs +5 -5
- package/esm2020/lib/components/app-sidenav/image/o-app-sidenav-image.component.mjs +4 -4
- package/esm2020/lib/components/app-sidenav/menu-group/o-app-sidenav-menu-group.component.mjs +4 -4
- package/esm2020/lib/components/app-sidenav/menu-item/o-app-sidenav-menu-item.component.mjs +4 -4
- package/esm2020/lib/components/app-sidenav/o-app-sidenav.component.mjs +4 -4
- package/esm2020/lib/components/app-sidenav/o-app-sidenav.module.mjs +5 -5
- package/esm2020/lib/components/bar-menu/locale-menu-item/o-locale-bar-menu-item.component.mjs +4 -4
- package/esm2020/lib/components/bar-menu/menu-group/o-bar-menu-group.component.mjs +4 -4
- package/esm2020/lib/components/bar-menu/menu-item/o-bar-menu-item.component.mjs +4 -4
- package/esm2020/lib/components/bar-menu/menu-nested/o-bar-menu-nested.component.mjs +4 -4
- package/esm2020/lib/components/bar-menu/menu-separator/o-bar-menu-separator.component.mjs +4 -4
- package/esm2020/lib/components/bar-menu/o-bar-menu-base.class.mjs +4 -4
- package/esm2020/lib/components/bar-menu/o-bar-menu.component.mjs +4 -4
- package/esm2020/lib/components/bar-menu/o-bar-menu.module.mjs +5 -5
- package/esm2020/lib/components/bar-menu/o-base-menu-item.class.mjs +4 -4
- package/esm2020/lib/components/breadcrumb/o-breadcrumb.component.mjs +4 -4
- package/esm2020/lib/components/breadcrumb/o-breadcrumb.module.mjs +5 -5
- package/esm2020/lib/components/button/o-button.component.mjs +4 -4
- package/esm2020/lib/components/button/o-button.module.mjs +5 -5
- package/esm2020/lib/components/button-toggle/o-button-toggle-group/o-button-toggle-group.component.mjs +4 -4
- package/esm2020/lib/components/button-toggle/o-button-toggle.component.mjs +4 -4
- package/esm2020/lib/components/button-toggle/o-button-toggle.module.mjs +5 -5
- package/esm2020/lib/components/card-menu-item/o-card-menu-item.component.mjs +4 -4
- package/esm2020/lib/components/card-menu-item/o-card-menu-item.module.mjs +5 -5
- package/esm2020/lib/components/container/column/o-column.component.mjs +4 -4
- package/esm2020/lib/components/container/column/o-column.module.mjs +5 -5
- package/esm2020/lib/components/container/column-collapsible/o-column-collapsible.component.mjs +4 -4
- package/esm2020/lib/components/container/column-collapsible/o-column-collapsible.module.mjs +5 -5
- package/esm2020/lib/components/container/o-container-collapsible-component.class.mjs +4 -4
- package/esm2020/lib/components/container/o-container-component.class.mjs +4 -4
- package/esm2020/lib/components/container/row/o-row.component.mjs +4 -4
- package/esm2020/lib/components/container/row/o-row.module.mjs +5 -5
- package/esm2020/lib/components/container/row-collapsible/o-row-collapsible.component.mjs +4 -4
- package/esm2020/lib/components/container/row-collapsible/o-row-collapsible.module.mjs +5 -5
- package/esm2020/lib/components/contextmenu/context-menu/o-context-menu-content.component.mjs +4 -4
- package/esm2020/lib/components/contextmenu/context-menu/o-wrapper-content-menu/o-wrapper-content-menu.component.mjs +4 -4
- package/esm2020/lib/components/contextmenu/context-menu-group/o-context-menu-group.component.mjs +4 -4
- package/esm2020/lib/components/contextmenu/context-menu-item/o-context-menu-item.component.mjs +4 -4
- package/esm2020/lib/components/contextmenu/context-menu-separator/o-context-menu-separator.component.mjs +4 -4
- package/esm2020/lib/components/contextmenu/o-content-menu-base-item.class.mjs +4 -4
- package/esm2020/lib/components/contextmenu/o-context-menu-overlay.service.mjs +4 -4
- package/esm2020/lib/components/contextmenu/o-context-menu.component.mjs +4 -4
- package/esm2020/lib/components/contextmenu/o-context-menu.directive.mjs +4 -4
- package/esm2020/lib/components/contextmenu/o-context-menu.module.mjs +5 -5
- package/esm2020/lib/components/contextmenu/o-context-menu.service.mjs +4 -4
- package/esm2020/lib/components/dual-list-selector/dual-list-selector-item/date/o-dual-list-selector-date-item.component.mjs +4 -4
- package/esm2020/lib/components/dual-list-selector/o-dual-list-selector.component.mjs +4 -4
- package/esm2020/lib/components/dual-list-selector/o-dual-list-selector.module.mjs +5 -5
- package/esm2020/lib/components/expandable-container/o-expandable-container.component.mjs +4 -4
- package/esm2020/lib/components/expandable-container/o-expandable-container.module.mjs +5 -5
- package/esm2020/lib/components/filter-builder/filter-builder-menu/filter-builder-menu.component.mjs +4 -4
- package/esm2020/lib/components/filter-builder/o-filter-builder-clear.directive.mjs +4 -4
- package/esm2020/lib/components/filter-builder/o-filter-builder-query.directive.mjs +4 -4
- package/esm2020/lib/components/filter-builder/o-filter-builder.component.mjs +4 -4
- package/esm2020/lib/components/filter-builder/o-filter-builder.module.mjs +5 -5
- package/esm2020/lib/components/form/guards/o-form-can-deactivate.guard.mjs +4 -4
- package/esm2020/lib/components/form/navigation/o-form-confirm-exit.service.mjs +4 -4
- package/esm2020/lib/components/form/navigation/o-form-navigation.component.mjs +4 -4
- package/esm2020/lib/components/form/o-form.component.mjs +4 -4
- package/esm2020/lib/components/form/o-form.module.mjs +5 -5
- package/esm2020/lib/components/form/services/o-form-message.service.mjs +4 -4
- package/esm2020/lib/components/form/toolbar/o-form-toolbar.component.mjs +4 -4
- package/esm2020/lib/components/form/toolbar/o-form-toolbar.module.mjs +5 -5
- package/esm2020/lib/components/form-container/o-form-container.component.mjs +4 -4
- package/esm2020/lib/components/form-container/o-form-container.module.mjs +5 -5
- package/esm2020/lib/components/grid/grid-item/o-grid-item.component.mjs +4 -4
- package/esm2020/lib/components/grid/grid-item/o-grid-item.directive.mjs +4 -4
- package/esm2020/lib/components/grid/o-grid.component.mjs +4 -4
- package/esm2020/lib/components/grid/o-grid.module.mjs +5 -5
- package/esm2020/lib/components/grid/skeketon/o-grid-skeleton.component.mjs +4 -4
- package/esm2020/lib/components/image/fullscreen/fullscreen-dialog.component.mjs +4 -4
- package/esm2020/lib/components/image/o-image.component.mjs +4 -4
- package/esm2020/lib/components/image/o-image.module.mjs +5 -5
- package/esm2020/lib/components/input/checkbox/o-checkbox.component.mjs +4 -4
- package/esm2020/lib/components/input/checkbox/o-checkbox.module.mjs +5 -5
- package/esm2020/lib/components/input/combo/combo-renderer/boolean/o-combo-renderer-boolean.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/currency/o-combo-renderer-currency.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/date/o-combo-renderer-date.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/icon/o-combo-renderer-icon.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/integer/o-combo-renderer-integer.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/o-combo-renderer.class.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/percentage/o-combo-renderer-percentage.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-renderer/real/o-combo-renderer-real.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/combo-search/o-combo-search.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/o-combo.component.mjs +4 -4
- package/esm2020/lib/components/input/combo/o-combo.module.mjs +5 -5
- package/esm2020/lib/components/input/currency-input/o-currency-input.component.mjs +4 -4
- package/esm2020/lib/components/input/currency-input/o-currency-input.module.mjs +5 -5
- package/esm2020/lib/components/input/date-input/o-date-input.component.mjs +4 -4
- package/esm2020/lib/components/input/date-input/o-date-input.module.mjs +5 -5
- package/esm2020/lib/components/input/date-range/o-daterange-input.component.mjs +4 -4
- package/esm2020/lib/components/input/date-range/o-daterange-input.module.mjs +5 -5
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.component.mjs +4 -4
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.directive.mjs +4 -4
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.module.mjs +5 -5
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +4 -4
- package/esm2020/lib/components/input/email-input/o-email-input.component.mjs +4 -4
- package/esm2020/lib/components/input/email-input/o-email-input.module.mjs +5 -5
- package/esm2020/lib/components/input/file-input/o-file-input.component.mjs +4 -4
- package/esm2020/lib/components/input/file-input/o-file-input.module.mjs +5 -5
- package/esm2020/lib/components/input/hour-input/index.mjs +4 -0
- package/esm2020/lib/components/input/hour-input/o-hour-input.component.mjs +38 -9
- package/esm2020/lib/components/input/hour-input/o-hour-input.directive.mjs +46 -0
- package/esm2020/lib/components/input/hour-input/o-hour-input.module.mjs +8 -7
- package/esm2020/lib/components/input/html-input/o-html-input.component.mjs +4 -4
- package/esm2020/lib/components/input/html-input/o-html-input.module.mjs +5 -5
- package/esm2020/lib/components/input/index.mjs +2 -3
- package/esm2020/lib/components/input/integer-input/o-integer-input.component.mjs +4 -4
- package/esm2020/lib/components/input/integer-input/o-integer-input.module.mjs +5 -5
- package/esm2020/lib/components/input/listpicker/listpicker-renderer/currency/o-list-picker-renderer-currency.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/listpicker-renderer/date/o-list-picker-renderer-date.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/listpicker-renderer/integer/o-list-picker-renderer-integer.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/listpicker-renderer/o-list-picker-renderer.class.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/listpicker-renderer/percentage/o-list-picker-renderer-percentage.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/listpicker-renderer/real/o-list-picker-renderer-real.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/o-list-picker-dialog.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/o-list-picker.component.mjs +4 -4
- package/esm2020/lib/components/input/listpicker/o-list-picker.module.mjs +5 -5
- package/esm2020/lib/components/input/nif-input/o-nif-input.component.mjs +4 -4
- package/esm2020/lib/components/input/nif-input/o-nif-input.module.mjs +5 -5
- package/esm2020/lib/components/input/o-boolean-form-data-component.class.mjs +4 -4
- package/esm2020/lib/components/input/o-form-service-component.class.mjs +4 -4
- package/esm2020/lib/components/input/password-input/o-password-input.component.mjs +4 -4
- package/esm2020/lib/components/input/password-input/o-password-input.module.mjs +5 -5
- package/esm2020/lib/components/input/percent-input/o-percent-input.component.mjs +4 -4
- package/esm2020/lib/components/input/percent-input/o-percent-input.module.mjs +5 -5
- package/esm2020/lib/components/input/phone-input/data/country-code.mjs +4 -4
- package/esm2020/lib/components/input/phone-input/o-phone-input.component.mjs +4 -4
- package/esm2020/lib/components/input/phone-input/o-phone-input.module.mjs +5 -5
- package/esm2020/lib/components/input/radio/o-radio.component.mjs +4 -4
- package/esm2020/lib/components/input/radio/o-radio.module.mjs +5 -5
- package/esm2020/lib/components/input/real-input/o-real-input.component.mjs +4 -4
- package/esm2020/lib/components/input/real-input/o-real-input.module.mjs +5 -5
- package/esm2020/lib/components/input/search-input/o-search-input.component.mjs +4 -4
- package/esm2020/lib/components/input/search-input/o-search-input.module.mjs +5 -5
- package/esm2020/lib/components/input/slide-toggle/o-slide-toggle.component.mjs +4 -4
- package/esm2020/lib/components/input/slide-toggle/o-slide-toggle.module.mjs +5 -5
- package/esm2020/lib/components/input/slider/o-slider.component.mjs +4 -4
- package/esm2020/lib/components/input/slider/o-slider.module.mjs +5 -5
- package/esm2020/lib/components/input/text-input/o-text-input.component.mjs +4 -4
- package/esm2020/lib/components/input/text-input/o-text-input.module.mjs +5 -5
- package/esm2020/lib/components/input/textarea-input/o-textarea-input.component.mjs +4 -4
- package/esm2020/lib/components/input/textarea-input/o-textarea-input.module.mjs +5 -5
- package/esm2020/lib/components/input/time-input/o-time-input.component.mjs +4 -4
- package/esm2020/lib/components/input/time-input/o-time-input.module.mjs +5 -5
- package/esm2020/lib/components/language-selector/o-language-selector.component.mjs +4 -4
- package/esm2020/lib/components/language-selector/o-language-selector.module.mjs +5 -5
- package/esm2020/lib/components/list/list-item/o-list-item.component.mjs +4 -4
- package/esm2020/lib/components/list/list-item/o-list-item.directive.mjs +4 -4
- package/esm2020/lib/components/list/o-list.component.mjs +4 -4
- package/esm2020/lib/components/list/o-list.module.mjs +5 -5
- package/esm2020/lib/components/list/renderers/avatar/o-list-item-avatar.component.mjs +4 -4
- package/esm2020/lib/components/list/renderers/card/o-list-item-card.component.mjs +4 -4
- package/esm2020/lib/components/list/renderers/card-image/o-list-item-card-image.component.mjs +4 -4
- package/esm2020/lib/components/list/renderers/o-list-item-card-renderer.class.mjs +4 -4
- package/esm2020/lib/components/list/renderers/o-list-item-text-renderer.class.mjs +4 -4
- package/esm2020/lib/components/list/renderers/text/o-list-item-text.component.mjs +4 -4
- package/esm2020/lib/components/list/skeleton/o-list-skeleton.component.mjs +4 -4
- package/esm2020/lib/components/material/ckeditor/ck-editor.component.mjs +4 -4
- package/esm2020/lib/components/material/ckeditor/ck-editor.module.mjs +5 -5
- package/esm2020/lib/components/o-data-toolbar/o-data-toolbar.component.mjs +4 -4
- package/esm2020/lib/components/o-data-toolbar/o-data-toolbar.module.mjs +5 -5
- package/esm2020/lib/components/o-form-data-component.class.mjs +4 -4
- package/esm2020/lib/components/o-repeatable-skeleton.component.mjs +4 -4
- package/esm2020/lib/components/o-service-base-component.class.mjs +15 -10
- package/esm2020/lib/components/o-service-component.class.mjs +7 -7
- package/esm2020/lib/components/o-skeleton.component.mjs +4 -4
- package/esm2020/lib/components/table/column/calculated/o-table-column-calculated.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/boolean/o-table-cell-editor-boolean.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/date/o-table-cell-editor-date.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/email/o-table-cell-editor-email.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/integer/o-table-cell-editor-integer.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/o-base-table-cell-editor.class.mjs +10 -4
- package/esm2020/lib/components/table/column/cell-editor/real/o-table-cell-editor-real.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/text/o-table-cell-editor-text.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-editor/time/o-table-cell-editor-time.component.mjs +26 -12
- package/esm2020/lib/components/table/column/cell-renderer/action/o-table-cell-renderer-action.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/boolean/o-table-cell-renderer-boolean.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/currency/o-table-cell-renderer-currency.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/date/o-table-cell-renderer-date.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/image/o-table-cell-renderer-image.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/integer/o-table-cell-renderer-integer.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/o-base-table-cell-renderer.class.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/percentage/o-table-cell-renderer-percentage.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/real/o-table-cell-renderer-real.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/service/o-table-cell-renderer-service.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/time/o-table-cell-renderer-time.component.mjs +4 -4
- package/esm2020/lib/components/table/column/cell-renderer/translate/o-table-cell-renderer-translate.component.mjs +4 -4
- package/esm2020/lib/components/table/column/o-table-column.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/contextmenu/o-table-context-menu.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/default-o-table.datasource.mjs +137 -66
- package/esm2020/lib/components/table/extensions/dialog/apply-configuration/o-table-apply-configuration-dialog.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/export/o-table-export-dialog.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column.service.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/group-by-columns/o-table-group-by-columns-dialog.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/o-table-base-dialog.class.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/store-configuration/o-table-store-configuration-dialog.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/dialog/visible-columns/o-table-visible-columns-dialog.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/export-button/o-table-export-button.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/export-button/o-table-export-button.service.mjs +4 -4
- package/esm2020/lib/components/table/extensions/footer/aggregate/o-table-column-aggregate.component.mjs +6 -6
- package/esm2020/lib/components/table/extensions/footer/expanded/o-table-expanded-footer.directive.mjs +11 -14
- package/esm2020/lib/components/table/extensions/footer/paginator/o-table-mat-paginator-intl.mjs +4 -4
- package/esm2020/lib/components/table/extensions/footer/paginator/o-table-paginator.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-button/o-table-button.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-buttons/o-table-buttons.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-column-resizer/o-table-column-resizer.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-column-select-all/o-table-column-select-all.directive.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-columns-filter/columns/o-table-columns-filter-column.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-columns-grouping/columns/o-table-columns-grouping-column.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-columns-grouping/o-table-columns-grouping.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-header/o-table-header.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-header-column-filter-icon/o-table-header-column-filter-icon.component.mjs +5 -5
- package/esm2020/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-insertable-row/o-table-insertable-row.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-menu/o-table-menu.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-option/o-table-option.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/header/table-quickfilter/o-table-quickfilter.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/o-table-datasource.service.mjs +4 -4
- package/esm2020/lib/components/table/extensions/o-table-strategy.service.mjs +10 -4
- package/esm2020/lib/components/table/extensions/pipes/o-table-row-class.pipe.mjs +4 -4
- package/esm2020/lib/components/table/extensions/row/o-table-row.directive.mjs +4 -4
- package/esm2020/lib/components/table/extensions/row/table-row-expandable/o-table-row-expandable.component.mjs +4 -4
- package/esm2020/lib/components/table/extensions/skeleton/o-table-skeleton.component.mjs +19 -19
- package/esm2020/lib/components/table/extensions/sort/o-mat-sort-header.mjs +14 -7
- package/esm2020/lib/components/table/extensions/sort/o-mat-sort-module.mjs +5 -5
- package/esm2020/lib/components/table/extensions/sort/o-mat-sort.mjs +4 -4
- package/esm2020/lib/components/table/index.mjs +2 -1
- package/esm2020/lib/components/table/o-table-base.class.mjs +1 -1
- package/esm2020/lib/components/table/o-table-loading.service.mjs +113 -0
- package/esm2020/lib/components/table/o-table.component.mjs +66 -61
- package/esm2020/lib/components/table/o-table.module.mjs +12 -8
- package/esm2020/lib/components/tree/header/tree-menu/o-tree-menu.component.mjs +4 -4
- package/esm2020/lib/components/tree/o-tree-dao.service.mjs +4 -4
- package/esm2020/lib/components/tree/o-tree.component.mjs +4 -4
- package/esm2020/lib/components/tree/o-tree.module.mjs +5 -5
- package/esm2020/lib/components/tree/tree-node/tree-node.component.mjs +4 -4
- package/esm2020/lib/components/user-info/o-user-info.component.mjs +4 -4
- package/esm2020/lib/components/user-info/o-user-info.module.mjs +5 -5
- package/esm2020/lib/components/user-info/user-info-configuration/o-user-info-configuration.directive.mjs +4 -4
- package/esm2020/lib/components/user-info/user-info-configuration-item/o-user-info-configuration-item.directive.mjs +4 -4
- package/esm2020/lib/config/o-modules.mjs +5 -5
- package/esm2020/lib/directives/input-regulate.directive.mjs +4 -4
- package/esm2020/lib/directives/keyboard-listener.directive.mjs +4 -4
- package/esm2020/lib/directives/locker.directive.mjs +4 -4
- package/esm2020/lib/directives/o-file-drag-and-drop.directive.mjs +4 -4
- package/esm2020/lib/directives/o-hidden.directive.mjs +4 -4
- package/esm2020/lib/directives/o-mat-error.directive.mjs +4 -4
- package/esm2020/lib/directives/o-mat-prefix.directive.mjs +4 -4
- package/esm2020/lib/directives/o-mat-suffix.directive.mjs +4 -4
- package/esm2020/lib/directives/o-tab-group.directive.mjs +4 -4
- package/esm2020/lib/layouts/app-layout/app-layout-header/o-app-layout-header.component.mjs +4 -4
- package/esm2020/lib/layouts/app-layout/app-layout-sidenav/o-app-layout-sidenav.component.mjs +4 -4
- package/esm2020/lib/layouts/app-layout/o-app-layout.component.mjs +4 -4
- package/esm2020/lib/layouts/app-layout/o-app-layout.module.mjs +5 -5
- package/esm2020/lib/layouts/card-menu-layout/o-card-menu-layout.component.mjs +4 -4
- package/esm2020/lib/layouts/card-menu-layout/o-card-menu-layout.module.mjs +5 -5
- package/esm2020/lib/layouts/form-layout/dialog/o-form-layout-dialog.component.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/dialog/options/o-form-layout-dialog-options.directive.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/directives/o-form-layout-manager-content.directive.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/guards/o-form-layout-can-activate-child.guard.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/o-form-layout-manager.module.mjs +5 -5
- package/esm2020/lib/layouts/form-layout/split-pane/o-form-layout-split-pane.component.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/split-pane/options/o-form-layout-split-pane-options.directive.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/tabgroup/o-form-layout-tabgroup.component.mjs +4 -4
- package/esm2020/lib/layouts/form-layout/tabgroup/options/o-form-layout-tabgroup-options.directive.mjs +4 -4
- package/esm2020/lib/ontimize-web-ngx.module.mjs +5 -5
- package/esm2020/lib/pipes/columns-filter.pipe.mjs +4 -4
- package/esm2020/lib/pipes/is-empty-value.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-currency.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-icon.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-integer.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-moment.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-percentage.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-real.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-safe.pipe.mjs +4 -4
- package/esm2020/lib/pipes/o-translate.pipe.mjs +8 -8
- package/esm2020/lib/pipes/order-by.pipe.mjs +4 -4
- package/esm2020/lib/services/app-menu.service.mjs +4 -4
- package/esm2020/lib/services/appearance.service.mjs +4 -4
- package/esm2020/lib/services/auth-guard.service.mjs +4 -4
- package/esm2020/lib/services/auth.service.mjs +4 -4
- package/esm2020/lib/services/base-service-response.adapter.mjs +4 -4
- package/esm2020/lib/services/base-service.class.mjs +4 -4
- package/esm2020/lib/services/currency.service.mjs +4 -4
- package/esm2020/lib/services/dialog.service.mjs +4 -4
- package/esm2020/lib/services/icon.service.mjs +4 -4
- package/esm2020/lib/services/jsonapi/jsonapi-preferences.service.mjs +4 -4
- package/esm2020/lib/services/jsonapi/jsonapi-service-response.adapter.mjs +4 -4
- package/esm2020/lib/services/jsonapi/jsonapi.service.mjs +4 -4
- package/esm2020/lib/services/local-storage.service.mjs +4 -4
- package/esm2020/lib/services/login-storage.service.mjs +4 -4
- package/esm2020/lib/services/moment.service.mjs +4 -4
- package/esm2020/lib/services/navigation.service.mjs +4 -4
- package/esm2020/lib/services/number.service.mjs +4 -4
- package/esm2020/lib/services/o-auth.service.mjs +4 -4
- package/esm2020/lib/services/o-breadcrumb.service.mjs +4 -4
- package/esm2020/lib/services/o-error-dialog-manager.service.mjs +4 -4
- package/esm2020/lib/services/o-form-layout-manager.service.mjs +4 -4
- package/esm2020/lib/services/o-modules-info.service.mjs +4 -4
- package/esm2020/lib/services/o-user-info.service.mjs +4 -4
- package/esm2020/lib/services/ontimize/o-preference-response.adapter.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-base-service.class.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-ee.service.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-export-3xx.service.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-export.service.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-file.service.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-preferences.service.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize-service-response.adapter.mjs +4 -4
- package/esm2020/lib/services/ontimize/ontimize.service.mjs +4 -4
- package/esm2020/lib/services/ontimize-export-data-base-provider.service.mjs +4 -4
- package/esm2020/lib/services/ontimize-export-data-provider-3x.service.mjs +4 -4
- package/esm2020/lib/services/ontimize-export-data-provider.service.mjs +4 -4
- package/esm2020/lib/services/ontimize-icon-registry.service.mjs +4 -4
- package/esm2020/lib/services/pagination-context.service.mjs +4 -4
- package/esm2020/lib/services/parser/o-service-response.parser.mjs +4 -4
- package/esm2020/lib/services/permissions/o-permissions.module.mjs +5 -5
- package/esm2020/lib/services/permissions/ontimize-ee-permissions.service.mjs +4 -4
- package/esm2020/lib/services/permissions/ontimize-permissions.service.mjs +4 -4
- package/esm2020/lib/services/permissions/permissions-can-activate.guard.mjs +4 -4
- package/esm2020/lib/services/permissions/permissions.service.mjs +4 -4
- package/esm2020/lib/services/remote-config.service.mjs +5 -5
- package/esm2020/lib/services/request-adapter/jsonapi-request-arguments.adapter.mjs +4 -4
- package/esm2020/lib/services/request-adapter/ontimize-request-arguments.adapter.mjs +4 -4
- package/esm2020/lib/services/share-can-activate-child.service.mjs +4 -4
- package/esm2020/lib/services/snackbar.service.mjs +4 -4
- package/esm2020/lib/services/state/o-app-menu-component-state.service.mjs +4 -4
- package/esm2020/lib/services/state/o-component-state.service.mjs +10 -10
- package/esm2020/lib/services/state/o-filter-builder-component-state.service.mjs +4 -4
- package/esm2020/lib/services/state/o-form-layout-manager-component-state.service.mjs +4 -4
- package/esm2020/lib/services/state/o-grid-component-state.service.mjs +4 -4
- package/esm2020/lib/services/state/o-list-component-state.service.mjs +4 -4
- package/esm2020/lib/services/state/o-table-component-state.class.mjs +1 -1
- package/esm2020/lib/services/state/o-table-component-state.service.mjs +4 -4
- package/esm2020/lib/services/state/o-tree-component-state.service.mjs +4 -4
- package/esm2020/lib/services/translate/o-translate.parser.mjs +4 -4
- package/esm2020/lib/services/translate/o-translate.service.mjs +4 -4
- package/esm2020/lib/shared/components/dialog/o-dialog-internal.component.mjs +4 -4
- package/esm2020/lib/shared/components/dialog/o-dialog.component.mjs +4 -4
- package/esm2020/lib/shared/components/error403/o-error-403.component.mjs +4 -4
- package/esm2020/lib/shared/components/filter/load-filter/o-load-filter-dialog.component.mjs +4 -4
- package/esm2020/lib/shared/components/filter/store-filter/o-store-filter-dialog.component.mjs +4 -4
- package/esm2020/lib/shared/components/snackbar/o-snackbar-base.class.mjs +4 -4
- package/esm2020/lib/shared/components/snackbar/o-snackbar.component.mjs +4 -4
- package/esm2020/lib/shared/components/validation/o-error.component.mjs +4 -4
- package/esm2020/lib/shared/components/validation/o-validator.component.mjs +4 -4
- package/esm2020/lib/shared/material/custom.material.module.mjs +5 -5
- package/esm2020/lib/shared/material/date/ontimize-moment-date-adapter.mjs +4 -4
- package/esm2020/lib/shared/shared.module.mjs +5 -5
- package/esm2020/lib/types/aggregate-function.type.mjs +1 -1
- package/esm2020/lib/types/table/o-table-global-config.type.mjs +1 -1
- package/fesm2015/ontimize-web-ngx.mjs +1582 -1283
- package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
- package/fesm2020/ontimize-web-ngx.mjs +1567 -1280
- package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
- package/lib/components/dual-list-selector/o-dual-list-selector.component.d.ts +1 -1
- package/lib/components/input/hour-input/index.d.ts +3 -0
- package/lib/components/input/hour-input/o-hour-input.component.d.ts +6 -2
- package/lib/components/input/hour-input/o-hour-input.directive.d.ts +8 -0
- package/lib/components/input/hour-input/o-hour-input.module.d.ts +5 -4
- package/lib/components/input/index.d.ts +1 -2
- package/lib/components/o-service-base-component.class.d.ts +1 -0
- package/lib/components/table/column/cell-editor/o-base-table-cell-editor.class.d.ts +5 -3
- package/lib/components/table/column/cell-editor/time/o-table-cell-editor-time.component.d.ts +2 -2
- package/lib/components/table/extensions/default-o-table.datasource.d.ts +6 -1
- package/lib/components/table/extensions/dialog/group-by-columns/o-table-group-by-columns-dialog.component.d.ts +1 -1
- package/lib/components/table/extensions/footer/aggregate/o-table-column-aggregate.component.d.ts +1 -1
- package/lib/components/table/extensions/footer/expanded/o-table-expanded-footer.directive.d.ts +1 -2
- package/lib/components/table/extensions/o-table-strategy.service.d.ts +2 -1
- package/lib/components/table/extensions/skeleton/o-table-skeleton.component.d.ts +1 -0
- package/lib/components/table/extensions/sort/o-mat-sort-header.d.ts +5 -3
- package/lib/components/table/index.d.ts +1 -0
- package/lib/components/table/o-table-base.class.d.ts +3 -1
- package/lib/components/table/o-table-loading.service.d.ts +28 -0
- package/lib/components/table/o-table.component.d.ts +3 -1
- package/lib/components/table/o-table.module.d.ts +2 -1
- package/lib/services/state/o-table-component-state.class.d.ts +1 -1
- package/lib/types/aggregate-function.type.d.ts +2 -1
- package/lib/types/table/o-table-global-config.type.d.ts +4 -0
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DataSource } from '@angular/cdk/collections';
|
|
2
|
-
import { EventEmitter } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject, merge, Subject, Subscription } from 'rxjs';
|
|
4
|
-
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
2
|
+
import { EventEmitter, NgZone } from '@angular/core';
|
|
3
|
+
import { asyncScheduler, BehaviorSubject, EMPTY, merge, Observable, of, Subject, Subscription } from 'rxjs';
|
|
4
|
+
import { distinctUntilChanged, filter, map, observeOn, switchMap } from 'rxjs/operators';
|
|
5
5
|
import { ColumnValueFilterOperator } from '../../../types/table/o-column-value-filter.type';
|
|
6
6
|
import { Codes } from '../../../util/codes';
|
|
7
7
|
import { Util } from '../../../util/util';
|
|
@@ -12,7 +12,7 @@ export class OnRangeChangeVirtualScroll {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
export class DefaultOTableDataSource extends DataSource {
|
|
15
|
-
get data() { return this.dataTotalsChange.value; }
|
|
15
|
+
get data() { return this.dataTotalsChange.value ?? []; }
|
|
16
16
|
get quickFilter() { return this._quickFilterChange.value || ''; }
|
|
17
17
|
set quickFilter(filter) {
|
|
18
18
|
this._quickFilterChange.next(filter);
|
|
@@ -20,7 +20,7 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
20
20
|
constructor(table) {
|
|
21
21
|
super();
|
|
22
22
|
this.table = table;
|
|
23
|
-
this.dataTotalsChange = new BehaviorSubject(
|
|
23
|
+
this.dataTotalsChange = new BehaviorSubject(null);
|
|
24
24
|
this._virtualPageChange = new BehaviorSubject(new OnRangeChangeVirtualScroll({ start: 0, end: 0 }));
|
|
25
25
|
this._quickFilterChange = new BehaviorSubject('');
|
|
26
26
|
this._columnValueFilterChange = new BehaviorSubject(null);
|
|
@@ -28,13 +28,14 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
28
28
|
this.filteredData = [];
|
|
29
29
|
this.aggregateData = {};
|
|
30
30
|
this.onRenderedDataChange = new EventEmitter();
|
|
31
|
-
this._renderedData =
|
|
31
|
+
this._renderedData = null;
|
|
32
32
|
this.resultsLength = 0;
|
|
33
33
|
this.columnValueFilters = [];
|
|
34
34
|
this.groupedRowState = [];
|
|
35
35
|
this.activeAggregates = {};
|
|
36
36
|
this.groupedRowsSubscription = new Subscription();
|
|
37
37
|
this.levelsExpansionState = {};
|
|
38
|
+
this.ngZone = table.injector.get(NgZone);
|
|
38
39
|
this._database = table.daoTable;
|
|
39
40
|
if (this._database) {
|
|
40
41
|
this.resultsLength = this._database.data.length;
|
|
@@ -63,63 +64,108 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
63
64
|
this.onRenderedDataChange.emit();
|
|
64
65
|
}
|
|
65
66
|
connect() {
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
const tag = (type, obs) => obs.pipe(map(value => ({ type, value })));
|
|
68
|
+
const displayDataChanges = [];
|
|
69
|
+
displayDataChanges.push(tag('DATACHANGE', this._database.dataChange));
|
|
69
70
|
if (!this.table.pageable) {
|
|
70
71
|
if (this._sort) {
|
|
71
|
-
displayDataChanges.push(this._sort.oSortChange);
|
|
72
|
+
displayDataChanges.push(tag('SORTCHANGE', this._sort.oSortChange));
|
|
72
73
|
}
|
|
73
74
|
if (this._tableOptions.filter) {
|
|
74
|
-
displayDataChanges.push(this._quickFilterChange);
|
|
75
|
+
displayDataChanges.push(tag('QUICKFILTERCHANGE', this._quickFilterChange));
|
|
75
76
|
}
|
|
76
77
|
if (this._paginator) {
|
|
77
|
-
displayDataChanges.push(this._paginator.page);
|
|
78
|
+
displayDataChanges.push(tag('PAGINATOR', this._paginator.page));
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
displayDataChanges.push(tag('FILTERBYCOLUMN', this._columnValueFilterChange).pipe(filter(event => {
|
|
82
|
+
if (event.value === null) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
})));
|
|
84
87
|
if (this.table.groupable) {
|
|
85
|
-
displayDataChanges.push(this.groupByColumnChange);
|
|
88
|
+
displayDataChanges.push(tag('GROUP_BY', this.groupByColumnChange));
|
|
86
89
|
}
|
|
87
|
-
|
|
90
|
+
const mainDataStream = merge(...displayDataChanges).pipe(observeOn(asyncScheduler), switchMap((event) => {
|
|
88
91
|
let data = Object.assign([], this._database.data);
|
|
89
|
-
if (
|
|
90
|
-
|
|
92
|
+
if (!Array.isArray(data) || this.renderedData === null) {
|
|
93
|
+
this.renderedData = [];
|
|
94
|
+
return of(null);
|
|
95
|
+
}
|
|
96
|
+
return this.processDataOutsideAngular(data);
|
|
97
|
+
}));
|
|
98
|
+
const virtualScrollStream = this.table.virtualScrollViewport
|
|
99
|
+
? this._virtualPageChange.pipe(filter(() => {
|
|
100
|
+
return this.renderedData !== null &&
|
|
101
|
+
this.renderedData !== undefined &&
|
|
102
|
+
Array.isArray(this.renderedData) &&
|
|
103
|
+
this.renderedData.length > 0;
|
|
104
|
+
}), switchMap((x) => {
|
|
105
|
+
return of(this.getVirtualScrollData(this.renderedData, x));
|
|
106
|
+
}))
|
|
107
|
+
: EMPTY;
|
|
108
|
+
return merge(mainDataStream, virtualScrollStream);
|
|
109
|
+
}
|
|
110
|
+
processDataOutsideAngular(data) {
|
|
111
|
+
return new Observable(observer => {
|
|
112
|
+
this.ngZone.runOutsideAngular(() => {
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
data = this.executeDataProcessing(data, observer);
|
|
115
|
+
}, 0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
updateTableState(renderedData, resultsLength, aggregateData = {}) {
|
|
120
|
+
this.renderedData = renderedData;
|
|
121
|
+
this.resultsLength = resultsLength;
|
|
122
|
+
this.aggregateData = aggregateData;
|
|
123
|
+
}
|
|
124
|
+
executeDataProcessing(data, observer) {
|
|
125
|
+
try {
|
|
126
|
+
if (this.existsAnyCalculatedColumn()) {
|
|
127
|
+
data = this.getColumnCalculatedData(data);
|
|
128
|
+
}
|
|
129
|
+
if (!this.table.pageable) {
|
|
130
|
+
data = this.getColumnValueFilterData(data);
|
|
131
|
+
data = this.getQuickFilterData(data);
|
|
132
|
+
data = this.getSortedData(data);
|
|
133
|
+
}
|
|
134
|
+
this.filteredData = Object.assign([], data);
|
|
135
|
+
let resultsLength;
|
|
136
|
+
if (this.table.pageable) {
|
|
137
|
+
const totalRecordsNumber = this.table.getTotalRecordsNumber();
|
|
138
|
+
resultsLength = totalRecordsNumber ?? data.length;
|
|
91
139
|
}
|
|
92
140
|
else {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
data = this.getColumnCalculatedData(data);
|
|
96
|
-
}
|
|
97
|
-
if (!this.table.pageable) {
|
|
98
|
-
data = this.getColumnValueFilterData(data);
|
|
99
|
-
data = this.getQuickFilterData(data);
|
|
100
|
-
data = this.getSortedData(data);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
this.filteredData = Object.assign([], data);
|
|
104
|
-
if (this.table.pageable) {
|
|
105
|
-
const totalRecordsNumber = this.table.getTotalRecordsNumber();
|
|
106
|
-
this.resultsLength = totalRecordsNumber !== undefined ? totalRecordsNumber : data.length;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
this.resultsLength = data.length;
|
|
110
|
-
data = this.getPaginationData(data);
|
|
111
|
-
}
|
|
112
|
-
if (this.table.groupable && !Util.isArrayEmpty(this.table.groupedColumnsArray) && data.length > 0) {
|
|
113
|
-
data = this.getGroupedData(data);
|
|
114
|
-
}
|
|
115
|
-
this.renderedData = data;
|
|
116
|
-
if (this.table.virtualScrollViewport && !this._paginator) {
|
|
117
|
-
data = this.getVirtualScrollData(data, new OnRangeChangeVirtualScroll({ start: 0, end: Codes.LIMIT_SCROLLVIRTUAL }));
|
|
118
|
-
}
|
|
119
|
-
this.aggregateData = this.getAggregatesData(this.renderedData);
|
|
141
|
+
resultsLength = data.length;
|
|
142
|
+
data = this.getPaginationData(data);
|
|
120
143
|
}
|
|
121
|
-
|
|
122
|
-
|
|
144
|
+
if (this.table.groupable && !Util.isArrayEmpty(this.table.groupedColumnsArray) && data.length > 0) {
|
|
145
|
+
data = this.getGroupedData(data);
|
|
146
|
+
}
|
|
147
|
+
const renderedData = data;
|
|
148
|
+
if (this.table.virtualScrollViewport && !this._paginator) {
|
|
149
|
+
data = this.getVirtualScrollData(data, new OnRangeChangeVirtualScroll({ start: 0, end: Codes.LIMIT_SCROLLVIRTUAL }));
|
|
150
|
+
}
|
|
151
|
+
const aggregateData = this.getAggregatesData(renderedData);
|
|
152
|
+
this.ngZone.run(() => {
|
|
153
|
+
this.updateTableState(renderedData, resultsLength, aggregateData);
|
|
154
|
+
this.table.loadingService.setLoading(false);
|
|
155
|
+
this.table.cd.markForCheck();
|
|
156
|
+
observer.next(data);
|
|
157
|
+
observer.complete();
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.error('❌ Error while processing data:', error);
|
|
162
|
+
this.ngZone.run(() => {
|
|
163
|
+
this.table.loadingService.setLoading(false);
|
|
164
|
+
this.table.cd.markForCheck();
|
|
165
|
+
observer.error(error);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return data;
|
|
123
169
|
}
|
|
124
170
|
getGroupedData(data) {
|
|
125
171
|
data = this.getSubGroupsOfGroupedRow(data);
|
|
@@ -131,16 +177,23 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
131
177
|
}
|
|
132
178
|
getAggregatesData(data) {
|
|
133
179
|
const obj = {};
|
|
134
|
-
if (
|
|
180
|
+
if (this._tableOptions === undefined) {
|
|
135
181
|
return obj;
|
|
136
182
|
}
|
|
137
183
|
this._tableOptions.columns.forEach((column) => {
|
|
138
|
-
let totalValue = '';
|
|
139
184
|
if (column.aggregate && column.visible) {
|
|
140
|
-
|
|
185
|
+
const valueOrPromise = this.calculateAggregate(data, column.attr, column.aggregate.operator);
|
|
186
|
+
if (valueOrPromise instanceof Promise) {
|
|
187
|
+
valueOrPromise
|
|
188
|
+
.then(resolvedValue => {
|
|
189
|
+
obj[column.attr] = resolvedValue;
|
|
190
|
+
})
|
|
191
|
+
.catch(err => console.error(`o-table-column-aggregate: Async aggregate error in column "${column.attr}" using aggregate function "${column.aggregate.operator}":`, err));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
obj[column.attr] = valueOrPromise;
|
|
195
|
+
}
|
|
141
196
|
}
|
|
142
|
-
const key = column.attr;
|
|
143
|
-
obj[key] = totalValue;
|
|
144
197
|
});
|
|
145
198
|
return obj;
|
|
146
199
|
}
|
|
@@ -242,7 +295,6 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
242
295
|
i++;
|
|
243
296
|
}
|
|
244
297
|
});
|
|
245
|
-
this.table.updateSortingSubject(false);
|
|
246
298
|
return originalDataSorted;
|
|
247
299
|
}
|
|
248
300
|
getTableData() {
|
|
@@ -334,8 +386,8 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
334
386
|
filters.forEach(filter => {
|
|
335
387
|
this.columnValueFilters.push(filter);
|
|
336
388
|
});
|
|
337
|
-
if (!this.table.pageable) {
|
|
338
|
-
this._columnValueFilterChange.next(
|
|
389
|
+
if (!this.table.pageable && this.columnValueFilters.length > 0) {
|
|
390
|
+
this._columnValueFilterChange.next(this.columnValueFilters);
|
|
339
391
|
}
|
|
340
392
|
}
|
|
341
393
|
isColumnValueFilterActive() {
|
|
@@ -355,13 +407,13 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
355
407
|
this.columnValueFilters = [];
|
|
356
408
|
}
|
|
357
409
|
if (trigger) {
|
|
358
|
-
this._columnValueFilterChange.next(
|
|
410
|
+
this._columnValueFilterChange.next(this.columnValueFilters);
|
|
359
411
|
}
|
|
360
412
|
}
|
|
361
413
|
clearColumnFilter(attr, trigger = true) {
|
|
362
414
|
this.columnValueFilters = this.columnValueFilters.filter(x => x.attr !== attr);
|
|
363
415
|
if (trigger) {
|
|
364
|
-
this._columnValueFilterChange.next(
|
|
416
|
+
this._columnValueFilterChange.next(this.columnValueFilters);
|
|
365
417
|
}
|
|
366
418
|
}
|
|
367
419
|
addColumnFilter(filter) {
|
|
@@ -393,7 +445,7 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
393
445
|
}
|
|
394
446
|
}
|
|
395
447
|
if (!this.table.pageable) {
|
|
396
|
-
this._columnValueFilterChange.next(
|
|
448
|
+
this._columnValueFilterChange.next(this.columnValueFilters);
|
|
397
449
|
}
|
|
398
450
|
}
|
|
399
451
|
getColumnValueFilterData(data) {
|
|
@@ -471,7 +523,7 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
471
523
|
else {
|
|
472
524
|
const columnData = this.getColumnData(columnAttr);
|
|
473
525
|
if (typeof operator === 'function') {
|
|
474
|
-
resultAggregate = operator(columnData);
|
|
526
|
+
resultAggregate = operator(columnData, columnAttr, this.table);
|
|
475
527
|
}
|
|
476
528
|
}
|
|
477
529
|
return resultAggregate;
|
|
@@ -587,8 +639,17 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
587
639
|
recalculateColumnAggregate(columnAttr, row) {
|
|
588
640
|
const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr);
|
|
589
641
|
const data = row.getColumnAggregateData(columnAttr);
|
|
590
|
-
const
|
|
591
|
-
|
|
642
|
+
const valueOrPromise = this.calculateAggregate(data, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate);
|
|
643
|
+
if (valueOrPromise instanceof Promise) {
|
|
644
|
+
valueOrPromise
|
|
645
|
+
.then(value => {
|
|
646
|
+
row.setColumnAggregateValue(columnAttr, value);
|
|
647
|
+
})
|
|
648
|
+
.catch(err => console.error(`o-table-column-aggregate: Async aggregate error in column "${columnAttr}" using aggregate function "${aggregateConf.aggregateFunction}":`, err));
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
row.setColumnAggregateValue(columnAttr, valueOrPromise);
|
|
652
|
+
}
|
|
592
653
|
}
|
|
593
654
|
getSublevel(data, level, parent) {
|
|
594
655
|
if (level >= this.table.groupedColumnsArray.length) {
|
|
@@ -631,8 +692,17 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
631
692
|
const aggregateData = groupData.map(x => { const obj = {}; obj[columnAttr] = x[columnAttr]; return obj; });
|
|
632
693
|
row.setColumnAggregateData(columnAttr, aggregateData);
|
|
633
694
|
const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr);
|
|
634
|
-
const
|
|
635
|
-
|
|
695
|
+
const valueOrPromise = this.calculateAggregate(aggregateData, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate);
|
|
696
|
+
if (valueOrPromise instanceof Promise) {
|
|
697
|
+
valueOrPromise
|
|
698
|
+
.then(value => {
|
|
699
|
+
row.setColumnAggregateValue(columnAttr, value);
|
|
700
|
+
})
|
|
701
|
+
.catch(err => console.error(`o-table-columns-grouping-column: Async aggregate error in column "${columnAttr}" using aggregate function "${aggregateConf.aggregateFunction}":`, err));
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
row.setColumnAggregateValue(columnAttr, valueOrPromise);
|
|
705
|
+
}
|
|
636
706
|
}
|
|
637
707
|
}
|
|
638
708
|
});
|
|
@@ -660,6 +730,7 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
660
730
|
return Util.isDefined(parent) ? (parent.visible && parent.expanded) : true;
|
|
661
731
|
}
|
|
662
732
|
updateGroupedColumns() {
|
|
733
|
+
this.table.loadingService.setLoading(true);
|
|
663
734
|
this.groupByColumnChange.next();
|
|
664
735
|
}
|
|
665
736
|
toggleGroupByColumn(rowGroup) {
|
|
@@ -711,4 +782,4 @@ export class DefaultOTableDataSource extends DataSource {
|
|
|
711
782
|
return expansionState;
|
|
712
783
|
}
|
|
713
784
|
}
|
|
714
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vLXRhYmxlLmRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2RlZmF1bHQtby10YWJsZS5kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNELE9BQU8sRUFBRSx5QkFBeUIsRUFBc0IsTUFBTSxpREFBaUQsQ0FBQztBQUNoSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2pFLE1BQU0sT0FBTywwQkFBMEI7SUFHckMsWUFBWSxJQUFlO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxVQUFlO0lBRzFELElBQUksSUFBSSxLQUFZLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFxQnpELElBQUksV0FBVyxLQUFhLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLElBQUksV0FBVyxDQUFDLE1BQWM7UUFD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LE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIExpc3RSYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE9UYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtZGF0YXNvdXJjZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1RhYmxlT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLCBPQ29sdW1uVmFsdWVGaWx0ZXIgfSBmcm9tICcuLi8uLi8uLi90eXBlcy90YWJsZS9vLWNvbHVtbi12YWx1ZS1maWx0ZXIudHlwZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgdHlwZSB7IE9Db2x1bW4gfSBmcm9tICcuLi9jb2x1bW4vby1jb2x1bW4uY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vby10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlRGFvIH0gZnJvbSAnLi9vLXRhYmxlLmRhbyc7XG5pbXBvcnQgeyBPVGFibGVHcm91cGVkUm93IH0gZnJvbSAnLi9yb3cvby10YWJsZS1yb3ctZ3JvdXAuY2xhc3MnO1xuaW1wb3J0IHsgT01hdFNvcnQgfSBmcm9tICcuL3NvcnQvby1tYXQtc29ydCc7XG5cbmV4cG9ydCBjbGFzcyBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCB7XG4gIHB1YmxpYyByYW5nZTogTGlzdFJhbmdlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IExpc3RSYW5nZSkge1xuICAgIHRoaXMucmFuZ2UgPSBkYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0T1RhYmxlRGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2U8YW55PiBpbXBsZW1lbnRzIE9UYWJsZURhdGFTb3VyY2Uge1xuICBkYXRhVG90YWxzQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXG4gIGdldCBkYXRhKCk6IGFueVtdIHsgcmV0dXJuIHRoaXMuZGF0YVRvdGFsc0NoYW5nZS52YWx1ZTsgfVxuXG4gIHByb3RlY3RlZCBfZGF0YWJhc2U6IE9UYWJsZURhbztcbiAgcHJvdGVjdGVkIF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcbiAgcHJvdGVjdGVkIF90YWJsZU9wdGlvbnM6IE9UYWJsZU9wdGlvbnM7XG4gIHByb3RlY3RlZCBfc29ydDogT01hdFNvcnQ7XG5cbiAgcHJvdGVjdGVkIF92aXJ0dWFsUGFnZUNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T25SYW5nZUNoYW5nZVZpcnR1YWxTY3JvbGw+KG5ldyBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCh7IHN0YXJ0OiAwLCBlbmQ6IDAgfSkpO1xuICBwcm90ZWN0ZWQgX3F1aWNrRmlsdGVyQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHByb3RlY3RlZCBfY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICBwcm90ZWN0ZWQgZ3JvdXBCeUNvbHVtbkNoYW5nZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+O1xuXG4gIHByb3RlY3RlZCBmaWx0ZXJlZERhdGE6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBhZ2dyZWdhdGVEYXRhOiBhbnkgPSB7fTtcblxuICBvblJlbmRlcmVkRGF0YUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gIHByb3RlY3RlZCBfcmVuZGVyZWREYXRhOiBhbnlbXSA9IFtdO1xuICByZXN1bHRzTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gIGdldCBxdWlja0ZpbHRlcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fcXVpY2tGaWx0ZXJDaGFuZ2UudmFsdWUgfHwgJyc7IH1cbiAgc2V0IHF1aWNrRmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJDaGFuZ2UubmV4dChmaWx0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2x1bW5WYWx1ZUZpbHRlcnM6IEFycmF5PE9Db2x1bW5WYWx1ZUZpbHRlcj4gPSBbXTtcbiAgcHJpdmF0ZSBncm91cGVkUm93U3RhdGU6IE9UYWJsZUdyb3VwZWRSb3dbXSA9IFtdO1xuICBwcml2YXRlIGFjdGl2ZUFnZ3JlZ2F0ZXMgPSB7fTtcbiAgcHJpdmF0ZSBncm91cGVkUm93c1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBsZXZlbHNFeHBhbnNpb25TdGF0ZSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0YWJsZTogT1RhYmxlQ29tcG9uZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kYXRhYmFzZSA9IHRhYmxlLmRhb1RhYmxlO1xuICAgIGlmICh0aGlzLl9kYXRhYmFzZSkge1xuICAgICAgdGhpcy5yZXN1bHRzTGVuZ3RoID0gdGhpcy5fZGF0YWJhc2UuZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh0YWJsZS5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRvciA9IHRhYmxlLm1hdHBhZ2luYXRvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZS52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMudGFibGUudmlydHVhbFNjcm9sbFZpZXdwb3J0LnJlbmRlcmVkUmFuZ2VTdHJlYW1cbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAodmFsdWU6IExpc3RSYW5nZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdmlydHVhbFBhZ2VDaGFuZ2UubmV4dChuZXcgT25SYW5nZUNoYW5nZVZpcnR1YWxTY3JvbGwodmFsdWUpKTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJsZU9wdGlvbnMgPSB0YWJsZS5vVGFibGVPcHRpb25zO1xuICAgIHRoaXMuX3NvcnQgPSB0YWJsZS5zb3J0O1xuXG4gIH1cblxuICBzb3J0RnVuY3Rpb24oYTogYW55LCBiOiBhbnkpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zb3J0LnNvcnRGdW5jdGlvbihhLCBiKTtcbiAgfVxuXG4gIGdldCByZW5kZXJlZERhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZERhdGE7XG4gIH1cblxuICBzZXQgcmVuZGVyZWREYXRhKGFyZzogYW55W10pIHtcbiAgICB0aGlzLl9yZW5kZXJlZERhdGEgPSBhcmc7XG4gICAgdGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZS5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRhYmxlIHRvIHJldHJpZXZlIG9uZSBzdHJlYW0gY29udGFpbmluZyB0aGUgZGF0YSB0byByZW5kZXIuXG4gICAqL1xuICBjb25uZWN0KCk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICBjb25zdCBkaXNwbGF5RGF0YUNoYW5nZXM6IGFueVtdID0gW1xuICAgICAgdGhpcy5fZGF0YWJhc2UuZGF0YUNoYW5nZVxuICAgIF07XG5cbiAgICBpZiAoIXRoaXMudGFibGUucGFnZWFibGUpIHtcblxuXG4gICAgICBpZiAodGhpcy5fc29ydCkge1xuICAgICAgICBkaXNwbGF5RGF0YUNoYW5nZXMucHVzaCh0aGlzLl9zb3J0Lm9Tb3J0Q2hhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3RhYmxlT3B0aW9ucy5maWx0ZXIpIHtcbiAgICAgICAgZGlzcGxheURhdGFDaGFuZ2VzLnB1c2godGhpcy5fcXVpY2tGaWx0ZXJDaGFuZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdG9yKSB7XG4gICAgICAgIGRpc3BsYXlEYXRhQ2hhbmdlcy5wdXNoKHRoaXMuX3BhZ2luYXRvci5wYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZS52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIGRpc3BsYXlEYXRhQ2hhbmdlcy5wdXNoKHRoaXMuX3ZpcnR1YWxQYWdlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICBkaXNwbGF5RGF0YUNoYW5nZXMucHVzaCh0aGlzLl9jb2x1bW5WYWx1ZUZpbHRlckNoYW5nZSk7XG5cbiAgICBpZiAodGhpcy50YWJsZS5ncm91cGFibGUpIHtcbiAgICAgIGRpc3BsYXlEYXRhQ2hhbmdlcy5wdXNoKHRoaXMuZ3JvdXBCeUNvbHVtbkNoYW5nZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlKC4uLmRpc3BsYXlEYXRhQ2hhbmdlcykucGlwZShcbiAgICAgIG1hcCgoeDogYW55KSA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5fZGF0YWJhc2UuZGF0YSk7XG5cbiAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgIC8vIHJlbmRlciBzdWJzZXQgKHJhbmdlKSBvZiByZW5kZXJlZERhdGEgd2hlbiBuZXcgT25SYW5nZUNoYW5nZVZpcnR1YWxTY3JvbGwgZXZlbnQgaXMgZW1pdHRlZFxuICAgICAgICAgIGRhdGEgPSB0aGlzLmdldFZpcnR1YWxTY3JvbGxEYXRhKHRoaXMucmVuZGVyZWREYXRhLCB4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKlxuICAgICAgICAgICAgaXQgaXMgbmVjZXNzYXJ5IHRvIGZpcnN0IGNhbGN1bGF0ZSB0aGUgY2FsY3VsYXRlZCBjb2x1bW5zIGFuZFxuICAgICAgICAgICAgdGhlbiBmaWx0ZXIgYW5kIHNvcnQgdGhlIGRhdGFcbiAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzQW55Q2FsY3VsYXRlZENvbHVtbigpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmdldENvbHVtbkNhbGN1bGF0ZWREYXRhKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMudGFibGUucGFnZWFibGUpIHtcbiAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJEYXRhKGRhdGEpO1xuICAgICAgICAgICAgICBkYXRhID0gdGhpcy5nZXRRdWlja0ZpbHRlckRhdGEoZGF0YSk7XG4gICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmdldFNvcnRlZERhdGEoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gT2JqZWN0LmFzc2lnbihbXSwgZGF0YSk7XG5cbiAgICAgICAgICBpZiAodGhpcy50YWJsZS5wYWdlYWJsZSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxSZWNvcmRzTnVtYmVyID0gdGhpcy50YWJsZS5nZXRUb3RhbFJlY29yZHNOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c0xlbmd0aCA9IHRvdGFsUmVjb3Jkc051bWJlciAhPT0gdW5kZWZpbmVkID8gdG90YWxSZWNvcmRzTnVtYmVyIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c0xlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuZ2V0UGFnaW5hdGlvbkRhdGEoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnRhYmxlLmdyb3VwYWJsZSAmJiAhVXRpbC5pc0FycmF5RW1wdHkodGhpcy50YWJsZS5ncm91cGVkQ29sdW1uc0FycmF5KSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmdldEdyb3VwZWREYXRhKGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVuZGVyZWREYXRhID0gZGF0YTtcblxuICAgICAgICAgIC8qXG4gICAgICAgICAgICB3aGVuIHRoZSBkYXRhIGlzIHZlcnkgbGFyZ2UsIHRoZSBhcHBsaWNhdGlvbiBjcmFzaGVzIHNvIGl0IGdldHMgYSBsaW1pdGVkIHJhbmdlIG9mIGRhdGEgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICAgIGJlY2F1c2UgYXQgbmV4dCB0aGUgQ3VzdG9tVmlydHVhbFNjcm9sbFN0cmF0ZWd5IHdpbGwgZW1pdCBldmVudCBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbFxuICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHRoaXMudGFibGUudmlydHVhbFNjcm9sbFZpZXdwb3J0ICYmICF0aGlzLl9wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmdldFZpcnR1YWxTY3JvbGxEYXRhKGRhdGEsIG5ldyBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCh7IHN0YXJ0OiAwLCBlbmQ6IENvZGVzLkxJTUlUX1NDUk9MTFZJUlRVQUwgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuYWdncmVnYXRlRGF0YSA9IHRoaXMuZ2V0QWdncmVnYXRlc0RhdGEodGhpcy5yZW5kZXJlZERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9KSk7XG4gIH1cblxuICBnZXRHcm91cGVkRGF0YShkYXRhOiBhbnlbXSkge1xuICAgIGRhdGEgPSB0aGlzLmdldFN1Ykdyb3Vwc09mR3JvdXBlZFJvdyhkYXRhKTtcbiAgICAvKiogZGF0YSBjb250YWlucyByb3cgZ3JvdXAgaGVhZGVycyAoT1RhYmxlR3JvdXBlZFJvdykgYW5kIHRoZSBkYXRhIGJlbG9uZ2luZyB0byBleHBhbmRlZCBncm91cGVkIHJvd3MgKi9cbiAgICBkYXRhID0gdGhpcy5maWx0ZXJDb2xsYXBzZWRSb3dHcm91cChkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHN1Ymdyb3VwcyBvZiBncm91cGVkIHJvd1xuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcmV0dXJucyBzdWJncm91cHMgb2YgZ3JvdXBlZCByb3dcbiAgICovXG4gIGdldFN1Ykdyb3Vwc09mR3JvdXBlZFJvdyhkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YSA9IHRoaXMuZ2V0U3VibGV2ZWwoZGF0YSwgMCk7XG4gIH1cblxuICBnZXRBZ2dyZWdhdGVzRGF0YShkYXRhOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX3RhYmxlT3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPQ29sdW1uKSA9PiB7XG4gICAgICBsZXQgdG90YWxWYWx1ZSA9ICcnO1xuICAgICAgaWYgKGNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLnZpc2libGUpIHtcbiAgICAgICAgdG90YWxWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlQWdncmVnYXRlKGRhdGEsIGNvbHVtbi5hdHRyLCBjb2x1bW4uYWdncmVnYXRlLm9wZXJhdG9yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IGNvbHVtbi5hdHRyO1xuICAgICAgb2JqW2tleV0gPSB0b3RhbFZhbHVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdGhhdCBnZXQgdmFsdWUgdGhlIGNvbHVtbnMgY2FsY3VsYXRlZFxuICAgKiBAcGFyYW0gZGF0YSBkYXRhIG9mIHRoZSBkYXRhYmFzZVxuICAgKi9cbiAgZ2V0Q29sdW1uQ2FsY3VsYXRlZERhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY2FsY3VsYXRlZENvbHMgPSB0aGlzLl90YWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIoKG9Db2w6IE9Db2x1bW4pID0+IG9Db2wudmlzaWJsZSAmJiBvQ29sLmNhbGN1bGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gZGF0YS5tYXAoKHJvdzogYW55KSA9PiB7XG4gICAgICBjYWxjdWxhdGVkQ29scy5mb3JFYWNoKChvQ29sdW1uOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29sdW1uLmNhbGN1bGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHNlbGYudHJhbnNmb3JtRm9ybXVsYShvQ29sdW1uLmNhbGN1bGF0ZSwgcm93KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb0NvbHVtbi5jYWxjdWxhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9Db2x1bW4uY2FsY3VsYXRlKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcm93W29Db2x1bW4uYXR0cl0gPSBpc05hTih2YWx1ZSkgPyAwIDogdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByb3c7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhbnNmb3JtRm9ybXVsYShmb3JtdWxhQXJnLCByb3cpOiBzdHJpbmcge1xuICAgIGxldCBmb3JtdWxhID0gZm9ybXVsYUFyZztcbiAgICAvLyAxLiByZXBsYWNlIGNvbHVtbnMgYnkgdmFsdWVzIG9mIHJvd1xuICAgIGNvbnN0IGNvbHVtbnNBdHRyID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMubWFwKChvQ29sOiBPQ29sdW1uKSA9PiBvQ29sLmF0dHIpO1xuICAgIGNvbHVtbnNBdHRyLmZvckVhY2goKGNvbHVtbjogc3RyaW5nKSA9PiB7XG4gICAgICBmb3JtdWxhID0gZm9ybXVsYS5yZXBsYWNlKGNvbHVtbiwgcm93W2NvbHVtbl0pO1xuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdEZvcm11bGEgPSAnJztcbiAgICAvLyAyLiBUcmFuc2Zvcm0gZm9ybXVsYVxuICAgIHRyeSB7XG4gICAgICByZXN1bHRGb3JtdWxhID0gKG5ldyBGdW5jdGlvbigncmV0dXJuICcgKyBmb3JtdWxhKSkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gZGVmaW5lZCBpbiB0aGUgY2FsY3VsYXRlZCBjb2x1bW4gaXMgaW5jb3JyZWN0ICcpO1xuICAgIH1cbiAgICAvLyAzLiBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdEZvcm11bGE7XG4gIH1cblxuICBnZXRRdWlja0ZpbHRlckRhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXIpICYmIHRoaXMucXVpY2tGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsdGVyRGF0YSA9ICF0aGlzLl90YWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA/IHRoaXMucXVpY2tGaWx0ZXIudG9Mb3dlckNhc2UoKSA6IHRoaXMucXVpY2tGaWx0ZXI7XG4gICAgICByZXR1cm4gZGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAvLyBHZXR0aW5nIGN1c3RvbSBjb2x1bW5zIGZpbHRlciBjb2x1bW5zIHJlc3VsdFxuICAgICAgICBjb25zdCBwYXNzQ3VzdG9tRmlsdGVyID0gdGhpcy5mdWxmaWxsc0N1c3RvbUZpbHRlckZ1bmN0aW9ucyhmaWx0ZXJEYXRhLCBpdGVtKTtcbiAgICAgICAgLy8gR2V0dGluZyBvdGhlciBzZWFyY2hhYmxlIGNvbHVtbnMgc3RhbmRhcmQgcmVzdWx0XG4gICAgICAgIGNvbnN0IHBhc3NTZWFyY2hTdHJpbmcgPSB0aGlzLmZ1bGZpbGxzUXVpY2tmaWx0ZXIoZmlsdGVyRGF0YSwgaXRlbSk7XG4gICAgICAgIHJldHVybiBwYXNzQ3VzdG9tRmlsdGVyIHx8IHBhc3NTZWFyY2hTdHJpbmc7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFnaW5hdGlvbkRhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLl9wYWdpbmF0b3IgfHwgaXNOYU4odGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGxldCBzdGFydEluZGV4ID0gaXNOYU4odGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplKSA/IDAgOiB0aGlzLl9wYWdpbmF0b3IucGFnZUluZGV4ICogdGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplO1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgZGF0YS5sZW5ndGggPCBzdGFydEluZGV4KSB7XG4gICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgIHRoaXMuX3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zcGxpY2Uoc3RhcnRJbmRleCwgdGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldFZpcnR1YWxTY3JvbGxEYXRhKGRhdGE6IGFueVtdLCB4OiBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5zbGljZSh4LnJhbmdlLnN0YXJ0LCB4LnJhbmdlLmVuZClcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5kYXRhVG90YWxzQ2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLl9jb2x1bW5WYWx1ZUZpbHRlckNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZ3JvdXBCeUNvbHVtbkNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3ZpcnR1YWxQYWdlQ2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnVsZmlsbHNDdXN0b21GaWx0ZXJGdW5jdGlvbnMoZmlsdGVyOiBzdHJpbmcsIGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGN1c3RvbUZpbHRlckNvbHMgPSB0aGlzLnRhYmxlLm9UYWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIob0NvbCA9PiBvQ29sLnVzZUN1c3RvbUZpbHRlckZ1bmN0aW9uKCkpO1xuICAgIHJldHVybiBjdXN0b21GaWx0ZXJDb2xzLnNvbWUob0NvbCA9PiBvQ29sLnJlbmRlcmVyLmZpbHRlckZ1bmN0aW9uKGl0ZW1bb0NvbC5hdHRyXSwgaXRlbSwgZmlsdGVyKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnVsZmlsbHNRdWlja2ZpbHRlcihmaWx0ZXI6IHN0cmluZywgaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX3RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcigob0NvbDogT0NvbHVtbikgPT4gb0NvbC51c2VRdWlja2ZpbHRlckZ1bmN0aW9uKCkpO1xuICAgIGxldCBzZWFyY2hTdHIgPSBjb2x1bW5zLm1hcCgob0NvbDogT0NvbHVtbikgPT4gb0NvbC5nZXRGaWx0ZXJWYWx1ZShpdGVtW29Db2wuYXR0cl0sIGl0ZW0pLmpvaW4oJyAnKSkuam9pbignICcpO1xuICAgIGlmICghdGhpcy5fdGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUpIHtcbiAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc2VhcmNoU3RyLmluZGV4T2YoZmlsdGVyKSAhPT0gLTE7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIHNvcnRlZCBjb3B5IG9mIHRoZSBkYXRhYmFzZSBkYXRhLiAqL1xuICBwcm90ZWN0ZWQgZ2V0U29ydGVkRGF0YShkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIXRoaXMuX3NvcnQpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHJlbmRlcmVyRGF0YSA9IHRoaXMuZ2V0RGF0YVRvU29ydChkYXRhKTtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gdGhpcy5fc29ydC5nZXRTb3J0ZWREYXRhKHJlbmRlcmVyRGF0YSk7XG5cbiAgICBjb25zdCB0YWJsZUtleXMgPSB0aGlzLnRhYmxlLmdldEtleXMoKTtcbiAgICBjb25zdCBvcmlnaW5hbERhdGFTb3J0ZWQgPSBbXTtcblxuICAgIHNvcnRlZERhdGEuZm9yRWFjaChzb3J0ZWRFbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGtleXNWYWx1ZXNJblNvcnREYXRhID0gdGFibGVLZXlzLm1hcChlbGVtZW50ID0+IHNvcnRlZEVsZW1lbnRbZWxlbWVudF0pO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGggJiYgIWZvdW5kKSB7XG4gICAgICAgIGNvbnN0IGtleXNWYWx1ZXNJbkRhdGEgPSB0YWJsZUtleXMubWFwKGVsZW1lbnQgPT4gZGF0YVtpXVtlbGVtZW50XSk7XG4gICAgICAgIGlmIChVdGlsLmlzQXJyYXlFcXVhbChrZXlzVmFsdWVzSW5Tb3J0RGF0YSwga2V5c1ZhbHVlc0luRGF0YSkpIHtcbiAgICAgICAgICBvcmlnaW5hbERhdGFTb3J0ZWQucHVzaChkYXRhW2ldKTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudGFibGUudXBkYXRlU29ydGluZ1N1YmplY3QoZmFsc2UpO1xuICAgIHJldHVybiBvcmlnaW5hbERhdGFTb3J0ZWQ7XG5cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRhdGEgdGhlIHRhYmxlIHN0b3Jlcy4gTm8gZmlsdGVycyBhcmUgYXBwbGllZC5cbiAgICovXG4gIGdldFRhYmxlRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlLmRhdGE7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGEgb2YgdGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUgd2l0aG91dCByZW5kZXJpbmcgKi9cbiAgZ2V0Q3VycmVudERhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmdldERhdGEoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRBbGxEYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxEYXRhKGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGEgb2YgdGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUgIHJlbmRlcmluZyAqL1xuICBnZXRDdXJyZW50UmVuZGVyZXJEYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlZERhdGEodGhpcy5yZW5kZXJlZERhdGEpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZGF0YSBvZiB0aGUgdGFibGUgcmVuZGVyaW5nICovXG4gIGdldEFsbFJlbmRlcmVyRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsRGF0YSh0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3FsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGRhdGEgKi9cbiAgZ2V0IHNxbFR5cGVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlLnNxbFR5cGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldFJlbmRlcmVkRGF0YShkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuX3RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihvQ29sID0+IG9Db2wudmlzaWJsZSk7XG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgdmlzaWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbDogT0NvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCB1c2VSZW5kZXJlciA9IG9Db2wucmVuZGVyZXIgJiYgb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YTtcbiAgICAgICAgb2JqW29Db2wuYXR0cl0gPSB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVRvU29ydChkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIXRoaXMuX3NvcnQpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKG9Db2wgPT4gb0NvbC52aXNpYmxlICYmIHRoaXMuX3NvcnQuYWN0aXZlQXJyYXkubWFwKHggPT4geC5pZCkuaW5kZXhPZihvQ29sLmF0dHIpID4gLTEpO1xuICAgIGNvbnN0IGV4aXN0Q29sdW1uVG9UcmFzZm9ybVRvU29ydCA9IHNvcnRDb2x1bW5zLmZpbHRlcigob0NvbDogT0NvbHVtbikgPT4gKG9Db2wudHlwZSA9PT0gJ3RyYW5zbGF0ZScgfHwgb0NvbC50eXBlID09PSAnc2VydmljZScpKS5sZW5ndGggPiAwO1xuICAgIGlmICghZXhpc3RDb2x1bW5Ub1RyYXNmb3JtVG9Tb3J0KSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdGhpcy50YWJsZS5nZXRLZXlzKCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgc29ydENvbHVtbnMucHVzaCh0aGlzLnRhYmxlLmdldE9Db2x1bW4oa2V5KSk7XG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIHNvcnRDb2x1bW5zLmZvckVhY2goKG9Db2w6IE9Db2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgdXNlUmVuZGVyZXIgPSBvQ29sLnJlbmRlcmVyICYmIChvQ29sLnR5cGUgPT09ICd0cmFuc2xhdGUnIHx8IG9Db2wudHlwZSA9PT0gJ3NlcnZpY2UnKSAmJiBvQ29sLnJlbmRlcmVyLmdldENlbGxEYXRhO1xuICAgICAgICBvYmpbb0NvbC5hdHRyXSA9IHVzZVJlbmRlcmVyID8gb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YShyb3dbb0NvbC5hdHRyXSwgcm93KSA6IHJvd1tvQ29sLmF0dHJdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFsbERhdGEodXNpbmdSZW5kZXJlcmVycz86IGJvb2xlYW4sIG9ubHlWaXNpYmxlQ29sdW1ucz86IGJvb2xlYW4pIHtcbiAgICBsZXQgdGFibGVDb2x1bW5zID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnM7XG4gICAgaWYgKG9ubHlWaXNpYmxlQ29sdW1ucykge1xuICAgICAgdGFibGVDb2x1bW5zID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKG9Db2wgPT4gb0NvbC52aXNpYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZVJlbmRlcmVyID0gdXNpbmdSZW5kZXJlcmVycyAmJiBvQ29sLnJlbmRlcmVyICYmIG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGE7XG4gICAgICAgIG9ialtvQ29sLmF0dHJdID0gdXNlUmVuZGVyZXIgPyBvQ29sLnJlbmRlcmVyLmdldENlbGxEYXRhKHJvd1tvQ29sLmF0dHJdLCByb3cpIDogcm93W29Db2wuYXR0cl07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlbmRlcmVyc0RhdGEoZGF0YTogYW55W10sIHRhYmxlQ29sdW1uczogT0NvbHVtbltdKTogYW55W10ge1xuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICAvLyByZW5kZXIgZWFjaCBjb2x1bW5cbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHJvdyk7XG4gICAgICB0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbDogT0NvbHVtbikgPT4ge1xuICAgICAgICBvYmpbb0NvbC5hdHRyXSA9IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uRGF0YShvY29sdW1uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZERhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIC8vIHJlbmRlciBlYWNoIGNvbHVtblxuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICBpZiAob2NvbHVtbikge1xuICAgICAgICBvYmpbb2NvbHVtbl0gPSByb3dbb2NvbHVtbl07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUNvbHVtbnNGaWx0ZXJzKGZpbHRlcnM6IE9Db2x1bW5WYWx1ZUZpbHRlcltdKSB7XG4gICAgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMgPSBbXTtcbiAgICBmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMudGFibGUucGFnZWFibGUpIHtcbiAgICAgIHRoaXMuX2NvbHVtblZhbHVlRmlsdGVyQ2hhbmdlLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgaXNDb2x1bW5WYWx1ZUZpbHRlckFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCk6IE9Db2x1bW5WYWx1ZUZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnM7XG4gIH1cblxuICBnZXRDb2x1bW5WYWx1ZUZpbHRlckJ5QXR0cihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uVmFsdWVGaWx0ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblZhbHVlRmlsdGVycy5maW5kKGl0ZW0gPT4gaXRlbS5hdHRyID09PSBhdHRyKTtcbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyOiBib29sZWFuID0gdHJ1ZSwgY29sdW1uc0F0dHI/OiBzdHJpbmdbXSkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW5zQXR0cikpIHtcbiAgICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzID0gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMuZmlsdGVyKHggPT4gIWNvbHVtbnNBdHRyLmluY2x1ZGVzKHguYXR0cikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtblZhbHVlRmlsdGVycyA9IFtdO1xuICAgIH1cbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgdGhpcy5fY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckNvbHVtbkZpbHRlcihhdHRyOiBzdHJpbmcsIHRyaWdnZXI6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMgPSB0aGlzLmNvbHVtblZhbHVlRmlsdGVycy5maWx0ZXIoeCA9PiB4LmF0dHIgIT09IGF0dHIpO1xuICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICB0aGlzLl9jb2x1bW5WYWx1ZUZpbHRlckNoYW5nZS5uZXh0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGFkZENvbHVtbkZpbHRlcihmaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIGNvbnN0IGV4aXN0aW5nRmlsdGVySW5kZXggPSB0aGlzLmNvbHVtblZhbHVlRmlsdGVycy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmF0dHIgPT09IGZpbHRlci5hdHRyKTtcbiAgICBpZiAoZXhpc3RpbmdGaWx0ZXJJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmNvbHVtblZhbHVlRmlsdGVycy5zcGxpY2UoZXhpc3RpbmdGaWx0ZXJJbmRleCwgMSwgZmlsdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHZhbGlkRmlsdGVyID0gVXRpbC5pc0RlZmluZWQoZmlsdGVyLnZhbHVlcyk7XG4gICAgICBpZiAodmFsaWRGaWx0ZXIpIHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXIub3BlcmF0b3IpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgICB2YWxpZEZpbHRlciA9IGZpbHRlci52YWx1ZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOOlxuICAgICAgICAgICAgdmFsaWRGaWx0ZXIgPSBmaWx0ZXIudmFsdWVzLmxlbmd0aCA9PT0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5FUVVBTDpcbiAgICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTEVTU19FUVVBTDpcbiAgICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTU9SRV9FUVVBTDpcbiAgICAgICAgICAgIHZhbGlkRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YWxpZEZpbHRlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZEZpbHRlcikge1xuICAgICAgICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGUgdGFibGUgaXMgcGFnaW5hdGVkLCBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIG9uIHJlbW90ZSBxdWVyeVxuICAgIGlmICghdGhpcy50YWJsZS5wYWdlYWJsZSkge1xuICAgICAgdGhpcy5fY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb2x1bW5WYWx1ZUZpbHRlckRhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyQ29sdW1uID0gdGhpcy50YWJsZS5vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLmF0dHIgPT09IGZpbHRlci5hdHRyKTtcbiAgICAgIGlmIChmaWx0ZXJDb2x1bW4pIHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXIub3BlcmF0b3IpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZXMgPSAoZmlsdGVyLnZhbHVlcyB8fCBbXSkucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgcHJldmlvdXMuY29uY2F0KGZpbHRlckNvbHVtbi5nZXRGaWx0ZXJWYWx1ZShjdXJyZW50KS5tYXAoZiA9PiBVdGlsLm5vcm1hbGl6ZVN0cmluZyhmKSkpLCBbXSk7XG5cbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJDb2x1bW4ucmVuZGVyZXIgJiYgZmlsdGVyQ29sdW1uLnJlbmRlcmVyLmZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckNvbHVtbi5yZW5kZXJlci5maWx0ZXJGdW5jdGlvbihpdGVtW2ZpbHRlci5hdHRyXSwgaXRlbSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sVmFsdWVzID0gZmlsdGVyQ29sdW1uLmdldEZpbHRlclZhbHVlKGl0ZW1bZmlsdGVyLmF0dHJdLCBpdGVtKS5tYXAoZiA9PiBVdGlsLm5vcm1hbGl6ZVN0cmluZyhmKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclZhbHVlcy5zb21lKHZhbHVlID0+IGNvbFZhbHVlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5FUVVBTDpcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFV0aWwubm9ybWFsaXplU3RyaW5nKGZpbHRlci52YWx1ZXMpO1xuICAgICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2xWYWx1ZXMgPSBmaWx0ZXJDb2x1bW4uZ2V0RmlsdGVyVmFsdWUoaXRlbVtmaWx0ZXIuYXR0cl0sIGl0ZW0pLm1hcChmID0+IFV0aWwubm9ybWFsaXplU3RyaW5nKGYpKTtcbiAgICAgICAgICAgICAgbGV0IHJlZ0V4cDtcbiAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZS5pbmNsdWRlcygnKicpKSB7XG4gICAgICAgICAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cCgnXicgKyBub3JtYWxpemVkVmFsdWUuc3BsaXQoJyonKS5qb2luKCcuKicpICsgJyQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gY29sVmFsdWVzLnNvbWUoY29sVmFsdWUgPT4gcmVnRXhwID8gcmVnRXhwLnRlc3QoY29sVmFsdWUpIDogY29sVmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcyhub3JtYWxpemVkVmFsdWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkJFVFdFRU46XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtW2ZpbHRlci5hdHRyXSA+PSBmaWx0ZXIudmFsdWVzWzBdICYmIGl0ZW1bZmlsdGVyLmF0dHJdIDw9IGZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLk1PUkVfRVFVQUw6XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtW2ZpbHRlci5hdHRyXSA+PSBmaWx0ZXIudmFsdWVzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5MRVNTX0VRVUFMOlxuICAgICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbVtmaWx0ZXIuYXR0cl0gPD0gZmlsdGVyLnZhbHVlcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0QWdncmVnYXRlRGF0YShjb2x1bW46IE9Db2x1bW4pIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBsZXQgdG90YWxWYWx1ZSA9ICcnO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl90YWJsZU9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5KG9iaik7XG4gICAgfVxuICAgIHRvdGFsVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0ZURhdGFbY29sdW1uLmF0dHJdO1xuICAgIHJldHVybiB0b3RhbFZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZUFnZ3JlZ2F0ZShkYXRhOiBhbnlbXSwgY29sdW1uQXR0cjogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nIHwgRnVuY3Rpb24pOiBhbnkge1xuICAgIGxldCByZXN1bHRBZ2dyZWdhdGU7XG4gICAgaWYgKHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN3aXRjaCAob3BlcmF0b3IudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdjb3VudCc6XG4gICAgICAgICAgcmVzdWx0QWdncmVnYXRlID0gdGhpcy5jb3VudChjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLm1pbihjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLm1heChjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXZnJzpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLmF2Zyhjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLnN1bShjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sdW1uRGF0YTogYW55W10gPSB0aGlzLmdldENvbHVtbkRhdGEoY29sdW1uQXR0cik7XG4gICAgICBpZiAodHlwZW9mIG9wZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdEFnZ3JlZ2F0ZSA9IG9wZXJhdG9yKGNvbHVtbkRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0QWdncmVnYXRlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1bShjb2x1bW4sIGRhdGEpOiBudW1iZXIge1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIC8vSWYgdGhlIGRhdGEgaXMgZ3JvdXBlZCwgdGhlIHZhbHVlcyDigIvigItvZiB0aGUgc3ViZ3JvdXBzIGluIGxldmVsIDEgYXJlIHN1bW1lZFxuICAgICAgaWYgKGRhdGFbMF0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YUZyb21GaXJzdExldmVsVGFibGVHcm91cFJvdyhkYXRhKS5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgIHZhbHVlID0geC5nZXRDb2x1bW5BZ2dyZWdhdGVEYXRhKGNvbHVtbikucmVkdWNlKChhY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3VtdWxhdG9yICsgKGlzTmFOKGN1cnJlbnRWYWx1ZVtjb2x1bW5dKSA/IDAgOiBjdXJyZW50VmFsdWVbY29sdW1uXSk7XG4gICAgICAgICAgfSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGF0YS5yZWR1Y2UoKGFjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhY3VtdWxhdG9yICsgKGlzTmFOKGN1cnJlbnRWYWx1ZVtjb2x1bW5dKSA/IDAgOiBjdXJyZW50VmFsdWVbY29sdW1uXSk7XG4gICAgICAgIH0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICsodmFsdWUpLnRvRml4ZWQoMik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY291bnQoY29sdW1uLCBkYXRhKTogbnVtYmVyIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAvL0lmIHRoZSBkYXRhIGlzIGdyb3VwZWQsIHRoZSBjb3VudCBpcyBjYWxjdWxhdGVkIGJ5IGFkZGluZyB0aGUgY291bnRzIGZvciBlYWNoIHN1Ymdyb3VwIGluIGxldmVsIDFcbiAgICAgIGlmIChkYXRhWzBdIGluc3RhbmNlb2YgT1RhYmxlR3JvdXBlZFJvdykge1xuICAgICAgICB0aGlzLmdldERhdGFGcm9tRmlyc3RMZXZlbFRhYmxlR3JvdXBSb3coZGF0YSkuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICB2YWx1ZSA9IHguZ2V0Q29sdW1uQWdncmVnYXRlRGF0YShjb2x1bW4pLnJlZHVjZSgoYWN1bXVsYXRvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdW11bGF0b3IgKyAxO1xuICAgICAgICAgIH0sIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRhdGEucmVkdWNlKChhY3VtdWxhdG9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFjdW11bGF0b3IgKyAxO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGF2Zyhjb2x1bW4sIGRhdGEpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsU3VtID0gdGhpcy5zdW0oY29sdW1uLCBkYXRhKTtcbiAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy5jb3VudChjb2x1bW4sIGRhdGEpO1xuICAgIHJldHVybiArKCh0b3RhbFN1bSA9PT0gMCB8fCB0b3RhbENvdW50ID09PSAwKSA/IDAgOiAodG90YWxTdW0gLyB0b3RhbENvdW50KSkudG9GaXhlZCgyKTtcblxuICB9XG5cbiAgcHJvdGVjdGVkIG1pbihjb2x1bW4sIGRhdGEpOiBudW1iZXIge1xuICAgIGxldCB0ZW1wTWluID0gW107XG4gICAgLy9JZiB0aGUgZGF0YSBpcyBncm91cGVkLCB0aGUgbWluaW11bSBpcyBjYWxjdWxhdGVkIHdpdGggdGhlIG1pbmltdW0gb2YgZWFjaCBzdWJncm91cCBpbiBsZXZlbCAxXG4gICAgaWYgKGRhdGFbMF0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgICB0ZW1wTWluID0gdGhpcy5nZXREYXRhRnJvbUZpcnN0TGV2ZWxUYWJsZUdyb3VwUm93KGRhdGEpLm1hcCh4ID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKC4uLnguZ2V0Q29sdW1uQWdncmVnYXRlRGF0YShjb2x1bW4pLm1hcCh4ID0+IHhbY29sdW1uXSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBNaW4gPSBkYXRhLm1hcCh4ID0+IHhbY29sdW1uXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBNaW4ubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLnRlbXBNaW4pIDogMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXgoY29sdW1uLCBkYXRhKTogbnVtYmVyIHtcbiAgICBsZXQgdGVtcE1heCA9IFtdO1xuICAgIGlmIChkYXRhWzBdIGluc3RhbmNlb2YgT1RhYmxlR3JvdXBlZFJvdykge1xuICAgICAgLy9JZiB0aGUgZGF0YSBhcmUgZ3JvdXBlZCwgdGhlIG1heGltdW0gaXMgY2FsY3VsYXRlZCB3aXRoIHRoZSBtYXhpbXVtIG9mIGVhY2ggc3ViZ3JvdXAgaW4gbGV2ZWwgMVxuICAgICAgdGVtcE1heCA9IHRoaXMuZ2V0RGF0YUZyb21GaXJzdExldmVsVGFibGVHcm91cFJvdyhkYXRhKS5tYXAoeCA9PiB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCguLi54LmdldENvbHVtbkFnZ3JlZ2F0ZURhdGEoY29sdW1uKS5tYXAoeCA9PiB4W2NvbHVtbl0pKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wTWF4ID0gZGF0YS5tYXAoeCA9PiB4W2NvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcE1heC5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4udGVtcE1heCkgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ZpcnN0TGV2ZWxUYWJsZUdyb3VwUm93KHRhYmxlUm93R3JvdXBEYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGFibGVSb3dHcm91cERhdGEgaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93ICYmIHRhYmxlUm93R3JvdXBEYXRhLmxldmVsID09PSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhRnJvbUZpcnN0TGV2ZWxUYWJsZUdyb3VwUm93KGRhdGE6IGFueSkge1xuICAgIHJldHVybiBkYXRhLmZpbHRlcih4ID0+IHRoaXMuaXNGaXJzdExldmVsVGFibGVHcm91cFJvdyh4KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXhpc3RzQW55Q2FsY3VsYXRlZENvbHVtbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZmluZCgob0NvbDogT0NvbHVtbikgPT4gb0NvbC5jYWxjdWxhdGUgIT09IHVuZGVmaW5lZCkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZVJlbmRlcmVkUm93RGF0YShyb3dEYXRhOiBhbnkpIHtcbiAgICBjb25zdCB0YWJsZUtleXMgPSB0aGlzLnRhYmxlLmdldEtleXMoKTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlbmRlcmVkRGF0YS5maW5kKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGxldCBmb3VuZCA9IHRydWU7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGFibGVLZXlzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRhYmxlS2V5c1tpXTtcbiAgICAgICAgaWYgKGRhdGFba2V5XSAhPT0gcm93RGF0YVtrZXldKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH0pO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChyZWNvcmQpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgcm93RGF0YSk7XG4gICAgfVxuICB9XG5cblxuICBwcml2YXRlIGdldERhdGFJbmZvcm1hdGlvbkJ5R3JvdXAoZGF0YTogYW55W10sIGxldmVsOiBudW1iZXIpIHtcbiAgICBjb25zdCByZWNvcmRIYXNoID0ge307XG4gICAgZGF0YS5mb3JFYWNoKChyb3csIGkpID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSB7fTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAga2V5c1t0aGlzLnRhYmxlLmdyb3VwZWRDb2x1bW5zQXJyYXlbaV1dID0gdGhpcy50YWJsZS5nZXRDb2x1bW5EYXRhQnlBdHRyKHRoaXMudGFibGUuZ3JvdXBlZENvbHVtbnNBcnJheVtpXSwgcm93KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IEpTT04uc3RyaW5naWZ5KGtleXMpO1xuICAgICAgaWYgKHJlY29yZEhhc2guaGFzT3duUHJvcGVydHkocmVjb3JkS2V5KSkge1xuICAgICAgICByZWNvcmRIYXNoW3JlY29yZEtleV0ucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZEhhc2hbcmVjb3JkS2V5XSA9IFtpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVjb3JkSGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgcmVjYWxjdWxhdGVDb2x1bW5BZ2dyZWdhdGUoY29sdW1uQXR0cjogc3RyaW5nLCByb3c6IE9UYWJsZUdyb3VwZWRSb3cpIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVDb25mID0gcm93LmdldEFjdGl2ZUNvbHVtbkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24oY29sdW1uQXR0cik7XG4gICAgY29uc3QgZGF0YSA9IHJvdy5nZXRDb2x1bW5BZ2dyZWdhdGVEYXRhKGNvbHVtbkF0dHIpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYWxjdWxhdGVBZ2dyZWdhdGUoZGF0YSwgYWdncmVnYXRlQ29uZi5hdHRyLCBhZ2dyZWdhdGVDb25mLmFnZ3JlZ2F0ZUZ1bmN0aW9uIHx8IGFnZ3JlZ2F0ZUNvbmYuYWdncmVnYXRlKTtcbiAgICByb3cuc2V0Q29sdW1uQWdncmVnYXRlVmFsdWUoY29sdW1uQXR0ciwgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdWJsZXZlbChkYXRhOiBhbnlbXSwgbGV2ZWw6IG51bWJlciwgcGFyZW50PzogT1RhYmxlR3JvdXBlZFJvdyk6IGFueVtdIHtcbiAgICBpZiAobGV2ZWwgPj0gdGhpcy50YWJsZS5ncm91cGVkQ29sdW1uc0FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHJlY29yZEhhc2ggPSB0aGlzLmdldERhdGFJbmZvcm1hdGlvbkJ5R3JvdXAoZGF0YSwgbGV2ZWwpO1xuXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHJlY29yZEhhc2gpLmZvckVhY2gocmVjb3JkS2V5ID0+IHtcblxuICAgICAgY29uc3Qgcm93ID0gbmV3IE9UYWJsZUdyb3VwZWRSb3coe1xuICAgICAgICBjb2x1bW46IHRoaXMudGFibGUuZ3JvdXBlZENvbHVtbnNBcnJheVtsZXZlbF0sXG4gICAgICAgIGtleXNBc1N0cmluZzogcmVjb3JkS2V5LFxuICAgICAgICBsZXZlbDogbGV2ZWwgKyAxLFxuICAgICAgICBwYXJlbnQ6IHBhcmVudFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ3JvdXBlZFJvd3NTdWJzY3JpcHRpb24uYWRkKHJvdy5hZ2dyZWdhdGVGdW5jdGlvbkNoYW5nZS5zdWJzY3JpYmUoYXJnID0+IHtcbiAgICAgICAgaWYgKGFyZy5jaGFuZ2VBbGxHcm91cGVkUm93cykge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQWdncmVnYXRlc1thcmcuY29sdW1uQXR0cl0gPSBhcmcuYWN0aXZlQWdncmVnYXRlO1xuICAgICAgICAgIHRoaXMucmVuZGVyZWREYXRhLmZpbHRlcihyb3cgPT4gcm93IGluc3RhbmNlb2YgT1RhYmxlR3JvdXBlZFJvdykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgcm93LnNldENvbHVtbkFjdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKGFyZy5jb2x1bW5BdHRyLCBhcmcuYWN0aXZlQWdncmVnYXRlLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQ29sdW1uQWdncmVnYXRlKGFyZy5jb2x1bW5BdHRyLCByb3cpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVjYWxjdWxhdGVDb2x1bW5BZ2dyZWdhdGUoYXJnLmNvbHVtbkF0dHIsIGFyZy5yb3cpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICBjb25zdCBhZmZlY3RlZEluZGV4ZXMgPSByZWNvcmRIYXNoW3Jvdy5rZXlzQXNTdHJpbmddO1xuICAgICAgY29uc3QgZ3JvdXBEYXRhID0gZGF0YS5maWx0ZXIoKHJvdywgaW5kZXgpID0+IGFmZmVjdGVkSW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICAgICAgdGhpcy50YWJsZS52aXNpYmxlQ29sQXJyYXkuZm9yRWFjaCgoY29sdW1uQXR0ciwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgIHJvdy50aXRsZSA9IHRoaXMuZ2V0VGV4dEdyb3VwUm93KHJvdywgYWZmZWN0ZWRJbmRleGVzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlQ29sdW1uQWdncmVnYXRlID0gdGhpcy50YWJsZS51c2VDb2x1bW5Hcm91cGluZ0FnZ3JlZ2F0ZShjb2x1bW5BdHRyKTtcbiAgICAgICAgaWYgKHVzZUNvbHVtbkFnZ3JlZ2F0ZSkge1xuICAgICAgICAgIHJvdy5pbml0aWFsaXplQ29sdW1uQWdncmVnYXRlKGNvbHVtbkF0dHIsIHRoaXMudGFibGUuZ2V0Q29sdW1uR3JvdXBpbmdDb21wb25lbnQoY29sdW1uQXR0cikpO1xuXG4gICAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuYWN0aXZlQWdncmVnYXRlc1tjb2x1bW5BdHRyXSkpIHtcbiAgICAgICAgICAgIHJvdy5zZXRDb2x1bW5BY3RpdmVBZ2dyZWdhdGVGdW5jdGlvbihjb2x1bW5BdHRyLCB0aGlzLmFjdGl2ZUFnZ3JlZ2F0ZXNbY29sdW1uQXR0cl0sIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocm93Lmhhc0FjdGl2ZUFnZ3JlZ2F0ZShjb2x1bW5BdHRyKSkge1xuICAgICAgICAgICAgY29uc3QgYWdncmVnYXRlRGF0YSA9IGdyb3VwRGF0YS5tYXAoeCA9PiB7IGNvbnN0IG9iaiA9IHt9OyBvYmpbY29sdW1uQXR0cl0gPSB4W2NvbHVtbkF0dHJdOyByZXR1cm4gb2JqOyB9KTtcbiAgICAgICAgICAgIHJvdy5zZXRDb2x1bW5BZ2dyZWdhdGVEYXRhKGNvbHVtbkF0dHIsIGFnZ3JlZ2F0ZURhdGEpO1xuXG4gICAgICAgICAgICBjb25zdCBhZ2dyZWdhdGVDb25mID0gcm93LmdldEFjdGl2ZUNvbHVtbkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24oY29sdW1uQXR0cik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY2FsY3VsYXRlQWdncmVnYXRlKGFnZ3JlZ2F0ZURhdGEsIGFnZ3JlZ2F0ZUNvbmYuYXR0ciwgYWdncmVnYXRlQ29uZi5hZ2dyZWdhdGVGdW5jdGlvbiB8fCBhZ2dyZWdhdGVDb25mLmFnZ3JlZ2F0ZSk7XG4gICAgICAgICAgICByb3cuc2V0Q29sdW1uQWdncmVnYXRlVmFsdWUoY29sdW1uQXR0ciwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByb3cuZXhwYW5kZWQgPSB0aGlzLmdldEV4cGFuc2lvblN0YXRlKHJvdyk7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IHRoaXMuZ2V0U3VibGV2ZWwoZ3JvdXBEYXRhLCBsZXZlbCArIDEsIHJvdyk7XG4gICAgICBzdWJHcm91cC51bnNoaWZ0KHJvdyk7XG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgY29sbGFwc2VkIHJvdyBncm91cFxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcmV0dXJucyBjb2xsYXBzZWQgcm93IGdyb3VwXG4gICAqL1xuICBmaWx0ZXJDb2xsYXBzZWRSb3dHcm91cChkYXRhOiBhbnkpOiBhbnlbXSB7XG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKChyb3c6IGFueSkgPT4gKHJvdyBpbnN0YW5jZW9mIE9UYWJsZUdyb3VwZWRSb3cpID8gcm93LnZpc2libGUgOiB0aGlzLmJlbG9uZ3NUb0V4cGFuZGVkR3JvdXBlZFJvdyhkYXRhLCByb3cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWxvbmdzIHRvIGFuIGV4cGFuZGVkIGdyb3VwZWQgcm93XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0byBleHBhbmRlZCBncm91cGVkIHJvd1xuICAgKi9cbiAgYmVsb25nc1RvRXhwYW5kZWRHcm91cGVkUm93KGRhdGE6IGFueSwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgcGFyZW50OiBPVGFibGVHcm91cGVkUm93O1xuICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aCAmJiAhbWF0Y2g7IGluZGV4KyspIHtcbiAgICAgIGlmIChkYXRhW2luZGV4XSBpbnN0YW5jZW9mIE9UYWJsZUdyb3VwZWRSb3cpIHtcbiAgICAgICAgcGFyZW50ID0gZGF0YVtpbmRleF07XG4gICAgICB9IGVsc2UgaWYgKFV0aWwuaXNFcXVpdmFsZW50KGRhdGFbaW5kZXhdLCByb3cpKSB7XG4gICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHBhcmVudCkgPyAocGFyZW50LnZpc2libGUgJiYgcGFyZW50LmV4cGFuZGVkKSA6IHRydWU7XG4gIH1cblxuICB1cGRhdGVHcm91cGVkQ29sdW1ucygpIHtcbiAgICB0aGlzLmdyb3VwQnlDb2x1bW5DaGFuZ2UubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgZ3JvdXAgYnkgY29sdW1uXG4gICAqIEBwYXJhbSByb3dHcm91cFxuICAgKi9cbiAgdG9nZ2xlR3JvdXBCeUNvbHVtbihyb3dHcm91cDogT1RhYmxlR3JvdXBlZFJvdykge1xuICAgIGlmIChyb3dHcm91cC5leHBhbmRTYW1lTGV2ZWwodGhpcy50YWJsZS5leHBhbmRHcm91cHNTYW1lTGV2ZWwpKSB7XG4gICAgICB0aGlzLmxldmVsc0V4cGFuc2lvblN0YXRlW3Jvd0dyb3VwLmxldmVsXSA9ICFyb3dHcm91cC5leHBhbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZVJvd0dyb3VwZWQocm93R3JvdXApO1xuICAgIH1cbiAgICB0aGlzLmdyb3VwQnlDb2x1bW5DaGFuZ2UubmV4dCgpO1xuICB9XG5cbiAgc2V0Um93R3JvdXBMZXZlbEV4cGFuc2lvbihyb3dHcm91cDogT1RhYmxlR3JvdXBlZFJvdywgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxldmVsc0V4cGFuc2lvblN0YXRlW3Jvd0dyb3VwLmxldmVsXSA9IHZhbHVlO1xuICAgIHRoaXMuZ3JvdXBCeUNvbHVtbkNoYW5nZS5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXRlUm93R3JvdXBlZChyb3dHcm91cDogT1RhYmxlR3JvdXBlZFJvdykge1xuICAgIGNvbnN0IHN0YXRlUm93R3JvdXBlZCA9IHRoaXMuZ3JvdXBlZFJvd1N0YXRlLmZpbmQocm93ID0+IHJvd0dyb3VwLmtleXNBc1N0cmluZyA9PT0gcm93LmtleXNBc1N0cmluZyAmJiBKU09OLnN0cmluZ2lmeShyb3dHcm91cC5wYXJlbnQpID09PSBKU09OLnN0cmluZ2lmeShyb3cucGFyZW50KSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHN0YXRlUm93R3JvdXBlZCkpIHtcbiAgICAgIHN0YXRlUm93R3JvdXBlZC5leHBhbmRlZCA9ICFzdGF0ZVJvd0dyb3VwZWQuZXhwYW5kZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvd0dyb3VwLmV4cGFuZGVkID0gIXJvd0dyb3VwLmV4cGFuZGVkO1xuICAgICAgdGhpcy5ncm91cGVkUm93U3RhdGUucHVzaChyb3dHcm91cCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUZXh0R3JvdXBSb3coZ3JvdXA6IE9UYWJsZUdyb3VwZWRSb3csIHRvdGFsQ291bnRzOiBudW1iZXIpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMudGFibGUuZ3JvdXBlZENvbHVtbnNBcnJheVtncm91cC5sZXZlbCAtIDFdO1xuICAgIGxldCB2YWx1ZSA9IEpTT04ucGFyc2UoZ3JvdXAua2V5c0FzU3RyaW5nKVt0aGlzLnRhYmxlLmdyb3VwZWRDb2x1bW5zQXJyYXlbZ3JvdXAubGV2ZWwgLSAxXV07XG5cbiAgICBjb25zdCBvQ29sID0gdGhpcy50YWJsZS5nZXRPQ29sdW1uKGZpZWxkKTtcblxuICAgIGlmICghdmFsdWUgJiYgVXRpbC5pc0RlZmluZWQob0NvbC5yZW5kZXJlcikgJiYgKHRoaXMudGFibGUgYXMgYW55KS5pc0luc3RhbmNlT2ZPVGFibGVDZWxsUmVuZGVyZXJTZXJ2aWNlQ29tcG9uZW50KG9Db2wucmVuZGVyZXIpKSB7XG4gICAgICB2YWx1ZSA9ICcgLSAnO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlLm9uRGF0YUxvYWRlZENlbGxSZW5kZXJlclN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnRhYmxlLm9uRGF0YUxvYWRlZENlbGxSZW5kZXJlclN1YnNjcmlwdGlvbiA9IChvQ29sLnJlbmRlcmVyIGFzIGFueSkub25EYXRhTG9hZGVkLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUdyb3VwZWRDb2x1bW5zKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKHRoaXMudGFibGUgYXMgYW55KS50cmFuc2xhdGVTZXJ2aWNlLmdldChvQ29sLnRpdGxlKSArICc6ICcgKyB2YWx1ZSArICcgKCcgKyB0b3RhbENvdW50cyArICcpJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhwYW5zaW9uU3RhdGUocm93OiBPVGFibGVHcm91cGVkUm93KTogYm9vbGVhbiB7XG4gICAgbGV0IGV4cGFuc2lvblN0YXRlID0gIXBhcmVudCB8fCAhdGhpcy50YWJsZS5jb2xsYXBzZUdyb3VwZWRDb2x1bW5zO1xuICAgIGlmIChyb3cuZXhwYW5kU2FtZUxldmVsKHRoaXMudGFibGUuZXhwYW5kR3JvdXBzU2FtZUxldmVsKSkge1xuICAgICAgZXhwYW5zaW9uU3RhdGUgPSB0aGlzLmxldmVsc0V4cGFuc2lvblN0YXRlLmhhc093blByb3BlcnR5KHJvdy5sZXZlbCkgPyB0aGlzLmxldmVsc0V4cGFuc2lvblN0YXRlW3Jvdy5sZXZlbF0gOiBleHBhbnNpb25TdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgcm93R3JvdXAgPSB0aGlzLmdyb3VwZWRSb3dTdGF0ZS5maW5kKHggPT4geC5rZXlzQXNTdHJpbmcgPT09IHJvdy5rZXlzQXNTdHJpbmcgJiYgSlNPTi5zdHJpbmdpZnkoeC5wYXJlbnQpID09PSBKU09OLnN0cmluZ2lmeShyb3cucGFyZW50KSk7XG4gICAgICBleHBhbnNpb25TdGF0ZSA9IHJvd0dyb3VwID8gcm93R3JvdXAuZXhwYW5kZWQgOiBleHBhbnNpb25TdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cGFuc2lvblN0YXRlO1xuICB9XG59XG5cblxuXG4iXX0=
|
|
785
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vLXRhYmxlLmRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2RlZmF1bHQtby10YWJsZS5kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJekYsT0FBTyxFQUFFLHlCQUF5QixFQUFzQixNQUFNLGlEQUFpRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJakUsTUFBTSxPQUFPLDBCQUEwQjtJQUdyQyxZQUFZLElBQWU7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFVBQWU7SUFHMUQsSUFBSSxJQUFJLEtBQVksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFxQi9ELElBQUksV0FBVyxL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Q0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7U0FDOUg7YUFBTTtZQUNMLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEosY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1NBQ2hFO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSwgTGlzdFJhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgYXN5bmNTY2hlZHVsZXIsIEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG9ic2VydmVPbiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBPVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9UYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvciwgT0NvbHVtblZhbHVlRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvdGFibGUvby1jb2x1bW4tdmFsdWUtZmlsdGVyLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBPQ29sdW1uIH0gZnJvbSAnLi4vY29sdW1uL28tY29sdW1uLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL28tdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZURhbyB9IGZyb20gJy4vby10YWJsZS5kYW8nO1xuaW1wb3J0IHsgT1RhYmxlR3JvdXBlZFJvdyB9IGZyb20gJy4vcm93L28tdGFibGUtcm93LWdyb3VwLmNsYXNzJztcbmltcG9ydCB7IE9NYXRTb3J0IH0gZnJvbSAnLi9zb3J0L28tbWF0LXNvcnQnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2dyZWdhdGUtZnVuY3Rpb24udHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCB7XG4gIHB1YmxpYyByYW5nZTogTGlzdFJhbmdlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IExpc3RSYW5nZSkge1xuICAgIHRoaXMucmFuZ2UgPSBkYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0T1RhYmxlRGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2U8YW55PiBpbXBsZW1lbnRzIE9UYWJsZURhdGFTb3VyY2Uge1xuICBkYXRhVG90YWxzQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4obnVsbCk7XG5cbiAgZ2V0IGRhdGEoKTogYW55W10geyByZXR1cm4gdGhpcy5kYXRhVG90YWxzQ2hhbmdlLnZhbHVlID8/IFtdOyB9XG5cbiAgcHJvdGVjdGVkIF9kYXRhYmFzZTogT1RhYmxlRGFvO1xuICBwcm90ZWN0ZWQgX3BhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICBwcm90ZWN0ZWQgX3RhYmxlT3B0aW9uczogT1RhYmxlT3B0aW9ucztcbiAgcHJvdGVjdGVkIF9zb3J0OiBPTWF0U29ydDtcblxuICBwcm90ZWN0ZWQgX3ZpcnR1YWxQYWdlQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbD4obmV3IE9uUmFuZ2VDaGFuZ2VWaXJ0dWFsU2Nyb2xsKHsgc3RhcnQ6IDAsIGVuZDogMCB9KSk7XG4gIHByb3RlY3RlZCBfcXVpY2tGaWx0ZXJDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgcHJvdGVjdGVkIF9jb2x1bW5WYWx1ZUZpbHRlckNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHByb3RlY3RlZCBncm91cEJ5Q29sdW1uQ2hhbmdlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD47XG5cbiAgcHJvdGVjdGVkIGZpbHRlcmVkRGF0YTogYW55W10gPSBbXTtcbiAgcHJvdGVjdGVkIGFnZ3JlZ2F0ZURhdGE6IGFueSA9IHt9O1xuXG4gIG9uUmVuZGVyZWREYXRhQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG5cbiAgcHJvdGVjdGVkIF9yZW5kZXJlZERhdGE6IGFueVtdID0gbnVsbDtcbiAgcmVzdWx0c0xlbmd0aDogbnVtYmVyID0gMDtcblxuICBnZXQgcXVpY2tGaWx0ZXIoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3F1aWNrRmlsdGVyQ2hhbmdlLnZhbHVlIHx8ICcnOyB9XG4gIHNldCBxdWlja0ZpbHRlcihmaWx0ZXI6IHN0cmluZykge1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyQ2hhbmdlLm5leHQoZmlsdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sdW1uVmFsdWVGaWx0ZXJzOiBBcnJheTxPQ29sdW1uVmFsdWVGaWx0ZXI+ID0gW107XG4gIHByaXZhdGUgZ3JvdXBlZFJvd1N0YXRlOiBPVGFibGVHcm91cGVkUm93W10gPSBbXTtcbiAgcHJpdmF0ZSBhY3RpdmVBZ2dyZWdhdGVzID0ge307XG4gIHByaXZhdGUgZ3JvdXBlZFJvd3NTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgbGV2ZWxzRXhwYW5zaW9uU3RhdGUgPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGFibGU6IE9UYWJsZUNvbXBvbmVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5uZ1pvbmUgPSB0YWJsZS5pbmplY3Rvci5nZXQoTmdab25lKTtcbiAgICB0aGlzLl9kYXRhYmFzZSA9IHRhYmxlLmRhb1RhYmxlO1xuICAgIGlmICh0aGlzLl9kYXRhYmFzZSkge1xuICAgICAgdGhpcy5yZXN1bHRzTGVuZ3RoID0gdGhpcy5fZGF0YWJhc2UuZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh0YWJsZS5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRvciA9IHRhYmxlLm1hdHBhZ2luYXRvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZS52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMudGFibGUudmlydHVhbFNjcm9sbFZpZXdwb3J0LnJlbmRlcmVkUmFuZ2VTdHJlYW1cbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAodmFsdWU6IExpc3RSYW5nZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdmlydHVhbFBhZ2VDaGFuZ2UubmV4dChuZXcgT25SYW5nZUNoYW5nZVZpcnR1YWxTY3JvbGwodmFsdWUpKTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJsZU9wdGlvbnMgPSB0YWJsZS5vVGFibGVPcHRpb25zO1xuICAgIHRoaXMuX3NvcnQgPSB0YWJsZS5zb3J0O1xuXG4gIH1cblxuICBzb3J0RnVuY3Rpb24oYTogYW55LCBiOiBhbnkpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zb3J0LnNvcnRGdW5jdGlvbihhLCBiKTtcbiAgfVxuXG4gIGdldCByZW5kZXJlZERhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZERhdGE7XG4gIH1cblxuICBzZXQgcmVuZGVyZWREYXRhKGFyZzogYW55W10pIHtcbiAgICB0aGlzLl9yZW5kZXJlZERhdGEgPSBhcmc7XG4gICAgdGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZS5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRhYmxlIHRvIHJldHJpZXZlIG9uZSBzdHJlYW0gY29udGFpbmluZyB0aGUgZGF0YSB0byByZW5kZXIuXG4gICAqL1xuICBjb25uZWN0KCk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICBjb25zdCB0YWcgPSAodHlwZTogc3RyaW5nLCBvYnM6IE9ic2VydmFibGU8YW55PikgPT5cbiAgICAgIG9icy5waXBlKG1hcCh2YWx1ZSA9PiAoeyB0eXBlLCB2YWx1ZSB9KSkpO1xuXG4gICAgY29uc3QgZGlzcGxheURhdGFDaGFuZ2VzOiBhbnlbXSA9IFtdO1xuICAgIGRpc3BsYXlEYXRhQ2hhbmdlcy5wdXNoKHRhZygnREFUQUNIQU5HRScsIHRoaXMuX2RhdGFiYXNlLmRhdGFDaGFuZ2UpKTtcblxuXG4gICAgaWYgKCF0aGlzLnRhYmxlLnBhZ2VhYmxlKSB7XG5cblxuICAgICAgaWYgKHRoaXMuX3NvcnQpIHtcbiAgICAgICAgZGlzcGxheURhdGFDaGFuZ2VzLnB1c2godGFnKCdTT1JUQ0hBTkdFJywgdGhpcy5fc29ydC5vU29ydENoYW5nZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fdGFibGVPcHRpb25zLmZpbHRlcikge1xuICAgICAgICBkaXNwbGF5RGF0YUNoYW5nZXMucHVzaCh0YWcoJ1FVSUNLRklMVEVSQ0hBTkdFJywgdGhpcy5fcXVpY2tGaWx0ZXJDaGFuZ2UpKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcGFnaW5hdG9yKSB7XG4gICAgICAgIGRpc3BsYXlEYXRhQ2hhbmdlcy5wdXNoKHRhZygnUEFHSU5BVE9SJywgdGhpcy5fcGFnaW5hdG9yLnBhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwbGF5RGF0YUNoYW5nZXMucHVzaCh0YWcoJ0ZJTFRFUkJZQ09MVU1OJywgdGhpcy5fY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UpLnBpcGUoZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KSkpO1xuXG4gICAgaWYgKHRoaXMudGFibGUuZ3JvdXBhYmxlKSB7XG4gICAgICBkaXNwbGF5RGF0YUNoYW5nZXMucHVzaCh0YWcoJ0dST1VQX0JZJywgdGhpcy5ncm91cEJ5Q29sdW1uQ2hhbmdlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBQcm9jZXNzZXMgdGFibGUgZGF0YSByZWFjdGl2ZWx5IHdoZW5ldmVyIGFueSBkaXNwbGF5LXJlbGF0ZWQgZXZlbnQgb2NjdXJzLlxuICAgICogSGFuZGxlczpcbiAgICAqICAtIFZpcnR1YWwgc2Nyb2xsIHJhbmdlIGNoYW5nZXNcbiAgICAqICAtIEZpbHRlcmluZywgc29ydGluZywgZ3JvdXBpbmcsIGNhbGN1bGF0ZWQgY29sdW1uc1xuICAgICogIC0gUGFnaW5hdGlvbiAoY2xpZW50IG9yIHNlcnZlcilcbiAgICAqICAtIEhlYXZ5IGRhdGEgcHJvY2Vzc2luZyBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIGZvciBwZXJmb3JtYW5jZVxuICAgICogIC0gUmV0dXJuaW5nIHByb2Nlc3NlZCBkYXRhIGJhY2sgaW50byBBbmd1bGFyIGZvciBVSSB1cGRhdGVcbiAgICAqXG4gICAgKiBUaGlzIHBpcGVsaW5lIGVuc3VyZXMgb3B0aW1hbCBwZXJmb3JtYW5jZSBieTpcbiAgICAqICAtIFByZXZlbnRpbmcgdW5uZWNlc3NhcnkgY2hhbmdlIGRldGVjdGlvbiBkdXJpbmcgaGVhdnkgb3BlcmF0aW9uc1xuICAgICogIC0gQWxsb3dpbmcgdGhlIGJyb3dzZXIgdG8gcmVuZGVyIGZpcnN0ICh2aWEgc2V0VGltZW91dClcbiAgICAqICAtIFJ1bm5pbmcgZXhwZW5zaXZlIGxvZ2ljIG91dHNpZGUgQW5ndWxhciBab25lXG4gICAgKiAgLSBSZS1lbnRlcmluZyBBbmd1bGFyIFpvbmUgb25seSB3aGVuIFVJIG11c3QgdXBkYXRlXG4gICAgKlxuICAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxhbnlbXT4gRW1pdHMgdGhlIHByb2Nlc3NlZCBkYXRhc2V0IHRvIGJlIHJlbmRlcmVkLlxuICAgICovXG4gICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICAgLy8gU1RSRUFNIDE6ICBNYWluIGRhdGEgc3RyZWFtIChleGVjdXRlZCB3aXRoIGFzeW5jU2NoZWR1bGVyIGZvciBoZWF2eSB0YXNrcylcbiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgICBjb25zdCBtYWluRGF0YVN0cmVhbSA9IG1lcmdlKC4uLmRpc3BsYXlEYXRhQ2hhbmdlcykucGlwZShcbiAgICAgIC8vICBkZWJvdW5jZVRpbWUoNTApLCAvLyBSZWR1Y2UgcsOhZmFnYXMgZGUgZXZlbnRvc1xuICAgICAgLy8gRW5zdXJlcyBoZWF2eSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHlcbiAgICAgIG9ic2VydmVPbihhc3luY1NjaGVkdWxlciksXG4gICAgICBzd2l0Y2hNYXAoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLl9kYXRhYmFzZS5kYXRhKTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgdGhpcy5yZW5kZXJlZERhdGEgPT09IG51bGwgKSB7XG4gICAgICAgICAgLy8gQcO6biBubyBzZSBoYW4gY2FyZ2FkbyBkYXRvc1xuICAgICAgICAgIHRoaXMucmVuZGVyZWREYXRhID0gW107XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRGF0YU91dHNpZGVBbmd1bGFyKGRhdGEpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICAgLy8gIFNUUkVBTSAyOiBWaXJ0dWFsIHNjcm9sbCBzdHJlYW0gKHN5bmNocm9ub3VzIHdpdGggc2Nyb2xsIGV2ZW50cylcbiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgICBjb25zdCB2aXJ0dWFsU2Nyb2xsU3RyZWFtID0gdGhpcy50YWJsZS52aXJ0dWFsU2Nyb2xsVmlld3BvcnRcbiAgICAgID8gdGhpcy5fdmlydHVhbFBhZ2VDaGFuZ2UucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlZERhdGEgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWREYXRhICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5yZW5kZXJlZERhdGEpICYmXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkRGF0YS5sZW5ndGggPiAwO1xuICAgICAgICB9KSxcbiAgICAgICAgLy8gIFNUUkVBTSAyOiBWaXJ0dWFsIHNjcm9sbCBzdHJlYW0gKHN5bmNocm9ub3VzIHdpdGggc2Nyb2xsIGV2ZW50cylcbiAgICAgICAgc3dpdGNoTWFwKCh4OiBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBvZih0aGlzLmdldFZpcnR1YWxTY3JvbGxEYXRhKHRoaXMucmVuZGVyZWREYXRhLCB4KSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICA6IEVNUFRZOy8vIE5vIHZpcnR1YWwgc2Nyb2xsIOKGkiBubyBzdHJlYW1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQ09NQklORSBib3RoIHN0cmVhbXMgaW50byBvbmUgdW5pZmllZCBvdXRwdXRcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHJldHVybiBtZXJnZShtYWluRGF0YVN0cmVhbSwgdmlydHVhbFNjcm9sbFN0cmVhbSk7XG4gIH1cbiAgLyoqXG4gKiBQcm9jZXNzZXMgaGVhdnkgZGF0YSBvcGVyYXRpb25zIG91dHNpZGUgQW5ndWxhciBab25lIHRvIGF2b2lkIGJsb2NraW5nIFVJLlxuICogV3JhcHMgb3BlcmF0aW9ucyBpbiBzZXRUaW1lb3V0KDApIHRvIGFsbG93IGJyb3dzZXIgcmVuZGVyaW5nIGJlZm9yZSBwcm9jZXNzaW5nLlxuICovXG4gIHByaXZhdGUgcHJvY2Vzc0RhdGFPdXRzaWRlQW5ndWxhcihkYXRhKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxhbnlbXT4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAvLyBzZXRUaW1lb3V0KDApIGFsbG93cyB0aGUgYnJvd3NlciB0byBwYWludCBza2VsZXRvbi9sb2FkaW5nIHN0YXRlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGRhdGEgPSB0aGlzLmV4ZWN1dGVEYXRhUHJvY2Vzc2luZyhkYXRhLCBvYnNlcnZlcik7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIENFTlRSQUxJWkVEIFNUQVRFIFVQREFURVxuICogVXBkYXRlcyBhbGwgdGFibGUgc3RhdGUgcHJvcGVydGllcyBpbiBvbmUgcGxhY2UuXG4gKiBQcmV2ZW50cyBzY2F0dGVyZWQgbW9kaWZpY2F0aW9ucyB0aHJvdWdob3V0IHRoZSBjb2RlLlxuICovXG4gIHByaXZhdGUgdXBkYXRlVGFibGVTdGF0ZShyZW5kZXJlZERhdGE6IGFueVtdLCByZXN1bHRzTGVuZ3RoOiBudW1iZXIsIGFnZ3JlZ2F0ZURhdGE6IGFueSA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlZERhdGEgPSByZW5kZXJlZERhdGE7XG4gICAgdGhpcy5yZXN1bHRzTGVuZ3RoID0gcmVzdWx0c0xlbmd0aDtcbiAgICB0aGlzLmFnZ3JlZ2F0ZURhdGEgPSBhZ2dyZWdhdGVEYXRhO1xuICB9XG5cbiAgLyoqXG4gKiBFeGVjdXRlcyB0aGUgYWN0dWFsIGRhdGEgcHJvY2Vzc2luZyBwaXBlbGluZS5cbiAqIEhhbmRsZXM6IGNhbGN1bGF0ZWQgY29sdW1ucywgZmlsdGVyaW5nLCBzb3J0aW5nLCBwYWdpbmF0aW9uLCBncm91cGluZywgYWdncmVnYXRlcy5cbiAqIENhdGNoZXMgZXJyb3JzIGFuZCByZXR1cm5zIHRvIEFuZ3VsYXIgWm9uZSBmb3IgVUkgdXBkYXRlcy5cbiAqL1xuICBwcml2YXRlIGV4ZWN1dGVEYXRhUHJvY2Vzc2luZyhkYXRhOiBhbnksIG9ic2VydmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmV4aXN0c0FueUNhbGN1bGF0ZWRDb2x1bW4oKSkge1xuICAgICAgICBkYXRhID0gdGhpcy5nZXRDb2x1bW5DYWxjdWxhdGVkRGF0YShkYXRhKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRhYmxlLnBhZ2VhYmxlKSB7XG4gICAgICAgIGRhdGEgPSB0aGlzLmdldENvbHVtblZhbHVlRmlsdGVyRGF0YShkYXRhKTtcbiAgICAgICAgZGF0YSA9IHRoaXMuZ2V0UXVpY2tGaWx0ZXJEYXRhKGRhdGEpO1xuICAgICAgICBkYXRhID0gdGhpcy5nZXRTb3J0ZWREYXRhKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IE9iamVjdC5hc3NpZ24oW10sIGRhdGEpO1xuXG4gICAgICBsZXQgcmVzdWx0c0xlbmd0aDogbnVtYmVyO1xuICAgICAgaWYgKHRoaXMudGFibGUucGFnZWFibGUpIHtcbiAgICAgICAgY29uc3QgdG90YWxSZWNvcmRzTnVtYmVyID0gdGhpcy50YWJsZS5nZXRUb3RhbFJlY29yZHNOdW1iZXIoKTtcbiAgICAgICAgcmVzdWx0c0xlbmd0aCA9IHRvdGFsUmVjb3Jkc051bWJlciA/PyBkYXRhLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHNMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgZGF0YSA9IHRoaXMuZ2V0UGFnaW5hdGlvbkRhdGEoZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRhYmxlLmdyb3VwYWJsZSAmJiAhVXRpbC5pc0FycmF5RW1wdHkodGhpcy50YWJsZS5ncm91cGVkQ29sdW1uc0FycmF5KSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YSA9IHRoaXMuZ2V0R3JvdXBlZERhdGEoZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkRGF0YSA9IGRhdGE7XG5cbiAgICAgIGlmICh0aGlzLnRhYmxlLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCAmJiAhdGhpcy5fcGFnaW5hdG9yKSB7XG4gICAgICAgIGRhdGEgPSB0aGlzLmdldFZpcnR1YWxTY3JvbGxEYXRhKGRhdGEsIG5ldyBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCh7IHN0YXJ0OiAwLCBlbmQ6IENvZGVzLkxJTUlUX1NDUk9MTFZJUlRVQUwgfSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZ2dyZWdhdGVEYXRhID0gdGhpcy5nZXRBZ2dyZWdhdGVzRGF0YShyZW5kZXJlZERhdGEpO1xuXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAgUmUtZW50ZXIgQW5ndWxhciBab25lIHRvIHVwZGF0ZSBVSVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVUYWJsZVN0YXRlKHJlbmRlcmVkRGF0YSwgcmVzdWx0c0xlbmd0aCwgYWdncmVnYXRlRGF0YSk7XG4gICAgICAgIHRoaXMudGFibGUubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMudGFibGUuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfinYwgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBkYXRhOicsIGVycm9yKTtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGUubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMudGFibGUuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGdldEdyb3VwZWREYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgZGF0YSA9IHRoaXMuZ2V0U3ViR3JvdXBzT2ZHcm91cGVkUm93KGRhdGEpO1xuICAgIC8qKiBkYXRhIGNvbnRhaW5zIHJvdyBncm91cCBoZWFkZXJzIChPVGFibGVHcm91cGVkUm93KSBhbmQgdGhlIGRhdGEgYmVsb25naW5nIHRvIGV4cGFuZGVkIGdyb3VwZWQgcm93cyAqL1xuICAgIGRhdGEgPSB0aGlzLmZpbHRlckNvbGxhcHNlZFJvd0dyb3VwKGRhdGEpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgc3ViZ3JvdXBzIG9mIGdyb3VwZWQgcm93XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEByZXR1cm5zIHN1Ymdyb3VwcyBvZiBncm91cGVkIHJvd1xuICAgKi9cbiAgZ2V0U3ViR3JvdXBzT2ZHcm91cGVkUm93KGRhdGE6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBkYXRhID0gdGhpcy5nZXRTdWJsZXZlbChkYXRhLCAwKTtcbiAgfVxuXG4gIGdldEFnZ3JlZ2F0ZXNEYXRhKGRhdGE6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIGlmICh0aGlzLl90YWJsZU9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9Db2x1bW4pID0+IHtcblxuICAgICAgaWYgKGNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLnZpc2libGUpIHtcbiAgICAgICAgY29uc3QgdmFsdWVPclByb21pc2UgPSB0aGlzLmNhbGN1bGF0ZUFnZ3JlZ2F0ZShkYXRhLCBjb2x1bW4uYXR0ciwgY29sdW1uLmFnZ3JlZ2F0ZS5vcGVyYXRvcik7XG5cbiAgICAgICAgaWYgKHZhbHVlT3JQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHZhbHVlT3JQcm9taXNlXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlZFZhbHVlID0+IHtcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5hdHRyXSA9IHJlc29sdmVkVmFsdWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGBvLXRhYmxlLWNvbHVtbi1hZ2dyZWdhdGU6IEFzeW5jIGFnZ3JlZ2F0ZSBlcnJvciBpbiBjb2x1bW4gXCIke2NvbHVtbi5hdHRyfVwiIHVzaW5nIGFnZ3JlZ2F0ZSBmdW5jdGlvbiBcIiR7Y29sdW1uLmFnZ3JlZ2F0ZS5vcGVyYXRvcn1cIjpgLCBlcnIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmpbY29sdW1uLmF0dHJdID0gdmFsdWVPclByb21pc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdGhhdCBnZXQgdmFsdWUgdGhlIGNvbHVtbnMgY2FsY3VsYXRlZFxuICAgKiBAcGFyYW0gZGF0YSBkYXRhIG9mIHRoZSBkYXRhYmFzZVxuICAgKi9cbiAgZ2V0Q29sdW1uQ2FsY3VsYXRlZERhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY2FsY3VsYXRlZENvbHMgPSB0aGlzLl90YWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIoKG9Db2w6IE9Db2x1bW4pID0+IG9Db2wudmlzaWJsZSAmJiBvQ29sLmNhbGN1bGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gZGF0YS5tYXAoKHJvdzogYW55KSA9PiB7XG4gICAgICBjYWxjdWxhdGVkQ29scy5mb3JFYWNoKChvQ29sdW1uOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29sdW1uLmNhbGN1bGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHNlbGYudHJhbnNmb3JtRm9ybXVsYShvQ29sdW1uLmNhbGN1bGF0ZSwgcm93KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb0NvbHVtbi5jYWxjdWxhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9Db2x1bW4uY2FsY3VsYXRlKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcm93W29Db2x1bW4uYXR0cl0gPSBpc05hTih2YWx1ZSkgPyAwIDogdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByb3c7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhbnNmb3JtRm9ybXVsYShmb3JtdWxhQXJnLCByb3cpOiBzdHJpbmcge1xuICAgIGxldCBmb3JtdWxhID0gZm9ybXVsYUFyZztcbiAgICAvLyAxLiByZXBsYWNlIGNvbHVtbnMgYnkgdmFsdWVzIG9mIHJvd1xuICAgIGNvbnN0IGNvbHVtbnNBdHRyID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMubWFwKChvQ29sOiBPQ29sdW1uKSA9PiBvQ29sLmF0dHIpO1xuICAgIGNvbHVtbnNBdHRyLmZvckVhY2goKGNvbHVtbjogc3RyaW5nKSA9PiB7XG4gICAgICBmb3JtdWxhID0gZm9ybXVsYS5yZXBsYWNlKGNvbHVtbiwgcm93W2NvbHVtbl0pO1xuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdEZvcm11bGEgPSAnJztcbiAgICAvLyAyLiBUcmFuc2Zvcm0gZm9ybXVsYVxuICAgIHRyeSB7XG4gICAgICByZXN1bHRGb3JtdWxhID0gKG5ldyBGdW5jdGlvbigncmV0dXJuICcgKyBmb3JtdWxhKSkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gZGVmaW5lZCBpbiB0aGUgY2FsY3VsYXRlZCBjb2x1bW4gaXMgaW5jb3JyZWN0ICcpO1xuICAgIH1cbiAgICAvLyAzLiBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdEZvcm11bGE7XG4gIH1cblxuICBnZXRRdWlja0ZpbHRlckRhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVpY2tGaWx0ZXIpICYmIHRoaXMucXVpY2tGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsdGVyRGF0YSA9ICF0aGlzLl90YWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA/IHRoaXMucXVpY2tGaWx0ZXIudG9Mb3dlckNhc2UoKSA6IHRoaXMucXVpY2tGaWx0ZXI7XG4gICAgICByZXR1cm4gZGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAvLyBHZXR0aW5nIGN1c3RvbSBjb2x1bW5zIGZpbHRlciBjb2x1bW5zIHJlc3VsdFxuICAgICAgICBjb25zdCBwYXNzQ3VzdG9tRmlsdGVyID0gdGhpcy5mdWxmaWxsc0N1c3RvbUZpbHRlckZ1bmN0aW9ucyhmaWx0ZXJEYXRhLCBpdGVtKTtcbiAgICAgICAgLy8gR2V0dGluZyBvdGhlciBzZWFyY2hhYmxlIGNvbHVtbnMgc3RhbmRhcmQgcmVzdWx0XG4gICAgICAgIGNvbnN0IHBhc3NTZWFyY2hTdHJpbmcgPSB0aGlzLmZ1bGZpbGxzUXVpY2tmaWx0ZXIoZmlsdGVyRGF0YSwgaXRlbSk7XG4gICAgICAgIHJldHVybiBwYXNzQ3VzdG9tRmlsdGVyIHx8IHBhc3NTZWFyY2hTdHJpbmc7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFnaW5hdGlvbkRhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLl9wYWdpbmF0b3IgfHwgaXNOYU4odGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGxldCBzdGFydEluZGV4ID0gaXNOYU4odGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplKSA/IDAgOiB0aGlzLl9wYWdpbmF0b3IucGFnZUluZGV4ICogdGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplO1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgZGF0YS5sZW5ndGggPCBzdGFydEluZGV4KSB7XG4gICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgIHRoaXMuX3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zcGxpY2Uoc3RhcnRJbmRleCwgdGhpcy5fcGFnaW5hdG9yLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldFZpcnR1YWxTY3JvbGxEYXRhKGRhdGE6IGFueVtdLCB4OiBPblJhbmdlQ2hhbmdlVmlydHVhbFNjcm9sbCk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5zbGljZSh4LnJhbmdlLnN0YXJ0LCB4LnJhbmdlLmVuZClcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5kYXRhVG90YWxzQ2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLl9jb2x1bW5WYWx1ZUZpbHRlckNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZ3JvdXBCeUNvbHVtbkNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3ZpcnR1YWxQYWdlQ2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnVsZmlsbHNDdXN0b21GaWx0ZXJGdW5jdGlvbnMoZmlsdGVyOiBzdHJpbmcsIGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGN1c3RvbUZpbHRlckNvbHMgPSB0aGlzLnRhYmxlLm9UYWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIob0NvbCA9PiBvQ29sLnVzZUN1c3RvbUZpbHRlckZ1bmN0aW9uKCkpO1xuICAgIHJldHVybiBjdXN0b21GaWx0ZXJDb2xzLnNvbWUob0NvbCA9PiBvQ29sLnJlbmRlcmVyLmZpbHRlckZ1bmN0aW9uKGl0ZW1bb0NvbC5hdHRyXSwgaXRlbSwgZmlsdGVyKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZnVsZmlsbHNRdWlja2ZpbHRlcihmaWx0ZXI6IHN0cmluZywgaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX3RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcigob0NvbDogT0NvbHVtbikgPT4gb0NvbC51c2VRdWlja2ZpbHRlckZ1bmN0aW9uKCkpO1xuICAgIGxldCBzZWFyY2hTdHIgPSBjb2x1bW5zLm1hcCgob0NvbDogT0NvbHVtbikgPT4gb0NvbC5nZXRGaWx0ZXJWYWx1ZShpdGVtW29Db2wuYXR0cl0sIGl0ZW0pLmpvaW4oJyAnKSkuam9pbignICcpO1xuICAgIGlmICghdGhpcy5fdGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUpIHtcbiAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc2VhcmNoU3RyLmluZGV4T2YoZmlsdGVyKSAhPT0gLTE7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIHNvcnRlZCBjb3B5IG9mIHRoZSBkYXRhYmFzZSBkYXRhLiAqL1xuICBwcm90ZWN0ZWQgZ2V0U29ydGVkRGF0YShkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIXRoaXMuX3NvcnQpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHJlbmRlcmVyRGF0YSA9IHRoaXMuZ2V0RGF0YVRvU29ydChkYXRhKTtcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gdGhpcy5fc29ydC5nZXRTb3J0ZWREYXRhKHJlbmRlcmVyRGF0YSk7XG5cbiAgICBjb25zdCB0YWJsZUtleXMgPSB0aGlzLnRhYmxlLmdldEtleXMoKTtcbiAgICBjb25zdCBvcmlnaW5hbERhdGFTb3J0ZWQgPSBbXTtcblxuICAgIHNvcnRlZERhdGEuZm9yRWFjaChzb3J0ZWRFbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGtleXNWYWx1ZXNJblNvcnREYXRhID0gdGFibGVLZXlzLm1hcChlbGVtZW50ID0+IHNvcnRlZEVsZW1lbnRbZWxlbWVudF0pO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGggJiYgIWZvdW5kKSB7XG4gICAgICAgIGNvbnN0IGtleXNWYWx1ZXNJbkRhdGEgPSB0YWJsZUtleXMubWFwKGVsZW1lbnQgPT4gZGF0YVtpXVtlbGVtZW50XSk7XG4gICAgICAgIGlmIChVdGlsLmlzQXJyYXlFcXVhbChrZXlzVmFsdWVzSW5Tb3J0RGF0YSwga2V5c1ZhbHVlc0luRGF0YSkpIHtcbiAgICAgICAgICBvcmlnaW5hbERhdGFTb3J0ZWQucHVzaChkYXRhW2ldKTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvcmlnaW5hbERhdGFTb3J0ZWQ7XG5cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRhdGEgdGhlIHRhYmxlIHN0b3Jlcy4gTm8gZmlsdGVycyBhcmUgYXBwbGllZC5cbiAgICovXG4gIGdldFRhYmxlRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlLmRhdGE7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGEgb2YgdGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUgd2l0aG91dCByZW5kZXJpbmcgKi9cbiAgZ2V0Q3VycmVudERhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmdldERhdGEoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRBbGxEYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxEYXRhKGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGEgb2YgdGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUgIHJlbmRlcmluZyAqL1xuICBnZXRDdXJyZW50UmVuZGVyZXJEYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlZERhdGEodGhpcy5yZW5kZXJlZERhdGEpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZGF0YSBvZiB0aGUgdGFibGUgcmVuZGVyaW5nICovXG4gIGdldEFsbFJlbmRlcmVyRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsRGF0YSh0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3FsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGRhdGEgKi9cbiAgZ2V0IHNxbFR5cGVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlLnNxbFR5cGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldFJlbmRlcmVkRGF0YShkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuX3RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihvQ29sID0+IG9Db2wudmlzaWJsZSk7XG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgdmlzaWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbDogT0NvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCB1c2VSZW5kZXJlciA9IG9Db2wucmVuZGVyZXIgJiYgb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YTtcbiAgICAgICAgb2JqW29Db2wuYXR0cl0gPSB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVRvU29ydChkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIXRoaXMuX3NvcnQpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKG9Db2wgPT4gb0NvbC52aXNpYmxlICYmIHRoaXMuX3NvcnQuYWN0aXZlQXJyYXkubWFwKHggPT4geC5pZCkuaW5kZXhPZihvQ29sLmF0dHIpID4gLTEpO1xuICAgIGNvbnN0IGV4aXN0Q29sdW1uVG9UcmFzZm9ybVRvU29ydCA9IHNvcnRDb2x1bW5zLmZpbHRlcigob0NvbDogT0NvbHVtbikgPT4gKG9Db2wudHlwZSA9PT0gJ3RyYW5zbGF0ZScgfHwgb0NvbC50eXBlID09PSAnc2VydmljZScpKS5sZW5ndGggPiAwO1xuICAgIGlmICghZXhpc3RDb2x1bW5Ub1RyYXNmb3JtVG9Tb3J0KSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdGhpcy50YWJsZS5nZXRLZXlzKCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgc29ydENvbHVtbnMucHVzaCh0aGlzLnRhYmxlLmdldE9Db2x1bW4oa2V5KSk7XG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIHNvcnRDb2x1bW5zLmZvckVhY2goKG9Db2w6IE9Db2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgdXNlUmVuZGVyZXIgPSBvQ29sLnJlbmRlcmVyICYmIChvQ29sLnR5cGUgPT09ICd0cmFuc2xhdGUnIHx8IG9Db2wudHlwZSA9PT0gJ3NlcnZpY2UnKSAmJiBvQ29sLnJlbmRlcmVyLmdldENlbGxEYXRhO1xuICAgICAgICBvYmpbb0NvbC5hdHRyXSA9IHVzZVJlbmRlcmVyID8gb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YShyb3dbb0NvbC5hdHRyXSwgcm93KSA6IHJvd1tvQ29sLmF0dHJdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFsbERhdGEodXNpbmdSZW5kZXJlcmVycz86IGJvb2xlYW4sIG9ubHlWaXNpYmxlQ29sdW1ucz86IGJvb2xlYW4pIHtcbiAgICBsZXQgdGFibGVDb2x1bW5zID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnM7XG4gICAgaWYgKG9ubHlWaXNpYmxlQ29sdW1ucykge1xuICAgICAgdGFibGVDb2x1bW5zID0gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKG9Db2wgPT4gb0NvbC52aXNpYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZVJlbmRlcmVyID0gdXNpbmdSZW5kZXJlcmVycyAmJiBvQ29sLnJlbmRlcmVyICYmIG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGE7XG4gICAgICAgIG9ialtvQ29sLmF0dHJdID0gdXNlUmVuZGVyZXIgPyBvQ29sLnJlbmRlcmVyLmdldENlbGxEYXRhKHJvd1tvQ29sLmF0dHJdLCByb3cpIDogcm93W29Db2wuYXR0cl07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlbmRlcmVyc0RhdGEoZGF0YTogYW55W10sIHRhYmxlQ29sdW1uczogT0NvbHVtbltdKTogYW55W10ge1xuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICAvLyByZW5kZXIgZWFjaCBjb2x1bW5cbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHJvdyk7XG4gICAgICB0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbDogT0NvbHVtbikgPT4ge1xuICAgICAgICBvYmpbb0NvbC5hdHRyXSA9IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uRGF0YShvY29sdW1uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZERhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIC8vIHJlbmRlciBlYWNoIGNvbHVtblxuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICBpZiAob2NvbHVtbikge1xuICAgICAgICBvYmpbb2NvbHVtbl0gPSByb3dbb2NvbHVtbl07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUNvbHVtbnNGaWx0ZXJzKGZpbHRlcnM6IE9Db2x1bW5WYWx1ZUZpbHRlcltdKSB7XG4gICAgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMgPSBbXTtcbiAgICBmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMudGFibGUucGFnZWFibGUgJiYgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UubmV4dCh0aGlzLmNvbHVtblZhbHVlRmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgaXNDb2x1bW5WYWx1ZUZpbHRlckFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCk6IE9Db2x1bW5WYWx1ZUZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnM7XG4gIH1cblxuICBnZXRDb2x1bW5WYWx1ZUZpbHRlckJ5QXR0cihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uVmFsdWVGaWx0ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblZhbHVlRmlsdGVycy5maW5kKGl0ZW0gPT4gaXRlbS5hdHRyID09PSBhdHRyKTtcbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyOiBib29sZWFuID0gdHJ1ZSwgY29sdW1uc0F0dHI/OiBzdHJpbmdbXSkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW5zQXR0cikpIHtcbiAgICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzID0gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMuZmlsdGVyKHggPT4gIWNvbHVtbnNBdHRyLmluY2x1ZGVzKHguYXR0cikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtblZhbHVlRmlsdGVycyA9IFtdO1xuICAgIH1cbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgdGhpcy5fY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UubmV4dCh0aGlzLmNvbHVtblZhbHVlRmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXIoYXR0cjogc3RyaW5nLCB0cmlnZ2VyOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzID0gdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMuZmlsdGVyKHggPT4geC5hdHRyICE9PSBhdHRyKTtcbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgdGhpcy5fY29sdW1uVmFsdWVGaWx0ZXJDaGFuZ2UubmV4dCh0aGlzLmNvbHVtblZhbHVlRmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgYWRkQ29sdW1uRmlsdGVyKGZpbHRlcjogT0NvbHVtblZhbHVlRmlsdGVyKSB7XG4gICAgY29uc3QgZXhpc3RpbmdGaWx0ZXJJbmRleCA9IHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uYXR0ciA9PT0gZmlsdGVyLmF0dHIpO1xuICAgIGlmIChleGlzdGluZ0ZpbHRlckluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzLnNwbGljZShleGlzdGluZ0ZpbHRlckluZGV4LCAxLCBmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmFsaWRGaWx0ZXIgPSBVdGlsLmlzRGVmaW5lZChmaWx0ZXIudmFsdWVzKTtcbiAgICAgIGlmICh2YWxpZEZpbHRlcikge1xuICAgICAgICBzd2l0Y2ggKGZpbHRlci5vcGVyYXRvcikge1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5JTjpcbiAgICAgICAgICAgIHZhbGlkRmlsdGVyID0gZmlsdGVyLnZhbHVlcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkJFVFdFRU46XG4gICAgICAgICAgICB2YWxpZEZpbHRlciA9IGZpbHRlci52YWx1ZXMubGVuZ3RoID09PSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkVRVUFMOlxuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5MRVNTX0VRVUFMOlxuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5NT1JFX0VRVUFMOlxuICAgICAgICAgICAgdmFsaWRGaWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhbGlkRmlsdGVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkRmlsdGVyKSB7XG4gICAgICAgICAgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSB0YWJsZSBpcyBwYWdpbmF0ZWQsIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgb24gcmVtb3RlIHF1ZXJ5XG4gICAgaWYgKCF0aGlzLnRhYmxlLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLl9jb2x1bW5WYWx1ZUZpbHRlckNoYW5nZS5uZXh0KHRoaXMuY29sdW1uVmFsdWVGaWx0ZXJzKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb2x1bW5WYWx1ZUZpbHRlckRhdGEoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgdGhpcy5jb2x1bW5WYWx1ZUZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyQ29sdW1uID0gdGhpcy50YWJsZS5vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLmF0dHIgPT09IGZpbHRlci5hdHRyKTtcbiAgICAgIGlmIChmaWx0ZXJDb2x1bW4pIHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXIub3BlcmF0b3IpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZXMgPSAoZmlsdGVyLnZhbHVlcyB8fCBbXSkucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgcHJldmlvdXMuY29uY2F0KGZpbHRlckNvbHVtbi5nZXRGaWx0ZXJWYWx1ZShjdXJyZW50KS5tYXAoZiA9PiBVdGlsLm5vcm1hbGl6ZVN0cmluZyhmKSkpLCBbXSk7XG5cbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJDb2x1bW4ucmVuZGVyZXIgJiYgZmlsdGVyQ29sdW1uLnJlbmRlcmVyLmZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckNvbHVtbi5yZW5kZXJlci5maWx0ZXJGdW5jdGlvbihpdGVtW2ZpbHRlci5hdHRyXSwgaXRlbSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sVmFsdWVzID0gZmlsdGVyQ29sdW1uLmdldEZpbHRlclZhbHVlKGl0ZW1bZmlsdGVyLmF0dHJdLCBpdGVtKS5tYXAoZiA9PiBVdGlsLm5vcm1hbGl6ZVN0cmluZyhmKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclZhbHVlcy5zb21lKHZhbHVlID0+IGNvbFZhbHVlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5FUVVBTDpcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFV0aWwubm9ybWFsaXplU3RyaW5nKGZpbHRlci52YWx1ZXMpO1xuICAgICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2xWYWx1ZXMgPSBmaWx0ZXJDb2x1bW4uZ2V0RmlsdGVyVmFsdWUoaXRlbVtmaWx0ZXIuYXR0cl0sIGl0ZW0pLm1hcChmID0+IFV0aWwubm9ybWFsaXplU3RyaW5nKGYpKTtcbiAgICAgICAgICAgICAgbGV0IHJlZ0V4cDtcbiAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZS5pbmNsdWRlcygnKicpKSB7XG4gICAgICAgICAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cCgnXicgKyBub3JtYWxpemVkVmFsdWUuc3BsaXQoJyonKS5qb2luKCcuKicpICsgJyQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gY29sVmFsdWVzLnNvbWUoY29sVmFsdWUgPT4gcmVnRXhwID8gcmVnRXhwLnRlc3QoY29sVmFsdWUpIDogY29sVmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcyhub3JtYWxpemVkVmFsdWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkJFVFdFRU46XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtW2ZpbHRlci5hdHRyXSA+PSBmaWx0ZXIudmFsdWVzWzBdICYmIGl0ZW1bZmlsdGVyLmF0dHJdIDw9IGZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLk1PUkVfRVFVQUw6XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtW2ZpbHRlci5hdHRyXSA+PSBmaWx0ZXIudmFsdWVzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5MRVNTX0VRVUFMOlxuICAgICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbVtmaWx0ZXIuYXR0cl0gPD0gZmlsdGVyLnZhbHVlcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0QWdncmVnYXRlRGF0YShjb2x1bW46IE9Db2x1bW4pIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBsZXQgdG90YWxWYWx1ZSA9ICcnO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl90YWJsZU9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5KG9iaik7XG4gICAgfVxuICAgIHRvdGFsVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0ZURhdGFbY29sdW1uLmF0dHJdO1xuICAgIHJldHVybiB0b3RhbFZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZUFnZ3JlZ2F0ZShkYXRhOiBhbnlbXSwgY29sdW1uQXR0cjogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nIHwgQWdncmVnYXRlRnVuY3Rpb24pOiBudW1iZXIgfCBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCByZXN1bHRBZ2dyZWdhdGU7XG4gICAgaWYgKHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN3aXRjaCAob3BlcmF0b3IudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdjb3VudCc6XG4gICAgICAgICAgcmVzdWx0QWdncmVnYXRlID0gdGhpcy5jb3VudChjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLm1pbihjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLm1heChjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXZnJzpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLmF2Zyhjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXN1bHRBZ2dyZWdhdGUgPSB0aGlzLnN1bShjb2x1bW5BdHRyLCBkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sdW1uRGF0YTogYW55W10gPSB0aGlzLmdldENvbHVtbkRhdGEoY29sdW1uQXR0cik7XG4gICAgICBpZiAodHlwZW9mIG9wZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdEFnZ3JlZ2F0ZSA9IG9wZXJhdG9yKGNvbHVtbkRhdGEsIGNvbHVtbkF0dHIsIHRoaXMudGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0QWdncmVnYXRlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1bShjb2x1bW4sIGRhdGEpOiBudW1iZXIge1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIC8vSWYgdGhlIGRhdGEgaXMgZ3JvdXBlZCwgdGhlIHZhbHVlcyDigIvigItvZiB0aGUgc3ViZ3JvdXBzIGluIGxldmVsIDEgYXJlIHN1bW1lZFxuICAgICAgaWYgKGRhdGFbMF0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YUZyb21GaXJzdExldmVsVGFibGVHcm91cFJvdyhkYXRhKS5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgIHZhbHVlID0geC5nZXRDb2x1bW5BZ2dyZWdhdGVEYXRhKGNvbHVtbikucmVkdWNlKChhY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3VtdWxhdG9yICsgKGlzTmFOKGN1cnJlbnRWYWx1ZVtjb2x1bW5dKSA/IDAgOiBjdXJyZW50VmFsdWVbY29sdW1uXSk7XG4gICAgICAgICAgfSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGF0YS5yZWR1Y2UoKGFjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhY3VtdWxhdG9yICsgKGlzTmFOKGN1cnJlbnRWYWx1ZVtjb2x1bW5dKSA/IDAgOiBjdXJyZW50VmFsdWVbY29sdW1uXSk7XG4gICAgICAgIH0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICsodmFsdWUpLnRvRml4ZWQoMik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY291bnQoY29sdW1uLCBkYXRhKTogbnVtYmVyIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAvL0lmIHRoZSBkYXRhIGlzIGdyb3VwZWQsIHRoZSBjb3VudCBpcyBjYWxjdWxhdGVkIGJ5IGFkZGluZyB0aGUgY291bnRzIGZvciBlYWNoIHN1Ymdyb3VwIGluIGxldmVsIDFcbiAgICAgIGlmIChkYXRhWzBdIGluc3RhbmNlb2YgT1RhYmxlR3JvdXBlZFJvdykge1xuICAgICAgICB0aGlzLmdldERhdGFGcm9tRmlyc3RMZXZlbFRhYmxlR3JvdXBSb3coZGF0YSkuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICB2YWx1ZSA9IHguZ2V0Q29sdW1uQWdncmVnYXRlRGF0YShjb2x1bW4pLnJlZHVjZSgoYWN1bXVsYXRvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdW11bGF0b3IgKyAxO1xuICAgICAgICAgIH0sIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRhdGEucmVkdWNlKChhY3VtdWxhdG9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFjdW11bGF0b3IgKyAxO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGF2Zyhjb2x1bW4sIGRhdGEpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsU3VtID0gdGhpcy5zdW0oY29sdW1uLCBkYXRhKTtcbiAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy5jb3VudChjb2x1bW4sIGRhdGEpO1xuICAgIHJldHVybiArKCh0b3RhbFN1bSA9PT0gMCB8fCB0b3RhbENvdW50ID09PSAwKSA/IDAgOiAodG90YWxTdW0gLyB0b3RhbENvdW50KSkudG9GaXhlZCgyKTtcblxuICB9XG5cbiAgcHJvdGVjdGVkIG1pbihjb2x1bW4sIGRhdGEpOiBudW1iZXIge1xuICAgIGxldCB0ZW1wTWluID0gW107XG4gICAgLy9JZiB0aGUgZGF0YSBpcyBncm91cGVkLCB0aGUgbWluaW11bSBpcyBjYWxjdWxhdGVkIHdpdGggdGhlIG1pbmltdW0gb2YgZWFjaCBzdWJncm91cCBpbiBsZXZlbCAxXG4gICAgaWYgKGRhdGFbMF0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgICB0ZW1wTWluID0gdGhpcy5nZXREYXRhRnJvbUZpcnN0TGV2ZWxUYWJsZUdyb3VwUm93KGRhdGEpLm1hcCh4ID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKC4uLnguZ2V0Q29sdW1uQWdncmVnYXRlRGF0YShjb2x1bW4pLm1hcCh4ID0+IHhbY29sdW1uXSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBNaW4gPSBkYXRhLm1hcCh4ID0+IHhbY29sdW1uXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBNaW4ubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLnRlbXBNaW4pIDogMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXgoY29sdW1uLCBkYXRhKTogbnVtYmVyIHtcbiAgICBsZXQgdGVtcE1heCA9IFtdO1xuICAgIGlmIChkYXRhWzBdIGluc3RhbmNlb2YgT1RhYmxlR3JvdXBlZFJvdykge1xuICAgICAgLy9JZiB0aGUgZGF0YSBhcmUgZ3JvdXBlZCwgdGhlIG1heGltdW0gaXMgY2FsY3VsYXRlZCB3aXRoIHRoZSBtYXhpbXVtIG9mIGVhY2ggc3ViZ3JvdXAgaW4gbGV2ZWwgMVxuICAgICAgdGVtcE1heCA9IHRoaXMuZ2V0RGF0YUZyb21GaXJzdExldmVsVGFibGVHcm91cFJvdyhkYXRhKS5tYXAoeCA9PiB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCguLi54LmdldENvbHVtbkFnZ3JlZ2F0ZURhdGEoY29sdW1uKS5tYXAoeCA9PiB4W2NvbHVtbl0pKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wTWF4ID0gZGF0YS5tYXAoeCA9PiB4W2NvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcE1heC5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4udGVtcE1heCkgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ZpcnN0TGV2ZWxUYWJsZUdyb3VwUm93KHRhYmxlUm93R3JvdXBEYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGFibGVSb3dHcm91cERhdGEgaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93ICYmIHRhYmxlUm93R3JvdXBEYXRhLmxldmVsID09PSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhRnJvbUZpcnN0TGV2ZWxUYWJsZUdyb3VwUm93KGRhdGE6IGFueSkge1xuICAgIHJldHVybiBkYXRhLmZpbHRlcih4ID0+IHRoaXMuaXNGaXJzdExldmVsVGFibGVHcm91cFJvdyh4KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXhpc3RzQW55Q2FsY3VsYXRlZENvbHVtbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVPcHRpb25zLmNvbHVtbnMuZmluZCgob0NvbDogT0NvbHVtbikgPT4gb0NvbC5jYWxjdWxhdGUgIT09IHVuZGVmaW5lZCkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZVJlbmRlcmVkUm93RGF0YShyb3dEYXRhOiBhbnkpIHtcbiAgICBjb25zdCB0YWJsZUtleXMgPSB0aGlzLnRhYmxlLmdldEtleXMoKTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlbmRlcmVkRGF0YS5maW5kKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGxldCBmb3VuZCA9IHRydWU7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGFibGVLZXlzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRhYmxlS2V5c1tpXTtcbiAgICAgICAgaWYgKGRhdGFba2V5XSAhPT0gcm93RGF0YVtrZXldKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH0pO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChyZWNvcmQpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgcm93RGF0YSk7XG4gICAgfVxuICB9XG5cblxuICBwcml2YXRlIGdldERhdGFJbmZvcm1hdGlvbkJ5R3JvdXAoZGF0YTogYW55W10sIGxldmVsOiBudW1iZXIpIHtcbiAgICBjb25zdCByZWNvcmRIYXNoID0ge307XG4gICAgZGF0YS5mb3JFYWNoKChyb3csIGkpID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSB7fTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAga2V5c1t0aGlzLnRhYmxlLmdyb3VwZWRDb2x1bW5zQXJyYXlbaV1dID0gdGhpcy50YWJsZS5nZXRDb2x1bW5EYXRhQnlBdHRyKHRoaXMudGFibGUuZ3JvdXBlZENvbHVtbnNBcnJheVtpXSwgcm93KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IEpTT04uc3RyaW5naWZ5KGtleXMpO1xuICAgICAgaWYgKHJlY29yZEhhc2guaGFzT3duUHJvcGVydHkocmVjb3JkS2V5KSkge1xuICAgICAgICByZWNvcmRIYXNoW3JlY29yZEtleV0ucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZEhhc2hbcmVjb3JkS2V5XSA9IFtpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVjb3JkSGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgcmVjYWxjdWxhdGVDb2x1bW5BZ2dyZWdhdGUoY29sdW1uQXR0cjogc3RyaW5nLCByb3c6IE9UYWJsZUdyb3VwZWRSb3cpIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVDb25mID0gcm93LmdldEFjdGl2ZUNvbHVtbkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24oY29sdW1uQXR0cik7XG4gICAgY29uc3QgZGF0YSA9IHJvdy5nZXRDb2x1bW5BZ2dyZWdhdGVEYXRhKGNvbHVtbkF0dHIpO1xuICAgIGNvbnN0IHZhbHVlT3JQcm9taXNlID0gdGhpcy5jYWxjdWxhdGVBZ2dyZWdhdGUoZGF0YSwgYWdncmVnYXRlQ29uZi5hdHRyLCBhZ2dyZWdhdGVDb25mLmFnZ3JlZ2F0ZUZ1bmN0aW9uIHx8IGFnZ3JlZ2F0ZUNvbmYuYWdncmVnYXRlKTtcblxuICAgIGlmICh2YWx1ZU9yUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHZhbHVlT3JQcm9taXNlXG4gICAgICAgIC50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICByb3cuc2V0Q29sdW1uQWdncmVnYXRlVmFsdWUoY29sdW1uQXR0ciwgdmFsdWUpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoYG8tdGFibGUtY29sdW1uLWFnZ3JlZ2F0ZTogQXN5bmMgYWdncmVnYXRlIGVycm9yIGluIGNvbHVtbiBcIiR7Y29sdW1uQXR0cn1cIiB1c2luZyBhZ2dyZWdhdGUgZnVuY3Rpb24gXCIke2FnZ3JlZ2F0ZUNvbmYuYWdncmVnYXRlRnVuY3Rpb259XCI6YCwgZXJyKSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcm93LnNldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKGNvbHVtbkF0dHIsIHZhbHVlT3JQcm9taXNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFN1YmxldmVsKGRhdGE6IGFueVtdLCBsZXZlbDogbnVtYmVyLCBwYXJlbnQ/OiBPVGFibGVHcm91cGVkUm93KTogYW55W10ge1xuICAgIGlmIChsZXZlbCA+PSB0aGlzLnRhYmxlLmdyb3VwZWRDb2x1bW5zQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkSGFzaCA9IHRoaXMuZ2V0RGF0YUluZm9ybWF0aW9uQnlHcm91cChkYXRhLCBsZXZlbCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgT2JqZWN0LmtleXMocmVjb3JkSGFzaCkuZm9yRWFjaChyZWNvcmRLZXkgPT4ge1xuXG4gICAgICBjb25zdCByb3cgPSBuZXcgT1RhYmxlR3JvdXBlZFJvdyh7XG4gICAgICAgIGNvbHVtbjogdGhpcy50YWJsZS5ncm91cGVkQ29sdW1uc0FycmF5W2xldmVsXSxcbiAgICAgICAga2V5c0FzU3RyaW5nOiByZWNvcmRLZXksXG4gICAgICAgIGxldmVsOiBsZXZlbCArIDEsXG4gICAgICAgIHBhcmVudDogcGFyZW50XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ncm91cGVkUm93c1N1YnNjcmlwdGlvbi5hZGQocm93LmFnZ3JlZ2F0ZUZ1bmN0aW9uQ2hhbmdlLnN1YnNjcmliZShhcmcgPT4ge1xuICAgICAgICBpZiAoYXJnLmNoYW5nZUFsbEdyb3VwZWRSb3dzKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2dyZWdhdGVzW2FyZy5jb2x1bW5BdHRyXSA9IGFyZy5hY3RpdmVBZ2dyZWdhdGU7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlZERhdGEuZmlsdGVyKHJvdyA9PiByb3cgaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICByb3cuc2V0Q29sdW1uQWN0aXZlQWdncmVnYXRlRnVuY3Rpb24oYXJnLmNvbHVtbkF0dHIsIGFyZy5hY3RpdmVBZ2dyZWdhdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMucmVjYWxjdWxhdGVDb2x1bW5BZ2dyZWdhdGUoYXJnLmNvbHVtbkF0dHIsIHJvdyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNvbHVtbkFnZ3JlZ2F0ZShhcmcuY29sdW1uQXR0ciwgYXJnLnJvdyk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGFmZmVjdGVkSW5kZXhlcyA9IHJlY29yZEhhc2hbcm93LmtleXNBc1N0cmluZ107XG4gICAgICBjb25zdCBncm91cERhdGEgPSBkYXRhLmZpbHRlcigocm93LCBpbmRleCkgPT4gYWZmZWN0ZWRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gICAgICB0aGlzLnRhYmxlLnZpc2libGVDb2xBcnJheS5mb3JFYWNoKChjb2x1bW5BdHRyLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgcm93LnRpdGxlID0gdGhpcy5nZXRUZXh0R3JvdXBSb3cocm93LCBhZmZlY3RlZEluZGV4ZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VDb2x1bW5BZ2dyZWdhdGUgPSB0aGlzLnRhYmxlLnVzZUNvbHVtbkdyb3VwaW5nQWdncmVnYXRlKGNvbHVtbkF0dHIpO1xuICAgICAgICBpZiAodXNlQ29sdW1uQWdncmVnYXRlKSB7XG4gICAgICAgICAgcm93LmluaXRpYWxpemVDb2x1bW5BZ2dyZWdhdGUoY29sdW1uQXR0ciwgdGhpcy50YWJsZS5nZXRDb2x1bW5Hcm91cGluZ0NvbXBvbmVudChjb2x1bW5BdHRyKSk7XG5cbiAgICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5hY3RpdmVBZ2dyZWdhdGVzW2NvbHVtbkF0dHJdKSkge1xuICAgICAgICAgICAgcm93LnNldENvbHVtbkFjdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKGNvbHVtbkF0dHIsIHRoaXMuYWN0aXZlQWdncmVnYXRlc1tjb2x1bW5BdHRyXSwgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyb3cuaGFzQWN0aXZlQWdncmVnYXRlKGNvbHVtbkF0dHIpKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2dyZWdhdGVEYXRhID0gZ3JvdXBEYXRhLm1hcCh4ID0+IHsgY29uc3Qgb2JqID0ge307IG9ialtjb2x1bW5BdHRyXSA9IHhbY29sdW1uQXR0cl07IHJldHVybiBvYmo7IH0pO1xuICAgICAgICAgICAgcm93LnNldENvbHVtbkFnZ3JlZ2F0ZURhdGEoY29sdW1uQXR0ciwgYWdncmVnYXRlRGF0YSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbmYgPSByb3cuZ2V0QWN0aXZlQ29sdW1uQWdncmVnYXRlQ29uZmlndXJhdGlvbihjb2x1bW5BdHRyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT3JQcm9taXNlID0gdGhpcy5jYWxjdWxhdGVBZ2dyZWdhdGUoXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZURhdGEsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZUNvbmYuYXR0cixcbiAgICAgICAgICAgICAgYWdncmVnYXRlQ29uZi5hZ2dyZWdhdGVGdW5jdGlvbiB8fCBhZ2dyZWdhdGVDb25mLmFnZ3JlZ2F0ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlT3JQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAvLyBJZiBpdCByZXR1cm5zIGEgUHJvbWlzZSwgd2Ugd2FpdCBmb3IgaXRzIHJlc29sdXRpb24gd2l0aG91dCBibG9ja2luZyBleGVjdXRpb24uXG4gICAgICAgICAgICAgIHZhbHVlT3JQcm9taXNlXG4gICAgICAgICAgICAgICAgLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgcm93LnNldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKGNvbHVtbkF0dHIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihgby10YWJsZS1jb2x1bW5zLWdyb3VwaW5nLWNvbHVtbjogQXN5bmMgYWdncmVnYXRlIGVycm9yIGluIGNvbHVtbiBcIiR7Y29sdW1uQXR0cn1cIiB1c2luZyBhZ2dyZWdhdGUgZnVuY3Rpb24gXCIke2FnZ3JlZ2F0ZUNvbmYuYWdncmVnYXRlRnVuY3Rpb259XCI6YCwgZXJyKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBJZiBpdCdzIGEgc3luY2hyb25vdXMgcmVzdWx0LCB3ZSBhc3NpZ24gaXQgZGlyZWN0bHlcbiAgICAgICAgICAgICAgcm93LnNldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKGNvbHVtbkF0dHIsIHZhbHVlT3JQcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcm93LmV4cGFuZGVkID0gdGhpcy5nZXRFeHBhbnNpb25TdGF0ZShyb3cpO1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSB0aGlzLmdldFN1YmxldmVsKGdyb3VwRGF0YSwgbGV2ZWwgKyAxLCByb3cpO1xuICAgICAgc3ViR3JvdXAudW5zaGlmdChyb3cpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGNvbGxhcHNlZCByb3cgZ3JvdXBcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMgY29sbGFwc2VkIHJvdyBncm91cFxuICAgKi9cbiAgZmlsdGVyQ29sbGFwc2VkUm93R3JvdXAoZGF0YTogYW55KTogYW55W10ge1xuICAgIHJldHVybiBkYXRhLmZpbHRlcigocm93OiBhbnkpID0+IChyb3cgaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KSA/IHJvdy52aXNpYmxlIDogdGhpcy5iZWxvbmdzVG9FeHBhbmRlZEdyb3VwZWRSb3coZGF0YSwgcm93KSk7XG4gIH1cblxuICAvKipcbiAgICogQmVsb25ncyB0byBhbiBleHBhbmRlZCBncm91cGVkIHJvd1xuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gcm93XG4gICAqIEByZXR1cm5zIHRydWUgaWYgdG8gZXhwYW5kZWQgZ3JvdXBlZCByb3dcbiAgICovXG4gIGJlbG9uZ3NUb0V4cGFuZGVkR3JvdXBlZFJvdyhkYXRhOiBhbnksIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmVudDogT1RhYmxlR3JvdXBlZFJvdztcbiAgICBsZXQgbWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5sZW5ndGggJiYgIW1hdGNoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZGF0YVtpbmRleF0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgICAgIHBhcmVudCA9IGRhdGFbaW5kZXhdO1xuICAgICAgfSBlbHNlIGlmIChVdGlsLmlzRXF1aXZhbGVudChkYXRhW2luZGV4XSwgcm93KSkge1xuICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChwYXJlbnQpID8gKHBhcmVudC52aXNpYmxlICYmIHBhcmVudC5leHBhbmRlZCkgOiB0cnVlO1xuICB9XG5cbiAgdXBkYXRlR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgdGhpcy50YWJsZS5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuZ3JvdXBCeUNvbHVtbkNoYW5nZS5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyBncm91cCBieSBjb2x1bW5cbiAgICogQHBhcmFtIHJvd0dyb3VwXG4gICAqL1xuICB0b2dnbGVHcm91cEJ5Q29sdW1uKHJvd0dyb3VwOiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgaWYgKHJvd0dyb3VwLmV4cGFuZFNhbWVMZXZlbCh0aGlzLnRhYmxlLmV4cGFuZEdyb3Vwc1NhbWVMZXZlbCkpIHtcbiAgICAgIHRoaXMubGV2ZWxzRXhwYW5zaW9uU3RhdGVbcm93R3JvdXAubGV2ZWxdID0gIXJvd0dyb3VwLmV4cGFuZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlUm93R3JvdXBlZChyb3dHcm91cCk7XG4gICAgfVxuICAgIHRoaXMuZ3JvdXBCeUNvbHVtbkNoYW5nZS5uZXh0KCk7XG4gIH1cblxuICBzZXRSb3dHcm91cExldmVsRXhwYW5zaW9uKHJvd0dyb3VwOiBPVGFibGVHcm91cGVkUm93LCB2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMubGV2ZWxzRXhwYW5zaW9uU3RhdGVbcm93R3JvdXAubGV2ZWxdID0gdmFsdWU7XG4gICAgdGhpcy5ncm91cEJ5Q29sdW1uQ2hhbmdlLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdGVSb3dHcm91cGVkKHJvd0dyb3VwOiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgY29uc3Qgc3RhdGVSb3dHcm91cGVkID0gdGhpcy5ncm91cGVkUm93U3RhdGUuZmluZChyb3cgPT4gcm93R3JvdXAua2V5c0FzU3RyaW5nID09PSByb3cua2V5c0FzU3RyaW5nICYmIEpTT04uc3RyaW5naWZ5KHJvd0dyb3VwLnBhcmVudCkgPT09IEpTT04uc3RyaW5naWZ5KHJvdy5wYXJlbnQpKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoc3RhdGVSb3dHcm91cGVkKSkge1xuICAgICAgc3RhdGVSb3dHcm91cGVkLmV4cGFuZGVkID0gIXN0YXRlUm93R3JvdXBlZC5leHBhbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93R3JvdXAuZXhwYW5kZWQgPSAhcm93R3JvdXAuZXhwYW5kZWQ7XG4gICAgICB0aGlzLmdyb3VwZWRSb3dTdGF0ZS5wdXNoKHJvd0dyb3VwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRHcm91cFJvdyhncm91cDogT1RhYmxlR3JvdXBlZFJvdywgdG90YWxDb3VudHM6IG51bWJlcikge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy50YWJsZS5ncm91cGVkQ29sdW1uc0FycmF5W2dyb3VwLmxldmVsIC0gMV07XG4gICAgbGV0IHZhbHVlID0gSlNPTi5wYXJzZShncm91cC5rZXlzQXNTdHJpbmcpW3RoaXMudGFibGUuZ3JvdXBlZENvbHVtbnNBcnJheVtncm91cC5sZXZlbCAtIDFdXTtcblxuICAgIGNvbnN0IG9Db2wgPSB0aGlzLnRhYmxlLmdldE9Db2x1bW4oZmllbGQpO1xuXG4gICAgaWYgKCF2YWx1ZSAmJiBVdGlsLmlzRGVmaW5lZChvQ29sLnJlbmRlcmVyKSAmJiAodGhpcy50YWJsZSBhcyBhbnkpLmlzSW5zdGFuY2VPZk9UYWJsZUNlbGxSZW5kZXJlclNlcnZpY2VDb21wb25lbnQob0NvbC5yZW5kZXJlcikpIHtcbiAgICAgIHZhbHVlID0gJyAtICc7XG4gICAgICBpZiAoIXRoaXMudGFibGUub25EYXRhTG9hZGVkQ2VsbFJlbmRlcmVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMudGFibGUub25EYXRhTG9hZGVkQ2VsbFJlbmRlcmVyU3Vic2NyaXB0aW9uID0gKG9Db2wucmVuZGVyZXIgYXMgYW55KS5vbkRhdGFMb2FkZWQuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlR3JvdXBlZENvbHVtbnMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAodGhpcy50YWJsZSBhcyBhbnkpLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG9Db2wudGl0bGUpICsgJzogJyArIHZhbHVlICsgJyAoJyArIHRvdGFsQ291bnRzICsgJyknO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBhbnNpb25TdGF0ZShyb3c6IE9UYWJsZUdyb3VwZWRSb3cpOiBib29sZWFuIHtcbiAgICBsZXQgZXhwYW5zaW9uU3RhdGUgPSAhcGFyZW50IHx8ICF0aGlzLnRhYmxlLmNvbGxhcHNlR3JvdXBlZENvbHVtbnM7XG4gICAgaWYgKHJvdy5leHBhbmRTYW1lTGV2ZWwodGhpcy50YWJsZS5leHBhbmRHcm91cHNTYW1lTGV2ZWwpKSB7XG4gICAgICBleHBhbnNpb25TdGF0ZSA9IHRoaXMubGV2ZWxzRXhwYW5zaW9uU3RhdGUuaGFzT3duUHJvcGVydHkocm93LmxldmVsKSA/IHRoaXMubGV2ZWxzRXhwYW5zaW9uU3RhdGVbcm93LmxldmVsXSA6IGV4cGFuc2lvblN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb3dHcm91cCA9IHRoaXMuZ3JvdXBlZFJvd1N0YXRlLmZpbmQoeCA9PiB4LmtleXNBc1N0cmluZyA9PT0gcm93LmtleXNBc1N0cmluZyAmJiBKU09OLnN0cmluZ2lmeSh4LnBhcmVudCkgPT09IEpTT04uc3RyaW5naWZ5KHJvdy5wYXJlbnQpKTtcbiAgICAgIGV4cGFuc2lvblN0YXRlID0gcm93R3JvdXAgPyByb3dHcm91cC5leHBhbmRlZCA6IGV4cGFuc2lvblN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gZXhwYW5zaW9uU3RhdGU7XG4gIH1cbn1cblxuXG5cbiJdfQ==
|