@sumaris-net/ngx-components 18.23.63 → 21.0.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 +2 -0
- package/doc/build.md +3 -5
- package/fesm2022/sumaris-net.ngx-components.mjs +2382 -2150
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +15 -15
- package/src/assets/environments/environment-test.json +2 -2
- package/src/assets/i18n/fr.json +6 -5
- 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/_material.globals.scss +4 -1
- package/src/theme/_material.scss +16 -13
- package/src/theme/_mixins.scss +7 -1
- package/src/theme/_ngx-components.forms.scss +87 -84
- package/src/theme/_ngx-components.globals.scss +2 -0
- package/src/theme/_ngx-components.scss +19 -4
- package/src/theme/_ngx-components.table.scss +31 -26
- package/src/theme/_ngx-components.tabs.scss +16 -14
- package/src/theme/_responsive.scss +2 -0
- package/src/theme/_roboto.scss +3 -0
- package/src/theme/_theme.scss +11 -14
- package/src/theme/_theme.variables.scss +6 -1
- 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 -403
- 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/users/person.filter.mjs +0 -157
- package/esm2022/src/app/admin/users/person.service.mjs +0 -226
- package/esm2022/src/app/admin/users/person.validator.mjs +0 -78
- package/esm2022/src/app/admin/users/users-select.modal.mjs +0 -167
- package/esm2022/src/app/admin/users/users.mjs +0 -502
- package/esm2022/src/app/admin/users/users.module.mjs +0 -59
- package/esm2022/src/app/admin/users/users.utils.mjs +0 -29
- package/esm2022/src/app/core/about/about.modal.mjs +0 -119
- package/esm2022/src/app/core/about/about.module.mjs +0 -22
- package/esm2022/src/app/core/account/account.module.mjs +0 -75
- package/esm2022/src/app/core/account/account.page.mjs +0 -426
- package/esm2022/src/app/core/account/new-token.form.mjs +0 -109
- package/esm2022/src/app/core/account/new-token.modal.mjs +0 -66
- package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -63
- 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 -150
- package/esm2022/src/app/core/account/token.table.mjs +0 -160
- 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 -89
- package/esm2022/src/app/core/core.module.mjs +0 -157
- package/esm2022/src/app/core/core.testing.module.mjs +0 -128
- package/esm2022/src/app/core/form/array/form-array.mjs +0 -328
- 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 -97
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -111
- 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 -268
- 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 -748
- package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
- package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -33
- package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -190
- package/esm2022/src/app/core/form/form-container.class.mjs +0 -347
- package/esm2022/src/app/core/form/form.class.mjs +0 -342
- package/esm2022/src/app/core/form/form.module.mjs +0 -77
- package/esm2022/src/app/core/form/form.utils.mjs +0 -238
- package/esm2022/src/app/core/form/list/list.form.mjs +0 -243
- package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
- package/esm2022/src/app/core/form/properties/properties-file.service.mjs +0 -133
- package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -397
- package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -85
- package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -267
- package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -304
- package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -70
- package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -103
- package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
- package/esm2022/src/app/core/form/text/testing/text-form.testing.mjs +0 -42
- package/esm2022/src/app/core/form/text/testing/text-form.testing.module.mjs +0 -25
- package/esm2022/src/app/core/form/text/text-form.component.mjs +0 -205
- package/esm2022/src/app/core/form/text/text-form.module.mjs +0 -31
- 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 -22
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -164
- package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -32
- package/esm2022/src/app/core/form/username/username.form.mjs +0 -55
- 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 -781
- package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
- package/esm2022/src/app/core/home/home.mjs +0 -472
- package/esm2022/src/app/core/home/home.module.mjs +0 -54
- 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 -394
- package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
- package/esm2022/src/app/core/menu/menu.component.mjs +0 -273
- package/esm2022/src/app/core/menu/menu.model.mjs +0 -328
- package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
- package/esm2022/src/app/core/menu/menu.service.mjs +0 -666
- package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -113
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -51
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -165
- 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 -350
- package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -36
- package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
- package/esm2022/src/app/core/register/register.form.mjs +0 -197
- 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 -1403
- package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
- package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -499
- package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -224
- package/esm2022/src/app/core/services/base58.mjs +0 -83
- package/esm2022/src/app/core/services/config/core.config.mjs +0 -293
- 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 -54
- package/esm2022/src/app/core/services/local-settings.service.mjs +0 -540
- package/esm2022/src/app/core/services/model/account.model.mjs +0 -192
- package/esm2022/src/app/core/services/model/config.model.mjs +0 -111
- 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 -347
- package/esm2022/src/app/core/services/model/filter.model.mjs +0 -169
- 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/node-feature.model.mjs +0 -31
- package/esm2022/src/app/core/services/model/peer.model.mjs +0 -114
- package/esm2022/src/app/core/services/model/person.model.mjs +0 -118
- package/esm2022/src/app/core/services/model/referential.model.mjs +0 -207
- package/esm2022/src/app/core/services/model/settings.model.mjs +0 -6
- package/esm2022/src/app/core/services/model/token.model.mjs +0 -57
- package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -234
- package/esm2022/src/app/core/services/network.service.mjs +0 -759
- package/esm2022/src/app/core/services/network.types.mjs +0 -2
- package/esm2022/src/app/core/services/network.utils.mjs +0 -35
- 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 -58
- package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -36
- package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
- package/esm2022/src/app/core/services/platform.service.mjs +0 -780
- 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 -450
- 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 -46
- 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 -57
- 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 -23
- package/esm2022/src/app/core/settings/settings.page.mjs +0 -406
- package/esm2022/src/app/core/table/async-table.class.mjs +0 -1882
- package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -137
- package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -120
- 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 -415
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -407
- 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 -1918
- package/esm2022/src/app/core/table/table.model.mjs +0 -21
- package/esm2022/src/app/core/table/table.module.mjs +0 -51
- package/esm2022/src/app/core/table/table.pipes.mjs +0 -76
- package/esm2022/src/app/core/table/table.utils.mjs +0 -34
- package/esm2022/src/app/core/table/testing/nested-table.testing.mjs +0 -326
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
- package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -342
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -47
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -322
- package/esm2022/src/app/shared/alerts.mjs +0 -243
- package/esm2022/src/app/shared/audio/audio.mjs +0 -255
- 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/base64.utils.mjs +0 -59
- package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
- package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -10
- package/esm2022/src/app/shared/constants.mjs +0 -18
- package/esm2022/src/app/shared/dates.mjs +0 -212
- package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
- package/esm2022/src/app/shared/debug/debug.component.mjs +0 -44
- 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/autoresize.directive.mjs +0 -75
- package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -30
- package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +0 -35
- package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +0 -55
- package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +0 -206
- package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +0 -204
- package/esm2022/src/app/shared/directives/directives.module.mjs +0 -53
- 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 -96
- package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
- package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +0 -43
- package/esm2022/src/app/shared/events.mjs +0 -64
- package/esm2022/src/app/shared/file/csv.utils.mjs +0 -97
- package/esm2022/src/app/shared/file/file.service.mjs +0 -118
- package/esm2022/src/app/shared/file/file.utils.mjs +0 -117
- 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 -29
- package/esm2022/src/app/shared/file/url.utils.mjs +0 -213
- package/esm2022/src/app/shared/focusable.mjs +0 -6
- package/esm2022/src/app/shared/form/field.component.mjs +0 -388
- package/esm2022/src/app/shared/form/field.model.mjs +0 -100
- package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
- package/esm2022/src/app/shared/forms.mjs +0 -593
- package/esm2022/src/app/shared/functions.mjs +0 -825
- package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -94
- 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 -85
- package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -214
- package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -68
- package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
- package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -147
- package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
- package/esm2022/src/app/shared/html.utils.mjs +0 -35
- package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -452
- 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 -92
- 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 -117
- package/esm2022/src/app/shared/inputs.mjs +0 -281
- 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/markdown/markdown.component.mjs +0 -321
- package/esm2022/src/app/shared/markdown/markdown.directive.mjs +0 -34
- package/esm2022/src/app/shared/markdown/markdown.modal.mjs +0 -99
- package/esm2022/src/app/shared/markdown/markdown.module.mjs +0 -87
- package/esm2022/src/app/shared/markdown/markdown.service.mjs +0 -204
- package/esm2022/src/app/shared/markdown/markdown.utils.mjs +0 -87
- package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +0 -55
- package/esm2022/src/app/shared/markdown/testing/markdown.testing.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 -1356
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -81
- 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 -242
- 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 -70
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -374
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -83
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -74
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -843
- package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -151
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -79
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -473
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -850
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -140
- 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 -61
- package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -16
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -283
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -85
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -319
- package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +0 -471
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -231
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -68
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -138
- package/esm2022/src/app/shared/material/material.animations.mjs +0 -200
- package/esm2022/src/app/shared/material/material.config.mjs +0 -3
- package/esm2022/src/app/shared/material/material.module.mjs +0 -224
- 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 -379
- 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/test/test-component.mjs +0 -264
- package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
- package/esm2022/src/app/shared/modules.mjs +0 -12
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -306
- 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 -104
- package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -251
- package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -25
- package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
- package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -50
- 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/date-from.pipe.mjs +0 -29
- package/esm2022/src/app/shared/pipes/dates.pipe.mjs +0 -18
- package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +0 -23
- package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -34
- 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 -50
- package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -102
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
- package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -65
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
- package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -77
- package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
- package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -17
- package/esm2022/src/app/shared/pipes/observable.pipes.mjs +0 -63
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -304
- package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -148
- package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -177
- package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -183
- 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/pipes/url.pipes.mjs +0 -35
- package/esm2022/src/app/shared/platforms.mjs +0 -81
- package/esm2022/src/app/shared/print/print.service.mjs +0 -305
- package/esm2022/src/app/shared/regexps.mjs +0 -103
- package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +0 -193
- package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +0 -19
- package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +0 -2
- package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -44
- package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
- package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -362
- package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
- package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -144
- package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -118
- 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 -85
- package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
- package/esm2022/src/app/shared/shared.module.mjs +0 -229
- package/esm2022/src/app/shared/shared.testing.module.mjs +0 -108
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -281
- 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 -54
- package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -31
- package/esm2022/src/app/shared/toast/toasts.mjs +0 -134
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -272
- 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 -108
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -216
- 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 -122
- package/esm2022/src/app/shared/validator/validators.mjs +0 -658
- package/esm2022/src/app/shared/version/versions.mjs +0 -81
- package/esm2022/src/app/social/config/social.config.mjs +0 -9
- package/esm2022/src/app/social/feed/feed.component.mjs +0 -317
- package/esm2022/src/app/social/feed/feed.directive.mjs +0 -151
- package/esm2022/src/app/social/feed/feed.model.mjs +0 -60
- package/esm2022/src/app/social/feed/feed.module.mjs +0 -24
- package/esm2022/src/app/social/feed/feed.page.mjs +0 -67
- package/esm2022/src/app/social/feed/feed.service.mjs +0 -222
- package/esm2022/src/app/social/feed/testing/feed.testing.mjs +0 -66
- package/esm2022/src/app/social/feed/testing/feed.testing.module.mjs +0 -23
- package/esm2022/src/app/social/job/job.module.mjs +0 -23
- package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -38
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -241
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -50
- 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 -149
- package/esm2022/src/app/social/message/message.modal.mjs +0 -116
- package/esm2022/src/app/social/message/message.model.mjs +0 -86
- package/esm2022/src/app/social/message/message.module.mjs +0 -25
- package/esm2022/src/app/social/message/message.service.mjs +0 -198
- package/esm2022/src/app/social/social.errors.mjs +0 -11
- package/esm2022/src/app/social/social.module.mjs +0 -22
- package/esm2022/src/app/social/social.testing.module.mjs +0 -72
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -191
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -280
- package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +0 -84
- package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -273
- 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 -24
- package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -512
- package/esm2022/src/environments/environment.class.mjs +0 -69
- package/esm2022/src/environments/environment.loader.mjs +0 -77
- package/esm2022/src/environments/environment.mjs +0 -133
- package/esm2022/sumaris-net.ngx-components.mjs +0 -5
- package/index.d.ts +0 -5
- package/public_api.d.ts +0 -364
- 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/users/person.filter.d.ts +0 -37
- package/src/app/admin/users/person.service.d.ts +0 -61
- package/src/app/admin/users/person.validator.d.ts +0 -23
- package/src/app/admin/users/users-select.modal.d.ts +0 -73
- package/src/app/admin/users/users.d.ts +0 -89
- package/src/app/admin/users/users.module.d.ts +0 -15
- package/src/app/admin/users/users.utils.d.ts +0 -6
- package/src/app/core/about/about.modal.d.ts +0 -44
- package/src/app/core/about/about.module.d.ts +0 -11
- package/src/app/core/account/account.module.d.ts +0 -18
- package/src/app/core/account/account.page.d.ts +0 -93
- package/src/app/core/account/new-token.form.d.ts +0 -30
- package/src/app/core/account/new-token.modal.d.ts +0 -29
- 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 -28
- 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 -29
- package/src/app/core/core.module.d.ts +0 -28
- package/src/app/core/core.testing.module.d.ts +0 -16
- package/src/app/core/form/array/form-array.d.ts +0 -147
- 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 -27
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -38
- 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 -85
- 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 -211
- package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
- package/src/app/core/form/entity/entity.module.d.ts +0 -11
- package/src/app/core/form/entity/tab-editor.class.d.ts +0 -66
- package/src/app/core/form/form-container.class.d.ts +0 -131
- package/src/app/core/form/form.class.d.ts +0 -148
- package/src/app/core/form/form.module.d.ts +0 -15
- package/src/app/core/form/form.utils.d.ts +0 -301
- package/src/app/core/form/list/list.form.d.ts +0 -83
- package/src/app/core/form/list/list.module.d.ts +0 -9
- package/src/app/core/form/properties/properties-file.service.d.ts +0 -26
- package/src/app/core/form/properties/properties.form.d.ts +0 -109
- package/src/app/core/form/properties/properties.module.d.ts +0 -18
- package/src/app/core/form/properties/properties.table.d.ts +0 -73
- package/src/app/core/form/properties/properties.utils.d.ts +0 -59
- package/src/app/core/form/properties/property.validator.d.ts +0 -27
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -22
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
- package/src/app/core/form/text/testing/text-form.testing.d.ts +0 -19
- package/src/app/core/form/text/testing/text-form.testing.module.d.ts +0 -14
- package/src/app/core/form/text/text-form.component.d.ts +0 -66
- package/src/app/core/form/text/text-form.module.d.ts +0 -9
- 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 -81
- package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -10
- 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 -138
- package/src/app/core/graphql/graphql.utils.d.ts +0 -47
- package/src/app/core/home/home.d.ts +0 -135
- package/src/app/core/home/home.module.d.ts +0 -16
- 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 -63
- 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 -163
- package/src/app/core/menu/menu.module.d.ts +0 -12
- package/src/app/core/menu/menu.service.d.ts +0 -93
- 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 -53
- 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 -108
- package/src/app/core/peer/select-peer.module.d.ts +0 -12
- 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 -236
- package/src/app/core/services/auth-guard.service.d.ts +0 -17
- package/src/app/core/services/base-entity-service.class.d.ts +0 -134
- 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 -52
- 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 -65
- package/src/app/core/services/local-settings.service.d.ts +0 -130
- package/src/app/core/services/model/account.model.d.ts +0 -66
- package/src/app/core/services/model/config.model.d.ts +0 -37
- 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 -133
- 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/node-feature.model.d.ts +0 -14
- package/src/app/core/services/model/peer.model.d.ts +0 -35
- package/src/app/core/services/model/person.model.d.ts +0 -39
- package/src/app/core/services/model/referential.model.d.ts +0 -85
- package/src/app/core/services/model/settings.model.d.ts +0 -29
- 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 -62
- package/src/app/core/services/network.service.d.ts +0 -184
- package/src/app/core/services/network.types.d.ts +0 -4
- package/src/app/core/services/network.utils.d.ts +0 -39
- 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 -23
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
- package/src/app/core/services/platform.service.d.ts +0 -126
- 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 -18
- 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 -12
- package/src/app/core/settings/settings.page.d.ts +0 -89
- package/src/app/core/table/async-table.class.d.ts +0 -443
- package/src/app/core/table/column/actions-column.component.d.ts +0 -65
- package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -47
- package/src/app/core/table/column/row-field.component.d.ts +0 -41
- package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -103
- package/src/app/core/table/entities-table-datasource.class.d.ts +0 -102
- 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 -427
- package/src/app/core/table/table.model.d.ts +0 -31
- package/src/app/core/table/table.module.d.ts +0 -14
- package/src/app/core/table/table.pipes.d.ts +0 -30
- package/src/app/core/table/table.utils.d.ts +0 -13
- package/src/app/core/table/testing/nested-table.testing.d.ts +0 -54
- package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
- package/src/app/core/table/testing/table.testing.d.ts +0 -55
- package/src/app/core/table/testing/table.testing.module.d.ts +0 -17
- package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
- package/src/app/core/table/testing/table2.testing.d.ts +0 -53
- package/src/app/shared/alerts.d.ts +0 -55
- package/src/app/shared/audio/audio.d.ts +0 -45
- 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/base64.utils.d.ts +0 -7
- package/src/app/shared/capacitor/keyboard.d.ts +0 -16
- package/src/app/shared/capacitor/plugins.d.ts +0 -8
- package/src/app/shared/constants.d.ts +0 -15
- package/src/app/shared/dates.d.ts +0 -85
- package/src/app/shared/debug/debug-service.class.d.ts +0 -5
- package/src/app/shared/debug/debug.component.d.ts +0 -14
- 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/autoresize.directive.d.ts +0 -20
- package/src/app/shared/directives/autotitle.directive.d.ts +0 -11
- package/src/app/shared/directives/autotooltip.directive.d.ts +0 -14
- package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +0 -17
- package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +0 -29
- package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +0 -67
- package/src/app/shared/directives/directives.module.d.ts +0 -15
- 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 -24
- package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
- package/src/app/shared/directives/throttled-click.directive.d.ts +0 -16
- package/src/app/shared/events.d.ts +0 -29
- package/src/app/shared/file/csv.utils.d.ts +0 -30
- 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/file/url.utils.d.ts +0 -108
- package/src/app/shared/focusable.d.ts +0 -4
- package/src/app/shared/form/field.component.d.ts +0 -83
- package/src/app/shared/form/field.model.d.ts +0 -88
- package/src/app/shared/form/loading-spinner.d.ts +0 -8
- package/src/app/shared/forms.d.ts +0 -170
- package/src/app/shared/functions.d.ts +0 -296
- package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -25
- 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 -34
- 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/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -48
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
- package/src/app/shared/html.utils.d.ts +0 -17
- package/src/app/shared/http/http.utils.d.ts +0 -28
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -139
- 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 -7
- package/src/app/shared/image/image.module.d.ts +0 -8
- package/src/app/shared/image/image.service.d.ts +0 -37
- package/src/app/shared/inputs.d.ts +0 -37
- 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/markdown/markdown.component.d.ts +0 -86
- package/src/app/shared/markdown/markdown.directive.d.ts +0 -13
- package/src/app/shared/markdown/markdown.modal.d.ts +0 -49
- package/src/app/shared/markdown/markdown.module.d.ts +0 -17
- package/src/app/shared/markdown/markdown.service.d.ts +0 -37
- package/src/app/shared/markdown/markdown.utils.d.ts +0 -26
- package/src/app/shared/markdown/testing/markdown.test.d.ts +0 -18
- package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +0 -12
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -74
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -224
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -23
- 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 -48
- 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 -94
- package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -31
- package/src/app/shared/material/chips/chips.module.d.ts +0 -22
- package/src/app/shared/material/chips/material.chips.d.ts +0 -167
- package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
- package/src/app/shared/material/datetime/datetime.module.d.ts +0 -25
- 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 -136
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -38
- 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 -18
- package/src/app/shared/material/duration/duration.utils.d.ts +0 -2
- package/src/app/shared/material/duration/material.duration.d.ts +0 -64
- package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -23
- package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -59
- package/src/app/shared/material/latlong/material.latlong-input.d.ts +0 -93
- package/src/app/shared/material/latlong/material.latlong.d.ts +0 -90
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -21
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -30
- package/src/app/shared/material/material.animations.d.ts +0 -8
- package/src/app/shared/material/material.config.d.ts +0 -3
- package/src/app/shared/material/material.module.d.ts +0 -44
- 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 -89
- 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/test/test-component.d.ts +0 -75
- package/src/app/shared/material/testing/common.test.d.ts +0 -25
- package/src/app/shared/modules.d.ts +0 -9
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -63
- 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 -32
- package/src/app/shared/pipes/arrays.pipe.d.ts +0 -93
- 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 -25
- package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -14
- package/src/app/shared/pipes/date-from.pipe.d.ts +0 -14
- package/src/app/shared/pipes/dates.pipe.d.ts +0 -10
- package/src/app/shared/pipes/display-with.pipe.d.ts +0 -8
- package/src/app/shared/pipes/duration.pipe.d.ts +0 -23
- 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 -50
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
- package/src/app/shared/pipes/maps.pipe.d.ts +0 -23
- package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
- package/src/app/shared/pipes/math.pipes.d.ts +0 -26
- package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
- package/src/app/shared/pipes/number-format.pipe.d.ts +0 -9
- package/src/app/shared/pipes/observable.pipes.d.ts +0 -25
- package/src/app/shared/pipes/pipes.module.d.ts +0 -36
- package/src/app/shared/pipes/property.pipes.d.ts +0 -46
- package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
- package/src/app/shared/pipes/string.pipes.d.ts +0 -67
- 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/pipes/url.pipes.d.ts +0 -27
- package/src/app/shared/platforms.d.ts +0 -16
- package/src/app/shared/print/print.service.d.ts +0 -94
- package/src/app/shared/regexps.d.ts +0 -32
- package/src/app/shared/rx-state/rx-state.decorators.d.ts +0 -33
- package/src/app/shared/rx-state/rx-state.module.d.ts +0 -10
- package/src/app/shared/rx-state/rx-state.types.d.ts +0 -5
- package/src/app/shared/services/entity-service.class.d.ts +0 -117
- package/src/app/shared/services/job.utils.d.ts +0 -20
- package/src/app/shared/services/memory-entity-service.class.d.ts +0 -87
- package/src/app/shared/services/progress-bar.service.d.ts +0 -20
- package/src/app/shared/services/startable-observable-service.class.d.ts +0 -51
- package/src/app/shared/services/startable-service.class.d.ts +0 -38
- 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 -17
- package/src/app/shared/shared-routing.module.d.ts +0 -23
- package/src/app/shared/shared.module.d.ts +0 -33
- package/src/app/shared/shared.testing.module.d.ts +0 -20
- package/src/app/shared/storage/storage-explorer.component.d.ts +0 -60
- 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 -12
- package/src/app/shared/toast/toasts.d.ts +0 -16
- package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
- package/src/app/shared/toolbar/toolbar.d.ts +0 -70
- package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
- package/src/app/shared/types.d.ts +0 -45
- 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 -41
- package/src/app/shared/upload-file/upload-file.component.d.ts +0 -50
- 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 -145
- package/src/app/shared/version/versions.d.ts +0 -26
- package/src/app/social/config/social.config.d.ts +0 -4
- package/src/app/social/feed/feed.component.d.ts +0 -91
- package/src/app/social/feed/feed.directive.d.ts +0 -32
- package/src/app/social/feed/feed.model.d.ts +0 -69
- package/src/app/social/feed/feed.module.d.ts +0 -13
- package/src/app/social/feed/feed.page.d.ts +0 -24
- package/src/app/social/feed/feed.service.d.ts +0 -85
- package/src/app/social/feed/testing/feed.testing.d.ts +0 -23
- package/src/app/social/feed/testing/feed.testing.module.d.ts +0 -12
- package/src/app/social/job/job.module.d.ts +0 -12
- package/src/app/social/job/progression/job-progression.component.d.ts +0 -24
- package/src/app/social/job/progression/job-progression.icon.d.ts +0 -63
- package/src/app/social/job/progression/job-progression.list.d.ts +0 -20
- 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 -47
- package/src/app/social/message/message.model.d.ts +0 -36
- package/src/app/social/message/message.module.d.ts +0 -14
- package/src/app/social/message/message.service.d.ts +0 -44
- package/src/app/social/social.errors.d.ts +0 -10
- package/src/app/social/social.module.d.ts +0 -20
- package/src/app/social/social.testing.module.d.ts +0 -14
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -47
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -77
- package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +0 -37
- package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -44
- 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 -41
- 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 -14
- package/src/app/social/user-event/user-event.service.d.ts +0 -124
- package/src/environments/environment.class.d.ts +0 -86
- 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,780 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
|
|
3
|
-
import { Toasts } from '../../shared/toast/toasts';
|
|
4
|
-
import { BehaviorSubject, combineLatest, from, Observable, of, Subscription, timer } from 'rxjs';
|
|
5
|
-
import { catchError, skip, tap } from 'rxjs/operators';
|
|
6
|
-
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
7
|
-
import { CORE_CONFIG_OPTIONS } from './config/core.config';
|
|
8
|
-
import { NotificationVisibility } from '@awesome-cordova-plugins/downloader/ngx';
|
|
9
|
-
import { StartableService } from '../../shared/services/startable-service.class';
|
|
10
|
-
import { isMobile, isWindows } from '../../shared/platforms';
|
|
11
|
-
import { VersionUtils } from '../../shared/version/versions';
|
|
12
|
-
import { FilesUtils, MimeTypes } from '../../shared/file/file.utils';
|
|
13
|
-
import { UriUtils } from '../../shared/file/uri.utils';
|
|
14
|
-
import { SplashScreen } from '@capacitor/splash-screen';
|
|
15
|
-
import { StatusBar, Style } from '@capacitor/status-bar';
|
|
16
|
-
import { Browser } from '@capacitor/browser';
|
|
17
|
-
import { Keyboard } from '@capacitor/keyboard';
|
|
18
|
-
import { CapacitorPlugins } from '../../shared/capacitor/plugins';
|
|
19
|
-
import { locale as momentLocale } from 'moment';
|
|
20
|
-
import { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';
|
|
21
|
-
import { Clipboard } from '@capacitor/clipboard';
|
|
22
|
-
import { EdgeToEdge } from '@capawesome/capacitor-android-edge-to-edge-support';
|
|
23
|
-
import { getColorContrast, getColorShade, getColorTint, hexToRgbArray, isLightColor, mixHex } from '../../shared/graph/colors.utils';
|
|
24
|
-
import { Peer } from './model/peer.model';
|
|
25
|
-
import { UrlUtils } from '../../shared/file/url.utils';
|
|
26
|
-
import * as i0 from "@angular/core";
|
|
27
|
-
import * as i1 from "@ionic/angular";
|
|
28
|
-
import * as i2 from "@angular/cdk/platform";
|
|
29
|
-
import * as i3 from "@angular/cdk/clipboard";
|
|
30
|
-
import * as i4 from "@ngx-translate/core";
|
|
31
|
-
import * as i5 from "@angular/material-moment-adapter";
|
|
32
|
-
import * as i6 from "./storage/entities-storage.service";
|
|
33
|
-
import * as i7 from "./local-settings.service";
|
|
34
|
-
import * as i8 from "./network.service";
|
|
35
|
-
import * as i9 from "./account.service";
|
|
36
|
-
import * as i10 from "./config.service";
|
|
37
|
-
import * as i11 from "ionic-cache";
|
|
38
|
-
import * as i12 from "../../shared/audio/audio";
|
|
39
|
-
import * as i13 from "@awesome-cordova-plugins/downloader/ngx";
|
|
40
|
-
import * as i14 from "../../../environments/environment.class";
|
|
41
|
-
export const AndroidOsEnvironment = Object.freeze({
|
|
42
|
-
DIRECTORY_DOWNLOADS: 'Download',
|
|
43
|
-
DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
|
|
44
|
-
// TODO: find value for this. See https://developer.android.com/reference/android/os/Environment#getExternalStorageState(java.io.File)
|
|
45
|
-
// DIRECTORY_MUSIC,
|
|
46
|
-
// DIRECTORY_PODCASTS,
|
|
47
|
-
// DIRECTORY_RINGTONES,
|
|
48
|
-
// DIRECTORY_ALARMS,
|
|
49
|
-
// DIRECTORY_NOTIFICATIONS,
|
|
50
|
-
// DIRECTORY_PICTURES,
|
|
51
|
-
// DIRECTORY_MOVIES,
|
|
52
|
-
// DIRECTORY_DCIM,
|
|
53
|
-
// DIRECTORY_DOCUMENTS,
|
|
54
|
-
// DIRECTORY_AUDIOBOOKS,
|
|
55
|
-
});
|
|
56
|
-
export class PlatformService extends StartableService {
|
|
57
|
-
ionicPlatform;
|
|
58
|
-
cdkPlatform;
|
|
59
|
-
cdkClipboard;
|
|
60
|
-
toastController;
|
|
61
|
-
translate;
|
|
62
|
-
dateAdapter;
|
|
63
|
-
entitiesStorage;
|
|
64
|
-
settings;
|
|
65
|
-
networkService;
|
|
66
|
-
accountService;
|
|
67
|
-
configService;
|
|
68
|
-
cache;
|
|
69
|
-
audioProvider;
|
|
70
|
-
environment;
|
|
71
|
-
downloader;
|
|
72
|
-
_logger;
|
|
73
|
-
_mobile;
|
|
74
|
-
_desktop;
|
|
75
|
-
_cordova;
|
|
76
|
-
_capacitor;
|
|
77
|
-
_android;
|
|
78
|
-
_ios;
|
|
79
|
-
busySubject = new BehaviorSubject(false);
|
|
80
|
-
constructor(ionicPlatform, cdkPlatform, cdkClipboard, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader) {
|
|
81
|
-
super(ionicPlatform);
|
|
82
|
-
this.ionicPlatform = ionicPlatform;
|
|
83
|
-
this.cdkPlatform = cdkPlatform;
|
|
84
|
-
this.cdkClipboard = cdkClipboard;
|
|
85
|
-
this.toastController = toastController;
|
|
86
|
-
this.translate = translate;
|
|
87
|
-
this.dateAdapter = dateAdapter;
|
|
88
|
-
this.entitiesStorage = entitiesStorage;
|
|
89
|
-
this.settings = settings;
|
|
90
|
-
this.networkService = networkService;
|
|
91
|
-
this.accountService = accountService;
|
|
92
|
-
this.configService = configService;
|
|
93
|
-
this.cache = cache;
|
|
94
|
-
this.audioProvider = audioProvider;
|
|
95
|
-
this.environment = environment;
|
|
96
|
-
this.downloader = downloader;
|
|
97
|
-
this._logger = loggingService?.getLogger('platform');
|
|
98
|
-
this._debug = !environment.production;
|
|
99
|
-
if (this._debug)
|
|
100
|
-
console.debug('[platform] Creating service');
|
|
101
|
-
if (this._logger) {
|
|
102
|
-
this._logger.debug('ctor', 'Creating service');
|
|
103
|
-
ionicPlatform.pause.subscribe(() => {
|
|
104
|
-
this._logger.info('ctor', 'Pause app');
|
|
105
|
-
});
|
|
106
|
-
ionicPlatform.resume.subscribe(() => {
|
|
107
|
-
this._logger.info('ctor', 'Resume app');
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
_downloadingJobs = new Map();
|
|
112
|
-
checkAppVersionTimer;
|
|
113
|
-
is(platformName) {
|
|
114
|
-
switch (platformName) {
|
|
115
|
-
case 'mobile':
|
|
116
|
-
// Exclude Windows touch screens - see sumaris-app issues #323 and #346
|
|
117
|
-
return isMobile(window);
|
|
118
|
-
case 'mobileweb':
|
|
119
|
-
// Exclude Windows touch screens - see sumaris-app issues #323 and #346
|
|
120
|
-
return this.ionicPlatform.is(platformName) && !isWindows(window);
|
|
121
|
-
default:
|
|
122
|
-
return this.ionicPlatform.is(platformName);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
get mobile() {
|
|
126
|
-
return isNotNil(this._mobile) ? this._mobile : this.is('mobile');
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Say if opened has been opened inside an Android or iOs App.
|
|
130
|
-
* This is used to known if there is cordova features
|
|
131
|
-
*/
|
|
132
|
-
isCapacitor() {
|
|
133
|
-
return this._capacitor;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Say if opened has been opened inside an Android or iOs App.
|
|
137
|
-
* This is used to known if there is cordova features
|
|
138
|
-
*/
|
|
139
|
-
isCordova() {
|
|
140
|
-
return this._cordova;
|
|
141
|
-
}
|
|
142
|
-
isAndroidCordova() {
|
|
143
|
-
return (this._android && this._cordova) || false;
|
|
144
|
-
}
|
|
145
|
-
isIOSCordova() {
|
|
146
|
-
return (this._ios && this._cordova) || false;
|
|
147
|
-
}
|
|
148
|
-
isAndroid() {
|
|
149
|
-
return this._android || false;
|
|
150
|
-
}
|
|
151
|
-
isIOS() {
|
|
152
|
-
return this._ios || false;
|
|
153
|
-
}
|
|
154
|
-
isMacOSDesktop() {
|
|
155
|
-
return this._desktop && this.isCordova();
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Is a native App (and NOT a mobile web)
|
|
159
|
-
*/
|
|
160
|
-
isApp() {
|
|
161
|
-
return this.isAndroidCordova() || this.isIOSCordova();
|
|
162
|
-
}
|
|
163
|
-
isWeb() {
|
|
164
|
-
return !this.isApp();
|
|
165
|
-
}
|
|
166
|
-
isMobileWeb() {
|
|
167
|
-
return this.mobile && this.isWeb();
|
|
168
|
-
}
|
|
169
|
-
get canDownload() {
|
|
170
|
-
return this.downloader && this.isAndroidCordova();
|
|
171
|
-
}
|
|
172
|
-
get canOpenFile() {
|
|
173
|
-
return false; // TODO: fixme using @capacitor/filesystem ?
|
|
174
|
-
}
|
|
175
|
-
width() {
|
|
176
|
-
return this.ionicPlatform.width();
|
|
177
|
-
}
|
|
178
|
-
height() {
|
|
179
|
-
return this.ionicPlatform.height();
|
|
180
|
-
}
|
|
181
|
-
async ngOnStart() {
|
|
182
|
-
const now = Date.now();
|
|
183
|
-
this.accountService.tokenType = undefined;
|
|
184
|
-
console.debug('[platform] Starting platform...');
|
|
185
|
-
this._logger?.info('ngOnStart', 'Starting platform...');
|
|
186
|
-
try {
|
|
187
|
-
this._mobile = this.is('mobile');
|
|
188
|
-
this._desktop = this.is('desktop');
|
|
189
|
-
this._cordova = this.is('cordova');
|
|
190
|
-
this._capacitor = this.is('capacitor');
|
|
191
|
-
this._android = this.is('android');
|
|
192
|
-
this._ios = this.is('ios');
|
|
193
|
-
const logMessage = `Detected {mobile: ${this._mobile}, desktop: ${this._desktop}, cordova: ${this._cordova}, capacitor: ${this._capacitor}, android: ${this._android}, ios: ${this._ios}}`;
|
|
194
|
-
console.info('[platform] ' + logMessage);
|
|
195
|
-
this._logger?.info('ngOnStart', logMessage);
|
|
196
|
-
// Configure theme
|
|
197
|
-
await this.configureTheme(this._mobile);
|
|
198
|
-
// Configure Capacitor plugins
|
|
199
|
-
await this.configureCapacitorPlugins();
|
|
200
|
-
// Configure translation
|
|
201
|
-
this.configureTranslate();
|
|
202
|
-
// Configure cache
|
|
203
|
-
this.configureCache();
|
|
204
|
-
// Start root services
|
|
205
|
-
await Promise.all([this.entitiesStorage.ready(), this.settings.ready(), this.networkService.ready(), this.audioProvider.ready()]);
|
|
206
|
-
// Check if web app has update, and reload page if need
|
|
207
|
-
if (this.isWeb() && this.environment.production) {
|
|
208
|
-
await this.checkAppVersion({ canReload: true });
|
|
209
|
-
}
|
|
210
|
-
// Update cache configuration when network changed
|
|
211
|
-
this.registerSubscription(this.networkService.onNetworkStatusChanges
|
|
212
|
-
.pipe(skip(1) // Already done once, so we skip the first event
|
|
213
|
-
)
|
|
214
|
-
.subscribe((type) => this.configureCache(type !== 'none')));
|
|
215
|
-
console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, capacitor: ${this._capacitor}, web: ${this.isWeb()}, downloader: ${this.canDownload}} in ${Date.now() - now}ms`);
|
|
216
|
-
// Pass auth token
|
|
217
|
-
this.registerSubscription(this.configService.config.subscribe((config) => {
|
|
218
|
-
if (!config)
|
|
219
|
-
return; // Skip
|
|
220
|
-
// Update authentication type
|
|
221
|
-
const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
|
|
222
|
-
if (isNotNilOrBlank(tokenType) && this.accountService.tokenType !== tokenType) {
|
|
223
|
-
console.info(`[platform] Using auth token type {${tokenType}}`);
|
|
224
|
-
this.accountService.tokenType = tokenType;
|
|
225
|
-
}
|
|
226
|
-
// Enable auth API using tokens
|
|
227
|
-
const authApiEnabled = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_API_TOKEN_ENABLED);
|
|
228
|
-
if (isNotNil(authApiEnabled) && authApiEnabled !== this.accountService.apiTokenEnabled) {
|
|
229
|
-
console.info(`[platform] Using auth API tokens ? ${authApiEnabled}}`);
|
|
230
|
-
this.accountService.apiTokenEnabled = authApiEnabled;
|
|
231
|
-
}
|
|
232
|
-
}));
|
|
233
|
-
// Hide the splashscreen (if mobile or macOS) - after 1s
|
|
234
|
-
if (this._mobile || this.isMacOSDesktop()) {
|
|
235
|
-
setTimeout(async () => {
|
|
236
|
-
await SplashScreen.hide();
|
|
237
|
-
// Play startup sound (is mobile)
|
|
238
|
-
if (this._mobile) {
|
|
239
|
-
await this.audioProvider.playStartupSound();
|
|
240
|
-
}
|
|
241
|
-
}, 1000);
|
|
242
|
-
}
|
|
243
|
-
// Check if new version, every 1 min
|
|
244
|
-
const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
|
|
245
|
-
if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
|
|
246
|
-
this.checkAppVersionTimer?.unsubscribe();
|
|
247
|
-
const subscription = timer(checkIntervalMs, checkIntervalMs).subscribe((_) => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
|
|
248
|
-
this.checkAppVersionTimer = subscription;
|
|
249
|
-
this.registerSubscription(subscription);
|
|
250
|
-
subscription.add(() => this.unregisterSubscription(subscription));
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
catch (err) {
|
|
254
|
-
// Manage startup error
|
|
255
|
-
return this.onStartupError(err);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Used to show a backdrop when platform is busy (e.g. from the app.component.ts)
|
|
260
|
-
*/
|
|
261
|
-
markAsBusy() {
|
|
262
|
-
if (!this.busySubject.value) {
|
|
263
|
-
this.busySubject.next(true);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
markAsNotBusy() {
|
|
267
|
-
if (this.busySubject.value) {
|
|
268
|
-
this.busySubject.next(false);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
async open(url, opts) {
|
|
272
|
-
console.info(`[platform] Opening link: ${url}`);
|
|
273
|
-
if (this._mobile && this._capacitor) {
|
|
274
|
-
await Browser.open({ url, ...opts });
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
window.open(url, opts?.windowName);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
getDownloadingJob(uri) {
|
|
281
|
-
return this._downloadingJobs.get(uri);
|
|
282
|
-
}
|
|
283
|
-
download(request) {
|
|
284
|
-
if (!request || !request.uri)
|
|
285
|
-
throw new Error("Missing argument 'request' or 'request.uri'");
|
|
286
|
-
if (this.canDownload) {
|
|
287
|
-
// Check if not already downloading file
|
|
288
|
-
let job$ = this._downloadingJobs.get(request.uri);
|
|
289
|
-
if (job$)
|
|
290
|
-
return job$;
|
|
291
|
-
// Compute subPath (final filename)
|
|
292
|
-
let subPath = request.destinationInExternalPublicDir?.subPath ||
|
|
293
|
-
request.destinationInExternalFilesDir?.subPath ||
|
|
294
|
-
request.filename ||
|
|
295
|
-
UriUtils.getFilename(request.uri) ||
|
|
296
|
-
request.title ||
|
|
297
|
-
'download';
|
|
298
|
-
subPath = subPath
|
|
299
|
-
.toLowerCase()
|
|
300
|
-
// Remove spaces
|
|
301
|
-
.replace(/\s+/g, '-');
|
|
302
|
-
// Force APK to finish with '.apk'
|
|
303
|
-
if (request.mimeType === MimeTypes.ANDROID_APK && !subPath.toLowerCase().endsWith('.apk')) {
|
|
304
|
-
subPath += '.apk';
|
|
305
|
-
}
|
|
306
|
-
const downloadRequest = {
|
|
307
|
-
visibleInDownloadsUi: true,
|
|
308
|
-
notificationVisibility: NotificationVisibility.VisibleNotifyCompleted,
|
|
309
|
-
...request,
|
|
310
|
-
filename: undefined, // Force unset
|
|
311
|
-
destinationInExternalPublicDir: !request.destinationInExternalFilesDir
|
|
312
|
-
? {
|
|
313
|
-
dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
|
|
314
|
-
...request.destinationInExternalPublicDir,
|
|
315
|
-
subPath,
|
|
316
|
-
}
|
|
317
|
-
: undefined,
|
|
318
|
-
destinationInExternalFilesDir: request.destinationInExternalFilesDir
|
|
319
|
-
? {
|
|
320
|
-
dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
|
|
321
|
-
...request.destinationInExternalFilesDir,
|
|
322
|
-
subPath,
|
|
323
|
-
}
|
|
324
|
-
: undefined,
|
|
325
|
-
};
|
|
326
|
-
// Start download
|
|
327
|
-
console.debug('[platform] Downloading, using request: ' + JSON.stringify(downloadRequest));
|
|
328
|
-
job$ = from(this.downloader.download(downloadRequest));
|
|
329
|
-
// Remember this request uri
|
|
330
|
-
this._downloadingJobs.set(downloadRequest.uri, job$);
|
|
331
|
-
return job$.pipe(tap((location) => {
|
|
332
|
-
console.info('[platform] File successfully downloaded at:' + location);
|
|
333
|
-
// Forget job
|
|
334
|
-
this._downloadingJobs.delete(downloadRequest.uri);
|
|
335
|
-
return location;
|
|
336
|
-
}), catchError((err) => {
|
|
337
|
-
console.error('[platform] Unable to download: ' + ((err && err.message) || err));
|
|
338
|
-
// Forget the request
|
|
339
|
-
this._downloadingJobs.delete(downloadRequest.uri);
|
|
340
|
-
// Retry with another location - issue in older Android version
|
|
341
|
-
if (downloadRequest.destinationInExternalPublicDir?.dirType === AndroidOsEnvironment.DIRECTORY_DOWNLOADS) {
|
|
342
|
-
downloadRequest.destinationInExternalPublicDir.dirType = AndroidOsEnvironment.DIRECTORY_DOWNLOADS_OLD;
|
|
343
|
-
return this.download(downloadRequest);
|
|
344
|
-
}
|
|
345
|
-
throw err;
|
|
346
|
-
}));
|
|
347
|
-
}
|
|
348
|
-
// Fallback (if not Android and Capacitor): opening the URI
|
|
349
|
-
// TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)
|
|
350
|
-
else {
|
|
351
|
-
FilesUtils.downloadUri(request.uri, request.filename);
|
|
352
|
-
return of(undefined);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
async copyToClipboard(data, opts) {
|
|
356
|
-
const value = typeof data === 'string' ? data : data.string;
|
|
357
|
-
let copied = true;
|
|
358
|
-
if (this.isAndroidCordova()) {
|
|
359
|
-
const writeOptions = typeof data === 'string' ? { string: value } : data;
|
|
360
|
-
await Clipboard.write(writeOptions);
|
|
361
|
-
}
|
|
362
|
-
else {
|
|
363
|
-
copied = this.cdkClipboard.copy(value);
|
|
364
|
-
}
|
|
365
|
-
if (copied) {
|
|
366
|
-
// Show toast
|
|
367
|
-
if (opts && isNotNilOrBlank(opts.message)) {
|
|
368
|
-
await Toasts.show(this.toastController, this.translate, {
|
|
369
|
-
type: 'info',
|
|
370
|
-
...opts,
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
console.error('[platform] Unable to copy to clipboard: ' + data);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
async updateTheme(options) {
|
|
379
|
-
if (!options)
|
|
380
|
-
return;
|
|
381
|
-
const style = document.documentElement.style;
|
|
382
|
-
// options.colors = {
|
|
383
|
-
// ...options.colors,
|
|
384
|
-
// primary: '#124541',
|
|
385
|
-
// };
|
|
386
|
-
// Set colors
|
|
387
|
-
if (options.colors) {
|
|
388
|
-
console.info('[platform] Changing theme colors ', options.colors);
|
|
389
|
-
// Add 100 & 900 color for primary and secondary color
|
|
390
|
-
['primary', 'secondary'].forEach((colorName) => {
|
|
391
|
-
const color = options.colors[colorName];
|
|
392
|
-
options.colors[colorName + '100'] = (color && mixHex('#ffffff', color, 10)) || undefined;
|
|
393
|
-
options.colors[colorName + '900'] = (color && mixHex('#000000', color, 12)) || undefined;
|
|
394
|
-
});
|
|
395
|
-
Object.getOwnPropertyNames(options.colors).forEach((colorName) => {
|
|
396
|
-
// Remove existing value
|
|
397
|
-
style.removeProperty(`--ion-color-${colorName}`);
|
|
398
|
-
style.removeProperty(`--ion-color-${colorName}-rgb`);
|
|
399
|
-
style.removeProperty(`--ion-color-${colorName}-contrast`);
|
|
400
|
-
style.removeProperty(`--ion-color-${colorName}-contrast-rgb`);
|
|
401
|
-
style.removeProperty(`--ion-color-${colorName}-shade`);
|
|
402
|
-
style.removeProperty(`--ion-color-${colorName}-tint`);
|
|
403
|
-
// Set new value, if any
|
|
404
|
-
const color = options.colors[colorName];
|
|
405
|
-
if (isNotNilOrBlank(color)) {
|
|
406
|
-
// Base color
|
|
407
|
-
style.setProperty(`--ion-color-${colorName}`, color);
|
|
408
|
-
style.setProperty(`--ion-color-${colorName}-rgb`, hexToRgbArray(color).join(', '));
|
|
409
|
-
// Contrast color
|
|
410
|
-
const contrastColor = getColorContrast(color, true);
|
|
411
|
-
style.setProperty(`--ion-color-${colorName}-contrast`, contrastColor);
|
|
412
|
-
style.setProperty(`--ion-color-${colorName}-contrast-rgb`, hexToRgbArray(contrastColor).join(', '));
|
|
413
|
-
// Shade color
|
|
414
|
-
style.setProperty(`--ion-color-${colorName}-shade`, getColorShade(color));
|
|
415
|
-
// Tint color
|
|
416
|
-
style.setProperty(`--ion-color-${colorName}-tint`, getColorTint(color));
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
// Set CSS vars
|
|
421
|
-
if (options.vars) {
|
|
422
|
-
console.info('[platform] Changing theme vars ', options.vars);
|
|
423
|
-
Object.getOwnPropertyNames(options.vars).forEach((varName) => {
|
|
424
|
-
// Set new value, if any
|
|
425
|
-
const value = options.vars[varName];
|
|
426
|
-
if (isNotNilOrBlank(value)) {
|
|
427
|
-
style.setProperty(varName, value);
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
style.removeProperty(varName);
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
// Set dark mode
|
|
435
|
-
if (isNotNil(options.darkMode)) {
|
|
436
|
-
await this.toggleDarkTheme(options.darkMode);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
async toggleDarkTheme(enable) {
|
|
440
|
-
const classList = document.documentElement.classList;
|
|
441
|
-
// Toggle the class
|
|
442
|
-
const wasEnabled = classList.contains('dark');
|
|
443
|
-
if (enable !== wasEnabled) {
|
|
444
|
-
console.debug(`[platform] ${enable ? 'Enable' : 'Disable'} dark mode...`);
|
|
445
|
-
classList.toggle('dark', enable);
|
|
446
|
-
// If mobile (Android or iOS)
|
|
447
|
-
if (this.isApp() && (this.isIOS() || this.isAndroid())) {
|
|
448
|
-
// Read the primary color, if any
|
|
449
|
-
const style = getComputedStyle(document.documentElement);
|
|
450
|
-
const primaryColor = style.getPropertyValue('--ion-color-primary')?.trim();
|
|
451
|
-
const backgroundColor = !primaryColor || enable ? '#000000' : primaryColor;
|
|
452
|
-
// Configure status bar style
|
|
453
|
-
const statusBarStyle = isLightColor(backgroundColor) ? Style.Light : Style.Dark;
|
|
454
|
-
console.debug(`[platform] StatusBar icons style: ${statusBarStyle} ...`);
|
|
455
|
-
try {
|
|
456
|
-
await StatusBar.setStyle({ style: statusBarStyle });
|
|
457
|
-
}
|
|
458
|
-
catch (err) {
|
|
459
|
-
console.error('[platform] Error while setting StatusBar icons style', err);
|
|
460
|
-
}
|
|
461
|
-
// Configure status bar background color (always use black on dark mode)
|
|
462
|
-
if (this.isAndroid()) {
|
|
463
|
-
try {
|
|
464
|
-
console.debug(`[platform] EdgeToEdge background color: ${backgroundColor}`);
|
|
465
|
-
await EdgeToEdge.setBackgroundColor({ color: backgroundColor });
|
|
466
|
-
}
|
|
467
|
-
catch (err) {
|
|
468
|
-
console.error('[platform] Error while setting EdgeToEdge background color', err);
|
|
469
|
-
await StatusBar.setBackgroundColor({ color: backgroundColor });
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
try {
|
|
474
|
-
console.debug(`[platform] StatusBar background color: ${backgroundColor}`);
|
|
475
|
-
await StatusBar.setBackgroundColor({ color: backgroundColor });
|
|
476
|
-
}
|
|
477
|
-
catch (err) {
|
|
478
|
-
console.error('[platform] Error while setting StatusBar background color', err);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
toggleHighContrast(enable) {
|
|
485
|
-
if (enable && !document.documentElement.classList.contains('high-contrast')) {
|
|
486
|
-
console.debug('[platform] Enable high contrast...');
|
|
487
|
-
}
|
|
488
|
-
document.documentElement.classList.toggle('high-contrast', enable);
|
|
489
|
-
}
|
|
490
|
-
/**
|
|
491
|
-
* Handle deep links (Android App Links / iOS Universal Links)
|
|
492
|
-
*/
|
|
493
|
-
async addDeepLinkListener(listenerFn) {
|
|
494
|
-
if (!this.isApp() || (typeof listenerFn !== 'function'))
|
|
495
|
-
return; // Skip
|
|
496
|
-
// Handle deep links (Android App Links / iOS Universal Links)
|
|
497
|
-
try {
|
|
498
|
-
console.info('[platform] Start listen deep links');
|
|
499
|
-
const { App } = await import('@capacitor/app');
|
|
500
|
-
const listener = await App.addListener('appUrlOpen', (data) => {
|
|
501
|
-
try {
|
|
502
|
-
console.info(`[platform] Processing deep link: ${data?.url}`);
|
|
503
|
-
const url = new URL(data?.url || '');
|
|
504
|
-
// Get the peer
|
|
505
|
-
const peer = Peer.parseUrl(url);
|
|
506
|
-
peer.path = undefined; // FIXME We clean the path (=baseHref) as we cannot detect it from a deep link
|
|
507
|
-
// Build an absolute path from the URL pathname and search
|
|
508
|
-
const path = UrlUtils.addTrailingSlash(UrlUtils.cleanUrl(url.pathname || '/'));
|
|
509
|
-
const query = url.search || '';
|
|
510
|
-
const fullPath = `${path}${query}`;
|
|
511
|
-
console.info(`[platform] Processing deep link [OK] - peer: ${peer.url} path: ${fullPath}`);
|
|
512
|
-
// Call the given listener
|
|
513
|
-
listenerFn({ peerUrl: peer.url, path: fullPath });
|
|
514
|
-
}
|
|
515
|
-
catch (e) {
|
|
516
|
-
console.warn('[platform] Failed to handle deep link', e, data);
|
|
517
|
-
}
|
|
518
|
-
});
|
|
519
|
-
let subscription = new Subscription();
|
|
520
|
-
subscription.add(() => {
|
|
521
|
-
console.info('[platform] Stop listen deep links');
|
|
522
|
-
listener.remove();
|
|
523
|
-
this.unregisterSubscription(subscription);
|
|
524
|
-
subscription = null; // Forget the subscription
|
|
525
|
-
});
|
|
526
|
-
this.registerSubscription(subscription);
|
|
527
|
-
return subscription;
|
|
528
|
-
}
|
|
529
|
-
catch (err) {
|
|
530
|
-
console.warn('[platform] Capacitor App plugin not available for deep links', err);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
showToast(opts) {
|
|
534
|
-
if (!this.toastController)
|
|
535
|
-
throw new Error("Missing toastController in component's constructor");
|
|
536
|
-
return new Promise((resolve) => Toasts.show(this.toastController, this.translate, {
|
|
537
|
-
...opts,
|
|
538
|
-
onWillPresent: (t) => resolve(t),
|
|
539
|
-
}));
|
|
540
|
-
}
|
|
541
|
-
async closeToast(id) {
|
|
542
|
-
return this.toastController?.dismiss(null, null, id);
|
|
543
|
-
}
|
|
544
|
-
/* -- protected methods -- */
|
|
545
|
-
async configureTheme(mobile, win = window) {
|
|
546
|
-
// Listen for changes to settings dark mode
|
|
547
|
-
if (this.environment.allowDarkMode) {
|
|
548
|
-
const isScreen$ = new Observable((observer) => {
|
|
549
|
-
const matchMedia = win.matchMedia('screen');
|
|
550
|
-
matchMedia.addEventListener('change', (e) => observer.next(e.matches));
|
|
551
|
-
observer.next(matchMedia.matches);
|
|
552
|
-
});
|
|
553
|
-
this.registerSubscription(combineLatest([isScreen$, this.settings.darkMode$]).subscribe(([isScreen, enable]) => this.toggleDarkTheme(isScreen && enable)));
|
|
554
|
-
}
|
|
555
|
-
else {
|
|
556
|
-
await this.toggleDarkTheme(false);
|
|
557
|
-
}
|
|
558
|
-
// Workaround, for MS Windows touch screen (detected as mobile, but forced as desktop)
|
|
559
|
-
if (!mobile &&
|
|
560
|
-
(win.document.documentElement?.classList.contains('plt-mobile') || win.document.documentElement.classList?.contains('plt-mobileweb'))) {
|
|
561
|
-
console.warn('[platform] Force class list to: <html class="plt-desktop">. Workaround for Windows touch screen.');
|
|
562
|
-
win.document.documentElement.classList.remove('plt-mobile', 'plt-mobileweb');
|
|
563
|
-
win.document.documentElement.classList.add('plt-desktop');
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
async configureCapacitorPlugins() {
|
|
567
|
-
if (!this._capacitor)
|
|
568
|
-
return; // Skip
|
|
569
|
-
console.info('[platform] Configuring Capacitor plugins...');
|
|
570
|
-
let pluginName;
|
|
571
|
-
try {
|
|
572
|
-
pluginName = CapacitorPlugins.EdgeToEdge;
|
|
573
|
-
if (this.isApp() && this.isAndroid()) {
|
|
574
|
-
await EdgeToEdge.enable();
|
|
575
|
-
}
|
|
576
|
-
pluginName = CapacitorPlugins.StatusBar;
|
|
577
|
-
if (this.isApp()) {
|
|
578
|
-
// Avoid overlays (Android 15 or iOS)
|
|
579
|
-
await StatusBar.setOverlaysWebView({ overlay: false });
|
|
580
|
-
}
|
|
581
|
-
// Hide accessory bar (iOS only)
|
|
582
|
-
if (this.isApp() && this.isIOS()) {
|
|
583
|
-
pluginName = CapacitorPlugins.Keyboard;
|
|
584
|
-
await Keyboard.setAccessoryBarVisible({ isVisible: false });
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
catch (err) {
|
|
588
|
-
const logMessage = `Error while configuring ${pluginName} plugin: ${err.message || err}\n${err?.originalStack || JSON.stringify(err)}`;
|
|
589
|
-
console.error('[platform] ' + logMessage);
|
|
590
|
-
this._logger?.error('configureCapacitorPlugins', logMessage);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
configureTranslate() {
|
|
594
|
-
console.info('[platform] Configuring i18n ...');
|
|
595
|
-
// this language will be used as a fallback when a translation isn't found in the current language
|
|
596
|
-
this.translate.setDefaultLang(this.environment.defaultLocale);
|
|
597
|
-
// apply locale immediately
|
|
598
|
-
this.applyLocale(this.environment.defaultLocale);
|
|
599
|
-
// When locale changes, apply to date adapter
|
|
600
|
-
this.registerSubscription(this.translate.onLangChange.subscribe((event) => {
|
|
601
|
-
if (event && event.lang) {
|
|
602
|
-
this.applyLocale(event.lang);
|
|
603
|
-
}
|
|
604
|
-
}));
|
|
605
|
-
this.registerSubscription(this.settings.onChange.subscribe((data) => {
|
|
606
|
-
if (data) {
|
|
607
|
-
// Apply locale
|
|
608
|
-
if (data.locale) {
|
|
609
|
-
if (data.locale !== this.translate.currentLang) {
|
|
610
|
-
this.translate.use(data.locale);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
// Applying default, when settings has no locale property (hotfix - ludovic.pecquot@e-is.pro - 14/11/2021 - since v1.20.42)
|
|
615
|
-
console.warn('[platform] No locale found in settings: applying defaultLocale: ', this.environment.defaultLocale);
|
|
616
|
-
this.translate.use(this.environment.defaultLocale);
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
}));
|
|
620
|
-
// Use account's settings, (like locale), when account inheritance enabled
|
|
621
|
-
this.registerSubscription(this.accountService.onLogin.subscribe(async (account) => {
|
|
622
|
-
if (account.settings && this.settings.settings.accountInheritance) {
|
|
623
|
-
console.debug('[platform] Copying account settings into local settings...');
|
|
624
|
-
await this.settings.apply(account.settings.asLocalSettings());
|
|
625
|
-
}
|
|
626
|
-
}));
|
|
627
|
-
}
|
|
628
|
-
applyLocale(locale) {
|
|
629
|
-
// force 'en' as 'en_GB'
|
|
630
|
-
if (locale === 'en') {
|
|
631
|
-
locale = 'en_GB';
|
|
632
|
-
}
|
|
633
|
-
// config moment lib
|
|
634
|
-
try {
|
|
635
|
-
momentLocale(locale);
|
|
636
|
-
console.debug('[platform] Use locale {' + locale + '}');
|
|
637
|
-
}
|
|
638
|
-
catch (err) {
|
|
639
|
-
// If error, fallback to en
|
|
640
|
-
momentLocale('en');
|
|
641
|
-
console.warn('[platform] Unknown locale for moment lib. Using default [en]');
|
|
642
|
-
}
|
|
643
|
-
// Config date adapter
|
|
644
|
-
this.dateAdapter.setLocale(momentLocale());
|
|
645
|
-
}
|
|
646
|
-
configureCache(online) {
|
|
647
|
-
online = toBoolean(online, this.cache.isOnline());
|
|
648
|
-
const cacheTTL = online ? 3600 /* 1h */ : 3600 * 24 * 30; /* 1 month */
|
|
649
|
-
console.info(`[platform] Configuring cache [OK] {online: ${online}, timeToLive: ${cacheTTL / 3600}h, offlineInvalidate: false}`);
|
|
650
|
-
this.cache.setDefaultTTL(cacheTTL);
|
|
651
|
-
this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
|
|
652
|
-
}
|
|
653
|
-
async checkAppVersion(opts) {
|
|
654
|
-
if (this.networkService.offline || !this.isWeb())
|
|
655
|
-
return; // Skip
|
|
656
|
-
const silent = opts?.silent === true;
|
|
657
|
-
const production = this.environment.production;
|
|
658
|
-
const canAutoReload = !opts || opts.canReload !== false;
|
|
659
|
-
if (!silent)
|
|
660
|
-
console.info('[platform] Checking remote app version...');
|
|
661
|
-
const actualVersion = this.environment.version;
|
|
662
|
-
if (isNilOrBlank(actualVersion)) {
|
|
663
|
-
console.error("[platform] Missing required value for 'environment.version'. Cannot check remote app version.");
|
|
664
|
-
this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
|
|
665
|
-
return; // Skip
|
|
666
|
-
}
|
|
667
|
-
const remoteVersion = await this.networkService.getAppVersion();
|
|
668
|
-
if (isNilOrBlank(remoteVersion)) {
|
|
669
|
-
if (production && !silent)
|
|
670
|
-
console.error('[platform] Cannot load remote app version. Skipping version check');
|
|
671
|
-
this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
|
|
672
|
-
return;
|
|
673
|
-
}
|
|
674
|
-
if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
|
|
675
|
-
if (!silent)
|
|
676
|
-
console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);
|
|
677
|
-
return;
|
|
678
|
-
}
|
|
679
|
-
// If newer version exists
|
|
680
|
-
let reloadPath = location.href.replace(/[&?]version=[^&]*/gi, ''); // Remove old version in query params
|
|
681
|
-
reloadPath += reloadPath.indexOf('?') === -1 ? '?' : '&'; // Add query param separator
|
|
682
|
-
reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
|
|
683
|
-
// Already try to reload, but version still bad
|
|
684
|
-
if (reloadPath === location.href) {
|
|
685
|
-
if (canAutoReload)
|
|
686
|
-
console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
|
|
687
|
-
// Stop timer, to avoid infinite loop
|
|
688
|
-
this.checkAppVersionTimer?.unsubscribe();
|
|
689
|
-
return;
|
|
690
|
-
}
|
|
691
|
-
console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
|
|
692
|
-
// Auto reload
|
|
693
|
-
if (canAutoReload) {
|
|
694
|
-
console.info('[platform] Will reloading at ' + reloadPath);
|
|
695
|
-
location.href = reloadPath;
|
|
696
|
-
// App stop
|
|
697
|
-
}
|
|
698
|
-
// Ask user to reload
|
|
699
|
-
else {
|
|
700
|
-
// Stop timer, to avoid infinite loop
|
|
701
|
-
this.checkAppVersionTimer?.unsubscribe();
|
|
702
|
-
// Display a reload toast
|
|
703
|
-
await this.showToast({
|
|
704
|
-
message: 'CONFIRM.RELOAD_APP',
|
|
705
|
-
messageParams: { version: remoteVersion, name: this.environment.name },
|
|
706
|
-
type: 'info',
|
|
707
|
-
duration: -1,
|
|
708
|
-
showCloseButton: true,
|
|
709
|
-
buttons: [
|
|
710
|
-
// Reload button
|
|
711
|
-
{
|
|
712
|
-
text: this.translate.instant('COMMON.BTN_UPDATE'),
|
|
713
|
-
side: 'end',
|
|
714
|
-
handler: () => {
|
|
715
|
-
location.href = reloadPath;
|
|
716
|
-
return true;
|
|
717
|
-
},
|
|
718
|
-
},
|
|
719
|
-
],
|
|
720
|
-
});
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
async onStartupError(err) {
|
|
724
|
-
console.error('[platform] Failed starting the platform! ' + JSON.stringify(err));
|
|
725
|
-
let message = (err && err.message) || err;
|
|
726
|
-
const detailsMessage = err && ((err.details && err.details.message) || err.details);
|
|
727
|
-
// Set specific error when Firefox is in private mode or history never remembered (see Mantis Ifremer #56441)
|
|
728
|
-
if (err.code === 11 && this.cdkPlatform.FIREFOX) {
|
|
729
|
-
message = 'ERROR.FIREFOX_NO_STORAGE';
|
|
730
|
-
}
|
|
731
|
-
if (this.translate) {
|
|
732
|
-
message = await this.translate.instant(message);
|
|
733
|
-
if (err && err.code) {
|
|
734
|
-
message += ` {code: ${err.code}}`;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
else {
|
|
738
|
-
message = `Fatal error: Please contact your administrator.\n\n{code: ${(err && err.code) || 'null'}, message: "${message}"}`;
|
|
739
|
-
}
|
|
740
|
-
if (this.toastController) {
|
|
741
|
-
if (detailsMessage) {
|
|
742
|
-
message += `<br/><small>${detailsMessage}</small>`;
|
|
743
|
-
}
|
|
744
|
-
await this.showToast({
|
|
745
|
-
type: 'error',
|
|
746
|
-
duration: -1,
|
|
747
|
-
showCloseButton: true,
|
|
748
|
-
message,
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
else if (window) {
|
|
752
|
-
if (detailsMessage) {
|
|
753
|
-
message += `\n\n{cause: "${detailsMessage}"}`;
|
|
754
|
-
}
|
|
755
|
-
window.alert(message);
|
|
756
|
-
}
|
|
757
|
-
else {
|
|
758
|
-
console.error(message);
|
|
759
|
-
if (err && err.details)
|
|
760
|
-
console.error('cause', err.details);
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, deps: [{ token: i1.Platform }, { token: i2.Platform }, { token: i3.Clipboard }, { token: i1.ToastController }, { token: i4.TranslateService }, { token: i5.MomentDateAdapter }, { token: i6.EntitiesStorage }, { token: i7.LocalSettingsService }, { token: i8.NetworkService }, { token: i9.AccountService }, { token: i10.ConfigService }, { token: i11.CacheService }, { token: i12.AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i13.Downloader, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
764
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, providedIn: 'root' });
|
|
765
|
-
}
|
|
766
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, decorators: [{
|
|
767
|
-
type: Injectable,
|
|
768
|
-
args: [{ providedIn: 'root' }]
|
|
769
|
-
}], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Platform }, { type: i3.Clipboard }, { type: i1.ToastController }, { type: i4.TranslateService }, { type: i5.MomentDateAdapter }, { type: i6.EntitiesStorage }, { type: i7.LocalSettingsService }, { type: i8.NetworkService }, { type: i9.AccountService }, { type: i10.ConfigService }, { type: i11.CacheService }, { type: i12.AudioProvider }, { type: i14.Environment, decorators: [{
|
|
770
|
-
type: Inject,
|
|
771
|
-
args: [ENVIRONMENT]
|
|
772
|
-
}] }, { type: undefined, decorators: [{
|
|
773
|
-
type: Optional
|
|
774
|
-
}, {
|
|
775
|
-
type: Inject,
|
|
776
|
-
args: [APP_LOGGING_SERVICE]
|
|
777
|
-
}] }, { type: i13.Downloader, decorators: [{
|
|
778
|
-
type: Optional
|
|
779
|
-
}] }] });
|
|
780
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUYsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxPQUFPLEVBQStCLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBC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TyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU87Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO3dHQWp5QlUsZUFBZSxtWkF5QmhCLFdBQVcsYUFDQyxtQkFBbUI7NEdBMUI5QixlQUFlLGNBREYsTUFBTTs7NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkEwQjdCLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYXRmb3JtLCBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhUb2tlblR5cGUgfSBmcm9tICcuL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgUGxhdGZvcm1zIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnaW9uaWMtY2FjaGUnO1xuaW1wb3J0IHsgQXVkaW9Qcm92aWRlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9hdWRpby9hdWRpbyc7XG5pbXBvcnQgeyBQbGF0Zm9ybSBhcyBDZGtQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5cbmltcG9ydCB7IGlzTmlsT3JCbGFuaywgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFbnRpdGllc1N0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UvZW50aXRpZXMtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNob3dUb2FzdE9wdGlvbnMsIFRvYXN0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBza2lwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4vY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IE1vbWVudERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHsgRG93bmxvYWRlciwgRG93bmxvYWRSZXF1ZXN0LCBOb3RpZmljYXRpb25WaXNpYmlsaXR5IH0gZnJvbSAnQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL2Rvd25sb2FkZXIvbmd4JztcbmltcG9ydCB7IFN0YXJ0YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgaXNNb2JpbGUsIGlzV2luZG93cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgVmVyc2lvblV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3ZlcnNpb24vdmVyc2lvbnMnO1xuaW1wb3J0IHsgRmlsZXNVdGlscywgTWltZVR5cGVzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvZmlsZS51dGlscyc7XG5pbXBvcnQgeyBVcmlVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL3VyaS51dGlscyc7XG5pbXBvcnQgeyBTcGxhc2hTY3JlZW4gfSBmcm9tICdAY2FwYWNpdG9yL3NwbGFzaC1zY3JlZW4nO1xuaW1wb3J0IHsgU3RhdHVzQmFyLCBTdHlsZSB9IGZyb20gJ0BjYXBhY2l0b3Ivc3RhdHVzLWJhcic7XG5pbXBvcnQgeyBCcm93c2VyLCBPcGVuT3B0aW9ucyB9IGZyb20gJ0BjYXBhY2l0b3IvYnJvd3Nlcic7XG5pbXBvcnQgeyBLZXlib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3Iva2V5Ym9hcmQnO1xuaW1wb3J0IHsgQ2FwYWNpdG9yUGx1Z2lucyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jYXBhY2l0b3IvcGx1Z2lucyc7XG5pbXBvcnQgeyBsb2NhbGUgYXMgbW9tZW50TG9jYWxlIH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IElMb2dnZXIsIElMb2dnaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dlci5tb2RlbCc7XG5pbXBvcnQgeyBBUFBfTE9HR0lOR19TRVJWSUNFIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xvZ2dpbmcvbG9nZ2luZy1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IENsaXBib2FyZCBhcyBDZGtDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkJztcbmltcG9ydCB7IFdyaXRlT3B0aW9ucyB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkL2Rpc3QvZXNtL2RlZmluaXRpb25zJztcbmltcG9ydCB7IEVkZ2VUb0VkZ2UgfSBmcm9tICdAY2FwYXdlc29tZS9jYXBhY2l0b3ItYW5kcm9pZC1lZGdlLXRvLWVkZ2Utc3VwcG9ydCc7XG5pbXBvcnQgeyBnZXRDb2xvckNvbnRyYXN0LCBnZXRDb2xvclNoYWRlLCBnZXRDb2xvclRpbnQsIGhleFRvUmdiQXJyYXksIGlzTGlnaHRDb2xvciwgbWl4SGV4IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2dyYXBoL2NvbG9ycy51dGlscyc7XG5pbXBvcnQgeyBQZWVyIH0gZnJvbSAnLi9tb2RlbC9wZWVyLm1vZGVsJztcbmltcG9ydCB7IFVybFV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvdXJsLnV0aWxzJztcblxuZXhwb3J0IGNvbnN0IEFuZHJvaWRPc0Vudmlyb25tZW50ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERJUkVDVE9SWV9ET1dOTE9BRFM6ICdEb3dubG9hZCcsXG4gIERJUkVDVE9SWV9ET1dOTE9BRFNfT0xEOiAnRG93bmxvYWRzJywgLy8gT2xkIG5hbWUsIGZvciBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgLy8gVE9ETzogZmluZCB2YWx1ZSBmb3IgdGhpcy4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0Vudmlyb25tZW50I2dldEV4dGVybmFsU3RvcmFnZVN0YXRlKGphdmEuaW8uRmlsZSlcbiAgLy8gRElSRUNUT1JZX01VU0lDLFxuICAvLyBESVJFQ1RPUllfUE9EQ0FTVFMsXG4gIC8vIERJUkVDVE9SWV9SSU5HVE9ORVMsXG4gIC8vIERJUkVDVE9SWV9BTEFSTVMsXG4gIC8vIERJUkVDVE9SWV9OT1RJRklDQVRJT05TLFxuICAvLyBESVJFQ1RPUllfUElDVFVSRVMsXG4gIC8vIERJUkVDVE9SWV9NT1ZJRVMsXG4gIC8vIERJUkVDVE9SWV9EQ0lNLFxuICAvLyBESVJFQ1RPUllfRE9DVU1FTlRTLFxuICAvLyBESVJFQ1RPUllfQVVESU9CT09LUyxcbn0pO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtU2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2Uge1xuICBwcml2YXRlIF9sb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgX21vYmlsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGVza3RvcDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29yZG92YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY2FwYWNpdG9yOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9pb3M6IGJvb2xlYW47XG5cbiAgYnVzeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlvbmljUGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrQ2xpcGJvYXJkOiBDZGtDbGlwYm9hcmQsXG4gICAgcHJpdmF0ZSB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIGVudGl0aWVzU3RvcmFnZTogRW50aXRpZXNTdG9yYWdlLFxuICAgIHByaXZhdGUgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNhY2hlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdWRpb1Byb3ZpZGVyOiBBdWRpb1Byb3ZpZGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfTE9HR0lOR19TRVJWSUNFKSBsb2dnaW5nU2VydmljZTogSUxvZ2dpbmdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZG93bmxvYWRlcjogRG93bmxvYWRlclxuICApIHtcbiAgICBzdXBlcihpb25pY1BsYXRmb3JtKTtcblxuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dpbmdTZXJ2aWNlPy5nZXRMb2dnZXIoJ3BsYXRmb3JtJyk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgaWYgKHRoaXMuX2xvZ2dlcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdjdG9yJywgJ0NyZWF0aW5nIHNlcnZpY2UnKTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucGF1c2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ2N0b3InLCAnUGF1c2UgYXBwJyk7XG4gICAgICB9KTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucmVzdW1lLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdjdG9yJywgJ1Jlc3VtZSBhcHAnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kb3dubG9hZGluZ0pvYnM6IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBjaGVja0FwcFZlcnNpb25UaW1lcjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzKHBsYXRmb3JtTmFtZTogUGxhdGZvcm1zKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybU5hbWUpIHtcbiAgICAgIGNhc2UgJ21vYmlsZSc6XG4gICAgICAgIC8vIEV4Y2x1ZGUgV2luZG93cyB0b3VjaCBzY3JlZW5zIC0gc2VlIHN1bWFyaXMtYXBwIGlzc3VlcyAjMzIzIGFuZCAjMzQ2XG4gICAgICAgIHJldHVybiBpc01vYmlsZSh3aW5kb3cpO1xuICAgICAgY2FzZSAnbW9iaWxld2ViJzpcbiAgICAgICAgLy8gRXhjbHVkZSBXaW5kb3dzIHRvdWNoIHNjcmVlbnMgLSBzZWUgc3VtYXJpcy1hcHAgaXNzdWVzICMzMjMgYW5kICMzNDZcbiAgICAgICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpICYmICFpc1dpbmRvd3Mod2luZG93KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogdGhpcy5pcygnbW9iaWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ2FwYWNpdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYXBhY2l0b3I7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZG92YTtcbiAgfVxuXG4gIGlzQW5kcm9pZENvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9hbmRyb2lkICYmIHRoaXMuX2NvcmRvdmEpIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1NDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5faW9zICYmIHRoaXMuX2NvcmRvdmEpIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNBbmRyb2lkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lvcyB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzTWFjT1NEZXNrdG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kZXNrdG9wICYmIHRoaXMuaXNDb3Jkb3ZhKCk7XG4gIH1cblxuICAvKipcbiAgICogSXMgYSBuYXRpdmUgQXBwIChhbmQgTk9UIGEgbW9iaWxlIHdlYilcbiAgICovXG4gIGlzQXBwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQW5kcm9pZENvcmRvdmEoKSB8fCB0aGlzLmlzSU9TQ29yZG92YSgpO1xuICB9XG5cbiAgaXNXZWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzQXBwKCk7XG4gIH1cblxuICBpc01vYmlsZVdlYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2JpbGUgJiYgdGhpcy5pc1dlYigpO1xuICB9XG5cbiAgZ2V0IGNhbkRvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkZXIgJiYgdGhpcy5pc0FuZHJvaWRDb3Jkb3ZhKCk7XG4gIH1cblxuICBnZXQgY2FuT3BlbkZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBUT0RPOiBmaXhtZSB1c2luZyBAY2FwYWNpdG9yL2ZpbGVzeXN0ZW0gP1xuICB9XG5cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLndpZHRoKCk7XG4gIH1cblxuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLmhlaWdodCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybS4uLicpO1xuICAgIHRoaXMuX2xvZ2dlcj8uaW5mbygnbmdPblN0YXJ0JywgJ1N0YXJ0aW5nIHBsYXRmb3JtLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fbW9iaWxlID0gdGhpcy5pcygnbW9iaWxlJyk7XG4gICAgICB0aGlzLl9kZXNrdG9wID0gdGhpcy5pcygnZGVza3RvcCcpO1xuICAgICAgdGhpcy5fY29yZG92YSA9IHRoaXMuaXMoJ2NvcmRvdmEnKTtcbiAgICAgIHRoaXMuX2NhcGFjaXRvciA9IHRoaXMuaXMoJ2NhcGFjaXRvcicpO1xuICAgICAgdGhpcy5fYW5kcm9pZCA9IHRoaXMuaXMoJ2FuZHJvaWQnKTtcbiAgICAgIHRoaXMuX2lvcyA9IHRoaXMuaXMoJ2lvcycpO1xuXG4gICAgICBjb25zdCBsb2dNZXNzYWdlID0gYERldGVjdGVkIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgZGVza3RvcDogJHt0aGlzLl9kZXNrdG9wfSwgY29yZG92YTogJHt0aGlzLl9jb3Jkb3ZhfSwgY2FwYWNpdG9yOiAke3RoaXMuX2NhcGFjaXRvcn0sIGFuZHJvaWQ6ICR7dGhpcy5fYW5kcm9pZH0sIGlvczogJHt0aGlzLl9pb3N9fWA7XG4gICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gJyArIGxvZ01lc3NhZ2UpO1xuICAgICAgdGhpcy5fbG9nZ2VyPy5pbmZvKCduZ09uU3RhcnQnLCBsb2dNZXNzYWdlKTtcblxuICAgICAgLy8gQ29uZmlndXJlIHRoZW1lXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVRoZW1lKHRoaXMuX21vYmlsZSk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSBDYXBhY2l0b3IgcGx1Z2luc1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVDYXBhY2l0b3JQbHVnaW5zKCk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSB0cmFuc2xhdGlvblxuICAgICAgdGhpcy5jb25maWd1cmVUcmFuc2xhdGUoKTtcblxuICAgICAgLy8gQ29uZmlndXJlIGNhY2hlXG4gICAgICB0aGlzLmNvbmZpZ3VyZUNhY2hlKCk7XG5cbiAgICAgIC8vIFN0YXJ0IHJvb3Qgc2VydmljZXNcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmVudGl0aWVzU3RvcmFnZS5yZWFkeSgpLCB0aGlzLnNldHRpbmdzLnJlYWR5KCksIHRoaXMubmV0d29ya1NlcnZpY2UucmVhZHkoKSwgdGhpcy5hdWRpb1Byb3ZpZGVyLnJlYWR5KCldKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2ViIGFwcCBoYXMgdXBkYXRlLCBhbmQgcmVsb2FkIHBhZ2UgaWYgbmVlZFxuICAgICAgaWYgKHRoaXMuaXNXZWIoKSAmJiB0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFZlcnNpb24oeyBjYW5SZWxvYWQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZSBjb25maWd1cmF0aW9uIHdoZW4gbmV0d29yayBjaGFuZ2VkXG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICB0aGlzLm5ldHdvcmtTZXJ2aWNlLm9uTmV0d29ya1N0YXR1c0NoYW5nZXNcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHNraXAoMSkgLy8gQWxyZWFkeSBkb25lIG9uY2UsIHNvIHdlIHNraXAgdGhlIGZpcnN0IGV2ZW50XG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHR5cGUpID0+IHRoaXMuY29uZmlndXJlQ2FjaGUodHlwZSAhPT0gJ25vbmUnKSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYFtwbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0gW09LXSB7bW9iaWxlOiAke3RoaXMuX21vYmlsZX0sIGNhcGFjaXRvcjogJHt0aGlzLl9jYXBhY2l0b3J9LCB3ZWI6ICR7dGhpcy5pc1dlYigpfSwgZG93bmxvYWRlcjogJHt0aGlzLmNhbkRvd25sb2FkfX0gaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYFxuICAgICAgKTtcblxuICAgICAgLy8gUGFzcyBhdXRoIHRva2VuXG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maWcpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgICAgICAgLy8gVXBkYXRlIGF1dGhlbnRpY2F0aW9uIHR5cGVcbiAgICAgICAgICBjb25zdCB0b2tlblR5cGU6IEF1dGhUb2tlblR5cGUgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX1RPS0VOX1RZUEUpIGFzIEF1dGhUb2tlblR5cGU7XG4gICAgICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayh0b2tlblR5cGUpICYmIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlICE9PSB0b2tlblR5cGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBVc2luZyBhdXRoIHRva2VuIHR5cGUgeyR7dG9rZW5UeXBlfX1gKTtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdG9rZW5UeXBlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuYWJsZSBhdXRoIEFQSSB1c2luZyB0b2tlbnNcbiAgICAgICAgICBjb25zdCBhdXRoQXBpRW5hYmxlZCA9IGNvbmZpZy5nZXRQcm9wZXJ0eUFzQm9vbGVhbihDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfQVBJX1RPS0VOX0VOQUJMRUQpO1xuICAgICAgICAgIGlmIChpc05vdE5pbChhdXRoQXBpRW5hYmxlZCkgJiYgYXV0aEFwaUVuYWJsZWQgIT09IHRoaXMuYWNjb3VudFNlcnZpY2UuYXBpVG9rZW5FbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gVXNpbmcgYXV0aCBBUEkgdG9rZW5zID8gJHthdXRoQXBpRW5hYmxlZH19YCk7XG4gICAgICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLmFwaVRva2VuRW5hYmxlZCA9IGF1dGhBcGlFbmFibGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEhpZGUgdGhlIHNwbGFzaHNjcmVlbiAoaWYgbW9iaWxlIG9yIG1hY09TKSAtIGFmdGVyIDFzXG4gICAgICBpZiAodGhpcy5fbW9iaWxlIHx8IHRoaXMuaXNNYWNPU0Rlc2t0b3AoKSkge1xuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBTcGxhc2hTY3JlZW4uaGlkZSgpO1xuXG4gICAgICAgICAgLy8gUGxheSBzdGFydHVwIHNvdW5kIChpcyBtb2JpbGUpXG4gICAgICAgICAgaWYgKHRoaXMuX21vYmlsZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdWRpb1Byb3ZpZGVyLnBsYXlTdGFydHVwU291bmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBuZXcgdmVyc2lvbiwgZXZlcnkgMSBtaW5cbiAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWxNcyA9ICh0aGlzLmVudmlyb25tZW50LmNoZWNrQXBwVmVyc2lvbkludGVydmFsSW5TZWNvbmRzIHx8IDApICogMTAwMDtcbiAgICAgIGlmICh0aGlzLmlzV2ViKCkgJiYgdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uICYmIGNoZWNrSW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGltZXIoY2hlY2tJbnRlcnZhbE1zLCBjaGVja0ludGVydmFsTXMpLnN1YnNjcmliZSgoXykgPT5cbiAgICAgICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvbih7IHNpbGVudDogdHJ1ZSwgY2FuUmVsb2FkOiBmYWxzZSAvKmRvIE5PVCBhdXRvIHJlbG9hZCwgd2hlbiBhcHAgaXMgc3RhcnRlZCovIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXIgPSBzdWJzY3JpcHRpb247XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB0aGlzLnVucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBNYW5hZ2Ugc3RhcnR1cCBlcnJvclxuICAgICAgcmV0dXJuIHRoaXMub25TdGFydHVwRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBzaG93IGEgYmFja2Ryb3Agd2hlbiBwbGF0Zm9ybSBpcyBidXN5IChlLmcuIGZyb20gdGhlIGFwcC5jb21wb25lbnQudHMpXG4gICAqL1xuICBtYXJrQXNCdXN5KCkge1xuICAgIGlmICghdGhpcy5idXN5U3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5idXN5U3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc05vdEJ1c3koKSB7XG4gICAgaWYgKHRoaXMuYnVzeVN1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMuYnVzeVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3Blbih1cmw6IHN0cmluZywgb3B0cz86IE9taXQ8T3Blbk9wdGlvbnMsICd1cmwnPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBPcGVuaW5nIGxpbms6ICR7dXJsfWApO1xuICAgIGlmICh0aGlzLl9tb2JpbGUgJiYgdGhpcy5fY2FwYWNpdG9yKSB7XG4gICAgICBhd2FpdCBCcm93c2VyLm9wZW4oeyB1cmwsIC4uLm9wdHMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5vcGVuKHVybCwgb3B0cz8ud2luZG93TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RG93bmxvYWRpbmdKb2IodXJpOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHVyaSk7XG4gIH1cblxuICBkb3dubG9hZChyZXF1ZXN0OiB7IHVyaTogc3RyaW5nOyBmaWxlbmFtZT86IHN0cmluZyB9ICYgUGFydGlhbDxEb3dubG9hZFJlcXVlc3Q+KTogT2JzZXJ2YWJsZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXJlcXVlc3QudXJpKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGFyZ3VtZW50ICdyZXF1ZXN0JyBvciAncmVxdWVzdC51cmknXCIpO1xuXG4gICAgaWYgKHRoaXMuY2FuRG93bmxvYWQpIHtcbiAgICAgIC8vIENoZWNrIGlmIG5vdCBhbHJlYWR5IGRvd25sb2FkaW5nIGZpbGVcbiAgICAgIGxldCBqb2IkID0gdGhpcy5fZG93bmxvYWRpbmdKb2JzLmdldChyZXF1ZXN0LnVyaSk7XG4gICAgICBpZiAoam9iJCkgcmV0dXJuIGpvYiQ7XG5cbiAgICAgIC8vIENvbXB1dGUgc3ViUGF0aCAoZmluYWwgZmlsZW5hbWUpXG4gICAgICBsZXQgc3ViUGF0aCA9XG4gICAgICAgIHJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyPy5zdWJQYXRoIHx8XG4gICAgICAgIHJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXI/LnN1YlBhdGggfHxcbiAgICAgICAgcmVxdWVzdC5maWxlbmFtZSB8fFxuICAgICAgICBVcmlVdGlscy5nZXRGaWxlbmFtZShyZXF1ZXN0LnVyaSkgfHxcbiAgICAgICAgcmVxdWVzdC50aXRsZSB8fFxuICAgICAgICAnZG93bmxvYWQnO1xuXG4gICAgICBzdWJQYXRoID0gc3ViUGF0aFxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAvLyBSZW1vdmUgc3BhY2VzXG4gICAgICAgIC5yZXBsYWNlKC9cXHMrL2csICctJyk7XG5cbiAgICAgIC8vIEZvcmNlIEFQSyB0byBmaW5pc2ggd2l0aCAnLmFwaydcbiAgICAgIGlmIChyZXF1ZXN0Lm1pbWVUeXBlID09PSBNaW1lVHlwZXMuQU5EUk9JRF9BUEsgJiYgIXN1YlBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLmFwaycpKSB7XG4gICAgICAgIHN1YlBhdGggKz0gJy5hcGsnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkb3dubG9hZFJlcXVlc3QgPSA8RG93bmxvYWRSZXF1ZXN0PntcbiAgICAgICAgdmlzaWJsZUluRG93bmxvYWRzVWk6IHRydWUsXG4gICAgICAgIG5vdGlmaWNhdGlvblZpc2liaWxpdHk6IE5vdGlmaWNhdGlvblZpc2liaWxpdHkuVmlzaWJsZU5vdGlmeUNvbXBsZXRlZCxcbiAgICAgICAgLi4ucmVxdWVzdCxcbiAgICAgICAgZmlsZW5hbWU6IHVuZGVmaW5lZCwgLy8gRm9yY2UgdW5zZXRcbiAgICAgICAgZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyOiAhcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaXJUeXBlOiBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTLFxuICAgICAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0RpcixcbiAgICAgICAgICAgICAgc3ViUGF0aCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXI6IHJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXJcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGlyVHlwZTogQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEUyxcbiAgICAgICAgICAgICAgLi4ucmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpcixcbiAgICAgICAgICAgICAgc3ViUGF0aCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0YXJ0IGRvd25sb2FkXG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIERvd25sb2FkaW5nLCB1c2luZyByZXF1ZXN0OiAnICsgSlNPTi5zdHJpbmdpZnkoZG93bmxvYWRSZXF1ZXN0KSk7XG4gICAgICBqb2IkID0gZnJvbSh0aGlzLmRvd25sb2FkZXIuZG93bmxvYWQoZG93bmxvYWRSZXF1ZXN0KSk7XG5cbiAgICAgIC8vIFJlbWVtYmVyIHRoaXMgcmVxdWVzdCB1cmlcbiAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5zZXQoZG93bmxvYWRSZXF1ZXN0LnVyaSwgam9iJCk7XG4gICAgICByZXR1cm4gam9iJC5waXBlKFxuICAgICAgICB0YXAoKGxvY2F0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIEZpbGUgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgYXQ6JyArIGxvY2F0aW9uKTtcbiAgICAgICAgICAvLyBGb3JnZXQgam9iXG4gICAgICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLmRlbGV0ZShkb3dubG9hZFJlcXVlc3QudXJpKTtcbiAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIFVuYWJsZSB0byBkb3dubG9hZDogJyArICgoZXJyICYmIGVyci5tZXNzYWdlKSB8fCBlcnIpKTtcbiAgICAgICAgICAvLyBGb3JnZXQgdGhlIHJlcXVlc3RcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKGRvd25sb2FkUmVxdWVzdC51cmkpO1xuXG4gICAgICAgICAgLy8gUmV0cnkgd2l0aCBhbm90aGVyIGxvY2F0aW9uIC0gaXNzdWUgaW4gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uXG4gICAgICAgICAgaWYgKGRvd25sb2FkUmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI/LmRpclR5cGUgPT09IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMpIHtcbiAgICAgICAgICAgIGRvd25sb2FkUmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXIuZGlyVHlwZSA9IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFNfT0xEO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWQoZG93bmxvYWRSZXF1ZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAoaWYgbm90IEFuZHJvaWQgYW5kIENhcGFjaXRvcik6IG9wZW5pbmcgdGhlIFVSSVxuICAgIC8vIFRPRE86IGZpbmQgYSB3YXkgdG8gZG93bmxvYWQgdW5kZXIgaU9TIChzZWUgaHR0cHM6Ly93d3cuYy1zaGFycGNvcm5lci5jb20vYXJ0aWNsZS9ob3ctdG8tZG93bmxvYWQtYS1maWxlLXVzaW5nLWZpbGUtdHJhbnNmZXItcGx1Z2luLWluLWlvbmljLTMvKVxuICAgIGVsc2Uge1xuICAgICAgRmlsZXNVdGlscy5kb3dubG9hZFVyaShyZXF1ZXN0LnVyaSwgcmVxdWVzdC5maWxlbmFtZSk7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb3B5VG9DbGlwYm9hcmQoZGF0YTogc3RyaW5nIHwgV3JpdGVPcHRpb25zLCBvcHRzPzogU2hvd1RvYXN0T3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IGRhdGEuc3RyaW5nO1xuICAgIGxldCBjb3BpZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmlzQW5kcm9pZENvcmRvdmEoKSkge1xuICAgICAgY29uc3Qgd3JpdGVPcHRpb25zID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8geyBzdHJpbmc6IHZhbHVlIH0gOiBkYXRhO1xuICAgICAgYXdhaXQgQ2xpcGJvYXJkLndyaXRlKHdyaXRlT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvcGllZCA9IHRoaXMuY2RrQ2xpcGJvYXJkLmNvcHkodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChjb3BpZWQpIHtcbiAgICAgIC8vIFNob3cgdG9hc3RcbiAgICAgIGlmIChvcHRzICYmIGlzTm90TmlsT3JCbGFuayhvcHRzLm1lc3NhZ2UpKSB7XG4gICAgICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBVbmFibGUgdG8gY29weSB0byBjbGlwYm9hcmQ6ICcgKyBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVUaGVtZShvcHRpb25zOiB7IGRhcmtNb2RlPzogYm9vbGVhbjsgY29sb3JzPzogeyBbY29sb3I6IHN0cmluZ106IHN0cmluZyB9OyB2YXJzPzogeyBbY29sb3I6IHN0cmluZ106IHN0cmluZyB9IH0pIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxuICAgIC8vIG9wdGlvbnMuY29sb3JzID0ge1xuICAgIC8vICAgLi4ub3B0aW9ucy5jb2xvcnMsXG4gICAgLy8gICBwcmltYXJ5OiAnIzEyNDU0MScsXG4gICAgLy8gfTtcblxuICAgIC8vIFNldCBjb2xvcnNcbiAgICBpZiAob3B0aW9ucy5jb2xvcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDaGFuZ2luZyB0aGVtZSBjb2xvcnMgJywgb3B0aW9ucy5jb2xvcnMpO1xuXG4gICAgICAvLyBBZGQgMTAwICYgOTAwIGNvbG9yIGZvciBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY29sb3JcbiAgICAgIFsncHJpbWFyeScsICdzZWNvbmRhcnknXS5mb3JFYWNoKChjb2xvck5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBvcHRpb25zLmNvbG9yc1tjb2xvck5hbWVdO1xuICAgICAgICBvcHRpb25zLmNvbG9yc1tjb2xvck5hbWUgKyAnMTAwJ10gPSAoY29sb3IgJiYgbWl4SGV4KCcjZmZmZmZmJywgY29sb3IsIDEwKSkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBvcHRpb25zLmNvbG9yc1tjb2xvck5hbWUgKyAnOTAwJ10gPSAoY29sb3IgJiYgbWl4SGV4KCcjMDAwMDAwJywgY29sb3IsIDEyKSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9wdGlvbnMuY29sb3JzKS5mb3JFYWNoKChjb2xvck5hbWUpID0+IHtcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHZhbHVlXG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX1gKTtcbiAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS1yZ2JgKTtcbiAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS1jb250cmFzdGApO1xuICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LWNvbnRyYXN0LXJnYmApO1xuICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LXNoYWRlYCk7XG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX0tdGludGApO1xuXG4gICAgICAgIC8vIFNldCBuZXcgdmFsdWUsIGlmIGFueVxuICAgICAgICBjb25zdCBjb2xvciA9IG9wdGlvbnMuY29sb3JzW2NvbG9yTmFtZV07XG4gICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoY29sb3IpKSB7XG4gICAgICAgICAgLy8gQmFzZSBjb2xvclxuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX1gLCBjb2xvcik7XG4gICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS1yZ2JgLCBoZXhUb1JnYkFycmF5KGNvbG9yKS5qb2luKCcsICcpKTtcblxuICAgICAgICAgIC8vIENvbnRyYXN0IGNvbG9yXG4gICAgICAgICAgY29uc3QgY29udHJhc3RDb2xvciA9IGdldENvbG9yQ29udHJhc3QoY29sb3IsIHRydWUpO1xuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX0tY29udHJhc3RgLCBjb250cmFzdENvbG9yKTtcbiAgICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LWNvbnRyYXN0LXJnYmAsIGhleFRvUmdiQXJyYXkoY29udHJhc3RDb2xvcikuam9pbignLCAnKSk7XG5cbiAgICAgICAgICAvLyBTaGFkZSBjb2xvclxuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX0tc2hhZGVgLCBnZXRDb2xvclNoYWRlKGNvbG9yKSk7XG5cbiAgICAgICAgICAvLyBUaW50IGNvbG9yXG4gICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS10aW50YCwgZ2V0Q29sb3JUaW50KGNvbG9yKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBDU1MgdmFyc1xuICAgIGlmIChvcHRpb25zLnZhcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDaGFuZ2luZyB0aGVtZSB2YXJzICcsIG9wdGlvbnMudmFycyk7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvcHRpb25zLnZhcnMpLmZvckVhY2goKHZhck5hbWUpID0+IHtcbiAgICAgICAgLy8gU2V0IG5ldyB2YWx1ZSwgaWYgYW55XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YXJzW3Zhck5hbWVdO1xuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHZhbHVlKSkge1xuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KHZhck5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eSh2YXJOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRhcmsgbW9kZVxuICAgIGlmIChpc05vdE5pbChvcHRpb25zLmRhcmtNb2RlKSkge1xuICAgICAgYXdhaXQgdGhpcy50b2dnbGVEYXJrVGhlbWUob3B0aW9ucy5kYXJrTW9kZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdG9nZ2xlRGFya1RoZW1lKGVuYWJsZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Q7XG5cbiAgICAvLyBUb2dnbGUgdGhlIGNsYXNzXG4gICAgY29uc3Qgd2FzRW5hYmxlZCA9IGNsYXNzTGlzdC5jb250YWlucygnZGFyaycpO1xuICAgIGlmIChlbmFibGUgIT09IHdhc0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gJHtlbmFibGUgPyAnRW5hYmxlJyA6ICdEaXNhYmxlJ30gZGFyayBtb2RlLi4uYCk7XG4gICAgICBjbGFzc0xpc3QudG9nZ2xlKCdkYXJrJywgZW5hYmxlKTtcblxuICAgICAgLy8gSWYgbW9iaWxlIChBbmRyb2lkIG9yIGlPUylcbiAgICAgIGlmICh0aGlzLmlzQXBwKCkgJiYgKHRoaXMuaXNJT1MoKSB8fCB0aGlzLmlzQW5kcm9pZCgpKSkge1xuICAgICAgICAvLyBSZWFkIHRoZSBwcmltYXJ5IGNvbG9yLCBpZiBhbnlcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2xvciA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0taW9uLWNvbG9yLXByaW1hcnknKT8udHJpbSgpO1xuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSAhcHJpbWFyeUNvbG9yIHx8IGVuYWJsZSA/ICcjMDAwMDAwJyA6IHByaW1hcnlDb2xvcjtcblxuICAgICAgICAvLyBDb25maWd1cmUgc3RhdHVzIGJhciBzdHlsZVxuICAgICAgICBjb25zdCBzdGF0dXNCYXJTdHlsZSA9IGlzTGlnaHRDb2xvcihiYWNrZ3JvdW5kQ29sb3IpID8gU3R5bGUuTGlnaHQgOiBTdHlsZS5EYXJrO1xuICAgICAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIFN0YXR1c0JhciBpY29ucyBzdHlsZTogJHtzdGF0dXNCYXJTdHlsZX0gLi4uYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgU3RhdHVzQmFyLnNldFN0eWxlKHsgc3R5bGU6IHN0YXR1c0JhclN0eWxlIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIEVycm9yIHdoaWxlIHNldHRpbmcgU3RhdHVzQmFyIGljb25zIHN0eWxlJywgZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpZ3VyZSBzdGF0dXMgYmFyIGJhY2tncm91bmQgY29sb3IgKGFsd2F5cyB1c2UgYmxhY2sgb24gZGFyayBtb2RlKVxuXG4gICAgICAgIGlmICh0aGlzLmlzQW5kcm9pZCgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gRWRnZVRvRWRnZSBiYWNrZ3JvdW5kIGNvbG9yOiAke2JhY2tncm91bmRDb2xvcn1gKTtcbiAgICAgICAgICAgIGF3YWl0IEVkZ2VUb0VkZ2Uuc2V0QmFja2dyb3VuZENvbG9yKHsgY29sb3I6IGJhY2tncm91bmRDb2xvciB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRXJyb3Igd2hpbGUgc2V0dGluZyBFZGdlVG9FZGdlIGJhY2tncm91bmQgY29sb3InLCBlcnIpO1xuICAgICAgICAgICAgYXdhaXQgU3RhdHVzQmFyLnNldEJhY2tncm91bmRDb2xvcih7IGNvbG9yOiBiYWNrZ3JvdW5kQ29sb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIFN0YXR1c0JhciBiYWNrZ3JvdW5kIGNvbG9yOiAke2JhY2tncm91bmRDb2xvcn1gKTtcbiAgICAgICAgICAgIGF3YWl0IFN0YXR1c0Jhci5zZXRCYWNrZ3JvdW5kQ29sb3IoeyBjb2xvcjogYmFja2dyb3VuZENvbG9yIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBFcnJvciB3aGlsZSBzZXR0aW5nIFN0YXR1c0JhciBiYWNrZ3JvdW5kIGNvbG9yJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVIaWdoQ29udHJhc3QoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKGVuYWJsZSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaGlnaC1jb250cmFzdCcpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIEVuYWJsZSBoaWdoIGNvbnRyYXN0Li4uJyk7XG4gICAgfVxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWdoLWNvbnRyYXN0JywgZW5hYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZGVlcCBsaW5rcyAoQW5kcm9pZCBBcHAgTGlua3MgLyBpT1MgVW5pdmVyc2FsIExpbmtzKVxuICAgKi9cbiAgYXN5bmMgYWRkRGVlcExpbmtMaXN0ZW5lcihsaXN0ZW5lckZuOiAoZGVwcExpbms6IHtwZWVyVXJsOiBzdHJpbmc7IHBhdGg6IHN0cmluZ30pID0+IHZvaWQpOiBQcm9taXNlPFN1YnNjcmlwdGlvbj4ge1xuICAgIGlmICghdGhpcy5pc0FwcCgpIHx8ICh0eXBlb2YgbGlzdGVuZXJGbiAhPT0gJ2Z1bmN0aW9uJykpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gSGFuZGxlIGRlZXAgbGlua3MgKEFuZHJvaWQgQXBwIExpbmtzIC8gaU9TIFVuaXZlcnNhbCBMaW5rcylcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFN0YXJ0IGxpc3RlbiBkZWVwIGxpbmtzJyk7XG5cbiAgICAgIGNvbnN0IHsgQXBwIH0gPSBhd2FpdCBpbXBvcnQoJ0BjYXBhY2l0b3IvYXBwJyk7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGF3YWl0IEFwcC5hZGRMaXN0ZW5lcignYXBwVXJsT3BlbicsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gUHJvY2Vzc2luZyBkZWVwIGxpbms6ICR7ZGF0YT8udXJsfWApO1xuXG4gICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkYXRhPy51cmwgfHwgJycpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwZWVyXG4gICAgICAgICAgY29uc3QgcGVlciA9IFBlZXIucGFyc2VVcmwodXJsKTtcbiAgICAgICAgICBwZWVyLnBhdGggPSB1bmRlZmluZWQ7IC8vIEZJWE1FIFdlIGNsZWFuIHRoZSBwYXRoICg9YmFzZUhyZWYpIGFzIHdlIGNhbm5vdCBkZXRlY3QgaXQgZnJvbSBhIGRlZXAgbGlua1xuXG4gICAgICAgICAgLy8gQnVpbGQgYW4gYWJzb2x1dGUgcGF0aCBmcm9tIHRoZSBVUkwgcGF0aG5hbWUgYW5kIHNlYXJjaFxuICAgICAgICAgIGNvbnN0IHBhdGggPSBVcmxVdGlscy5hZGRUcmFpbGluZ1NsYXNoKFVybFV0aWxzLmNsZWFuVXJsKHVybC5wYXRobmFtZSB8fCAnLycpKSA7XG4gICAgICAgICAgY29uc3QgcXVlcnkgPSB1cmwuc2VhcmNoIHx8ICcnO1xuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7cGF0aH0ke3F1ZXJ5fWA7XG5cbiAgICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gUHJvY2Vzc2luZyBkZWVwIGxpbmsgW09LXSAtIHBlZXI6ICR7cGVlci51cmx9IHBhdGg6ICR7ZnVsbFBhdGh9YCk7XG5cbiAgICAgICAgICAvLyBDYWxsIHRoZSBnaXZlbiBsaXN0ZW5lclxuICAgICAgICAgIGxpc3RlbmVyRm4oe3BlZXJVcmw6IHBlZXIudXJsLCBwYXRoOiBmdWxsUGF0aH0pO1xuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gRmFpbGVkIHRvIGhhbmRsZSBkZWVwIGxpbmsnLCBlLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgc3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdG9wIGxpc3RlbiBkZWVwIGxpbmtzJyk7XG4gICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnVucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uID0gbnVsbDsgLy8gRm9yZ2V0IHRoZSBzdWJzY3JpcHRpb25cbiAgICAgIH0pXG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIENhcGFjaXRvciBBcHAgcGx1Z2luIG5vdCBhdmFpbGFibGUgZm9yIGRlZXAgbGlua3MnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxIVE1MSW9uVG9hc3RFbGVtZW50PiB7XG4gICAgaWYgKCF0aGlzLnRvYXN0Q29udHJvbGxlcikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50J3MgY29uc3RydWN0b3JcIik7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIG9uV2lsbFByZXNlbnQ6ICh0KSA9PiByZXNvbHZlKHQpLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2xvc2VUb2FzdChpZD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnRvYXN0Q29udHJvbGxlcj8uZGlzbWlzcyhudWxsLCBudWxsLCBpZCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBjb25maWd1cmVUaGVtZShtb2JpbGU6IGJvb2xlYW4sIHdpbjogYW55ID0gd2luZG93KSB7XG4gICAgLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHNldHRpbmdzIGRhcmsgbW9kZVxuICAgIGlmICh0aGlzLmVudmlyb25tZW50LmFsbG93RGFya01vZGUpIHtcbiAgICAgIGNvbnN0IGlzU2NyZWVuJCA9IG5ldyBPYnNlcnZhYmxlPGJvb2xlYW4+KChvYnNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaE1lZGlhID0gd2luLm1hdGNoTWVkaWEoJ3NjcmVlbicpO1xuICAgICAgICBtYXRjaE1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiBvYnNlcnZlci5uZXh0KGUubWF0Y2hlcykpO1xuICAgICAgICBvYnNlcnZlci5uZXh0KG1hdGNoTWVkaWEubWF0Y2hlcyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW2lzU2NyZWVuJCwgdGhpcy5zZXR0aW5ncy5kYXJrTW9kZSRdKS5zdWJzY3JpYmUoKFtpc1NjcmVlbiwgZW5hYmxlXSkgPT4gdGhpcy50b2dnbGVEYXJrVGhlbWUoaXNTY3JlZW4gJiYgZW5hYmxlKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMudG9nZ2xlRGFya1RoZW1lKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBXb3JrYXJvdW5kLCBmb3IgTVMgV2luZG93cyB0b3VjaCBzY3JlZW4gKGRldGVjdGVkIGFzIG1vYmlsZSwgYnV0IGZvcmNlZCBhcyBkZXNrdG9wKVxuICAgIGlmIChcbiAgICAgICFtb2JpbGUgJiZcbiAgICAgICh3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Py5jbGFzc0xpc3QuY29udGFpbnMoJ3BsdC1tb2JpbGUnKSB8fCB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdD8uY29udGFpbnMoJ3BsdC1tb2JpbGV3ZWInKSlcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBGb3JjZSBjbGFzcyBsaXN0IHRvOiA8aHRtbCBjbGFzcz1cInBsdC1kZXNrdG9wXCI+LiBXb3JrYXJvdW5kIGZvciBXaW5kb3dzIHRvdWNoIHNjcmVlbi4nKTtcbiAgICAgIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncGx0LW1vYmlsZScsICdwbHQtbW9iaWxld2ViJyk7XG4gICAgICB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BsdC1kZXNrdG9wJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMoKSB7XG4gICAgaWYgKCF0aGlzLl9jYXBhY2l0b3IpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIENhcGFjaXRvciBwbHVnaW5zLi4uJyk7XG5cbiAgICBsZXQgcGx1Z2luTmFtZTogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBwbHVnaW5OYW1lID0gQ2FwYWNpdG9yUGx1Z2lucy5FZGdlVG9FZGdlO1xuICAgICAgaWYgKHRoaXMuaXNBcHAoKSAmJiB0aGlzLmlzQW5kcm9pZCgpKSB7XG4gICAgICAgIGF3YWl0IEVkZ2VUb0VkZ2UuZW5hYmxlKCk7XG4gICAgICB9XG5cbiAgICAgIHBsdWdpbk5hbWUgPSBDYXBhY2l0b3JQbHVnaW5zLlN0YXR1c0JhcjtcbiAgICAgIGlmICh0aGlzLmlzQXBwKCkpIHtcbiAgICAgICAgLy8gQXZvaWQgb3ZlcmxheXMgKEFuZHJvaWQgMTUgb3IgaU9TKVxuICAgICAgICBhd2FpdCBTdGF0dXNCYXIuc2V0T3ZlcmxheXNXZWJWaWV3KHsgb3ZlcmxheTogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhpZGUgYWNjZXNzb3J5IGJhciAoaU9TIG9ubHkpXG4gICAgICBpZiAodGhpcy5pc0FwcCgpICYmIHRoaXMuaXNJT1MoKSkge1xuICAgICAgICBwbHVnaW5OYW1lID0gQ2FwYWNpdG9yUGx1Z2lucy5LZXlib2FyZDtcbiAgICAgICAgYXdhaXQgS2V5Ym9hcmQuc2V0QWNjZXNzb3J5QmFyVmlzaWJsZSh7IGlzVmlzaWJsZTogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBsb2dNZXNzYWdlID0gYEVycm9yIHdoaWxlIGNvbmZpZ3VyaW5nICR7cGx1Z2luTmFtZX0gcGx1Z2luOiAke2Vyci5tZXNzYWdlIHx8IGVycn1cXG4ke2Vycj8ub3JpZ2luYWxTdGFjayB8fCBKU09OLnN0cmluZ2lmeShlcnIpfWA7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dICcgKyBsb2dNZXNzYWdlKTtcbiAgICAgIHRoaXMuX2xvZ2dlcj8uZXJyb3IoJ2NvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMnLCBsb2dNZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlVHJhbnNsYXRlKCkge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBpMThuIC4uLicpO1xuXG4gICAgLy8gdGhpcyBsYW5ndWFnZSB3aWxsIGJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdHJhbnNsYXRpb24gaXNuJ3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZyh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgIC8vIGFwcGx5IGxvY2FsZSBpbW1lZGlhdGVseVxuICAgIHRoaXMuYXBwbHlMb2NhbGUodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIC8vIFdoZW4gbG9jYWxlIGNoYW5nZXMsIGFwcGx5IHRvIGRhdGUgYWRhcHRlclxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQubGFuZykge1xuICAgICAgICAgIHRoaXMuYXBwbHlMb2NhbGUoZXZlbnQubGFuZyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnNldHRpbmdzLm9uQ2hhbmdlLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIC8vIEFwcGx5IGxvY2FsZVxuICAgICAgICAgIGlmIChkYXRhLmxvY2FsZSkge1xuICAgICAgICAgICAgaWYgKGRhdGEubG9jYWxlICE9PSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZykge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UoZGF0YS5sb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBseWluZyBkZWZhdWx0LCB3aGVuIHNldHRpbmdzIGhhcyBubyBsb2NhbGUgcHJvcGVydHkgKGhvdGZpeCAtIGx1ZG92aWMucGVjcXVvdEBlLWlzLnBybyAtIDE0LzExLzIwMjEgLSBzaW5jZSB2MS4yMC40MilcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBObyBsb2NhbGUgZm91bmQgaW4gc2V0dGluZ3M6IGFwcGx5aW5nIGRlZmF1bHRMb2NhbGU6ICcsIHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZSBhY2NvdW50J3Mgc2V0dGluZ3MsIChsaWtlIGxvY2FsZSksIHdoZW4gYWNjb3VudCBpbmhlcml0YW5jZSBlbmFibGVkXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbi5zdWJzY3JpYmUoYXN5bmMgKGFjY291bnQpID0+IHtcbiAgICAgICAgaWYgKGFjY291bnQuc2V0dGluZ3MgJiYgdGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5hY2NvdW50SW5oZXJpdGFuY2UpIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIENvcHlpbmcgYWNjb3VudCBzZXR0aW5ncyBpbnRvIGxvY2FsIHNldHRpbmdzLi4uJyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5hcHBseShhY2NvdW50LnNldHRpbmdzLmFzTG9jYWxTZXR0aW5ncygpKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwcGx5TG9jYWxlKGxvY2FsZTogc3RyaW5nKSB7XG4gICAgLy8gZm9yY2UgJ2VuJyBhcyAnZW5fR0InXG4gICAgaWYgKGxvY2FsZSA9PT0gJ2VuJykge1xuICAgICAgbG9jYWxlID0gJ2VuX0dCJztcbiAgICB9XG5cbiAgICAvLyBjb25maWcgbW9tZW50IGxpYlxuICAgIHRyeSB7XG4gICAgICBtb21lbnRMb2NhbGUobG9jYWxlKTtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gVXNlIGxvY2FsZSB7JyArIGxvY2FsZSArICd9Jyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiBlcnJvciwgZmFsbGJhY2sgdG8gZW5cbiAgICAgIG1vbWVudExvY2FsZSgnZW4nKTtcbiAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBVbmtub3duIGxvY2FsZSBmb3IgbW9tZW50IGxpYi4gVXNpbmcgZGVmYXVsdCBbZW5dJyk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlnIGRhdGUgYWRhcHRlclxuICAgIHRoaXMuZGF0ZUFkYXB0ZXIuc2V0TG9jYWxlKG1vbWVudExvY2FsZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVDYWNoZShvbmxpbmU/OiBib29sZWFuKSB7XG4gICAgb25saW5lID0gdG9Cb29sZWFuKG9ubGluZSwgdGhpcy5jYWNoZS5pc09ubGluZSgpKTtcbiAgICBjb25zdCBjYWNoZVRUTCA9IG9ubGluZSA/IDM2MDAgLyogMWggKi8gOiAzNjAwICogMjQgKiAzMDsgLyogMSBtb250aCAqL1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBDb25maWd1cmluZyBjYWNoZSBbT0tdIHtvbmxpbmU6ICR7b25saW5lfSwgdGltZVRvTGl2ZTogJHtjYWNoZVRUTCAvIDM2MDB9aCwgb2ZmbGluZUludmFsaWRhdGU6IGZhbHNlfWApO1xuICAgIHRoaXMuY2FjaGUuc2V0RGVmYXVsdFRUTChjYWNoZVRUTCk7XG4gICAgdGhpcy5jYWNoZS5zZXRPZmZsaW5lSW52YWxpZGF0ZShmYWxzZSk7IC8vIERvIG5vdCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gb2ZmbGluZVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrQXBwVmVyc2lvbihvcHRzPzogeyBjYW5SZWxvYWQ/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5uZXR3b3JrU2VydmljZS5vZmZsaW5lIHx8ICF0aGlzLmlzV2ViKCkpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc3Qgc2lsZW50ID0gb3B0cz8uc2lsZW50ID09PSB0cnVlO1xuICAgIGNvbnN0IHByb2R1Y3Rpb24gPSB0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgY29uc3QgY2FuQXV0b1JlbG9hZCA9ICFvcHRzIHx8IG9wdHMuY2FuUmVsb2FkICE9PSBmYWxzZTtcblxuICAgIGlmICghc2lsZW50KSBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ2hlY2tpbmcgcmVtb3RlIGFwcCB2ZXJzaW9uLi4uJyk7XG5cbiAgICBjb25zdCBhY3R1YWxWZXJzaW9uID0gdGhpcy5lbnZpcm9ubWVudC52ZXJzaW9uO1xuICAgIGlmIChpc05pbE9yQmxhbmsoYWN0dWFsVmVyc2lvbikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbcGxhdGZvcm1dIE1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yICdlbnZpcm9ubWVudC52ZXJzaW9uJy4gQ2Fubm90IGNoZWNrIHJlbW90ZSBhcHAgdmVyc2lvbi5cIik7XG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpOyAvLyBTdG9wIHRpbWVyIGlmIGV4aXN0c1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3RlVmVyc2lvbiA9IGF3YWl0IHRoaXMubmV0d29ya1NlcnZpY2UuZ2V0QXBwVmVyc2lvbigpO1xuICAgIGlmIChpc05pbE9yQmxhbmsocmVtb3RlVmVyc2lvbikpIHtcbiAgICAgIGlmIChwcm9kdWN0aW9uICYmICFzaWxlbnQpIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gQ2Fubm90IGxvYWQgcmVtb3RlIGFwcCB2ZXJzaW9uLiBTa2lwcGluZyB2ZXJzaW9uIGNoZWNrJyk7XG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpOyAvLyBTdG9wIHRpbWVyIGlmIGV4aXN0c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChWZXJzaW9uVXRpbHMuaXNDb21wYXRpYmxlKHJlbW90ZVZlcnNpb24sIGFjdHVhbFZlcnNpb24pKSB7XG4gICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENoZWNraW5nIHJlbW90ZSBhcHAgdmVyc2lvbiBbT0tdIHtyZW1vdGU6ICcke3JlbW90ZVZlcnNpb259JywgYWN0dWFsOiAnJHthY3R1YWxWZXJzaW9ufSd9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgbmV3ZXIgdmVyc2lvbiBleGlzdHNcbiAgICBsZXQgcmVsb2FkUGF0aCA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvWyY/XXZlcnNpb249W14mXSovZ2ksICcnKTsgLy8gUmVtb3ZlIG9sZCB2ZXJzaW9uIGluIHF1ZXJ5IHBhcmFtc1xuICAgIHJlbG9hZFBhdGggKz0gcmVsb2FkUGF0aC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnOyAvLyBBZGQgcXVlcnkgcGFyYW0gc2VwYXJhdG9yXG4gICAgcmVsb2FkUGF0aCArPSAndmVyc2lvbj0nICsgcmVtb3RlVmVyc2lvbjsgLy8gQWRkIHZlcnNpb24gKHRvIGF2b2lkIGEgcmVsb2FkIGluZmluaXRlIGxvb3ApXG5cbiAgICAvLyBBbHJlYWR5IHRyeSB0byByZWxvYWQsIGJ1dCB2ZXJzaW9uIHN0aWxsIGJhZFxuICAgIGlmIChyZWxvYWRQYXRoID09PSBsb2NhdGlvbi5ocmVmKSB7XG4gICAgICBpZiAoY2FuQXV0b1JlbG9hZClcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3BsYXRmb3JtXSBSZWxvYWRlZCBwYWdlIGZhaWxlZCwgYmVjYXVzZSB2ZXJzaW9uIHN0aWxsIG1pc21hdGNoISBQbGVhc2UgY2hlY2sgdmVyc2lvbi5hcHB1cCBmaWxlIChleHBlY3RlZCBhcHAgdmVyc2lvbjogJHthY3R1YWxWZXJzaW9ufSlgXG4gICAgICAgICk7XG4gICAgICAvLyBTdG9wIHRpbWVyLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybihgW3BsYXRmb3JtXSBNb3JlIHJlY2VudCB2ZXJzaW9uIGRldGVjdGVkIChyZW1vdGU6ICR7cmVtb3RlVmVyc2lvbn0sIGFjdHVhbDogJHthY3R1YWxWZXJzaW9ufWApO1xuXG4gICAgLy8gQXV0byByZWxvYWRcbiAgICBpZiAoY2FuQXV0b1JlbG9hZCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFdpbGwgcmVsb2FkaW5nIGF0ICcgKyByZWxvYWRQYXRoKTtcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgLy8gQXBwIHN0b3BcbiAgICB9XG4gICAgLy8gQXNrIHVzZXIgdG8gcmVsb2FkXG4gICAgZWxzZSB7XG4gICAgICAvLyBTdG9wIHRpbWVyLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuXG4gICAgICAvLyBEaXNwbGF5IGEgcmVsb2FkIHRvYXN0XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdDT05GSVJNLlJFTE9BRF9BUFAnLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7IHZlcnNpb246IHJlbW90ZVZlcnNpb24sIG5hbWU6IHRoaXMuZW52aXJvbm1lbnQubmFtZSB9LFxuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgLy8gUmVsb2FkIGJ1dHRvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTU1PTi5CVE5fVVBEQVRFJyksXG4gICAgICAgICAgICBzaWRlOiAnZW5kJyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHJlbG9hZFBhdGg7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU3RhcnR1cEVycm9yKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRmFpbGVkIHN0YXJ0aW5nIHRoZSBwbGF0Zm9ybSEgJyArIEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgIGxldCBtZXNzYWdlID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgIGNvbnN0IGRldGFpbHNNZXNzYWdlID0gZXJyICYmICgoZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubWVzc2FnZSkgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSkge1xuICAgICAgICBtZXNzYWdlICs9IGAge2NvZGU6ICR7ZXJyLmNvZGV9fWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgPSBgRmF0YWwgZXJyb3I6IFBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci5cXG5cXG57Y29kZTogJHsoZXJyICYmIGVyci5jb2RlKSB8fCAnbnVsbCd9LCBtZXNzYWdlOiBcIiR7bWVzc2FnZX1cIn1gO1xuICAgIH1cbiAgICBpZiAodGhpcy50b2FzdENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGA8YnIvPjxzbWFsbD4ke2RldGFpbHNNZXNzYWdlfTwvc21hbGw+YDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgZHVyYXRpb246IC0xLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbntjYXVzZTogXCIke2RldGFpbHNNZXNzYWdlfVwifWA7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICBpZiAoZXJyICYmIGVyci5kZXRhaWxzKSBjb25zb2xlLmVycm9yKCdjYXVzZScsIGVyci5kZXRhaWxzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|