@sumaris-net/ngx-components 2.18.0-beta8 → 2.21.0-rc1
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/README.md +3 -0
- package/doc/build.md +14 -14
- package/doc/changelog.md +1386 -88
- package/doc/feed/feed-en.json +26 -0
- package/doc/feed/feed-fr.json +28 -0
- package/fesm2022/sumaris-net.ngx-components.mjs +32441 -22724
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +42 -39
- package/src/assets/environments/environment-test.json +2 -2
- package/src/assets/i18n/en-US.json +143 -45
- package/src/assets/i18n/en.json +142 -43
- package/src/assets/i18n/fr.json +147 -47
- package/src/assets/manifest.json +1 -1
- package/src/theme/_icons.scss +8 -12
- package/src/theme/_ionic.globals.scss +8 -1
- package/src/theme/_markdown.scss +1 -1
- package/src/theme/_material.globals.scss +4 -1
- package/src/theme/_material.scss +60 -17
- package/src/theme/_mixins.scss +39 -4
- package/src/theme/_ngx-components.forms.scss +115 -89
- package/src/theme/_ngx-components.globals.scss +4 -1
- package/src/theme/_ngx-components.scss +162 -110
- package/src/theme/_ngx-components.table.scss +105 -44
- package/src/theme/_ngx-components.tabs.scss +46 -14
- package/src/theme/_responsive.scss +15 -0
- package/src/theme/_roboto.scss +3 -0
- package/src/theme/_theme.scss +11 -14
- package/src/theme/_theme.variables.scss +7 -3
- package/src/theme/ionic/ionic.functions.color.scss +13 -5
- package/src/theme/ionic/ionic.globals.scss +4 -4
- package/src/theme/ionic/ionic.theme.default.scss +2 -0
- package/types/sumaris-net.ngx-components.d.ts +14132 -0
- package/esm2022/public_api.mjs +0 -358
- package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
- package/esm2022/src/app/admin/admin.module.mjs +0 -32
- package/esm2022/src/app/admin/services/filter/person.filter.mjs +0 -69
- package/esm2022/src/app/admin/services/person.service.mjs +0 -174
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +0 -72
- package/esm2022/src/app/admin/users/users.mjs +0 -267
- package/esm2022/src/app/admin/users/users.module.mjs +0 -56
- package/esm2022/src/app/core/about/about.modal.mjs +0 -84
- package/esm2022/src/app/core/about/about.module.mjs +0 -21
- package/esm2022/src/app/core/account/account.module.mjs +0 -68
- package/esm2022/src/app/core/account/account.page.mjs +0 -351
- package/esm2022/src/app/core/account/new-token.modal.mjs +0 -132
- package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -60
- package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
- package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -144
- package/esm2022/src/app/core/account/token.table.mjs +0 -152
- package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
- package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
- package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
- package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -77
- package/esm2022/src/app/core/core.module.mjs +0 -151
- package/esm2022/src/app/core/core.testing.module.mjs +0 -107
- package/esm2022/src/app/core/form/array/form-array.mjs +0 -325
- package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
- package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -94
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -108
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
- package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -265
- package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -731
- package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -24
- package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -32
- package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -194
- package/esm2022/src/app/core/form/form-container.class.mjs +0 -327
- package/esm2022/src/app/core/form/form.class.mjs +0 -336
- package/esm2022/src/app/core/form/form.module.mjs +0 -70
- package/esm2022/src/app/core/form/form.utils.mjs +0 -197
- package/esm2022/src/app/core/form/list/list.form.mjs +0 -235
- package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
- package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -225
- package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -37
- package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -268
- package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -60
- package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -38
- package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -95
- package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -30
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -152
- package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -31
- package/esm2022/src/app/core/form/username/username.form.mjs +0 -52
- package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
- package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
- package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -783
- package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
- package/esm2022/src/app/core/home/home.mjs +0 -311
- package/esm2022/src/app/core/home/home.module.mjs +0 -42
- package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
- package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
- package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -354
- package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
- package/esm2022/src/app/core/menu/menu.component.mjs +0 -263
- package/esm2022/src/app/core/menu/menu.model.mjs +0 -272
- package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
- package/esm2022/src/app/core/menu/menu.service.mjs +0 -655
- package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -109
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -49
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -157
- package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
- package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
- package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
- package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -203
- package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -30
- package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
- package/esm2022/src/app/core/register/register.form.mjs +0 -194
- package/esm2022/src/app/core/register/register.modal.mjs +0 -55
- package/esm2022/src/app/core/register/register.module.mjs +0 -23
- package/esm2022/src/app/core/services/account.service.mjs +0 -1346
- package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
- package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -473
- package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -230
- package/esm2022/src/app/core/services/base58.mjs +0 -83
- package/esm2022/src/app/core/services/config/core.config.mjs +0 -233
- package/esm2022/src/app/core/services/config.service.mjs +0 -384
- package/esm2022/src/app/core/services/crypto.service.mjs +0 -107
- package/esm2022/src/app/core/services/errors.mjs +0 -52
- package/esm2022/src/app/core/services/local-settings.service.mjs +0 -482
- package/esm2022/src/app/core/services/model/account.model.mjs +0 -150
- package/esm2022/src/app/core/services/model/config.model.mjs +0 -107
- package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
- package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
- package/esm2022/src/app/core/services/model/entity.model.mjs +0 -224
- package/esm2022/src/app/core/services/model/filter.model.mjs +0 -93
- package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
- package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
- package/esm2022/src/app/core/services/model/peer.model.mjs +0 -93
- package/esm2022/src/app/core/services/model/person.model.mjs +0 -114
- package/esm2022/src/app/core/services/model/referential.model.mjs +0 -202
- package/esm2022/src/app/core/services/model/settings.model.mjs +0 -4
- package/esm2022/src/app/core/services/model/token.model.mjs +0 -56
- package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -195
- package/esm2022/src/app/core/services/network.service.mjs +0 -631
- package/esm2022/src/app/core/services/network.types.mjs +0 -20
- package/esm2022/src/app/core/services/network.utils.mjs +0 -15
- package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
- package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
- package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
- package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -54
- package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -21
- package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
- package/esm2022/src/app/core/services/platform.service.mjs +0 -583
- package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
- package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -449
- package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
- package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
- package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -45
- package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
- package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -81
- package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
- package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
- package/esm2022/src/app/core/settings/settings.module.mjs +0 -22
- package/esm2022/src/app/core/settings/settings.page.mjs +0 -341
- package/esm2022/src/app/core/table/async-table.class.mjs +0 -1753
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -127
- package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -117
- package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -401
- package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
- package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
- package/esm2022/src/app/core/table/table.class.mjs +0 -1816
- package/esm2022/src/app/core/table/table.model.mjs +0 -16
- package/esm2022/src/app/core/table/table.module.mjs +0 -51
- package/esm2022/src/app/core/table/table.pipes.mjs +0 -77
- package/esm2022/src/app/core/table/table.utils.mjs +0 -31
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
- package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -329
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -25
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -273
- package/esm2022/src/app/shared/alerts.mjs +0 -243
- package/esm2022/src/app/shared/audio/audio.mjs +0 -249
- package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
- package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
- package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -9
- package/esm2022/src/app/shared/constants.mjs +0 -16
- package/esm2022/src/app/shared/dates.mjs +0 -151
- package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
- package/esm2022/src/app/shared/debug/debug.component.mjs +0 -40
- package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
- package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
- package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -32
- package/esm2022/src/app/shared/directives/directives.module.mjs +0 -22
- package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
- package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
- package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
- package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -45
- package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
- package/esm2022/src/app/shared/events.mjs +0 -63
- package/esm2022/src/app/shared/file/csv.utils.mjs +0 -92
- package/esm2022/src/app/shared/file/file.service.mjs +0 -118
- package/esm2022/src/app/shared/file/file.utils.mjs +0 -115
- package/esm2022/src/app/shared/file/images.utils.mjs +0 -186
- package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
- package/esm2022/src/app/shared/file/uri.utils.mjs +0 -24
- package/esm2022/src/app/shared/focusable.mjs +0 -6
- package/esm2022/src/app/shared/form/field.component.mjs +0 -379
- package/esm2022/src/app/shared/form/field.model.mjs +0 -25
- package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
- package/esm2022/src/app/shared/forms.mjs +0 -459
- package/esm2022/src/app/shared/functions.mjs +0 -551
- package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -82
- package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
- package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
- package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -60
- package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -213
- package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -59
- package/esm2022/src/app/shared/help/help.modal.mjs +0 -63
- package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
- package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -112
- package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
- package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -388
- package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
- package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
- package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -87
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
- package/esm2022/src/app/shared/image/image.model.mjs +0 -2
- package/esm2022/src/app/shared/image/image.module.mjs +0 -24
- package/esm2022/src/app/shared/image/image.service.mjs +0 -106
- package/esm2022/src/app/shared/inputs.mjs +0 -263
- package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
- package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
- package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
- package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
- package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
- package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1071
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -79
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
- package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -231
- package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
- package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
- package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
- package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -71
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -376
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -61
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -75
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -779
- package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -147
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -76
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -471
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -681
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -136
- package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
- package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
- package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -65
- package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -33
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -274
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -80
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -313
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -381
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -118
- package/esm2022/src/app/shared/material/material.animations.mjs +0 -143
- package/esm2022/src/app/shared/material/material.config.mjs +0 -3
- package/esm2022/src/app/shared/material/material.module.mjs +0 -229
- package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -234
- package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
- package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
- package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -375
- package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
- package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
- package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
- package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +0 -42
- package/esm2022/src/app/shared/material/text/text-form.component.mjs +0 -204
- package/esm2022/src/app/shared/material/text/text-form.module.mjs +0 -63
- package/esm2022/src/app/shared/modules.mjs +0 -12
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -303
- package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
- package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
- package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
- package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
- package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
- package/esm2022/src/app/shared/observables.mjs +0 -100
- package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -156
- package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -24
- package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
- package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -49
- package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
- package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
- package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -36
- package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
- package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -219
- package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -48
- package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -52
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
- package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -63
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
- package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -59
- package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
- package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -30
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -236
- package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -136
- package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -180
- package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -136
- package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
- package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
- package/esm2022/src/app/shared/platforms.mjs +0 -45
- package/esm2022/src/app/shared/rx-state.module.mjs +0 -19
- package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -7
- package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
- package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -349
- package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
- package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -118
- package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -107
- package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
- package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
- package/esm2022/src/app/shared/services.mjs +0 -62
- package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
- package/esm2022/src/app/shared/shared.module.mjs +0 -234
- package/esm2022/src/app/shared/shared.testing.module.mjs +0 -100
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -279
- package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
- package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
- package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
- package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
- package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
- package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
- package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
- package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
- package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -52
- package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/toast/toasts.mjs +0 -144
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -263
- package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
- package/esm2022/src/app/shared/types.mjs +0 -2
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -106
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -213
- package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
- package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -114
- package/esm2022/src/app/shared/validator/validators.mjs +0 -601
- package/esm2022/src/app/shared/version/versions.mjs +0 -81
- package/esm2022/src/app/social/job/job.module.mjs +0 -23
- package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -35
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -235
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -47
- package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
- package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
- package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
- package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
- package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
- package/esm2022/src/app/social/message/message.form.mjs +0 -140
- package/esm2022/src/app/social/message/message.modal.mjs +0 -110
- package/esm2022/src/app/social/message/message.model.mjs +0 -75
- package/esm2022/src/app/social/message/message.module.mjs +0 -22
- package/esm2022/src/app/social/message/message.service.mjs +0 -110
- package/esm2022/src/app/social/social.errors.mjs +0 -10
- package/esm2022/src/app/social/social.module.mjs +0 -22
- package/esm2022/src/app/social/social.testing.module.mjs +0 -40
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -127
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -260
- package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -257
- package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
- package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
- package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
- package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
- package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -23
- package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -509
- package/esm2022/src/environments/environment.class.mjs +0 -57
- package/esm2022/src/environments/environment.loader.mjs +0 -77
- package/esm2022/src/environments/environment.mjs +0 -105
- package/esm2022/sumaris-net.ngx-components.mjs +0 -5
- package/index.d.ts +0 -5
- package/public_api.d.ts +0 -322
- package/src/app/admin/admin-routing.module.d.ts +0 -9
- package/src/app/admin/admin.module.d.ts +0 -10
- package/src/app/admin/services/filter/person.filter.d.ts +0 -21
- package/src/app/admin/services/person.service.d.ts +0 -49
- package/src/app/admin/services/validator/person.validator.d.ts +0 -23
- package/src/app/admin/users/users.d.ts +0 -45
- package/src/app/admin/users/users.module.d.ts +0 -14
- package/src/app/core/about/about.modal.d.ts +0 -32
- package/src/app/core/about/about.module.d.ts +0 -10
- package/src/app/core/account/account.module.d.ts +0 -16
- package/src/app/core/account/account.page.d.ts +0 -80
- package/src/app/core/account/new-token.modal.d.ts +0 -41
- package/src/app/core/account/password/change-password.form.d.ts +0 -19
- package/src/app/core/account/password/change-password.module.d.ts +0 -11
- package/src/app/core/account/password/change-password.page.d.ts +0 -36
- package/src/app/core/account/token.table.d.ts +0 -27
- package/src/app/core/auth/auth.form.d.ts +0 -38
- package/src/app/core/auth/auth.modal.d.ts +0 -24
- package/src/app/core/auth/auth.module.d.ts +0 -13
- package/src/app/core/auth/reset-password.modal.d.ts +0 -26
- package/src/app/core/core.module.d.ts +0 -28
- package/src/app/core/core.testing.module.d.ts +0 -15
- package/src/app/core/form/array/form-array.d.ts +0 -136
- package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
- package/src/app/core/form/array/testing/form-array.test.d.ts +0 -26
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -37
- package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
- package/src/app/core/form/entity/editor.class.d.ts +0 -83
- package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
- package/src/app/core/form/entity/entity-editor.class.d.ts +0 -204
- package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
- package/src/app/core/form/entity/entity.module.d.ts +0 -10
- package/src/app/core/form/entity/tab-editor.class.d.ts +0 -70
- package/src/app/core/form/form-container.class.d.ts +0 -126
- package/src/app/core/form/form.class.d.ts +0 -144
- package/src/app/core/form/form.module.d.ts +0 -14
- package/src/app/core/form/form.utils.d.ts +0 -251
- package/src/app/core/form/list/list.form.d.ts +0 -81
- package/src/app/core/form/list/list.module.d.ts +0 -9
- package/src/app/core/form/properties/properties.form.d.ts +0 -66
- package/src/app/core/form/properties/properties.module.d.ts +0 -11
- package/src/app/core/form/properties/properties.table.d.ts +0 -78
- package/src/app/core/form/properties/properties.utils.d.ts +0 -27
- package/src/app/core/form/properties/property.validator.d.ts +0 -19
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -19
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
- package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
- package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
- package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -71
- package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -9
- package/src/app/core/form/username/username.form.d.ts +0 -19
- package/src/app/core/form/username/username.module.d.ts +0 -9
- package/src/app/core/graphql/graphql.module.d.ts +0 -7
- package/src/app/core/graphql/graphql.service.d.ts +0 -147
- package/src/app/core/graphql/graphql.utils.d.ts +0 -42
- package/src/app/core/home/home.d.ts +0 -94
- package/src/app/core/home/home.module.d.ts +0 -13
- package/src/app/core/icon/icon.component.d.ts +0 -13
- package/src/app/core/icon/icon.module.d.ts +0 -9
- package/src/app/core/install/install-upgrade-card.component.d.ts +0 -64
- package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
- package/src/app/core/menu/menu.component.d.ts +0 -69
- package/src/app/core/menu/menu.model.d.ts +0 -144
- package/src/app/core/menu/menu.module.d.ts +0 -12
- package/src/app/core/menu/menu.service.d.ts +0 -94
- package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
- package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
- package/src/app/core/menu/testing/menu.testing.d.ts +0 -51
- package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
- package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
- package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
- package/src/app/core/peer/select-peer.modal.d.ts +0 -60
- package/src/app/core/peer/select-peer.module.d.ts +0 -10
- package/src/app/core/register/register-confirm.page.d.ts +0 -24
- package/src/app/core/register/register.form.d.ts +0 -49
- package/src/app/core/register/register.modal.d.ts +0 -14
- package/src/app/core/register/register.module.d.ts +0 -12
- package/src/app/core/services/account.service.d.ts +0 -205
- package/src/app/core/services/auth-guard.service.d.ts +0 -17
- package/src/app/core/services/base-entity-service.class.d.ts +0 -123
- package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
- package/src/app/core/services/base58.d.ts +0 -7
- package/src/app/core/services/config/core.config.d.ts +0 -41
- package/src/app/core/services/config.service.d.ts +0 -63
- package/src/app/core/services/crypto.service.d.ts +0 -44
- package/src/app/core/services/errors.d.ts +0 -63
- package/src/app/core/services/local-settings.service.d.ts +0 -95
- package/src/app/core/services/model/account.model.d.ts +0 -41
- package/src/app/core/services/model/config.model.d.ts +0 -36
- package/src/app/core/services/model/department.model.d.ts +0 -11
- package/src/app/core/services/model/entity.decorators.d.ts +0 -17
- package/src/app/core/services/model/entity.model.d.ts +0 -87
- package/src/app/core/services/model/filter.model.d.ts +0 -37
- package/src/app/core/services/model/history.model.d.ts +0 -20
- package/src/app/core/services/model/model.enum.d.ts +0 -7
- package/src/app/core/services/model/peer.model.d.ts +0 -30
- package/src/app/core/services/model/person.model.d.ts +0 -37
- package/src/app/core/services/model/referential.model.d.ts +0 -83
- package/src/app/core/services/model/settings.model.d.ts +0 -28
- package/src/app/core/services/model/token.model.d.ts +0 -22
- package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -53
- package/src/app/core/services/network.service.d.ts +0 -151
- package/src/app/core/services/network.types.d.ts +0 -5
- package/src/app/core/services/network.utils.d.ts +0 -31
- package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
- package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
- package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
- package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
- package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -13
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
- package/src/app/core/services/platform.service.d.ts +0 -100
- package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
- package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
- package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
- package/src/app/core/services/testing/referential.validator.d.ts +0 -22
- package/src/app/core/services/validator/account.validator.d.ts +0 -24
- package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
- package/src/app/core/services/validator/local-settings.validator.d.ts +0 -22
- package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
- package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
- package/src/app/core/settings/settings.module.d.ts +0 -11
- package/src/app/core/settings/settings.page.d.ts +0 -81
- package/src/app/core/table/async-table.class.d.ts +0 -389
- package/src/app/core/table/column/actions-column.component.d.ts +0 -59
- package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -46
- package/src/app/core/table/column/row-field.component.d.ts +0 -40
- package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -81
- package/src/app/core/table/entities-table-datasource.class.d.ts +0 -95
- package/src/app/core/table/memory-table.class.d.ts +0 -25
- package/src/app/core/table/table-select-columns.component.d.ts +0 -22
- package/src/app/core/table/table.class.d.ts +0 -394
- package/src/app/core/table/table.model.d.ts +0 -26
- package/src/app/core/table/table.module.d.ts +0 -14
- package/src/app/core/table/table.pipes.d.ts +0 -28
- package/src/app/core/table/table.utils.d.ts +0 -11
- package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
- package/src/app/core/table/testing/table.testing.d.ts +0 -54
- package/src/app/core/table/testing/table.testing.module.d.ts +0 -14
- package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
- package/src/app/core/table/testing/table2.testing.d.ts +0 -48
- package/src/app/shared/alerts.d.ts +0 -55
- package/src/app/shared/audio/audio.d.ts +0 -44
- package/src/app/shared/audio/audio.testing.d.ts +0 -13
- package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
- package/src/app/shared/capacitor/keyboard.d.ts +0 -16
- package/src/app/shared/capacitor/plugins.d.ts +0 -7
- package/src/app/shared/constants.d.ts +0 -13
- package/src/app/shared/dates.d.ts +0 -48
- package/src/app/shared/debug/debug-service.class.d.ts +0 -5
- package/src/app/shared/debug/debug.component.d.ts +0 -13
- package/src/app/shared/debug/debug.module.d.ts +0 -12
- package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
- package/src/app/shared/directives/autotitle.directive.d.ts +0 -10
- package/src/app/shared/directives/directives.module.d.ts +0 -12
- package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
- package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
- package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
- package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -12
- package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
- package/src/app/shared/events.d.ts +0 -28
- package/src/app/shared/file/csv.utils.d.ts +0 -24
- package/src/app/shared/file/file.service.d.ts +0 -23
- package/src/app/shared/file/file.utils.d.ts +0 -20
- package/src/app/shared/file/images.utils.d.ts +0 -36
- package/src/app/shared/file/json.utils.d.ts +0 -19
- package/src/app/shared/file/uri.utils.d.ts +0 -8
- package/src/app/shared/focusable.d.ts +0 -4
- package/src/app/shared/form/field.component.d.ts +0 -74
- package/src/app/shared/form/field.model.d.ts +0 -39
- package/src/app/shared/form/loading-spinner.d.ts +0 -8
- package/src/app/shared/forms.d.ts +0 -103
- package/src/app/shared/functions.d.ts +0 -152
- package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -19
- package/src/app/shared/gesture/gesture-config.d.ts +0 -15
- package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
- package/src/app/shared/graph/colors.utils.d.ts +0 -17
- package/src/app/shared/graph/graph-colors.d.ts +0 -63
- package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
- package/src/app/shared/help/help.modal.d.ts +0 -33
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -42
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
- package/src/app/shared/http/http.utils.d.ts +0 -28
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -98
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
- package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
- package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
- package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
- package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
- package/src/app/shared/image/image.model.d.ts +0 -5
- package/src/app/shared/image/image.module.d.ts +0 -8
- package/src/app/shared/image/image.service.d.ts +0 -32
- package/src/app/shared/inputs.d.ts +0 -34
- package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
- package/src/app/shared/logging/log-level.model.d.ts +0 -38
- package/src/app/shared/logging/logger.model.d.ts +0 -68
- package/src/app/shared/logging/logging-service.class.d.ts +0 -39
- package/src/app/shared/logging/logging-service.config.d.ts +0 -25
- package/src/app/shared/logging/logging-service.module.d.ts +0 -9
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -55
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -180
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -22
- package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -46
- package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
- package/src/app/shared/material/badge/badge.module.d.ts +0 -10
- package/src/app/shared/material/badge/badge.test.d.ts +0 -21
- package/src/app/shared/material/boolean/boolean.module.d.ts +0 -21
- package/src/app/shared/material/boolean/material.boolean.d.ts +0 -93
- package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -22
- package/src/app/shared/material/chips/chips.module.d.ts +0 -22
- package/src/app/shared/material/chips/material.chips.d.ts +0 -150
- package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
- package/src/app/shared/material/datetime/datetime.module.d.ts +0 -24
- package/src/app/shared/material/datetime/material.date.d.ts +0 -90
- package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
- package/src/app/shared/material/datetime/material.datetime.d.ts +0 -121
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -37
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
- package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
- package/src/app/shared/material/duration/duration.module.d.ts +0 -19
- package/src/app/shared/material/duration/duration.utils.d.ts +0 -3
- package/src/app/shared/material/duration/material.duration.d.ts +0 -58
- package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -22
- package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -21
- package/src/app/shared/material/latlong/material.latlong.d.ts +0 -70
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -20
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -27
- package/src/app/shared/material/material.animations.d.ts +0 -6
- package/src/app/shared/material/material.config.d.ts +0 -3
- package/src/app/shared/material/material.module.d.ts +0 -45
- package/src/app/shared/material/material.testing.module.d.ts +0 -31
- package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
- package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
- package/src/app/shared/material/swipe/material.swipe.d.ts +0 -90
- package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
- package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
- package/src/app/shared/material/testing/common.test.d.ts +0 -25
- package/src/app/shared/material/text/testing/text-form.testing.d.ts +0 -19
- package/src/app/shared/material/text/text-form.component.d.ts +0 -66
- package/src/app/shared/material/text/text-form.module.d.ts +0 -16
- package/src/app/shared/modules.d.ts +0 -9
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -60
- package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
- package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
- package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
- package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
- package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
- package/src/app/shared/observables.d.ts +0 -30
- package/src/app/shared/pipes/arrays.pipe.d.ts +0 -59
- package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
- package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
- package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -23
- package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -12
- package/src/app/shared/pipes/duration.pipe.d.ts +0 -13
- package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
- package/src/app/shared/pipes/form.pipes.d.ts +0 -69
- package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
- package/src/app/shared/pipes/html.pipes.d.ts +0 -15
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
- package/src/app/shared/pipes/maps.pipe.d.ts +0 -22
- package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
- package/src/app/shared/pipes/math.pipes.d.ts +0 -20
- package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
- package/src/app/shared/pipes/number-format.pipe.d.ts +0 -10
- package/src/app/shared/pipes/pipes.module.d.ts +0 -31
- package/src/app/shared/pipes/property.pipes.d.ts +0 -47
- package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
- package/src/app/shared/pipes/string.pipes.d.ts +0 -53
- package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
- package/src/app/shared/pipes/types.pipes.d.ts +0 -30
- package/src/app/shared/platforms.d.ts +0 -8
- package/src/app/shared/rx-state.module.d.ts +0 -10
- package/src/app/shared/services/entity-service.class.d.ts +0 -71
- package/src/app/shared/services/job.utils.d.ts +0 -20
- package/src/app/shared/services/memory-entity-service.class.d.ts +0 -78
- package/src/app/shared/services/progress-bar.service.d.ts +0 -20
- package/src/app/shared/services/startable-observable-service.class.d.ts +0 -36
- package/src/app/shared/services/startable-service.class.d.ts +0 -37
- package/src/app/shared/services/translate-context.service.d.ts +0 -29
- package/src/app/shared/services/validator-service.class.d.ts +0 -11
- package/src/app/shared/services.d.ts +0 -10
- package/src/app/shared/shared-routing.module.d.ts +0 -23
- package/src/app/shared/shared.module.d.ts +0 -34
- package/src/app/shared/shared.testing.module.d.ts +0 -19
- package/src/app/shared/storage/storage-explorer.component.d.ts +0 -59
- package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
- package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
- package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
- package/src/app/shared/storage/storage.service.d.ts +0 -22
- package/src/app/shared/storage/storage.utils.d.ts +0 -19
- package/src/app/shared/testing/maskito.test.d.ts +0 -10
- package/src/app/shared/testing/observable.test.d.ts +0 -25
- package/src/app/shared/testing/tests.page.d.ts +0 -20
- package/src/app/shared/toast/toast.testing.d.ts +0 -15
- package/src/app/shared/toast/toast.testing.module.d.ts +0 -11
- package/src/app/shared/toast/toasts.d.ts +0 -17
- package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
- package/src/app/shared/toolbar/toolbar.d.ts +0 -68
- package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
- package/src/app/shared/types.d.ts +0 -31
- package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
- package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -39
- package/src/app/shared/upload-file/upload-file.component.d.ts +0 -49
- package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
- package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
- package/src/app/shared/validator/validators.d.ts +0 -130
- package/src/app/shared/version/versions.d.ts +0 -26
- package/src/app/social/job/job.module.d.ts +0 -12
- package/src/app/social/job/progression/job-progression.component.d.ts +0 -23
- package/src/app/social/job/progression/job-progression.icon.d.ts +0 -62
- package/src/app/social/job/progression/job-progression.list.d.ts +0 -19
- package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
- package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
- package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
- package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
- package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
- package/src/app/social/message/message.form.d.ts +0 -36
- package/src/app/social/message/message.modal.d.ts +0 -43
- package/src/app/social/message/message.model.d.ts +0 -33
- package/src/app/social/message/message.module.d.ts +0 -12
- package/src/app/social/message/message.service.d.ts +0 -32
- package/src/app/social/social.errors.d.ts +0 -9
- package/src/app/social/social.module.d.ts +0 -20
- package/src/app/social/social.testing.module.d.ts +0 -13
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -32
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -71
- package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -35
- package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
- package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -42
- package/src/app/social/user-event/user-event.model.d.ts +0 -44
- package/src/app/social/user-event/user-event.module.d.ts +0 -13
- package/src/app/social/user-event/user-event.service.d.ts +0 -129
- package/src/environments/environment.class.d.ts +0 -68
- package/src/environments/environment.d.ts +0 -2
- package/src/environments/environment.loader.d.ts +0 -24
- package/src/theme/_globals.scss +0 -5
|
@@ -1,655 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, combineLatest, from, merge, mergeMap, Subject } from 'rxjs';
|
|
3
|
-
import { MenuItem, MenuItems } from './menu.model';
|
|
4
|
-
import { NavigationEnd } from '@angular/router';
|
|
5
|
-
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
6
|
-
import { DateUtils } from '../../shared/dates';
|
|
7
|
-
import { distinctUntilChanged, filter, map, throttleTime } from 'rxjs/operators';
|
|
8
|
-
import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
|
|
9
|
-
import { isEmptyArray, isNil, isNotEmptyArray, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
|
|
10
|
-
import { StartableObservableService } from '../../shared/services/startable-observable-service.class';
|
|
11
|
-
import { firstNotNilPromise } from '../../shared/observables';
|
|
12
|
-
import { TreeItemEntityUtils } from '../services/model/tree-item-entity.model';
|
|
13
|
-
import { AboutModal } from '../about/about.modal';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "../services/local-settings.service";
|
|
16
|
-
import * as i2 from "../services/config.service";
|
|
17
|
-
import * as i3 from "../services/account.service";
|
|
18
|
-
import * as i4 from "@angular/router";
|
|
19
|
-
import * as i5 from "@ionic/angular";
|
|
20
|
-
import * as i6 from "@ngx-translate/core";
|
|
21
|
-
import * as i7 from "../../../environments/environment.class";
|
|
22
|
-
import * as i8 from "./menu.model";
|
|
23
|
-
export const DEFAULT_MENU_SHOW_WHEN = 'lg';
|
|
24
|
-
export const APP_MENU_ITEMS = new InjectionToken('menuItems');
|
|
25
|
-
export const APP_MENU_OPTIONS = new InjectionToken('menuOptions');
|
|
26
|
-
export class MenuService extends StartableObservableService {
|
|
27
|
-
settings;
|
|
28
|
-
configService;
|
|
29
|
-
accountService;
|
|
30
|
-
router;
|
|
31
|
-
modalCtrl;
|
|
32
|
-
alertController;
|
|
33
|
-
navController;
|
|
34
|
-
translate;
|
|
35
|
-
environment;
|
|
36
|
-
accountChanges = new BehaviorSubject(undefined);
|
|
37
|
-
onPinned = new EventEmitter(true);
|
|
38
|
-
_staticItems;
|
|
39
|
-
_detachedSubItems = [];
|
|
40
|
-
_itemCounter = 0;
|
|
41
|
-
_options;
|
|
42
|
-
_logPrefix = '[menu-service] ';
|
|
43
|
-
_$opened = new Subject();
|
|
44
|
-
_$splitPaneWhen = new BehaviorSubject(DEFAULT_MENU_SHOW_WHEN);
|
|
45
|
-
_$enabled = new BehaviorSubject(true);
|
|
46
|
-
_$enableSubMenu;
|
|
47
|
-
_$listenRoute = new BehaviorSubject(false);
|
|
48
|
-
constructor(settings, configService, accountService, router, modalCtrl, alertController, navController, translate, environment, options, staticItems) {
|
|
49
|
-
super(settings);
|
|
50
|
-
this.settings = settings;
|
|
51
|
-
this.configService = configService;
|
|
52
|
-
this.accountService = accountService;
|
|
53
|
-
this.router = router;
|
|
54
|
-
this.modalCtrl = modalCtrl;
|
|
55
|
-
this.alertController = alertController;
|
|
56
|
-
this.navController = navController;
|
|
57
|
-
this.translate = translate;
|
|
58
|
-
this.environment = environment;
|
|
59
|
-
this._options = {
|
|
60
|
-
...options,
|
|
61
|
-
subMenu: {
|
|
62
|
-
disableIcon: false,
|
|
63
|
-
savePinned: true,
|
|
64
|
-
...(options?.subMenu || {}),
|
|
65
|
-
// Force disable on mobile
|
|
66
|
-
enable: options?.subMenu?.enable !== false && !this.settings.mobile,
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
this._$enableSubMenu = new BehaviorSubject(this._options.subMenu.enable);
|
|
70
|
-
this._debug = !environment.production;
|
|
71
|
-
this._detachedSubItems = [];
|
|
72
|
-
this._staticItems = (staticItems || []).map((source) => {
|
|
73
|
-
const target = this.fromObject({ static: true, ...source }, { computeId: true, fillParent: true, fillDefaultFromParent: true });
|
|
74
|
-
const detachedItems = TreeItemEntityUtils.deleteRecursively(target, (item) => item.static !== true);
|
|
75
|
-
if (detachedItems?.length) {
|
|
76
|
-
console.debug(this._logPrefix + 'Detached init items', detachedItems);
|
|
77
|
-
detachedItems.forEach((item) => this._detachToParent(item));
|
|
78
|
-
this._detachedSubItems.push(...detachedItems);
|
|
79
|
-
}
|
|
80
|
-
return target;
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
get opened() {
|
|
84
|
-
return this._$opened.asObservable();
|
|
85
|
-
}
|
|
86
|
-
get splitPaneWhen() {
|
|
87
|
-
return this._$splitPaneWhen.asObservable();
|
|
88
|
-
}
|
|
89
|
-
get enabled() {
|
|
90
|
-
return this._$enabled.asObservable();
|
|
91
|
-
}
|
|
92
|
-
get subMenuEnabled() {
|
|
93
|
-
return this._$enableSubMenu.value;
|
|
94
|
-
}
|
|
95
|
-
get subItems() {
|
|
96
|
-
return (this.data || []).reduce((res, rootElement) => res.concat(rootElement.children), []);
|
|
97
|
-
}
|
|
98
|
-
get _staticSubItems() {
|
|
99
|
-
return (this._staticItems || []).reduce((res, rootElement) => res.concat(rootElement.children), []);
|
|
100
|
-
}
|
|
101
|
-
enable(value) {
|
|
102
|
-
this._$enabled.next(value);
|
|
103
|
-
}
|
|
104
|
-
enableSubMenu(value) {
|
|
105
|
-
this._$enableSubMenu.next(value);
|
|
106
|
-
}
|
|
107
|
-
setSplitPaneShowWhen(value) {
|
|
108
|
-
if (this._$splitPaneWhen.value !== value) {
|
|
109
|
-
this._$splitPaneWhen.next(value);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
toggleSplitPaneWhen() {
|
|
113
|
-
if (this._$splitPaneWhen.value !== false) {
|
|
114
|
-
this._$splitPaneWhen.next(false);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
this._$splitPaneWhen.next(DEFAULT_MENU_SHOW_WHEN);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
fromObject(source, opts) {
|
|
121
|
-
const target = MenuItem.fromObject(source, { withChildren: false });
|
|
122
|
-
// Compute id if need
|
|
123
|
-
if (opts?.computeId && isNil(target.id))
|
|
124
|
-
target.id = this._computeNewId();
|
|
125
|
-
// Remove icon if disabled
|
|
126
|
-
if (this._options.subMenu.disableIcon) {
|
|
127
|
-
Object.assign(target, { icon: undefined, matIcon: undefined, matSvgIcon: undefined });
|
|
128
|
-
}
|
|
129
|
-
// Recursive
|
|
130
|
-
target.children = (source.children || []).map((json) => this.fromObject(json, { ...opts, fillParent: false }));
|
|
131
|
-
// Fill parent (once, when the full tree is ready)
|
|
132
|
-
if (opts?.fillParent) {
|
|
133
|
-
TreeItemEntityUtils.treeFillParent(target);
|
|
134
|
-
// Fill defaults from the parent (once filled)
|
|
135
|
-
if (opts?.fillDefaultFromParent) {
|
|
136
|
-
TreeItemEntityUtils.visit(target, (item) => {
|
|
137
|
-
if (!item.parent)
|
|
138
|
-
return; // Skip if no parent
|
|
139
|
-
item.parentPath = item.parentPath || item.parent.path;
|
|
140
|
-
item.parentPathParams = item.parentPathParams || item.parent.pathParams;
|
|
141
|
-
item.static = toBoolean(item.static, item.parent.static);
|
|
142
|
-
// Compute path, from parent path + action
|
|
143
|
-
if (!item.path && !!item.action) {
|
|
144
|
-
item.path = item.parent.path;
|
|
145
|
-
item.pathParams = typeof item.action === 'string' ? { action: item.action } : { actionId: item.id.toString(), actionTitle: item.title };
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return target;
|
|
151
|
-
}
|
|
152
|
-
createSubMenu(source) {
|
|
153
|
-
if (!this.subMenuEnabled)
|
|
154
|
-
return null; // Skip if disabled
|
|
155
|
-
const target = this.fromObject(source);
|
|
156
|
-
// Check if exists
|
|
157
|
-
if (this.started) {
|
|
158
|
-
const existingItem = this._findExistingItem(target);
|
|
159
|
-
if (existingItem)
|
|
160
|
-
return existingItem;
|
|
161
|
-
}
|
|
162
|
-
// Create
|
|
163
|
-
if (isNil(target.id))
|
|
164
|
-
target.id = this._computeNewId();
|
|
165
|
-
return target;
|
|
166
|
-
}
|
|
167
|
-
async addSubMenuItems(sources, opts) {
|
|
168
|
-
if (!this.started)
|
|
169
|
-
await this.ready();
|
|
170
|
-
if (!this.subMenuEnabled)
|
|
171
|
-
return; // Skip
|
|
172
|
-
return sources.map((source) => this._addSubMenuItem(this.fromObject(source), opts));
|
|
173
|
-
}
|
|
174
|
-
async addSubMenuItem(item, opts) {
|
|
175
|
-
if (!this.started)
|
|
176
|
-
await this.ready();
|
|
177
|
-
if (!this.subMenuEnabled)
|
|
178
|
-
return; // Skip
|
|
179
|
-
return this._addSubMenuItem(this.fromObject(item), opts);
|
|
180
|
-
}
|
|
181
|
-
async removeSubMenuItems(items) {
|
|
182
|
-
if (!this.started)
|
|
183
|
-
await this.ready();
|
|
184
|
-
return (items || []).map((item) => this._removeSubMenuItem(this.fromObject(item)));
|
|
185
|
-
}
|
|
186
|
-
async removeSubMenuItem(item) {
|
|
187
|
-
if (!this.started)
|
|
188
|
-
await this.ready();
|
|
189
|
-
return this._removeSubMenuItem(this.fromObject(item));
|
|
190
|
-
}
|
|
191
|
-
togglePinned(source) {
|
|
192
|
-
const item = source instanceof MenuItem ? source : this._findExistingItem(this.fromObject(source));
|
|
193
|
-
// Skip if not found
|
|
194
|
-
if (!item) {
|
|
195
|
-
if (this._debug)
|
|
196
|
-
console.warn(this._logPrefix + `Sub menu {${source.path}} cannot be found - unable to toggle pinned!`);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
// Skip if static
|
|
200
|
-
if (item.static)
|
|
201
|
-
return;
|
|
202
|
-
// Unpinned
|
|
203
|
-
if (item.pinned) {
|
|
204
|
-
item.pinned = false;
|
|
205
|
-
if (!item.detached) {
|
|
206
|
-
this._detachedSubItems = [...this._detachedSubItems, ...this._detachSubMenuItems()];
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
// Pinned
|
|
210
|
-
else {
|
|
211
|
-
item.pinned = true;
|
|
212
|
-
}
|
|
213
|
-
this.onPinned.emit(item);
|
|
214
|
-
}
|
|
215
|
-
async executeAction(event, item) {
|
|
216
|
-
const action = item?.action;
|
|
217
|
-
if (!action)
|
|
218
|
-
return; // skip
|
|
219
|
-
if (typeof action === 'string') {
|
|
220
|
-
switch (action) {
|
|
221
|
-
case 'logout':
|
|
222
|
-
await this.logout();
|
|
223
|
-
break;
|
|
224
|
-
case 'about':
|
|
225
|
-
await this.openAboutModal();
|
|
226
|
-
break;
|
|
227
|
-
case 'expand':
|
|
228
|
-
await this.toggleExpandableItem(item);
|
|
229
|
-
if (item.path) {
|
|
230
|
-
await this.navController.navigateRoot(item.path, {
|
|
231
|
-
queryParams: item.pathParams,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
break;
|
|
235
|
-
default: {
|
|
236
|
-
if (item.path) {
|
|
237
|
-
await this.navController.navigateRoot(item.path, {
|
|
238
|
-
queryParams: item.pathParams,
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
throw new Error('Unknown action: ' + action);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
else if (typeof action === 'function') {
|
|
248
|
-
action(event);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
async logout() {
|
|
252
|
-
const translations = await this.translate.instant([
|
|
253
|
-
'AUTH.LOGOUT.CONFIRM_TITLE',
|
|
254
|
-
'AUTH.LOGOUT.CONFIRM_MESSAGE',
|
|
255
|
-
'COMMON.BTN_CANCEL',
|
|
256
|
-
'AUTH.LOGOUT.BTN_CONFIRM',
|
|
257
|
-
]);
|
|
258
|
-
const alert = await this.alertController.create({
|
|
259
|
-
header: translations['AUTH.LOGOUT.CONFIRM_TITLE'],
|
|
260
|
-
message: translations['AUTH.LOGOUT.CONFIRM_MESSAGE'],
|
|
261
|
-
buttons: [
|
|
262
|
-
{
|
|
263
|
-
text: translations['COMMON.BTN_CANCEL'],
|
|
264
|
-
role: 'cancel',
|
|
265
|
-
cssClass: 'secondary',
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
text: translations['AUTH.LOGOUT.BTN_CONFIRM'],
|
|
269
|
-
cssClass: 'ion-color-primary',
|
|
270
|
-
handler: () => {
|
|
271
|
-
this.accountService.logout();
|
|
272
|
-
// Back to home
|
|
273
|
-
setTimeout(() => this.navController.navigateRoot('/'), 100);
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
],
|
|
277
|
-
});
|
|
278
|
-
await alert.present();
|
|
279
|
-
}
|
|
280
|
-
async openAboutModal() {
|
|
281
|
-
const modal = await this.modalCtrl.create({ component: AboutModal });
|
|
282
|
-
return modal.present();
|
|
283
|
-
}
|
|
284
|
-
async toggleExpandableItem(item) {
|
|
285
|
-
if (!item.expanded) {
|
|
286
|
-
if (this._debug)
|
|
287
|
-
console.debug(this._logPrefix + 'Expand item', item);
|
|
288
|
-
item.matIcon = 'expand_less';
|
|
289
|
-
// Try to attach some item
|
|
290
|
-
this._detachedSubItems
|
|
291
|
-
.filter((childItem) => !!this._findParent(childItem, [item]))
|
|
292
|
-
.forEach((childItem) => this._attachMenuToParent(item, childItem));
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
item.matIcon = 'expand_more';
|
|
296
|
-
this._detachedSubItems = [...this._detachedSubItems, ...this._detachSubMenuItems({ path: '/', params: {} }, item.children)];
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
_markAsOpened() {
|
|
300
|
-
this._$opened.next(true);
|
|
301
|
-
}
|
|
302
|
-
_markAsClosed() {
|
|
303
|
-
this._$opened.next(false);
|
|
304
|
-
}
|
|
305
|
-
async close() {
|
|
306
|
-
this._$opened.next(false);
|
|
307
|
-
}
|
|
308
|
-
async open() {
|
|
309
|
-
this._$opened.next(true);
|
|
310
|
-
}
|
|
311
|
-
async ngOnStart() {
|
|
312
|
-
console.info(`${this._logPrefix}Starting...`);
|
|
313
|
-
// Restore sub items from settings
|
|
314
|
-
await this.settings.ready();
|
|
315
|
-
const settingsSubItems = this.settings.getPageSettings('menu', 'sub-items');
|
|
316
|
-
if (isNotEmptyArray(settingsSubItems)) {
|
|
317
|
-
console.debug(this._logPrefix + 'Restoring pinned items from settings...', settingsSubItems);
|
|
318
|
-
this._detachedSubItems = settingsSubItems.map((source) => this.fromObject(source, { computeId: true, fillParent: true }));
|
|
319
|
-
}
|
|
320
|
-
const accountEvent$ = merge(from(this.accountService.ready()), this.accountService.onLogin, this.accountService.onLogout.pipe(map((_) => null))).pipe(map((account) => (isNotNil(account?.id) ? account : null)), distinctUntilChanged((a1, a2) => DateUtils.isSame(a1?.updateDate, a2?.updateDate)));
|
|
321
|
-
this.registerSubscription(
|
|
322
|
-
// Combine config and account events
|
|
323
|
-
combineLatest([this.configService.config, accountEvent$]).subscribe(([config, account]) => {
|
|
324
|
-
if (this._debug)
|
|
325
|
-
console.debug(`${this._logPrefix}Received config or account event. Refreshing items...`, account);
|
|
326
|
-
// Load all items
|
|
327
|
-
const items = this._loadMenuItems(config, account);
|
|
328
|
-
// Emit new root items
|
|
329
|
-
this.dataSubject.next(items);
|
|
330
|
-
// Emit account changes event
|
|
331
|
-
this.accountChanges.next(account);
|
|
332
|
-
}));
|
|
333
|
-
this.registerSubscription(merge(this.accountChanges.pipe(map(() => MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url))), this._$listenRoute.pipe(filter((listen) => listen === true && this.started), mergeMap((_) => this.router.events), filter((event) => event instanceof NavigationEnd), map((event) => MenuItems.parsePathWithQuery(event.url))))
|
|
334
|
-
.pipe(throttleTime(250))
|
|
335
|
-
.subscribe((pathParam) => {
|
|
336
|
-
const detachedSubItems = this._detachSubMenuItems(pathParam);
|
|
337
|
-
if (detachedSubItems?.length) {
|
|
338
|
-
this._detachedSubItems = [...this._detachedSubItems, ...detachedSubItems];
|
|
339
|
-
if (this._debug)
|
|
340
|
-
console.debug(`${this._logPrefix}Newly detached items: `, detachedSubItems);
|
|
341
|
-
}
|
|
342
|
-
}));
|
|
343
|
-
// Save pinned items
|
|
344
|
-
this.registerSubscription(this.onPinned.subscribe((item) => {
|
|
345
|
-
// Collect pinned elements, then serialize it (without id)
|
|
346
|
-
const pinnedSubItems = this.subItems.filter((i) => i.isPinned()).map((item) => item.asObject({ withChildren: true, keepLocalId: false }));
|
|
347
|
-
if (pinnedSubItems.length && this._debug)
|
|
348
|
-
console.debug(this._logPrefix + `Saving ${pinnedSubItems.length} pinned items, in local settings`, pinnedSubItems);
|
|
349
|
-
this.settings.savePageSetting('menu', pinnedSubItems, 'sub-items');
|
|
350
|
-
}));
|
|
351
|
-
return firstNotNilPromise(this.dataSubject);
|
|
352
|
-
}
|
|
353
|
-
_loadMenuItems(config, account) {
|
|
354
|
-
if (this._debug)
|
|
355
|
-
console.debug(`${this._logPrefix}Loading menu items...`);
|
|
356
|
-
// Save previous children of root items
|
|
357
|
-
const detachedSubItems = (this.subItems || []).concat(this._staticSubItems || []).reduce((res, rootItem) => {
|
|
358
|
-
const children = rootItem.children;
|
|
359
|
-
if (isEmptyArray(children))
|
|
360
|
-
return res;
|
|
361
|
-
// Detach all root children
|
|
362
|
-
rootItem.children = [];
|
|
363
|
-
children.forEach((child) => (child.parent = null));
|
|
364
|
-
// Return root children
|
|
365
|
-
return res.concat(children);
|
|
366
|
-
}, this._detachedSubItems || []);
|
|
367
|
-
// Reset base root items (clean items added by config)
|
|
368
|
-
let items = this._staticItems.slice();
|
|
369
|
-
// Concat config's items
|
|
370
|
-
const configValue = config?.getProperty(CORE_CONFIG_OPTIONS.MENU_ITEMS);
|
|
371
|
-
if (isNotNilOrBlank(configValue)) {
|
|
372
|
-
try {
|
|
373
|
-
const configItems = JSON.parse(configValue);
|
|
374
|
-
items = (configItems || []).reduce((res, source) => {
|
|
375
|
-
// Normalize the item
|
|
376
|
-
const item = this.fromObject({ static: true, ...source }, { computeId: true });
|
|
377
|
-
// Skip is already loaded
|
|
378
|
-
if (res.find((i) => MenuItems.isSame(i, item)))
|
|
379
|
-
return res;
|
|
380
|
-
// Reuse existing id, if possible
|
|
381
|
-
const existingItem = this.data?.find((i) => MenuItems.isSame(i, item));
|
|
382
|
-
if (existingItem) {
|
|
383
|
-
item.id = existingItem.id;
|
|
384
|
-
}
|
|
385
|
-
if (item.after) {
|
|
386
|
-
const index = res.findIndex((i) => i.title === item.after);
|
|
387
|
-
if (index !== -1) {
|
|
388
|
-
return res
|
|
389
|
-
.slice(0, index + 1)
|
|
390
|
-
.concat(item)
|
|
391
|
-
.concat(res.slice(index + 1));
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
else if (item.before) {
|
|
395
|
-
const index = res.findIndex((i) => i.title === item.before);
|
|
396
|
-
if (index !== -1) {
|
|
397
|
-
return res.slice(0, index).concat(item).concat(res.slice(index));
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
return res.concat(item);
|
|
401
|
-
}, items);
|
|
402
|
-
}
|
|
403
|
-
catch (err) {
|
|
404
|
-
console.error(`${this._logPrefix}Invalid value for option '${CORE_CONFIG_OPTIONS.MENU_ITEMS.key}'. Expected an array of menu item`, err);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
// Filter item using account rights
|
|
408
|
-
const opts = { debug: this._debug };
|
|
409
|
-
items = items
|
|
410
|
-
.filter((item) => MenuItems.checkIfVisible(item, account, config, opts))
|
|
411
|
-
.map((item) => {
|
|
412
|
-
// Replace title using a config property
|
|
413
|
-
if (isNotNilOrBlank(item.titleProperty) && config) {
|
|
414
|
-
item.title = config.properties[item.titleProperty] || item.title;
|
|
415
|
-
}
|
|
416
|
-
return item;
|
|
417
|
-
});
|
|
418
|
-
if (this._debug)
|
|
419
|
-
console.debug(`${this._logPrefix}Found ${items.length} visible root items...`);
|
|
420
|
-
// Re-attach sub menu items
|
|
421
|
-
if (this.subMenuEnabled && detachedSubItems.length) {
|
|
422
|
-
if (account) {
|
|
423
|
-
this._addSubMenuItems(detachedSubItems, { skipIfExists: false, availableParents: detachedSubItems.concat(items) });
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
this._detachedSubItems = detachedSubItems;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
this._detachedSubItems = [];
|
|
431
|
-
}
|
|
432
|
-
return items;
|
|
433
|
-
}
|
|
434
|
-
_addSubMenuItems(sources, opts) {
|
|
435
|
-
return sources.map((source) => this._addSubMenuItem(source, opts));
|
|
436
|
-
}
|
|
437
|
-
_addSubMenuItem(newItem, opts) {
|
|
438
|
-
opts = {
|
|
439
|
-
skipIfExists: true,
|
|
440
|
-
...opts,
|
|
441
|
-
};
|
|
442
|
-
const pathParam = MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url);
|
|
443
|
-
// Find if item already exists
|
|
444
|
-
const existingItem = this._findExistingItem(newItem, opts?.availableParents);
|
|
445
|
-
if (existingItem) {
|
|
446
|
-
// No changes
|
|
447
|
-
if (opts.skipIfExists && MenuItems.isSame(existingItem, newItem) && existingItem.visible) {
|
|
448
|
-
// DEBUG
|
|
449
|
-
if (this._debug)
|
|
450
|
-
console.debug(`${this._logPrefix}Skipping sub item (same visible item already exist)`, newItem);
|
|
451
|
-
return existingItem;
|
|
452
|
-
}
|
|
453
|
-
if (this._debug)
|
|
454
|
-
console.debug(`${this._logPrefix}Updating existing sub item #`, existingItem.id);
|
|
455
|
-
// Replace existing item, but keep the existing id
|
|
456
|
-
if (newItem !== existingItem) {
|
|
457
|
-
newItem.id = existingItem.id;
|
|
458
|
-
newItem.$children = existingItem.$children;
|
|
459
|
-
newItem.pinned = existingItem.pinned;
|
|
460
|
-
newItem.static = existingItem.static;
|
|
461
|
-
if (newItem.pinned || newItem.static || existingItem.expanded) {
|
|
462
|
-
// If loading, keep existing title if pinned (avoid to show skeleton)
|
|
463
|
-
newItem.title = newItem.title || existingItem.title;
|
|
464
|
-
}
|
|
465
|
-
else {
|
|
466
|
-
newItem.title = isNotNil(newItem.title) ? newItem.title : existingItem.title;
|
|
467
|
-
}
|
|
468
|
-
// Auto set icon, for expand action
|
|
469
|
-
if (existingItem.action === 'expand') {
|
|
470
|
-
newItem.icon = null;
|
|
471
|
-
newItem.matIcon = existingItem.expanded ? 'expand_less' : 'expand_more';
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
// Generate item's id (if need)
|
|
476
|
-
else if (isNil(newItem.id)) {
|
|
477
|
-
newItem.id = this._computeNewId();
|
|
478
|
-
}
|
|
479
|
-
// Default icon for expand action
|
|
480
|
-
if (newItem.action === 'expand' && !newItem.matIcon) {
|
|
481
|
-
newItem.matIcon = 'expand_more';
|
|
482
|
-
}
|
|
483
|
-
// If visible, get the parent where to attach the item
|
|
484
|
-
const parent = this._findParent(newItem, opts?.availableParents);
|
|
485
|
-
if (parent && parent.expanded) {
|
|
486
|
-
// Attach item to parent
|
|
487
|
-
this._attachMenuToParent(parent, newItem);
|
|
488
|
-
// Update detached items :
|
|
489
|
-
// - excluded new item
|
|
490
|
-
// - attach and exclude those than can be attached to the new item
|
|
491
|
-
// Search in detached items one have newItem as parent
|
|
492
|
-
if (newItem.expanded) {
|
|
493
|
-
const ancestor = newItem.ancestor;
|
|
494
|
-
this._detachedSubItems = this._detachedSubItems.concat(...newItem.children).reduce((res, item) => {
|
|
495
|
-
// Excluded newly add item
|
|
496
|
-
if (item.id === newItem.id)
|
|
497
|
-
return res;
|
|
498
|
-
// If some detached can be attached to the new item: do it
|
|
499
|
-
if (MenuItems.checkIfSubMenuVisible(item, pathParam)) {
|
|
500
|
-
const parent = this._findParent(item, [ancestor]);
|
|
501
|
-
if (parent) {
|
|
502
|
-
// Update item's children
|
|
503
|
-
const detachedChildren = this._detachSubMenuItems(pathParam, item.children || []);
|
|
504
|
-
// Attach item
|
|
505
|
-
this._attachMenuToParent(parent, item);
|
|
506
|
-
// Remember detached children
|
|
507
|
-
return res.concat(...detachedChildren);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
// Detach (if need)
|
|
511
|
-
this._detachToParent(item);
|
|
512
|
-
// Add to detached items
|
|
513
|
-
return res.concat(item);
|
|
514
|
-
}, []);
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
// Remove from detached elements
|
|
518
|
-
this._detachedSubItems = this._detachedSubItems.filter((item) => item.id !== newItem.id);
|
|
519
|
-
// Detach children
|
|
520
|
-
newItem.children.forEach((item) => this._detachToParent(item));
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
// Add or update detached item
|
|
525
|
-
const detachedIndex = isNotNil(newItem.id) ? this._detachedSubItems.findIndex((item) => item.id === newItem.id) : -1;
|
|
526
|
-
if (detachedIndex !== -1) {
|
|
527
|
-
this._detachedSubItems[detachedIndex] = newItem;
|
|
528
|
-
}
|
|
529
|
-
else {
|
|
530
|
-
this._detachedSubItems.push(newItem);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
// Start listening route
|
|
534
|
-
if (!this._$listenRoute.value)
|
|
535
|
-
this._$listenRoute.next(true);
|
|
536
|
-
return newItem;
|
|
537
|
-
}
|
|
538
|
-
_computeNewId() {
|
|
539
|
-
return this._itemCounter++;
|
|
540
|
-
}
|
|
541
|
-
_removeSubMenuItem(item) {
|
|
542
|
-
const existingItem = this._findExistingItem(item);
|
|
543
|
-
if (existingItem) {
|
|
544
|
-
this._detachToParent(existingItem);
|
|
545
|
-
return existingItem;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
_detachSubMenuItems(currentPathParam, subItems) {
|
|
549
|
-
currentPathParam = currentPathParam ? currentPathParam : MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url.toString());
|
|
550
|
-
return (subItems || this.subItems).reduce((res, subItem) => {
|
|
551
|
-
// Not visible => should be detach
|
|
552
|
-
if (!MenuItems.checkIfSubMenuVisible(subItem, currentPathParam)) {
|
|
553
|
-
this._detachToParent(subItem);
|
|
554
|
-
return res.concat(subItem);
|
|
555
|
-
}
|
|
556
|
-
// Visible: check children
|
|
557
|
-
return res.concat(this._detachSubMenuItems(currentPathParam, subItem.children));
|
|
558
|
-
}, []);
|
|
559
|
-
}
|
|
560
|
-
_detachToParent(item) {
|
|
561
|
-
if (!item?.parent)
|
|
562
|
-
return; // Skip if already detached
|
|
563
|
-
let children = item.parent.children || [];
|
|
564
|
-
// Remove from parent children
|
|
565
|
-
const indexInParent = children.indexOf(item);
|
|
566
|
-
if (indexInParent !== -1) {
|
|
567
|
-
children = children.slice(); // Copy original array, because it can be used in a loop
|
|
568
|
-
children.splice(indexInParent, 1);
|
|
569
|
-
item.parent.children = children;
|
|
570
|
-
}
|
|
571
|
-
item.parent = null;
|
|
572
|
-
}
|
|
573
|
-
_findExistingItem(searchItem, items, recursive = true) {
|
|
574
|
-
items = items || [...this._detachedSubItems, ...this.data];
|
|
575
|
-
if (!items.length)
|
|
576
|
-
return undefined; // Not found
|
|
577
|
-
for (const item of items) {
|
|
578
|
-
if (MenuItems.isSameIdOrPathAndParams(searchItem, item))
|
|
579
|
-
return item;
|
|
580
|
-
if (recursive && item.children) {
|
|
581
|
-
const child = this._findExistingItem(searchItem, item.children);
|
|
582
|
-
if (child)
|
|
583
|
-
return child;
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
return null;
|
|
587
|
-
}
|
|
588
|
-
_findParent(childItem, availableParents) {
|
|
589
|
-
if (!childItem?.path)
|
|
590
|
-
return undefined;
|
|
591
|
-
if (childItem.parent)
|
|
592
|
-
return childItem.parent;
|
|
593
|
-
availableParents = availableParents || [...this._detachedSubItems, ...this.data];
|
|
594
|
-
return availableParents.reduce((res, item) => {
|
|
595
|
-
if (!item?.path)
|
|
596
|
-
return res;
|
|
597
|
-
// A found item already match with the menuItem.parentPath : keep it as it
|
|
598
|
-
// There is a found candidate that already match the current candidate : keep it
|
|
599
|
-
if (MenuItems.isParent(childItem, res))
|
|
600
|
-
return res;
|
|
601
|
-
// If the menu item has explicit parentPath and its path and path param are the same as the candidate : use it as parent
|
|
602
|
-
if (MenuItems.isParent(childItem, item))
|
|
603
|
-
return item;
|
|
604
|
-
if (!res && item.children?.length) {
|
|
605
|
-
return this._findParent(childItem, item.children);
|
|
606
|
-
}
|
|
607
|
-
return res;
|
|
608
|
-
}, undefined);
|
|
609
|
-
}
|
|
610
|
-
_attachMenuToParent(parent, child) {
|
|
611
|
-
if (this._debug)
|
|
612
|
-
console.debug(`${this._logPrefix}Attach sub-menu {${MenuItems.getUrl(child)}} to parent {${MenuItems.getUrl(parent)}}`);
|
|
613
|
-
// Avoid to keep identical menu item (we replace it with the new child menu item)
|
|
614
|
-
//if (!parent?.$children) parent.$children = new BehaviorSubject<MenuItem[]>([]);
|
|
615
|
-
const children = parent.children || [];
|
|
616
|
-
const existingIndex = children.findIndex((item) => MenuItems.isSameIdOrPathAndParams(item, child));
|
|
617
|
-
// Update existing element
|
|
618
|
-
if (existingIndex !== -1) {
|
|
619
|
-
if (children[existingIndex] !== child) {
|
|
620
|
-
children[existingIndex] = child;
|
|
621
|
-
parent.children = children;
|
|
622
|
-
child.parent = parent;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
else {
|
|
626
|
-
children.push(child);
|
|
627
|
-
// Sort by tab (or id)
|
|
628
|
-
parent.children = children.sort(MenuItems.sortByTabOrId);
|
|
629
|
-
child.parent = parent;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MenuService, deps: [{ token: i1.LocalSettingsService }, { token: i2.ConfigService }, { token: i3.AccountService }, { token: i4.Router }, { token: i5.ModalController }, { token: i5.AlertController }, { token: i5.NavController }, { token: i6.TranslateService }, { token: ENVIRONMENT }, { token: APP_MENU_OPTIONS, optional: true }, { token: APP_MENU_ITEMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
633
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MenuService, providedIn: 'root' });
|
|
634
|
-
}
|
|
635
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MenuService, decorators: [{
|
|
636
|
-
type: Injectable,
|
|
637
|
-
args: [{
|
|
638
|
-
providedIn: 'root',
|
|
639
|
-
deps: [ENVIRONMENT],
|
|
640
|
-
}]
|
|
641
|
-
}], ctorParameters: () => [{ type: i1.LocalSettingsService }, { type: i2.ConfigService }, { type: i3.AccountService }, { type: i4.Router }, { type: i5.ModalController }, { type: i5.AlertController }, { type: i5.NavController }, { type: i6.TranslateService }, { type: i7.Environment, decorators: [{
|
|
642
|
-
type: Inject,
|
|
643
|
-
args: [ENVIRONMENT]
|
|
644
|
-
}] }, { type: i8.MenuOptions, decorators: [{
|
|
645
|
-
type: Optional
|
|
646
|
-
}, {
|
|
647
|
-
type: Inject,
|
|
648
|
-
args: [APP_MENU_OPTIONS]
|
|
649
|
-
}] }, { type: undefined, decorators: [{
|
|
650
|
-
type: Optional
|
|
651
|
-
}, {
|
|
652
|
-
type: Inject,
|
|
653
|
-
args: [APP_MENU_ITEMS]
|
|
654
|
-
}] }] });
|
|
655
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRyxPQUFPLEVBQWEsUUFBUSxFQUFFLFNBQVMsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFHbEQs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YSxDQUFDLENBQUM7WUFDekQsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7dUdBenFCVSxXQUFXLGtRQXdCWixXQUFXLGFBQ0MsZ0JBQWdCLDZCQUNoQixjQUFjOzJHQTFCekIsV0FBVyxjQUhWLE1BQU07OzJGQUdQLFdBQVc7a0JBSnZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQztpQkFDcEI7OzBCQXlCSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ25DLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbSwgbWVyZ2UsIG1lcmdlTWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJTWVudUl0ZW0sIE1lbnVJdGVtLCBNZW51SXRlbXMsIE1lbnVPcHRpb25zIH0gZnJvbSAnLi9tZW51Lm1vZGVsJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RhdGVzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGhyb3R0bGVUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmssIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2FjY291bnQubW9kZWwnO1xuaW1wb3J0IHsgU3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBmaXJzdE5vdE5pbFByb21pc2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgSWNvblJlZiB9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZUl0ZW1FbnRpdHlVdGlscyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3RyZWUtaXRlbS1lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBNb2RhbENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBYm91dE1vZGFsIH0gZnJvbSAnLi4vYWJvdXQvYWJvdXQubW9kYWwnO1xuXG5leHBvcnQgdHlwZSBTcGxpdFBhbmVTaG93V2hlbiA9IGJvb2xlYW4gfCAnbGcnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUVOVV9TSE9XX1dIRU46IFNwbGl0UGFuZVNob3dXaGVuID0gJ2xnJztcbmV4cG9ydCBjb25zdCBBUFBfTUVOVV9JVEVNUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJTWVudUl0ZW1bXT4oJ21lbnVJdGVtcycpO1xuZXhwb3J0IGNvbnN0IEFQUF9NRU5VX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWVudU9wdGlvbnM+KCdtZW51T3B0aW9ucycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVQYXRoUGFyYW0ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGRlcHM6IFtFTlZJUk9OTUVOVF0sXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVTZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2U8TWVudUl0ZW1bXT4ge1xuICByZWFkb25seSBhY2NvdW50Q2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWNjb3VudD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgb25QaW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtPih0cnVlKTtcblxuICBwcml2YXRlIF9zdGF0aWNJdGVtczogTWVudUl0ZW1bXTtcbiAgcHJpdmF0ZSBfZGV0YWNoZWRTdWJJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICBwcml2YXRlIF9pdGVtQ291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IE1lbnVPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dQcmVmaXggPSAnW21lbnUtc2VydmljZV0gJztcbiAgcHJpdmF0ZSByZWFkb25seSBfJG9wZW5lZCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRzcGxpdFBhbmVXaGVuID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTcGxpdFBhbmVTaG93V2hlbj4oREVGQVVMVF9NRU5VX1NIT1dfV0hFTik7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRlbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGVuYWJsZVN1Yk1lbnU6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGxpc3RlblJvdXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBwcm90ZWN0ZWQgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIGFsZXJ0Q29udHJvbGxlcjogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9NRU5VX09QVElPTlMpIG9wdGlvbnM/OiBNZW51T3B0aW9ucyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9NRU5VX0lURU1TKSBzdGF0aWNJdGVtcz86IElNZW51SXRlbVtdXG4gICkge1xuICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHN1Yk1lbnU6IHtcbiAgICAgICAgZGlzYWJsZUljb246IGZhbHNlLFxuICAgICAgICBzYXZlUGlubmVkOiB0cnVlLFxuICAgICAgICAuLi4ob3B0aW9ucz8uc3ViTWVudSB8fCB7fSksXG4gICAgICAgIC8vIEZvcmNlIGRpc2FibGUgb24gbW9iaWxlXG4gICAgICAgIGVuYWJsZTogb3B0aW9ucz8uc3ViTWVudT8uZW5hYmxlICE9PSBmYWxzZSAmJiAhdGhpcy5zZXR0aW5ncy5tb2JpbGUsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5fJGVuYWJsZVN1Yk1lbnUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRoaXMuX29wdGlvbnMuc3ViTWVudS5lbmFibGUpO1xuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG5cbiAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gW107XG4gICAgdGhpcy5fc3RhdGljSXRlbXMgPSAoc3RhdGljSXRlbXMgfHwgW10pLm1hcCgoc291cmNlKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZyb21PYmplY3QoeyBzdGF0aWM6IHRydWUsIC4uLnNvdXJjZSB9LCB7IGNvbXB1dGVJZDogdHJ1ZSwgZmlsbFBhcmVudDogdHJ1ZSwgZmlsbERlZmF1bHRGcm9tUGFyZW50OiB0cnVlIH0pO1xuXG4gICAgICBjb25zdCBkZXRhY2hlZEl0ZW1zID0gVHJlZUl0ZW1FbnRpdHlVdGlscy5kZWxldGVSZWN1cnNpdmVseSh0YXJnZXQsIChpdGVtKSA9PiBpdGVtLnN0YXRpYyAhPT0gdHJ1ZSk7XG4gICAgICBpZiAoZGV0YWNoZWRJdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ0RldGFjaGVkIGluaXQgaXRlbXMnLCBkZXRhY2hlZEl0ZW1zKTtcbiAgICAgICAgZGV0YWNoZWRJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB0aGlzLl9kZXRhY2hUb1BhcmVudChpdGVtKSk7XG5cbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcy5wdXNoKC4uLmRldGFjaGVkSXRlbXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBvcGVuZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRvcGVuZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgc3BsaXRQYW5lV2hlbigpOiBPYnNlcnZhYmxlPFNwbGl0UGFuZVNob3dXaGVuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRzcGxpdFBhbmVXaGVuLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHN1Yk1lbnVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl8kZW5hYmxlU3ViTWVudS52YWx1ZTtcbiAgfVxuXG4gIGdldCBzdWJJdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YSB8fCBbXSkucmVkdWNlKChyZXMsIHJvb3RFbGVtZW50KSA9PiByZXMuY29uY2F0KHJvb3RFbGVtZW50LmNoaWxkcmVuKSwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N0YXRpY1N1Ykl0ZW1zKCk6IE1lbnVJdGVtW10ge1xuICAgIHJldHVybiAodGhpcy5fc3RhdGljSXRlbXMgfHwgW10pLnJlZHVjZSgocmVzLCByb290RWxlbWVudCkgPT4gcmVzLmNvbmNhdChyb290RWxlbWVudC5jaGlsZHJlbiksIFtdKTtcbiAgfVxuXG4gIGVuYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuXyRlbmFibGVkLm5leHQodmFsdWUpO1xuICB9XG5cbiAgZW5hYmxlU3ViTWVudSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuXyRlbmFibGVTdWJNZW51Lm5leHQodmFsdWUpO1xuICB9XG5cbiAgc2V0U3BsaXRQYW5lU2hvd1doZW4odmFsdWU6IFNwbGl0UGFuZVNob3dXaGVuKSB7XG4gICAgaWYgKHRoaXMuXyRzcGxpdFBhbmVXaGVuLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fJHNwbGl0UGFuZVdoZW4ubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlU3BsaXRQYW5lV2hlbigpIHtcbiAgICBpZiAodGhpcy5fJHNwbGl0UGFuZVdoZW4udmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fJHNwbGl0UGFuZVdoZW4ubmV4dChERUZBVUxUX01FTlVfU0hPV19XSEVOKTtcbiAgICB9XG4gIH1cblxuICBmcm9tT2JqZWN0KHNvdXJjZTogYW55LCBvcHRzPzogeyB3aXRoQ2hpbGRyZW4/OiBib29sZWFuOyBjb21wdXRlSWQ/OiBib29sZWFuOyBmaWxsUGFyZW50PzogYm9vbGVhbjsgZmlsbERlZmF1bHRGcm9tUGFyZW50PzogYm9vbGVhbiB9KTogTWVudUl0ZW0ge1xuICAgIGNvbnN0IHRhcmdldCA9IE1lbnVJdGVtLmZyb21PYmplY3Qoc291cmNlLCB7IHdpdGhDaGlsZHJlbjogZmFsc2UgfSk7XG4gICAgLy8gQ29tcHV0ZSBpZCBpZiBuZWVkXG4gICAgaWYgKG9wdHM/LmNvbXB1dGVJZCAmJiBpc05pbCh0YXJnZXQuaWQpKSB0YXJnZXQuaWQgPSB0aGlzLl9jb21wdXRlTmV3SWQoKTtcblxuICAgIC8vIFJlbW92ZSBpY29uIGlmIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuc3ViTWVudS5kaXNhYmxlSWNvbikge1xuICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIDxJY29uUmVmPnsgaWNvbjogdW5kZWZpbmVkLCBtYXRJY29uOiB1bmRlZmluZWQsIG1hdFN2Z0ljb246IHVuZGVmaW5lZCB9KTtcbiAgICB9XG5cbiAgICAvLyBSZWN1cnNpdmVcbiAgICB0YXJnZXQuY2hpbGRyZW4gPSAoc291cmNlLmNoaWxkcmVuIHx8IFtdKS5tYXAoKGpzb246IGFueSkgPT4gdGhpcy5mcm9tT2JqZWN0KGpzb24sIHsgLi4ub3B0cywgZmlsbFBhcmVudDogZmFsc2UgfSkpO1xuXG4gICAgLy8gRmlsbCBwYXJlbnQgKG9uY2UsIHdoZW4gdGhlIGZ1bGwgdHJlZSBpcyByZWFkeSlcbiAgICBpZiAob3B0cz8uZmlsbFBhcmVudCkge1xuICAgICAgVHJlZUl0ZW1FbnRpdHlVdGlscy50cmVlRmlsbFBhcmVudCh0YXJnZXQpO1xuXG4gICAgICAvLyBGaWxsIGRlZmF1bHRzIGZyb20gdGhlIHBhcmVudCAob25jZSBmaWxsZWQpXG4gICAgICBpZiAob3B0cz8uZmlsbERlZmF1bHRGcm9tUGFyZW50KSB7XG4gICAgICAgIFRyZWVJdGVtRW50aXR5VXRpbHMudmlzaXQodGFyZ2V0LCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbS5wYXJlbnQpIHJldHVybjsgLy8gU2tpcCBpZiBubyBwYXJlbnRcbiAgICAgICAgICBpdGVtLnBhcmVudFBhdGggPSBpdGVtLnBhcmVudFBhdGggfHwgaXRlbS5wYXJlbnQucGF0aDtcbiAgICAgICAgICBpdGVtLnBhcmVudFBhdGhQYXJhbXMgPSBpdGVtLnBhcmVudFBhdGhQYXJhbXMgfHwgaXRlbS5wYXJlbnQucGF0aFBhcmFtcztcbiAgICAgICAgICBpdGVtLnN0YXRpYyA9IHRvQm9vbGVhbihpdGVtLnN0YXRpYywgaXRlbS5wYXJlbnQuc3RhdGljKTtcbiAgICAgICAgICAvLyBDb21wdXRlIHBhdGgsIGZyb20gcGFyZW50IHBhdGggKyBhY3Rpb25cbiAgICAgICAgICBpZiAoIWl0ZW0ucGF0aCAmJiAhIWl0ZW0uYWN0aW9uKSB7XG4gICAgICAgICAgICBpdGVtLnBhdGggPSBpdGVtLnBhcmVudC5wYXRoO1xuICAgICAgICAgICAgaXRlbS5wYXRoUGFyYW1zID0gdHlwZW9mIGl0ZW0uYWN0aW9uID09PSAnc3RyaW5nJyA/IHsgYWN0aW9uOiBpdGVtLmFjdGlvbiB9IDogeyBhY3Rpb25JZDogaXRlbS5pZC50b1N0cmluZygpLCBhY3Rpb25UaXRsZTogaXRlbS50aXRsZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGNyZWF0ZVN1Yk1lbnUoc291cmNlOiBQYXJ0aWFsPElNZW51SXRlbT4pOiBNZW51SXRlbSB7XG4gICAgaWYgKCF0aGlzLnN1Yk1lbnVFbmFibGVkKSByZXR1cm4gbnVsbDsgLy8gU2tpcCBpZiBkaXNhYmxlZFxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5mcm9tT2JqZWN0KHNvdXJjZSk7XG5cbiAgICAvLyBDaGVjayBpZiBleGlzdHNcbiAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0l0ZW0gPSB0aGlzLl9maW5kRXhpc3RpbmdJdGVtKHRhcmdldCk7XG4gICAgICBpZiAoZXhpc3RpbmdJdGVtKSByZXR1cm4gZXhpc3RpbmdJdGVtO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZVxuICAgIGlmIChpc05pbCh0YXJnZXQuaWQpKSB0YXJnZXQuaWQgPSB0aGlzLl9jb21wdXRlTmV3SWQoKTtcblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBhZGRTdWJNZW51SXRlbXMoc291cmNlczogSU1lbnVJdGVtW10sIG9wdHM/OiB7IHNraXBJZkV4aXN0cz86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgaWYgKCF0aGlzLnN1Yk1lbnVFbmFibGVkKSByZXR1cm47IC8vIFNraXBcbiAgICByZXR1cm4gc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gdGhpcy5fYWRkU3ViTWVudUl0ZW0odGhpcy5mcm9tT2JqZWN0KHNvdXJjZSksIG9wdHMpKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFN1Yk1lbnVJdGVtKGl0ZW06IElNZW51SXRlbSwgb3B0cz86IHsgc2tpcElmRXhpc3RzPzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICBpZiAoIXRoaXMuc3ViTWVudUVuYWJsZWQpIHJldHVybjsgLy8gU2tpcFxuICAgIHJldHVybiB0aGlzLl9hZGRTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3QoaXRlbSksIG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlU3ViTWVudUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgcmV0dXJuIChpdGVtcyB8fCBbXSkubWFwKChpdGVtKSA9PiB0aGlzLl9yZW1vdmVTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3QoaXRlbSkpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVN1Yk1lbnVJdGVtKGl0ZW06IElNZW51SXRlbSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZVN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChpdGVtKSk7XG4gIH1cblxuICB0b2dnbGVQaW5uZWQoc291cmNlOiBJTWVudUl0ZW0pIHtcbiAgICBjb25zdCBpdGVtID0gc291cmNlIGluc3RhbmNlb2YgTWVudUl0ZW0gPyBzb3VyY2UgOiB0aGlzLl9maW5kRXhpc3RpbmdJdGVtKHRoaXMuZnJvbU9iamVjdChzb3VyY2UpKTtcblxuICAgIC8vIFNraXAgaWYgbm90IGZvdW5kXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUud2Fybih0aGlzLl9sb2dQcmVmaXggKyBgU3ViIG1lbnUgeyR7c291cmNlLnBhdGh9fSBjYW5ub3QgYmUgZm91bmQgLSB1bmFibGUgdG8gdG9nZ2xlIHBpbm5lZCFgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIHN0YXRpY1xuICAgIGlmIChpdGVtLnN0YXRpYykgcmV0dXJuO1xuXG4gICAgLy8gVW5waW5uZWRcbiAgICBpZiAoaXRlbS5waW5uZWQpIHtcbiAgICAgIGl0ZW0ucGlubmVkID0gZmFsc2U7XG4gICAgICBpZiAoIWl0ZW0uZGV0YWNoZWQpIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IFsuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLCAuLi50aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMoKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGlubmVkXG4gICAgZWxzZSB7XG4gICAgICBpdGVtLnBpbm5lZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5vblBpbm5lZC5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUFjdGlvbihldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgY29uc3QgYWN0aW9uID0gaXRlbT8uYWN0aW9uO1xuICAgIGlmICghYWN0aW9uKSByZXR1cm47IC8vIHNraXBcbiAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uIGFzIHN0cmluZykge1xuICAgICAgICBjYXNlICdsb2dvdXQnOlxuICAgICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Fib3V0JzpcbiAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5BYm91dE1vZGFsKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2V4cGFuZCc6XG4gICAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVFeHBhbmRhYmxlSXRlbShpdGVtKTtcbiAgICAgICAgICBpZiAoaXRlbS5wYXRoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KGl0ZW0ucGF0aCwge1xuICAgICAgICAgICAgICBxdWVyeVBhcmFtczogaXRlbS5wYXRoUGFyYW1zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgaWYgKGl0ZW0ucGF0aCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXZDb250cm9sbGVyLm5hdmlnYXRlUm9vdChpdGVtLnBhdGgsIHtcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IGl0ZW0ucGF0aFBhcmFtcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWN0aW9uOiAnICsgYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIChhY3Rpb24gYXMgdW5rbm93biBhcyBhbnkpKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuaW5zdGFudChbXG4gICAgICAnQVVUSC5MT0dPVVQuQ09ORklSTV9USVRMRScsXG4gICAgICAnQVVUSC5MT0dPVVQuQ09ORklSTV9NRVNTQUdFJyxcbiAgICAgICdDT01NT04uQlROX0NBTkNFTCcsXG4gICAgICAnQVVUSC5MT0dPVVQuQlROX0NPTkZJUk0nLFxuICAgIF0pO1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydBVVRILkxPR09VVC5DT05GSVJNX1RJVExFJ10sXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbJ0FVVEguTE9HT1VULkNPTkZJUk1fTUVTU0FHRSddLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQVVUSC5MT0dPVVQuQlROX0NPTkZJUk0nXSxcbiAgICAgICAgICBjc3NDbGFzczogJ2lvbi1jb2xvci1wcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLmxvZ291dCgpO1xuXG4gICAgICAgICAgICAvLyBCYWNrIHRvIGhvbWVcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5uYXZDb250cm9sbGVyLm5hdmlnYXRlUm9vdCgnLycpLCAxMDApO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICB9XG5cbiAgYXN5bmMgb3BlbkFib3V0TW9kYWwoKSB7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoeyBjb21wb25lbnQ6IEFib3V0TW9kYWwgfSk7XG4gICAgcmV0dXJuIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZUV4cGFuZGFibGVJdGVtKGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgaWYgKCFpdGVtLmV4cGFuZGVkKSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ0V4cGFuZCBpdGVtJywgaXRlbSk7XG5cbiAgICAgIGl0ZW0ubWF0SWNvbiA9ICdleHBhbmRfbGVzcyc7XG5cbiAgICAgIC8vIFRyeSB0byBhdHRhY2ggc29tZSBpdGVtXG4gICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zXG4gICAgICAgIC5maWx0ZXIoKGNoaWxkSXRlbSkgPT4gISF0aGlzLl9maW5kUGFyZW50KGNoaWxkSXRlbSwgW2l0ZW1dKSlcbiAgICAgICAgLmZvckVhY2goKGNoaWxkSXRlbSkgPT4gdGhpcy5fYXR0YWNoTWVudVRvUGFyZW50KGl0ZW0sIGNoaWxkSXRlbSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtLm1hdEljb24gPSAnZXhwYW5kX21vcmUnO1xuXG4gICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gWy4uLnRoaXMuX2RldGFjaGVkU3ViSXRlbXMsIC4uLnRoaXMuX2RldGFjaFN1Yk1lbnVJdGVtcyh7IHBhdGg6ICcvJywgcGFyYW1zOiB7fSB9LCBpdGVtLmNoaWxkcmVuKV07XG4gICAgfVxuICB9XG5cbiAgX21hcmtBc09wZW5lZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBfbWFya0FzQ2xvc2VkKCkge1xuICAgIHRoaXMuXyRvcGVuZWQubmV4dChmYWxzZSk7XG4gIH1cblxuICBhc3luYyBjbG9zZSgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgb3BlbigpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCkge1xuICAgIGNvbnNvbGUuaW5mbyhgJHt0aGlzLl9sb2dQcmVmaXh9U3RhcnRpbmcuLi5gKTtcblxuICAgIC8vIFJlc3RvcmUgc3ViIGl0ZW1zIGZyb20gc2V0dGluZ3NcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnJlYWR5KCk7XG4gICAgY29uc3Qgc2V0dGluZ3NTdWJJdGVtczogSU1lbnVJdGVtW10gPSB0aGlzLnNldHRpbmdzLmdldFBhZ2VTZXR0aW5ncygnbWVudScsICdzdWItaXRlbXMnKTtcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHNldHRpbmdzU3ViSXRlbXMpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMuX2xvZ1ByZWZpeCArICdSZXN0b3JpbmcgcGlubmVkIGl0ZW1zIGZyb20gc2V0dGluZ3MuLi4nLCBzZXR0aW5nc1N1Ykl0ZW1zKTtcbiAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBzZXR0aW5nc1N1Ykl0ZW1zLm1hcCgoc291cmNlKSA9PiB0aGlzLmZyb21PYmplY3Qoc291cmNlLCB7IGNvbXB1dGVJZDogdHJ1ZSwgZmlsbFBhcmVudDogdHJ1ZSB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudEV2ZW50JCA9IG1lcmdlKFxuICAgICAgZnJvbSh0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCkpLFxuICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLFxuICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ291dC5waXBlKG1hcCgoXykgPT4gbnVsbCkpXG4gICAgKS5waXBlKFxuICAgICAgbWFwKChhY2NvdW50KSA9PiAoaXNOb3ROaWwoYWNjb3VudD8uaWQpID8gYWNjb3VudCA6IG51bGwpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhMSwgYTIpID0+IERhdGVVdGlscy5pc1NhbWUoYTE/LnVwZGF0ZURhdGUsIGEyPy51cGRhdGVEYXRlKSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIC8vIENvbWJpbmUgY29uZmlnIGFuZCBhY2NvdW50IGV2ZW50c1xuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZywgYWNjb3VudEV2ZW50JF0pLnN1YnNjcmliZSgoW2NvbmZpZywgYWNjb3VudF0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1SZWNlaXZlZCBjb25maWcgb3IgYWNjb3VudCBldmVudC4gUmVmcmVzaGluZyBpdGVtcy4uLmAsIGFjY291bnQpO1xuXG4gICAgICAgIC8vIExvYWQgYWxsIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fbG9hZE1lbnVJdGVtcyhjb25maWcsIGFjY291bnQpO1xuXG4gICAgICAgIC8vIEVtaXQgbmV3IHJvb3QgaXRlbXNcbiAgICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KGl0ZW1zKTtcblxuICAgICAgICAvLyBFbWl0IGFjY291bnQgY2hhbmdlcyBldmVudFxuICAgICAgICB0aGlzLmFjY291bnRDaGFuZ2VzLm5leHQoYWNjb3VudCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuYWNjb3VudENoYW5nZXMucGlwZShtYXAoKCkgPT4gTWVudUl0ZW1zLnBhcnNlUGF0aFdpdGhRdWVyeSh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpKSksXG4gICAgICAgIHRoaXMuXyRsaXN0ZW5Sb3V0ZS5waXBlKFxuICAgICAgICAgIGZpbHRlcigobGlzdGVuKSA9PiBsaXN0ZW4gPT09IHRydWUgJiYgdGhpcy5zdGFydGVkKSxcbiAgICAgICAgICBtZXJnZU1hcCgoXykgPT4gdGhpcy5yb3V0ZXIuZXZlbnRzKSxcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAgIG1hcCgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkoZXZlbnQudXJsKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICAucGlwZSh0aHJvdHRsZVRpbWUoMjUwKSlcbiAgICAgICAgLnN1YnNjcmliZSgocGF0aFBhcmFtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWNoZWRTdWJJdGVtcyA9IHRoaXMuX2RldGFjaFN1Yk1lbnVJdGVtcyhwYXRoUGFyYW0pO1xuICAgICAgICAgIGlmIChkZXRhY2hlZFN1Ykl0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbLi4udGhpcy5fZGV0YWNoZWRTdWJJdGVtcywgLi4uZGV0YWNoZWRTdWJJdGVtc107XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9TmV3bHkgZGV0YWNoZWQgaXRlbXM6IGAsIGRldGFjaGVkU3ViSXRlbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gU2F2ZSBwaW5uZWQgaXRlbXNcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5vblBpbm5lZC5zdWJzY3JpYmUoKGl0ZW0pID0+IHtcbiAgICAgICAgLy8gQ29sbGVjdCBwaW5uZWQgZWxlbWVudHMsIHRoZW4gc2VyaWFsaXplIGl0ICh3aXRob3V0IGlkKVxuICAgICAgICBjb25zdCBwaW5uZWRTdWJJdGVtcyA9IHRoaXMuc3ViSXRlbXMuZmlsdGVyKChpKSA9PiBpLmlzUGlubmVkKCkpLm1hcCgoaXRlbSkgPT4gaXRlbS5hc09iamVjdCh7IHdpdGhDaGlsZHJlbjogdHJ1ZSwga2VlcExvY2FsSWQ6IGZhbHNlIH0pKTtcblxuICAgICAgICBpZiAocGlubmVkU3ViSXRlbXMubGVuZ3RoICYmIHRoaXMuX2RlYnVnKVxuICAgICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgYFNhdmluZyAke3Bpbm5lZFN1Ykl0ZW1zLmxlbmd0aH0gcGlubmVkIGl0ZW1zLCBpbiBsb2NhbCBzZXR0aW5nc2AsIHBpbm5lZFN1Ykl0ZW1zKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zYXZlUGFnZVNldHRpbmcoJ21lbnUnLCBwaW5uZWRTdWJJdGVtcywgJ3N1Yi1pdGVtcycpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLmRhdGFTdWJqZWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWRNZW51SXRlbXMoY29uZmlnOiBDb25maWd1cmF0aW9uIHwgbnVsbCwgYWNjb3VudDogQWNjb3VudCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUxvYWRpbmcgbWVudSBpdGVtcy4uLmApO1xuXG4gICAgLy8gU2F2ZSBwcmV2aW91cyBjaGlsZHJlbiBvZiByb290IGl0ZW1zXG4gICAgY29uc3QgZGV0YWNoZWRTdWJJdGVtcyA9ICh0aGlzLnN1Ykl0ZW1zIHx8IFtdKS5jb25jYXQodGhpcy5fc3RhdGljU3ViSXRlbXMgfHwgW10pLnJlZHVjZSgocmVzLCByb290SXRlbSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSByb290SXRlbS5jaGlsZHJlbjtcbiAgICAgIGlmIChpc0VtcHR5QXJyYXkoY2hpbGRyZW4pKSByZXR1cm4gcmVzO1xuICAgICAgLy8gRGV0YWNoIGFsbCByb290IGNoaWxkcmVuXG4gICAgICByb290SXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IChjaGlsZC5wYXJlbnQgPSBudWxsKSk7XG4gICAgICAvLyBSZXR1cm4gcm9vdCBjaGlsZHJlblxuICAgICAgcmV0dXJuIHJlcy5jb25jYXQoY2hpbGRyZW4pO1xuICAgIH0sIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgfHwgW10pO1xuXG4gICAgLy8gUmVzZXQgYmFzZSByb290IGl0ZW1zIChjbGVhbiBpdGVtcyBhZGRlZCBieSBjb25maWcpXG4gICAgbGV0IGl0ZW1zOiBNZW51SXRlbVtdID0gdGhpcy5fc3RhdGljSXRlbXMuc2xpY2UoKTtcblxuICAgIC8vIENvbmNhdCBjb25maWcncyBpdGVtc1xuICAgIGNvbnN0IGNvbmZpZ1ZhbHVlOiBzdHJpbmcgPSBjb25maWc/LmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuTUVOVV9JVEVNUyk7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayhjb25maWdWYWx1ZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0l0ZW1zID0gSlNPTi5wYXJzZShjb25maWdWYWx1ZSkgYXMgSU1lbnVJdGVtW107XG4gICAgICAgIGl0ZW1zID0gKGNvbmZpZ0l0ZW1zIHx8IFtdKS5yZWR1Y2UoKHJlczogTWVudUl0ZW1bXSwgc291cmNlKSA9PiB7XG4gICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZnJvbU9iamVjdCh7IHN0YXRpYzogdHJ1ZSwgLi4uc291cmNlIH0sIHsgY29tcHV0ZUlkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgLy8gU2tpcCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgIGlmIChyZXMuZmluZCgoaSkgPT4gTWVudUl0ZW1zLmlzU2FtZShpLCBpdGVtKSkpIHJldHVybiByZXM7XG5cbiAgICAgICAgICAvLyBSZXVzZSBleGlzdGluZyBpZCwgaWYgcG9zc2libGVcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0l0ZW0gPSB0aGlzLmRhdGE/LmZpbmQoKGkpID0+IE1lbnVJdGVtcy5pc1NhbWUoaSwgaXRlbSkpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uaWQgPSBleGlzdGluZ0l0ZW0uaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW0uYWZ0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVzLmZpbmRJbmRleCgoaSkgPT4gaS50aXRsZSA9PT0gaXRlbS5hZnRlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgaW5kZXggKyAxKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoaXRlbSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHJlcy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlcy5maW5kSW5kZXgoKGkpID0+IGkudGl0bGUgPT09IGl0ZW0uYmVmb3JlKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcy5zbGljZSgwLCBpbmRleCkuY29uY2F0KGl0ZW0pLmNvbmNhdChyZXMuc2xpY2UoaW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoaXRlbSk7XG4gICAgICAgIH0sIGl0ZW1zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH1JbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gJyR7Q09SRV9DT05GSUdfT1BUSU9OUy5NRU5VX0lURU1TLmtleX0nLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBtZW51IGl0ZW1gLCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBpdGVtIHVzaW5nIGFjY291bnQgcmlnaHRzXG4gICAgY29uc3Qgb3B0cyA9IHsgZGVidWc6IHRoaXMuX2RlYnVnIH07XG4gICAgaXRlbXMgPSBpdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gTWVudUl0ZW1zLmNoZWNrSWZWaXNpYmxlKGl0ZW0sIGFjY291bnQsIGNvbmZpZywgb3B0cykpXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUgdXNpbmcgYSBjb25maWcgcHJvcGVydHlcbiAgICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayhpdGVtLnRpdGxlUHJvcGVydHkpICYmIGNvbmZpZykge1xuICAgICAgICAgIGl0ZW0udGl0bGUgPSBjb25maWcucHJvcGVydGllc1tpdGVtLnRpdGxlUHJvcGVydHldIHx8IGl0ZW0udGl0bGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1Gb3VuZCAke2l0ZW1zLmxlbmd0aH0gdmlzaWJsZSByb290IGl0ZW1zLi4uYCk7XG5cbiAgICAvLyBSZS1hdHRhY2ggc3ViIG1lbnUgaXRlbXNcbiAgICBpZiAodGhpcy5zdWJNZW51RW5hYmxlZCAmJiBkZXRhY2hlZFN1Ykl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKGFjY291bnQpIHtcbiAgICAgICAgdGhpcy5fYWRkU3ViTWVudUl0ZW1zKGRldGFjaGVkU3ViSXRlbXMsIHsgc2tpcElmRXhpc3RzOiBmYWxzZSwgYXZhaWxhYmxlUGFyZW50czogZGV0YWNoZWRTdWJJdGVtcy5jb25jYXQoaXRlbXMpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IGRldGFjaGVkU3ViSXRlbXM7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIF9hZGRTdWJNZW51SXRlbXMoc291cmNlczogTWVudUl0ZW1bXSwgb3B0cz86IHsgc2tpcElmRXhpc3RzPzogYm9vbGVhbjsgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW10gfSkge1xuICAgIHJldHVybiBzb3VyY2VzLm1hcCgoc291cmNlKSA9PiB0aGlzLl9hZGRTdWJNZW51SXRlbShzb3VyY2UsIG9wdHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFN1Yk1lbnVJdGVtKG5ld0l0ZW06IE1lbnVJdGVtLCBvcHRzPzogeyBza2lwSWZFeGlzdHM/OiBib29sZWFuOyBhdmFpbGFibGVQYXJlbnRzPzogTWVudUl0ZW1bXSB9KSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIHNraXBJZkV4aXN0czogdHJ1ZSxcbiAgICAgIC4uLm9wdHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHBhdGhQYXJhbSA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcblxuICAgIC8vIEZpbmQgaWYgaXRlbSBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0obmV3SXRlbSwgb3B0cz8uYXZhaWxhYmxlUGFyZW50cyk7XG4gICAgaWYgKGV4aXN0aW5nSXRlbSkge1xuICAgICAgLy8gTm8gY2hhbmdlc1xuICAgICAgaWYgKG9wdHMuc2tpcElmRXhpc3RzICYmIE1lbnVJdGVtcy5pc1NhbWUoZXhpc3RpbmdJdGVtLCBuZXdJdGVtKSAmJiBleGlzdGluZ0l0ZW0udmlzaWJsZSkge1xuICAgICAgICAvLyBERUJVR1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVNraXBwaW5nIHN1YiBpdGVtIChzYW1lIHZpc2libGUgaXRlbSBhbHJlYWR5IGV4aXN0KWAsIG5ld0l0ZW0pO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJdGVtO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVVwZGF0aW5nIGV4aXN0aW5nIHN1YiBpdGVtICNgLCBleGlzdGluZ0l0ZW0uaWQpO1xuXG4gICAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGl0ZW0sIGJ1dCBrZWVwIHRoZSBleGlzdGluZyBpZFxuICAgICAgaWYgKG5ld0l0ZW0gIT09IGV4aXN0aW5nSXRlbSkge1xuICAgICAgICBuZXdJdGVtLmlkID0gZXhpc3RpbmdJdGVtLmlkO1xuICAgICAgICBuZXdJdGVtLiRjaGlsZHJlbiA9IGV4aXN0aW5nSXRlbS4kY2hpbGRyZW47XG4gICAgICAgIG5ld0l0ZW0ucGlubmVkID0gZXhpc3RpbmdJdGVtLnBpbm5lZDtcbiAgICAgICAgbmV3SXRlbS5zdGF0aWMgPSBleGlzdGluZ0l0ZW0uc3RhdGljO1xuICAgICAgICBpZiAobmV3SXRlbS5waW5uZWQgfHwgbmV3SXRlbS5zdGF0aWMgfHwgZXhpc3RpbmdJdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgLy8gSWYgbG9hZGluZywga2VlcCBleGlzdGluZyB0aXRsZSBpZiBwaW5uZWQgKGF2b2lkIHRvIHNob3cgc2tlbGV0b24pXG4gICAgICAgICAgbmV3SXRlbS50aXRsZSA9IG5ld0l0ZW0udGl0bGUgfHwgZXhpc3RpbmdJdGVtLnRpdGxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0l0ZW0udGl0bGUgPSBpc05vdE5pbChuZXdJdGVtLnRpdGxlKSA/IG5ld0l0ZW0udGl0bGUgOiBleGlzdGluZ0l0ZW0udGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXV0byBzZXQgaWNvbiwgZm9yIGV4cGFuZCBhY3Rpb25cbiAgICAgICAgaWYgKGV4aXN0aW5nSXRlbS5hY3Rpb24gPT09ICdleHBhbmQnKSB7XG4gICAgICAgICAgbmV3SXRlbS5pY29uID0gbnVsbDtcbiAgICAgICAgICBuZXdJdGVtLm1hdEljb24gPSBleGlzdGluZ0l0ZW0uZXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGl0ZW0ncyBpZCAoaWYgbmVlZClcbiAgICBlbHNlIGlmIChpc05pbChuZXdJdGVtLmlkKSkge1xuICAgICAgbmV3SXRlbS5pZCA9IHRoaXMuX2NvbXB1dGVOZXdJZCgpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgaWNvbiBmb3IgZXhwYW5kIGFjdGlvblxuICAgIGlmIChuZXdJdGVtLmFjdGlvbiA9PT0gJ2V4cGFuZCcgJiYgIW5ld0l0ZW0ubWF0SWNvbikge1xuICAgICAgbmV3SXRlbS5tYXRJY29uID0gJ2V4cGFuZF9tb3JlJztcbiAgICB9XG5cbiAgICAvLyBJZiB2aXNpYmxlLCBnZXQgdGhlIHBhcmVudCB3aGVyZSB0byBhdHRhY2ggdGhlIGl0ZW1cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9maW5kUGFyZW50KG5ld0l0ZW0sIG9wdHM/LmF2YWlsYWJsZVBhcmVudHMpO1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmV4cGFuZGVkKSB7XG4gICAgICAvLyBBdHRhY2ggaXRlbSB0byBwYXJlbnRcbiAgICAgIHRoaXMuX2F0dGFjaE1lbnVUb1BhcmVudChwYXJlbnQsIG5ld0l0ZW0pO1xuXG4gICAgICAvLyBVcGRhdGUgZGV0YWNoZWQgaXRlbXMgOlxuICAgICAgLy8gLSBleGNsdWRlZCBuZXcgaXRlbVxuICAgICAgLy8gLSBhdHRhY2ggYW5kIGV4Y2x1ZGUgdGhvc2UgdGhhbiBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIG5ldyBpdGVtXG4gICAgICAvLyBTZWFyY2ggaW4gZGV0YWNoZWQgaXRlbXMgb25lIGhhdmUgbmV3SXRlbSBhcyBwYXJlbnRcbiAgICAgIGlmIChuZXdJdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yID0gbmV3SXRlbS5hbmNlc3RvcjtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IHRoaXMuX2RldGFjaGVkU3ViSXRlbXMuY29uY2F0KC4uLm5ld0l0ZW0uY2hpbGRyZW4pLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gRXhjbHVkZWQgbmV3bHkgYWRkIGl0ZW1cbiAgICAgICAgICBpZiAoaXRlbS5pZCA9PT0gbmV3SXRlbS5pZCkgcmV0dXJuIHJlcztcblxuICAgICAgICAgIC8vIElmIHNvbWUgZGV0YWNoZWQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaXRlbTogZG8gaXRcbiAgICAgICAgICBpZiAoTWVudUl0ZW1zLmNoZWNrSWZTdWJNZW51VmlzaWJsZShpdGVtLCBwYXRoUGFyYW0pKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9maW5kUGFyZW50KGl0ZW0sIFthbmNlc3Rvcl0pO1xuICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgaXRlbSdzIGNoaWxkcmVuXG4gICAgICAgICAgICAgIGNvbnN0IGRldGFjaGVkQ2hpbGRyZW4gPSB0aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMocGF0aFBhcmFtLCBpdGVtLmNoaWxkcmVuIHx8IFtdKTtcblxuICAgICAgICAgICAgICAvLyBBdHRhY2ggaXRlbVxuICAgICAgICAgICAgICB0aGlzLl9hdHRhY2hNZW51VG9QYXJlbnQocGFyZW50LCBpdGVtKTtcblxuICAgICAgICAgICAgICAvLyBSZW1lbWJlciBkZXRhY2hlZCBjaGlsZHJlblxuICAgICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdCguLi5kZXRhY2hlZENoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZXRhY2ggKGlmIG5lZWQpXG4gICAgICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoaXRlbSk7XG5cbiAgICAgICAgICAvLyBBZGQgdG8gZGV0YWNoZWQgaXRlbXNcbiAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChpdGVtKTtcbiAgICAgICAgfSwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gZGV0YWNoZWQgZWxlbWVudHNcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IHRoaXMuX2RldGFjaGVkU3ViSXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBuZXdJdGVtLmlkKTtcblxuICAgICAgICAvLyBEZXRhY2ggY2hpbGRyZW5cbiAgICAgICAgbmV3SXRlbS5jaGlsZHJlbi5mb3JFYWNoKChpdGVtKSA9PiB0aGlzLl9kZXRhY2hUb1BhcmVudChpdGVtKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBvciB1cGRhdGUgZGV0YWNoZWQgaXRlbVxuICAgICAgY29uc3QgZGV0YWNoZWRJbmRleCA9IGlzTm90TmlsKG5ld0l0ZW0uaWQpID8gdGhpcy5fZGV0YWNoZWRTdWJJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IG5ld0l0ZW0uaWQpIDogLTE7XG4gICAgICBpZiAoZGV0YWNoZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtc1tkZXRhY2hlZEluZGV4XSA9IG5ld0l0ZW07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgbGlzdGVuaW5nIHJvdXRlXG4gICAgaWYgKCF0aGlzLl8kbGlzdGVuUm91dGUudmFsdWUpIHRoaXMuXyRsaXN0ZW5Sb3V0ZS5uZXh0KHRydWUpO1xuXG4gICAgcmV0dXJuIG5ld0l0ZW07XG4gIH1cblxuICBwcml2YXRlIF9jb21wdXRlTmV3SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudGVyKys7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVTdWJNZW51SXRlbShpdGVtOiBNZW51SXRlbSkge1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0oaXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSXRlbSkge1xuICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoZXhpc3RpbmdJdGVtKTtcbiAgICAgIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGV0YWNoU3ViTWVudUl0ZW1zKGN1cnJlbnRQYXRoUGFyYW0/OiBNZW51UGF0aFBhcmFtLCBzdWJJdGVtcz86IE1lbnVJdGVtW10pIHtcbiAgICBjdXJyZW50UGF0aFBhcmFtID0gY3VycmVudFBhdGhQYXJhbSA/IGN1cnJlbnRQYXRoUGFyYW0gOiBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gKHN1Ykl0ZW1zIHx8IHRoaXMuc3ViSXRlbXMpLnJlZHVjZSgocmVzLCBzdWJJdGVtKSA9PiB7XG4gICAgICAvLyBOb3QgdmlzaWJsZSA9PiBzaG91bGQgYmUgZGV0YWNoXG4gICAgICBpZiAoIU1lbnVJdGVtcy5jaGVja0lmU3ViTWVudVZpc2libGUoc3ViSXRlbSwgY3VycmVudFBhdGhQYXJhbSkpIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoc3ViSXRlbSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoc3ViSXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBWaXNpYmxlOiBjaGVjayBjaGlsZHJlblxuICAgICAgcmV0dXJuIHJlcy5jb25jYXQodGhpcy5fZGV0YWNoU3ViTWVudUl0ZW1zKGN1cnJlbnRQYXRoUGFyYW0sIHN1Ykl0ZW0uY2hpbGRyZW4pKTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBwcml2YXRlIF9kZXRhY2hUb1BhcmVudChpdGVtOiBNZW51SXRlbSkge1xuICAgIGlmICghaXRlbT8ucGFyZW50KSByZXR1cm47IC8vIFNraXAgaWYgYWxyZWFkeSBkZXRhY2hlZFxuICAgIGxldCBjaGlsZHJlbiA9IGl0ZW0ucGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuXG4gICAgLy8gUmVtb3ZlIGZyb20gcGFyZW50IGNoaWxkcmVuXG4gICAgY29uc3QgaW5kZXhJblBhcmVudCA9IGNoaWxkcmVuLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4SW5QYXJlbnQgIT09IC0xKSB7XG4gICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLnNsaWNlKCk7IC8vIENvcHkgb3JpZ2luYWwgYXJyYXksIGJlY2F1c2UgaXQgY2FuIGJlIHVzZWQgaW4gYSBsb29wXG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXhJblBhcmVudCwgMSk7XG4gICAgICBpdGVtLnBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGl0ZW0ucGFyZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRFeGlzdGluZ0l0ZW0oc2VhcmNoSXRlbTogSU1lbnVJdGVtLCBpdGVtcz86IE1lbnVJdGVtW10sIHJlY3Vyc2l2ZSA9IHRydWUpOiBNZW51SXRlbSB7XG4gICAgaXRlbXMgPSBpdGVtcyB8fCBbLi4udGhpcy5fZGV0YWNoZWRTdWJJdGVtcywgLi4udGhpcy5kYXRhXTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm90IGZvdW5kXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoTWVudUl0ZW1zLmlzU2FtZUlkT3JQYXRoQW5kUGFyYW1zKHNlYXJjaEl0ZW0sIGl0ZW0pKSByZXR1cm4gaXRlbTtcbiAgICAgIGlmIChyZWN1cnNpdmUgJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0oc2VhcmNoSXRlbSwgaXRlbS5jaGlsZHJlbik7XG4gICAgICAgIGlmIChjaGlsZCkgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQYXJlbnQoY2hpbGRJdGVtOiBNZW51SXRlbSwgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW10pOiBNZW51SXRlbSB7XG4gICAgaWYgKCFjaGlsZEl0ZW0/LnBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkSXRlbS5wYXJlbnQpIHJldHVybiBjaGlsZEl0ZW0ucGFyZW50O1xuXG4gICAgYXZhaWxhYmxlUGFyZW50cyA9IGF2YWlsYWJsZVBhcmVudHMgfHwgWy4uLnRoaXMuX2RldGFjaGVkU3ViSXRlbXMsIC4uLnRoaXMuZGF0YV07XG5cbiAgICByZXR1cm4gYXZhaWxhYmxlUGFyZW50cy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtPy5wYXRoKSByZXR1cm4gcmVzO1xuXG4gICAgICAvLyBBIGZvdW5kIGl0ZW0gYWxyZWFkeSBtYXRjaCB3aXRoIHRoZSBtZW51SXRlbS5wYXJlbnRQYXRoIDoga2VlcCBpdCBhcyBpdFxuICAgICAgLy8gVGhlcmUgaXMgYSBmb3VuZCBjYW5kaWRhdGUgdGhhdCBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNhbmRpZGF0ZSA6IGtlZXAgaXRcbiAgICAgIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoY2hpbGRJdGVtLCByZXMpKSByZXR1cm4gcmVzO1xuXG4gICAgICAvLyBJZiB0aGUgbWVudSBpdGVtIGhhcyBleHBsaWNpdCBwYXJlbnRQYXRoIGFuZCBpdHMgcGF0aCBhbmQgcGF0aCBwYXJhbSBhcmUgdGhlIHNhbWUgYXMgdGhlIGNhbmRpZGF0ZSAgOiB1c2UgaXQgYXMgcGFyZW50XG4gICAgICBpZiAoTWVudUl0ZW1zLmlzUGFyZW50KGNoaWxkSXRlbSwgaXRlbSkpIHJldHVybiBpdGVtO1xuXG4gICAgICBpZiAoIXJlcyAmJiBpdGVtLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRQYXJlbnQoY2hpbGRJdGVtLCBpdGVtLmNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoTWVudVRvUGFyZW50KHBhcmVudDogTWVudUl0ZW0sIGNoaWxkOiBNZW51SXRlbSkge1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9QXR0YWNoIHN1Yi1tZW51IHske01lbnVJdGVtcy5nZXRVcmwoY2hpbGQpfX0gdG8gcGFyZW50IHske01lbnVJdGVtcy5nZXRVcmwocGFyZW50KX19YCk7XG5cbiAgICAvLyBBdm9pZCB0byBrZWVwIGlkZW50aWNhbCBtZW51IGl0ZW0gKHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3IGNoaWxkIG1lbnUgaXRlbSlcbiAgICAvL2lmICghcGFyZW50Py4kY2hpbGRyZW4pIHBhcmVudC4kY2hpbGRyZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+KFtdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY2hpbGRyZW4uZmluZEluZGV4KChpdGVtKSA9PiBNZW51SXRlbXMuaXNTYW1lSWRPclBhdGhBbmRQYXJhbXMoaXRlbSwgY2hpbGQpKTtcblxuICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbGVtZW50XG4gICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoY2hpbGRyZW5bZXhpc3RpbmdJbmRleF0gIT09IGNoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuW2V4aXN0aW5nSW5kZXhdID0gY2hpbGQ7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXG4gICAgICAvLyBTb3J0IGJ5IHRhYiAob3IgaWQpXG4gICAgICBwYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbi5zb3J0KE1lbnVJdGVtcy5zb3J0QnlUYWJPcklkKTtcbiAgICAgIGNoaWxkLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|