@sumaris-net/ngx-components 2.7.2-rc9 → 2.7.3-rc2
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/doc/changelog.md +36 -0
- package/esm2022/public_api.mjs +11 -9
- package/esm2022/src/app/admin/admin-routing.module.mjs +10 -17
- package/esm2022/src/app/admin/admin.module.mjs +7 -9
- package/esm2022/src/app/admin/services/filter/person.filter.mjs +3 -3
- package/esm2022/src/app/admin/services/person.service.mjs +31 -31
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +10 -10
- package/esm2022/src/app/admin/users/users.mjs +14 -7
- package/esm2022/src/app/admin/users/users.module.mjs +8 -10
- package/esm2022/src/app/core/about/about.modal.mjs +7 -7
- package/esm2022/src/app/core/about/about.module.mjs +8 -21
- package/esm2022/src/app/core/account/account.module.mjs +9 -15
- package/esm2022/src/app/core/account/account.page.mjs +5 -5
- package/esm2022/src/app/core/account/new-token.modal.mjs +9 -8
- package/esm2022/src/app/core/account/token.table.mjs +5 -5
- package/esm2022/src/app/core/auth/auth.form.mjs +9 -9
- package/esm2022/src/app/core/auth/auth.modal.mjs +6 -6
- package/esm2022/src/app/core/auth/auth.module.mjs +9 -9
- package/esm2022/src/app/core/core.module.mjs +17 -46
- package/esm2022/src/app/core/core.testing.module.mjs +15 -15
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +16 -15
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +9 -13
- package/esm2022/src/app/core/form/entity/editor.class.mjs +87 -89
- package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +12 -17
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +31 -32
- package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +5 -5
- package/esm2022/src/app/core/form/entity/entity.module.mjs +8 -14
- package/esm2022/src/app/core/form/form.class.mjs +12 -12
- package/esm2022/src/app/core/form/form.module.mjs +8 -8
- package/esm2022/src/app/core/form/form.utils.mjs +25 -23
- package/esm2022/src/app/core/form/list/list.form.mjs +13 -12
- package/esm2022/src/app/core/form/list/list.module.mjs +8 -12
- package/esm2022/src/app/core/form/properties/properties.form.mjs +12 -15
- package/esm2022/src/app/core/form/properties/properties.module.mjs +9 -15
- package/esm2022/src/app/core/form/properties/properties.table.mjs +24 -26
- package/esm2022/src/app/core/form/properties/property.validator.mjs +6 -6
- package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +18 -18
- package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +8 -24
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +9 -8
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -25
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +6 -6
- package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +9 -13
- package/esm2022/src/app/core/graphql/graphql.module.mjs +8 -13
- package/esm2022/src/app/core/graphql/graphql.service.mjs +71 -95
- package/esm2022/src/app/core/graphql/graphql.utils.mjs +12 -11
- package/esm2022/src/app/core/home/home.mjs +26 -27
- package/esm2022/src/app/core/home/home.module.mjs +10 -19
- package/esm2022/src/app/core/icon/icon.component.mjs +5 -5
- package/esm2022/src/app/core/icon/icon.module.mjs +8 -17
- package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +33 -37
- package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +9 -13
- package/esm2022/src/app/core/menu/menu.component.mjs +5 -6
- package/esm2022/src/app/core/menu/menu.model.mjs +21 -18
- package/esm2022/src/app/core/menu/menu.module.mjs +7 -12
- package/esm2022/src/app/core/menu/menu.service.mjs +44 -60
- package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +4 -4
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +5 -5
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +5 -5
- package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +8 -27
- package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +6 -7
- package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +9 -13
- package/esm2022/src/app/core/peer/select-peer.modal.mjs +8 -9
- package/esm2022/src/app/core/peer/select-peer.module.mjs +10 -19
- package/esm2022/src/app/core/register/register-confirm.page.mjs +12 -12
- package/esm2022/src/app/core/register/register.form.mjs +5 -5
- package/esm2022/src/app/core/register/register.modal.mjs +6 -6
- package/esm2022/src/app/core/register/register.module.mjs +8 -29
- package/esm2022/src/app/core/services/account.service.mjs +172 -160
- package/esm2022/src/app/core/services/auth-guard.service.mjs +13 -15
- package/esm2022/src/app/core/services/base-entity-service.class.mjs +51 -60
- package/esm2022/src/app/core/services/base-graphql-service.class.mjs +39 -33
- package/esm2022/src/app/core/services/base58.mjs +8 -4
- package/esm2022/src/app/core/services/config/core.config.mjs +37 -37
- package/esm2022/src/app/core/services/config.service.mjs +51 -49
- package/esm2022/src/app/core/services/crypto.service.mjs +11 -11
- package/esm2022/src/app/core/services/errors.mjs +3 -3
- package/esm2022/src/app/core/services/local-settings.service.mjs +36 -37
- package/esm2022/src/app/core/services/model/account.model.mjs +12 -17
- package/esm2022/src/app/core/services/model/config.model.mjs +5 -5
- package/esm2022/src/app/core/services/model/department.model.mjs +3 -2
- package/esm2022/src/app/core/services/model/entity.decorators.mjs +6 -6
- package/esm2022/src/app/core/services/model/entity.model.mjs +25 -25
- package/esm2022/src/app/core/services/model/filter.model.mjs +12 -15
- package/esm2022/src/app/core/services/model/history.model.mjs +1 -1
- package/esm2022/src/app/core/services/model/model.enum.mjs +2 -2
- package/esm2022/src/app/core/services/model/peer.model.mjs +9 -8
- package/esm2022/src/app/core/services/model/person.model.mjs +18 -17
- package/esm2022/src/app/core/services/model/referential.model.mjs +13 -13
- package/esm2022/src/app/core/services/model/settings.model.mjs +1 -1
- package/esm2022/src/app/core/services/model/token.model.mjs +2 -3
- package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +2 -6
- package/esm2022/src/app/core/services/network.service.mjs +42 -43
- package/esm2022/src/app/core/services/network.types.mjs +1 -1
- package/esm2022/src/app/core/services/network.utils.mjs +3 -3
- package/esm2022/src/app/core/services/pipes/account.pipes.mjs +11 -11
- package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +6 -6
- package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +6 -6
- package/esm2022/src/app/core/services/pipes/pipes.module.mjs +54 -0
- package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +21 -0
- package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +11 -11
- package/esm2022/src/app/core/services/platform.service.mjs +45 -49
- package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +32 -39
- package/esm2022/src/app/core/services/storage/entity-store.class.mjs +36 -45
- package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +1 -1
- package/esm2022/src/app/core/services/testing/referential.validator.mjs +14 -14
- package/esm2022/src/app/core/services/validator/account.validator.mjs +5 -5
- package/esm2022/src/app/core/services/validator/base.validator.class.mjs +4 -4
- package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +13 -13
- package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +5 -5
- package/esm2022/src/app/core/services/validator/user-token.validator.mjs +12 -9
- package/esm2022/src/app/core/settings/settings.module.mjs +8 -21
- package/esm2022/src/app/core/settings/settings.page.mjs +12 -17
- package/esm2022/src/app/core/table/actions-column.component.mjs +13 -5
- package/esm2022/src/app/core/table/async-table.class.mjs +106 -112
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +21 -26
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +26 -29
- package/esm2022/src/app/core/table/memory-table.class.mjs +4 -4
- package/esm2022/src/app/core/table/table-select-columns.component.mjs +8 -8
- package/esm2022/src/app/core/table/table.class.mjs +107 -110
- package/esm2022/src/app/core/table/table.model.mjs +1 -1
- package/esm2022/src/app/core/table/table.module.mjs +8 -12
- package/esm2022/src/app/core/table/table.utils.mjs +2 -4
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +3 -3
- package/esm2022/src/app/core/table/testing/table.testing.mjs +9 -9
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +8 -33
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +4 -4
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +28 -26
- package/esm2022/src/app/shared/alerts.mjs +37 -35
- package/esm2022/src/app/shared/audio/audio.mjs +25 -27
- package/esm2022/src/app/shared/audio/audio.testing.mjs +5 -5
- package/esm2022/src/app/shared/audio/audio.testing.module.mjs +10 -25
- package/esm2022/src/app/shared/capacitor/keyboard.mjs +5 -5
- package/esm2022/src/app/shared/capacitor/plugins.mjs +1 -1
- package/esm2022/src/app/shared/constants.mjs +2 -3
- package/esm2022/src/app/shared/dates.mjs +5 -8
- package/esm2022/src/app/shared/debug/debug-service.class.mjs +1 -1
- package/esm2022/src/app/shared/debug/debug.component.mjs +5 -5
- package/esm2022/src/app/shared/debug/debug.module.mjs +8 -29
- package/esm2022/src/app/shared/directives/autofocus.directive.mjs +8 -12
- package/esm2022/src/app/shared/directives/autotitle.directive.mjs +3 -3
- package/esm2022/src/app/shared/directives/directives.module.mjs +8 -29
- package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +4 -4
- package/esm2022/src/app/shared/directives/ng-var.directive.mjs +4 -4
- package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +3 -3
- package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +4 -4
- package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
- package/esm2022/src/app/shared/events.mjs +6 -8
- package/esm2022/src/app/shared/file/csv.utils.mjs +22 -18
- package/esm2022/src/app/shared/file/file.service.mjs +11 -15
- package/esm2022/src/app/shared/file/file.utils.mjs +13 -11
- package/esm2022/src/app/shared/file/images.utils.mjs +4 -4
- package/esm2022/src/app/shared/file/json.utils.mjs +3 -4
- package/esm2022/src/app/shared/file/uri.utils.mjs +1 -1
- package/esm2022/src/app/shared/focusable.mjs +1 -1
- package/esm2022/src/app/shared/form/field.component.mjs +33 -30
- package/esm2022/src/app/shared/form/field.model.mjs +4 -4
- package/esm2022/src/app/shared/form/loading-spinner.mjs +5 -5
- package/esm2022/src/app/shared/forms.mjs +30 -33
- package/esm2022/src/app/shared/functions.mjs +70 -65
- package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +14 -14
- package/esm2022/src/app/shared/gesture/gesture-config.mjs +9 -9
- package/esm2022/src/app/shared/gesture/hammer.utils.mjs +1 -1
- package/esm2022/src/app/shared/graph/colors.utils.mjs +14 -18
- package/esm2022/src/app/shared/graph/graph-colors.mjs +16 -22
- package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +4 -4
- package/esm2022/src/app/shared/help/help.modal.mjs +6 -6
- package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +5 -5
- package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +10 -11
- package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +9 -27
- package/esm2022/src/app/shared/http/http.utils.mjs +1 -1
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +28 -27
- package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +13 -10
- package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
- package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +14 -17
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +9 -13
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +14 -11
- package/esm2022/src/app/shared/image/image.model.mjs +1 -1
- package/esm2022/src/app/shared/image/image.module.mjs +8 -13
- package/esm2022/src/app/shared/image/image.service.mjs +14 -12
- package/esm2022/src/app/shared/inputs.mjs +19 -20
- package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +2 -3
- package/esm2022/src/app/shared/logging/log-level.model.mjs +1 -1
- package/esm2022/src/app/shared/logging/logger.model.mjs +2 -2
- package/esm2022/src/app/shared/logging/logging-service.class.mjs +17 -20
- package/esm2022/src/app/shared/logging/logging-service.module.mjs +6 -6
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +7 -10
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +87 -96
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +9 -15
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +2 -2
- package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +27 -26
- package/esm2022/src/app/shared/material/badge/badge.directive.mjs +45 -19
- package/esm2022/src/app/shared/material/badge/badge.module.mjs +8 -20
- package/esm2022/src/app/shared/material/badge/badge.test.mjs +5 -5
- package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +9 -13
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +262 -0
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +6 -6
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +7 -11
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +69 -70
- package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +17 -17
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +5 -5
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +37 -36
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +26 -33
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +42 -38
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +20 -17
- package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +22 -20
- package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +18 -17
- package/esm2022/src/app/shared/material/duration/duration.module.mjs +5 -5
- package/esm2022/src/app/shared/material/duration/duration.utils.mjs +3 -6
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +23 -24
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +17 -15
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +22 -24
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +46 -41
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +5 -5
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +5 -5
- package/esm2022/src/app/shared/material/material.animations.mjs +22 -22
- package/esm2022/src/app/shared/material/material.module.mjs +11 -11
- package/esm2022/src/app/shared/material/material.testing.module.mjs +26 -27
- package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +8 -14
- package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +4 -4
- package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +15 -11
- package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +7 -11
- package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +8 -8
- package/esm2022/src/app/shared/material/testing/common.test.mjs +17 -15
- package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +6 -6
- package/esm2022/src/app/shared/material/text/text-form.component.mjs +17 -16
- package/esm2022/src/app/shared/material/text/text-form.module.mjs +8 -8
- package/esm2022/src/app/shared/modules.mjs +1 -1
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +6 -7
- package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
- package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +5 -5
- package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +6 -6
- package/esm2022/src/app/shared/observables.mjs +14 -18
- package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +38 -38
- package/esm2022/src/app/shared/pipes/colors.pipe.mjs +5 -5
- package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +8 -10
- package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +14 -14
- package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +6 -6
- package/esm2022/src/app/shared/pipes/duration.pipe.mjs +6 -6
- package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +6 -13
- package/esm2022/src/app/shared/pipes/form.pipes.mjs +25 -25
- package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +14 -14
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +14 -14
- package/esm2022/src/app/shared/pipes/maps.pipe.mjs +17 -17
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +11 -14
- package/esm2022/src/app/shared/pipes/math.pipes.mjs +16 -16
- package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +5 -5
- package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +6 -6
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +14 -22
- package/esm2022/src/app/shared/pipes/property.pipes.mjs +23 -25
- package/esm2022/src/app/shared/pipes/string.pipes.mjs +47 -48
- package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +11 -11
- package/esm2022/src/app/shared/pipes/types.pipes.mjs +17 -17
- package/esm2022/src/app/shared/platforms.mjs +7 -5
- package/esm2022/src/app/shared/rx-state.module.mjs +7 -11
- package/esm2022/src/app/shared/services/entity-service.class.mjs +2 -2
- package/esm2022/src/app/shared/services/job.utils.mjs +7 -7
- package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +37 -35
- package/esm2022/src/app/shared/services/progress-bar.service.mjs +4 -4
- package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +11 -14
- package/esm2022/src/app/shared/services/startable-service.class.mjs +11 -17
- package/esm2022/src/app/shared/services/translate-context.service.mjs +17 -14
- package/esm2022/src/app/shared/services/validator-service.class.mjs +1 -1
- package/esm2022/src/app/shared/services.mjs +10 -10
- package/esm2022/src/app/shared/shared-routing.module.mjs +19 -18
- package/esm2022/src/app/shared/shared.module.mjs +30 -27
- package/esm2022/src/app/shared/shared.testing.module.mjs +6 -6
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +26 -28
- package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +8 -12
- package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +9 -17
- package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +10 -18
- package/esm2022/src/app/shared/storage/storage.service.mjs +4 -4
- package/esm2022/src/app/shared/storage/storage.utils.mjs +2 -2
- package/esm2022/src/app/shared/testing/observable.test.mjs +11 -13
- package/esm2022/src/app/shared/testing/tests.page.mjs +6 -6
- package/esm2022/src/app/shared/toast/toast.testing.mjs +10 -10
- package/esm2022/src/app/shared/toast/toast.testing.module.mjs +10 -25
- package/esm2022/src/app/shared/toast/toasts.mjs +9 -9
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +9 -7
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +10 -15
- package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +8 -39
- package/esm2022/src/app/shared/types.mjs +1 -1
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +8 -9
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -25
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +7 -8
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +17 -18
- package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +2 -3
- package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +52 -50
- package/esm2022/src/app/shared/validator/validators.mjs +30 -30
- package/esm2022/src/app/shared/version/versions.mjs +2 -2
- package/esm2022/src/app/social/job/job.module.mjs +8 -27
- package/esm2022/src/app/social/job/progression/job-progression.component.mjs +9 -9
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +27 -24
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +5 -7
- package/esm2022/src/app/social/job/progression/job-progression.model.mjs +1 -1
- package/esm2022/src/app/social/job/progression/job-progression.service.mjs +21 -17
- package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +5 -5
- package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +7 -7
- package/esm2022/src/app/social/job/testing/job.testing.module.mjs +8 -21
- package/esm2022/src/app/social/message/message.form.mjs +5 -5
- package/esm2022/src/app/social/message/message.modal.mjs +8 -8
- package/esm2022/src/app/social/message/message.model.mjs +8 -8
- package/esm2022/src/app/social/message/message.module.mjs +4 -4
- package/esm2022/src/app/social/message/message.service.mjs +7 -7
- package/esm2022/src/app/social/social.errors.mjs +2 -2
- package/esm2022/src/app/social/social.module.mjs +7 -32
- package/esm2022/src/app/social/social.testing.module.mjs +9 -20
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +17 -14
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +19 -22
- package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +47 -23
- package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +8 -8
- package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +8 -21
- package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +27 -15
- package/esm2022/src/app/social/user-event/user-event.model.mjs +1 -1
- package/esm2022/src/app/social/user-event/user-event.module.mjs +8 -28
- package/esm2022/src/app/social/user-event/user-event.service.mjs +56 -61
- package/esm2022/src/environments/environment.class.mjs +2 -1
- package/esm2022/src/environments/environment.loader.mjs +4 -4
- package/esm2022/src/environments/environment.mjs +2 -2
- package/fesm2022/sumaris-net.ngx-components.mjs +6263 -7492
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +12 -7
- package/public_api.d.ts +3 -8
- package/src/app/admin/users/users.d.ts +3 -2
- package/src/app/core/core.module.d.ts +21 -24
- package/src/app/core/form/form.utils.d.ts +1 -1
- package/src/app/core/services/config/core.config.d.ts +1 -1
- package/src/app/core/services/config.service.d.ts +3 -3
- package/src/app/core/services/local-settings.service.d.ts +2 -3
- package/src/app/core/services/model/entity.model.d.ts +3 -2
- package/src/app/core/services/model/settings.model.d.ts +2 -2
- package/src/app/core/services/pipes/department-to-string.pipe.d.ts +1 -1
- package/src/app/core/services/pipes/pipes.module.d.ts +11 -0
- package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +12 -0
- package/src/app/core/table/actions-column.component.d.ts +3 -1
- package/src/app/shared/events.d.ts +1 -1
- package/src/app/shared/functions.d.ts +6 -5
- package/src/app/shared/graph/graph-colors.d.ts +1 -1
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +10 -10
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +2 -1
- package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +2 -2
- package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +2 -1
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -1
- package/src/app/shared/material/boolean/boolean.module.d.ts +1 -1
- package/src/app/shared/material/boolean/{material-boolean.d.ts → material.boolean.d.ts} +2 -2
- package/src/app/shared/material/material.module.d.ts +5 -6
- package/src/app/shared/material/material.testing.module.d.ts +14 -15
- package/src/app/shared/material/swipe/material.swipe.d.ts +1 -1
- package/src/app/shared/pipes/pipes.module.d.ts +1 -1
- package/src/app/shared/pipes/string.pipes.d.ts +4 -5
- package/src/app/shared/validator/validators.d.ts +13 -4
- package/src/app/social/job/progression/job-progression.list.d.ts +1 -3
- package/src/app/social/message/message.modal.d.ts +2 -2
- package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -0
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +1 -0
- package/src/assets/manifest.json +1 -1
- package/src/environments/environment.class.d.ts +1 -0
- package/src/theme/_ngx-components.scss +1 -25
- package/src/theme/_ngx-components.tabs.scss +361 -0
- package/src/theme/_theme.scss +1 -0
- package/esm2022/src/app/shared/material/boolean/material-boolean.mjs +0 -262
- package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -104
- package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +0 -83
- package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +0 -203
- package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +0 -19
- package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +0 -168
- package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -36
- package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +0 -16
- package/esm2022/src/app/shared/material/numpad/numpad.module.mjs +0 -60
- package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -48
- package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +0 -22
- package/src/app/shared/material/numpad/numpad.component.d.ts +0 -26
- package/src/app/shared/material/numpad/numpad.container.d.ts +0 -40
- package/src/app/shared/material/numpad/numpad.content.d.ts +0 -7
- package/src/app/shared/material/numpad/numpad.directive.d.ts +0 -35
- package/src/app/shared/material/numpad/numpad.dom-service.d.ts +0 -16
- package/src/app/shared/material/numpad/numpad.model.d.ts +0 -30
- package/src/app/shared/material/numpad/numpad.module.d.ts +0 -16
- package/src/app/shared/material/numpad/testing/numpad.test.d.ts +0 -13
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, ViewChild, } from '@angular/core';
|
|
2
2
|
import { BehaviorSubject, fromEventPattern, Subject, Subscription } from 'rxjs';
|
|
3
3
|
import { ENVIRONMENT } from '../../../../environments/environment.class';
|
|
4
4
|
import { IonicSlides } from '@ionic/angular';
|
|
@@ -24,34 +24,34 @@ import * as i10 from "@angular/cdk/a11y";
|
|
|
24
24
|
import * as i11 from "../../pipes/ng-init.pipe";
|
|
25
25
|
import * as i12 from "../../directives/autofocus.directive";
|
|
26
26
|
import * as i13 from "../../directives/ng-var.directive";
|
|
27
|
-
import * as i14 from "
|
|
28
|
-
import * as i15 from "../../pipes/
|
|
29
|
-
import * as i16 from "../../pipes/
|
|
30
|
-
import * as i17 from "
|
|
27
|
+
import * as i14 from "@rx-angular/template/for";
|
|
28
|
+
import * as i15 from "../../pipes/property.pipes";
|
|
29
|
+
import * as i16 from "../../pipes/arrays.pipe";
|
|
30
|
+
import * as i17 from "../../pipes/string.pipes";
|
|
31
|
+
import * as i18 from "../../../../environments/environment.class";
|
|
31
32
|
const GalleryModeColSize = Object.freeze({
|
|
32
33
|
mosaic: 4,
|
|
33
|
-
list: 12
|
|
34
|
+
list: 12,
|
|
34
35
|
});
|
|
35
36
|
export class AppImageGalleryComponent {
|
|
36
37
|
image;
|
|
37
38
|
platform;
|
|
38
39
|
alterCtrl;
|
|
39
|
-
popoverCtrl;
|
|
40
40
|
translate;
|
|
41
41
|
cd;
|
|
42
42
|
_destroySubject = new Subject();
|
|
43
43
|
_renderChangeSubscription;
|
|
44
44
|
_subscription = new Subscription();
|
|
45
45
|
_dataSource;
|
|
46
|
-
_data;
|
|
46
|
+
_data$ = new BehaviorSubject(null);
|
|
47
47
|
_colSize;
|
|
48
48
|
_selectedRowIndex;
|
|
49
49
|
_presentingElement = null;
|
|
50
50
|
_titleForm;
|
|
51
51
|
_titleAutofocus = false;
|
|
52
52
|
_slidesSubscription;
|
|
53
|
-
swiperModules = [IonicSlides];
|
|
54
53
|
_swiper;
|
|
54
|
+
swiperModules = [IonicSlides];
|
|
55
55
|
zoomActive = false;
|
|
56
56
|
zoomScale = 1;
|
|
57
57
|
viewChange;
|
|
@@ -79,10 +79,10 @@ export class AppImageGalleryComponent {
|
|
|
79
79
|
return !this.disabled;
|
|
80
80
|
}
|
|
81
81
|
get rows() {
|
|
82
|
-
return this._data;
|
|
82
|
+
return this._data$.value;
|
|
83
83
|
}
|
|
84
84
|
get rowCount() {
|
|
85
|
-
return this.
|
|
85
|
+
return this.rows?.length || 0;
|
|
86
86
|
}
|
|
87
87
|
get activeIndex() {
|
|
88
88
|
return this.getSwiper()?.activeIndex || 0;
|
|
@@ -92,11 +92,11 @@ export class AppImageGalleryComponent {
|
|
|
92
92
|
swiperRef;
|
|
93
93
|
onBeforeDeleteRows = createPromiseEventEmitter();
|
|
94
94
|
onAfterAddRows = new EventEmitter();
|
|
95
|
-
|
|
95
|
+
onAfterEditRow = new EventEmitter();
|
|
96
|
+
constructor(image, platform, alterCtrl, translate, cd, environment) {
|
|
96
97
|
this.image = image;
|
|
97
98
|
this.platform = platform;
|
|
98
99
|
this.alterCtrl = alterCtrl;
|
|
99
|
-
this.popoverCtrl = popoverCtrl;
|
|
100
100
|
this.translate = translate;
|
|
101
101
|
this.cd = cd;
|
|
102
102
|
this.viewChange = new BehaviorSubject({ start: 0, end: Number.MAX_VALUE });
|
|
@@ -196,6 +196,7 @@ export class AppImageGalleryComponent {
|
|
|
196
196
|
console.debug('[image-gallery] User set title: ' + data);
|
|
197
197
|
row.currentData.title = data;
|
|
198
198
|
this.markForCheck();
|
|
199
|
+
this.onAfterEditRow.emit(row);
|
|
199
200
|
}
|
|
200
201
|
// Hide the toolbar, because the focus have been given to the event's origin (the edit button)
|
|
201
202
|
setTimeout(() => this.hideCardToolbar(cardToolbar), 750);
|
|
@@ -226,11 +227,10 @@ export class AppImageGalleryComponent {
|
|
|
226
227
|
if (dataStream === undefined) {
|
|
227
228
|
throw this.getTableUnknownDataSourceError();
|
|
228
229
|
}
|
|
229
|
-
this._renderChangeSubscription
|
|
230
|
-
|
|
231
|
-
.
|
|
232
|
-
this._data
|
|
233
|
-
this.cd.markForCheck();
|
|
230
|
+
this._renderChangeSubscription?.unsubscribe();
|
|
231
|
+
this._renderChangeSubscription = dataStream.pipe(takeUntil(this._destroySubject)).subscribe((data) => {
|
|
232
|
+
console.debug('[image-gallery] Received new rows', data);
|
|
233
|
+
this._data$.next(data);
|
|
234
234
|
});
|
|
235
235
|
}
|
|
236
236
|
getTableUnknownDataSourceError() {
|
|
@@ -253,8 +253,7 @@ export class AppImageGalleryComponent {
|
|
|
253
253
|
await swiper.slideTo(this._selectedRowIndex, 0);
|
|
254
254
|
}
|
|
255
255
|
this._slidesSubscription?.unsubscribe();
|
|
256
|
-
this._slidesSubscription = fromEventPattern((handler) => swiper.on('slideChangeTransitionStart', handler))
|
|
257
|
-
.subscribe((arg) => {
|
|
256
|
+
this._slidesSubscription = fromEventPattern((handler) => swiper.on('slideChangeTransitionStart', handler)).subscribe((arg) => {
|
|
258
257
|
console.log('TODO received event slideChangeTransitionStart', arg);
|
|
259
258
|
this.activeSlideIndex = swiper.activeIndex;
|
|
260
259
|
this.markForCheck();
|
|
@@ -312,7 +311,7 @@ export class AppImageGalleryComponent {
|
|
|
312
311
|
if (this.onBeforeDeleteRows.observers.length > 0) {
|
|
313
312
|
try {
|
|
314
313
|
const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {
|
|
315
|
-
detail: { rows }
|
|
314
|
+
detail: { rows },
|
|
316
315
|
});
|
|
317
316
|
if (!canDelete)
|
|
318
317
|
return false;
|
|
@@ -334,13 +333,13 @@ export class AppImageGalleryComponent {
|
|
|
334
333
|
markForCheck() {
|
|
335
334
|
this.cd.markForCheck();
|
|
336
335
|
}
|
|
337
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.
|
|
338
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: "debug", disabled: "disabled", readOnly: "readOnly", mobile: "mobile", mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: "showToolbar", showFabButton: "showFabButton", showTitle: "showTitle", showAddCardButton: "showAddCardButton", addButtonColor: "addButtonColor", dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }, { propertyName: "swiperRef", first: true, predicate: ["modalSwiper"], descendants: true }], ngImport: i0, template: "\n\n<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"add()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\"\n [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container {{this.mode}}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *ngFor=\"let row of rows; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n <ion-card #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n *ngVar=\"row|propertyGet: 'currentData'; let image\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation>\n <figure class=\"card-thumbnail\">\n <img [src]=\"image.url||image.dataUrl\"/>\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{image.title}}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n\n <!-- edit title button -->\n <button mat-button *ngIf=\"showTitle\" slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\">\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title|isNotNilOrBlank; else editLabel\" translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button mat-icon-button slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n</div>\n\n<!-- FAB button: add -->\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation>\n\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px;\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\"\n [class.modal-fullscreen]=\"mobile\"\n [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\" >\n <!-- Counter -->\n <div class=\"top-left\" *ngVar=\"rows?.length as count\">\n <ion-label color=\"light\">\n {{activeSlideIndex + 1}} / {{count}}\n </ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows|isArrayLength:{greaterThan: 1})\">\n <div class=\"side-buttons prev\"\n (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\"\n (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div class=\"swiper-zoom-container\" *ngIf=\"row|propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\">\n <img [src]=\"image.url||image.dataUrl\">\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\" color=\"danger\">\n <mat-icon slot=\"start\">delete</mat-icon>\n {{'COMMON.BTN_DELETE'|translate}}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\">\n </ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{'COMMON.BTN_CLOSE'|translate}}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{'COMMON.BTN_CLOSE'|translate}}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\" >\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n\n </mat-form-field>\n </form>\n </ion-content>\n\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col>\n\n </ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP'|translate\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0,0,0,.45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i2.IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i11.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i13.NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
336
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AppImageGalleryComponent, deps: [{ token: i1.ImageService }, { token: i2.Platform }, { token: i2.AlertController }, { token: i3.TranslateService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
337
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: "debug", disabled: "disabled", readOnly: "readOnly", mobile: "mobile", mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: "showToolbar", showFabButton: "showFabButton", showTitle: "showTitle", showAddCardButton: "showAddCardButton", addButtonColor: "addButtonColor", dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }, { propertyName: "swiperRef", first: true, predicate: ["modalSwiper"], descendants: true }], ngImport: i0, template: "<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button\n mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container {{ this.mode }}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n *ngVar=\"row | propertyGet: 'currentData'; let image\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\" *ngIf=\"image.title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n <button\n mat-button\n *ngIf=\"showTitle\"\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\" (click)=\"add($event)\" [disabled]=\"disabled\" tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\">\n <!-- Counter -->\n <div class=\"top-left\" *ngVar=\"rows?.length as count\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div\n class=\"swiper-zoom-container\"\n *ngIf=\"row | propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\"\n >\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button\n *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>ion-img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i2.IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i11.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i13.NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"] }, { kind: "directive", type: i14.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: i17.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
339
338
|
}
|
|
340
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.
|
|
339
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AppImageGalleryComponent, decorators: [{
|
|
341
340
|
type: Component,
|
|
342
|
-
args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "\n\n<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"add()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\"\n [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container {{this.mode}}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *ngFor=\"let row of rows; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n <ion-card #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n *ngVar=\"row|propertyGet: 'currentData'; let image\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation>\n <figure class=\"card-thumbnail\">\n <img [src]=\"image.url||image.dataUrl\"/>\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{image.title}}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n\n <!-- edit title button -->\n <button mat-button *ngIf=\"showTitle\" slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\">\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title|isNotNilOrBlank; else editLabel\" translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button mat-icon-button slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n</div>\n\n<!-- FAB button: add -->\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation>\n\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px;\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\"\n [class.modal-fullscreen]=\"mobile\"\n [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\" >\n <!-- Counter -->\n <div class=\"top-left\" *ngVar=\"rows?.length as count\">\n <ion-label color=\"light\">\n {{activeSlideIndex + 1}} / {{count}}\n </ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows|isArrayLength:{greaterThan: 1})\">\n <div class=\"side-buttons prev\"\n (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\"\n (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div class=\"swiper-zoom-container\" *ngIf=\"row|propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\">\n <img [src]=\"image.url||image.dataUrl\">\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\" color=\"danger\">\n <mat-icon slot=\"start\">delete</mat-icon>\n {{'COMMON.BTN_DELETE'|translate}}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\">\n </ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{'COMMON.BTN_CLOSE'|translate}}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{'COMMON.BTN_CLOSE'|translate}}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\" >\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n\n </mat-form-field>\n </form>\n </ion-content>\n\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col>\n\n </ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP'|translate\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0,0,0,.45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"] }]
|
|
343
|
-
}], ctorParameters: () => [{ type: i1.ImageService }, { type: i2.Platform }, { type: i2.AlertController }, { type:
|
|
341
|
+
args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button\n mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container {{ this.mode }}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n *ngVar=\"row | propertyGet: 'currentData'; let image\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\" *ngIf=\"image.title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n <button\n mat-button\n *ngIf=\"showTitle\"\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\" (click)=\"add($event)\" [disabled]=\"disabled\" tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\">\n <!-- Counter -->\n <div class=\"top-left\" *ngVar=\"rows?.length as count\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"!mobile\" (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div\n class=\"swiper-zoom-container\"\n *ngIf=\"row | propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\"\n >\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button\n *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>ion-img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"] }]
|
|
342
|
+
}], ctorParameters: () => [{ type: i1.ImageService }, { type: i2.Platform }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i18.Environment, decorators: [{
|
|
344
343
|
type: Optional
|
|
345
344
|
}, {
|
|
346
345
|
type: Inject,
|
|
@@ -384,5 +383,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImpor
|
|
|
384
383
|
type: Output
|
|
385
384
|
}], onAfterAddRows: [{
|
|
386
385
|
type: Output
|
|
386
|
+
}], onAfterEditRow: [{
|
|
387
|
+
type: Output
|
|
387
388
|
}] } });
|
|
388
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbE0sT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFGLE9BQU8sRUFBQyxXQUFXLEVBQWMsTUFBTSw0Q0FBNEMsQ0FBQztBQUdwRixPQUFPLEVBQWtCLFdBQVcsRUFBb0QsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFtQixZQUFZLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUdwQyxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMseUJBQXlC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ZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnRQYXR0ZXJuLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2UsIFRhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7RU5WSVJPTk1FTlQsIEVudmlyb25tZW50fSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtJbWFnZVNlcnZpY2V9IGZyb20gJy4uL2ltYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtJbWFnZX0gZnJvbSAnLi4vaW1hZ2UubW9kZWwnO1xuaW1wb3J0IHtBbGVydENvbnRyb2xsZXIsIElvbmljU2xpZGVzLCBJb25Nb2RhbCwgSW9uUG9wb3ZlciwgUGxhdGZvcm0sIFBvcG92ZXJDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbn0gZnJvbSAnLi4vLi4vbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgdG9Cb29sZWFufSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyLCBpc0RhdGFTb3VyY2UsIExpc3RSYW5nZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7dGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0FsZXJ0c30gZnJvbSAnLi4vLi4vYWxlcnRzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0FwcENvbG9yc30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2NyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXIsIGVtaXRQcm9taXNlRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQge1ByZWRlZmluZWRDb2xvcnN9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7U3dpcGVyfSBmcm9tICdzd2lwZXIvdHlwZXMnO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEdhbGxlcnlNb2RlID0gJ21vc2FpYycgfCAnbGlzdCc7XG5cbmNvbnN0IEdhbGxlcnlNb2RlQ29sU2l6ZSA9IE9iamVjdC5mcmVlemUoe1xuICBtb3NhaWM6IDQsXG4gIGxpc3Q6IDEyXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJU3dpcGVyIGV4dGVuZHMgU3dpcGVyIHtcbiAgYWN0aXZlSW5kZXg6IG51bWJlcjtcbiAgaW1hZ2VzTG9hZGVkOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbWFnZS1nYWxsZXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFwcEltYWdlR2FsbGVyeUNvbXBvbmVudDxUIGV4dGVuZHMgSW1hZ2U+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbGxlY3Rpb25WaWV3ZXIsIEFmdGVyQ29udGVudENoZWNrZWRcbntcblxuICBwcm90ZWN0ZWQgX2Rlc3Ryb3lTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJvdGVjdGVkIF9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByb3RlY3RlZCBfZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQ+O1xuXG4gIHByb3RlY3RlZCBfZGF0YTogVGFibGVFbGVtZW50PFQ+W107XG4gIHByb3RlY3RlZCBfY29sU2l6ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkUm93SW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9wcmVzZW50aW5nRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByb3RlY3RlZCBfdGl0bGVGb3JtOiBGb3JtR3JvdXA7XG4gIHByb3RlY3RlZCBfdGl0bGVBdXRvZm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHN3aXBlck1vZHVsZXMgPSBbSW9uaWNTbGlkZXNdO1xuICBwcm90ZWN0ZWQgX3N3aXBlcjogU3dpcGVyO1xuXG4gIHpvb21BY3RpdmUgPSBmYWxzZTtcbiAgem9vbVNjYWxlID0gMTtcblxuICB2aWV3Q2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8TGlzdFJhbmdlPjtcblxuICBASW5wdXQoKSBjYXJkQ29sb3I6IHN0cmluZyB8IFByZWRlZmluZWRDb2xvcnM7XG4gIEBJbnB1dCgpIGRlYnVnOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgbW9iaWxlOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCkgbW9kZTogR2FsbGVyeU1vZGUgPSBudWxsO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlRGVsZXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd1Rvb2xiYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RmFiQnV0dG9uOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93VGl0bGUgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93QWRkQ2FyZEJ1dHRvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvbkNvbG9yOiBBcHBDb2xvcnMgPSAndGVydGlhcnknO1xuXG4gIEBJbnB1dCgpIHNldCBkYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55Pikge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlICE9PSBkYXRhU291cmNlKSB7XG4gICAgICB0aGlzLl9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgfVxuICBnZXQgZGF0YVNvdXJjZSgpOiBUYWJsZURhdGFTb3VyY2U8VCwgYW55LCBhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG4gIGdldCBlbmFibGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIGdldCByb3dzKCk6IFRhYmxlRWxlbWVudDxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YT8ubGVuZ3RoIHx8IDA7XG4gIH1cblxuICBnZXQgYWN0aXZlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTd2lwZXIoKT8uYWN0aXZlSW5kZXggfHwgMDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3pvb21Nb2RhbCcpIHpvb21Nb2RhbDogSW9uTW9kYWw7XG4gIEBWaWV3Q2hpbGQoJ3RpdGxlUG9wb3ZlcicpIHRpdGxlUG9wb3ZlcjogSW9uUG9wb3ZlcjtcbiAgQFZpZXdDaGlsZCgnbW9kYWxTd2lwZXInKSBzd2lwZXJSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgpIG9uQmVmb3JlRGVsZXRlUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwge3Jvd3M6IFRhYmxlRWxlbWVudDxUPltdfT4oKTtcbiAgQE91dHB1dCgpIG9uQWZ0ZXJBZGRSb3dzID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUVsZW1lbnQ8VD5bXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW1hZ2U6IEltYWdlU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGFsdGVyQ3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcG9wb3ZlckN0cmw6IFBvcG92ZXJDb250cm9sbGVyLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50XG4gICkge1xuXG4gICAgdGhpcy52aWV3Q2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7IHN0YXJ0OiAwLCBlbmQ6IE51bWJlci5NQVhfVkFMVUUgfSk7XG5cbiAgICAvLyBERVYgbG9nXG4gICAgdGhpcy5kZWJ1ZyA9IGVudmlyb25tZW50ICYmICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tb2JpbGUgPSB0b0Jvb2xlYW4odGhpcy5tb2JpbGUsIGlzTW9iaWxlKHdpbmRvdykpO1xuICAgIHRoaXMubW9kZSA9IHRoaXMubW9iaWxlID8gJ2xpc3QnOiAnbW9zYWljJztcbiAgICB0aGlzLl9jb2xTaXplID0gR2FsbGVyeU1vZGVDb2xTaXplW3RoaXMubW9kZV07XG4gICAgdGhpcy5zaG93VG9vbGJhciA9IHRvQm9vbGVhbih0aGlzLnNob3dUb29sYmFyLCAhdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuc2hvd0FkZENhcmRCdXR0b24gPSB0b0Jvb2xlYW4odGhpcy5zaG93QWRkQ2FyZEJ1dHRvbiwgdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuc2hvd0ZhYkJ1dHRvbiA9IHRvQm9vbGVhbih0aGlzLnNob3dGYWJCdXR0b24sIHRoaXMubW9iaWxlICYmICF0aGlzLnNob3dBZGRDYXJkQnV0dG9uKTtcblxuICAgIC8vIEdldCBtb2RhbCBwcmVzZW50aW5nIGVsZW1lbnQgKGlPUyBvbmx5KVxuICAgIHRoaXMuX3ByZXNlbnRpbmdFbGVtZW50ID0gdGhpcy5tb2JpbGUgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW9uLXBhZ2UnKSA6IG51bGw7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiAhdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95U3ViamVjdC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLmRhdGFTb3VyY2UpKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGQoZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5pbWFnZS5hZGQoZXZlbnQpO1xuXG4gICAgaWYgKGlzRW1wdHlBcnJheShpbWFnZXMpKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oYFtpbWFnZS1nYWxsZXJ5XSBBZGRpbmcgbmV3ICR7aW1hZ2VzLmxlbmd0aH0gaW1hZ2UocylgLCBpbWFnZXMpO1xuXG4gICAgY29uc3Qgcm93czogVGFibGVFbGVtZW50PFQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5jcmVhdGVOZXcoKTtcbiAgICAgIHJvdy5jdXJyZW50RGF0YSA9IGltYWdlIGFzIHVua25vd24gYXMgVDtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgICAgY29uc3QgYWRkZWQgPSBhd2FpdCByb3cuY29uZmlybUVkaXRDcmVhdGUoKTtcbiAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbaW1hZ2UtZ2FsbGVyeV0gQ2Fubm90IGNvbmZpcm0gbmV3IGltYWdlIScpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uQWZ0ZXJBZGRSb3dzLmVtaXQocm93cyk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoZXZlbnQ6IEV2ZW50LCByb3c6IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IHtpbnRlcmFjdGl2ZT86IGJvb2xlYW59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8IHRoaXMucmVhZE9ubHkpIHJldHVybiBmYWxzZTtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKFtyb3ddKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGRlbGV0ZWQ6IGJvb2xlYW47XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIG5ldyBpbWFnZScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5jYW5jZWxPckRlbGV0ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIGltYWdlIChhdCAjJyArIHJvdy5pZCArICcpJyk7XG4gICAgICBkZWxldGVkID0gYXdhaXQgcm93LmRlbGV0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cblxuXG4gIHRvZ2dsZVZpZXdNb2RlKF8/OiBFdmVudCkge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5tb2RlID0gJ21vc2FpYyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5tb2RlID0gJ2xpc3QnO1xuICAgIH1cbiAgICB0aGlzLl9jb2xTaXplID0gR2FsbGVyeU1vZGVDb2xTaXplW3RoaXMubW9kZV07XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCByb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIHJldHVybiByb3cuaWQ7XG4gIH1cblxuICBhc3luYyBlZGl0VGl0bGUoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogVGFibGVFbGVtZW50PFQ+LCBjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50Py5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2hvd0NhcmRUb29sYmFyKGNhcmRUb29sYmFyKTtcblxuICAgIGNvbnN0IHRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChyb3cuY3VycmVudERhdGEudGl0bGUsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KV0pKTtcbiAgICB0aGlzLl90aXRsZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt0aXRsZTogdGl0bGVDb250cm9sfSk7XG4gICAgdGhpcy5fdGl0bGVBdXRvZm9jdXMgPSB0aGlzLm1vYmlsZSAmJiB0aGlzLmVuYWJsZWQgJiYgIXRoaXMucmVhZE9ubHk7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBhd2FpdCB0aGlzLnRpdGxlUG9wb3Zlci5wcmVzZW50KCk7XG5cbiAgICBjb25zdCB7ZGF0YSwgcm9sZX0gPSBhd2FpdCB0aGlzLnRpdGxlUG9wb3Zlci5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmICghcm9sZSB8fCByb2xlICE9PSAnQ0FOQ0VMJykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFVzZXIgc2V0IHRpdGxlOiAnICsgZGF0YSk7XG4gICAgICByb3cuY3VycmVudERhdGEudGl0bGUgPSBkYXRhO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSB0b29sYmFyLCBiZWNhdXNlIHRoZSBmb2N1cyBoYXZlIGJlZW4gZ2l2ZW4gdG8gdGhlIGV2ZW50J3Mgb3JpZ2luICh0aGUgZWRpdCBidXR0b24pXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhciksIDc1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0NhcmRUb29sYmFyKGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBjb25zdCBlbCA9IGNhcmRUb29sYmFyWydlbCddIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGNvbnN0IGVsID0gY2FyZFRvb2xiYXJbJ2VsJ10gYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPikge1xuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5fZGF0YVNvdXJjZSkpIHtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2UuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29ic2VydmVSZW5kZXJDaGFuZ2VzKCkge1xuICAgIC8vIElmIG5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCwgdGhlcmUgaXMgbm90aGluZyB0byBvYnNlcnZlIGZvciBjaGFuZ2VzLlxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkYXRhU3RyZWFtOiBPYnNlcnZhYmxlPFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+PjtcbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIGRhdGFTdHJlYW0gPSB0aGlzLmRhdGFTb3VyY2UuY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKGRhdGFTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgdGhpcy5nZXRUYWJsZVVua25vd25EYXRhU291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uID0gZGF0YVN0cmVhbVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3lTdWJqZWN0KSlcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSAoZGF0YSB8fCBbXSkuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpIHtcbiAgICByZXR1cm4gRXJyb3IoYFByb3ZpZGVkIGRhdGEgc291cmNlIGRpZCBub3QgbWF0Y2ggYW4gYXJyYXksIE9ic2VydmFibGUsIG9yIERhdGFTb3VyY2VgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjbGlja1Jvdyhyb3c6IFRhYmxlRWxlbWVudDxUPiwgaW5kZXg6IG51bWJlcikge1xuXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJbmRleCA9IGluZGV4O1xuICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLnByZXNlbnQoKTtcbiAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5vbkRpZERpc21pc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3RpdmVTbGlkZUluZGV4ID0gMDtcblxuICBwcm90ZWN0ZWQgZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQ/OiBhbnkpOiBTd2lwZXIge1xuICAgIHRoaXMuX3N3aXBlciA9IChzd2lwZXJFbGVtZW50IHx8IHRoaXMuc3dpcGVyUmVmPy5uYXRpdmVFbGVtZW50KT8uc3dpcGVyIHx8IHRoaXMuX3N3aXBlcjtcbiAgICByZXR1cm4gdGhpcy5fc3dpcGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRNb2RhbFNsaWRlcyhzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zb2xlLmxvZygnVE9ETyBfc2VsZWN0ZWRSb3dJbmRleD0nICsgdGhpcy5fc2VsZWN0ZWRSb3dJbmRleCk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkUm93SW5kZXggPiAwKSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbyh0aGlzLl9zZWxlY3RlZFJvd0luZGV4LCAwKTtcbiAgICB9XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3NsaWRlc1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudFBhdHRlcm4oKGhhbmRsZXIpID0+IHN3aXBlci5vbignc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnLCBoYW5kbGVyKSlcbiAgICAgIC5zdWJzY3JpYmUoKGFyZykgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnVE9ETyByZWNlaXZlZCBldmVudCBzbGlkZUNoYW5nZVRyYW5zaXRpb25TdGFydCcsIGFyZyk7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHpvb20oc3dpcGVyRWxlbWVudDogYW55LCB6b29tSW46IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCB6b29tID0gc3dpcGVyLnpvb207XG4gICAgaWYgKHpvb21Jbikgem9vbS5pbigpO1xuICAgIGVsc2Ugem9vbS5vdXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBkZWxldGVGcm9tTW9kYWwoZXZlbnQsIHN3aXBlckVsZW1lbnQ6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGN1cnJlbnRSb3cgPSB0aGlzLnJvd3MuZmluZCgocm93LCBpbmRleCkgPT4gaW5kZXggPT09IHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgaWYgKCFjdXJyZW50Um93KSByZXR1cm4gZmFsc2U7IC8vIFJvdyBub3QgZm91bmRcblxuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB0aGlzLmRlbGV0ZShldmVudCwgY3VycmVudFJvdyk7XG5cbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy56b29tTW9kYWwuZGlzbWlzcygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IHRoZSB6b29tXG4gICAgICBzd2lwZXIuem9vbS5vdXQoKTtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlUHJldihzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IDApIHtcbiAgICAgIC8vIExvb3AgdG8gbGFzdFxuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlVG8odGhpcy5yb3dzLmxlbmd0aCAtIDEsIDAvKm5vIHRyYW5zaXRpb24sIHRvIGF2b2lkIGEgXCJyZXZlcnRcIiBlZmZlY3QqLyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlUHJldigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzbGlkZU5leHQoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSB0aGlzLnJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgLy8gTG9vcCB0byBmaXJzdFxuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlVG8oMCwgMC8qbm8gdHJhbnNpdGlvbiwgdG8gYXZvaWQgYSBcInJldmVydFwiIGVmZmVjdCovKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbkRlbGV0ZVJvd3Mocm93czogVGFibGVFbGVtZW50PFQ+W10sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gQ2hlY2sgdXNpbmcgZW1pdHRlclxuICAgIGlmICh0aGlzLm9uQmVmb3JlRGVsZXRlUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FuRGVsZXRlID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLm9uQmVmb3JlRGVsZXRlUm93cywgJ2NhbkRlbGV0ZScsIHtcbiAgICAgICAgICBkZXRhaWw6IHtyb3dzfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjYW5EZWxldGUpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IEFsZXJ0cy5hc2tEZWxldGVDb25maXJtYXRpb24odGhpcy5hbHRlckN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlOyAvLyBDYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiXG5cbjxpb24tdG9vbGJhciBjb2xvcj1cImxpZ2h0XCIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxuICA8IS0tIEFkZCAtLT5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seSAmJiAhbW9iaWxlICYmIGVuYWJsZWRcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZCgpXCI+XG4gICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgPCEtLSBUb2dnbGUgdmlldyBtb2RlIC0tPlxuICAgIDxpb24tc2VnbWVudCAoaW9uQ2hhbmdlKT1cInRvZ2dsZVZpZXdNb2RlKCRldmVudClcIiBjb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiNFwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19tb2R1bGU8L21hdC1pY29uPlxuICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICA8aW9uLXNlZ21lbnQtYnV0dG9uIFt2YWx1ZV09XCIxMlwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19saXN0PC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgIDwvaW9uLXNlZ21lbnQ+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2lvbi10b29sYmFyPlxuXG48ZGl2IGNsYXNzPVwiZ2FsbGVyeS1jb250YWluZXIge3t0aGlzLm1vZGV9fVwiPlxuICA8ZGl2ICpuZ0lmPVwibW9iaWxlICYmIHpvb21BY3RpdmVcIiBjbGFzcz1cImJhY2tkcm9wXCIgW3N0eWxlLm9wYWNpdHldPVwiem9vbVNjYWxlXCI+PC9kaXY+XG5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgaW5kZXggYXMgaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtzaXplXT1cIl9jb2xTaXplXCI+XG4gICAgICAgIDxpb24tY2FyZCAjY2FyZFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS1jYXJkXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy56b29tLWhvdmVyXT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImNhcmRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAqbmdWYXI9XCJyb3d8cHJvcGVydHlHZXQ6ICdjdXJyZW50RGF0YSc7IGxldCBpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3cocm93LCBpbmRleClcIlxuICAgICAgICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgICAgICAgIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgICAgPGZpZ3VyZSBjbGFzcz1cImNhcmQtdGh1bWJuYWlsXCI+XG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2UudXJsfHxpbWFnZS5kYXRhVXJsXCIvPlxuICAgICAgICAgIDwvZmlndXJlPlxuXG4gICAgICAgICAgPCEtLSB0b29sYmFyIGZvciB0aXRsZSAod2hlbiBub3QgaG92ZXIpIC0tPlxuICAgICAgICAgIDxpb24tdG9vbGJhciBjb2xvcj1cInRyYW5zcGFyZW50XCIgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtdGl0bGVcIj57e2ltYWdlLnRpdGxlfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi10b29sYmFyPlxuXG4gICAgICAgICAgPCEtLSBhY3Rpb24gdG9vbGJhciAoZGVza3RvcCBvbmx5KSBzaG93biB3aGVuIGhvdmVyIGltYWdlIC0tPlxuICAgICAgICAgIDxpb24tdG9vbGJhciAjY2FyZFRvb2xiYXIgKm5nSWY9XCIhbW9iaWxlICYmICFyZWFkT25seVwiIGNvbG9yPVwibGlnaHRcIiBjbGFzcz1cImJ1dHRvbnNcIj5cblxuICAgICAgICAgICAgPCEtLSBlZGl0IHRpdGxlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cInNob3dUaXRsZVwiIHNsb3Q9XCJzdGFydFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0VGl0bGUoJGV2ZW50LCByb3csIGNhcmRUb29sYmFyKVwiXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c2luKT1cInNob3dDYXJkVG9vbGJhcihjYXJkVG9vbGJhcilcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmN1cnJlbnREYXRhLnRpdGxlfGlzTm90TmlsT3JCbGFuazsgZWxzZSBlZGl0TGFiZWxcIiB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5CVE5fRURJVF9USVRMRTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLkJUTl9BRERfVElUTEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKCRldmVudCwgcm93KVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICA8L2lvbi1jb2w+XG5cbiAgICAgIDxpb24tY29sICpuZ0lmPVwic2hvd0FkZENhcmRCdXR0b24gJiYgIXJlYWRPbmx5XCIgW3NpemVdPVwiX2NvbFNpemVcIiBAZmFkZUluQW5pbWF0aW9uPlxuICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJpbWFnZS1jYXJkLWJ1dHRvblwiIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICB0YXBwYWJsZT5cbiAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNhbWVyYVwiIFtjb2xvcl09XCJhZGRCdXR0b25Db2xvclwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuXG48L2Rpdj5cblxuPCEtLSBGQUIgYnV0dG9uOiBhZGQgLS0+XG48aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIlxuICAgICAgICAgKm5nSWY9XCJzaG93RmFiQnV0dG9uICYmICFyZWFkT25seVwiXG4gICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJkaXNhYmxlZFwiXG4gICAgICAgICBAZmFkZUluT3V0QW5pbWF0aW9uPlxuXG4gIDxpb24tZmFiLWJ1dHRvbiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJjYW1lcmFcIj48L2lvbi1pY29uPlxuICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIHN0eWxlPVwibGVmdDogMzNweDsgdG9wOiA5cHg7IGZvbnQtc2l6ZTogMjBweDtcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9pb24tZmFiPlxuXG48IS0tIFpvb20gbW9kYWwgLS0+XG48aW9uLW1vZGFsICN6b29tTW9kYWwgY2xhc3M9XCJzdGFjay1tb2RhbCB6b29tLW1vZGFsXCJcbiAgICAgICAgICAgW2NsYXNzLm1vZGFsLWZ1bGxzY3JlZW5dPVwibW9iaWxlXCJcbiAgICAgICAgICAgW2NsYXNzLm1vZGFsLWxhcmdlXT1cIiFtb2JpbGVcIj5cbiAgPG5nLXRlbXBsYXRlPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGlvbi1uby1tYXJnaW5cIiA+XG4gICAgICA8IS0tIENvdW50ZXIgIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvcC1sZWZ0XCIgKm5nVmFyPVwicm93cz8ubGVuZ3RoIGFzIGNvdW50XCI+XG4gICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICAgIHt7YWN0aXZlU2xpZGVJbmRleCArIDF9fSAvIHt7Y291bnR9fVxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIHpvb20gYnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiFtb2JpbGVcIiAoY2xpY2spPVwiem9vbShtb2RhbFN3aXBlciwgdHJ1ZSlcIiBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiYWRkXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiFtb2JpbGVcIiAoY2xpY2spPVwiem9vbShtb2RhbFN3aXBlciwgZmFsc2UpXCIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG5hdmlnYXRpb24gc2lkZSBidXR0b25zIG5leHQvYmFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9iaWxlICYmIChyb3dzfGlzQXJyYXlMZW5ndGg6e2dyZWF0ZXJUaGFuOiAxfSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNpZGUtYnV0dG9ucyBwcmV2XCJcbiAgICAgICAgICAgICAoY2xpY2spPVwic2xpZGVQcmV2KG1vZGFsU3dpcGVyKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlLWJ1dHRvbnMgbmV4dFwiXG4gICAgICAgICAgICAgKGNsaWNrKT1cInNsaWRlTmV4dChtb2RhbFN3aXBlcilcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZXZyb24tZm9yd2FyZFwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gaW1hZ2Ugc2xpZGVzIC0tPlxuICAgICAgPHN3aXBlci1jb250YWluZXIgI21vZGFsU3dpcGVyIFttb2R1bGVzXT1cInN3aXBlck1vZHVsZXNcIiBbem9vbV09XCJ0cnVlXCI+XG4gICAgICAgIDxzd2lwZXItc2xpZGUgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsYXN0IGFzIGxhc3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpcGVyLXpvb20tY29udGFpbmVyXCIgKm5nSWY9XCJyb3d8cHJvcGVydHlHZXQ6ICdjdXJyZW50RGF0YSc7IGxldCBpbWFnZVwiXG4gICAgICAgICAgICAgICAobmdJbml0KT1cImxhc3QgJiYgaW5pdE1vZGFsU2xpZGVzKG1vZGFsU3dpcGVyKVwiPlxuICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlLnVybHx8aW1hZ2UuZGF0YVVybFwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3N3aXBlci1zbGlkZT5cbiAgICAgIDwvc3dpcGVyLWNvbnRhaW5lcj5cbiAgICA8L2lvbi1jb250ZW50PlxuXG4gICAgPGlvbi1mb290ZXI+XG4gICAgICA8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiNFwiIGNsYXNzPVwiaW9uLXRleHQtc3RhcnRcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwiIXJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGcm9tTW9kYWwoJGV2ZW50LCBtb2RhbFN3aXBlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICB7eydDT01NT04uQlROX0RFTEVURSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIiBjbGFzcz1cImlvbi10ZXh0LWVuZFwiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInpvb21Nb2RhbC5kaXNtaXNzKClcIiBjb2xvcj1cInRlcnRpYXJ5XCIgZmlsbD1cImNsZWFyXCIgKm5nSWY9XCJtb2JpbGU7IGVsc2UgZGVza3RvcFwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNsb3NlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAge3snQ09NTU9OLkJUTl9DTE9TRSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVza3RvcD5cbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInpvb21Nb2RhbC5kaXNtaXNzKClcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XG4gICAgICAgICAgICAgICAge3snQ09NTU9OLkJUTl9DTE9TRSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24tZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjxpb24tcG9wb3ZlciAjdGl0bGVQb3BvdmVyPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIiA+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIl90aXRsZUZvcm1cIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJhdXRvXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5USVRMRTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cIl90aXRsZUF1dG9mb2N1c1wiXG4gICAgICAgICAgICAoa2V5ZG93bi5jb250cm9sLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9pb24tY29udGVudD5cblxuXG4gICAgPGlvbi1mb290ZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBub3dyYXA+XG4gICAgICAgICAgPGlvbi1jb2w+XG5cbiAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKG51bGwsICdDQU5DRUwnKVwiPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgW2ZpbGxdPVwiZGlzYWJsZWQgPyAnY2xlYXInIDogJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fVkFMSURBVEVfV0lUSF9TSE9SVENVVF9IRUxQJ3x0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1mb290ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1wb3BvdmVyPlxuIl19
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RixPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0sNENBQTRDLENBQUM7QUFHdEYsT0FBTyxFQUFtQixXQUFXLEVBQWtDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBb0IsWUFBWSxFQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFDckYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU0zRSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkMsTUFBTSxFQUFFLENBQUM7SUFDVCxJQUFJLEVBQUUsRUFBRTtDQUNULENBQUMsQ0FBQztBQWNILE1BQU0sT0FBTyx3QkFBd0I7SUFtRXZCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUF0RUYsZUFBZSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDdEMseUJBQXlCLENBQWU7SUFDeEMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDbkMsV0FBVyxDQUFxQjtJQUNoQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQXFELElBQUksQ0FBQyxDQUFDO0lBRXZGLFFBQVEsQ0FBUztJQUNqQixpQkFBaUIsQ0FBUztJQUMxQixrQkFBa0IsR0FBWSxJQUFJLENBQUM7SUFDbkMsVUFBVSxDQUFZO0lBQ3RCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDeEIsbUJBQW1CLENBQWU7SUFDbEMsT0FBTyxDQUFTO0lBRWhCLGFBQWEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUV4QixVQUFVLENBQTZCO0lBRTlCLFNBQVMsQ0FBNEI7SUFDckMsS0FBSyxHQUFZLElBQUksQ0FBQztJQUN0QixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsTUFBTSxHQUFZLElBQUksQ0FBQztJQUN2QixJQUFJLEdBQWdCLElBQUksQ0FBQztJQUN6QixtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDM0IsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQixhQUFhLENBQVU7SUFDdkIsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDekIsY0FBYyxHQUFjLFVBQVUsQ0FBQztJQUVoRCxJQUFhLFVBQVUsQ0FBQyxVQUE2QztRQUNuRSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUV1QixTQUFTLENBQVc7SUFDakIsWUFBWSxDQUFhO0lBQzFCLFNBQVMsQ0FBYTtJQUV0QyxrQkFBa0IsR0FBRyx5QkFBeUIsRUFBd0MsQ0FBQztJQUN2RixjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7SUFDdkQsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBRS9ELFlBQ1ksS0FBbUIsRUFDbkIsUUFBa0IsRUFDbEIsU0FBMEIsRUFDMUIsU0FBMkIsRUFDM0IsRUFBcUIsRUFDRSxXQUF5QjtRQUxoRCxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFHL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLFVBQVU7UUFDVixJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7SUFDdEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFM0YsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckYsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFFeEMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQWE7UUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPO1FBRWpDLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3RSxNQUFNLElBQUksR0FBc0IsRUFBRSxDQUFDO1FBQ25DLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9DLEdBQUcsQ0FBQyxXQUFXLEdBQUcsS0FBcUIsQ0FBQztZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFZLEVBQUUsR0FBb0IsRUFBRSxJQUFnQztRQUMvRSxJQUFJLEtBQUssRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUN4QixLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFFekIsc0JBQXNCO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU3QixJQUFJLE9BQWdCLENBQUM7UUFDckIsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ25ELE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNwRSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxjQUFjLENBQUMsQ0FBUztRQUN0QixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7Z0JBQ3JCLE1BQU07WUFDUjtnQkFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYSxFQUFFLEdBQW9CO1FBQzNDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFpQixFQUFFLEdBQW9CLEVBQUUsV0FBZ0I7UUFDdkUsSUFBSSxLQUFLLEVBQUUsZ0JBQWdCO1lBQUUsT0FBTztRQUNwQyxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDeEIsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFeEIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWxDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTlELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDekQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsOEZBQThGO1FBQzlGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxlQUFlLENBQUMsV0FBZ0I7UUFDeEMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBZ0IsQ0FBQztRQUM1QyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRVMsZUFBZSxDQUFDLFdBQWdCO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQWdCLENBQUM7UUFDNUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFVBQThCO1FBQ3hELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRVMscUJBQXFCO1FBQzdCLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxVQUEwRSxDQUFDO1FBQy9FLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuRyxPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLDhCQUE4QjtRQUN0QyxPQUFPLEtBQUssQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFUyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQW9CLEVBQUUsS0FBYTtRQUMxRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVTLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUVyQixTQUFTLENBQUMsYUFBbUI7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3hGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRVMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxhQUFrQjtRQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzNILE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDM0MsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBa0IsRUFBRSxNQUFlO1FBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7O1lBQ2pCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRVMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsYUFBa0I7UUFDdkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLGdCQUFnQjtRQUUvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXJELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04saUJBQWlCO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVTLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBa0I7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLGVBQWU7WUFDZixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFUyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWtCO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxnQkFBZ0I7WUFDaEIsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUF1QixFQUFFLElBQWdDO1FBQ3JGLHNCQUFzQjtRQUN0QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUU7b0JBQzdFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRTtpQkFDakIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxTQUFTO29CQUFFLE9BQU8sS0FBSyxDQUFDO1lBQy9CLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksR0FBRyxLQUFLLFdBQVc7b0JBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxjQUFjO2dCQUNyRCxPQUFPLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QixNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxZQUFZO1FBQzVDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzt1R0FoVlUsd0JBQXdCLHNLQXdFYixXQUFXOzJGQXhFdEIsd0JBQXdCLDB6QkNyRHJDLHFzUkEyT0EsZ2tTRHpMYyxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQzs7MkZBR3RDLHdCQUF3QjtrQkFQcEMsU0FBUzsrQkFDRSxtQkFBbUIsY0FHakIsQ0FBQyxlQUFlLEVBQUUsa0JBQWtCLENBQUMsbUJBQ2hDLHVCQUF1QixDQUFDLE1BQU07OzBCQTBFNUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXO3lDQW5EeEIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBd0JrQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0ssWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNDLFNBQVM7c0JBQWxDLFNBQVM7dUJBQUMsYUFBYTtnQkFFZCxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudFBhdHRlcm4sIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVEYXRhU291cmNlLCBUYWJsZUVsZW1lbnQgfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHsgRU5WSVJPTk1FTlQsIEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IEltYWdlU2VydmljZSB9IGZyb20gJy4uL2ltYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICcuLi9pbWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIElvbmljU2xpZGVzLCBJb25Nb2RhbCwgSW9uUG9wb3ZlciwgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBpc01vYmlsZSB9IGZyb20gJy4uLy4uL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgaXNFbXB0eUFycmF5LCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXdlciwgaXNEYXRhU291cmNlLCBMaXN0UmFuZ2UgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRzIH0gZnJvbSAnLi4vLi4vYWxlcnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFwcENvbG9ycyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyLCBlbWl0UHJvbWlzZUV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzJztcbmltcG9ydCB7IFByZWRlZmluZWRDb2xvcnMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBTd2lwZXIgfSBmcm9tICdzd2lwZXIvdHlwZXMnO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEdhbGxlcnlNb2RlID0gJ21vc2FpYycgfCAnbGlzdCc7XG5cbmNvbnN0IEdhbGxlcnlNb2RlQ29sU2l6ZSA9IE9iamVjdC5mcmVlemUoe1xuICBtb3NhaWM6IDQsXG4gIGxpc3Q6IDEyLFxufSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN3aXBlciBleHRlbmRzIFN3aXBlciB7XG4gIGFjdGl2ZUluZGV4OiBudW1iZXI7XG4gIGltYWdlc0xvYWRlZDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaW1hZ2UtZ2FsbGVyeScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbZmFkZUluQW5pbWF0aW9uLCBmYWRlSW5PdXRBbmltYXRpb25dLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwSW1hZ2VHYWxsZXJ5Q29tcG9uZW50PFQgZXh0ZW5kcyBJbWFnZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29sbGVjdGlvblZpZXdlciwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG4gIHByb3RlY3RlZCBfZGVzdHJveVN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJvdGVjdGVkIF9kYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8VD47XG4gIHByb3RlY3RlZCBfZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+PihudWxsKTtcblxuICBwcm90ZWN0ZWQgX2NvbFNpemU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9zZWxlY3RlZFJvd0luZGV4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfcHJlc2VudGluZ0VsZW1lbnQ6IEVsZW1lbnQgPSBudWxsO1xuICBwcm90ZWN0ZWQgX3RpdGxlRm9ybTogRm9ybUdyb3VwO1xuICBwcm90ZWN0ZWQgX3RpdGxlQXV0b2ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfc2xpZGVzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBfc3dpcGVyOiBTd2lwZXI7XG5cbiAgcHJvdGVjdGVkIHN3aXBlck1vZHVsZXMgPSBbSW9uaWNTbGlkZXNdO1xuICBwcm90ZWN0ZWQgem9vbUFjdGl2ZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgem9vbVNjYWxlID0gMTtcblxuICB2aWV3Q2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8TGlzdFJhbmdlPjtcblxuICBASW5wdXQoKSBjYXJkQ29sb3I6IHN0cmluZyB8IFByZWRlZmluZWRDb2xvcnM7XG4gIEBJbnB1dCgpIGRlYnVnOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgbW9iaWxlOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCkgbW9kZTogR2FsbGVyeU1vZGUgPSBudWxsO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlRGVsZXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd1Rvb2xiYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RmFiQnV0dG9uOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93VGl0bGUgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93QWRkQ2FyZEJ1dHRvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvbkNvbG9yOiBBcHBDb2xvcnMgPSAndGVydGlhcnknO1xuXG4gIEBJbnB1dCgpIHNldCBkYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55Pikge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlICE9PSBkYXRhU291cmNlKSB7XG4gICAgICB0aGlzLl9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgfVxuICBnZXQgZGF0YVNvdXJjZSgpOiBUYWJsZURhdGFTb3VyY2U8VCwgYW55LCBhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG4gIGdldCBlbmFibGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIGdldCByb3dzKCk6IFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YSQudmFsdWU7XG4gIH1cblxuICBnZXQgcm93Q291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93cz8ubGVuZ3RoIHx8IDA7XG4gIH1cblxuICBnZXQgYWN0aXZlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTd2lwZXIoKT8uYWN0aXZlSW5kZXggfHwgMDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3pvb21Nb2RhbCcpIHpvb21Nb2RhbDogSW9uTW9kYWw7XG4gIEBWaWV3Q2hpbGQoJ3RpdGxlUG9wb3ZlcicpIHRpdGxlUG9wb3ZlcjogSW9uUG9wb3ZlcjtcbiAgQFZpZXdDaGlsZCgnbW9kYWxTd2lwZXInKSBzd2lwZXJSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgpIG9uQmVmb3JlRGVsZXRlUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgeyByb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSB9PigpO1xuICBAT3V0cHV0KCkgb25BZnRlckFkZFJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPltdPigpO1xuICBAT3V0cHV0KCkgb25BZnRlckVkaXRSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW1hZ2U6IEltYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByb3RlY3RlZCBhbHRlckN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICB0aGlzLnZpZXdDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHsgc3RhcnQ6IDAsIGVuZDogTnVtYmVyLk1BWF9WQUxVRSB9KTtcblxuICAgIC8vIERFViBsb2dcbiAgICB0aGlzLmRlYnVnID0gZW52aXJvbm1lbnQgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1vYmlsZSA9IHRvQm9vbGVhbih0aGlzLm1vYmlsZSwgaXNNb2JpbGUod2luZG93KSk7XG4gICAgdGhpcy5tb2RlID0gdGhpcy5tb2JpbGUgPyAnbGlzdCcgOiAnbW9zYWljJztcbiAgICB0aGlzLl9jb2xTaXplID0gR2FsbGVyeU1vZGVDb2xTaXplW3RoaXMubW9kZV07XG4gICAgdGhpcy5zaG93VG9vbGJhciA9IHRvQm9vbGVhbih0aGlzLnNob3dUb29sYmFyLCAhdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuc2hvd0FkZENhcmRCdXR0b24gPSB0b0Jvb2xlYW4odGhpcy5zaG93QWRkQ2FyZEJ1dHRvbiwgdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuc2hvd0ZhYkJ1dHRvbiA9IHRvQm9vbGVhbih0aGlzLnNob3dGYWJCdXR0b24sIHRoaXMubW9iaWxlICYmICF0aGlzLnNob3dBZGRDYXJkQnV0dG9uKTtcblxuICAgIC8vIEdldCBtb2RhbCBwcmVzZW50aW5nIGVsZW1lbnQgKGlPUyBvbmx5KVxuICAgIHRoaXMuX3ByZXNlbnRpbmdFbGVtZW50ID0gdGhpcy5tb2JpbGUgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW9uLXBhZ2UnKSA6IG51bGw7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiAhdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95U3ViamVjdC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLmRhdGFTb3VyY2UpKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGQoZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IHRoaXMuaW1hZ2UuYWRkKGV2ZW50KTtcblxuICAgIGlmIChpc0VtcHR5QXJyYXkoaW1hZ2VzKSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBbaW1hZ2UtZ2FsbGVyeV0gQWRkaW5nIG5ldyAke2ltYWdlcy5sZW5ndGh9IGltYWdlKHMpYCwgaW1hZ2VzKTtcblxuICAgIGNvbnN0IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdID0gW107XG4gICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY3JlYXRlTmV3KCk7XG4gICAgICByb3cuY3VycmVudERhdGEgPSBpbWFnZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgIGNvbnN0IGFkZGVkID0gYXdhaXQgcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG4gICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2ltYWdlLWdhbGxlcnldIENhbm5vdCBjb25maXJtIG5ldyBpbWFnZSEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkFmdGVyQWRkUm93cy5lbWl0KHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGV2ZW50OiBFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8IHRoaXMucmVhZE9ubHkpIHJldHVybiBmYWxzZTtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKFtyb3ddKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGRlbGV0ZWQ6IGJvb2xlYW47XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIG5ldyBpbWFnZScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5jYW5jZWxPckRlbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tpbWFnZS1nYWxsZXJ5XSBSZW1vdmluZyBpbWFnZSAoYXQgIycgKyByb3cuaWQgKyAnKScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5kZWxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHRvZ2dsZVZpZXdNb2RlKF8/OiBFdmVudCkge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5tb2RlID0gJ21vc2FpYyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5tb2RlID0gJ2xpc3QnO1xuICAgIH1cbiAgICB0aGlzLl9jb2xTaXplID0gR2FsbGVyeU1vZGVDb2xTaXplW3RoaXMubW9kZV07XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCByb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIHJldHVybiByb3cuaWQ7XG4gIH1cblxuICBhc3luYyBlZGl0VGl0bGUoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogVGFibGVFbGVtZW50PFQ+LCBjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50Py5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2hvd0NhcmRUb29sYmFyKGNhcmRUb29sYmFyKTtcblxuICAgIGNvbnN0IHRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChyb3cuY3VycmVudERhdGEudGl0bGUsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KV0pKTtcbiAgICB0aGlzLl90aXRsZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHsgdGl0bGU6IHRpdGxlQ29udHJvbCB9KTtcbiAgICB0aGlzLl90aXRsZUF1dG9mb2N1cyA9IHRoaXMubW9iaWxlICYmIHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5yZWFkT25seTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGF3YWl0IHRoaXMudGl0bGVQb3BvdmVyLnByZXNlbnQoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcm9sZSB9ID0gYXdhaXQgdGhpcy50aXRsZVBvcG92ZXIub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoIXJvbGUgfHwgcm9sZSAhPT0gJ0NBTkNFTCcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tpbWFnZS1nYWxsZXJ5XSBVc2VyIHNldCB0aXRsZTogJyArIGRhdGEpO1xuICAgICAgcm93LmN1cnJlbnREYXRhLnRpdGxlID0gZGF0YTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLm9uQWZ0ZXJFZGl0Um93LmVtaXQocm93KTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSB0b29sYmFyLCBiZWNhdXNlIHRoZSBmb2N1cyBoYXZlIGJlZW4gZ2l2ZW4gdG8gdGhlIGV2ZW50J3Mgb3JpZ2luICh0aGUgZWRpdCBidXR0b24pXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhciksIDc1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0NhcmRUb29sYmFyKGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBjb25zdCBlbCA9IGNhcmRUb29sYmFyWydlbCddIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGNvbnN0IGVsID0gY2FyZFRvb2xiYXJbJ2VsJ10gYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPikge1xuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5fZGF0YVNvdXJjZSkpIHtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2UuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29ic2VydmVSZW5kZXJDaGFuZ2VzKCkge1xuICAgIC8vIElmIG5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCwgdGhlcmUgaXMgbm90aGluZyB0byBvYnNlcnZlIGZvciBjaGFuZ2VzLlxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkYXRhU3RyZWFtOiBPYnNlcnZhYmxlPFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+PjtcbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIGRhdGFTdHJlYW0gPSB0aGlzLmRhdGFTb3VyY2UuY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKGRhdGFTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgdGhpcy5nZXRUYWJsZVVua25vd25EYXRhU291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbiA9IGRhdGFTdHJlYW0ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveVN1YmplY3QpKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tpbWFnZS1nYWxsZXJ5XSBSZWNlaXZlZCBuZXcgcm93cycsIGRhdGEpO1xuICAgICAgdGhpcy5fZGF0YSQubmV4dChkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUYWJsZVVua25vd25EYXRhU291cmNlRXJyb3IoKSB7XG4gICAgcmV0dXJuIEVycm9yKGBQcm92aWRlZCBkYXRhIHNvdXJjZSBkaWQgbm90IG1hdGNoIGFuIGFycmF5LCBPYnNlcnZhYmxlLCBvciBEYXRhU291cmNlYCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2xpY2tSb3cocm93OiBUYWJsZUVsZW1lbnQ8VD4sIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgYXdhaXQgdGhpcy56b29tTW9kYWwucHJlc2VudCgpO1xuICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLm9uRGlkRGlzbWlzcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjdGl2ZVNsaWRlSW5kZXggPSAwO1xuXG4gIHByb3RlY3RlZCBnZXRTd2lwZXIoc3dpcGVyRWxlbWVudD86IGFueSk6IFN3aXBlciB7XG4gICAgdGhpcy5fc3dpcGVyID0gKHN3aXBlckVsZW1lbnQgfHwgdGhpcy5zd2lwZXJSZWY/Lm5hdGl2ZUVsZW1lbnQpPy5zd2lwZXIgfHwgdGhpcy5fc3dpcGVyO1xuICAgIHJldHVybiB0aGlzLl9zd2lwZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdE1vZGFsU2xpZGVzKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnNvbGUubG9nKCdUT0RPIF9zZWxlY3RlZFJvd0luZGV4PScgKyB0aGlzLl9zZWxlY3RlZFJvd0luZGV4KTtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRSb3dJbmRleCA+IDApIHtcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVRvKHRoaXMuX3NlbGVjdGVkUm93SW5kZXgsIDApO1xuICAgIH1cbiAgICB0aGlzLl9zbGlkZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50UGF0dGVybigoaGFuZGxlcikgPT4gc3dpcGVyLm9uKCdzbGlkZUNoYW5nZVRyYW5zaXRpb25TdGFydCcsIGhhbmRsZXIpKS5zdWJzY3JpYmUoKGFyZykgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1RPRE8gcmVjZWl2ZWQgZXZlbnQgc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnLCBhcmcpO1xuICAgICAgdGhpcy5hY3RpdmVTbGlkZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB6b29tKHN3aXBlckVsZW1lbnQ6IGFueSwgem9vbUluOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3Qgem9vbSA9IHN3aXBlci56b29tO1xuICAgIGlmICh6b29tSW4pIHpvb20uaW4oKTtcbiAgICBlbHNlIHpvb20ub3V0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlRnJvbU1vZGFsKGV2ZW50LCBzd2lwZXJFbGVtZW50OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBjdXJyZW50Um93ID0gdGhpcy5yb3dzLmZpbmQoKHJvdywgaW5kZXgpID0+IGluZGV4ID09PSBzd2lwZXIuYWN0aXZlSW5kZXgpO1xuICAgIGlmICghY3VycmVudFJvdykgcmV0dXJuIGZhbHNlOyAvLyBSb3cgbm90IGZvdW5kXG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5kZWxldGUoZXZlbnQsIGN1cnJlbnRSb3cpO1xuXG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLmRpc21pc3MoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgdGhlIHpvb21cbiAgICAgIHN3aXBlci56b29tLm91dCgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZSgpO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2xpZGVQcmV2KHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gMCkge1xuICAgICAgLy8gTG9vcCB0byBsYXN0XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbyh0aGlzLnJvd3MubGVuZ3RoIC0gMSwgMCAvKm5vIHRyYW5zaXRpb24sIHRvIGF2b2lkIGEgXCJyZXZlcnRcIiBlZmZlY3QqLyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVByZXYoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2xpZGVOZXh0KHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdGhpcy5yb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIExvb3AgdG8gZmlyc3RcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVRvKDAsIDAgLypubyB0cmFuc2l0aW9uLCB0byBhdm9pZCBhIFwicmV2ZXJ0XCIgZWZmZWN0Ki8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbkRlbGV0ZVJvd3Mocm93czogVGFibGVFbGVtZW50PFQ+W10sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gQ2hlY2sgdXNpbmcgZW1pdHRlclxuICAgIGlmICh0aGlzLm9uQmVmb3JlRGVsZXRlUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FuRGVsZXRlID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLm9uQmVmb3JlRGVsZXRlUm93cywgJ2NhbkRlbGV0ZScsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgcm93cyB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjYW5EZWxldGUpIHJldHVybiBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuIGZhbHNlOyAvLyBVc2VyIGNhbmNlbFxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBjaGVja2luZyBpZiBjYW4gZGVsZXRlIHJvd3MnLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlybUJlZm9yZURlbGV0ZSkge1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgQWxlcnRzLmFza0RlbGV0ZUNvbmZpcm1hdGlvbih0aGlzLmFsdGVyQ3RybCwgdGhpcy50cmFuc2xhdGUsIGV2ZW50KTtcbiAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7IC8vIENhbmNlbGxlZFxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiICpuZ0lmPVwic2hvd1Rvb2xiYXJcIj5cbiAgPCEtLSBBZGQgLS0+XG4gIDxidXR0b25cbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAqbmdJZj1cIiFyZWFkT25seSAmJiAhbW9iaWxlICYmIGVuYWJsZWRcIlxuICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlXCJcbiAgICAoY2xpY2spPVwiYWRkKClcIlxuICA+XG4gICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgPCEtLSBUb2dnbGUgdmlldyBtb2RlIC0tPlxuICAgIDxpb24tc2VnbWVudCAoaW9uQ2hhbmdlKT1cInRvZ2dsZVZpZXdNb2RlKCRldmVudClcIiBjb2xvcj1cImFjY2VudFwiIFt2YWx1ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiNFwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19tb2R1bGU8L21hdC1pY29uPlxuICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICA8aW9uLXNlZ21lbnQtYnV0dG9uIFt2YWx1ZV09XCIxMlwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19saXN0PC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgIDwvaW9uLXNlZ21lbnQ+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2lvbi10b29sYmFyPlxuXG48ZGl2IGNsYXNzPVwiZ2FsbGVyeS1jb250YWluZXIge3sgdGhpcy5tb2RlIH19XCI+XG4gIDxkaXYgKm5nSWY9XCJtb2JpbGUgJiYgem9vbUFjdGl2ZVwiIGNsYXNzPVwiYmFja2Ryb3BcIiBbc3R5bGUub3BhY2l0eV09XCJ6b29tU2NhbGVcIj48L2Rpdj5cblxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgIDxpb24tcm93PlxuICAgICAgPGlvbi1jb2wgKnJ4Rm9yPVwibGV0IHJvdyBvZiBfZGF0YSQ7IGluZGV4IGFzIGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIiBbc2l6ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgICA8aW9uLWNhcmRcbiAgICAgICAgICAjY2FyZFxuICAgICAgICAgIGNsYXNzPVwiaW1hZ2UtY2FyZFwiXG4gICAgICAgICAgW2NsYXNzLnpvb20taG92ZXJdPVwiIW1vYmlsZVwiXG4gICAgICAgICAgW2NvbG9yXT1cImNhcmRDb2xvclwiXG4gICAgICAgICAgKm5nVmFyPVwicm93IHwgcHJvcGVydHlHZXQ6ICdjdXJyZW50RGF0YSc7IGxldCBpbWFnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUm93KHJvdywgaW5kZXgpXCJcbiAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgICAgPlxuICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJjYXJkLXRodW1ibmFpbFwiPlxuICAgICAgICAgICAgPGlvbi1pbWcgW3NyY109XCJpbWFnZS51cmwgfHwgaW1hZ2UuZGF0YVVybFwiIC8+XG4gICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICA8IS0tIHRvb2xiYXIgZm9yIHRpdGxlICh3aGVuIG5vdCBob3ZlcikgLS0+XG4gICAgICAgICAgPGlvbi10b29sYmFyIGNvbG9yPVwidHJhbnNwYXJlbnRcIiBjbGFzcz1cInRpdGxlXCIgKm5nSWY9XCJpbWFnZS50aXRsZVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBpbWFnZS50aXRsZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG5cbiAgICAgICAgICA8IS0tIGFjdGlvbiB0b29sYmFyIChkZXNrdG9wIG9ubHkpIHNob3duIHdoZW4gaG92ZXIgaW1hZ2UgLS0+XG4gICAgICAgICAgPGlvbi10b29sYmFyICNjYXJkVG9vbGJhciAqbmdJZj1cIiFtb2JpbGUgJiYgIXJlYWRPbmx5XCIgY29sb3I9XCJsaWdodFwiIGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgPCEtLSBlZGl0IHRpdGxlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dUaXRsZVwiXG4gICAgICAgICAgICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJlZGl0VGl0bGUoJGV2ZW50LCByb3csIGNhcmRUb29sYmFyKVwiXG4gICAgICAgICAgICAgIChmb2N1c2luKT1cInNob3dDYXJkVG9vbGJhcihjYXJkVG9vbGJhcilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuY3VycmVudERhdGEudGl0bGUgfCBpc05vdE5pbE9yQmxhbms7IGVsc2UgZWRpdExhYmVsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgSU1BR0UuR0FMTEVSWS5CVE5fRURJVF9USVRMRVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLkJUTl9BRERfVElUTEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2lvbi10b29sYmFyPlxuICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8aW9uLWNvbCAqbmdJZj1cInNob3dBZGRDYXJkQnV0dG9uICYmICFyZWFkT25seVwiIFtzaXplXT1cIl9jb2xTaXplXCIgQGZhZGVJbkFuaW1hdGlvbj5cbiAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwiaW1hZ2UtY2FyZC1idXR0b25cIiBjb2xvcj1cImxpZ2h0XCIgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgdGFwcGFibGU+XG4gICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjYW1lcmFcIiBbY29sb3JdPVwiYWRkQnV0dG9uQ29sb3JcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZFwiIFtjb2xvcl09XCJhZGRCdXR0b25Db2xvclwiIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbjwvZGl2PlxuXG48IS0tIEZBQiBidXR0b246IGFkZCAtLT5cbjxpb24tZmFiXG4gIHNsb3Q9XCJmaXhlZFwiXG4gIHZlcnRpY2FsPVwiYm90dG9tXCJcbiAgaG9yaXpvbnRhbD1cImVuZFwiXG4gICpuZ0lmPVwic2hvd0ZhYkJ1dHRvbiAmJiAhcmVhZE9ubHlcIlxuICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJkaXNhYmxlZFwiXG4gIEBmYWRlSW5PdXRBbmltYXRpb25cbj5cbiAgPGlvbi1mYWItYnV0dG9uIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiYWRkKCRldmVudClcIj5cbiAgICA8aW9uLWljb24gbmFtZT1cImNhbWVyYVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgc3R5bGU9XCJsZWZ0OiAzM3B4OyB0b3A6IDlweDsgZm9udC1zaXplOiAyMHB4XCI+PC9pb24taWNvbj5cbiAgPC9pb24tZmFiLWJ1dHRvbj5cbjwvaW9uLWZhYj5cblxuPCEtLSBab29tIG1vZGFsIC0tPlxuPGlvbi1tb2RhbCAjem9vbU1vZGFsIGNsYXNzPVwic3RhY2stbW9kYWwgem9vbS1tb2RhbFwiIFtjbGFzcy5tb2RhbC1mdWxsc2NyZWVuXT1cIm1vYmlsZVwiIFtjbGFzcy5tb2RhbC1sYXJnZV09XCIhbW9iaWxlXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tbm8tbWFyZ2luXCI+XG4gICAgICA8IS0tIENvdW50ZXIgIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvcC1sZWZ0XCIgKm5nVmFyPVwicm93cz8ubGVuZ3RoIGFzIGNvdW50XCI+XG4gICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJsaWdodFwiPnt7IGFjdGl2ZVNsaWRlSW5kZXggKyAxIH19IC8ge3sgY291bnQgfX08L2lvbi1sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIHpvb20gYnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiFtb2JpbGVcIiAoY2xpY2spPVwiem9vbShtb2RhbFN3aXBlciwgdHJ1ZSlcIiBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiYWRkXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiFtb2JpbGVcIiAoY2xpY2spPVwiem9vbShtb2RhbFN3aXBlciwgZmFsc2UpXCIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG5hdmlnYXRpb24gc2lkZSBidXR0b25zIG5leHQvYmFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9iaWxlICYmIChyb3dzIHwgaXNBcnJheUxlbmd0aDogeyBncmVhdGVyVGhhbjogMSB9KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZS1idXR0b25zIHByZXZcIiAoY2xpY2spPVwic2xpZGVQcmV2KG1vZGFsU3dpcGVyKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlLWJ1dHRvbnMgbmV4dFwiIChjbGljayk9XCJzbGlkZU5leHQobW9kYWxTd2lwZXIpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWZvcndhcmRcIj48L2lvbi1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGltYWdlIHNsaWRlcyAtLT5cbiAgICAgIDxzd2lwZXItY29udGFpbmVyICNtb2RhbFN3aXBlciBbbW9kdWxlc109XCJzd2lwZXJNb2R1bGVzXCIgW3pvb21dPVwidHJ1ZVwiPlxuICAgICAgICA8c3dpcGVyLXNsaWRlICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGFzdCBhcyBsYXN0XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzd2lwZXItem9vbS1jb250YWluZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJyb3cgfCBwcm9wZXJ0eUdldDogJ2N1cnJlbnREYXRhJzsgbGV0IGltYWdlXCJcbiAgICAgICAgICAgIChuZ0luaXQpPVwibGFzdCAmJiBpbml0TW9kYWxTbGlkZXMobW9kYWxTd2lwZXIpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW9uLWltZyBbc3JjXT1cImltYWdlLnVybCB8fCBpbWFnZS5kYXRhVXJsXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zd2lwZXItc2xpZGU+XG4gICAgICA8L3N3aXBlci1jb250YWluZXI+XG4gICAgPC9pb24tY29udGVudD5cblxuICAgIDxpb24tZm9vdGVyPlxuICAgICAgPGlvbi10b29sYmFyIGNvbG9yPVwibGlnaHRcIj5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIiBjbGFzcz1cImlvbi10ZXh0LXN0YXJ0XCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGcm9tTW9kYWwoJGV2ZW50LCBtb2RhbFN3aXBlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCI0XCI+PC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCI0XCIgY2xhc3M9XCJpb24tdGV4dC1lbmRcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJ6b29tTW9kYWwuZGlzbWlzcygpXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwibW9iaWxlOyBlbHNlIGRlc2t0b3BcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJjbG9zZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNrdG9wPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiem9vbU1vZGFsLmRpc21pc3MoKVwiIGNvbG9yPVwidGVydGlhcnlcIj5cbiAgICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DTE9TRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24tZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjxpb24tcG9wb3ZlciAjdGl0bGVQb3BvdmVyPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiX3RpdGxlRm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImF1dG9cIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLlRJVExFPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiX3RpdGxlQXV0b2ZvY3VzXCJcbiAgICAgICAgICAgIChrZXlkb3duLmNvbnRyb2wuZW50ZXIpPVwidGl0bGVQb3BvdmVyLmRpc21pc3MoX3RpdGxlRm9ybS5jb250cm9scy50aXRsZS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9pb24tY29udGVudD5cblxuICAgIDxpb24tZm9vdGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgICAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cblxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwidGl0bGVQb3BvdmVyLmRpc21pc3MobnVsbCwgJ0NBTkNFTCcpXCI+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ0FOQ0VMPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBbZmlsbF09XCJkaXNhYmxlZCA/ICdjbGVhcicgOiAnc29saWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9WQUxJREFURV9XSVRIX1NIT1JUQ1VUX0hFTFAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1mb290ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1wb3BvdmVyPlxuIl19
|
|
@@ -7,31 +7,33 @@ import { SharedPipesModule } from '../../pipes/pipes.module';
|
|
|
7
7
|
import { SharedMaterialModule } from '../../material/material.module';
|
|
8
8
|
import { SharedDirectivesModule } from '../../directives/directives.module';
|
|
9
9
|
import { ReactiveFormsModule } from '@angular/forms';
|
|
10
|
+
import { RxStateModule } from '../../rx-state.module';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
import * as i1 from "@ngx-translate/core";
|
|
12
13
|
export class ImageGalleryModule {
|
|
13
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.
|
|
14
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ImageGalleryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
15
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.3", ngImport: i0, type: ImageGalleryModule, declarations: [
|
|
15
16
|
// Components
|
|
16
17
|
AppImageGalleryComponent], imports: [CommonModule,
|
|
17
18
|
IonicModule,
|
|
18
19
|
ReactiveFormsModule,
|
|
19
20
|
SharedMaterialModule,
|
|
20
21
|
SharedPipesModule,
|
|
21
|
-
SharedDirectivesModule, i1.TranslateModule], exports: [IonicModule,
|
|
22
|
+
SharedDirectivesModule, i1.TranslateModule, RxStateModule], exports: [IonicModule,
|
|
22
23
|
TranslateModule,
|
|
23
24
|
// Components
|
|
24
25
|
AppImageGalleryComponent] });
|
|
25
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.
|
|
26
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ImageGalleryModule, imports: [CommonModule,
|
|
26
27
|
IonicModule,
|
|
27
28
|
ReactiveFormsModule,
|
|
28
29
|
SharedMaterialModule,
|
|
29
30
|
SharedPipesModule,
|
|
30
31
|
SharedDirectivesModule,
|
|
31
|
-
TranslateModule.forChild(),
|
|
32
|
+
TranslateModule.forChild(),
|
|
33
|
+
RxStateModule, IonicModule,
|
|
32
34
|
TranslateModule] });
|
|
33
35
|
}
|
|
34
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ImageGalleryModule, decorators: [{
|
|
35
37
|
type: NgModule,
|
|
36
38
|
args: [{
|
|
37
39
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
@@ -43,17 +45,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImpor
|
|
|
43
45
|
SharedPipesModule,
|
|
44
46
|
SharedDirectivesModule,
|
|
45
47
|
TranslateModule.forChild(),
|
|
48
|
+
RxStateModule,
|
|
46
49
|
],
|
|
47
50
|
declarations: [
|
|
48
51
|
// Components
|
|
49
|
-
AppImageGalleryComponent
|
|
52
|
+
AppImageGalleryComponent,
|
|
50
53
|
],
|
|
51
54
|
exports: [
|
|
52
55
|
IonicModule,
|
|
53
56
|
TranslateModule,
|
|
54
57
|
// Components
|
|
55
|
-
AppImageGalleryComponent
|
|
56
|
-
]
|
|
58
|
+
AppImageGalleryComponent,
|
|
59
|
+
],
|
|
57
60
|
}]
|
|
58
61
|
}] });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUF5QnRELE1BQU0sT0FBTyxrQkFBa0I7dUdBQWxCLGtCQUFrQjt3R0FBbEIsa0JBQWtCO1lBVjNCLGFBQWE7WUFDYix3QkFBd0IsYUFYeEIsWUFBWTtZQUNaLFdBQVc7WUFDWCxtQkFBbUI7WUFDbkIsb0JBQW9CO1lBQ3BCLGlCQUFpQjtZQUNqQixzQkFBc0Isc0JBRXRCLGFBQWEsYUFPYixXQUFXO1lBQ1gsZUFBZTtZQUNmLGFBQWE7WUFDYix3QkFBd0I7d0dBR2Ysa0JBQWtCLFlBcEIzQixZQUFZO1lBQ1osV0FBVztZQUNYLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsaUJBQWlCO1lBQ2pCLHNCQUFzQjtZQUN0QixlQUFlLENBQUMsUUFBUSxFQUFFO1lBQzFCLGFBQWEsRUFPYixXQUFXO1lBQ1gsZUFBZTs7MkZBS04sa0JBQWtCO2tCQXZCOUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3dCQUNqQixzQkFBc0I7d0JBQ3RCLGVBQWUsQ0FBQyxRQUFRLEVBQUU7d0JBQzFCLGFBQWE7cUJBQ2Q7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLGFBQWE7d0JBQ2Isd0JBQXdCO3FCQUN6QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2Isd0JBQXdCO3FCQUN6QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFwcEltYWdlR2FsbGVyeUNvbXBvbmVudCB9IGZyb20gJy4vaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2hhcmVkUGlwZXNNb2R1bGUgfSBmcm9tICcuLi8uLi9waXBlcy9waXBlcy5tb2R1bGUnO1xuaW1wb3J0IHsgU2hhcmVkTWF0ZXJpYWxNb2R1bGUgfSBmcm9tICcuLi8uLi9tYXRlcmlhbC9tYXRlcmlhbC5tb2R1bGUnO1xuaW1wb3J0IHsgU2hhcmVkRGlyZWN0aXZlc01vZHVsZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGlyZWN0aXZlcy5tb2R1bGUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJ4U3RhdGVNb2R1bGUgfSBmcm9tICcuLi8uLi9yeC1zdGF0ZS5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSW9uaWNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNYXRlcmlhbE1vZHVsZSxcbiAgICBTaGFyZWRQaXBlc01vZHVsZSxcbiAgICBTaGFyZWREaXJlY3RpdmVzTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZS5mb3JDaGlsZCgpLFxuICAgIFJ4U3RhdGVNb2R1bGUsXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIC8vIENvbXBvbmVudHNcbiAgICBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnQsXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBJb25pY01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgLy8gQ29tcG9uZW50c1xuICAgIEFwcEltYWdlR2FsbGVyeUNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VHYWxsZXJ5TW9kdWxlIHt9XG4iXX0=
|