barsa-sap-ui 2.2.73 → 2.2.74
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/fesm2022/barsa-sap-ui.mjs +756 -760
- package/fesm2022/barsa-sap-ui.mjs.map +1 -1
- package/lib/models/grid-data-provider.d.ts +1 -1
- package/lib/notification-popup.service.d.ts +1 -1
- package/lib/ui-grid-columns/ui-grid-columns.component.d.ts +1 -1
- package/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.d.ts +1 -1
- package/lib/ui-pictures-info/ui-pictures-info.component.d.ts +2 -2
- package/lib/ui-table-view/ui-table-view.component.d.ts +4 -4
- package/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.d.ts +1 -1
- package/lib/ul-notify-popup/ul-notify-popup.component.d.ts +1 -1
- package/lib/ulv-toolbar/ulv-toolbar.component.d.ts +2 -2
- package/package.json +3 -5
- package/esm2022/barsa-sap-ui.mjs +0 -5
- package/esm2022/lib/apply-conditional-formmatings.directive.mjs +0 -90
- package/esm2022/lib/avatar-size.pipe.mjs +0 -41
- package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +0 -41
- package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +0 -153
- package/esm2022/lib/barsa-bar-download-file/barsa-bar-download-file.component.mjs +0 -30
- package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +0 -23
- package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +0 -29
- package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +0 -24
- package/esm2022/lib/barsa-card-banner/barsa-card-banner.component.mjs +0 -38
- package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +0 -24
- package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +0 -31
- package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +0 -41
- package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +0 -24
- package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +0 -84
- package/esm2022/lib/barsa-chat/chat.model.mjs +0 -8
- package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +0 -13
- package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +0 -22
- package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +0 -117
- package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +0 -79
- package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +0 -22
- package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +0 -13
- package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +0 -15
- package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +0 -72
- package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +0 -23
- package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +0 -14
- package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +0 -14
- package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +0 -26
- package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +0 -71
- package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +0 -40
- package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +0 -61
- package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +0 -45
- package/esm2022/lib/barsa-form-layout-panel/barsa-form-layout-panel.component.mjs +0 -58
- package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +0 -58
- package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +0 -27
- package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +0 -94
- package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +0 -22
- package/esm2022/lib/barsa-img-skeleton/barsa-img-skeleton.component.mjs +0 -25
- package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +0 -37
- package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +0 -42
- package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +0 -30
- package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +0 -23
- package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +0 -43
- package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +0 -83
- package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +0 -57
- package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +0 -159
- package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +0 -17
- package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +0 -30
- package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +0 -14
- package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +0 -34
- package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +0 -46
- package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +0 -79
- package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +0 -30
- package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +0 -31
- package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +0 -28
- package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +0 -103
- package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +0 -26
- package/esm2022/lib/barsa-sap-ui-routing.module.mjs +0 -18
- package/esm2022/lib/barsa-sap-ui.module.mjs +0 -369
- package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +0 -30
- package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +0 -171
- package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +0 -18
- package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +0 -29
- package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +0 -230
- package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +0 -102
- package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +0 -60
- package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +0 -26
- package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +0 -23
- package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +0 -37
- package/esm2022/lib/barsa-theme/barsa-theme.component.mjs +0 -121
- package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +0 -419
- package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +0 -36
- package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +0 -153
- package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +0 -20
- package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +0 -248
- package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +0 -79
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -52
- package/esm2022/lib/captcha-field/captcha-field.component.mjs +0 -33
- package/esm2022/lib/card-item/card-item.component.mjs +0 -79
- package/esm2022/lib/card-view-content/card-view-content.component.mjs +0 -46
- package/esm2022/lib/col-renderer.directive.mjs +0 -47
- package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +0 -56
- package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +0 -61
- package/esm2022/lib/column-renderer/column-renderer.component.mjs +0 -108
- package/esm2022/lib/constants.mjs +0 -450
- package/esm2022/lib/contentDensity.directive.mjs +0 -25
- package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +0 -41
- package/esm2022/lib/device-info-field-base.mjs +0 -24
- package/esm2022/lib/dialog-handler.directive.mjs +0 -29
- package/esm2022/lib/download-files.directive.mjs +0 -34
- package/esm2022/lib/dynamic-page-size.pipe.mjs +0 -27
- package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +0 -44
- package/esm2022/lib/file-viewer/file-viewer.component.mjs +0 -47
- package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +0 -80
- package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +0 -40
- package/esm2022/lib/form-dialog/form-dialog.component.mjs +0 -175
- package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +0 -50
- package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +0 -62
- package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +0 -45
- package/esm2022/lib/form-wizard/form-wizard.component.mjs +0 -22
- package/esm2022/lib/fullscreen-dialog.directive.mjs +0 -60
- package/esm2022/lib/fullscreen-files.directive.mjs +0 -43
- package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +0 -220
- package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +0 -215
- package/esm2022/lib/global-search/global-search.component.mjs +0 -27
- package/esm2022/lib/global-search-module/global-search-module.component.mjs +0 -29
- package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +0 -25
- package/esm2022/lib/header-avatar/header-avatar.component.mjs +0 -18
- package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +0 -48
- package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -23
- package/esm2022/lib/index.mjs +0 -467
- package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +0 -32
- package/esm2022/lib/layout-actions/layout-actions.component.mjs +0 -70
- package/esm2022/lib/layout-control/layout-control.component.mjs +0 -320
- package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +0 -180
- package/esm2022/lib/list-item/list-item.component.mjs +0 -34
- package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +0 -42
- package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +0 -82
- package/esm2022/lib/ly-label/ly-label.component.mjs +0 -39
- package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +0 -83
- package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +0 -24
- package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +0 -24
- package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +0 -92
- package/esm2022/lib/ly-line/ly-line.component.mjs +0 -56
- package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +0 -22
- package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +0 -44
- package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +0 -49
- package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +0 -51
- package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +0 -43
- package/esm2022/lib/mask/mask.component.mjs +0 -22
- package/esm2022/lib/message-strip/message-strip.component.mjs +0 -29
- package/esm2022/lib/models/grid-data-provider.mjs +0 -121
- package/esm2022/lib/models/grid-view.mjs +0 -2
- package/esm2022/lib/models/index.mjs +0 -2
- package/esm2022/lib/no-data/no-data.component.mjs +0 -30
- package/esm2022/lib/notification-item/notification-item.component.mjs +0 -57
- package/esm2022/lib/notification-item-actions/notification-item-actions.component.mjs +0 -79
- package/esm2022/lib/notification-popup.service.mjs +0 -92
- package/esm2022/lib/object-status-icon.pipe.mjs +0 -27
- package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +0 -18
- package/esm2022/lib/report-navigator/report-navigator.component.mjs +0 -75
- package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +0 -61
- package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +0 -35
- package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +0 -97
- package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +0 -88
- package/esm2022/lib/report-tree-base.mjs +0 -387
- package/esm2022/lib/report-view-renderer.directive.mjs +0 -395
- package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +0 -50
- package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +0 -84
- package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +0 -74
- package/esm2022/lib/sap-font-class.pipe.mjs +0 -30
- package/esm2022/lib/sap-font.pipe.mjs +0 -30
- package/esm2022/lib/sap-size.pipe.mjs +0 -28
- package/esm2022/lib/sap-ui-report-base.component.mjs +0 -819
- package/esm2022/lib/search-panel/search-panel.component.mjs +0 -63
- package/esm2022/lib/static-text/static-text.component.mjs +0 -15
- package/esm2022/lib/table-th.directive.mjs +0 -87
- package/esm2022/lib/title/title.component.mjs +0 -15
- package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +0 -44
- package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +0 -33
- package/esm2022/lib/ui-button/ui-button.component.mjs +0 -32
- package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +0 -54
- package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +0 -63
- package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +0 -43
- package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +0 -44
- package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +0 -50
- package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +0 -38
- package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +0 -191
- package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +0 -150
- package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +0 -111
- package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +0 -53
- package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +0 -138
- package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +0 -104
- package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +0 -33
- package/esm2022/lib/ui-graph/ui-graph.component.mjs +0 -17
- package/esm2022/lib/ui-grid/ui-grid.component.mjs +0 -26
- package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +0 -43
- package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +0 -66
- package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +0 -75
- package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +0 -58
- package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +0 -123
- package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +0 -16
- package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +0 -11
- package/esm2022/lib/ui-label/ui-label.component.mjs +0 -12
- package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +0 -405
- package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +0 -85
- package/esm2022/lib/ui-map/ui-map.component.mjs +0 -68
- package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +0 -124
- package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +0 -19
- package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +0 -14
- package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +0 -55
- package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +0 -450
- package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +0 -28
- package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +0 -37
- package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +0 -59
- package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +0 -117
- package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +0 -36
- package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +0 -56
- package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +0 -28
- package/esm2022/lib/ui-notification-view/ui-notification-view.component.mjs +0 -47
- package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +0 -33
- package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +0 -27
- package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +0 -21
- package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +0 -271
- package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +0 -103
- package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +0 -260
- package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +0 -48
- package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +0 -36
- package/esm2022/lib/ui-report-carousel-view/ui-report-carousel-view.component.mjs +0 -140
- package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +0 -66
- package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +0 -24
- package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +0 -55
- package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +0 -36
- package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +0 -20
- package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +0 -296
- package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +0 -50
- package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +0 -52
- package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +0 -48
- package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +0 -24
- package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +0 -50
- package/esm2022/lib/ui-tree/ui-tree.component.mjs +0 -115
- package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +0 -100
- package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +0 -23
- package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +0 -313
- package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +0 -25
- package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +0 -93
- package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +0 -119
- package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +0 -32
- package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +0 -48
- package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +0 -53
- package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +0 -116
- package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +0 -43
- package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +0 -196
- package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +0 -44
- package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +0 -84
- package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +0 -65
- package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +0 -116
- package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +0 -54
- package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +0 -177
- package/esm2022/lib/upload-file-status.pipe.mjs +0 -29
- package/esm2022/lib/util-chat-time-badge.pipe.mjs +0 -18
- package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +0 -23
- package/esm2022/lib/wizard-layout.directive.mjs +0 -104
- package/esm2022/public-api.mjs +0 -242
|
@@ -1,387 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
-
import { debounceTime, map, takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { BarsaApi, getAllItemsPerChildren, setOneDepthLevel } from 'barsa-novin-ray-core';
|
|
5
|
-
import { SapUiReportBaseComponent } from './sap-ui-report-base.component';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class ReportTreeBaseComponent extends SapUiReportBaseComponent {
|
|
8
|
-
constructor() {
|
|
9
|
-
super(...arguments);
|
|
10
|
-
this._dragMove = new Subject();
|
|
11
|
-
this._selectedNodeSource = new BehaviorSubject(null);
|
|
12
|
-
this._rootSource = new BehaviorSubject(null);
|
|
13
|
-
}
|
|
14
|
-
get _root() {
|
|
15
|
-
return this._rootSource.getValue();
|
|
16
|
-
}
|
|
17
|
-
ngOnInit() {
|
|
18
|
-
this.selectedNode$ = this._selectedNodeSource.asObservable();
|
|
19
|
-
this.root$ = this._rootSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
20
|
-
super.ngOnInit();
|
|
21
|
-
this.rtl$ = this._portalService.rtl$;
|
|
22
|
-
this.contentDensity$ = this._contentDensityService.contentDensity;
|
|
23
|
-
this._rootSource.next(this.context.root);
|
|
24
|
-
if (this.viewSetting?.DefaultCollapsed) {
|
|
25
|
-
this.collapseAll();
|
|
26
|
-
}
|
|
27
|
-
this._selectedNodeSource.next(this.context.selNode);
|
|
28
|
-
this.context.on({
|
|
29
|
-
rootChanged: (root) => {
|
|
30
|
-
this._rootSource.next(root);
|
|
31
|
-
},
|
|
32
|
-
selectedNodeChange: (node) => {
|
|
33
|
-
this._selectedNodeSource.next(node);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
this._rootSource
|
|
37
|
-
.pipe(takeUntil(this._onDestroy$), map((root) => {
|
|
38
|
-
if (root) {
|
|
39
|
-
const moList = [];
|
|
40
|
-
const autoOpenLevels = BarsaApi.Common.Util.TryGetValue(this.context, 'Setting.View.TreeAutoOpenLevels', 1);
|
|
41
|
-
getAllItemsPerChildren(root, 0, moList, root, autoOpenLevels);
|
|
42
|
-
return moList;
|
|
43
|
-
}
|
|
44
|
-
return [];
|
|
45
|
-
}))
|
|
46
|
-
.subscribe((flatMoDataList) => {
|
|
47
|
-
this.flatMoDataList = flatMoDataList.map((c) => ({
|
|
48
|
-
...c,
|
|
49
|
-
parentNode: c.parentNode ? { ...c.parentNode } : null
|
|
50
|
-
}));
|
|
51
|
-
});
|
|
52
|
-
this._resetDropActionTodo();
|
|
53
|
-
this._dragMove
|
|
54
|
-
.asObservable()
|
|
55
|
-
.pipe(takeUntil(this._onDestroy$), debounceTime(50))
|
|
56
|
-
.subscribe((event) => {
|
|
57
|
-
this._doDragMove(event);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
onCreateNew(e) {
|
|
61
|
-
this.context.fireEvent('createNew', e);
|
|
62
|
-
}
|
|
63
|
-
dragMoved(event) {
|
|
64
|
-
this._dragMove.next(event);
|
|
65
|
-
}
|
|
66
|
-
drop(event) {
|
|
67
|
-
this._removeNoDrops();
|
|
68
|
-
this._clearDragInfo();
|
|
69
|
-
const dragAction = this.dropActionTodo.action;
|
|
70
|
-
if (!dragAction) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
if (dragAction === 'forbid') {
|
|
74
|
-
ReportTreeBaseComponent._showForbiddenMoveAlert();
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
const draggedItemId = event.item.data;
|
|
78
|
-
const targetItemId = this.dropActionTodo.targetId;
|
|
79
|
-
const draggedItem = this._getNodeById(draggedItemId);
|
|
80
|
-
const targetItem = this._getNodeById(targetItemId);
|
|
81
|
-
const oldParentNodeId = draggedItem.parentNode?.Data?.Id || '$Root';
|
|
82
|
-
const newParentNodeId = targetItem.parentNode?.Data?.Id || '$Root';
|
|
83
|
-
const oldParentNode = draggedItem.parentNode;
|
|
84
|
-
let newParentNode = targetItem.parentNode;
|
|
85
|
-
if (oldParentNode && newParentNode) {
|
|
86
|
-
switch (dragAction) {
|
|
87
|
-
case 'before':
|
|
88
|
-
case 'after': {
|
|
89
|
-
let serverTarget = targetItem;
|
|
90
|
-
if (dragAction === 'after') {
|
|
91
|
-
const targetIndex = this.flatMoDataList.findIndex((c) => c.Data.Id === targetItem.Data.Id);
|
|
92
|
-
if (targetIndex === this.flatMoDataList.length - 1) {
|
|
93
|
-
serverTarget = null;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
const afterTarget = this.flatMoDataList[targetIndex + 1];
|
|
97
|
-
if (afterTarget.parentNode === targetItem.parentNode) {
|
|
98
|
-
serverTarget = afterTarget;
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
serverTarget = null;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
this._saveToServer(draggedItem.Data.Id, serverTarget, newParentNode);
|
|
106
|
-
this._changeDraggedItemsOrder(draggedItem, targetItem, newParentNode, oldParentNode, oldParentNodeId);
|
|
107
|
-
if (newParentNodeId !== '$Root') {
|
|
108
|
-
const i = this.flatMoDataList.indexOf(draggedItem) -
|
|
109
|
-
this.flatMoDataList.indexOf(targetItem.parentNode);
|
|
110
|
-
newParentNode?.children.splice(i, 0, draggedItem);
|
|
111
|
-
}
|
|
112
|
-
// send new moDataList To server:
|
|
113
|
-
// (draggedItem, draggedItem.parentNode, draggedItem.parentNode.children?.indexOf(draggedItem))
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
case 'inside': {
|
|
117
|
-
newParentNode = targetItem;
|
|
118
|
-
this._saveToServer(draggedItem.Data.Id, null, newParentNode);
|
|
119
|
-
this._moveNodeInsideAnother(draggedItem, targetItem);
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
setOneDepthLevel(newParentNode);
|
|
124
|
-
setOneDepthLevel(oldParentNode);
|
|
125
|
-
this._clearDragInfo(true);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
_rebindRoot() {
|
|
129
|
-
this._rootSource.next(this._root);
|
|
130
|
-
}
|
|
131
|
-
_saveToServer(draggedId, target, parent) {
|
|
132
|
-
const targetId = target ? target.Data.Id : '0';
|
|
133
|
-
const parentId = parent.Data.Id === '$Root' ? '0' : parent.Data.Id;
|
|
134
|
-
BarsaApi.Bw.RunBlMethod('MoveTreeNode', draggedId, targetId, parentId);
|
|
135
|
-
}
|
|
136
|
-
confirmDialog(selectedNode) {
|
|
137
|
-
this.dialogRef.close(selectedNode);
|
|
138
|
-
}
|
|
139
|
-
dismissDialog() {
|
|
140
|
-
this.dialogRef.dismiss();
|
|
141
|
-
}
|
|
142
|
-
collapseAll() {
|
|
143
|
-
this.context.fireEvent('collapseAll');
|
|
144
|
-
}
|
|
145
|
-
openMoveToDialog(sourceNode, device, dialogTmp) {
|
|
146
|
-
const config = {
|
|
147
|
-
...this.dialogConfig,
|
|
148
|
-
data: { context: this.context },
|
|
149
|
-
mobile: device === 'mobile',
|
|
150
|
-
minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
|
|
151
|
-
minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight
|
|
152
|
-
};
|
|
153
|
-
this.dialogRef = this._dialogService.open(dialogTmp, config);
|
|
154
|
-
this.dialogRef.afterClosed.subscribe((destinationNode) => {
|
|
155
|
-
if (!destinationNode) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const canMove = this._canMove(sourceNode, destinationNode);
|
|
159
|
-
if (canMove) {
|
|
160
|
-
this._moveNodeInsideAnother(sourceNode, destinationNode);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
ReportTreeBaseComponent._showForbiddenMoveAlert();
|
|
164
|
-
}
|
|
165
|
-
this._rootSource.next(this._root);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
selectNodeInMoveDialog(ev) {
|
|
169
|
-
this.dialogSelectedNode = ev.node;
|
|
170
|
-
}
|
|
171
|
-
loadChildren(node) {
|
|
172
|
-
this.context.fireEvent('loadNodeChildren', node);
|
|
173
|
-
}
|
|
174
|
-
/* eslint-disable */
|
|
175
|
-
updateGridSetting() { }
|
|
176
|
-
_selectNode(node) {
|
|
177
|
-
this.context.selNode = node;
|
|
178
|
-
this._selectedNodeSource.next(node);
|
|
179
|
-
this.context.fireEvent('click');
|
|
180
|
-
this.context.fireEvent('selectionchange');
|
|
181
|
-
}
|
|
182
|
-
/* eslint-disable */
|
|
183
|
-
_deselectNode() {
|
|
184
|
-
this.context.selNode = null;
|
|
185
|
-
this._selectedNodeSource.next(null);
|
|
186
|
-
}
|
|
187
|
-
_raiseRowClick(index, mo) {
|
|
188
|
-
this.context.selNode = mo;
|
|
189
|
-
this.context?.fireEvent('dblclick', this.context, index, mo);
|
|
190
|
-
}
|
|
191
|
-
_resetDropActionTodo() {
|
|
192
|
-
this.dropActionTodo = { targetId: null, action: null };
|
|
193
|
-
}
|
|
194
|
-
_changeDraggedItemsOrder(draggedItem, targetItem, newParentNode, oldParentNode, oldParentNodeId) {
|
|
195
|
-
this._removeDraggedItemFromMoDataList(draggedItem);
|
|
196
|
-
if (oldParentNodeId !== '$Root') {
|
|
197
|
-
// oldParentNode.children?.remove(draggedItem);
|
|
198
|
-
oldParentNode.children = oldParentNode.children.filter((c) => c.Data.Id !== draggedItem.Data.Id);
|
|
199
|
-
oldParentNode.leaf = !(oldParentNode.children?.length > 0);
|
|
200
|
-
oldParentNode.Data.$HasChildren = !oldParentNode.leaf;
|
|
201
|
-
}
|
|
202
|
-
draggedItem.parentNode = newParentNode;
|
|
203
|
-
this._setLevelForDraggedItems(draggedItem, newParentNode.level || 0);
|
|
204
|
-
const targetIndex = this.flatMoDataList.indexOf(targetItem);
|
|
205
|
-
const index = this.dropActionTodo.action === 'before' ? targetIndex : this._nextIndexInMoDataList(targetItem);
|
|
206
|
-
this._addDraggedItemsToMoDataList(draggedItem, index);
|
|
207
|
-
}
|
|
208
|
-
_addDraggedItemsToMoDataList(node, i) {
|
|
209
|
-
this.flatMoDataList.splice(i, 0, node);
|
|
210
|
-
node?.children?.forEach((child) => {
|
|
211
|
-
i++;
|
|
212
|
-
i = this._addDraggedItemsToMoDataList(child, i);
|
|
213
|
-
});
|
|
214
|
-
return i;
|
|
215
|
-
}
|
|
216
|
-
_removeDraggedItemFromMoDataList(node) {
|
|
217
|
-
node?.children?.forEach((child) => {
|
|
218
|
-
this._removeDraggedItemFromMoDataList(child);
|
|
219
|
-
});
|
|
220
|
-
this.flatMoDataList.remove(node);
|
|
221
|
-
}
|
|
222
|
-
_nextIndexInMoDataList(node) {
|
|
223
|
-
return this.flatMoDataList.indexOf(node) + this._allNestedChildesCount(node) + 1;
|
|
224
|
-
}
|
|
225
|
-
_allNestedChildesCount(node, i = 0) {
|
|
226
|
-
node.children?.forEach((child) => {
|
|
227
|
-
i++;
|
|
228
|
-
if (child.children?.length > 0) {
|
|
229
|
-
i = this._allNestedChildesCount(child, i);
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
return i;
|
|
233
|
-
}
|
|
234
|
-
_getNodeById(id) {
|
|
235
|
-
let node;
|
|
236
|
-
for (const mo of this.flatMoDataList) {
|
|
237
|
-
if (mo.Data.Id === id) {
|
|
238
|
-
node = mo;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return node;
|
|
242
|
-
}
|
|
243
|
-
_setLevelForDraggedItems(node, parentLevel) {
|
|
244
|
-
parentLevel++;
|
|
245
|
-
node.level = parentLevel;
|
|
246
|
-
node?.children?.forEach((child) => {
|
|
247
|
-
this._setLevelForDraggedItems(child, parentLevel);
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
_moveNodeInsideAnother(sourceNode, destinationNode) {
|
|
251
|
-
const oldParentNode = sourceNode.parentNode;
|
|
252
|
-
const oldParentNodeId = oldParentNode?.Data?.Id || '$Root';
|
|
253
|
-
this._changeDraggedItemsOrder(sourceNode, destinationNode, destinationNode, oldParentNode, oldParentNodeId);
|
|
254
|
-
this.context.fireEvent('moveNodeInsideAnother', sourceNode, destinationNode);
|
|
255
|
-
}
|
|
256
|
-
_clearDragInfo(dropped = false) {
|
|
257
|
-
if (dropped) {
|
|
258
|
-
this._resetDropActionTodo();
|
|
259
|
-
}
|
|
260
|
-
this.el.nativeElement
|
|
261
|
-
.querySelectorAll('.drop-before')
|
|
262
|
-
.forEach((element) => this._renderer.removeClass(element, 'drop-before'));
|
|
263
|
-
this.el.nativeElement
|
|
264
|
-
.querySelectorAll('.drop-after')
|
|
265
|
-
.forEach((element) => this._renderer.removeClass(element, 'drop-after'));
|
|
266
|
-
this.el.nativeElement
|
|
267
|
-
.querySelectorAll('.drop-inside')
|
|
268
|
-
.forEach((element) => this._renderer.removeClass(element, 'drop-inside'));
|
|
269
|
-
}
|
|
270
|
-
_stopDragging() {
|
|
271
|
-
this._clearDragInfo();
|
|
272
|
-
this._resetDropActionTodo();
|
|
273
|
-
}
|
|
274
|
-
_showDragInfo() {
|
|
275
|
-
this._clearDragInfo();
|
|
276
|
-
if (this.dropActionTodo.targetId) {
|
|
277
|
-
const parent = this._getNodeById(this.dropActionTodo.targetId);
|
|
278
|
-
const newParentId = parent?.parentNode?.Data?.Id || '$Root';
|
|
279
|
-
const targetNodeElement = this.el.nativeElement.querySelector('#node-' + this.dropActionTodo.targetId);
|
|
280
|
-
if (!targetNodeElement) {
|
|
281
|
-
this._resetDropActionTodo();
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
else if (newParentId === '$Root' && this.dropActionTodo.action !== 'inside') {
|
|
285
|
-
const rootContainer = this.el.nativeElement.querySelector('fd-layout-panel');
|
|
286
|
-
this._renderer.addClass(rootContainer, 'drop-inside');
|
|
287
|
-
}
|
|
288
|
-
this._renderer.addClass(targetNodeElement, 'drop-' + this.dropActionTodo?.action);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
_doDragMove(event) {
|
|
292
|
-
const elementFromPoint = document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y);
|
|
293
|
-
if (!elementFromPoint) {
|
|
294
|
-
this._stopDragging();
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
const targetNodeElement = elementFromPoint.classList.contains('node-item')
|
|
298
|
-
? elementFromPoint
|
|
299
|
-
: elementFromPoint.closest('.node-item');
|
|
300
|
-
if (!targetNodeElement) {
|
|
301
|
-
this._stopDragging();
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
this.dropActionTodo = {
|
|
305
|
-
targetId: targetNodeElement.getAttribute('data-id')
|
|
306
|
-
};
|
|
307
|
-
const targetRect = targetNodeElement.getBoundingClientRect();
|
|
308
|
-
const oneThird = targetRect.height / 3;
|
|
309
|
-
if (event.pointerPosition.y - targetRect.top < oneThird) {
|
|
310
|
-
// before
|
|
311
|
-
this.dropActionTodo.action = 'before';
|
|
312
|
-
}
|
|
313
|
-
else if (event.pointerPosition.y - targetRect.top > 2 * oneThird) {
|
|
314
|
-
// after
|
|
315
|
-
this.dropActionTodo.action = 'after';
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
// inside
|
|
319
|
-
this.dropActionTodo.action = 'inside';
|
|
320
|
-
}
|
|
321
|
-
this._setNoDropItems(event.source.data);
|
|
322
|
-
this._setNoDropStyle();
|
|
323
|
-
const targetNode = this._getNodeById(this.dropActionTodo.targetId);
|
|
324
|
-
if (targetNode.noDrop) {
|
|
325
|
-
this._stopDragging();
|
|
326
|
-
this.dropActionTodo.action = 'forbid';
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
this._showDragInfo();
|
|
330
|
-
}
|
|
331
|
-
_removeNoDrops() {
|
|
332
|
-
this.flatMoDataList
|
|
333
|
-
.filter((node) => node.noDrop)
|
|
334
|
-
.forEach((node) => {
|
|
335
|
-
node.noDrop = false;
|
|
336
|
-
const el = this.el.nativeElement.querySelector('#node-' + node.Data.Id);
|
|
337
|
-
if (el) {
|
|
338
|
-
this._renderer.removeClass(el, 'no-drop');
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
_setNoDropItems(draggedItemId) {
|
|
343
|
-
const node = this._getNodeById(draggedItemId);
|
|
344
|
-
node.noDrop = true;
|
|
345
|
-
node.children?.forEach((child) => {
|
|
346
|
-
this._setNoDropItems(child.Data.Id);
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
_setNoDropStyle() {
|
|
350
|
-
this.flatMoDataList
|
|
351
|
-
.filter((node) => node.noDrop)
|
|
352
|
-
.forEach((node) => {
|
|
353
|
-
const el = this.el.nativeElement.querySelector('#node-' + node.Data.Id);
|
|
354
|
-
if (el) {
|
|
355
|
-
this._renderer.addClass(el, 'no-drop');
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
_canMove(sourceNode, destinationNode) {
|
|
360
|
-
let canMove = true;
|
|
361
|
-
if (sourceNode.Data.Id === destinationNode.Data.Id) {
|
|
362
|
-
canMove = false;
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
sourceNode.children?.foreach((child) => {
|
|
366
|
-
canMove = this._canMove(sourceNode, child);
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
return canMove;
|
|
370
|
-
}
|
|
371
|
-
/* eslint-disable */
|
|
372
|
-
static _showForbiddenMoveAlert() {
|
|
373
|
-
BarsaApi.Bw.Msg.Error('نمیتوانید آیتم را به زیرشاخه خودش منتقل کنید.');
|
|
374
|
-
}
|
|
375
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportTreeBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
376
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ReportTreeBaseComponent, selector: "bsu-report-tree-base", usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
377
|
-
}
|
|
378
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportTreeBaseComponent, decorators: [{
|
|
379
|
-
type: Component,
|
|
380
|
-
args: [{
|
|
381
|
-
selector: 'bsu-report-tree-base',
|
|
382
|
-
template: '',
|
|
383
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
384
|
-
standalone: false
|
|
385
|
-
}]
|
|
386
|
-
}] });
|
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXRyZWUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3JlcG9ydC10cmVlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5RCxPQUFPLEVBQ0gsUUFBUSxFQUtSLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDbkIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFTMUUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHdCQUFpRDtJQU45Rjs7UUFhSSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUlyQix3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFDcEUsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7S0F3WnpFO0lBdlpHLElBQVksS0FBSztRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsUUFBUTtRQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9FLEtBQUssQ0FBQyxRQUFRLEVBQUUs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UUFBUSxDQUFDLFVBQVUsRUFBRSxlQUFlO1FBQ3hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNKLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0Qsb0JBQW9CO0lBQ1osTUFBTSxDQUFDLHVCQUF1QjtRQUNsQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMzRSxDQUFDOytHQW5hUSx1QkFBdUI7bUdBQXZCLHVCQUF1QixtRkFKdEIsRUFBRTs7NEZBSUgsdUJBQXVCO2tCQU5uQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxVQUFVLEVBQUUsS0FBSztpQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5LCBEaWFsb2dDb25maWcgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEJhcnNhQXBpLFxyXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcclxuICAgIFVpUmVwb3J0Vmlld0Jhc2VTZXR0aW5nLFxyXG4gICAgVHJlZU5vZGVPYmosXHJcbiAgICBSZWxhdGlvbkl0ZW1UeXBlLFxyXG4gICAgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbixcclxuICAgIHNldE9uZURlcHRoTGV2ZWxcclxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IFNhcFVpUmVwb3J0QmFzZUNvbXBvbmVudCB9IGZyb20gJy4vc2FwLXVpLXJlcG9ydC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3BJbmZvIH0gZnJvbSAnLi91aS10cmVlLXZpZXcvdWktdHJlZS12aWV3LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LXJlcG9ydC10cmVlLWJhc2UnLFxyXG4gICAgdGVtcGxhdGU6ICcnLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0VHJlZUJhc2VDb21wb25lbnQgZXh0ZW5kcyBTYXBVaVJlcG9ydEJhc2VDb21wb25lbnQ8VWlSZXBvcnRWaWV3QmFzZVNldHRpbmc+IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIGNvbnRlbnREZW5zaXR5JDogT2JzZXJ2YWJsZTxDb250ZW50RGVuc2l0eT47XHJcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgZGlhbG9nU2VsZWN0ZWROb2RlO1xyXG4gICAgc2VsZWN0ZWROb2RlJDogT2JzZXJ2YWJsZTxUcmVlTm9kZU9iaiB8IG51bGw+O1xyXG4gICAgcm9vdCQ6IE9ic2VydmFibGU8VHJlZU5vZGVPYmogfCBudWxsPjtcclxuICAgIGRyb3BBY3Rpb25Ub2RvOiBEcm9wSW5mbztcclxuICAgIF9kcmFnTW92ZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIGZsYXRNb0RhdGFMaXN0O1xyXG4gICAgZGlhbG9nUmVmO1xyXG5cclxuICAgIHByb3RlY3RlZCBfc2VsZWN0ZWROb2RlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmVlTm9kZU9iaiB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJvdGVjdGVkIF9yb290U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmVlTm9kZU9iaiB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBnZXQgX3Jvb3QoKTogVHJlZU5vZGVPYmogfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFNvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUkID0gdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMucm9vdCQgPSB0aGlzLl9yb290U291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMucnRsJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UucnRsJDtcclxuICAgICAgICB0aGlzLmNvbnRlbnREZW5zaXR5JCA9IHRoaXMuX2NvbnRlbnREZW5zaXR5U2VydmljZS5jb250ZW50RGVuc2l0eTtcclxuICAgICAgICB0aGlzLl9yb290U291cmNlLm5leHQodGhpcy5jb250ZXh0LnJvb3QpO1xyXG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5EZWZhdWx0Q29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VBbGwoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLm5leHQodGhpcy5jb250ZXh0LnNlbE5vZGUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5vbih7XHJcbiAgICAgICAgICAgIHJvb3RDaGFuZ2VkOiAocm9vdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdFNvdXJjZS5uZXh0KHJvb3QpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVDaGFuZ2U6IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZE5vZGVTb3VyY2UubmV4dChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2VcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJvb3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm9vdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb0xpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvT3BlbkxldmVscyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NldHRpbmcuVmlldy5UcmVlQXV0b09wZW5MZXZlbHMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKHJvb3QsIDAsIG1vTGlzdCwgcm9vdCwgYXV0b09wZW5MZXZlbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9MaXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZsYXRNb0RhdGFMaXN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0ID0gZmxhdE1vRGF0YUxpc3QubWFwKChjKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmMsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZTogYy5wYXJlbnROb2RlID8geyAuLi5jLnBhcmVudE5vZGUgfSA6IG51bGxcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdNb3ZlXHJcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksIGRlYm91bmNlVGltZSg1MCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb0RyYWdNb3ZlKGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DcmVhdGVOZXcoZTogUmVsYXRpb25JdGVtVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2NyZWF0ZU5ldycsIGUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRyYWdNb3ZlZChldmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RyYWdNb3ZlLm5leHQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRyb3AoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9yZW1vdmVOb0Ryb3BzKCk7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJEcmFnSW5mbygpO1xyXG4gICAgICAgIGNvbnN0IGRyYWdBY3Rpb24gPSB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbjtcclxuICAgICAgICBpZiAoIWRyYWdBY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZHJhZ0FjdGlvbiA9PT0gJ2ZvcmJpZCcpIHtcclxuICAgICAgICAgICAgUmVwb3J0VHJlZUJhc2VDb21wb25lbnQuX3Nob3dGb3JiaWRkZW5Nb3ZlQWxlcnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbUlkID0gZXZlbnQuaXRlbS5kYXRhO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEl0ZW1JZCA9IHRoaXMuZHJvcEFjdGlvblRvZG8udGFyZ2V0SWQ7XHJcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW0gPSB0aGlzLl9nZXROb2RlQnlJZChkcmFnZ2VkSXRlbUlkKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGhpcy5fZ2V0Tm9kZUJ5SWQodGFyZ2V0SXRlbUlkKTtcclxuICAgICAgICBjb25zdCBvbGRQYXJlbnROb2RlSWQgPSBkcmFnZ2VkSXRlbS5wYXJlbnROb2RlPy5EYXRhPy5JZCB8fCAnJFJvb3QnO1xyXG4gICAgICAgIGNvbnN0IG5ld1BhcmVudE5vZGVJZCA9IHRhcmdldEl0ZW0ucGFyZW50Tm9kZT8uRGF0YT8uSWQgfHwgJyRSb290JztcclxuICAgICAgICBjb25zdCBvbGRQYXJlbnROb2RlID0gZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZTtcclxuICAgICAgICBsZXQgbmV3UGFyZW50Tm9kZSA9IHRhcmdldEl0ZW0ucGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAob2xkUGFyZW50Tm9kZSAmJiBuZXdQYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoZHJhZ0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYmVmb3JlJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2FmdGVyJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUYXJnZXQ6IFRyZWVOb2RlT2JqIHwgbnVsbCA9IHRhcmdldEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdBY3Rpb24gPT09ICdhZnRlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmZsYXRNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5EYXRhLklkID09PSB0YXJnZXRJdGVtLkRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IHRoaXMuZmxhdE1vRGF0YUxpc3QubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyVGFyZ2V0ID0gdGhpcy5mbGF0TW9EYXRhTGlzdFt0YXJnZXRJbmRleCArIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyVGFyZ2V0LnBhcmVudE5vZGUgPT09IHRhcmdldEl0ZW0ucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRhcmdldCA9IGFmdGVyVGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXJnZXQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhdmVUb1NlcnZlcihkcmFnZ2VkSXRlbS5EYXRhLklkLCBzZXJ2ZXJUYXJnZXQsIG5ld1BhcmVudE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURyYWdnZWRJdGVtc09yZGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50Tm9kZUlkXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFyZW50Tm9kZUlkICE9PSAnJFJvb3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGF0TW9EYXRhTGlzdC5pbmRleE9mKGRyYWdnZWRJdGVtKSAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2YodGFyZ2V0SXRlbS5wYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Tm9kZT8uY2hpbGRyZW4uc3BsaWNlKGksIDAsIGRyYWdnZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgbmV3IG1vRGF0YUxpc3QgVG8gc2VydmVyOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIChkcmFnZ2VkSXRlbSwgZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZSwgZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZS5jaGlsZHJlbj8uaW5kZXhPZihkcmFnZ2VkSXRlbSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudE5vZGUgPSB0YXJnZXRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhdmVUb1NlcnZlcihkcmFnZ2VkSXRlbS5EYXRhLklkLCBudWxsLCBuZXdQYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlTm9kZUluc2lkZUFub3RoZXIoZHJhZ2dlZEl0ZW0sIHRhcmdldEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldE9uZURlcHRoTGV2ZWwobmV3UGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHNldE9uZURlcHRoTGV2ZWwob2xkUGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9yZWJpbmRSb290KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2UubmV4dCh0aGlzLl9yb290KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NhdmVUb1NlcnZlcihkcmFnZ2VkSWQ6IHN0cmluZywgdGFyZ2V0OiBUcmVlTm9kZU9iaiB8IG51bGwsIHBhcmVudDogVHJlZU5vZGVPYmopOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRJZDogc3RyaW5nID0gdGFyZ2V0ID8gdGFyZ2V0LkRhdGEuSWQgOiAnMCc7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SWQ6IHN0cmluZyA9IHBhcmVudC5EYXRhLklkID09PSAnJFJvb3QnID8gJzAnIDogcGFyZW50LkRhdGEuSWQ7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2QoJ01vdmVUcmVlTm9kZScsIGRyYWdnZWRJZCwgdGFyZ2V0SWQsIHBhcmVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uZmlybURpYWxvZyhzZWxlY3RlZE5vZGU6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShzZWxlY3RlZE5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNtaXNzRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRpc21pc3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29sbGFwc2VBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnY29sbGFwc2VBbGwnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb3Blbk1vdmVUb0RpYWxvZyhzb3VyY2VOb2RlLCBkZXZpY2U6IHN0cmluZywgZGlhbG9nVG1wKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICBkYXRhOiB7IGNvbnRleHQ6IHRoaXMuY29udGV4dCB9LFxyXG4gICAgICAgICAgICBtb2JpbGU6IGRldmljZSA9PT0gJ21vYmlsZScsXHJcbiAgICAgICAgICAgIG1pbldpZHRoOiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJ2F1dG8nIDogdGhpcy5kaWFsb2dDb25maWcubWluV2lkdGgsXHJcbiAgICAgICAgICAgIG1pbkhlaWdodDogZGV2aWNlID09PSAnbW9iaWxlJyA/ICdhdXRvJyA6IHRoaXMuZGlhbG9nQ29uZmlnLm1pbkhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2dTZXJ2aWNlLm9wZW4oZGlhbG9nVG1wLCBjb25maWcpO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkLnN1YnNjcmliZSgoZGVzdGluYXRpb25Ob2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgY2FuTW92ZSA9IHRoaXMuX2Nhbk1vdmUoc291cmNlTm9kZSwgZGVzdGluYXRpb25Ob2RlKTtcclxuICAgICAgICAgICAgaWYgKGNhbk1vdmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVOb2RlSW5zaWRlQW5vdGhlcihzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVwb3J0VHJlZUJhc2VDb21wb25lbnQuX3Nob3dGb3JiaWRkZW5Nb3ZlQWxlcnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yb290U291cmNlLm5leHQodGhpcy5fcm9vdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNlbGVjdE5vZGVJbk1vdmVEaWFsb2coZXY6IHsgbm9kZTogVHJlZU5vZGVPYmo7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nU2VsZWN0ZWROb2RlID0gZXYubm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbG9hZENoaWxkcmVuKG5vZGU6IFRyZWVOb2RlT2JqKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnbG9hZE5vZGVDaGlsZHJlbicsIG5vZGUpO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVHcmlkU2V0dGluZygpOiB2b2lkIHt9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROb2RlKG5vZGU6IFRyZWVOb2RlT2JqKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlbE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTm9kZVNvdXJjZS5uZXh0KG5vZGUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2NsaWNrJyk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnc2VsZWN0aW9uY2hhbmdlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIHByb3RlY3RlZCBfZGVzZWxlY3ROb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zZWxOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZE5vZGVTb3VyY2UubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JhaXNlUm93Q2xpY2soaW5kZXgsIG1vKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlbE5vZGUgPSBtbztcclxuICAgICAgICB0aGlzLmNvbnRleHQ/LmZpcmVFdmVudCgnZGJsY2xpY2snLCB0aGlzLmNvbnRleHQsIGluZGV4LCBtbyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzZXREcm9wQWN0aW9uVG9kbygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyb3BBY3Rpb25Ub2RvID0geyB0YXJnZXRJZDogbnVsbCwgYWN0aW9uOiBudWxsIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlRHJhZ2dlZEl0ZW1zT3JkZXIoXHJcbiAgICAgICAgZHJhZ2dlZEl0ZW06IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIHRhcmdldEl0ZW06IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIG5ld1BhcmVudE5vZGU6IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIG9sZFBhcmVudE5vZGU6IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIG9sZFBhcmVudE5vZGVJZFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlRHJhZ2dlZEl0ZW1Gcm9tTW9EYXRhTGlzdChkcmFnZ2VkSXRlbSk7XHJcbiAgICAgICAgaWYgKG9sZFBhcmVudE5vZGVJZCAhPT0gJyRSb290Jykge1xyXG4gICAgICAgICAgICAvLyBvbGRQYXJlbnROb2RlLmNoaWxkcmVuPy5yZW1vdmUoZHJhZ2dlZEl0ZW0pO1xyXG4gICAgICAgICAgICBvbGRQYXJlbnROb2RlLmNoaWxkcmVuID0gb2xkUGFyZW50Tm9kZS5jaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMuRGF0YS5JZCAhPT0gZHJhZ2dlZEl0ZW0uRGF0YS5JZCk7XHJcblxyXG4gICAgICAgICAgICBvbGRQYXJlbnROb2RlLmxlYWYgPSAhKG9sZFBhcmVudE5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA+IDApO1xyXG4gICAgICAgICAgICBvbGRQYXJlbnROb2RlLkRhdGEuJEhhc0NoaWxkcmVuID0gIW9sZFBhcmVudE5vZGUubGVhZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZSA9IG5ld1BhcmVudE5vZGU7XHJcbiAgICAgICAgdGhpcy5fc2V0TGV2ZWxGb3JEcmFnZ2VkSXRlbXMoZHJhZ2dlZEl0ZW0sIG5ld1BhcmVudE5vZGUubGV2ZWwgfHwgMCk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2YodGFyZ2V0SXRlbSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbiA9PT0gJ2JlZm9yZScgPyB0YXJnZXRJbmRleCA6IHRoaXMuX25leHRJbmRleEluTW9EYXRhTGlzdCh0YXJnZXRJdGVtKTtcclxuICAgICAgICB0aGlzLl9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3QoZHJhZ2dlZEl0ZW0sIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3Qobm9kZTogVHJlZU5vZGVPYmosIGkpOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3Quc3BsaWNlKGksIDAsIG5vZGUpO1xyXG4gICAgICAgIG5vZGU/LmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGkgPSB0aGlzLl9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3QoY2hpbGQsIGkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlbW92ZURyYWdnZWRJdGVtRnJvbU1vRGF0YUxpc3Qobm9kZTogVHJlZU5vZGVPYmopOiB2b2lkIHtcclxuICAgICAgICBub2RlPy5jaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRHJhZ2dlZEl0ZW1Gcm9tTW9EYXRhTGlzdChjaGlsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5mbGF0TW9EYXRhTGlzdC5yZW1vdmUobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbmV4dEluZGV4SW5Nb0RhdGFMaXN0KG5vZGU6IFRyZWVOb2RlT2JqKTogQXJyYXk8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2Yobm9kZSkgKyB0aGlzLl9hbGxOZXN0ZWRDaGlsZGVzQ291bnQobm9kZSkgKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2FsbE5lc3RlZENoaWxkZXNDb3VudChub2RlOiBUcmVlTm9kZU9iaiwgaSA9IDApOiBudW1iZXIge1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpID0gdGhpcy5fYWxsTmVzdGVkQ2hpbGRlc0NvdW50KGNoaWxkLCBpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldE5vZGVCeUlkKGlkOiBhbnkpOiBUcmVlTm9kZU9iaiB7XHJcbiAgICAgICAgbGV0IG5vZGU7XHJcbiAgICAgICAgZm9yIChjb25zdCBtbyBvZiB0aGlzLmZsYXRNb0RhdGFMaXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChtby5EYXRhLklkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgbm9kZSA9IG1vO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldExldmVsRm9yRHJhZ2dlZEl0ZW1zKG5vZGUsIHBhcmVudExldmVsKTogdm9pZCB7XHJcbiAgICAgICAgcGFyZW50TGV2ZWwrKztcclxuICAgICAgICBub2RlLmxldmVsID0gcGFyZW50TGV2ZWw7XHJcbiAgICAgICAgbm9kZT8uY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldExldmVsRm9yRHJhZ2dlZEl0ZW1zKGNoaWxkLCBwYXJlbnRMZXZlbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZU5vZGVJbnNpZGVBbm90aGVyKHNvdXJjZU5vZGUsIGRlc3RpbmF0aW9uTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG9sZFBhcmVudE5vZGUgPSBzb3VyY2VOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3Qgb2xkUGFyZW50Tm9kZUlkID0gb2xkUGFyZW50Tm9kZT8uRGF0YT8uSWQgfHwgJyRSb290JztcclxuICAgICAgICB0aGlzLl9jaGFuZ2VEcmFnZ2VkSXRlbXNPcmRlcihzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUsIGRlc3RpbmF0aW9uTm9kZSwgb2xkUGFyZW50Tm9kZSwgb2xkUGFyZW50Tm9kZUlkKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KCdtb3ZlTm9kZUluc2lkZUFub3RoZXInLCBzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NsZWFyRHJhZ0luZm8oZHJvcHBlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGRyb3BwZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLWJlZm9yZScpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1iZWZvcmUnKSk7XHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1hZnRlcicpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1hZnRlcicpKTtcclxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLWluc2lkZScpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1pbnNpZGUnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RvcERyYWdnaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8oKTtcclxuICAgICAgICB0aGlzLl9yZXNldERyb3BBY3Rpb25Ub2RvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0RyYWdJbmZvKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8oKTtcclxuICAgICAgICBpZiAodGhpcy5kcm9wQWN0aW9uVG9kby50YXJnZXRJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9nZXROb2RlQnlJZCh0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcclxuICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50SWQgPSBwYXJlbnQ/LnBhcmVudE5vZGU/LkRhdGE/LklkIHx8ICckUm9vdCc7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldE5vZGVFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub2RlLScgKyB0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcclxuICAgICAgICAgICAgaWYgKCF0YXJnZXROb2RlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1BhcmVudElkID09PSAnJFJvb3QnICYmIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uICE9PSAnaW5zaWRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vdENvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdmZC1sYXlvdXQtcGFuZWwnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHJvb3RDb250YWluZXIsICdkcm9wLWluc2lkZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRhcmdldE5vZGVFbGVtZW50LCAnZHJvcC0nICsgdGhpcy5kcm9wQWN0aW9uVG9kbz8uYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZG9EcmFnTW92ZShldmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRGcm9tUG9pbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54LCBldmVudC5wb2ludGVyUG9zaXRpb24ueSk7XHJcblxyXG4gICAgICAgIGlmICghZWxlbWVudEZyb21Qb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9wRHJhZ2dpbmcoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0YXJnZXROb2RlRWxlbWVudCA9IGVsZW1lbnRGcm9tUG9pbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdub2RlLWl0ZW0nKVxyXG4gICAgICAgICAgICA/IGVsZW1lbnRGcm9tUG9pbnRcclxuICAgICAgICAgICAgOiBlbGVtZW50RnJvbVBvaW50LmNsb3Nlc3QoJy5ub2RlLWl0ZW0nKTtcclxuICAgICAgICBpZiAoIXRhcmdldE5vZGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BEcmFnZ2luZygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8gPSB7XHJcbiAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXROb2RlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldE5vZGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IG9uZVRoaXJkID0gdGFyZ2V0UmVjdC5oZWlnaHQgLyAzO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA8IG9uZVRoaXJkKSB7XHJcbiAgICAgICAgICAgIC8vIGJlZm9yZVxyXG4gICAgICAgICAgICB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbiA9ICdiZWZvcmUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA+IDIgKiBvbmVUaGlyZCkge1xyXG4gICAgICAgICAgICAvLyBhZnRlclxyXG4gICAgICAgICAgICB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbiA9ICdhZnRlcic7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaW5zaWRlXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2luc2lkZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NldE5vRHJvcEl0ZW1zKGV2ZW50LnNvdXJjZS5kYXRhKTtcclxuICAgICAgICB0aGlzLl9zZXROb0Ryb3BTdHlsZSgpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0aGlzLl9nZXROb2RlQnlJZCh0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcclxuICAgICAgICBpZiAodGFyZ2V0Tm9kZS5ub0Ryb3ApIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RvcERyYWdnaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2ZvcmJpZCc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0RyYWdJbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVtb3ZlTm9Ecm9wcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0XHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IG5vZGUubm9Ecm9wKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5ub0Ryb3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub2RlLScgKyBub2RlLkRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsICduby1kcm9wJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldE5vRHJvcEl0ZW1zKGRyYWdnZWRJdGVtSWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fZ2V0Tm9kZUJ5SWQoZHJhZ2dlZEl0ZW1JZCk7XHJcbiAgICAgICAgbm9kZS5ub0Ryb3AgPSB0cnVlO1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldE5vRHJvcEl0ZW1zKGNoaWxkLkRhdGEuSWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldE5vRHJvcFN0eWxlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3RcclxuICAgICAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gbm9kZS5ub0Ryb3ApXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjbm9kZS0nICsgbm9kZS5EYXRhLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsLCAnbm8tZHJvcCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jYW5Nb3ZlKHNvdXJjZU5vZGUsIGRlc3RpbmF0aW9uTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBpZiAoc291cmNlTm9kZS5EYXRhLklkID09PSBkZXN0aW5hdGlvbk5vZGUuRGF0YS5JZCkge1xyXG4gICAgICAgICAgICBjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc291cmNlTm9kZS5jaGlsZHJlbj8uZm9yZWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbk1vdmUgPSB0aGlzLl9jYW5Nb3ZlKHNvdXJjZU5vZGUsIGNoaWxkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5Nb3ZlO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIF9zaG93Rm9yYmlkZGVuTW92ZUFsZXJ0KCk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3Lk1zZy5FcnJvcign2YbZhduM2KrZiNin2YbbjNivINii24zYqtmFINix2Kcg2KjZhyDYstuM2LHYtNin2K7ZhyDYrtmI2K/YtCDZhdmG2KrZgtmEINqp2YbbjNivLicpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|