@tsi-developpement/tsi-shared-ui 0.0.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/esm2022/lib/consts/app-providers.mjs +11 -0
- package/esm2022/lib/consts/html-template.const.mjs +40 -0
- package/esm2022/lib/consts/index.mjs +8 -0
- package/esm2022/lib/consts/localization-key.mjs +12 -0
- package/esm2022/lib/consts/locals.const.mjs +8 -0
- package/esm2022/lib/consts/queryParamNames.const.mjs +11 -0
- package/esm2022/lib/consts/themes.mjs +5 -0
- package/esm2022/lib/consts/tsi-consts.mjs +45 -0
- package/esm2022/lib/end-points/authorization-endpoints.mjs +35 -0
- package/esm2022/lib/end-points/baseuri.mjs +11 -0
- package/esm2022/lib/end-points/endpoints.mjs +208 -0
- package/esm2022/lib/end-points/import-export-endpoint.mjs +35 -0
- package/esm2022/lib/end-points/index.mjs +7 -0
- package/esm2022/lib/end-points/presentation-settings-endpoints.mjs +13 -0
- package/esm2022/lib/end-points/reporting-endpoints.mjs +55 -0
- package/esm2022/lib/end-points/shared-endpoint.mjs +12 -0
- package/esm2022/lib/end-points/user-identity-endpoints.mjs +61 -0
- package/esm2022/lib/enums/Language.mjs +9 -0
- package/esm2022/lib/enums/auto-complete.mjs +6 -0
- package/esm2022/lib/enums/button-type.enum.mjs +6 -0
- package/esm2022/lib/enums/claim-types.mjs +15 -0
- package/esm2022/lib/enums/code-format.mjs +6 -0
- package/esm2022/lib/enums/component-use-modes-enum.mjs +19 -0
- package/esm2022/lib/enums/css-units.mjs +10 -0
- package/esm2022/lib/enums/decimal-format.mjs +8 -0
- package/esm2022/lib/enums/display-types.mjs +35 -0
- package/esm2022/lib/enums/filter-operator-type.mjs +34 -0
- package/esm2022/lib/enums/form-validation-error.mjs +7 -0
- package/esm2022/lib/enums/grid-selection-mode.mjs +7 -0
- package/esm2022/lib/enums/grid-sort-mode.mjs +7 -0
- package/esm2022/lib/enums/http-method-types.mjs +6 -0
- package/esm2022/lib/enums/index.mjs +25 -0
- package/esm2022/lib/enums/input-types.mjs +20 -0
- package/esm2022/lib/enums/layout-orientation.mjs +6 -0
- package/esm2022/lib/enums/logout-reason-enum.mjs +8 -0
- package/esm2022/lib/enums/modal-size-enum.mjs +10 -0
- package/esm2022/lib/enums/report-type.mjs +9 -0
- package/esm2022/lib/enums/status.mjs +9 -0
- package/esm2022/lib/enums/text-box-type.mjs +7 -0
- package/esm2022/lib/enums/tooltipPosition.enum.mjs +8 -0
- package/esm2022/lib/enums/tsi-component-enum.mjs +40 -0
- package/esm2022/lib/enums/type-import.mjs +6 -0
- package/esm2022/lib/functions/array.functions.mjs +8 -0
- package/esm2022/lib/functions/index.mjs +3 -0
- package/esm2022/lib/functions/modal-open.function.mjs +69 -0
- package/esm2022/lib/guards/admin.guard.mjs +37 -0
- package/esm2022/lib/guards/auth.guard.mjs +30 -0
- package/esm2022/lib/guards/index.mjs +4 -0
- package/esm2022/lib/guards/permission.guard.mjs +32 -0
- package/esm2022/lib/interfaces/configuration/configuration.mjs +2 -0
- package/esm2022/lib/interfaces/generic-form/generic-form.mjs +118 -0
- package/esm2022/lib/interfaces/generic-types/dictionary.mjs +2 -0
- package/esm2022/lib/interfaces/grid/grid-configuration.mjs +2 -0
- package/esm2022/lib/interfaces/index.mjs +12 -0
- package/esm2022/lib/interfaces/modal/dynamic.component.mjs +7 -0
- package/esm2022/lib/interfaces/modal/modal-size.mjs +2 -0
- package/esm2022/lib/interfaces/pagination/pagination-base.mjs +2 -0
- package/esm2022/lib/interfaces/select-list/combo-status-model.mjs +10 -0
- package/esm2022/lib/interfaces/settings/app-settings.mjs +2 -0
- package/esm2022/lib/interfaces/styles/css-size-property.mjs +17 -0
- package/esm2022/lib/interfaces/translation/translation.mjs +2 -0
- package/esm2022/lib/models/Notes/Note.mjs +7 -0
- package/esm2022/lib/models/application/configuration/endpoint-infos.mjs +3 -0
- package/esm2022/lib/models/application/configuration/entity-delete-behavior.mjs +2 -0
- package/esm2022/lib/models/authorization/authorization-token-mapper.mjs +24 -0
- package/esm2022/lib/models/authorization/authorization-token.mjs +2 -0
- package/esm2022/lib/models/common/component-descriminator.mjs +2 -0
- package/esm2022/lib/models/common/entity-properties.mjs +2 -0
- package/esm2022/lib/models/common/entity-validations.mjs +2 -0
- package/esm2022/lib/models/common/event-schema.mjs +2 -0
- package/esm2022/lib/models/common/key-value-pair.mjs +2 -0
- package/esm2022/lib/models/entity-info/entity-info.mjs +29 -0
- package/esm2022/lib/models/filter/filter-by-existing-values.mjs +7 -0
- package/esm2022/lib/models/filter/paged-result-request-base.mjs +13 -0
- package/esm2022/lib/models/filter/search-field.mjs +2 -0
- package/esm2022/lib/models/import-export/import-export.mjs +15 -0
- package/esm2022/lib/models/index.mjs +38 -0
- package/esm2022/lib/models/journalisation-application/journalisation-application.mjs +10 -0
- package/esm2022/lib/models/journalisation-application/status-history.mjs +3 -0
- package/esm2022/lib/models/layout/layout-config.mjs +2 -0
- package/esm2022/lib/models/modal/bs-modal.mjs +6 -0
- package/esm2022/lib/models/presentation-settings/presentation-settings.mjs +8 -0
- package/esm2022/lib/models/progress-bar/progress-bar-create-request.mjs +2 -0
- package/esm2022/lib/models/progress-bar/progress-bar-response.mjs +8 -0
- package/esm2022/lib/models/progress-bar/progress-bar-update-request.mjs +3 -0
- package/esm2022/lib/models/remote-services-utility/subscription-result.mjs +17 -0
- package/esm2022/lib/models/reporting/json-data-connection.mjs +2 -0
- package/esm2022/lib/models/reporting/optional-endpoints.mjs +2 -0
- package/esm2022/lib/models/reporting/report-template-response.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-edit-template.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-print.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-template.mjs +2 -0
- package/esm2022/lib/models/settings/devise.mjs +3 -0
- package/esm2022/lib/models/settings/fichier.mjs +6 -0
- package/esm2022/lib/models/settings/type-fichier.mjs +3 -0
- package/esm2022/lib/models/tsi-card/tsi-card.mjs +3 -0
- package/esm2022/lib/models/user-identity/login-response.mjs +7 -0
- package/esm2022/lib/models/user-identity/tenant.mjs +3 -0
- package/esm2022/lib/models/user-identity/user-identity.mjs +3 -0
- package/esm2022/lib/models/workflow/workflow.mjs +14 -0
- package/esm2022/lib/package-initializer.mjs +7 -0
- package/esm2022/lib/pipes/cut-label.pipe.mjs +23 -0
- package/esm2022/lib/pipes/index.mjs +8 -0
- package/esm2022/lib/pipes/localize.pipe.mjs +51 -0
- package/esm2022/lib/pipes/modal-label.pipe.mjs +37 -0
- package/esm2022/lib/pipes/shorten.pipe.mjs +20 -0
- package/esm2022/lib/pipes/to-number.pipe.mjs +20 -0
- package/esm2022/lib/pipes/tsi-currency.pipe.mjs +29 -0
- package/esm2022/lib/pipes/tsi-decimal.pipe.mjs +21 -0
- package/esm2022/lib/providers/index.mjs +2 -0
- package/esm2022/lib/providers/shared-ui-tsi.provider.mjs +15 -0
- package/esm2022/lib/routes/admin.routes.mjs +5 -0
- package/esm2022/lib/routes/app.routes.mjs +7 -0
- package/esm2022/lib/routes/identity.routes.mjs +4 -0
- package/esm2022/lib/routes/index.mjs +5 -0
- package/esm2022/lib/routes/manage-reporting.routes.mjs +5 -0
- package/esm2022/lib/services/Component-Finder/tsi-component-finder.service.mjs +22 -0
- package/esm2022/lib/services/Import-Export/modele-import.service.mjs +59 -0
- package/esm2022/lib/services/Note/Note.service.mjs +35 -0
- package/esm2022/lib/services/UserIdentity/identity-platform-authentication.service.mjs +29 -0
- package/esm2022/lib/services/UserIdentity/user-identity.service.mjs +40 -0
- package/esm2022/lib/services/application/api-explorer.service.mjs +24 -0
- package/esm2022/lib/services/application/app.layout.service.mjs +97 -0
- package/esm2022/lib/services/application/parametres-application-parambase.service.mjs +20 -0
- package/esm2022/lib/services/authorization/authorization.service.mjs +124 -0
- package/esm2022/lib/services/authorization/identity-manager.service.mjs +97 -0
- package/esm2022/lib/services/base/crud-base.service.mjs +38 -0
- package/esm2022/lib/services/configuration/entity-configuration.service.mjs +49 -0
- package/esm2022/lib/services/currentUser/currentUser.service.mjs +49 -0
- package/esm2022/lib/services/date-helper.service.mjs +133 -0
- package/esm2022/lib/services/dialog-data.service.mjs +32 -0
- package/esm2022/lib/services/fichier/fichier-upload.service.mjs +44 -0
- package/esm2022/lib/services/fichier/fichier.service.mjs +20 -0
- package/esm2022/lib/services/formula.service.mjs +20 -0
- package/esm2022/lib/services/generator/html-template-generator.service.mjs +196 -0
- package/esm2022/lib/services/index.mjs +41 -0
- package/esm2022/lib/services/journalisation/journalisation-application.service.mjs +23 -0
- package/esm2022/lib/services/journalisation/status-history.service.mjs +23 -0
- package/esm2022/lib/services/layout/layout-helper.service.mjs +72 -0
- package/esm2022/lib/services/modal/tsi-bs-modal.service.mjs +37 -0
- package/esm2022/lib/services/modal/tsi-modal.service.mjs +21 -0
- package/esm2022/lib/services/module-code/module-code.service.mjs +31 -0
- package/esm2022/lib/services/module-main-parameter.service.mjs +31 -0
- package/esm2022/lib/services/notification/error-response-manager.service.mjs +57 -0
- package/esm2022/lib/services/notification/tsi-confirmation.service.mjs +37 -0
- package/esm2022/lib/services/notification/tsi-message.service.mjs +54 -0
- package/esm2022/lib/services/notification/tsi-notification.service.mjs +47 -0
- package/esm2022/lib/services/presentation-setting/presentation-designer-base.service.mjs +26 -0
- package/esm2022/lib/services/presentation-setting/presentation-designer.service.mjs +58 -0
- package/esm2022/lib/services/presentation-setting/presentation-setting.service.mjs +39 -0
- package/esm2022/lib/services/progress-bar/progress-bar-helper.service.mjs +39 -0
- package/esm2022/lib/services/progress-bar/progress-bar.service.mjs +30 -0
- package/esm2022/lib/services/record-info-popup.service.mjs +21 -0
- package/esm2022/lib/services/reporting/dashboard-module.service.mjs +24 -0
- package/esm2022/lib/services/reporting/reporting.service.mjs +111 -0
- package/esm2022/lib/services/settings/app-settings.service.mjs +47 -0
- package/esm2022/lib/services/settings/keyboard-shortcut.service.mjs +30 -0
- package/esm2022/lib/services/status/entityStatus.service.mjs +21 -0
- package/esm2022/lib/services/translation/translation.service.mjs +71 -0
- package/esm2022/lib/services/validation/entity-validations.service.mjs +21 -0
- package/esm2022/lib/services/validation/generic-validation-state.service.mjs +30 -0
- package/esm2022/lib/services/validation/input-registry.service.mjs +25 -0
- package/esm2022/lib/services/workflow/workflow-configuration.service.mjs +80 -0
- package/esm2022/lib/shared.module.mjs +643 -0
- package/esm2022/lib/tsi-base/components/app-base/app-base.component.mjs +101 -0
- package/esm2022/lib/tsi-base/components/tsi-base/tsi-base.component.mjs +25 -0
- package/esm2022/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.mjs +645 -0
- package/esm2022/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.mjs +514 -0
- package/esm2022/lib/tsi-base/index.mjs +6 -0
- package/esm2022/lib/tsi-base/tsi-input-base/tsi-input-base.component.mjs +141 -0
- package/esm2022/lib/tsi-components/alert-import-message/alert-import-message.component.mjs +19 -0
- package/esm2022/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.mjs +40 -0
- package/esm2022/lib/tsi-components/button-components/tsi-button/tsi-button.component.mjs +75 -0
- package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +173 -0
- package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +201 -0
- package/esm2022/lib/tsi-components/index.mjs +80 -0
- package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +643 -0
- package/esm2022/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.mjs +120 -0
- package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +53 -0
- package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +62 -0
- package/esm2022/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.mjs +116 -0
- package/esm2022/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.mjs +51 -0
- package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +195 -0
- package/esm2022/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.mjs +54 -0
- package/esm2022/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.mjs +55 -0
- package/esm2022/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.mjs +43 -0
- package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +56 -0
- package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +649 -0
- package/esm2022/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.mjs +44 -0
- package/esm2022/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.mjs +50 -0
- package/esm2022/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.mjs +65 -0
- package/esm2022/lib/tsi-components/logout-popup/logout-popup.component.mjs +12 -0
- package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +435 -0
- package/esm2022/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.mjs +148 -0
- package/esm2022/lib/tsi-components/manage-reporting/manage-reporting.component.mjs +1075 -0
- package/esm2022/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.mjs +31 -0
- package/esm2022/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.mjs +24 -0
- package/esm2022/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.mjs +19 -0
- package/esm2022/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.mjs +22 -0
- package/esm2022/lib/tsi-components/modal-component/modal.component.mjs +138 -0
- package/esm2022/lib/tsi-components/modal-loader/modal-loader.component.mjs +58 -0
- package/esm2022/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.mjs +32 -0
- package/esm2022/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.mjs +18 -0
- package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +57 -0
- package/esm2022/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.mjs +27 -0
- package/esm2022/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.mjs +25 -0
- package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +139 -0
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +1509 -0
- package/esm2022/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.mjs +144 -0
- package/esm2022/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.mjs +13 -0
- package/esm2022/lib/tsi-components/output-components/tsi-label/tsi-label.component.mjs +24 -0
- package/esm2022/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.mjs +18 -0
- package/esm2022/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.mjs +20 -0
- package/esm2022/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.mjs +30 -0
- package/esm2022/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +427 -0
- package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +667 -0
- package/esm2022/lib/tsi-components/spinner/spinner.component.mjs +15 -0
- package/esm2022/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.mjs +21 -0
- package/esm2022/lib/tsi-components/tsi-calender/context-menu/context-menu.component.mjs +46 -0
- package/esm2022/lib/tsi-components/tsi-calender/tsi-calender.component.mjs +297 -0
- package/esm2022/lib/tsi-components/tsi-card/tsi-card.component.mjs +64 -0
- package/esm2022/lib/tsi-components/tsi-card-list/tsi-card-list.component.mjs +112 -0
- package/esm2022/lib/tsi-components/tsi-change-password/tsi-change-password.component.mjs +39 -0
- package/esm2022/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.mjs +83 -0
- package/esm2022/lib/tsi-components/tsi-divider/tsi-divider.component.mjs +18 -0
- package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +305 -0
- package/esm2022/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.mjs +15 -0
- package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +883 -0
- package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +149 -0
- package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +231 -0
- package/esm2022/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.mjs +119 -0
- package/esm2022/lib/tsi-components/tsi-modal/tsi-modal.component.mjs +25 -0
- package/esm2022/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.mjs +119 -0
- package/esm2022/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.mjs +54 -0
- package/esm2022/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.mjs +27 -0
- package/esm2022/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.mjs +123 -0
- package/esm2022/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.mjs +41 -0
- package/esm2022/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.mjs +187 -0
- package/esm2022/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.mjs +170 -0
- package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +142 -0
- package/esm2022/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.mjs +37 -0
- package/esm2022/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.mjs +52 -0
- package/esm2022/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.mjs +46 -0
- package/esm2022/lib/tsi-components/tsi-tenants/tsi-tenants.component.mjs +122 -0
- package/esm2022/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.mjs +21 -0
- package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +186 -0
- package/esm2022/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.mjs +54 -0
- package/esm2022/lib/tsi-directives/auto-select.directive.mjs +33 -0
- package/esm2022/lib/tsi-directives/busy.directive.mjs +32 -0
- package/esm2022/lib/tsi-directives/dynamic-component-loader/ad.directive.mjs +16 -0
- package/esm2022/lib/tsi-directives/index.mjs +8 -0
- package/esm2022/lib/tsi-directives/module-main-parameter.directive.mjs +16 -0
- package/esm2022/lib/tsi-directives/presentation-designer-base.directive.mjs +238 -0
- package/esm2022/lib/tsi-directives/presentation-designer.directive.mjs +205 -0
- package/esm2022/lib/tsi-directives/validation.directive.mjs +85 -0
- package/esm2022/lib/tsi-helpers/compoent-reference.helper.mjs +7 -0
- package/esm2022/lib/tsi-helpers/date-helper.mjs +21 -0
- package/esm2022/lib/tsi-helpers/export-excel.helper.mjs +40 -0
- package/esm2022/lib/tsi-helpers/filter-helper.mjs +126 -0
- package/esm2022/lib/tsi-helpers/grid-col-style.helper.mjs +7 -0
- package/esm2022/lib/tsi-helpers/guid.helper.mjs +19 -0
- package/esm2022/lib/tsi-helpers/helpers.mjs +9 -0
- package/esm2022/lib/tsi-helpers/index.mjs +13 -0
- package/esm2022/lib/tsi-helpers/mapping-helper.mjs +10 -0
- package/esm2022/lib/tsi-helpers/object.helper.mjs +6 -0
- package/esm2022/lib/tsi-helpers/primeng-translate-config.mjs +55 -0
- package/esm2022/lib/tsi-helpers/storage-manager.mjs +33 -0
- package/esm2022/lib/tsi-helpers/type-registry.helper.mjs +49 -0
- package/esm2022/lib/types/enum-description.type.mjs +2 -0
- package/esm2022/lib/types/index.mjs +3 -0
- package/esm2022/lib/types/time-only.mjs +42 -0
- package/esm2022/public-api.mjs +21 -0
- package/esm2022/tsi-developpement-tsi-shared-ui.mjs +5 -0
- package/esm2022/tsi-tsi-shared-ui.mjs +5 -0
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +17486 -0
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -0
- package/fesm2022/tsi-tsi-shared-ui.mjs +17486 -0
- package/fesm2022/tsi-tsi-shared-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/consts/app-providers.d.ts +4 -0
- package/lib/consts/html-template.const.d.ts +12 -0
- package/lib/consts/index.d.ts +7 -0
- package/lib/consts/localization-key.d.ts +11 -0
- package/lib/consts/locals.const.d.ts +7 -0
- package/lib/consts/queryParamNames.const.d.ts +10 -0
- package/lib/consts/themes.d.ts +4 -0
- package/lib/consts/tsi-consts.d.ts +40 -0
- package/lib/end-points/authorization-endpoints.d.ts +31 -0
- package/lib/end-points/baseuri.d.ts +10 -0
- package/lib/end-points/endpoints.d.ts +205 -0
- package/lib/end-points/import-export-endpoint.d.ts +33 -0
- package/lib/end-points/index.d.ts +6 -0
- package/lib/end-points/presentation-settings-endpoints.d.ts +11 -0
- package/lib/end-points/reporting-endpoints.d.ts +53 -0
- package/lib/end-points/shared-endpoint.d.ts +9 -0
- package/lib/end-points/user-identity-endpoints.d.ts +59 -0
- package/lib/enums/Language.d.ts +9 -0
- package/lib/enums/auto-complete.d.ts +4 -0
- package/lib/enums/button-type.enum.d.ts +4 -0
- package/lib/enums/claim-types.d.ts +13 -0
- package/lib/enums/code-format.d.ts +4 -0
- package/lib/enums/component-use-modes-enum.d.ts +17 -0
- package/lib/enums/css-units.d.ts +8 -0
- package/lib/enums/decimal-format.d.ts +6 -0
- package/lib/enums/display-types.d.ts +17 -0
- package/lib/enums/filter-operator-type.d.ts +18 -0
- package/lib/enums/form-validation-error.d.ts +11 -0
- package/lib/enums/grid-selection-mode.d.ts +5 -0
- package/lib/enums/grid-sort-mode.d.ts +5 -0
- package/lib/enums/http-method-types.d.ts +4 -0
- package/lib/enums/index.d.ts +24 -0
- package/lib/enums/input-types.d.ts +18 -0
- package/lib/enums/layout-orientation.d.ts +4 -0
- package/lib/enums/logout-reason-enum.d.ts +6 -0
- package/lib/enums/modal-size-enum.d.ts +10 -0
- package/lib/enums/report-type.d.ts +7 -0
- package/lib/enums/status.d.ts +7 -0
- package/lib/enums/text-box-type.d.ts +5 -0
- package/lib/enums/tooltipPosition.enum.d.ts +6 -0
- package/lib/enums/tsi-component-enum.d.ts +37 -0
- package/lib/enums/type-import.d.ts +4 -0
- package/lib/functions/array.functions.d.ts +1 -0
- package/lib/functions/index.d.ts +1 -0
- package/lib/functions/modal-open.function.d.ts +9 -0
- package/lib/guards/admin.guard.d.ts +14 -0
- package/lib/guards/auth.guard.d.ts +12 -0
- package/lib/guards/index.d.ts +3 -0
- package/lib/guards/permission.guard.d.ts +2 -0
- package/lib/interfaces/configuration/configuration.d.ts +10 -0
- package/lib/interfaces/generic-form/generic-form.d.ts +45 -0
- package/lib/interfaces/generic-types/dictionary.d.ts +3 -0
- package/lib/interfaces/grid/grid-configuration.d.ts +116 -0
- package/lib/interfaces/index.d.ts +11 -0
- package/lib/interfaces/modal/dynamic.component.d.ts +18 -0
- package/lib/interfaces/modal/modal-size.d.ts +4 -0
- package/lib/interfaces/pagination/pagination-base.d.ts +46 -0
- package/lib/interfaces/select-list/combo-status-model.d.ts +8 -0
- package/lib/interfaces/settings/app-settings.d.ts +4 -0
- package/lib/interfaces/styles/css-size-property.d.ts +10 -0
- package/lib/interfaces/translation/translation.d.ts +10 -0
- package/lib/models/Notes/Note.d.ts +25 -0
- package/lib/models/application/configuration/endpoint-infos.d.ts +6 -0
- package/lib/models/application/configuration/entity-delete-behavior.d.ts +6 -0
- package/lib/models/authorization/authorization-token-mapper.d.ts +4 -0
- package/lib/models/authorization/authorization-token.d.ts +16 -0
- package/lib/models/common/component-descriminator.d.ts +4 -0
- package/lib/models/common/entity-properties.d.ts +5 -0
- package/lib/models/common/entity-validations.d.ts +7 -0
- package/lib/models/common/event-schema.d.ts +6 -0
- package/lib/models/common/key-value-pair.d.ts +4 -0
- package/lib/models/entity-info/entity-info.d.ts +37 -0
- package/lib/models/filter/filter-by-existing-values.d.ts +6 -0
- package/lib/models/filter/paged-result-request-base.d.ts +16 -0
- package/lib/models/filter/search-field.d.ts +35 -0
- package/lib/models/import-export/import-export.d.ts +28 -0
- package/lib/models/index.d.ts +37 -0
- package/lib/models/journalisation-application/journalisation-application.d.ts +39 -0
- package/lib/models/journalisation-application/status-history.d.ts +12 -0
- package/lib/models/layout/layout-config.d.ts +3 -0
- package/lib/models/modal/bs-modal.d.ts +5 -0
- package/lib/models/presentation-settings/presentation-settings.d.ts +14 -0
- package/lib/models/progress-bar/progress-bar-create-request.d.ts +8 -0
- package/lib/models/progress-bar/progress-bar-response.d.ts +10 -0
- package/lib/models/progress-bar/progress-bar-update-request.d.ts +9 -0
- package/lib/models/remote-services-utility/subscription-result.d.ts +15 -0
- package/lib/models/reporting/json-data-connection.d.ts +6 -0
- package/lib/models/reporting/optional-endpoints.d.ts +8 -0
- package/lib/models/reporting/report-template-response.d.ts +13 -0
- package/lib/models/reporting/report-to-edit-template.d.ts +29 -0
- package/lib/models/reporting/report-to-print.d.ts +18 -0
- package/lib/models/reporting/report-to-template.d.ts +19 -0
- package/lib/models/settings/devise.d.ts +9 -0
- package/lib/models/settings/fichier.d.ts +14 -0
- package/lib/models/settings/type-fichier.d.ts +4 -0
- package/lib/models/tsi-card/tsi-card.d.ts +9 -0
- package/lib/models/user-identity/login-response.d.ts +8 -0
- package/lib/models/user-identity/tenant.d.ts +5 -0
- package/lib/models/user-identity/user-identity.d.ts +5 -0
- package/lib/models/workflow/workflow.d.ts +36 -0
- package/lib/package-initializer.d.ts +1 -0
- package/lib/pipes/cut-label.pipe.d.ts +7 -0
- package/lib/pipes/index.d.ts +7 -0
- package/lib/pipes/localize.pipe.d.ts +11 -0
- package/lib/pipes/modal-label.pipe.d.ts +10 -0
- package/lib/pipes/shorten.pipe.d.ts +7 -0
- package/lib/pipes/to-number.pipe.d.ts +7 -0
- package/lib/pipes/tsi-currency.pipe.d.ts +10 -0
- package/lib/pipes/tsi-decimal.pipe.d.ts +7 -0
- package/lib/providers/index.d.ts +1 -0
- package/lib/providers/shared-ui-tsi.provider.d.ts +8 -0
- package/lib/routes/admin.routes.d.ts +4 -0
- package/lib/routes/app.routes.d.ts +6 -0
- package/lib/routes/identity.routes.d.ts +3 -0
- package/lib/routes/index.d.ts +4 -0
- package/lib/routes/manage-reporting.routes.d.ts +4 -0
- package/lib/services/Component-Finder/tsi-component-finder.service.d.ts +10 -0
- package/lib/services/Import-Export/modele-import.service.d.ts +21 -0
- package/lib/services/Note/Note.service.d.ts +15 -0
- package/lib/services/UserIdentity/identity-platform-authentication.service.d.ts +13 -0
- package/lib/services/UserIdentity/user-identity.service.d.ts +15 -0
- package/lib/services/application/api-explorer.service.d.ts +13 -0
- package/lib/services/application/app.layout.service.d.ts +47 -0
- package/lib/services/application/parametres-application-parambase.service.d.ts +10 -0
- package/lib/services/authorization/authorization.service.d.ts +46 -0
- package/lib/services/authorization/identity-manager.service.d.ts +23 -0
- package/lib/services/base/crud-base.service.d.ts +20 -0
- package/lib/services/configuration/entity-configuration.service.d.ts +22 -0
- package/lib/services/currentUser/currentUser.service.d.ts +26 -0
- package/lib/services/date-helper.service.d.ts +32 -0
- package/lib/services/dialog-data.service.d.ts +12 -0
- package/lib/services/fichier/fichier-upload.service.d.ts +15 -0
- package/lib/services/fichier/fichier.service.d.ts +10 -0
- package/lib/services/formula.service.d.ts +10 -0
- package/lib/services/generator/html-template-generator.service.d.ts +28 -0
- package/lib/services/index.d.ts +40 -0
- package/lib/services/journalisation/journalisation-application.service.d.ts +12 -0
- package/lib/services/journalisation/status-history.service.d.ts +12 -0
- package/lib/services/layout/layout-helper.service.d.ts +25 -0
- package/lib/services/modal/tsi-bs-modal.service.d.ts +16 -0
- package/lib/services/modal/tsi-modal.service.d.ts +9 -0
- package/lib/services/module-code/module-code.service.d.ts +18 -0
- package/lib/services/module-main-parameter.service.d.ts +12 -0
- package/lib/services/notification/error-response-manager.service.d.ts +13 -0
- package/lib/services/notification/tsi-confirmation.service.d.ts +11 -0
- package/lib/services/notification/tsi-message.service.d.ts +13 -0
- package/lib/services/notification/tsi-notification.service.d.ts +18 -0
- package/lib/services/presentation-setting/presentation-designer-base.service.d.ts +14 -0
- package/lib/services/presentation-setting/presentation-designer.service.d.ts +19 -0
- package/lib/services/presentation-setting/presentation-setting.service.d.ts +16 -0
- package/lib/services/progress-bar/progress-bar-helper.service.d.ts +19 -0
- package/lib/services/progress-bar/progress-bar.service.d.ts +16 -0
- package/lib/services/record-info-popup.service.d.ts +10 -0
- package/lib/services/reporting/dashboard-module.service.d.ts +11 -0
- package/lib/services/reporting/reporting.service.d.ts +32 -0
- package/lib/services/settings/app-settings.service.d.ts +13 -0
- package/lib/services/settings/keyboard-shortcut.service.d.ts +9 -0
- package/lib/services/status/entityStatus.service.d.ts +11 -0
- package/lib/services/translation/translation.service.d.ts +20 -0
- package/lib/services/validation/entity-validations.service.d.ts +10 -0
- package/lib/services/validation/generic-validation-state.service.d.ts +15 -0
- package/lib/services/validation/input-registry.service.d.ts +11 -0
- package/lib/services/workflow/workflow-configuration.service.d.ts +28 -0
- package/lib/shared.module.d.ts +141 -0
- package/lib/tsi-base/components/app-base/app-base.component.d.ts +28 -0
- package/lib/tsi-base/components/tsi-base/tsi-base.component.d.ts +11 -0
- package/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.d.ts +118 -0
- package/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.d.ts +85 -0
- package/lib/tsi-base/index.d.ts +5 -0
- package/lib/tsi-base/tsi-input-base/tsi-input-base.component.d.ts +34 -0
- package/lib/tsi-components/alert-import-message/alert-import-message.component.d.ts +10 -0
- package/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.d.ts +16 -0
- package/lib/tsi-components/button-components/tsi-button/tsi-button.component.d.ts +26 -0
- package/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.d.ts +31 -0
- package/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.d.ts +52 -0
- package/lib/tsi-components/index.d.ts +79 -0
- package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +127 -0
- package/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.d.ts +30 -0
- package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +18 -0
- package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +21 -0
- package/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.d.ts +38 -0
- package/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.d.ts +14 -0
- package/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.d.ts +45 -0
- package/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.d.ts +17 -0
- package/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.d.ts +19 -0
- package/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.d.ts +16 -0
- package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +16 -0
- package/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.d.ts +92 -0
- package/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.d.ts +17 -0
- package/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.d.ts +21 -0
- package/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.d.ts +23 -0
- package/lib/tsi-components/logout-popup/logout-popup.component.d.ts +5 -0
- package/lib/tsi-components/manage-import-export/manage-import-export.component.d.ts +64 -0
- package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +151 -0
- package/lib/tsi-components/manage-reporting/manage-reporting.component.d.ts +109 -0
- package/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.d.ts +15 -0
- package/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.d.ts +13 -0
- package/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.d.ts +9 -0
- package/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.d.ts +13 -0
- package/lib/tsi-components/modal-component/modal.component.d.ts +25 -0
- package/lib/tsi-components/modal-loader/modal-loader.component.d.ts +27 -0
- package/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.d.ts +14 -0
- package/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +7 -0
- package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +19 -0
- package/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.d.ts +10 -0
- package/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.d.ts +9 -0
- package/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.d.ts +41 -0
- package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +231 -0
- package/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.d.ts +46 -0
- package/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-label/tsi-label.component.d.ts +8 -0
- package/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.d.ts +9 -0
- package/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.d.ts +10 -0
- package/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.d.ts +7 -0
- package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +97 -0
- package/lib/tsi-components/reporting/reporting.component.d.ts +103 -0
- package/lib/tsi-components/spinner/spinner.component.d.ts +8 -0
- package/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.d.ts +9 -0
- package/lib/tsi-components/tsi-calender/context-menu/context-menu.component.d.ts +25 -0
- package/lib/tsi-components/tsi-calender/tsi-calender.component.d.ts +50 -0
- package/lib/tsi-components/tsi-card/tsi-card.component.d.ts +25 -0
- package/lib/tsi-components/tsi-card-list/tsi-card-list.component.d.ts +35 -0
- package/lib/tsi-components/tsi-change-password/tsi-change-password.component.d.ts +21 -0
- package/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.d.ts +23 -0
- package/lib/tsi-components/tsi-divider/tsi-divider.component.d.ts +6 -0
- package/lib/tsi-components/tsi-form/tsi-form.component.d.ts +91 -0
- package/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.d.ts +8 -0
- package/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.d.ts +156 -0
- package/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.d.ts +28 -0
- package/lib/tsi-components/tsi-kanban/tsi-kanban.component.d.ts +68 -0
- package/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.d.ts +35 -0
- package/lib/tsi-components/tsi-modal/tsi-modal.component.d.ts +10 -0
- package/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.d.ts +38 -0
- package/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.d.ts +19 -0
- package/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.d.ts +13 -0
- package/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.d.ts +21 -0
- package/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.d.ts +12 -0
- package/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.d.ts +41 -0
- package/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.d.ts +38 -0
- package/lib/tsi-components/tsi-search-box/tsi-search-box.component.d.ts +44 -0
- package/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.d.ts +21 -0
- package/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.d.ts +18 -0
- package/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.d.ts +17 -0
- package/lib/tsi-components/tsi-tenants/tsi-tenants.component.d.ts +39 -0
- package/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.d.ts +9 -0
- package/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.d.ts +35 -0
- package/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.d.ts +13 -0
- package/lib/tsi-directives/auto-select.directive.d.ts +9 -0
- package/lib/tsi-directives/busy.directive.d.ts +11 -0
- package/lib/tsi-directives/dynamic-component-loader/ad.directive.d.ts +8 -0
- package/lib/tsi-directives/index.d.ts +7 -0
- package/lib/tsi-directives/module-main-parameter.directive.d.ts +8 -0
- package/lib/tsi-directives/presentation-designer-base.directive.d.ts +41 -0
- package/lib/tsi-directives/presentation-designer.directive.d.ts +37 -0
- package/lib/tsi-directives/validation.directive.d.ts +18 -0
- package/lib/tsi-helpers/compoent-reference.helper.d.ts +5 -0
- package/lib/tsi-helpers/date-helper.d.ts +6 -0
- package/lib/tsi-helpers/export-excel.helper.d.ts +5 -0
- package/lib/tsi-helpers/filter-helper.d.ts +12 -0
- package/lib/tsi-helpers/grid-col-style.helper.d.ts +5 -0
- package/lib/tsi-helpers/guid.helper.d.ts +6 -0
- package/lib/tsi-helpers/helpers.d.ts +4 -0
- package/lib/tsi-helpers/index.d.ts +12 -0
- package/lib/tsi-helpers/mapping-helper.d.ts +5 -0
- package/lib/tsi-helpers/object.helper.d.ts +3 -0
- package/lib/tsi-helpers/primeng-translate-config.d.ts +54 -0
- package/lib/tsi-helpers/storage-manager.d.ts +8 -0
- package/lib/tsi-helpers/type-registry.helper.d.ts +34 -0
- package/lib/types/enum-description.type.d.ts +3 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/time-only.d.ts +17 -0
- package/package.json +24 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
import { Component, EventEmitter, inject, Input, Output, Renderer2, ViewChild, ViewChildren, ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { AppBaseComponent } from '../app-base/app-base.component';
|
|
3
|
+
import { LocalizationKeys } from '../../../consts';
|
|
4
|
+
import { Component_Modes, Modes, FormValidationError } from '../../../enums';
|
|
5
|
+
import { PresentationSetting } from '../../../models';
|
|
6
|
+
import { LayoutHelperService, WorkflowConfigurationService, PresentationSettingService, TsiNotificationService, ErrorResponseManagerService, PresentationDesignerService, ReportingService, InputRegistryService, GenericValidationStateService } from '../../../services';
|
|
7
|
+
import { PresentationDesignerDirective } from '../../../tsi-directives';
|
|
8
|
+
import { TsiFormComponent } from '../../../tsi-components/tsi-form/tsi-form.component';
|
|
9
|
+
import { TsiButtonComponent } from '../../../tsi-components/button-components/tsi-button/tsi-button.component';
|
|
10
|
+
import { TsiCheckboxComponent } from '../../../tsi-components/input-components/tsi-checkbox/tsi-checkbox.component';
|
|
11
|
+
import { LocalizePipe } from '../../../pipes/localize.pipe';
|
|
12
|
+
import { PresentationDesignerBaseService } from '../../../services/presentation-setting/presentation-designer-base.service';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "primeng/dynamicdialog";
|
|
15
|
+
export class TsiFormComponentBaseComponent extends AppBaseComponent {
|
|
16
|
+
//#region properties
|
|
17
|
+
get formEndpoint() {
|
|
18
|
+
return super.formEndpoint;
|
|
19
|
+
}
|
|
20
|
+
;
|
|
21
|
+
set formEndpoint(endpoint) {
|
|
22
|
+
super.formEndpoint = `${endpoint}/${this.id}`;
|
|
23
|
+
}
|
|
24
|
+
get businessClass() {
|
|
25
|
+
return this._businessClass;
|
|
26
|
+
}
|
|
27
|
+
set businessClass(value) {
|
|
28
|
+
this._businessClass = value;
|
|
29
|
+
this.formEndpoint = this.businessClass;
|
|
30
|
+
this._genericValidationStateService?.loadEntityValidationInfos(this._businessClass);
|
|
31
|
+
}
|
|
32
|
+
set componentDescriminator(value) {
|
|
33
|
+
this._componentDescriminator = value;
|
|
34
|
+
if (value && value.propertyValue) {
|
|
35
|
+
if (this.form) {
|
|
36
|
+
this.form.descriminatorValue = value.propertyValue;
|
|
37
|
+
}
|
|
38
|
+
this.descriminatorValue = value.propertyValue;
|
|
39
|
+
this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
|
|
40
|
+
this.directiveElements = [...this._presentationDesignerService.getDirectives(),
|
|
41
|
+
...this._presentationDesignerBaseService.getDirectives()
|
|
42
|
+
];
|
|
43
|
+
this.addInputs(this.presentationRequest, !this._layoutHelperService?.isDesignMode);
|
|
44
|
+
// this._reportingService.getReportDecriminator(req).subscribe({
|
|
45
|
+
// next: async (result) => {
|
|
46
|
+
// this.descriminatorValue = result.propertyValue;
|
|
47
|
+
// this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier()) ?? new PresentationSetting()
|
|
48
|
+
// if (this.form) {
|
|
49
|
+
// this.form.descriminatorValue = result.propertyValue
|
|
50
|
+
// if (this.entityInfo?.isWorkflow) {
|
|
51
|
+
// await this.form.getWorkflowEntityInformation(this.businessClass, this.id, this.entityInfo?.discriminatorClassName,
|
|
52
|
+
// this.entityInfo?.discriminatorPropertyName)
|
|
53
|
+
// }
|
|
54
|
+
// }
|
|
55
|
+
// this.addInputs(this.presentationRequest, !this._layoutHelperService?.isDesignMode)
|
|
56
|
+
// },
|
|
57
|
+
// error: (err: any) => {
|
|
58
|
+
// console.log(err);
|
|
59
|
+
// },
|
|
60
|
+
// });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
if (this.form) {
|
|
64
|
+
this.form.descriminatorValue = undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
get componentDescriminator() {
|
|
69
|
+
return this._componentDescriminator;
|
|
70
|
+
}
|
|
71
|
+
set isloading(value) {
|
|
72
|
+
this._isloading = value;
|
|
73
|
+
console.log('isloading set to', value);
|
|
74
|
+
if (!value) {
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
this.processDisabledInputs(this.presentationRequest);
|
|
77
|
+
}, 0);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
get isloading() {
|
|
81
|
+
return this._isloading;
|
|
82
|
+
}
|
|
83
|
+
get status() {
|
|
84
|
+
return this._status;
|
|
85
|
+
}
|
|
86
|
+
set status(value) {
|
|
87
|
+
this._status = value;
|
|
88
|
+
if (this.form && this.form.status !== this._status) {
|
|
89
|
+
this.form.status = this._status;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
constructor(ref, config, cdRef) {
|
|
93
|
+
super(cdRef);
|
|
94
|
+
this.ref = ref;
|
|
95
|
+
this.config = config;
|
|
96
|
+
this.cdRef = cdRef;
|
|
97
|
+
this.faultyInputs = [];
|
|
98
|
+
this.requiredInputs = [];
|
|
99
|
+
// @ViewChildren(EditableGridComponent) editableGridComponents!: QueryList<EditableGridComponent>;
|
|
100
|
+
// @ViewChildren(TsiViewGridComponent) viewGridsComponents!: QueryList<TsiViewGridComponent>;
|
|
101
|
+
// @ViewChildren(TsiGenericGridComponent) genericGridsComponents!: QueryList<TsiGenericGridComponent>;
|
|
102
|
+
// @ViewChildren(TsiGenericCrudComponent) genericCrudsComponents!: QueryList<TsiGenericCrudComponent>;
|
|
103
|
+
this.editableGridComponents = [];
|
|
104
|
+
this.viewGridsComponents = [];
|
|
105
|
+
this.genericGridsComponents = [];
|
|
106
|
+
this.genericCrudsComponents = [];
|
|
107
|
+
this.isFormDisabled = false;
|
|
108
|
+
//#endregion
|
|
109
|
+
//#region Inputs
|
|
110
|
+
this.itemDialog = false;
|
|
111
|
+
this.mode = '';
|
|
112
|
+
this._isloading = false;
|
|
113
|
+
this.saving = false;
|
|
114
|
+
this._status = '';
|
|
115
|
+
//bsModalRef?: any;
|
|
116
|
+
//#endregion
|
|
117
|
+
this._viewContainerRef = inject(ViewContainerRef);
|
|
118
|
+
this._renderer = inject(Renderer2);
|
|
119
|
+
this._layoutHelperService = inject(LayoutHelperService);
|
|
120
|
+
this._workflowConfigurationService = inject(WorkflowConfigurationService);
|
|
121
|
+
this._presentationSettingService = inject(PresentationSettingService);
|
|
122
|
+
this._messageInfoService = inject(TsiNotificationService);
|
|
123
|
+
this._errorResponseManager = inject(ErrorResponseManagerService);
|
|
124
|
+
this._presentationDesignerService = inject(PresentationDesignerService);
|
|
125
|
+
this._presentationDesignerBaseService = inject(PresentationDesignerBaseService);
|
|
126
|
+
this._reportingService = inject(ReportingService);
|
|
127
|
+
this.localize = inject(LocalizePipe);
|
|
128
|
+
this._inputRegistry = inject(InputRegistryService);
|
|
129
|
+
this.directiveElements = [];
|
|
130
|
+
this.presentationRequest = new PresentationSetting();
|
|
131
|
+
//#region Outputs
|
|
132
|
+
this.onSave = new EventEmitter();
|
|
133
|
+
//#endregion
|
|
134
|
+
this._genericValidationStateService = inject(GenericValidationStateService);
|
|
135
|
+
this.isReportingToolbarDisabled = false;
|
|
136
|
+
//#endregion
|
|
137
|
+
//#region traiter multiple combo
|
|
138
|
+
this.allComboLoadingStatus = [];
|
|
139
|
+
this.areAllComboLoaded = false;
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
ngOnInit() {
|
|
143
|
+
super.ngOnInit();
|
|
144
|
+
this._initModalRef();
|
|
145
|
+
this.initModalData();
|
|
146
|
+
this._addedDirectiveSubscritpion = this._presentationDesignerService.addedDirectiveObservable
|
|
147
|
+
.subscribe(data => {
|
|
148
|
+
if (data.treated) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
152
|
+
this.entityInfo = this._workflowConfigurationService.currentWorkflowEntityInfo;
|
|
153
|
+
}
|
|
154
|
+
if (!this.entityInfo?.discriminatorPropertyName && !this.entityInfo?.discriminatorClassName) {
|
|
155
|
+
this.processSingleElement(data);
|
|
156
|
+
}
|
|
157
|
+
else if (this.descriminatorValue) {
|
|
158
|
+
this.processSingleElement(data);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
this._addedDirectiveBaseSubscritpion = this._presentationDesignerBaseService.addedDirectiveObservable
|
|
162
|
+
.subscribe(data => {
|
|
163
|
+
if (data.treated) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
167
|
+
this.entityInfo = this._workflowConfigurationService.currentWorkflowEntityInfo;
|
|
168
|
+
}
|
|
169
|
+
if (!this.entityInfo?.discriminatorPropertyName && !this.entityInfo?.discriminatorClassName) {
|
|
170
|
+
this.processSingleElement(data);
|
|
171
|
+
}
|
|
172
|
+
else if (this.descriminatorValue) {
|
|
173
|
+
this.processSingleElement(data);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
this._designModeFormSubscription = this._layoutHelperService._designModeFormSubject.subscribe(data => {
|
|
177
|
+
if (data && data == true) {
|
|
178
|
+
this.toggleDesignMode();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
toggleDesignMode() {
|
|
183
|
+
this.removeTsiModalFooter();
|
|
184
|
+
this.createSaveButton();
|
|
185
|
+
this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
|
|
186
|
+
this.directiveElements = [...this._presentationDesignerService.getDirectives(),
|
|
187
|
+
...this._presentationDesignerBaseService.getDirectives()
|
|
188
|
+
];
|
|
189
|
+
this.directiveElements?.forEach(input => {
|
|
190
|
+
input.insertElement();
|
|
191
|
+
if (input instanceof PresentationDesignerDirective) {
|
|
192
|
+
input.selectApproriateColumns(this.presentationRequest);
|
|
193
|
+
}
|
|
194
|
+
input.addCheckboxesToInputs(this.presentationRequest);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
ngOnDestroy() {
|
|
198
|
+
super.ngOnDestroy();
|
|
199
|
+
this.unsubscribeFromActiveSubscritpion();
|
|
200
|
+
this._layoutHelperService.isDesignMode = false;
|
|
201
|
+
}
|
|
202
|
+
ngAfterViewChecked() {
|
|
203
|
+
}
|
|
204
|
+
async ngAfterViewInit() {
|
|
205
|
+
this.directiveElements = [...this._presentationDesignerService.getDirectives(),
|
|
206
|
+
...this._presentationDesignerBaseService.getDirectives()
|
|
207
|
+
];
|
|
208
|
+
console.log("count of directiveElements => ", this.directiveElements.length);
|
|
209
|
+
if (this._layoutHelperService?.isDesignMode
|
|
210
|
+
&& !this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
211
|
+
// this.removeTsiModalFooter()
|
|
212
|
+
// this.createSaveButton()
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
216
|
+
this.entityInfo = this._workflowConfigurationService.currentWorkflowEntityInfo;
|
|
217
|
+
}
|
|
218
|
+
// else {
|
|
219
|
+
// this.entityInfo = await this._entityConfigService.getEntityInfoFromCache(this.businessClass)
|
|
220
|
+
// }
|
|
221
|
+
}
|
|
222
|
+
//init genericCrud reporting
|
|
223
|
+
if (this.form) {
|
|
224
|
+
this.form.formRefChange.subscribe(f => {
|
|
225
|
+
if (f) {
|
|
226
|
+
this.formRef = f;
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
this.form.disabled = this.isFormDisabled;
|
|
230
|
+
this.form.formEndpoint = this.formEndpoint;
|
|
231
|
+
this.form.formName = this.formName;
|
|
232
|
+
this.form.businessClass = this._businessClass;
|
|
233
|
+
this.form.formName = this.formName;
|
|
234
|
+
this.form.id = this.id;
|
|
235
|
+
this.form.mode = this.mode;
|
|
236
|
+
// workflow form design
|
|
237
|
+
this._saveWorkflowFormConfigurationSubscription = this.form.onSubmitFormWorkflowConfiguration.subscribe(data => {
|
|
238
|
+
let workflowFormConfiguration = this.getFormWorfklowPresentationSetting();
|
|
239
|
+
console.log("FormWorfklowSetting => ", workflowFormConfiguration);
|
|
240
|
+
this.hide(workflowFormConfiguration);
|
|
241
|
+
});
|
|
242
|
+
this.form.onStatusChange.subscribe((newValue) => {
|
|
243
|
+
this.status = newValue;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (this.mode == Component_Modes.CREATE) {
|
|
247
|
+
if (this.checkbox) {
|
|
248
|
+
this.checkbox.forEach(box => {
|
|
249
|
+
box.inputField = false;
|
|
250
|
+
box.checked = false;
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
initTsiGridsRef() {
|
|
256
|
+
this.viewGridsComponents = this._presentationDesignerService.getViewGrids();
|
|
257
|
+
this.genericGridsComponents = this._presentationDesignerService.getGenericGrids();
|
|
258
|
+
this.editableGridComponents = this._presentationDesignerService.getEditableGrids();
|
|
259
|
+
this.genericCrudsComponents = this._presentationDesignerService.getGenericCruds();
|
|
260
|
+
}
|
|
261
|
+
getFormWorfklowPresentationSetting() {
|
|
262
|
+
let presentationRequest = new PresentationSetting();
|
|
263
|
+
this.directiveElements = [...this._presentationDesignerService.getDirectives(),
|
|
264
|
+
...this._presentationDesignerBaseService.getDirectives()
|
|
265
|
+
];
|
|
266
|
+
let presentationSettingDetails = [];
|
|
267
|
+
let availableDirectiveElements = this.directiveElements.filter(x => !(this.presentationRequest?.presentationSettingDetails.some(y => y.blockName === x.presentationDesigner && !y.isBlockVisible)));
|
|
268
|
+
this.initTsiGridsRef();
|
|
269
|
+
availableDirectiveElements?.forEach((directive) => {
|
|
270
|
+
let configuration = undefined;
|
|
271
|
+
let gridState = [
|
|
272
|
+
...this.viewGridsComponents,
|
|
273
|
+
...this.genericGridsComponents,
|
|
274
|
+
...this.genericCrudsComponents,
|
|
275
|
+
...this.editableGridComponents
|
|
276
|
+
]
|
|
277
|
+
.find(x => x.id === directive.presentationDesigner || ('formName' in x && x.formName === directive.presentationDesigner))
|
|
278
|
+
?.getState();
|
|
279
|
+
configuration = gridState ? JSON.stringify(gridState) : undefined;
|
|
280
|
+
let object = {
|
|
281
|
+
blockName: directive.presentationDesigner,
|
|
282
|
+
isBlockVisible: !directive.showHideCheckboxComponentRef?.instance?._checked,
|
|
283
|
+
uid: this.getPresentationSetingDetailUid(directive.presentationDesigner ?? ""),
|
|
284
|
+
configuration: configuration,
|
|
285
|
+
isInputEnabled: !directive.disabledCheckboxComponentRef?.instance?._checked
|
|
286
|
+
};
|
|
287
|
+
presentationSettingDetails.push(object);
|
|
288
|
+
});
|
|
289
|
+
presentationRequest.componentIdentifer = this.getComponentIdentifier();
|
|
290
|
+
presentationRequest.presentationSettingDetails = presentationSettingDetails;
|
|
291
|
+
console.log("presentationRequest => ", presentationRequest);
|
|
292
|
+
return presentationRequest;
|
|
293
|
+
}
|
|
294
|
+
isDeleteMode() {
|
|
295
|
+
return this.mode == Component_Modes.DELETE;
|
|
296
|
+
}
|
|
297
|
+
isSubmitDisabled() {
|
|
298
|
+
//return !this.formRef?.form?.valid || this.saving;
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
isConsultMode() {
|
|
302
|
+
return this.mode == Component_Modes.CONSULT;
|
|
303
|
+
}
|
|
304
|
+
isDuplicateMode() {
|
|
305
|
+
return this.mode == Component_Modes.DUPLICATE;
|
|
306
|
+
}
|
|
307
|
+
isEditMode() {
|
|
308
|
+
return this.mode == Component_Modes.EDIT;
|
|
309
|
+
}
|
|
310
|
+
//#region private methods
|
|
311
|
+
initModalData() {
|
|
312
|
+
super.initModalData();
|
|
313
|
+
if (this.openedDialogRef != null
|
|
314
|
+
&& this.openedDialogRef != undefined
|
|
315
|
+
&& this.openedDialogConfig != null
|
|
316
|
+
&& this.openedDialogConfig != undefined) {
|
|
317
|
+
//check have openedDialogConfig
|
|
318
|
+
if (this.openedDialogConfig.data != null && this.openedDialogConfig.data != undefined) {
|
|
319
|
+
this.cudComponent = this.openedDialogConfig.data.cudComponent;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
_verifyModalData() {
|
|
324
|
+
return this.openedDialogRef != null
|
|
325
|
+
&& this.openedDialogRef != undefined
|
|
326
|
+
&& this.openedDialogConfig != null
|
|
327
|
+
&& this.openedDialogConfig != undefined;
|
|
328
|
+
}
|
|
329
|
+
_initModalRef() {
|
|
330
|
+
if (this._verifyModalData()) {
|
|
331
|
+
//this.bsModalRef = {hide: () => this.openedDialogRef.destroy(),close: (val: any)=>{this.openedDialogRef.close(val)}}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//
|
|
335
|
+
l(key) {
|
|
336
|
+
if (this.localize != null
|
|
337
|
+
&& this.localize != undefined) {
|
|
338
|
+
return this.localize.transform(key);
|
|
339
|
+
}
|
|
340
|
+
return key;
|
|
341
|
+
}
|
|
342
|
+
processComboInitEvent(comboStatus) {
|
|
343
|
+
if (!this.allComboLoadingStatus.find(u => u.uid == comboStatus.uid))
|
|
344
|
+
this.allComboLoadingStatus.push(comboStatus);
|
|
345
|
+
}
|
|
346
|
+
processComboIsLoadedEvent(comboStatus) {
|
|
347
|
+
let comboS = this.allComboLoadingStatus.find(u => u.uid == comboStatus.uid);
|
|
348
|
+
if (comboS != null && comboS != undefined) {
|
|
349
|
+
comboS.isDataLoaded = comboStatus.isDataLoaded;
|
|
350
|
+
}
|
|
351
|
+
this.areAllComboLoadedFn();
|
|
352
|
+
}
|
|
353
|
+
areAllComboLoadedFn() {
|
|
354
|
+
let result = true;
|
|
355
|
+
if (this.allComboLoadingStatus.length > 0)
|
|
356
|
+
this.allComboLoadingStatus.forEach(u => {
|
|
357
|
+
result = result && u.isDataLoaded;
|
|
358
|
+
});
|
|
359
|
+
else
|
|
360
|
+
result = false;
|
|
361
|
+
this.areAllComboLoaded = result;
|
|
362
|
+
}
|
|
363
|
+
hide(val) {
|
|
364
|
+
if (this.openedDialogRef != null && this.openedDialogRef != undefined) {
|
|
365
|
+
if (val == false) {
|
|
366
|
+
this.openedDialogRef.destroy();
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
this.openedDialogRef.close(val);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//#endregion traiter multiple combo
|
|
374
|
+
getWorkflowEtatForm() {
|
|
375
|
+
let workflowEtatForm = this._workflowConfigurationService.workflowEtatFormForCurrentForm
|
|
376
|
+
?.find(x => x.uid == this.workflowInformation?.workflowEtat);
|
|
377
|
+
if (workflowEtatForm) {
|
|
378
|
+
let workflowEtat = this._workflowConfigurationService.mapWorkflowEtatFormToPresentationSetting(workflowEtatForm?.workflowEtatsForms);
|
|
379
|
+
return workflowEtat;
|
|
380
|
+
}
|
|
381
|
+
return undefined;
|
|
382
|
+
}
|
|
383
|
+
// #region Presentation Settings
|
|
384
|
+
addInputs(presentationRequest, applyGridConfig = true, workflowEtat, directiveElements = this.directiveElements) {
|
|
385
|
+
if ((!workflowEtat || workflowEtat.presentationSettingDetails.length == 0)
|
|
386
|
+
&& this.workflowInformation
|
|
387
|
+
&& this.workflowInformation?.workflowEtat) {
|
|
388
|
+
workflowEtat = this.getWorkflowEtatForm();
|
|
389
|
+
}
|
|
390
|
+
const hasPresentationRequest = presentationRequest?.presentationSettingDetails?.length > 0;
|
|
391
|
+
if (hasPresentationRequest) {
|
|
392
|
+
directiveElements = directiveElements.filter(x => presentationRequest.presentationSettingDetails?.some(y => y.blockName === x.presentationDesigner && (y.isBlockVisible == undefined || y.isBlockVisible == true)
|
|
393
|
+
&& x.treated == false));
|
|
394
|
+
}
|
|
395
|
+
directiveElements?.forEach(directive => {
|
|
396
|
+
const presentationSettingDetail = presentationRequest.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
|
|
397
|
+
if (presentationSettingDetail == undefined || presentationSettingDetail.isBlockVisible) {
|
|
398
|
+
let worfkflowEtatForm = this.getWorkflowEtatForm();
|
|
399
|
+
if (worfkflowEtatForm) {
|
|
400
|
+
let workflowConfig = worfkflowEtatForm.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
|
|
401
|
+
if (!workflowConfig) {
|
|
402
|
+
directive.execute(true, presentationSettingDetail?.configuration);
|
|
403
|
+
}
|
|
404
|
+
else if (workflowConfig && workflowConfig.isBlockVisible && (workflowConfig.isInputEnabled == undefined || workflowConfig.isInputEnabled == true)) {
|
|
405
|
+
directive.execute(true, presentationSettingDetail?.configuration);
|
|
406
|
+
}
|
|
407
|
+
else if (workflowConfig && workflowConfig.isBlockVisible && workflowConfig.isInputEnabled == false) {
|
|
408
|
+
directive.disableInputs();
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
directive.execute(true, presentationSettingDetail?.configuration);
|
|
413
|
+
}
|
|
414
|
+
if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
415
|
+
directive.addCheckboxesToInputs(this._workflowConfigurationService.workflowFormConfiguration);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
if (this.mode === Modes.create) {
|
|
420
|
+
this.processDisabledInputs(presentationRequest, directiveElements);
|
|
421
|
+
}
|
|
422
|
+
this.removeEmptyAncestorsFromElements();
|
|
423
|
+
}
|
|
424
|
+
processDisabledInputs(presentationRequest, directiveElements = this.directiveElements) {
|
|
425
|
+
if (this._layoutHelperService?.isDesignMode || this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
const hasPresentationRequest = presentationRequest?.presentationSettingDetails?.length > 0;
|
|
429
|
+
if (hasPresentationRequest) {
|
|
430
|
+
directiveElements = directiveElements.filter(x => presentationRequest.presentationSettingDetails?.some(y => y.blockName === x.presentationDesigner && y.isBlockVisible));
|
|
431
|
+
}
|
|
432
|
+
const worfkflowEtatForm = this.getWorkflowEtatForm();
|
|
433
|
+
directiveElements?.forEach(directive => {
|
|
434
|
+
let workflowConfig = worfkflowEtatForm?.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
|
|
435
|
+
if (workflowConfig && !workflowConfig.isInputEnabled && (workflowConfig.isBlockVisible ?? true)) {
|
|
436
|
+
directive.disableInputs();
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
removeEmptyAncestorsFromElements() {
|
|
441
|
+
// setTimeout(() => {
|
|
442
|
+
// this._presentationDesignerService.getDirectives().forEach(s => s.removeEmptyAncestors(s?.tempTemplateParentNode))
|
|
443
|
+
// }, 0);
|
|
444
|
+
}
|
|
445
|
+
getPresentationSetingDetailUid(blockName) {
|
|
446
|
+
return this.presentationRequest?.presentationSettingDetails?.find(x => x.blockName == blockName)?.uid;
|
|
447
|
+
}
|
|
448
|
+
getComponentIdentifier() {
|
|
449
|
+
// if (this.descriminatorValue) {
|
|
450
|
+
// return `${this._myName()}_${this.descriminatorValue}`
|
|
451
|
+
// }
|
|
452
|
+
return this._myName();
|
|
453
|
+
}
|
|
454
|
+
saveProperties() {
|
|
455
|
+
this.initTsiGridsRef();
|
|
456
|
+
this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
|
|
457
|
+
if (!this.presentationRequest) {
|
|
458
|
+
this.presentationRequest = new PresentationSetting();
|
|
459
|
+
}
|
|
460
|
+
let presentationSettingDetails = [];
|
|
461
|
+
this.directiveElements?.forEach((directive) => {
|
|
462
|
+
let configuration = undefined;
|
|
463
|
+
let gridState = [
|
|
464
|
+
...this.viewGridsComponents,
|
|
465
|
+
...this.genericGridsComponents,
|
|
466
|
+
...this.genericCrudsComponents,
|
|
467
|
+
...this.editableGridComponents
|
|
468
|
+
]
|
|
469
|
+
.find(x => x.id === directive.presentationDesigner || ('formName' in x && x.formName === directive.presentationDesigner))
|
|
470
|
+
?.getState();
|
|
471
|
+
configuration = gridState ? JSON.stringify(gridState) : undefined;
|
|
472
|
+
let object = {
|
|
473
|
+
blockName: directive.presentationDesigner,
|
|
474
|
+
isBlockVisible: !directive.showHideCheckboxComponentRef?.instance?._checked,
|
|
475
|
+
uid: this.getPresentationSetingDetailUid(directive.presentationDesigner ?? ""),
|
|
476
|
+
configuration: configuration
|
|
477
|
+
};
|
|
478
|
+
presentationSettingDetails.push(object);
|
|
479
|
+
});
|
|
480
|
+
this.presentationRequest.componentIdentifer = this.getComponentIdentifier();
|
|
481
|
+
this.presentationRequest.descriminatorValue = this.descriminatorValue;
|
|
482
|
+
this.presentationRequest.presentationSettingDetails = presentationSettingDetails;
|
|
483
|
+
this.isloading = true;
|
|
484
|
+
if (this.presentationRequest.uid != null && this.presentationRequest.uid != undefined) {
|
|
485
|
+
this._presentationSettingService.updatePresentationSetting(this.presentationRequest, this.presentationRequest.uid)
|
|
486
|
+
.subscribe({
|
|
487
|
+
next: async (data) => {
|
|
488
|
+
await this.processAfterSaveConfiguration();
|
|
489
|
+
},
|
|
490
|
+
error: (error) => {
|
|
491
|
+
console.log(error);
|
|
492
|
+
this._errorResponseManager.showErrorMessage(error);
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
this._presentationSettingService.createPresentationSetting(this.presentationRequest)
|
|
498
|
+
.subscribe({
|
|
499
|
+
next: async (data) => {
|
|
500
|
+
await this.processAfterSaveConfiguration();
|
|
501
|
+
},
|
|
502
|
+
error: (error) => {
|
|
503
|
+
console.log(error);
|
|
504
|
+
this._errorResponseManager.showErrorMessage(error);
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
processSingleElement(directive) {
|
|
510
|
+
this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
|
|
511
|
+
let presentationSettingDetail = this.presentationRequest?.presentationSettingDetails?.find(x => x.blockName == directive.presentationDesigner);
|
|
512
|
+
if (presentationSettingDetail == undefined || presentationSettingDetail.isBlockVisible) {
|
|
513
|
+
let worfkflowEtatForm = this.getWorkflowEtatForm();
|
|
514
|
+
if (worfkflowEtatForm) {
|
|
515
|
+
let workflowConfig = worfkflowEtatForm.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
|
|
516
|
+
if (!workflowConfig) {
|
|
517
|
+
directive.execute(true, presentationSettingDetail?.configuration);
|
|
518
|
+
}
|
|
519
|
+
else if (workflowConfig && workflowConfig.isBlockVisible && (workflowConfig.isInputEnabled == undefined || workflowConfig.isInputEnabled == true)) {
|
|
520
|
+
directive.execute(true, presentationSettingDetail?.configuration);
|
|
521
|
+
}
|
|
522
|
+
else if (workflowConfig && workflowConfig.isBlockVisible && workflowConfig.isInputEnabled == false) {
|
|
523
|
+
directive.disableInputs();
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
directive.execute(true, presentationSettingDetail?.configuration);
|
|
528
|
+
}
|
|
529
|
+
if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
|
|
530
|
+
directive.addCheckboxesToInputs(this._workflowConfigurationService.workflowFormConfiguration);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
unsubscribeFromActiveSubscritpion() {
|
|
535
|
+
if (this._designModeFormSubscription) {
|
|
536
|
+
this._designModeFormSubscription.unsubscribe();
|
|
537
|
+
}
|
|
538
|
+
if (this._saveWorkflowFormConfigurationSubscription) {
|
|
539
|
+
this._saveWorkflowFormConfigurationSubscription.unsubscribe();
|
|
540
|
+
}
|
|
541
|
+
if (this._addedDirectiveSubscritpion) {
|
|
542
|
+
this._addedDirectiveSubscritpion.unsubscribe();
|
|
543
|
+
}
|
|
544
|
+
if (this._addedDirectiveBaseSubscritpion) {
|
|
545
|
+
this._addedDirectiveBaseSubscritpion.unsubscribe();
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
removeTsiModalFooter() {
|
|
549
|
+
const tsiModalFooter = document.querySelector("tsi-modal-footer");
|
|
550
|
+
if (tsiModalFooter && tsiModalFooter.lastChild) {
|
|
551
|
+
this._renderer?.removeChild(tsiModalFooter, tsiModalFooter.lastChild);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
createSaveButton() {
|
|
555
|
+
const tsiButtonRef = this._viewContainerRef?.createComponent(TsiButtonComponent);
|
|
556
|
+
tsiButtonRef?.setInput('text', 'shared_tsi_component_save_config_show_hide');
|
|
557
|
+
tsiButtonRef?.setInput('icon', 'save');
|
|
558
|
+
tsiButtonRef.instance.onClick.emit = () => this.saveProperties();
|
|
559
|
+
const tsiForm = document.querySelector("tsi-form");
|
|
560
|
+
if (tsiForm) {
|
|
561
|
+
this._renderer?.appendChild(tsiForm, tsiButtonRef?.location.nativeElement);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
async processAfterSaveConfiguration() {
|
|
565
|
+
this.isloading = false;
|
|
566
|
+
this.hide();
|
|
567
|
+
this._messageInfoService.success(LocalizationKeys.savedSuccessfully);
|
|
568
|
+
this._layoutHelperService.isDesignMode = false;
|
|
569
|
+
// this._layoutHelperService.currentFormName = undefined
|
|
570
|
+
this._layoutHelperService._designModeFormSubject.next(false);
|
|
571
|
+
await this._presentationSettingService.loadPresentationSettings();
|
|
572
|
+
}
|
|
573
|
+
save() {
|
|
574
|
+
this.requiredInputs = this._inputRegistry.getAll().filter(inp => inp.isRequired && inp.disabled === false);
|
|
575
|
+
this.faultyInputs = [];
|
|
576
|
+
this.isFormValid = this.requiredInputs.every(input => input.isValid().isValid === true);
|
|
577
|
+
this.requiredInputs.forEach(input => {
|
|
578
|
+
let fvr = input.isValid();
|
|
579
|
+
if (fvr.isValid === false) {
|
|
580
|
+
this.faultyInputs.push(fvr);
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
if (this.isFormValid === false && this.faultyInputs.length > 0) {
|
|
584
|
+
console.log(this.faultyInputs);
|
|
585
|
+
let faultyInputsNames = "";
|
|
586
|
+
this.faultyInputs.forEach((item, index) => {
|
|
587
|
+
if (index === this.faultyInputs.length - 1)
|
|
588
|
+
faultyInputsNames += `${item.inputName}. `;
|
|
589
|
+
else
|
|
590
|
+
faultyInputsNames += `${item.inputName}, `;
|
|
591
|
+
});
|
|
592
|
+
faultyInputsNames = faultyInputsNames.replace(/,$/, '');
|
|
593
|
+
if (this.faultyInputs.some(fi => fi.error === FormValidationError.Required)) {
|
|
594
|
+
this._messageInfoService.warn(faultyInputsNames, this.localize?.transform('tsi_form_base_auto_validation_required_field_title'));
|
|
595
|
+
throw new Error(`Les champs ${faultyInputsNames} sont obligatoire.`);
|
|
596
|
+
}
|
|
597
|
+
else if (this.faultyInputs.some(fi => fi.error === FormValidationError.MaxLength)) {
|
|
598
|
+
this._messageInfoService.warn(`
|
|
599
|
+
${this.localize?.transform('tsi_form_base_auto_validation_the_field')}
|
|
600
|
+
${this.faultyInputs[0].inputName}
|
|
601
|
+
${this.localize?.transform('tsi_form_base_auto_validation_max_length')}
|
|
602
|
+
${this.faultyInputs[0].data} ${this.localize?.transform('tsi_form_base_auto_validation_max_length_chars')}`, this.localize?.transform('tsi_form_base_auto_validation_max_length_field_title'));
|
|
603
|
+
throw new Error(`Le champ ${this.faultyInputs[0].inputName} ne doit pas dépasser ${this.faultyInputs[0].data} caractères.`);
|
|
604
|
+
}
|
|
605
|
+
else if (this.faultyInputs.some(fi => fi.error === FormValidationError.OutOfRange)) {
|
|
606
|
+
//to do
|
|
607
|
+
throw new Error(`Le champ ${this.faultyInputs[0].inputName} doit être dans l'intervalle.`);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponentBaseComponent, deps: [{ token: i1.DynamicDialogRef }, { token: i1.DynamicDialogConfig }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
612
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFormComponentBaseComponent, selector: "app-tsi-form-base", inputs: { itemDialog: "itemDialog", mode: "mode", id: "id", isloading: "isloading", header: "header", saving: "saving", item: "item", status: "status" }, outputs: { onSave: "onSave" }, viewQueries: [{ propertyName: "form", first: true, predicate: TsiFormComponent, descendants: true }, { propertyName: "modalFooter", first: true, predicate: TsiButtonComponent, descendants: true }, { propertyName: "checkbox", predicate: TsiCheckboxComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<p>tsi-form-base works!</p>\r\n", styles: [".new-block{margin-bottom:20px;border:1px solid #ccc;padding:10px}.flex{display:flex;align-items:center;margin-bottom:5px}.flex input[type=checkbox]{margin-right:10px}\n"] }); }
|
|
613
|
+
}
|
|
614
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponentBaseComponent, decorators: [{
|
|
615
|
+
type: Component,
|
|
616
|
+
args: [{ selector: 'app-tsi-form-base', template: "<p>tsi-form-base works!</p>\r\n", styles: [".new-block{margin-bottom:20px;border:1px solid #ccc;padding:10px}.flex{display:flex;align-items:center;margin-bottom:5px}.flex input[type=checkbox]{margin-right:10px}\n"] }]
|
|
617
|
+
}], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }, { type: i0.ChangeDetectorRef }], propDecorators: { form: [{
|
|
618
|
+
type: ViewChild,
|
|
619
|
+
args: [TsiFormComponent]
|
|
620
|
+
}], modalFooter: [{
|
|
621
|
+
type: ViewChild,
|
|
622
|
+
args: [TsiButtonComponent]
|
|
623
|
+
}], checkbox: [{
|
|
624
|
+
type: ViewChildren,
|
|
625
|
+
args: [TsiCheckboxComponent]
|
|
626
|
+
}], itemDialog: [{
|
|
627
|
+
type: Input
|
|
628
|
+
}], mode: [{
|
|
629
|
+
type: Input
|
|
630
|
+
}], id: [{
|
|
631
|
+
type: Input
|
|
632
|
+
}], isloading: [{
|
|
633
|
+
type: Input
|
|
634
|
+
}], header: [{
|
|
635
|
+
type: Input
|
|
636
|
+
}], saving: [{
|
|
637
|
+
type: Input
|
|
638
|
+
}], item: [{
|
|
639
|
+
type: Input
|
|
640
|
+
}], status: [{
|
|
641
|
+
type: Input
|
|
642
|
+
}], onSave: [{
|
|
643
|
+
type: Output
|
|
644
|
+
}] } });
|
|
645
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZvcm0tYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWJhc2UvY29tcG9uZW50cy90c2ktZm9ybS1iYXNlL3RzaS1mb3JtLWJhc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1iYXNlL2NvbXBvbmVudHMvdHNpLWZvcm0tYmFzZS90c2ktZm9ybS1iYXNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUQsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQWEsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFeFAsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFzQixlQUFlLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakcsT0FBTyxFQUEwQixtQkFBbUIsRUFBOEUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxSixPQUFPLEVBQUUsbUJBQW1CLEVBQThCLDRCQUE0QixFQUFFLDBCQUEwQixFQUFFLHNCQUFzQixFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdlMsT0FBTyxFQUFFLDZCQUE2QixFQUFxQyxNQUFNLHlCQUF5QixDQUFDO0FBRTNHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3ZGLE9B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QUMsQ0FBQyxDQUFDLENBQUMsU0FBUyx5QkFBeUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDO1lBQzlILENBQUM7aUJBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDbkYsT0FBTztnQkFDUCxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLCtCQUErQixDQUFDLENBQUM7WUFDN0YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQXZ3QlUsNkJBQTZCO21HQUE3Qiw2QkFBNkIsd1JBcUU3QixnQkFBZ0IsOEVBR2hCLGtCQUFrQiw4REFFZixvQkFBb0IsdUVDdEdwQyxpQ0FDQTs7NEZEMkJhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSxtQkFBbUI7dUpBeUVBLElBQUk7c0JBQWhDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUdJLFdBQVc7c0JBQXpDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUVPLFFBQVE7c0JBQTNDLFlBQVk7dUJBQUMsb0JBQW9CO2dCQXNCekIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFjRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFNTyxNQUFNO3NCQUFsQixLQUFLO2dCQTRCSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRDaGVja2VkLCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9hcHAtYmFzZS9hcHAtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cyc7XHJcbmltcG9ydCB7IEZvcm1WYWxpZGl0eVJlc3VsdCwgQ29tcG9uZW50X01vZGVzLCBNb2RlcywgRm9ybVZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgQ29tYm9TdGF0dXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnREZXNjcmltaW5hdG9yLCBQcmVzZW50YXRpb25TZXR0aW5nLCBlbnRpdHlJbmZvLCB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSwgUHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IExheW91dEhlbHBlclNlcnZpY2UsIEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLCBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLCBQcmVzZW50YXRpb25TZXR0aW5nU2VydmljZSwgVHNpTm90aWZpY2F0aW9uU2VydmljZSwgRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLCBQcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UsIFJlcG9ydGluZ1NlcnZpY2UsIElucHV0UmVnaXN0cnlTZXJ2aWNlLCBHZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgUHJlc2VudGF0aW9uRGVzaWduZXJEaXJlY3RpdmUsIFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSB9IGZyb20gJy4uLy4uLy4uL3RzaS1kaXJlY3RpdmVzJztcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHNpRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL3RzaS1mb3JtL3RzaS1mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRzaUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL2J1dHRvbi1jb21wb25lbnRzL3RzaS1idXR0b24vdHNpLWJ1dHRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLWNoZWNrYm94L3RzaS1jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0YWJsZUdyaWRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90c2ktY29tcG9uZW50cy9pbnB1dC1jb21wb25lbnRzL2VkaXRhYmxlLWdyaWQvZWRpdGFibGUtZ3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lWaWV3R3JpZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL291dHB1dC1jb21wb25lbnRzL3RzaS12aWV3LWdyaWQvdHNpLXZpZXctZ3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lHZW5lcmljR3JpZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL291dHB1dC1jb21wb25lbnRzL3RzaS1nZW5lcmljLWdyaWQvdHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lHZW5lcmljQ3J1ZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL3RzaS1nZW5lcmljLWNydWQvdHNpLWdlbmVyaWMtY3J1ZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgUHJlc2VudGF0aW9uRGVzaWduZXJCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ByZXNlbnRhdGlvbi1zZXR0aW5nL3ByZXNlbnRhdGlvbi1kZXNpZ25lci1iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC10c2ktZm9ybS1iYXNlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLWZvcm0tYmFzZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHNpLWZvcm0tYmFzZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lGb3JtQ29tcG9uZW50QmFzZUNvbXBvbmVudCBleHRlbmRzIEFwcEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkIHtcclxuICAvLyNyZWdpb24gcHJvcGVydGllc1xyXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgZm9ybUVuZHBvaW50KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3VwZXIuZm9ybUVuZHBvaW50O1xyXG4gIH07XHJcbiAgcHJpdmF0ZSBvdmVycmlkZSBzZXQgZm9ybUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuICAgIHN1cGVyLmZvcm1FbmRwb2ludCA9IGAke2VuZHBvaW50fS8ke3RoaXMuaWR9YDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgYnVzaW5lc3NDbGFzcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9idXNpbmVzc0NsYXNzO1xyXG4gIH1cclxuICBwdWJsaWMgb3ZlcnJpZGUgc2V0IGJ1c2luZXNzQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYnVzaW5lc3NDbGFzcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5mb3JtRW5kcG9pbnQgPSB0aGlzLmJ1c2luZXNzQ2xhc3M7XHJcbiAgICB0aGlzLl9nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZT8ubG9hZEVudGl0eVZhbGlkYXRpb25JbmZvcyh0aGlzLl9idXNpbmVzc0NsYXNzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbXBvbmVudERlc2NyaW1pbmF0b3I6IENvbXBvbmVudERlc2NyaW1pbmF0b3IgfCB1bmRlZmluZWRcclxuICBwcml2YXRlIGRlc2NyaW1pbmF0b3JWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkXHJcblxyXG4gIHByb3RlY3RlZCBzZXQgY29tcG9uZW50RGVzY3JpbWluYXRvcih2YWx1ZTogQ29tcG9uZW50RGVzY3JpbWluYXRvciB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fY29tcG9uZW50RGVzY3JpbWluYXRvciA9IHZhbHVlXHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUucHJvcGVydHlWYWx1ZSkge1xyXG4gICAgICBpZiAodGhpcy5mb3JtKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmRlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlLnByb3BlcnR5VmFsdWVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlLnByb3BlcnR5VmFsdWVcclxuICAgICAgdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0ID0gdGhpcy5fcHJlc2VudGF0aW9uU2V0dGluZ1NlcnZpY2UuZ2V0UHJlc2VudGF0aW9uU2V0dGluZ0J5Q29tcG9uZW50SWRlbnRpZmllclN5bmModGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCksXHJcbiAgICAgICAgdGhpcy5kZXNjcmltaW5hdG9yVmFsdWUpID8/IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuICAgICAgdGhpcy5kaXJlY3RpdmVFbGVtZW50cyA9IFsuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0RGlyZWN0aXZlcygpLFxyXG4gICAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLmFkZElucHV0cyh0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QsICF0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlPy5pc0Rlc2lnbk1vZGUpXHJcblxyXG4gICAgICAvLyB0aGlzLl9yZXBvcnRpbmdTZXJ2aWNlLmdldFJlcG9ydERlY3JpbWluYXRvcihyZXEpLnN1YnNjcmliZSh7XHJcbiAgICAgIC8vICAgbmV4dDogYXN5bmMgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5kZXNjcmltaW5hdG9yVmFsdWUgPSByZXN1bHQucHJvcGVydHlWYWx1ZTtcclxuICAgICAgLy8gICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCA9IHRoaXMuX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlLmdldFByZXNlbnRhdGlvblNldHRpbmdCeUNvbXBvbmVudElkZW50aWZpZXJTeW5jKHRoaXMuZ2V0Q29tcG9uZW50SWRlbnRpZmllcigpKSA/PyBuZXcgUHJlc2VudGF0aW9uU2V0dGluZygpXHJcbiAgICAgIC8vICAgICBpZiAodGhpcy5mb3JtKSB7XHJcbiAgICAgIC8vICAgICAgIHRoaXMuZm9ybS5kZXNjcmltaW5hdG9yVmFsdWUgPSByZXN1bHQucHJvcGVydHlWYWx1ZVxyXG4gICAgICAvLyAgICAgICBpZiAodGhpcy5lbnRpdHlJbmZvPy5pc1dvcmtmbG93KSB7XHJcbiAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5mb3JtLmdldFdvcmtmbG93RW50aXR5SW5mb3JtYXRpb24odGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmlkLCB0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JDbGFzc05hbWUsXHJcbiAgICAgIC8vICAgICAgICAgICB0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUpXHJcbiAgICAgIC8vICAgICAgIH1cclxuICAgICAgLy8gICAgIH1cclxuICAgICAgLy8gICAgIHRoaXMuYWRkSW5wdXRzKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCwgIXRoaXMuX2xheW91dEhlbHBlclNlcnZpY2U/LmlzRGVzaWduTW9kZSlcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIC8vICAgfSxcclxuICAgICAgLy8gfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybSkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5kZXNjcmltaW5hdG9yVmFsdWUgPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBjb21wb25lbnREZXNjcmltaW5hdG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudERlc2NyaW1pbmF0b3JcclxuICB9XHJcblxyXG5cclxuICBAVmlld0NoaWxkKFRzaUZvcm1Db21wb25lbnQpIGZvcm0/OiBUc2lGb3JtQ29tcG9uZW50O1xyXG5cclxuXHJcbiAgQFZpZXdDaGlsZChUc2lCdXR0b25Db21wb25lbnQpIG1vZGFsRm9vdGVyPzogRWxlbWVudFJlZiB8IGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihUc2lDaGVja2JveENvbXBvbmVudCkgY2hlY2tib3g/OiBBcnJheTxUc2lDaGVja2JveENvbXBvbmVudD47XHJcblxyXG4gIGZhdWx0eUlucHV0czogRm9ybVZhbGlkaXR5UmVzdWx0W10gPSBbXTtcclxuICBpc0Zvcm1WYWxpZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICByZXF1aXJlZElucHV0czogVHNpSW5wdXRCYXNlW10gPSBbXTtcclxuICAvLyBAVmlld0NoaWxkcmVuKEVkaXRhYmxlR3JpZENvbXBvbmVudCkgZWRpdGFibGVHcmlkQ29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxFZGl0YWJsZUdyaWRDb21wb25lbnQ+O1xyXG5cclxuICAvLyBAVmlld0NoaWxkcmVuKFRzaVZpZXdHcmlkQ29tcG9uZW50KSB2aWV3R3JpZHNDb21wb25lbnRzITogUXVlcnlMaXN0PFRzaVZpZXdHcmlkQ29tcG9uZW50PjtcclxuICAvLyBAVmlld0NoaWxkcmVuKFRzaUdlbmVyaWNHcmlkQ29tcG9uZW50KSBnZW5lcmljR3JpZHNDb21wb25lbnRzITogUXVlcnlMaXN0PFRzaUdlbmVyaWNHcmlkQ29tcG9uZW50PjtcclxuICAvLyBAVmlld0NoaWxkcmVuKFRzaUdlbmVyaWNDcnVkQ29tcG9uZW50KSBnZW5lcmljQ3J1ZHNDb21wb25lbnRzITogUXVlcnlMaXN0PFRzaUdlbmVyaWNDcnVkQ29tcG9uZW50PjtcclxuICBlZGl0YWJsZUdyaWRDb21wb25lbnRzOiBBcnJheTxFZGl0YWJsZUdyaWRDb21wb25lbnQ+ID0gW107XHJcbiAgdmlld0dyaWRzQ29tcG9uZW50czogQXJyYXk8VHNpVmlld0dyaWRDb21wb25lbnQ+ID0gW107XHJcbiAgZ2VuZXJpY0dyaWRzQ29tcG9uZW50czogQXJyYXk8VHNpR2VuZXJpY0dyaWRDb21wb25lbnQ+ID0gW107XHJcbiAgZ2VuZXJpY0NydWRzQ29tcG9uZW50czogQXJyYXk8VHNpR2VuZXJpY0NydWRDb21wb25lbnQ+ID0gW107XHJcblxyXG5cclxuICBmb3JtUmVmPzogTmdGb3JtO1xyXG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VkQ29tcG9uZW50OiBhbnk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBASW5wdXQoKSBpdGVtRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbW9kZT86IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2lzbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBpc2xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzbG9hZGluZyA9IHZhbHVlO1xyXG4gICAgY29uc29sZS5sb2coJ2lzbG9hZGluZyBzZXQgdG8nLCB2YWx1ZSk7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0Rpc2FibGVkSW5wdXRzKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdClcclxuICAgICAgfSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaXNsb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzbG9hZGluZztcclxuICB9XHJcbiAgQElucHV0KCkgaGVhZGVyPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNhdmluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGl0ZW06IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RhdHVzPzogc3RyaW5nID0gJyc7XHJcbiAgZ2V0IHN0YXR1cygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IHN0YXR1cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLmZvcm0gJiYgdGhpcy5mb3JtLnN0YXR1cyAhPT0gdGhpcy5fc3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5zdGF0dXMgPSB0aGlzLl9zdGF0dXM7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vYnNNb2RhbFJlZj86IGFueTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKVxyXG4gIHByaXZhdGUgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMilcclxuICBwcml2YXRlIF9sYXlvdXRIZWxwZXJTZXJ2aWNlID0gaW5qZWN0KExheW91dEhlbHBlclNlcnZpY2UpXHJcbiAgcHJpdmF0ZSBfd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZSA9IGluamVjdChXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlKVxyXG4gIHByaXZhdGUgX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlID0gaW5qZWN0KFByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlKVxyXG4gIHByaXZhdGUgX21lc3NhZ2VJbmZvU2VydmljZSA9IGluamVjdChUc2lOb3RpZmljYXRpb25TZXJ2aWNlKVxyXG4gIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyID0gaW5qZWN0KEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSlcclxuICBwcml2YXRlIF9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UgPSBpbmplY3QoUHJlc2VudGF0aW9uRGVzaWduZXJTZXJ2aWNlKVxyXG4gIHByaXZhdGUgX3ByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZVNlcnZpY2UgPSBpbmplY3QoUHJlc2VudGF0aW9uRGVzaWduZXJCYXNlU2VydmljZSlcclxuICBwcml2YXRlIF9yZXBvcnRpbmdTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydGluZ1NlcnZpY2UpXHJcbiAgcHVibGljIGxvY2FsaXplPyA9IGluamVjdChMb2NhbGl6ZVBpcGUpXHJcbiAgcHVibGljIF9pbnB1dFJlZ2lzdHJ5ID0gaW5qZWN0KElucHV0UmVnaXN0cnlTZXJ2aWNlKVxyXG4gIHByaXZhdGUgZGlyZWN0aXZlRWxlbWVudHM6IChQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSB8IFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSlbXSA9IFtdO1xyXG4gIHByZXNlbnRhdGlvblJlcXVlc3Q6IFByZXNlbnRhdGlvblNldHRpbmcgPSBuZXcgUHJlc2VudGF0aW9uU2V0dGluZygpXHJcbiAgX2Rlc2lnbk1vZGVGb3JtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XHJcbiAgX3NhdmVXb3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWRcclxuICBfYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZFxyXG4gIF9hZGRlZERpcmVjdGl2ZUJhc2VTdWJzY3JpdHBpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZFxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIF9nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZT86IEdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlID0gaW5qZWN0KEdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlKTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJlZj86IER5bmFtaWNEaWFsb2dSZWYsXHJcbiAgICBwdWJsaWMgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIHB1YmxpYyBvdmVycmlkZSBjZFJlZj86IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihjZFJlZik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB3b3JrZmxvd0luZm9ybWF0aW9uPzogd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2VcclxuICBjdXN0b21EYXRhPzogYW55XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICB0aGlzLl9pbml0TW9kYWxSZWYoKTtcclxuICAgIHRoaXMuaW5pdE1vZGFsRGF0YSgpO1xyXG4gICAgdGhpcy5fYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb24gPSB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuYWRkZWREaXJlY3RpdmVPYnNlcnZhYmxlXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEudHJlYXRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3cpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5SW5mbyA9IHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuY3VycmVudFdvcmtmbG93RW50aXR5SW5mb1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgJiYgIXRoaXMuZW50aXR5SW5mbz8uZGlzY3JpbWluYXRvckNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuX2FkZGVkRGlyZWN0aXZlQmFzZVN1YnNjcml0cGlvbiA9IHRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZVNlcnZpY2UuYWRkZWREaXJlY3RpdmVPYnNlcnZhYmxlXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEudHJlYXRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3cpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5SW5mbyA9IHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuY3VycmVudFdvcmtmbG93RW50aXR5SW5mb1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgJiYgIXRoaXMuZW50aXR5SW5mbz8uZGlzY3JpbWluYXRvckNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICB0aGlzLl9kZXNpZ25Nb2RlRm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuX2Rlc2lnbk1vZGVGb3JtU3ViamVjdC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMudG9nZ2xlRGVzaWduTW9kZSgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB0b2dnbGVEZXNpZ25Nb2RlKCkge1xyXG4gICAgdGhpcy5yZW1vdmVUc2lNb2RhbEZvb3RlcigpXHJcbiAgICB0aGlzLmNyZWF0ZVNhdmVCdXR0b24oKTtcclxuXHJcbiAgICB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QgPSB0aGlzLl9wcmVzZW50YXRpb25TZXR0aW5nU2VydmljZS5nZXRQcmVzZW50YXRpb25TZXR0aW5nQnlDb21wb25lbnRJZGVudGlmaWVyU3luYyh0aGlzLmdldENvbXBvbmVudElkZW50aWZpZXIoKSwgdGhpcy5kZXNjcmltaW5hdG9yVmFsdWUpID8/IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuXHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzID0gWy4uLnRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXREaXJlY3RpdmVzKCksXHJcbiAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgXTtcclxuXHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzPy5mb3JFYWNoKGlucHV0ID0+IHtcclxuICAgICAgaW5wdXQuaW5zZXJ0RWxlbWVudCgpO1xyXG4gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSkge1xyXG4gICAgICAgIGlucHV0LnNlbGVjdEFwcHJvcmlhdGVDb2x1bW5zKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCk7XHJcbiAgICAgIH1cclxuICAgICAgaW5wdXQuYWRkQ2hlY2tib3hlc1RvSW5wdXRzKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpXHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUFjdGl2ZVN1YnNjcml0cGlvbigpXHJcbiAgICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmlzRGVzaWduTW9kZSA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzID0gWy4uLnRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXREaXJlY3RpdmVzKCksXHJcbiAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgXTtcclxuICAgIGNvbnNvbGUubG9nKFwiY291bnQgb2YgZGlyZWN0aXZlRWxlbWVudHMgPT4gXCIsIHRoaXMuZGlyZWN0aXZlRWxlbWVudHMubGVuZ3RoKVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZT8uaXNEZXNpZ25Nb2RlXHJcbiAgICAgICYmICF0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICAvLyB0aGlzLnJlbW92ZVRzaU1vZGFsRm9vdGVyKClcclxuICAgICAgLy8gdGhpcy5jcmVhdGVTYXZlQnV0dG9uKClcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuaXNEZXNnaW5Nb2RlRnJvbVdvcmtmbG93KSB7XHJcbiAgICAgICAgdGhpcy5lbnRpdHlJbmZvID0gdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5jdXJyZW50V29ya2Zsb3dFbnRpdHlJbmZvXHJcbiAgICAgIH1cclxuICAgICAgLy8gZWxzZSB7XHJcbiAgICAgIC8vICAgdGhpcy5lbnRpdHlJbmZvID0gYXdhaXQgdGhpcy5fZW50aXR5Q29uZmlnU2VydmljZS5nZXRFbnRpdHlJbmZvRnJvbUNhY2hlKHRoaXMuYnVzaW5lc3NDbGFzcylcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8vaW5pdCBnZW5lcmljQ3J1ZCByZXBvcnRpbmdcclxuICAgIGlmICh0aGlzLmZvcm0pIHtcclxuICAgICAgdGhpcy5mb3JtLmZvcm1SZWZDaGFuZ2Uuc3Vic2NyaWJlKGYgPT4ge1xyXG4gICAgICAgIGlmIChmKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1SZWYgPSBmO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm9ybS5kaXNhYmxlZCA9IHRoaXMuaXNGb3JtRGlzYWJsZWQ7XHJcbiAgICAgIHRoaXMuZm9ybS5mb3JtRW5kcG9pbnQgPSB0aGlzLmZvcm1FbmRwb2ludDtcclxuICAgICAgdGhpcy5mb3JtLmZvcm1OYW1lID0gdGhpcy5mb3JtTmFtZTtcclxuICAgICAgdGhpcy5mb3JtLmJ1c2luZXNzQ2xhc3MgPSB0aGlzLl9idXNpbmVzc0NsYXNzXHJcbiAgICAgIHRoaXMuZm9ybS5mb3JtTmFtZSA9IHRoaXMuZm9ybU5hbWU7XHJcbiAgICAgIHRoaXMuZm9ybS5pZCA9IHRoaXMuaWQ7XHJcbiAgICAgIHRoaXMuZm9ybS5tb2RlID0gdGhpcy5tb2RlXHJcblxyXG4gICAgICAvLyB3b3JrZmxvdyBmb3JtIGRlc2lnblxyXG4gICAgICB0aGlzLl9zYXZlV29ya2Zsb3dGb3JtQ29uZmlndXJhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybS5vblN1Ym1pdEZvcm1Xb3JrZmxvd0NvbmZpZ3VyYXRpb24uc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIGxldCB3b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uID0gdGhpcy5nZXRGb3JtV29yZmtsb3dQcmVzZW50YXRpb25TZXR0aW5nKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJGb3JtV29yZmtsb3dTZXR0aW5nID0+IFwiLCB3b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uKVxyXG4gICAgICAgIHRoaXMuaGlkZSh3b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5mb3JtLm9uU3RhdHVzQ2hhbmdlLnN1YnNjcmliZSgobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gbmV3VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW9kZSA9PSBDb21wb25lbnRfTW9kZXMuQ1JFQVRFKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrYm94KSB7XHJcbiAgICAgICAgdGhpcy5jaGVja2JveC5mb3JFYWNoKGJveCA9PiB7XHJcbiAgICAgICAgICBib3guaW5wdXRGaWVsZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYm94LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGluaXRUc2lHcmlkc1JlZigpIHtcclxuICAgIHRoaXMudmlld0dyaWRzQ29tcG9uZW50cyA9IHRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXRWaWV3R3JpZHMoKVxyXG4gICAgdGhpcy5nZW5lcmljR3JpZHNDb21wb25lbnRzID0gdGhpcy5fcHJlc2VudGF0aW9uRGVzaWduZXJTZXJ2aWNlLmdldEdlbmVyaWNHcmlkcygpXHJcbiAgICB0aGlzLmVkaXRhYmxlR3JpZENvbXBvbmVudHMgPSB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0RWRpdGFibGVHcmlkcygpXHJcbiAgICB0aGlzLmdlbmVyaWNDcnVkc0NvbXBvbmVudHMgPSB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0R2VuZXJpY0NydWRzKClcclxuICB9XHJcblxyXG4gIGdldEZvcm1Xb3Jma2xvd1ByZXNlbnRhdGlvblNldHRpbmcoKSB7XHJcbiAgICBsZXQgcHJlc2VudGF0aW9uUmVxdWVzdCA9IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuXHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzID0gWy4uLnRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXREaXJlY3RpdmVzKCksXHJcbiAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM6IFByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxbXSA9IFtdXHJcbiAgICBsZXQgYXZhaWxhYmxlRGlyZWN0aXZlRWxlbWVudHMgPSB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzLmZpbHRlcih4ID0+XHJcbiAgICAgICEodGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0Py5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5zb21lKHkgPT5cclxuICAgICAgICB5LmJsb2NrTmFtZSA9PT0geC5wcmVzZW50YXRpb25EZXNpZ25lciAmJiAheS5pc0Jsb2NrVmlzaWJsZVxyXG4gICAgICApKVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmluaXRUc2lHcmlkc1JlZigpXHJcblxyXG4gICAgYXZhaWxhYmxlRGlyZWN0aXZlRWxlbWVudHM/LmZvckVhY2goKGRpcmVjdGl2ZSkgPT4ge1xyXG5cclxuICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWRcclxuXHJcblxyXG4gICAgICBsZXQgZ3JpZFN0YXRlID0gW1xyXG4gICAgICAgIC4uLnRoaXMudmlld0dyaWRzQ29tcG9uZW50cyxcclxuICAgICAgICAuLi50aGlzLmdlbmVyaWNHcmlkc0NvbXBvbmVudHMsXHJcbiAgICAgICAgLi4udGhpcy5nZW5lcmljQ3J1ZHNDb21wb25lbnRzLFxyXG4gICAgICAgIC4uLnRoaXMuZWRpdGFibGVHcmlkQ29tcG9uZW50c1xyXG4gICAgICBdXHJcbiAgICAgICAgLmZpbmQoeCA9PiB4LmlkID09PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIgfHwgKCdmb3JtTmFtZScgaW4geCAmJiB4LmZvcm1OYW1lID09PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpKVxyXG4gICAgICAgID8uZ2V0U3RhdGUoKTtcclxuXHJcbiAgICAgIGNvbmZpZ3VyYXRpb24gPSBncmlkU3RhdGUgPyBKU09OLnN0cmluZ2lmeShncmlkU3RhdGUpIDogdW5kZWZpbmVkO1xyXG5cclxuXHJcbiAgICAgIGxldCBvYmplY3Q6IFByZXNlbnRhdGlvblNldHRpbmdEZXRhaWwgPSB7XHJcbiAgICAgICAgYmxvY2tOYW1lOiBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIsXHJcbiAgICAgICAgaXNCbG9ja1Zpc2libGU6ICFkaXJlY3RpdmUuc2hvd0hpZGVDaGVja2JveENvbXBvbmVudFJlZj8uaW5zdGFuY2U/Ll9jaGVja2VkLFxyXG4gICAgICAgIHVpZDogdGhpcy5nZXRQcmVzZW50YXRpb25TZXRpbmdEZXRhaWxVaWQoZGlyZWN0aXZlLnByZXNlbnRhdGlvbkRlc2lnbmVyID8/IFwiXCIpLFxyXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgaXNJbnB1dEVuYWJsZWQ6ICFkaXJlY3RpdmUuZGlzYWJsZWRDaGVja2JveENvbXBvbmVudFJlZj8uaW5zdGFuY2U/Ll9jaGVja2VkXHJcbiAgICAgIH1cclxuICAgICAgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHMucHVzaChvYmplY3QpXHJcbiAgICB9KVxyXG5cclxuICAgIHByZXNlbnRhdGlvblJlcXVlc3QuY29tcG9uZW50SWRlbnRpZmVyID0gdGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCk7XHJcbiAgICBwcmVzZW50YXRpb25SZXF1ZXN0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzID0gcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHNcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInByZXNlbnRhdGlvblJlcXVlc3QgPT4gXCIsIHByZXNlbnRhdGlvblJlcXVlc3QpXHJcbiAgICByZXR1cm4gcHJlc2VudGF0aW9uUmVxdWVzdFxyXG4gIH1cclxuXHJcblxyXG4gIGlzRGVsZXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gQ29tcG9uZW50X01vZGVzLkRFTEVURTtcclxuICB9XHJcbiAgaXNTdWJtaXREaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vcmV0dXJuICF0aGlzLmZvcm1SZWY/LmZvcm0/LnZhbGlkIHx8IHRoaXMuc2F2aW5nO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBpc0NvbnN1bHRNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBDb21wb25lbnRfTW9kZXMuQ09OU1VMVDtcclxuICB9XHJcblxyXG4gIGlzRHVwbGljYXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gQ29tcG9uZW50X01vZGVzLkRVUExJQ0FURTtcclxuICB9XHJcbiAgaXNFZGl0TW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gQ29tcG9uZW50X01vZGVzLkVESVQ7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaW5pdE1vZGFsRGF0YSgpIHtcclxuICAgIHN1cGVyLmluaXRNb2RhbERhdGEoKVxyXG4gICAgaWYgKHRoaXMub3BlbmVkRGlhbG9nUmVmICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dSZWYgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMub3BlbmVkRGlhbG9nQ29uZmlnICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dDb25maWcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vY2hlY2sgaGF2ZSBvcGVuZWREaWFsb2dDb25maWdcclxuICAgICAgaWYgKHRoaXMub3BlbmVkRGlhbG9nQ29uZmlnLmRhdGEgIT0gbnVsbCAmJiB0aGlzLm9wZW5lZERpYWxvZ0NvbmZpZy5kYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuY3VkQ29tcG9uZW50ID0gdGhpcy5vcGVuZWREaWFsb2dDb25maWcuZGF0YS5jdWRDb21wb25lbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfdmVyaWZ5TW9kYWxEYXRhKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlbmVkRGlhbG9nUmVmICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dSZWYgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMub3BlbmVkRGlhbG9nQ29uZmlnICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dDb25maWcgIT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwcml2YXRlIF9pbml0TW9kYWxSZWYoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmVyaWZ5TW9kYWxEYXRhKCkpIHtcclxuICAgICAgLy90aGlzLmJzTW9kYWxSZWYgPSB7aGlkZTogKCkgPT4gdGhpcy5vcGVuZWREaWFsb2dSZWYuZGVzdHJveSgpLGNsb3NlOiAodmFsOiBhbnkpPT57dGhpcy5vcGVuZWREaWFsb2dSZWYuY2xvc2UodmFsKX19XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vXHJcbiAgbChrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5sb2NhbGl6ZSAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMubG9jYWxpemUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiB0cmFpdGVyIG11bHRpcGxlIGNvbWJvXHJcbiAgYWxsQ29tYm9Mb2FkaW5nU3RhdHVzOiBBcnJheTxDb21ib1N0YXR1c01vZGVsPiA9IFtdO1xyXG4gIGFyZUFsbENvbWJvTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvY2Vzc0NvbWJvSW5pdEV2ZW50KGNvbWJvU3RhdHVzOiBDb21ib1N0YXR1c01vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMuYWxsQ29tYm9Mb2FkaW5nU3RhdHVzLmZpbmQodSA9PiB1LnVpZCA9PSBjb21ib1N0YXR1cy51aWQpKVxyXG4gICAgICB0aGlzLmFsbENvbWJvTG9hZGluZ1N0YXR1cy5wdXNoKGNvbWJvU3RhdHVzKTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NDb21ib0lzTG9hZGVkRXZlbnQoY29tYm9TdGF0dXM6IENvbWJvU3RhdHVzTW9kZWwpIHtcclxuICAgIGxldCBjb21ib1MgPSB0aGlzLmFsbENvbWJvTG9hZGluZ1N0YXR1cy5maW5kKHUgPT4gdS51aWQgPT0gY29tYm9TdGF0dXMudWlkKTtcclxuICAgIGlmIChjb21ib1MgIT0gbnVsbCAmJiBjb21ib1MgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbWJvUy5pc0RhdGFMb2FkZWQgPSBjb21ib1N0YXR1cy5pc0RhdGFMb2FkZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFyZUFsbENvbWJvTG9hZGVkRm4oKTtcclxuICB9XHJcblxyXG4gIGFyZUFsbENvbWJvTG9hZGVkRm4oKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxDb21ib0xvYWRpbmdTdGF0dXMubGVuZ3RoID4gMClcclxuICAgICAgdGhpcy5hbGxDb21ib0xvYWRpbmdTdGF0dXMuZm9yRWFjaCh1ID0+IHtcclxuICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdS5pc0RhdGFMb2FkZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgZWxzZSByZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmFyZUFsbENvbWJvTG9hZGVkID0gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgaGlkZSh2YWw/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZERpYWxvZ1JlZiAhPSBudWxsICYmIHRoaXMub3BlbmVkRGlhbG9nUmVmICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodmFsID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuZWREaWFsb2dSZWYuZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMub3BlbmVkRGlhbG9nUmVmLmNsb3NlKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHRyYWl0ZXIgbXVsdGlwbGUgY29tYm9cclxuXHJcbiAgZ2V0V29ya2Zsb3dFdGF0Rm9ybSgpIHtcclxuICAgIGxldCB3b3JrZmxvd0V0YXRGb3JtID0gdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS53b3JrZmxvd0V0YXRGb3JtRm9yQ3VycmVudEZvcm1cclxuICAgICAgPy5maW5kKHggPT4geC51aWQgPT0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpXHJcblxyXG4gICAgaWYgKHdvcmtmbG93RXRhdEZvcm0pIHtcclxuICAgICAgbGV0IHdvcmtmbG93RXRhdCA9IHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UubWFwV29ya2Zsb3dFdGF0Rm9ybVRvUHJlc2VudGF0aW9uU2V0dGluZyhcclxuICAgICAgICB3b3JrZmxvd0V0YXRGb3JtPy53b3JrZmxvd0V0YXRzRm9ybXNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB3b3JrZmxvd0V0YXRcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWRcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gUHJlc2VudGF0aW9uIFNldHRpbmdzXHJcbiAgYWRkSW5wdXRzKFxyXG4gICAgcHJlc2VudGF0aW9uUmVxdWVzdDogUHJlc2VudGF0aW9uU2V0dGluZyxcclxuICAgIGFwcGx5R3JpZENvbmZpZzogYm9vbGVhbiA9IHRydWUsXHJcbiAgICB3b3JrZmxvd0V0YXQ/OiBQcmVzZW50YXRpb25TZXR0aW5nLFxyXG4gICAgZGlyZWN0aXZlRWxlbWVudHM6IChQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSB8IFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSlbXSA9IHRoaXMuZGlyZWN0aXZlRWxlbWVudHNcclxuICApOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoKCF3b3JrZmxvd0V0YXQgfHwgd29ya2Zsb3dFdGF0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb25cclxuICAgICAgJiYgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpIHtcclxuICAgICAgd29ya2Zsb3dFdGF0ID0gdGhpcy5nZXRXb3JrZmxvd0V0YXRGb3JtKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoYXNQcmVzZW50YXRpb25SZXF1ZXN0ID0gcHJlc2VudGF0aW9uUmVxdWVzdD8ucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM/Lmxlbmd0aCA+IDA7XHJcblxyXG5cclxuICAgIGlmIChoYXNQcmVzZW50YXRpb25SZXF1ZXN0KSB7XHJcbiAgICAgIGRpcmVjdGl2ZUVsZW1lbnRzID0gZGlyZWN0aXZlRWxlbWVudHMuZmlsdGVyKHggPT5cclxuICAgICAgICBwcmVzZW50YXRpb25SZXF1ZXN0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzPy5zb21lKFxyXG4gICAgICAgICAgeSA9PiB5LmJsb2NrTmFtZSA9PT0geC5wcmVzZW50YXRpb25EZXNpZ25lciAmJiAoeS5pc0Jsb2NrVmlzaWJsZSA9PSB1bmRlZmluZWQgfHwgeS5pc0Jsb2NrVmlzaWJsZSA9PSB0cnVlKVxyXG4gICAgICAgICAgICAmJiB4LnRyZWF0ZWQgPT0gZmFsc2VcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlyZWN0aXZlRWxlbWVudHM/LmZvckVhY2goZGlyZWN0aXZlID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWwgPSBwcmVzZW50YXRpb25SZXF1ZXN0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLmZpbmQoeCA9PiB4LmJsb2NrTmFtZSA9PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpXHJcblxyXG4gICAgICBpZiAocHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCA9PSB1bmRlZmluZWQgfHwgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbC5pc0Jsb2NrVmlzaWJsZSkge1xyXG5cclxuICAgICAgICBsZXQgd29yZmtmbG93RXRhdEZvcm0gPSB0aGlzLmdldFdvcmtmbG93RXRhdEZvcm0oKTtcclxuXHJcbiAgICAgICAgaWYgKHdvcmZrZmxvd0V0YXRGb3JtKSB7XHJcbiAgICAgICAgICBsZXQgd29ya2Zsb3dDb25maWcgPSB3b3Jma2Zsb3dFdGF0Rm9ybS5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5maW5kKHggPT4geC5ibG9ja05hbWUgPT0gZGlyZWN0aXZlLnByZXNlbnRhdGlvbkRlc2lnbmVyKVxyXG5cclxuICAgICAgICAgIGlmICghd29ya2Zsb3dDb25maWcpIHtcclxuICAgICAgICAgICAgZGlyZWN0aXZlLmV4ZWN1dGUodHJ1ZSwgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbD8uY29uZmlndXJhdGlvbilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmICh3b3JrZmxvd0NvbmZpZy5pc0lucHV0RW5hYmxlZCA9PSB1bmRlZmluZWQgfHwgd29ya2Zsb3dDb25maWcuaXNJbnB1dEVuYWJsZWQgPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgZGlyZWN0aXZlLmV4ZWN1dGUodHJ1ZSwgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbD8uY29uZmlndXJhdGlvbilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmIHdvcmtmbG93Q29uZmlnLmlzSW5wdXRFbmFibGVkID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGl2ZS5kaXNhYmxlSW5wdXRzKClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBkaXJlY3RpdmUuZXhlY3V0ZSh0cnVlLCBwcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsPy5jb25maWd1cmF0aW9uKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuaXNEZXNnaW5Nb2RlRnJvbVdvcmtmbG93KSB7XHJcbiAgICAgICAgICBkaXJlY3RpdmUuYWRkQ2hlY2tib3hlc1RvSW5wdXRzKHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2Uud29ya2Zsb3dGb3JtQ29uZmlndXJhdGlvbilcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBNb2Rlcy5jcmVhdGUpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzRGlzYWJsZWRJbnB1dHMocHJlc2VudGF0aW9uUmVxdWVzdCwgZGlyZWN0aXZlRWxlbWVudHMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLnJlbW92ZUVtcHR5QW5jZXN0b3JzRnJvbUVsZW1lbnRzKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHByb2Nlc3NEaXNhYmxlZElucHV0cyhwcmVzZW50YXRpb25SZXF1ZXN0OiBQcmVzZW50YXRpb25TZXR0aW5nLCBkaXJlY3RpdmVFbGVtZW50czogKFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlIHwgUHJlc2VudGF0aW9uRGVzaWduZXJEaXJlY3RpdmVCYXNlKVtdID0gdGhpcy5kaXJlY3RpdmVFbGVtZW50cykge1xyXG4gICAgaWYgKHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2U/LmlzRGVzaWduTW9kZSB8fCB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGhhc1ByZXNlbnRhdGlvblJlcXVlc3QgPSBwcmVzZW50YXRpb25SZXF1ZXN0Py5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscz8ubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzUHJlc2VudGF0aW9uUmVxdWVzdCkge1xyXG4gICAgICBkaXJlY3RpdmVFbGVtZW50cyA9IGRpcmVjdGl2ZUVsZW1lbnRzLmZpbHRlcih4ID0+XHJcbiAgICAgICAgcHJlc2VudGF0aW9uUmVxdWVzdC5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscz8uc29tZShcclxuICAgICAgICAgIHkgPT4geS5ibG9ja05hbWUgPT09IHgucHJlc2VudGF0aW9uRGVzaWduZXIgJiYgeS5pc0Jsb2NrVmlzaWJsZVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3Qgd29yZmtmbG93RXRhdEZvcm0gPSB0aGlzLmdldFdvcmtmbG93RXRhdEZvcm0oKVxyXG4gICAgZGlyZWN0aXZlRWxlbWVudHM/LmZvckVhY2goZGlyZWN0aXZlID0+IHtcclxuXHJcbiAgICAgIGxldCB3b3JrZmxvd0NvbmZpZyA9IHdvcmZrZmxvd0V0YXRGb3JtPy5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5maW5kKHggPT4geC5ibG9ja05hbWUgPT0gZGlyZWN0aXZlLnByZXNlbnRhdGlvbkRlc2lnbmVyKVxyXG5cclxuICAgICAgaWYgKHdvcmtmbG93Q29uZmlnICYmICF3b3JrZmxvd0NvbmZpZy5pc0lucHV0RW5hYmxlZCAmJiAod29ya2Zsb3dDb25maWcuaXNCbG9ja1Zpc2libGUgPz8gdHJ1ZSkpIHtcclxuICAgICAgICBkaXJlY3RpdmUuZGlzYWJsZUlucHV0cygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZW1vdmVFbXB0eUFuY2VzdG9yc0Zyb21FbGVtZW50cygpIHtcclxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0RGlyZWN0aXZlcygpLmZvckVhY2gocyA9PiBzLnJlbW92ZUVtcHR5QW5jZXN0b3JzKHM/LnRlbXBUZW1wbGF0ZVBhcmVudE5vZGUpKVxyXG4gICAgLy8gfSwgMCk7XHJcbiAgfVxyXG5cclxuICBnZXRQcmVzZW50YXRpb25TZXRpbmdEZXRhaWxVaWQoYmxvY2tOYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3Q/LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzPy5maW5kKHggPT4geC5ibG9ja05hbWUgPT0gYmxvY2tOYW1lKT8udWlkXHJcbiAgfVxyXG5cclxuICBnZXRDb21wb25lbnRJZGVudGlmaWVyKCkge1xyXG4gICAgLy8gaWYgKHRoaXMuZGVzY3JpbWluYXRvclZhbHVlKSB7XHJcbiAgICAvLyAgIHJldHVybiBgJHt0aGlzLl9teU5hbWUoKX1fJHt0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZX1gXHJcbiAgICAvLyB9XHJcbiAgICByZXR1cm4gdGhpcy5fbXlOYW1lKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVByb3BlcnRpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5pbml0VHNpR3JpZHNSZWYoKVxyXG5cclxuICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCA9IHRoaXMuX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlLmdldFByZXNlbnRhdGlvblNldHRpbmdCeUNvbXBvbmVudElkZW50aWZpZXJTeW5jKHRoaXMuZ2V0Q29tcG9uZW50SWRlbnRpZmllcigpLCB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSkgPz8gbmV3IFByZXNlbnRhdGlvblNldHRpbmcoKVxyXG5cclxuICAgIGlmICghdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCA9IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM6IFByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxbXSA9IFtdXHJcblxyXG4gICAgdGhpcy5kaXJlY3RpdmVFbGVtZW50cz8uZm9yRWFjaCgoZGlyZWN0aXZlKSA9PiB7XHJcblxyXG4gICAgICBsZXQgY29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZFxyXG5cclxuXHJcbiAgICAgIGxldCBncmlkU3RhdGUgPSBbXHJcbiAgICAgICAgLi4udGhpcy52aWV3R3JpZHNDb21wb25lbnRzLFxyXG4gICAgICAgIC4uLnRoaXMuZ2VuZXJpY0dyaWRzQ29tcG9uZW50cyxcclxuICAgICAgICAuLi50aGlzLmdlbmVyaWNDcnVkc0NvbXBvbmVudHMsXHJcbiAgICAgICAgLi4udGhpcy5lZGl0YWJsZUdyaWRDb21wb25lbnRzXHJcbiAgICAgIF1cclxuICAgICAgICAuZmluZCh4ID0+IHguaWQgPT09IGRpcmVjdGl2ZS5wcmVzZW50YXRpb25EZXNpZ25lciB8fCAoJ2Zvcm1OYW1lJyBpbiB4ICYmIHguZm9ybU5hbWUgPT09IGRpcmVjdGl2ZS5wcmVzZW50YXRpb25EZXNpZ25lcikpXHJcbiAgICAgICAgPy5nZXRTdGF0ZSgpO1xyXG5cclxuICAgICAgY29uZmlndXJhdGlvbiA9IGdyaWRTdGF0ZSA/IEpTT04uc3RyaW5naWZ5KGdyaWRTdGF0ZSkgOiB1bmRlZmluZWQ7XHJcblxyXG5cclxuICAgICAgbGV0IG9iamVjdDogUHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCA9IHtcclxuICAgICAgICBibG9ja05hbWU6IGRpcmVjdGl2ZS5wcmVzZW50YXRpb25EZXNpZ25lcixcclxuICAgICAgICBpc0Jsb2NrVmlzaWJsZTogIWRpcmVjdGl2ZS5zaG93SGlkZUNoZWNrYm94Q29tcG9uZW50UmVmPy5pbnN0YW5jZT8uX2NoZWNrZWQsXHJcbiAgICAgICAgdWlkOiB0aGlzLmdldFByZXNlbnRhdGlvblNldGluZ0RldGFpbFVpZChkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIgPz8gXCJcIiksXHJcbiAgICAgICAgY29uZmlndXJhdGlvbjogY29uZmlndXJhdGlvblxyXG4gICAgICB9XHJcbiAgICAgIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLnB1c2gob2JqZWN0KVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QuY29tcG9uZW50SWRlbnRpZmVyID0gdGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCk7XHJcbiAgICB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QuZGVzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZXNjcmltaW5hdG9yVmFsdWVcclxuICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdC5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscyA9IHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzXHJcblxyXG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlXHJcblxyXG4gICAgaWYgKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdC51aWQgIT0gbnVsbCAmJiB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QudWlkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9wcmVzZW50YXRpb25TZXR0aW5nU2VydmljZS51cGRhdGVQcmVzZW50YXRpb25TZXR0aW5nKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCwgdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0LnVpZClcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0FmdGVyU2F2ZUNvbmZpZ3VyYXRpb24oKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyLnNob3dFcnJvck1lc3NhZ2UoZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fcHJlc2VudGF0aW9uU2V0dGluZ1NlcnZpY2UuY3JlYXRlUHJlc2VudGF0aW9uU2V0dGluZyh0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiBhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NBZnRlclNhdmVDb25maWd1cmF0aW9uKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgICAgICB0aGlzLl9lcnJvclJlc3BvbnNlTWFuYWdlci5zaG93RXJyb3JNZXNzYWdlKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1NpbmdsZUVsZW1lbnQoZGlyZWN0aXZlOiBQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSB8IFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSkge1xyXG4gICAgdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0ID0gdGhpcy5fcHJlc2VudGF0aW9uU2V0dGluZ1NlcnZpY2UuZ2V0UHJlc2VudGF0aW9uU2V0dGluZ0J5Q29tcG9uZW50SWRlbnRpZmllclN5bmModGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCksIHRoaXMuZGVzY3JpbWluYXRvclZhbHVlKSA/PyBuZXcgUHJlc2VudGF0aW9uU2V0dGluZygpXHJcbiAgICBsZXQgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCA9IHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdD8ucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM/LmZpbmQoeCA9PiB4LmJsb2NrTmFtZSA9PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpXHJcblxyXG5cclxuICAgIGlmIChwcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsID09IHVuZGVmaW5lZCB8fCBwcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsLmlzQmxvY2tWaXNpYmxlKSB7XHJcblxyXG4gICAgICBsZXQgd29yZmtmbG93RXRhdEZvcm0gPSB0aGlzLmdldFdvcmtmbG93RXRhdEZvcm0oKTtcclxuXHJcbiAgICAgIGlmICh3b3Jma2Zsb3dFdGF0Rm9ybSkge1xyXG4gICAgICAgIGxldCB3b3JrZmxvd0NvbmZpZyA9IHdvcmZrZmxvd0V0YXRGb3JtLnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLmZpbmQoeCA9PiB4LmJsb2NrTmFtZSA9PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpXHJcblxyXG4gICAgICAgIGlmICghd29ya2Zsb3dDb25maWcpIHtcclxuICAgICAgICAgIGRpcmVjdGl2ZS5leGVjdXRlKHRydWUsIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWw/LmNvbmZpZ3VyYXRpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmICh3b3JrZmxvd0NvbmZpZy5pc0lucHV0RW5hYmxlZCA9PSB1bmRlZmluZWQgfHwgd29ya2Zsb3dDb25maWcuaXNJbnB1dEVuYWJsZWQgPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgIGRpcmVjdGl2ZS5leGVjdXRlKHRydWUsIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWw/LmNvbmZpZ3VyYXRpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmIHdvcmtmbG93Q29uZmlnLmlzSW5wdXRFbmFibGVkID09IGZhbHNlKSB7XHJcbiAgICAgICAgICBkaXJlY3RpdmUuZGlzYWJsZUlucHV0cygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRpcmVjdGl2ZS5leGVjdXRlKHRydWUsIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWw/LmNvbmZpZ3VyYXRpb24pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICAgIGRpcmVjdGl2ZS5hZGRDaGVja2JveGVzVG9JbnB1dHModGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS53b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uKVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRnJvbUFjdGl2ZVN1YnNjcml0cGlvbigpIHtcclxuICAgIGlmICh0aGlzLl9kZXNpZ25Nb2RlRm9ybVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLl9kZXNpZ25Nb2RlRm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3NhdmVXb3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuX3NhdmVXb3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb24pIHtcclxuICAgICAgdGhpcy5fYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hZGRlZERpcmVjdGl2ZUJhc2VTdWJzY3JpdHBpb24pIHtcclxuICAgICAgdGhpcy5fYWRkZWREaXJlY3RpdmVCYXNlU3Vic2NyaXRwaW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVRzaU1vZGFsRm9vdGVyKCkge1xyXG4gICAgY29uc3QgdHNpTW9kYWxGb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidHNpLW1vZGFsLWZvb3RlclwiKVxyXG5cclxuICAgIGlmICh0c2lNb2RhbEZvb3RlciAmJiB0c2lNb2RhbEZvb3Rlci5sYXN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXI/LnJlbW92ZUNoaWxkKHRzaU1vZGFsRm9vdGVyLCB0c2lNb2RhbEZvb3Rlci5sYXN0Q2hpbGQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTYXZlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgdHNpQnV0dG9uUmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZj8uY3JlYXRlQ29tcG9uZW50KFRzaUJ1dHRvbkNvbXBvbmVudCk7XHJcbiAgICB0c2lCdXR0b25SZWY/LnNldElucHV0KCd0ZXh0JywgJ3NoYXJlZF90c2lfY29tcG9uZW50X3NhdmVfY29uZmlnX3Nob3dfaGlkZScpO1xyXG4gICAgdHNpQnV0dG9uUmVmPy5zZXRJbnB1dCgnaWNvbicsICdzYXZlJyk7XHJcblxyXG4gICAgdHNpQnV0dG9uUmVmIS5pbnN0YW5jZS5vbkNsaWNrLmVtaXQgPSAoKSA9PiB0aGlzLnNhdmVQcm9wZXJ0aWVzKCk7XHJcblxyXG4gICAgY29uc3QgdHNpRm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0c2ktZm9ybVwiKVxyXG5cclxuICAgIGlmICh0c2lGb3JtKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyPy5hcHBlbmRDaGlsZCh0c2lGb3JtLCB0c2lCdXR0b25SZWY/LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcHJvY2Vzc0FmdGVyU2F2ZUNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlXHJcbiAgICB0aGlzLmhpZGUoKVxyXG4gICAgdGhpcy5fbWVzc2FnZUluZm9TZXJ2aWNlLnN1Y2Nlc3MoTG9jYWxpemF0aW9uS2V5cy5zYXZlZFN1Y2Nlc3NmdWxseSlcclxuICAgIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuaXNEZXNpZ25Nb2RlID0gZmFsc2VcclxuICAgIC8vIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuY3VycmVudEZvcm1OYW1lID0gdW5kZWZpbmVkXHJcbiAgICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLl9kZXNpZ25Nb2RlRm9ybVN1YmplY3QubmV4dChmYWxzZSlcclxuICAgIGF3YWl0IHRoaXMuX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlLmxvYWRQcmVzZW50YXRpb25TZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnJlcXVpcmVkSW5wdXRzID0gdGhpcy5faW5wdXRSZWdpc3RyeS5nZXRBbGwoKS5maWx0ZXIoaW5wID0+IGlucC5pc1JlcXVpcmVkICYmIGlucC5kaXNhYmxlZCA9PT0gZmFsc2UpO1xyXG4gICAgdGhpcy5mYXVsdHlJbnB1dHMgPSBbXTtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSB0aGlzLnJlcXVpcmVkSW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0LmlzVmFsaWQoKS5pc1ZhbGlkID09PSB0cnVlKVxyXG5cclxuICAgIHRoaXMucmVxdWlyZWRJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XHJcbiAgICAgIGxldCBmdnIgPSBpbnB1dC5pc1ZhbGlkKCk7XHJcbiAgICAgIGlmIChmdnIuaXNWYWxpZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLmZhdWx0eUlucHV0cy5wdXNoKGZ2cilcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAodGhpcy5pc0Zvcm1WYWxpZCA9PT0gZmFsc2UgJiYgdGhpcy5mYXVsdHlJbnB1dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZhdWx0eUlucHV0cylcclxuICAgICAgbGV0IGZhdWx0eUlucHV0c05hbWVzID0gXCJcIjtcclxuICAgICAgdGhpcy5mYXVsdHlJbnB1dHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuZmF1bHR5SW5wdXRzLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICBmYXVsdHlJbnB1dHNOYW1lcyArPSBgJHtpdGVtLmlucHV0TmFtZX0uIGBcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBmYXVsdHlJbnB1dHNOYW1lcyArPSBgJHtpdGVtLmlucHV0TmFtZX0sIGBcclxuICAgICAgfSlcclxuICAgICAgZmF1bHR5SW5wdXRzTmFtZXMgPSBmYXVsdHlJbnB1dHNOYW1lcy5yZXBsYWNlKC8sJC8sICcnKTtcclxuICAgICAgaWYgKHRoaXMuZmF1bHR5SW5wdXRzLnNvbWUoZmkgPT4gZmkuZXJyb3IgPT09IEZvcm1WYWxpZGF0aW9uRXJyb3IuUmVxdWlyZWQpKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUluZm9TZXJ2aWNlLndhcm4oZmF1bHR5SW5wdXRzTmFtZXMsIHRoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fcmVxdWlyZWRfZmllbGRfdGl0bGUnKSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExlcyBjaGFtcHMgJHtmYXVsdHlJbnB1dHNOYW1lc30gc29udCBvYmxpZ2F0b2lyZS5gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmZhdWx0eUlucHV0cy5zb21lKGZpID0+IGZpLmVycm9yID09PSBGb3JtVmFsaWRhdGlvbkVycm9yLk1heExlbmd0aCkpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlSW5mb1NlcnZpY2Uud2FybihgXHJcbiAgICAgICAgICAke3RoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fdGhlX2ZpZWxkJyl9XHJcbiAgICAgICAgICAke3RoaXMuZmF1bHR5SW5wdXRzWzBdLmlucHV0TmFtZX0gXHJcbiAgICAgICAgICAke3RoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aCcpfVxyXG4gICAgICAgICAgJHt0aGlzLmZhdWx0eUlucHV0c1swXS5kYXRhfSAke3RoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aF9jaGFycycpfWAsXHJcbiAgICAgICAgICB0aGlzLmxvY2FsaXplPy50cmFuc2Zvcm0oJ3RzaV9mb3JtX2Jhc2VfYXV0b192YWxpZGF0aW9uX21heF9sZW5ndGhfZmllbGRfdGl0bGUnKSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExlIGNoYW1wICR7dGhpcy5mYXVsdHlJbnB1dHNbMF0uaW5wdXROYW1lfSBuZSBkb2l0IHBhcyBkw6lwYXNzZXIgJHt0aGlzLmZhdWx0eUlucHV0c1swXS5kYXRhfSBjYXJhY3TDqHJlcy5gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmZhdWx0eUlucHV0cy5zb21lKGZpID0+IGZpLmVycm9yID09PSBGb3JtVmFsaWRhdGlvbkVycm9yLk91dE9mUmFuZ2UpKSB7XHJcbiAgICAgICAgLy90byBkb1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGUgY2hhbXAgJHt0aGlzLmZhdWx0eUlucHV0c1swXS5pbnB1dE5hbWV9IGRvaXQgw6p0cmUgZGFucyBsJ2ludGVydmFsbGUuYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuIiwiPHA+dHNpLWZvcm0tYmFzZSB3b3JrcyE8L3A+XHJcbiJdfQ==
|