@seniorsistemas/angular-components 19.9.15-develop-11ab86f5 → 19.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -84
- package/accordion/README.md +4 -5
- package/accordion/lib/accordion/accordion.module.d.ts +0 -7
- package/alert/lib/alert/alert.module.d.ts +0 -7
- package/badge/README.md +4 -5
- package/badge/lib/badge/badge.module.d.ts +0 -10
- package/bignumber-input/README.md +4 -5
- package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +39 -16
- package/bignumber-input/lib/bignumber-input/bignumber-input.module.d.ts +0 -7
- package/breadcrumb/README.md +4 -5
- package/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.module.d.ts +1 -5
- package/button/lib/button/button.module.d.ts +0 -7
- package/calendar-mask/README.md +4 -5
- package/calendar-mask/lib/calendar-mask/calendar-mask.module.d.ts +0 -7
- package/card/README.md +5 -6
- package/card/lib/card/card.module.d.ts +0 -7
- package/chat/README.md +8 -11
- package/chat/lib/chat/chat.module.d.ts +0 -7
- package/checkbox-list/README.md +4 -5
- package/checkbox-list/lib/checkbox-list/checkbox-list.module.d.ts +0 -7
- package/chips/README.md +4 -5
- package/chips/lib/chips/chips.module.d.ts +0 -7
- package/code-editor/README.md +4 -5
- package/code-editor/lib/code-editor/code-editor.module.d.ts +0 -7
- package/collapse-link/README.md +4 -5
- package/collapse-link/lib/collapse-link/collapse-link.module.d.ts +0 -7
- package/common/lib/angular-components.module.d.ts +0 -9
- package/common/lib/svg-factory/svg-factory.module.d.ts +0 -7
- package/common/public-api.d.ts +0 -1
- package/content-generator/README.md +2 -2
- package/content-generator/lib/content-generator/content-generator.module.d.ts +0 -7
- package/control-errors/README.md +2 -2
- package/control-errors/lib/control-errors/control-errors.module.d.ts +0 -7
- package/country-phone-picker/README.md +2 -2
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.module.d.ts +0 -7
- package/currency/README.md +1 -1
- package/custom-fields/README.md +3 -14
- package/custom-fields/lib/custom-fields/custom-fields.module.d.ts +0 -7
- package/custom-fields/lib/custom-fields/models/index.d.ts +0 -1
- package/dialog/README.md +1 -1
- package/drawer/README.md +4 -8
- package/drawer/lib/drawer/drawer.module.d.ts +0 -10
- package/dynamic-form/README.md +2 -18
- package/dynamic-form/dynamic-form/dynamic-form.module.d.ts +0 -7
- package/dynamic-form/dynamic-form/form-field/addon-config.d.ts +1 -10
- package/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.d.ts +15 -15
- package/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.d.ts +6 -8
- package/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.d.ts +2 -5
- package/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.d.ts +664 -0
- package/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.d.ts +29 -0
- package/dynamic-form/public-api.d.ts +1 -0
- package/editable-overlay/README.md +2 -2
- package/editable-overlay/lib/editable-overlay/editable-overlay.module.d.ts +0 -7
- package/empty-state/README.md +2 -5
- package/empty-state/lib/empty-state/empty-state.module.d.ts +0 -7
- package/esm2022/accordion/lib/accordion/accordion.module.mjs +1 -8
- package/esm2022/alert/lib/alert/alert.module.mjs +1 -8
- package/esm2022/badge/lib/badge/badge.module.mjs +1 -11
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +127 -19
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.module.mjs +1 -8
- package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.module.mjs +2 -6
- package/esm2022/button/lib/button/button.module.mjs +1 -8
- package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.module.mjs +1 -8
- package/esm2022/card/lib/card/card.module.mjs +1 -8
- package/esm2022/chat/lib/chat/chat.module.mjs +1 -8
- package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.module.mjs +1 -8
- package/esm2022/chips/lib/chips/chips.module.mjs +1 -8
- package/esm2022/code-editor/lib/code-editor/code-editor.component.mjs +1 -10
- package/esm2022/code-editor/lib/code-editor/code-editor.module.mjs +15 -9
- package/esm2022/collapse-link/lib/collapse-link/collapse-link.module.mjs +1 -8
- package/esm2022/common/lib/angular-components.module.mjs +1 -10
- package/esm2022/common/lib/svg-factory/svg-factory.module.mjs +1 -8
- package/esm2022/common/public-api.mjs +1 -2
- package/esm2022/content-generator/lib/content-generator/content-generator.module.mjs +1 -8
- package/esm2022/control-errors/lib/control-errors/control-errors.module.mjs +1 -8
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.module.mjs +1 -8
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.service.mjs +3 -4
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +13 -17
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.module.mjs +1 -8
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.service.mjs +3 -4
- package/esm2022/custom-fields/lib/custom-fields/models/custom-field-type.mjs +2 -4
- package/esm2022/custom-fields/lib/custom-fields/models/index.mjs +1 -2
- package/esm2022/drawer/lib/drawer/drawer.module.mjs +1 -11
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.module.mjs +1 -8
- package/esm2022/dynamic-form/dynamic-form/form-field/addon-config.mjs +2 -6
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +10 -33
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +96 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +124 -0
- package/esm2022/dynamic-form/public-api.mjs +7 -2
- package/esm2022/editable-overlay/lib/editable-overlay/editable-overlay.module.mjs +1 -8
- package/esm2022/empty-state/lib/empty-state/empty-state.module.mjs +1 -8
- package/esm2022/fieldset/lib/fieldset/fieldset.module.mjs +1 -8
- package/esm2022/file-picker/lib/file-picker/file-picker.module.mjs +1 -8
- package/esm2022/file-picker/lib/file-picker/file-picker.service.mjs +3 -4
- package/esm2022/gantt/lib/gantt/gantt.module.mjs +1 -8
- package/esm2022/global-search/lib/global-search/global-search.module.mjs +1 -19
- package/esm2022/grid-menu/lib/grid-menu/grid-menu.module.mjs +1 -8
- package/esm2022/help-popover/lib/help-popover/help-popover.module.mjs +1 -8
- package/esm2022/image-cropper/lib/image-cropper/image-cropper.module.mjs +1 -12
- package/esm2022/image-cropper/lib/image-cropper/image-cropper.service.mjs +3 -4
- package/esm2022/infinite-scroll/lib/infinite-scroll/infinite-scroll.module.mjs +1 -8
- package/esm2022/info-sign/lib/info-sign/info-sign.module.mjs +1 -8
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +5 -5
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +1 -8
- package/esm2022/input-group/lib/input-group/input-group.module.mjs +1 -8
- package/esm2022/input-mask/lib/input-mask/input-mask.module.mjs +1 -8
- package/esm2022/input-text/lib/input-text/input-text.module.mjs +1 -8
- package/esm2022/insights/lib/insights/insights.module.mjs +1 -11
- package/esm2022/kanban/lib/kanban/kanban-event.service.mjs +3 -4
- package/esm2022/kanban/lib/kanban/kanban.module.mjs +1 -11
- package/esm2022/label-value/lib/label-value/label-value.module.mjs +1 -8
- package/esm2022/loading-state/lib/loading-state/loading-state.module.mjs +1 -8
- package/esm2022/locale/lib/locale/locale.module.mjs +1 -14
- package/esm2022/locale/lib/locale/locale.service.mjs +3 -4
- package/esm2022/locale/lib/locale/options/index.mjs +13 -1
- package/esm2022/locale/lib/locale/pipes/localized-bignumber-impure.pipe.mjs +1 -1
- package/esm2022/locale/lib/locale/pipes/localized-bignumber.pipe.mjs +2 -10
- package/esm2022/locale/public-api.mjs +1 -2
- package/esm2022/localized-number-input/lib/localized-number-input/localized-number-input.directive.mjs +1 -5
- package/esm2022/localized-number-input/lib/localized-number-input/localized-number-input.module.mjs +1 -8
- package/esm2022/mask/lib/mask/mask-formatter.module.mjs +1 -8
- package/esm2022/mouse-events/lib/mouse-events/mouse-events.module.mjs +1 -8
- package/esm2022/navigation-button/lib/navigation-button/navigation-button.module.mjs +1 -8
- package/esm2022/number-input/lib/number-input/number-input.directive.mjs +2 -2
- package/esm2022/number-input/lib/number-input/number-input.module.mjs +2 -9
- package/esm2022/numeric/lib/numeric.module.mjs +1 -8
- package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +15 -178
- package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.module.mjs +1 -8
- package/esm2022/object-card/lib/object-card/object-card.module.mjs +1 -12
- package/esm2022/panel/lib/panel/panel.module.mjs +1 -11
- package/esm2022/password-strength/lib/password-strength/password-strength.module.mjs +1 -8
- package/esm2022/picklist/lib/picklist/picklist.module.mjs +1 -8
- package/esm2022/pin-code-field/lib/pin-code-field.module.mjs +1 -8
- package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.mjs +1 -8
- package/esm2022/progressbar/lib/progressbar/progressbar.module.mjs +1 -8
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.module.mjs +1 -8
- package/esm2022/select/lib/select/select.component.mjs +3 -16
- package/esm2022/select-button/lib/select-button/select-button.module.mjs +1 -8
- package/esm2022/shared/lib/shared/border-button/border-button.module.mjs +1 -8
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.mjs +1 -8
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.service.mjs +3 -4
- package/esm2022/slider/lib/slider/slider.module.mjs +1 -8
- package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition.module.mjs +1 -8
- package/esm2022/split-button/lib/split-button/split-button.module.mjs +1 -8
- package/esm2022/stats-card/lib/stats-card/stats-card.module.mjs +1 -8
- package/esm2022/stepper/lib/stepper/stepper.module.mjs +1 -8
- package/esm2022/structure/lib/structure/structure.module.mjs +1 -8
- package/esm2022/switch/lib/switch/switch.module.mjs +1 -8
- package/esm2022/table/lib/table/table.module.mjs +1 -9
- package/esm2022/table-header/lib/table-header/table-header-checkox.module.mjs +1 -8
- package/esm2022/template/lib/template/template.module.mjs +1 -8
- package/esm2022/text-area/lib/text-area.module.mjs +1 -8
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.module.mjs +1 -8
- package/esm2022/thumbnails/lib/thumbnails/thumbnails.module.mjs +1 -8
- package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.module.mjs +1 -8
- package/esm2022/tile/lib/tile/tile.module.mjs +1 -11
- package/esm2022/timeline/lib/timeline/timeline.module.mjs +1 -8
- package/esm2022/toast/lib/toast/toast.module.mjs +1 -8
- package/esm2022/token-list/lib/token-list/token-list.module.mjs +1 -8
- package/esm2022/tooltip/lib/tooltip/tooltip.module.mjs +1 -8
- package/esm2022/topbar/lib/topbar/topbar.module.mjs +1 -11
- package/esm2022/tree/lib/tree/tree.module.mjs +1 -8
- package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.module.mjs +1 -8
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-alert.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-badge.mjs +0 -10
- package/fesm2022/seniorsistemas-angular-components-badge.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +126 -25
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +1 -5
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-button.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-card.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chat.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-chat.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +160 -164
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-common.mjs +2 -38
- package/fesm2022/seniorsistemas-angular-components-common.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +2 -10
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +15 -75
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs +0 -10
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +208 -52
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editable-overlay.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-editable-overlay.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-empty-state.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-empty-state.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +2 -10
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs +0 -18
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-help-popover.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-help-popover.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs +2 -14
- package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-infinite-scroll.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-infinite-scroll.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-info-sign.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-info-sign.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +4 -11
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-group.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-input-group.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-mask.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-input-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-text.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-insights.mjs +0 -10
- package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs +2 -13
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-label-value.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-label-value.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-locale.mjs +5 -58
- package/fesm2022/seniorsistemas-angular-components-locale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-localized-number-input.mjs +0 -11
- package/fesm2022/seniorsistemas-angular-components-localized-number-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-mask.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-mouse-events.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-mouse-events.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-number-input.mjs +2 -9
- package/fesm2022/seniorsistemas-angular-components-number-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +14 -184
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-numeric.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs +0 -11
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-panel.mjs +0 -10
- package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-password-strength.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-password-strength.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-picklist.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-picklist.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-progressbar.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-progressbar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -15
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs +2 -10
- package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slider.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-stats-card.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-stats-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-structure.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-structure.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-switch.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table-header.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-table-header.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs +0 -8
- package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-template.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-template.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tile.mjs +0 -10
- package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-timeline.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-timeline.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-toast.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-toast.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-topbar.mjs +0 -10
- package/fesm2022/seniorsistemas-angular-components-topbar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tree.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +0 -7
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
- package/fieldset/README.md +2 -2
- package/fieldset/lib/fieldset/fieldset.module.d.ts +0 -7
- package/file-picker/README.md +2 -2
- package/file-picker/lib/file-picker/file-picker.module.d.ts +0 -7
- package/file-upload/README.md +1 -1
- package/gantt/README.md +2 -2
- package/gantt/lib/gantt/gantt.module.d.ts +0 -7
- package/global-search/README.md +2 -5
- package/global-search/lib/global-search/global-search.module.d.ts +0 -18
- package/grid-menu/README.md +4 -5
- package/grid-menu/lib/grid-menu/grid-menu.module.d.ts +0 -7
- package/help-popover/README.md +4 -5
- package/help-popover/lib/help-popover/help-popover.module.d.ts +0 -7
- package/ia-insight/README.md +1 -1
- package/image-cropper/README.md +5 -6
- package/image-cropper/lib/image-cropper/image-cropper.module.d.ts +0 -11
- package/infinite-scroll/README.md +4 -5
- package/infinite-scroll/lib/infinite-scroll/infinite-scroll.module.d.ts +0 -7
- package/info-sign/README.md +4 -5
- package/info-sign/lib/info-sign/info-sign.module.d.ts +0 -7
- package/inline-edit/README.md +4 -5
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +0 -7
- package/input-group/lib/input-group/input-group.module.d.ts +0 -7
- package/input-mask/lib/input-mask/input-mask.module.d.ts +0 -7
- package/input-text/lib/input-text/input-text.module.d.ts +0 -7
- package/insights/README.md +4 -6
- package/insights/lib/insights/insights.module.d.ts +0 -10
- package/kanban/README.md +4 -6
- package/kanban/lib/kanban/kanban.module.d.ts +0 -10
- package/label-value/README.md +4 -5
- package/label-value/lib/label-value/label-value.module.d.ts +0 -7
- package/loading-state/README.md +5 -9
- package/loading-state/lib/loading-state/loading-state.module.d.ts +0 -7
- package/locale/lib/locale/locale.module.d.ts +0 -13
- package/locale/lib/locale/pipes/localized-bignumber-impure.pipe.d.ts +2 -2
- package/locale/lib/locale/pipes/localized-bignumber.pipe.d.ts +1 -20
- package/locale/public-api.d.ts +0 -1
- package/localized-number-input/README.md +8 -32
- package/localized-number-input/lib/localized-number-input/localized-number-input.directive.d.ts +0 -4
- package/localized-number-input/lib/localized-number-input/localized-number-input.module.d.ts +0 -7
- package/mask/lib/mask/mask-formatter.module.d.ts +0 -7
- package/mouse-events/README.md +4 -5
- package/mouse-events/lib/mouse-events/mouse-events.module.d.ts +0 -7
- package/navigation-button/README.md +4 -5
- package/navigation-button/lib/navigation-button/navigation-button.module.d.ts +0 -7
- package/number-input/lib/number-input/number-input.directive.d.ts +1 -1
- package/number-input/lib/number-input/number-input.module.d.ts +1 -8
- package/numeric/README.md +5 -6
- package/numeric/lib/numeric.module.d.ts +0 -7
- package/numeric-mask/README.md +1 -44
- package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +4 -65
- package/numeric-mask/lib/numeric-mask/numeric-mask.module.d.ts +0 -7
- package/object-card/README.md +4 -11
- package/object-card/lib/object-card/object-card.module.d.ts +0 -11
- package/package.json +1 -1
- package/panel/README.md +4 -8
- package/panel/lib/panel/panel.module.d.ts +0 -10
- package/password-strength/README.md +3 -6
- package/password-strength/lib/password-strength/password-strength.module.d.ts +0 -7
- package/picklist/README.md +5 -8
- package/picklist/lib/picklist/picklist.module.d.ts +0 -7
- package/pin-code-field/lib/pin-code-field.module.d.ts +0 -7
- package/product-header/README.md +2 -2
- package/profile-picture-picker/README.md +3 -6
- package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.d.ts +0 -7
- package/progressbar/README.md +3 -6
- package/progressbar/lib/progressbar/progressbar.module.d.ts +0 -7
- package/rating-scale/README.md +3 -6
- package/rating-scale/lib/rating-scale/rating-scale.module.d.ts +0 -7
- package/schematics/collection.json +0 -40
- package/schematics/migrations.json +1 -5
- package/schematics/utils/ast-utils.js +0 -16
- package/schematics/utils/ast-utils.js.map +1 -1
- package/select/lib/select/select.component.d.ts +0 -8
- package/select-button/README.md +3 -6
- package/select-button/lib/select-button/select-button.module.d.ts +0 -7
- package/shared/lib/shared/border-button/border-button.module.d.ts +0 -7
- package/sidebar/README.md +2 -2
- package/slide-in-bar/README.md +5 -5
- package/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.d.ts +0 -7
- package/slider/README.md +3 -6
- package/slider/lib/slider/slider.module.d.ts +0 -7
- package/speech-recognition/README.md +3 -6
- package/speech-recognition/lib/speech-recognition/speech-recognition.module.d.ts +0 -7
- package/split-button/README.md +3 -6
- package/split-button/lib/split-button/split-button.module.d.ts +0 -7
- package/stats-card/README.md +3 -6
- package/stats-card/lib/stats-card/stats-card.module.d.ts +0 -7
- package/stepper/README.md +3 -6
- package/stepper/lib/stepper/stepper.module.d.ts +0 -7
- package/structure/lib/structure/structure.module.d.ts +0 -7
- package/switch/README.md +3 -6
- package/switch/lib/switch/switch.module.d.ts +0 -7
- package/table/README.md +4 -12
- package/table/lib/table/table.module.d.ts +0 -8
- package/table-header/lib/table-header/table-header-checkox.module.d.ts +0 -7
- package/template/README.md +11 -0
- package/template/lib/template/template.module.d.ts +0 -7
- package/text-area/lib/text-area.module.d.ts +0 -7
- package/text-area-ia/README.md +1 -1
- package/thumbnail/lib/thumbnail/thumbnail.module.d.ts +0 -7
- package/thumbnails/lib/thumbnails/thumbnails.module.d.ts +0 -7
- package/tiered-menu/lib/tiered-menu/tiered-menu.module.d.ts +0 -7
- package/tile/lib/tile/tile.module.d.ts +0 -10
- package/timeline/lib/timeline/timeline.module.d.ts +0 -7
- package/toast/lib/toast/toast.module.d.ts +0 -7
- package/token-list/lib/token-list/token-list.module.d.ts +0 -7
- package/tooltip/lib/tooltip/tooltip.module.d.ts +0 -7
- package/topbar/lib/topbar/topbar.module.d.ts +0 -10
- package/tree/lib/tree/tree.module.d.ts +0 -7
- package/workspace-switch/lib/workspace-switch/workspace-switch.module.d.ts +0 -7
- package/common/lib/provide-angular-components.d.ts +0 -19
- package/custom-fields/lib/custom-fields/models/custom-field-value-parser.d.ts +0 -21
- package/esm2022/common/lib/provide-angular-components.mjs +0 -22
- package/esm2022/custom-fields/lib/custom-fields/models/custom-field-value-parser.mjs +0 -46
- package/esm2022/locale/lib/locale/provide-locale.mjs +0 -42
- package/locale/lib/locale/provide-locale.d.ts +0 -18
- package/schematics/migrations/migrate-app-to-standalone/index.d.ts +0 -32
- package/schematics/migrations/migrate-app-to-standalone/index.js +0 -98
- package/schematics/migrations/migrate-app-to-standalone/index.js.map +0 -1
- package/schematics/migrations/migrate-deprecated-apis/index.d.ts +0 -49
- package/schematics/migrations/migrate-deprecated-apis/index.js +0 -660
- package/schematics/migrations/migrate-deprecated-apis/index.js.map +0 -1
- package/schematics/migrations/migrate-deprecated-datepicker/index.d.ts +0 -31
- package/schematics/migrations/migrate-deprecated-datepicker/index.js +0 -115
- package/schematics/migrations/migrate-deprecated-datepicker/index.js.map +0 -1
- package/schematics/migrations/migrate-deprecated-dynamic-form/index.d.ts +0 -52
- package/schematics/migrations/migrate-deprecated-dynamic-form/index.js +0 -661
- package/schematics/migrations/migrate-deprecated-dynamic-form/index.js.map +0 -1
- package/schematics/migrations/migrate-deprecated-imports/index.d.ts +0 -23
- package/schematics/migrations/migrate-deprecated-imports/index.js +0 -335
- package/schematics/migrations/migrate-deprecated-imports/index.js.map +0 -1
- package/schematics/migrations/migrate-deprecated-selectors/index.d.ts +0 -15
- package/schematics/migrations/migrate-deprecated-selectors/index.js +0 -76
- package/schematics/migrations/migrate-deprecated-selectors/index.js.map +0 -1
- package/schematics/migrations/migrate-modules-to-standalone/index.d.ts +0 -51
- package/schematics/migrations/migrate-modules-to-standalone/index.js +0 -632
- package/schematics/migrations/migrate-modules-to-standalone/index.js.map +0 -1
- package/schematics/migrations/migrate-modules-to-standalone/modules-map.json +0 -1656
- package/schematics/migrations/migrate-v20/index.d.ts +0 -9
- package/schematics/migrations/migrate-v20/index.js +0 -90
- package/schematics/migrations/migrate-v20/index.js.map +0 -1
- package/schematics/migrations/migrate-v20/items.d.ts +0 -7
- package/schematics/migrations/migrate-v20/items.js +0 -54
- package/schematics/migrations/migrate-v20/items.js.map +0 -1
- package/schematics/migrations/migrate-v20/plan.d.ts +0 -32
- package/schematics/migrations/migrate-v20/plan.js +0 -29
- package/schematics/migrations/migrate-v20/plan.js.map +0 -1
- package/schematics/schema/app-standalone.schema.json +0 -21
- package/schematics/schema/migrate-v20.schema.json +0 -33
- package/schematics/schema/scope.schema.json +0 -17
- package/schematics/utils/eol.d.ts +0 -5
- package/schematics/utils/eol.js +0 -17
- package/schematics/utils/eol.js.map +0 -1
- package/schematics/utils/prompt-utils.d.ts +0 -62
- package/schematics/utils/prompt-utils.js +0 -166
- package/schematics/utils/prompt-utils.js.map +0 -1
- package/schematics/utils/report.d.ts +0 -27
- package/schematics/utils/report.js +0 -70
- package/schematics/utils/report.js.map +0 -1
- package/schematics/utils/scope.d.ts +0 -17
- package/schematics/utils/scope.js +0 -55
- package/schematics/utils/scope.js.map +0 -1
- package/schematics/utils/selection.d.ts +0 -21
- package/schematics/utils/selection.js +0 -60
- package/schematics/utils/selection.js.map +0 -1
- package/schematics/utils/symbol-utils.d.ts +0 -31
- package/schematics/utils/symbol-utils.js +0 -202
- package/schematics/utils/symbol-utils.js.map +0 -1
- package/schematics/utils/template-utils.d.ts +0 -62
- package/schematics/utils/template-utils.js +0 -165
- package/schematics/utils/template-utils.js.map +0 -1
- package/schematics/utils/tsconfig-paths.d.ts +0 -5
- package/schematics/utils/tsconfig-paths.js +0 -73
- package/schematics/utils/tsconfig-paths.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Directive, DestroyRef, ElementRef, forwardRef, inject, input, model,
|
|
1
|
+
import { Directive, DestroyRef, ElementRef, forwardRef, inject, input, model, Renderer2, } from '@angular/core';
|
|
2
2
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
4
4
|
import { LocaleService } from '@seniorsistemas/angular-components/locale';
|
|
@@ -75,25 +75,6 @@ export class NumericMaskDirective {
|
|
|
75
75
|
* @default 'preserve'
|
|
76
76
|
*/
|
|
77
77
|
decimalRoundingMode = input('preserve');
|
|
78
|
-
/**
|
|
79
|
-
* Maximum number of significant digits accepted by the field (integer + decimal part).
|
|
80
|
-
* Opt-in: when left `undefined` (default), there is no total-digit limit, no native `maxLength`
|
|
81
|
-
* is applied, pasted values are never rejected, and `placeholder` is never auto-calculated —
|
|
82
|
-
* i.e. the directive behaves exactly as before this input existed.
|
|
83
|
-
*/
|
|
84
|
-
precision = input(undefined);
|
|
85
|
-
/**
|
|
86
|
-
* Placeholder text shown when the field is empty. When `precision` is set and this is left
|
|
87
|
-
* unset, it is auto-calculated from `minDecimalPlaces` (e.g. `0,00`); has no effect otherwise.
|
|
88
|
-
*/
|
|
89
|
-
placeholder = model(undefined);
|
|
90
|
-
/**
|
|
91
|
-
* Emitted when a pasted value is rejected for exceeding `precision`. Only fires when
|
|
92
|
-
* `precision` is set; emits the rejected pasted text.
|
|
93
|
-
*/
|
|
94
|
-
pasteRejected = output();
|
|
95
|
-
/** Native `maxLength` attribute, auto-calculated from `precision` when it is set. */
|
|
96
|
-
maxLength;
|
|
97
78
|
elementRef = inject((ElementRef));
|
|
98
79
|
renderer = inject(Renderer2);
|
|
99
80
|
localeService = inject(LocaleService, { optional: true });
|
|
@@ -104,46 +85,17 @@ export class NumericMaskDirective {
|
|
|
104
85
|
thousandSeparator = model('.');
|
|
105
86
|
currentLocale = 'pt-BR';
|
|
106
87
|
lastModelValue = null;
|
|
107
|
-
/** `protected`: subclasses with their own deprecated separator aliases (e.g. `BignumberInputDirective`) set this directly. */
|
|
108
|
-
_decimalSeparatorExplicit = false;
|
|
109
|
-
/** `protected`: see `_decimalSeparatorExplicit`. */
|
|
110
|
-
_thousandSeparatorExplicit = false;
|
|
111
|
-
_lastAutoPlaceholder;
|
|
112
88
|
ngOnChanges(changes) {
|
|
113
89
|
if (changes['locale'] && !changes['locale'].firstChange && this.locale()) {
|
|
114
90
|
this.currentLocale = this.locale();
|
|
115
91
|
this.updateSeparators();
|
|
116
92
|
this.setInputMode();
|
|
117
93
|
}
|
|
118
|
-
// Preserves an explicitly bound separator across later locale-driven recalculations
|
|
119
|
-
// (see `updateSeparators`): `changes['X']` is only present when the parent template
|
|
120
|
-
// actually binds that input (Angular never reports unbound inputs here, not even on
|
|
121
|
-
// the first change), so consumers who never touch these two keep today's locale-derived
|
|
122
|
-
// behavior. Checked by key presence alone — NOT the current value's truthiness, which
|
|
123
|
-
// would wrongly treat an intentional `[thousandSeparator]="''"` (no grouping) as "not
|
|
124
|
-
// explicit" and let a later locale change silently restore grouping.
|
|
125
|
-
if (changes['decimalSeparator']) {
|
|
126
|
-
this._decimalSeparatorExplicit = true;
|
|
127
|
-
}
|
|
128
|
-
if (changes['thousandSeparator']) {
|
|
129
|
-
this._thousandSeparatorExplicit = true;
|
|
130
|
-
}
|
|
131
|
-
if (changes['precision'] ||
|
|
132
|
-
changes['minDecimalPlaces'] ||
|
|
133
|
-
changes['maxDecimalPlaces'] ||
|
|
134
|
-
changes['decimalSeparator'] ||
|
|
135
|
-
changes['thousandSeparator']) {
|
|
136
|
-
this.calculateMaxLength();
|
|
137
|
-
}
|
|
138
|
-
if (changes['precision'] || changes['minDecimalPlaces'] || changes['decimalSeparator']) {
|
|
139
|
-
this.updatePlaceholder();
|
|
140
|
-
}
|
|
141
94
|
}
|
|
142
95
|
ngOnInit() {
|
|
143
96
|
if (this.minDecimalPlaces() > this.maxDecimalPlaces()) {
|
|
144
97
|
throw new Error(`NumericMaskDirective: minDecimalPlaces (${this.minDecimalPlaces()}) cannot be greater than maxDecimalPlaces (${this.maxDecimalPlaces()})`);
|
|
145
98
|
}
|
|
146
|
-
this.updatePlaceholder();
|
|
147
99
|
if (this.locale()) {
|
|
148
100
|
this.currentLocale = this.locale();
|
|
149
101
|
this.updateSeparators();
|
|
@@ -224,35 +176,14 @@ export class NumericMaskDirective {
|
|
|
224
176
|
this.onChange(modelValue);
|
|
225
177
|
}
|
|
226
178
|
/**
|
|
227
|
-
* Listener for paste events (clipboard)
|
|
228
|
-
* exceed it, the paste is rejected outright (nothing is written) and `pasteRejected` fires.
|
|
179
|
+
* Listener for paste events (clipboard)
|
|
229
180
|
*/
|
|
230
181
|
onPaste(event) {
|
|
231
|
-
const pastedText = event.clipboardData?.getData('text') || '';
|
|
232
|
-
const precision = this.precision();
|
|
233
|
-
if (precision !== undefined && this.exceedsPrecision(pastedText, precision)) {
|
|
234
|
-
event.preventDefault();
|
|
235
|
-
this.pasteRejected.emit(pastedText);
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
182
|
event.preventDefault();
|
|
183
|
+
const pastedText = event.clipboardData?.getData('text') || '';
|
|
239
184
|
let value = this.parseClipboardValue(pastedText);
|
|
240
185
|
this.processInputValue(value);
|
|
241
186
|
}
|
|
242
|
-
/**
|
|
243
|
-
* Whether a raw pasted string, once stripped of separators, has more significant digits
|
|
244
|
-
* than `precision` allows.
|
|
245
|
-
* @private
|
|
246
|
-
*/
|
|
247
|
-
exceedsPrecision(text, precision) {
|
|
248
|
-
const thousandSep = this.thousandSeparator();
|
|
249
|
-
const numericText = text
|
|
250
|
-
.replace(new RegExp(this.escapeRegex(thousandSep), 'g'), '')
|
|
251
|
-
.replace(this.decimalSeparator(), '.');
|
|
252
|
-
const [intPart, decimalPart = ''] = numericText.split('.');
|
|
253
|
-
const totalDigits = intPart.replace(/\D/g, '').length + decimalPart.slice(0, this.maxDecimalPlaces()).length;
|
|
254
|
-
return totalDigits > precision;
|
|
255
|
-
}
|
|
256
187
|
/**
|
|
257
188
|
* Listener for special keys (+ and -)
|
|
258
189
|
*/
|
|
@@ -324,59 +255,12 @@ export class NumericMaskDirective {
|
|
|
324
255
|
}
|
|
325
256
|
}
|
|
326
257
|
/**
|
|
327
|
-
* Updates separators according to the locale
|
|
328
|
-
* `thousandSeparator` (tracked in `ngOnChanges`) is restored afterwards, so a locale
|
|
329
|
-
* change never silently overrides a value the consumer set on purpose.
|
|
258
|
+
* Updates separators according to the locale
|
|
330
259
|
*/
|
|
331
260
|
updateSeparators() {
|
|
332
|
-
const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;
|
|
333
|
-
const explicitThousand = this._thousandSeparatorExplicit ? this.thousandSeparator() : undefined;
|
|
334
261
|
const formatted = new Intl.NumberFormat(this.currentLocale).format(1234.5);
|
|
335
262
|
this.thousandSeparator.set(formatted[1]);
|
|
336
263
|
this.decimalSeparator.set(formatted[5]);
|
|
337
|
-
if (explicitDecimal !== undefined) {
|
|
338
|
-
this.decimalSeparator.set(explicitDecimal);
|
|
339
|
-
}
|
|
340
|
-
if (explicitThousand !== undefined) {
|
|
341
|
-
this.thousandSeparator.set(explicitThousand);
|
|
342
|
-
}
|
|
343
|
-
this.calculateMaxLength();
|
|
344
|
-
this.updatePlaceholder();
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Auto-calculates the native `maxLength` from `precision`, sized for the current separators
|
|
348
|
-
* and `maxDecimalPlaces`. No-op (leaves `maxLength` unset) while `precision` is `undefined`.
|
|
349
|
-
* `protected`: subclasses that map their own deprecated inputs into `minDecimalPlaces`/
|
|
350
|
-
* `maxDecimalPlaces`/`thousandSeparator` outside of a tracked `changes` key call this directly.
|
|
351
|
-
*/
|
|
352
|
-
calculateMaxLength() {
|
|
353
|
-
const precision = this.precision();
|
|
354
|
-
if (precision === undefined) {
|
|
355
|
-
this.maxLength = undefined;
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
const scale = this.maxDecimalPlaces();
|
|
359
|
-
const decSepLength = this.decimalSeparator()?.length ?? 0;
|
|
360
|
-
const thoSepLength = this.thousandSeparator()?.length ?? 0;
|
|
361
|
-
const DIGITS_GROUP_SIZE = 3;
|
|
362
|
-
let maxLength = precision + (scale ? decSepLength : 0);
|
|
363
|
-
maxLength += Math.ceil((precision - scale) / DIGITS_GROUP_SIZE - 1) * thoSepLength;
|
|
364
|
-
this.maxLength = maxLength;
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Auto-calculates `placeholder` (e.g. `0,00`) from `minDecimalPlaces`, without overwriting
|
|
368
|
-
* a value the consumer set explicitly. No-op while `precision` is `undefined`.
|
|
369
|
-
* `protected`: see `calculateMaxLength`.
|
|
370
|
-
*/
|
|
371
|
-
updatePlaceholder() {
|
|
372
|
-
if (this.precision() === undefined)
|
|
373
|
-
return;
|
|
374
|
-
const scale = this.minDecimalPlaces();
|
|
375
|
-
const autoPlaceholder = scale ? `0${this.decimalSeparator()}${''.padEnd(scale, '0')}` : '0';
|
|
376
|
-
if (this.placeholder() === undefined || this.placeholder() === this._lastAutoPlaceholder) {
|
|
377
|
-
this.placeholder.set(autoPlaceholder);
|
|
378
|
-
}
|
|
379
|
-
this._lastAutoPlaceholder = autoPlaceholder;
|
|
380
264
|
}
|
|
381
265
|
/**
|
|
382
266
|
* Processes input value and updates the input and model
|
|
@@ -501,18 +385,10 @@ export class NumericMaskDirective {
|
|
|
501
385
|
*/
|
|
502
386
|
parseStringToValue(value) {
|
|
503
387
|
const isNegative = value.startsWith('-');
|
|
504
|
-
let numericStr = value
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
const thousandSep = this.thousandSeparator();
|
|
509
|
-
if (thousandSep) {
|
|
510
|
-
numericStr = numericStr.replace(new RegExp(this.escapeRegex(thousandSep), 'g'), '');
|
|
511
|
-
}
|
|
512
|
-
const decimalSep = this.decimalSeparator();
|
|
513
|
-
if (decimalSep) {
|
|
514
|
-
numericStr = numericStr.replace(new RegExp(this.escapeRegex(decimalSep), 'g'), '.');
|
|
515
|
-
}
|
|
388
|
+
let numericStr = value
|
|
389
|
+
.replace(/^-/, '')
|
|
390
|
+
.replace(new RegExp(`\\${this.thousandSeparator()}`, 'g'), '')
|
|
391
|
+
.replace(new RegExp(`\\${this.decimalSeparator()}`, 'g'), '.');
|
|
516
392
|
if (numericStr === '.' || numericStr === '') {
|
|
517
393
|
numericStr = '0';
|
|
518
394
|
}
|
|
@@ -528,28 +404,6 @@ export class NumericMaskDirective {
|
|
|
528
404
|
}
|
|
529
405
|
return { bigNumber, numeric: bigNumber.toNumber(), isNegative };
|
|
530
406
|
}
|
|
531
|
-
/**
|
|
532
|
-
* Groups an integer digit string (optionally signed) using `thousandSeparator`.
|
|
533
|
-
*
|
|
534
|
-
* Previously this used `Intl.NumberFormat(currentLocale)` and then tried to strip the
|
|
535
|
-
* locale's own grouping via `.split(decimalSeparator())`, which (a) ignored a custom
|
|
536
|
-
* `thousandSeparator` entirely — always falling back to the locale's own grouping
|
|
537
|
-
* character instead, e.g. `thousandSeparator=""` had no effect — and (b) corrupted the
|
|
538
|
-
* result whenever the locale's grouping character happened to equal `decimalSeparator`
|
|
539
|
-
* (e.g. a custom `decimalSeparator="."` under `pt-BR`, which groups thousands with `.`
|
|
540
|
-
* too): `"1.234".split('.')[0]` returned `"1"` instead of `"1234"`. Grouping the digits
|
|
541
|
-
* directly with the directive's own (already locale/explicit-resolved) `thousandSeparator`
|
|
542
|
-
* avoids the detour through `Intl.NumberFormat` and both bugs.
|
|
543
|
-
* @private
|
|
544
|
-
*/
|
|
545
|
-
groupIntegerDigits(integerPart) {
|
|
546
|
-
const numericValue = parseInt(integerPart, 10) || 0;
|
|
547
|
-
const isNegative = numericValue < 0;
|
|
548
|
-
const digits = Math.abs(numericValue).toString();
|
|
549
|
-
const sep = this.thousandSeparator();
|
|
550
|
-
const grouped = sep ? digits.replace(/\B(?=(\d{3})+(?!\d))/g, sep) : digits;
|
|
551
|
-
return isNegative ? `-${grouped}` : grouped;
|
|
552
|
-
}
|
|
553
407
|
/**
|
|
554
408
|
* Formats a numeric value according to the locale
|
|
555
409
|
* Truncates (never rounds) to maxDecimalPlaces and pads with zeros to minDecimalPlaces
|
|
@@ -563,7 +417,9 @@ export class NumericMaskDirective {
|
|
|
563
417
|
const parts = formattedValue.split(this.decimalSeparator());
|
|
564
418
|
const integerPart = parts[0];
|
|
565
419
|
let decimalPart = parts[1] || '';
|
|
566
|
-
const formattedInteger = this.
|
|
420
|
+
const formattedInteger = new Intl.NumberFormat(this.currentLocale)
|
|
421
|
+
.format(parseInt(integerPart, 10) || 0)
|
|
422
|
+
.split(this.decimalSeparator())[0];
|
|
567
423
|
const effectiveDecimalPlaces = decimalPart.replace(/0+$/, '').length;
|
|
568
424
|
const decimalPlacesToShow = Math.max(this.minDecimalPlaces(), Math.min(effectiveDecimalPlaces, this.maxDecimalPlaces()));
|
|
569
425
|
decimalPart = decimalPart.substring(0, decimalPlacesToShow).padEnd(decimalPlacesToShow, '0');
|
|
@@ -661,13 +517,10 @@ export class NumericMaskDirective {
|
|
|
661
517
|
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);
|
|
662
518
|
}
|
|
663
519
|
validate(control) {
|
|
664
|
-
const
|
|
665
|
-
if (!
|
|
520
|
+
const value = control.value;
|
|
521
|
+
if (!value) {
|
|
666
522
|
return null;
|
|
667
523
|
}
|
|
668
|
-
// The model may be set programmatically as a `number` (e.g. `patchValue` with a backend DTO),
|
|
669
|
-
// even though the value this directive emits is always a decimal `string`.
|
|
670
|
-
const value = String(controlValue);
|
|
671
524
|
const numericValue = parseFloat(value);
|
|
672
525
|
if (isNaN(numericValue)) {
|
|
673
526
|
return null;
|
|
@@ -702,24 +555,10 @@ export class NumericMaskDirective {
|
|
|
702
555
|
},
|
|
703
556
|
};
|
|
704
557
|
}
|
|
705
|
-
const precision = this.precision();
|
|
706
|
-
if (precision !== undefined) {
|
|
707
|
-
const numericStr = String(value).replace('-', '');
|
|
708
|
-
const [intPart, decPart = ''] = numericStr.split('.');
|
|
709
|
-
const totalDigits = intPart.length + decPart.length;
|
|
710
|
-
if (totalDigits > precision) {
|
|
711
|
-
return {
|
|
712
|
-
exceedsPrecision: {
|
|
713
|
-
precision,
|
|
714
|
-
actual: totalDigits,
|
|
715
|
-
},
|
|
716
|
-
};
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
558
|
return null;
|
|
720
559
|
}
|
|
721
560
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NumericMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
722
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: NumericMaskDirective, isStandalone: true, selector: "[sNumericMask]", inputs: { locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, allowScientificNotation: { classPropertyName: "allowScientificNotation", publicName: "allowScientificNotation", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, blockDecimalOverflow: { classPropertyName: "blockDecimalOverflow", publicName: "blockDecimalOverflow", isSignal: true, isRequired: false, transformFunction: null }, decimalRoundingMode: { classPropertyName: "decimalRoundingMode", publicName: "decimalRoundingMode", isSignal: true, isRequired: false, transformFunction: null },
|
|
561
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: NumericMaskDirective, isStandalone: true, selector: "[sNumericMask]", inputs: { locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, allowScientificNotation: { classPropertyName: "allowScientificNotation", publicName: "allowScientificNotation", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, blockDecimalOverflow: { classPropertyName: "blockDecimalOverflow", publicName: "blockDecimalOverflow", isSignal: true, isRequired: false, transformFunction: null }, decimalRoundingMode: { classPropertyName: "decimalRoundingMode", publicName: "decimalRoundingMode", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange" }, host: { listeners: { "input": "onInput($event)", "focus": "onFocus()", "blur": "onBlur()", "paste": "onPaste($event)", "keydown": "onKeyDown($event)", "keypress": "onKeyPress($event)" }, properties: { "style.text-align": "\"right\"" } }, providers: [
|
|
723
562
|
{
|
|
724
563
|
provide: NG_VALUE_ACCESSOR,
|
|
725
564
|
useExisting: forwardRef(() => NumericMaskDirective),
|
|
@@ -745,8 +584,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
745
584
|
'(keydown)': 'onKeyDown($event)',
|
|
746
585
|
'(keypress)': 'onKeyPress($event)',
|
|
747
586
|
'[style.text-align]': '"right"',
|
|
748
|
-
'[attr.maxLength]': 'maxLength',
|
|
749
|
-
'[attr.placeholder]': 'placeholder()',
|
|
750
587
|
},
|
|
751
588
|
providers: [
|
|
752
589
|
{
|
|
@@ -762,4 +599,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
762
599
|
],
|
|
763
600
|
}]
|
|
764
601
|
}] });
|
|
765
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUdILGFBQWEsRUFDYixpQkFBaUIsR0FHcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxTQUFTLE1BQU0sY0FBYyxDQUFDOztBQUVyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUE0QkgsTUFBTSxPQUFPLG9CQUFvQjtJQUM3Qjs7O09BR0c7SUFDSSxNQUFNLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVyRDs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkM7OztPQUdHO0lBQ0ksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBDOzs7T0FHRztJQUNJLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTdDOztPQUVHO0lBQ0ksR0FBRyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFbEQ7O09BRUc7SUFDSSxHQUFH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R0F0ekJRLG9CQUFvQjs0RkFBcEIsb0JBQW9CLDYzRUFibEI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRCxLQUFLLEVBQUUsSUFBSTthQUNkO1lBQ0Q7Z0JBQ0ksT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSjs7NEZBRVEsb0JBQW9CO2tCQTNCaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNGLFNBQVMsRUFBRSxpQkFBaUI7d0JBQzVCLFNBQVMsRUFBRSxXQUFXO3dCQUN0QixRQUFRLEVBQUUsVUFBVTt3QkFDcEIsU0FBUyxFQUFFLGlCQUFpQjt3QkFDNUIsV0FBVyxFQUFFLG1CQUFtQjt3QkFDaEMsWUFBWSxFQUFFLG9CQUFvQjt3QkFDbEMsb0JBQW9CLEVBQUUsU0FBUzt3QkFDL0Isa0JBQWtCLEVBQUUsV0FBVzt3QkFDL0Isb0JBQW9CLEVBQUUsZUFBZTtxQkFDeEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG1vZGVsLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9jYWxlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlyZXRpdmEgZGUgbcOhc2NhcmEgbnVtw6lyaWNhIGNvbSBzdXBvcnRlIGEgaW50ZXJuYWNpb25hbGl6YcOnw6NvLlxuICpcbiAqIEZvcm1hdGEgdmFsb3JlcyBudW3DqXJpY29zIGRlIGFjb3JkbyBjb20gbyBsb2NhbGUgZXNwZWNpZmljYWRvLCBhcGxpY2FuZG9cbiAqIHNlcGFyYWRvcmVzIGRlIG1pbGhhciBlIGRlY2ltYWwgYWRlcXVhZG9zLCBjb20gc3Vwb3J0ZSBhIHZhbG9yZXMgbmVnYXRpdm9zLFxuICogY29udHJvbGUgZGUgY2FzYXMgZGVjaW1haXMgbcOtbi9tw6F4IGUgbm90YcOnw6NvIGNpZW50w61maWNhLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aW5wdXRcbiAqICAgdHlwZT1cInRleHRcIlxuICogICBzTnVtZXJpY01hc2tcbiAqICAgW2xvY2FsZV09XCIncHQtQlInXCJcbiAqICAgW21pbkRlY2ltYWxQbGFjZXNdPVwiMlwiXG4gKiAgIFttYXhEZWNpbWFsUGxhY2VzXT1cIjJcIlxuICogICBbYWxsb3dOZWdhdGl2ZV09XCJ0cnVlXCJcbiAqICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gKiAvPlxuICogYGBgXG4gKiBAY2F0ZWdvcnkgTnVtZXJpY1xuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tzTnVtZXJpY01hc2tdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhpbnB1dCknOiAnb25JbnB1dCgkZXZlbnQpJyxcbiAgICAgICAgJyhmb2N1cyknOiAnb25Gb2N1cygpJyxcbiAgICAgICAgJyhibHVyKSc6ICdvbkJsdXIoKScsXG4gICAgICAgICcocGFzdGUpJzogJ29uUGFzdGUoJGV2ZW50KScsXG4gICAgICAgICcoa2V5ZG93biknOiAnb25LZXlEb3duKCRldmVudCknLFxuICAgICAgICAnKGtleXByZXNzKSc6ICdvbktleVByZXNzKCRldmVudCknLFxuICAgICAgICAnW3N0eWxlLnRleHQtYWxpZ25dJzogJ1wicmlnaHRcIicsXG4gICAgICAgICdbYXR0ci5tYXhMZW5ndGhdJzogJ21heExlbmd0aCcsXG4gICAgICAgICdbYXR0ci5wbGFjZWhvbGRlcl0nOiAncGxhY2Vob2xkZXIoKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljTWFza0RpcmVjdGl2ZSksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWVyaWNNYXNrRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICAgIC8qKlxuICAgICAqIExvY2FsZSBmb3IgZm9ybWF0dGluZyAoZS5nLiAncHQtQlInLCAnZW4tVVMnLCAnZGUtREUnKVxuICAgICAqIElmIG5vdCBwcm92aWRlZCwgdXNlcyB0aGUgbG9jYWxlIGZyb20gTG9jYWxlU2VydmljZVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NhbGUgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byBkaXNwbGF5XG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICAgIHB1YmxpYyBtaW5EZWNpbWFsUGxhY2VzID0gaW5wdXQoMCk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBhbGxvd2VkXG4gICAgICogQGRlZmF1bHQgMTBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWF4RGVjaW1hbFBsYWNlcyA9IGlucHV0KDEwKTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBuZWdhdGl2ZSB2YWx1ZXNcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxvd05lZ2F0aXZlID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBzY2llbnRpZmljIG5vdGF0aW9uIHN1cHBvcnRcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcHVibGljIGFsbG93U2NpZW50aWZpY05vdGF0aW9uID0gaW5wdXQodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIHZhbHVlIGFsbG93ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgbWluID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSB2YWx1ZSBhbGxvd2VkXG4gICAgICovXG4gICAgcHVibGljIG1heCA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIEJsb2NrcyB0eXBpbmcvcGFzdGluZyBkZWNpbWFsIGRpZ2l0cyBiZXlvbmQgbWF4RGVjaW1hbFBsYWNlcy5cbiAgICAgKiBXaGVuIG1heERlY2ltYWxQbGFjZXMgaXMgMCwgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIGl0c2VsZiBjYW5ub3QgYmUgZW50ZXJlZC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcHVibGljIGJsb2NrRGVjaW1hbE92ZXJmbG93ID0gaW5wdXQodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBTdHJhdGVneSBhcHBsaWVkIG9uIGJsdXIgd2hlbiBibG9ja0RlY2ltYWxPdmVyZmxvdyBpcyBmYWxzZS5cbiAgICAgKiAncHJlc2VydmUnIGtlZXBzIHRoZSBtb2RlbCBhdCBmdWxsIHByZWNpc2lvbjsgb25seSB0aGUgZGlzcGxheSBpcyB0cnVuY2F0ZWQgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAgICogJ3RydW5jYXRlJyBjdXRzIHRoZSBleGNlc3MgZGVjaW1hbHMgd2l0aG91dCByb3VuZGluZyAodG93YXJkcyB6ZXJvKSwgdXBkYXRpbmcgdGhlIG1vZGVsIHRvby5cbiAgICAgKiAncm91bmRVcCcgYWx3YXlzIHJvdW5kcyB0byB0aGUgbmV4dCByZXByZXNlbnRhYmxlIHZhbHVlIGFib3ZlIChjZWlsaW5nKSwgdXBkYXRpbmcgdGhlIG1vZGVsIHRvby5cbiAgICAgKiAncm91bmREb3duJyBhbHdheXMgcm91bmRzIHRvIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgdmFsdWUgYmVsb3cgKGZsb29yKSwgdXBkYXRpbmcgdGhlIG1vZGVsIHRvby5cbiAgICAgKiBIYXMgbm8gZWZmZWN0IHdoaWxlIGJsb2NrRGVjaW1hbE92ZXJmbG93IGlzIHRydWUuXG4gICAgICogQGRlZmF1bHQgJ3ByZXNlcnZlJ1xuICAgICAqL1xuICAgIHB1YmxpYyBkZWNpbWFsUm91bmRpbmdNb2RlID0gaW5wdXQ8J3ByZXNlcnZlJyB8ICd0cnVuY2F0ZScgfCAncm91bmRVcCcgfCAncm91bmREb3duJz4oJ3ByZXNlcnZlJyk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgYWNjZXB0ZWQgYnkgdGhlIGZpZWxkIChpbnRlZ2VyICsgZGVjaW1hbCBwYXJ0KS5cbiAgICAgKiBPcHQtaW46IHdoZW4gbGVmdCBgdW5kZWZpbmVkYCAoZGVmYXVsdCksIHRoZXJlIGlzIG5vIHRvdGFsLWRpZ2l0IGxpbWl0LCBubyBuYXRpdmUgYG1heExlbmd0aGBcbiAgICAgKiBpcyBhcHBsaWVkLCBwYXN0ZWQgdmFsdWVzIGFyZSBuZXZlciByZWplY3RlZCwgYW5kIGBwbGFjZWhvbGRlcmAgaXMgbmV2ZXIgYXV0by1jYWxjdWxhdGVkIOKAlFxuICAgICAqIGkuZS4gdGhlIGRpcmVjdGl2ZSBiZWhhdmVzIGV4YWN0bHkgYXMgYmVmb3JlIHRoaXMgaW5wdXQgZXhpc3RlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlY2lzaW9uID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogUGxhY2Vob2xkZXIgdGV4dCBzaG93biB3aGVuIHRoZSBmaWVsZCBpcyBlbXB0eS4gV2hlbiBgcHJlY2lzaW9uYCBpcyBzZXQgYW5kIHRoaXMgaXMgbGVmdFxuICAgICAqIHVuc2V0LCBpdCBpcyBhdXRvLWNhbGN1bGF0ZWQgZnJvbSBgbWluRGVjaW1hbFBsYWNlc2AgKGUuZy4gYDAsMDBgKTsgaGFzIG5vIGVmZmVjdCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gbW9kZWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcGFzdGVkIHZhbHVlIGlzIHJlamVjdGVkIGZvciBleGNlZWRpbmcgYHByZWNpc2lvbmAuIE9ubHkgZmlyZXMgd2hlblxuICAgICAqIGBwcmVjaXNpb25gIGlzIHNldDsgZW1pdHMgdGhlIHJlamVjdGVkIHBhc3RlZCB0ZXh0LlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXN0ZVJlamVjdGVkID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAgIC8qKiBOYXRpdmUgYG1heExlbmd0aGAgYXR0cmlidXRlLCBhdXRvLWNhbGN1bGF0ZWQgZnJvbSBgcHJlY2lzaW9uYCB3aGVuIGl0IGlzIHNldC4gKi9cbiAgICBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlU2VydmljZSA9IGluamVjdChMb2NhbGVTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHB1YmxpYyBkZWNpbWFsU2VwYXJhdG9yID0gbW9kZWwoJywnKTtcbiAgICBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3IgPSBtb2RlbCgnLicpO1xuICAgIHByb3RlY3RlZCBjdXJyZW50TG9jYWxlID0gJ3B0LUJSJztcbiAgICBwcml2YXRlIGxhc3RNb2RlbFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKiogYHByb3RlY3RlZGA6IHN1YmNsYXNzZXMgd2l0aCB0aGVpciBvd24gZGVwcmVjYXRlZCBzZXBhcmF0b3IgYWxpYXNlcyAoZS5nLiBgQmlnbnVtYmVySW5wdXREaXJlY3RpdmVgKSBzZXQgdGhpcyBkaXJlY3RseS4gKi9cbiAgICBwcm90ZWN0ZWQgX2RlY2ltYWxTZXBhcmF0b3JFeHBsaWNpdCA9IGZhbHNlO1xuICAgIC8qKiBgcHJvdGVjdGVkYDogc2VlIGBfZGVjaW1hbFNlcGFyYXRvckV4cGxpY2l0YC4gKi9cbiAgICBwcm90ZWN0ZWQgX3Rob3VzYW5kU2VwYXJhdG9yRXhwbGljaXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYXN0QXV0b1BsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlJ10gJiYgIWNoYW5nZXNbJ2xvY2FsZSddLmZpcnN0Q2hhbmdlICYmIHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXNlcnZlcyBhbiBleHBsaWNpdGx5IGJvdW5kIHNlcGFyYXRvciBhY3Jvc3MgbGF0ZXIgbG9jYWxlLWRyaXZlbiByZWNhbGN1bGF0aW9uc1xuICAgICAgICAvLyAoc2VlIGB1cGRhdGVTZXBhcmF0b3JzYCk6IGBjaGFuZ2VzWydYJ11gIGlzIG9ubHkgcHJlc2VudCB3aGVuIHRoZSBwYXJlbnQgdGVtcGxhdGVcbiAgICAgICAgLy8gYWN0dWFsbHkgYmluZHMgdGhhdCBpbnB1dCAoQW5ndWxhciBuZXZlciByZXBvcnRzIHVuYm91bmQgaW5wdXRzIGhlcmUsIG5vdCBldmVuIG9uXG4gICAgICAgIC8vIHRoZSBmaXJzdCBjaGFuZ2UpLCBzbyBjb25zdW1lcnMgd2hvIG5ldmVyIHRvdWNoIHRoZXNlIHR3byBrZWVwIHRvZGF5J3MgbG9jYWxlLWRlcml2ZWRcbiAgICAgICAgLy8gYmVoYXZpb3IuIENoZWNrZWQgYnkga2V5IHByZXNlbmNlIGFsb25lIOKAlCBOT1QgdGhlIGN1cnJlbnQgdmFsdWUncyB0cnV0aGluZXNzLCB3aGljaFxuICAgICAgICAvLyB3b3VsZCB3cm9uZ2x5IHRyZWF0IGFuIGludGVudGlvbmFsIGBbdGhvdXNhbmRTZXBhcmF0b3JdPVwiJydcImAgKG5vIGdyb3VwaW5nKSBhcyBcIm5vdFxuICAgICAgICAvLyBleHBsaWNpdFwiIGFuZCBsZXQgYSBsYXRlciBsb2NhbGUgY2hhbmdlIHNpbGVudGx5IHJlc3RvcmUgZ3JvdXBpbmcuXG4gICAgICAgIGlmIChjaGFuZ2VzWydkZWNpbWFsU2VwYXJhdG9yJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX2RlY2ltYWxTZXBhcmF0b3JFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3Rob3VzYW5kU2VwYXJhdG9yJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX3Rob3VzYW5kU2VwYXJhdG9yRXhwbGljaXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYW5nZXNbJ3ByZWNpc2lvbiddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydtaW5EZWNpbWFsUGxhY2VzJ10gfHxcbiAgICAgICAgICAgIGNoYW5nZXNbJ21heERlY2ltYWxQbGFjZXMnXSB8fFxuICAgICAgICAgICAgY2hhbmdlc1snZGVjaW1hbFNlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWyd0aG91c2FuZFNlcGFyYXRvciddXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVNYXhMZW5ndGgoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1sncHJlY2lzaW9uJ10gfHwgY2hhbmdlc1snbWluRGVjaW1hbFBsYWNlcyddIHx8IGNoYW5nZXNbJ2RlY2ltYWxTZXBhcmF0b3InXSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5taW5EZWNpbWFsUGxhY2VzKCkgPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBOdW1lcmljTWFza0RpcmVjdGl2ZTogbWluRGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKX0pIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4RGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1heERlY2ltYWxQbGFjZXMoKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9jYWxlU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldCgpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSB0aGlzLmxvY2FsZVNlcnZpY2UhLmdldExvY2FsZU9wdGlvbnMoKT8ubG9jYWxlIHx8ICdwdC1CUic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIGlucHV0IGV2ZW50cyAodHlwaW5nKVxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgdmFsdWUgPSB0aGlzLm5vcm1hbGl6ZVNlcGFyYXRvcnModmFsdWUpO1xuICAgICAgICB0aGlzLnByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgZm9jdXMgZXZlbnRzIChnYWluaW5nIGZvY3VzKVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdE1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMubGFzdE1vZGVsVmFsdWUucmVwbGFjZSgnLicsIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQsICd2YWx1ZScsIGRpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLnRvTW9kZWxWYWx1ZShjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgIGlmICghbW9kZWxWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gbW9kZWxWYWx1ZS5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGlucHV0LCAndmFsdWUnLCBkaXNwbGF5VmFsdWUpO1xuICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgYmx1ciBldmVudHMgKGZvY3VzIGxvc3MpXG4gICAgICovXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vZGVsVmFsdWUgPSB0aGlzLnRvTW9kZWxWYWx1ZShjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgIGlmICghbW9kZWxWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm91bmRpbmdNb2RlID0gdGhpcy5kZWNpbWFsUm91bmRpbmdNb2RlKCk7XG4gICAgICAgIGlmICghdGhpcy5ibG9ja0RlY2ltYWxPdmVyZmxvdygpICYmIHJvdW5kaW5nTW9kZSAhPT0gJ3ByZXNlcnZlJykge1xuICAgICAgICAgICAgY29uc3Qgcm91bmRlZCA9IHRoaXMudHJ1bmNhdGVUb0RlY2ltYWxQbGFjZXMoXG4gICAgICAgICAgICAgICAgbmV3IEJpZ051bWJlcihtb2RlbFZhbHVlKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVSb3VuZGluZ01vZGUocm91bmRpbmdNb2RlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtb2RlbFZhbHVlID0gcm91bmRlZC50b0ZpeGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTtcbiAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZShtb2RlbFZhbHVlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgcGFzdGUgZXZlbnRzIChjbGlwYm9hcmQpLiBXaGVuIGBwcmVjaXNpb25gIGlzIHNldCBhbmQgdGhlIHBhc3RlZCB2YWx1ZSB3b3VsZFxuICAgICAqIGV4Y2VlZCBpdCwgdGhlIHBhc3RlIGlzIHJlamVjdGVkIG91dHJpZ2h0IChub3RoaW5nIGlzIHdyaXR0ZW4pIGFuZCBgcGFzdGVSZWplY3RlZGAgZmlyZXMuXG4gICAgICovXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JykgfHwgJyc7XG4gICAgICAgIGNvbnN0IHByZWNpc2lvbiA9IHRoaXMucHJlY2lzaW9uKCk7XG5cbiAgICAgICAgaWYgKHByZWNpc2lvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZXhjZWVkc1ByZWNpc2lvbihwYXN0ZWRUZXh0LCBwcmVjaXNpb24pKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5wYXN0ZVJlamVjdGVkLmVtaXQocGFzdGVkVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucGFyc2VDbGlwYm9hcmRWYWx1ZShwYXN0ZWRUZXh0KTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGEgcmF3IHBhc3RlZCBzdHJpbmcsIG9uY2Ugc3RyaXBwZWQgb2Ygc2VwYXJhdG9ycywgaGFzIG1vcmUgc2lnbmlmaWNhbnQgZGlnaXRzXG4gICAgICogdGhhbiBgcHJlY2lzaW9uYCBhbGxvd3MuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4Y2VlZHNQcmVjaXNpb24odGV4dDogc3RyaW5nLCBwcmVjaXNpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0aG91c2FuZFNlcCA9IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKTtcbiAgICAgICAgY29uc3QgbnVtZXJpY1RleHQgPSB0ZXh0XG4gICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgodGhvdXNhbmRTZXApLCAnZycpLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpLCAnLicpO1xuICAgICAgICBjb25zdCBbaW50UGFydCwgZGVjaW1hbFBhcnQgPSAnJ10gPSBudW1lcmljVGV4dC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCB0b3RhbERpZ2l0cyA9XG4gICAgICAgICAgICBpbnRQYXJ0LnJlcGxhY2UoL1xcRC9nLCAnJykubGVuZ3RoICsgZGVjaW1hbFBhcnQuc2xpY2UoMCwgdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCkpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRvdGFsRGlnaXRzID4gcHJlY2lzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBzcGVjaWFsIGtleXMgKCsgYW5kIC0pXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJy0nIHx8IGtleSA9PT0gJysnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJy0nICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJCZWZvcmVDdXJzb3IgPSB2YWx1ZVtjdXJzb3JQb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaGFyQmVmb3JlQ3Vyc29yID09PSAnZScgfHwgY2hhckJlZm9yZUN1cnNvciA9PT0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVNpZ24odmFsdWUsIGtleSA9PT0gJy0nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBrZXlwcmVzcyB0byBibG9jayBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICBpZiAoKGtleSA9PT0gJy0nIHx8IGtleSA9PT0gJysnKSAmJiB0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJCZWZvcmVDdXJzb3IgPSB2YWx1ZVtjdXJzb3JQb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT09ICdlJyB8fCBjaGFyQmVmb3JlQ3Vyc29yID09PSAnRScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnKycgfHwga2V5ID09PSAnLScpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gL15bMC05XSQvLnRlc3Qoa2V5KTtcbiAgICAgICAgY29uc3QgaXNEZWNpbWFsU2VwYXJhdG9yID0ga2V5ID09PSAnLCcgfHwga2V5ID09PSAnLic7XG4gICAgICAgIGNvbnN0IGlzU2NpZW50aWZpY05vdGF0aW9uID0gKGtleSA9PT0gJ2UnIHx8IGtleSA9PT0gJ0UnKSAmJiB0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCk7XG4gICAgICAgIGNvbnN0IGlzQ29udHJvbEtleSA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXk7XG4gICAgICAgIGNvbnN0IGlzU3BlY2lhbEtleSA9IFtcbiAgICAgICAgICAgICdCYWNrc3BhY2UnLFxuICAgICAgICAgICAgJ1RhYicsXG4gICAgICAgICAgICAnRW50ZXInLFxuICAgICAgICAgICAgJ0VzY2FwZScsXG4gICAgICAgICAgICAnQXJyb3dMZWZ0JyxcbiAgICAgICAgICAgICdBcnJvd1JpZ2h0JyxcbiAgICAgICAgICAgICdEZWxldGUnLFxuICAgICAgICAgICAgJ0hvbWUnLFxuICAgICAgICAgICAgJ0VuZCcsXG4gICAgICAgIF0uaW5jbHVkZXMoa2V5KTtcblxuICAgICAgICBpZiAoaXNTY2llbnRpZmljTm90YXRpb24pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnZScpIHx8IHZhbHVlLmluY2x1ZGVzKCdFJykpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICBpZiAoIWNoYXJCZWZvcmVDdXJzb3IgfHwgIS9eWzAtOV0kLy50ZXN0KGNoYXJCZWZvcmVDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGlnaXQgJiYgIWlzRGVjaW1hbFNlcGFyYXRvciAmJiAhaXNTY2llbnRpZmljTm90YXRpb24gJiYgIWlzQ29udHJvbEtleSAmJiAhaXNTcGVjaWFsS2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBzZXBhcmF0b3JzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlLiBBbiBleHBsaWNpdGx5IGJvdW5kIGBkZWNpbWFsU2VwYXJhdG9yYC9cbiAgICAgKiBgdGhvdXNhbmRTZXBhcmF0b3JgICh0cmFja2VkIGluIGBuZ09uQ2hhbmdlc2ApIGlzIHJlc3RvcmVkIGFmdGVyd2FyZHMsIHNvIGEgbG9jYWxlXG4gICAgICogY2hhbmdlIG5ldmVyIHNpbGVudGx5IG92ZXJyaWRlcyBhIHZhbHVlIHRoZSBjb25zdW1lciBzZXQgb24gcHVycG9zZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlU2VwYXJhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwbGljaXREZWNpbWFsID0gdGhpcy5fZGVjaW1hbFNlcGFyYXRvckV4cGxpY2l0ID8gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0VGhvdXNhbmQgPSB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID8gdGhpcy50aG91c2FuZFNlcGFyYXRvcigpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmN1cnJlbnRMb2NhbGUpLmZvcm1hdCgxMjM0LjUpO1xuICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLnNldChmb3JtYXR0ZWRbMV0pO1xuICAgICAgICB0aGlzLmRlY2ltYWxTZXBhcmF0b3Iuc2V0KGZvcm1hdHRlZFs1XSk7XG5cbiAgICAgICAgaWYgKGV4cGxpY2l0RGVjaW1hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlY2ltYWxTZXBhcmF0b3Iuc2V0KGV4cGxpY2l0RGVjaW1hbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0VGhvdXNhbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvci5zZXQoZXhwbGljaXRUaG91c2FuZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZU1heExlbmd0aCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0by1jYWxjdWxhdGVzIHRoZSBuYXRpdmUgYG1heExlbmd0aGAgZnJvbSBgcHJlY2lzaW9uYCwgc2l6ZWQgZm9yIHRoZSBjdXJyZW50IHNlcGFyYXRvcnNcbiAgICAgKiBhbmQgYG1heERlY2ltYWxQbGFjZXNgLiBOby1vcCAobGVhdmVzIGBtYXhMZW5ndGhgIHVuc2V0KSB3aGlsZSBgcHJlY2lzaW9uYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKiBgcHJvdGVjdGVkYDogc3ViY2xhc3NlcyB0aGF0IG1hcCB0aGVpciBvd24gZGVwcmVjYXRlZCBpbnB1dHMgaW50byBgbWluRGVjaW1hbFBsYWNlc2AvXG4gICAgICogYG1heERlY2ltYWxQbGFjZXNgL2B0aG91c2FuZFNlcGFyYXRvcmAgb3V0c2lkZSBvZiBhIHRyYWNrZWQgYGNoYW5nZXNgIGtleSBjYWxsIHRoaXMgZGlyZWN0bHkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZU1heExlbmd0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJlY2lzaW9uID0gdGhpcy5wcmVjaXNpb24oKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCk7XG4gICAgICAgIGNvbnN0IGRlY1NlcExlbmd0aCA9IHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgdGhvU2VwTGVuZ3RoID0gdGhpcy50aG91c2FuZFNlcGFyYXRvcigpPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgRElHSVRTX0dST1VQX1NJWkUgPSAzO1xuXG4gICAgICAgIGxldCBtYXhMZW5ndGggPSBwcmVjaXNpb24gKyAoc2NhbGUgPyBkZWNTZXBMZW5ndGggOiAwKTtcbiAgICAgICAgbWF4TGVuZ3RoICs9IE1hdGguY2VpbCgocHJlY2lzaW9uIC0gc2NhbGUpIC8gRElHSVRTX0dST1VQX1NJWkUgLSAxKSAqIHRob1NlcExlbmd0aDtcblxuICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdXRvLWNhbGN1bGF0ZXMgYHBsYWNlaG9sZGVyYCAoZS5nLiBgMCwwMGApIGZyb20gYG1pbkRlY2ltYWxQbGFjZXNgLCB3aXRob3V0IG92ZXJ3cml0aW5nXG4gICAgICogYSB2YWx1ZSB0aGUgY29uc3VtZXIgc2V0IGV4cGxpY2l0bHkuIE5vLW9wIHdoaWxlIGBwcmVjaXNpb25gIGlzIGB1bmRlZmluZWRgLlxuICAgICAqIGBwcm90ZWN0ZWRgOiBzZWUgYGNhbGN1bGF0ZU1heExlbmd0aGAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24oKSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKTtcbiAgICAgICAgY29uc3QgYXV0b1BsYWNlaG9sZGVyID0gc2NhbGUgPyBgMCR7dGhpcy5kZWNpbWFsU2VwYXJhdG9yKCl9JHsnJy5wYWRFbmQoc2NhbGUsICcwJyl9YCA6ICcwJztcblxuICAgICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcigpID09PSB1bmRlZmluZWQgfHwgdGhpcy5wbGFjZWhvbGRlcigpID09PSB0aGlzLl9sYXN0QXV0b1BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyLnNldChhdXRvUGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdEF1dG9QbGFjZWhvbGRlciA9IGF1dG9QbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgaW5wdXQgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIGlucHV0IGFuZCBtb2RlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgfHwgIXRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ibG9ja0RlY2ltYWxPdmVyZmxvdygpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXBwbHlCbG9ja0xpbWl0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIC8vIER1cmluZyB0eXBpbmcsIGNsZWFyIHRoZSBzdG9yZWQgbW9kZWwgdmFsdWUgc28gb25Gb2N1cyB3aWxsIHJlY2FsY3VsYXRlXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UobW9kZWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpbnB1dG1vZGUgZm9yIG51bWVyaWMga2V5Ym9hcmQgb24gbW9iaWxlIGRldmljZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5wdXRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0bW9kZScsICdkZWNpbWFsJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgJ29mZicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgc2VwYXJhdG9ycyBmcm9tIGEgZm9ybWF0dGVkIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aG91c2FuZFJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4KHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSksICdnJyk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UodGhvdXNhbmRSZWdleCwgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmlwcyB1bm5lY2Vzc2FyeSB0cmFpbGluZyB6ZXJvcyBmcm9tIGRlY2ltYWwgcGFydFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdHJpcFRyYWlsaW5nWmVyb3ModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBkZWNpbWFsUGFydCA9IHBhcnRzWzFdLnJlcGxhY2UoLzArJC8sICcnKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNpbWFsUGFydC5sZW5ndGggPiAwID8gcGFydHNbMF0gKyB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSArIGRlY2ltYWxQYXJ0IDogcGFydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgc2VwYXJhdG9ycyBkdXJpbmcgdHlwaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5yZW1vdmVTZXBhcmF0b3JzKHZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgPT09ICcsJykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXC4vZywgJywnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLywvZywgJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpICsgcGFydHMuc2xpY2UoMSkuam9pbignJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgZm9yIHVzZSBpbiByZWdleFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBlc2NhcGVSZWdleChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgKG9yIHJvdW5kcywgZGVwZW5kaW5nIG9uIHJvdW5kaW5nTW9kZSkgYSBudW1iZXIgdG8gdGhlIHNwZWNpZmllZCBkZWNpbWFsIHBsYWNlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhcbiAgICAgICAgYmlnTnVtYmVyOiBCaWdOdW1iZXIsXG4gICAgICAgIGRlY2ltYWxQbGFjZXM6IG51bWJlcixcbiAgICAgICAgcm91bmRpbmdNb2RlOiBCaWdOdW1iZXIuUm91bmRpbmdNb2RlID0gQmlnTnVtYmVyLlJPVU5EX0RPV04sXG4gICAgKTogQmlnTnVtYmVyIHtcbiAgICAgICAgaWYgKGRlY2ltYWxQbGFjZXMgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmlnTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBuZXcgQmlnTnVtYmVyKDEwKS5wb3coZGVjaW1hbFBsYWNlcyk7XG4gICAgICAgIHJldHVybiBiaWdOdW1iZXIubXVsdGlwbGllZEJ5KG11bHRpcGxpZXIpLmludGVnZXJWYWx1ZShyb3VuZGluZ01vZGUpLmRpdmlkZWRCeShtdWx0aXBsaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGRlY2ltYWxSb3VuZGluZ01vZGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQmlnTnVtYmVyIHJvdW5kaW5nIG1vZGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVJvdW5kaW5nTW9kZShtb2RlOiAndHJ1bmNhdGUnIHwgJ3JvdW5kVXAnIHwgJ3JvdW5kRG93bicpOiBCaWdOdW1iZXIuUm91bmRpbmdNb2RlIHtcbiAgICAgICAgaWYgKG1vZGUgPT09ICdyb3VuZFVwJykge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5ST1VORF9DRUlMO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09PSAncm91bmREb3duJykge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5ST1VORF9GTE9PUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmlnTnVtYmVyLlJPVU5EX0RPV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltaXRzIHRoZSBkZWNpbWFsIHBhcnQgb2YgYSB2YWx1ZSBiZWluZyB0eXBlZC9wYXN0ZWQgdG8gbWF4RGVjaW1hbFBsYWNlcyxcbiAgICAgKiBwcmVzZXJ2aW5nIGFueSBzY2llbnRpZmljIG5vdGF0aW9uIGV4cG9uZW50IHVudG91Y2hlZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBseUJsb2NrTGltaXQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1heERlY2ltYWxzID0gdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCk7XG4gICAgICAgIGNvbnN0IGVJbmRleCA9IHZhbHVlLnNlYXJjaCgvW2VFXS8pO1xuICAgICAgICBjb25zdCBtYW50aXNzYSA9IGVJbmRleCA+PSAwID8gdmFsdWUuc2xpY2UoMCwgZUluZGV4KSA6IHZhbHVlO1xuICAgICAgICBjb25zdCBleHBvbmVudCA9IGVJbmRleCA+PSAwID8gdmFsdWUuc2xpY2UoZUluZGV4KSA6ICcnO1xuXG4gICAgICAgIGNvbnN0IHNlcEluZGV4ID0gbWFudGlzc2EuaW5kZXhPZih0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIGlmIChzZXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXhEZWNpbWFscyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hbnRpc3NhLnNsaWNlKDAsIHNlcEluZGV4KSArIGV4cG9uZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhLnNsaWNlKDAsIHNlcEluZGV4ICsgMSArIG1heERlY2ltYWxzKSArIGV4cG9uZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHN0cmluZyB2YWx1ZSB0byBpdHMgbnVtZXJpYyByZXByZXNlbnRhdGlvbiwgaGFuZGxpbmcgc2VwYXJhdG9ycyBhbmQgc2lnblxuICAgICAqIFJldHVybnMgQmlnTnVtYmVyIHRvIHByZXNlcnZlIGZ1bGwgcHJlY2lzaW9uIGFuZCBvcHRpb25hbCBudW1iZXIgY29udmVyc2lvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVN0cmluZ1RvVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgYmlnTnVtYmVyOiBCaWdOdW1iZXI7IG51bWVyaWM6IG51bWJlcjsgaXNOZWdhdGl2ZTogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgaXNOZWdhdGl2ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgbGV0IG51bWVyaWNTdHIgPSB2YWx1ZS5yZXBsYWNlKC9eLS8sICcnKTtcblxuICAgICAgICAvLyBHdWFyZGVkOiBhbiBlbXB0eSB0aG91c2FuZFNlcGFyYXRvciAoZS5nLiBcIm5vIGdyb3VwaW5nXCIpIG11c3Qgbm90IHJlYWNoIGBuZXcgUmVnRXhwYCxcbiAgICAgICAgLy8gc2luY2UgYSBiYXJlIGVzY2FwZWQtZW1wdHkgcGF0dGVybiAoYG5ldyBSZWdFeHAoJ1xcXFwnICsgJycpYCkgdGhyb3dzXG4gICAgICAgIC8vIFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IFxcIGF0IGVuZCBvZiBwYXR0ZXJuXCIuXG4gICAgICAgIGNvbnN0IHRob3VzYW5kU2VwID0gdGhpcy50aG91c2FuZFNlcGFyYXRvcigpO1xuICAgICAgICBpZiAodGhvdXNhbmRTZXApIHtcbiAgICAgICAgICAgIG51bWVyaWNTdHIgPSBudW1lcmljU3RyLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4KHRob3VzYW5kU2VwKSwgJ2cnKSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY2ltYWxTZXAgPSB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKTtcbiAgICAgICAgaWYgKGRlY2ltYWxTZXApIHtcbiAgICAgICAgICAgIG51bWVyaWNTdHIgPSBudW1lcmljU3RyLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4KGRlY2ltYWxTZXApLCAnZycpLCAnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bWVyaWNTdHIgPT09ICcuJyB8fCBudW1lcmljU3RyID09PSAnJykge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJztcbiAgICAgICAgfSBlbHNlIGlmIChudW1lcmljU3RyLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJyArIG51bWVyaWNTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcihudW1lcmljU3RyKTtcbiAgICAgICAgaWYgKGJpZ051bWJlci5pc05hTigpKSB7XG4gICAgICAgICAgICBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmVnYXRpdmUgJiYgdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGJpZ051bWJlciA9IGJpZ051bWJlci5uZWdhdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiaWdOdW1iZXIsIG51bWVyaWM6IGJpZ051bWJlci50b051bWJlcigpLCBpc05lZ2F0aXZlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JvdXBzIGFuIGludGVnZXIgZGlnaXQgc3RyaW5nIChvcHRpb25hbGx5IHNpZ25lZCkgdXNpbmcgYHRob3VzYW5kU2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIFByZXZpb3VzbHkgdGhpcyB1c2VkIGBJbnRsLk51bWJlckZvcm1hdChjdXJyZW50TG9jYWxlKWAgYW5kIHRoZW4gdHJpZWQgdG8gc3RyaXAgdGhlXG4gICAgICogbG9jYWxlJ3Mgb3duIGdyb3VwaW5nIHZpYSBgLnNwbGl0KGRlY2ltYWxTZXBhcmF0b3IoKSlgLCB3aGljaCAoYSkgaWdub3JlZCBhIGN1c3RvbVxuICAgICAqIGB0aG91c2FuZFNlcGFyYXRvcmAgZW50aXJlbHkg4oCUIGFsd2F5cyBmYWxsaW5nIGJhY2sgdG8gdGhlIGxvY2FsZSdzIG93biBncm91cGluZ1xuICAgICAqIGNoYXJhY3RlciBpbnN0ZWFkLCBlLmcuIGB0aG91c2FuZFNlcGFyYXRvcj1cIlwiYCBoYWQgbm8gZWZmZWN0IOKAlCBhbmQgKGIpIGNvcnJ1cHRlZCB0aGVcbiAgICAgKiByZXN1bHQgd2hlbmV2ZXIgdGhlIGxvY2FsZSdzIGdyb3VwaW5nIGNoYXJhY3RlciBoYXBwZW5lZCB0byBlcXVhbCBgZGVjaW1hbFNlcGFyYXRvcmBcbiAgICAgKiAoZS5nLiBhIGN1c3RvbSBgZGVjaW1hbFNlcGFyYXRvcj1cIi5cImAgdW5kZXIgYHB0LUJSYCwgd2hpY2ggZ3JvdXBzIHRob3VzYW5kcyB3aXRoIGAuYFxuICAgICAqIHRvbyk6IGBcIjEuMjM0XCIuc3BsaXQoJy4nKVswXWAgcmV0dXJuZWQgYFwiMVwiYCBpbnN0ZWFkIG9mIGBcIjEyMzRcImAuIEdyb3VwaW5nIHRoZSBkaWdpdHNcbiAgICAgKiBkaXJlY3RseSB3aXRoIHRoZSBkaXJlY3RpdmUncyBvd24gKGFscmVhZHkgbG9jYWxlL2V4cGxpY2l0LXJlc29sdmVkKSBgdGhvdXNhbmRTZXBhcmF0b3JgXG4gICAgICogYXZvaWRzIHRoZSBkZXRvdXIgdGhyb3VnaCBgSW50bC5OdW1iZXJGb3JtYXRgIGFuZCBib3RoIGJ1Z3MuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdyb3VwSW50ZWdlckRpZ2l0cyhpbnRlZ2VyUGFydDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VJbnQoaW50ZWdlclBhcnQsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBpc05lZ2F0aXZlID0gbnVtZXJpY1ZhbHVlIDwgMDtcbiAgICAgICAgY29uc3QgZGlnaXRzID0gTWF0aC5hYnMobnVtZXJpY1ZhbHVlKS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBzZXAgPSB0aGlzLnRob3VzYW5kU2VwYXJhdG9yKCk7XG4gICAgICAgIGNvbnN0IGdyb3VwZWQgPSBzZXAgPyBkaWdpdHMucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgc2VwKSA6IGRpZ2l0cztcbiAgICAgICAgcmV0dXJuIGlzTmVnYXRpdmUgPyBgLSR7Z3JvdXBlZH1gIDogZ3JvdXBlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGEgbnVtZXJpYyB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZVxuICAgICAqIFRydW5jYXRlcyAobmV2ZXIgcm91bmRzKSB0byBtYXhEZWNpbWFsUGxhY2VzIGFuZCBwYWRzIHdpdGggemVyb3MgdG8gbWluRGVjaW1hbFBsYWNlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXROdW1lcmljKG51bWVyaWM6IG51bWJlciB8IEJpZ051bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBiaWdOdW1lcmljID0gbnVtZXJpYyBpbnN0YW5jZW9mIEJpZ051bWJlciA/IG51bWVyaWMgOiBuZXcgQmlnTnVtYmVyKG51bWVyaWMpO1xuXG4gICAgICAgIGNvbnN0IHRydW5jYXRlZFZhbHVlID0gdGhpcy50cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhiaWdOdW1lcmljLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSk7XG5cbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSB0cnVuY2F0ZWRWYWx1ZS50b0ZpeGVkKE1hdGgubWF4KHRoaXMubWluRGVjaW1hbFBsYWNlcygpLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkpO1xuXG4gICAgICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlU3RyLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSBmb3JtYXR0ZWRWYWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIGNvbnN0IGludGVnZXJQYXJ0ID0gcGFydHNbMF07XG4gICAgICAgIGxldCBkZWNpbWFsUGFydCA9IHBhcnRzWzFdIHx8ICcnO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZEludGVnZXIgPSB0aGlzLmdyb3VwSW50ZWdlckRpZ2l0cyhpbnRlZ2VyUGFydCk7XG5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRGVjaW1hbFBsYWNlcyA9IGRlY2ltYWxQYXJ0LnJlcGxhY2UoLzArJC8sICcnKS5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBsYWNlc1RvU2hvdyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgdGhpcy5taW5EZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICBNYXRoLm1pbihlZmZlY3RpdmVEZWNpbWFsUGxhY2VzLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zdWJzdHJpbmcoMCwgZGVjaW1hbFBsYWNlc1RvU2hvdykucGFkRW5kKGRlY2ltYWxQbGFjZXNUb1Nob3csICcwJyk7XG5cbiAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0ID8gZm9ybWF0dGVkSW50ZWdlciArIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpICsgZGVjaW1hbFBhcnQgOiBmb3JtYXR0ZWRJbnRlZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgdG8gdGhlIG1vZGVsIGZvcm1hdCAoaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBzdHJpbmcpXG4gICAgICogQWx3YXlzIHJldHVybnMgZGVjaW1hbCBub3RhdGlvbiwgbmV2ZXIgc2NpZW50aWZpYyBub3RhdGlvblxuICAgICAqIFN0b3JlcyB0aGUgZnVsbCBwcmVjaXNpb24gdmFsdWUgd2l0aG91dCB0cnVuY2F0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRvTW9kZWxWYWx1ZShmb3JtYXR0ZWRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghZm9ybWF0dGVkVmFsdWUgfHwgZm9ybWF0dGVkVmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBiaWdOdW1iZXIgfSA9IHRoaXMucGFyc2VTdHJpbmdUb1ZhbHVlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGJpZ051bWJlci50b0ZpeGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIG1vZGVsIHZhbHVlIHRvIGRpc3BsYXkgZm9ybWF0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZyb21Nb2RlbFZhbHVlKG1vZGVsVmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBpZiAobW9kZWxWYWx1ZSA9PT0gbnVsbCB8fCBtb2RlbFZhbHVlID09PSB1bmRlZmluZWQgfHwgbW9kZWxWYWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKG1vZGVsVmFsdWUpO1xuICAgICAgICBpZiAoYmlnTnVtYmVyLmlzTmFOKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1lcmljKGJpZ051bWJlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHBhc3RlZCB2YWx1ZSBmcm9tIGNsaXBib2FyZFxuICAgICAqIENvbnZlcnRzIHNjaWVudGlmaWMgbm90YXRpb24gdG8gZGVjaW1hbCB1c2luZyBCaWdOdW1iZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VDbGlwYm9hcmRWYWx1ZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpICYmIC9bZUVdLy50ZXN0KHRleHQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpZ051bWVyaWMgPSBuZXcgQmlnTnVtYmVyKHRleHQpO1xuICAgICAgICAgICAgICAgIGlmICghYmlnTnVtZXJpYy5pc05hTigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaWdOdW1lcmljLnRvRml4ZWQoKS5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVTZXBhcmF0b3JzKHRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHNpZ24gKC0gb3IgKykgb2YgYSB2YWx1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2dnbGVTaWduKHZhbHVlOiBzdHJpbmcsIG1ha2VOZWdhdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobWFrZU5lZ2F0aXZlICYmICFuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gJy0nICsgbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1ha2VOZWdhdGl2ZSAmJiBuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgbmV3VmFsdWUpO1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGVjaW1hbFNlcGFyYXRvcigpIHx8ICF0aGlzLnRob3VzYW5kU2VwYXJhdG9yKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChoYXNGb2N1cykge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZyb21Nb2RlbFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5zdHJpcFRyYWlsaW5nWmVyb3ModGhpcy5yZW1vdmVTZXBhcmF0b3JzKGZvcm1hdHRlZFZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCByYXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZnJvbU1vZGVsVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgICAgIGlmICghY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtb2RlbCBtYXkgYmUgc2V0IHByb2dyYW1tYXRpY2FsbHkgYXMgYSBgbnVtYmVyYCAoZS5nLiBgcGF0Y2hWYWx1ZWAgd2l0aCBhIGJhY2tlbmQgRFRPKSxcbiAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIHZhbHVlIHRoaXMgZGlyZWN0aXZlIGVtaXRzIGlzIGFsd2F5cyBhIGRlY2ltYWwgYHN0cmluZ2AuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGNvbnRyb2xWYWx1ZSk7XG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChpc05hTihudW1lcmljVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkgJiYgbnVtZXJpY1ZhbHVlIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmVOb3RBbGxvd2VkOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG51bWVyaWNWYWx1ZSA8IG1pblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1pbjoge1xuICAgICAgICAgICAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IG51bWVyaWNWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbnVtZXJpY1ZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogbnVtZXJpY1ZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSB2YWx1ZS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNlc3NpdmVEZWNpbWFsUGxhY2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogZGVjaW1hbFBhcnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlY2lzaW9uID0gdGhpcy5wcmVjaXNpb24oKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBudW1lcmljU3RyID0gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKCctJywgJycpO1xuICAgICAgICAgICAgY29uc3QgW2ludFBhcnQsIGRlY1BhcnQgPSAnJ10gPSBudW1lcmljU3RyLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbERpZ2l0cyA9IGludFBhcnQubGVuZ3RoICsgZGVjUGFydC5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmICh0b3RhbERpZ2l0cyA+IHByZWNpc2lvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VlZHNQcmVjaXNpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogdG90YWxEaWdpdHMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuIl19
|
|
602
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUdMLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixHQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7O0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQTBCSCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOzs7T0FHRztJQUNJLE1BQU0sR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXJEOzs7T0FHRztJQUNJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuQzs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwQzs7O09BR0c7SUFDSSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFN0M7O09BRUc7SUFDSSxHQUFHLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVsRDs7T0FFRztJQUNJLEdBQUcsR0FBRyxLQUFL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WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2xvY2FsZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERpcmV0aXZhIGRlIG3DoXNjYXJhIG51bcOpcmljYSBjb20gc3Vwb3J0ZSBhIGludGVybmFjaW9uYWxpemHDp8Ojby5cbiAqXG4gKiBGb3JtYXRhIHZhbG9yZXMgbnVtw6lyaWNvcyBkZSBhY29yZG8gY29tIG8gbG9jYWxlIGVzcGVjaWZpY2FkbywgYXBsaWNhbmRvXG4gKiBzZXBhcmFkb3JlcyBkZSBtaWxoYXIgZSBkZWNpbWFsIGFkZXF1YWRvcywgY29tIHN1cG9ydGUgYSB2YWxvcmVzIG5lZ2F0aXZvcyxcbiAqIGNvbnRyb2xlIGRlIGNhc2FzIGRlY2ltYWlzIG3DrW4vbcOheCBlIG5vdGHDp8OjbyBjaWVudMOtZmljYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0XG4gKiAgIHR5cGU9XCJ0ZXh0XCJcbiAqICAgc051bWVyaWNNYXNrXG4gKiAgIFtsb2NhbGVdPVwiJ3B0LUJSJ1wiXG4gKiAgIFttaW5EZWNpbWFsUGxhY2VzXT1cIjJcIlxuICogICBbbWF4RGVjaW1hbFBsYWNlc109XCIyXCJcbiAqICAgW2FsbG93TmVnYXRpdmVdPVwidHJ1ZVwiXG4gKiAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICogLz5cbiAqIGBgYFxuICogQGNhdGVnb3J5IE51bWVyaWNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbc051bWVyaWNNYXNrXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoaW5wdXQpJzogJ29uSW5wdXQoJGV2ZW50KScsXG4gICAgICAgICcoZm9jdXMpJzogJ29uRm9jdXMoKScsXG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCknLFxuICAgICAgICAnKHBhc3RlKSc6ICdvblBhc3RlKCRldmVudCknLFxuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJyxcbiAgICAgICAgJyhrZXlwcmVzcyknOiAnb25LZXlQcmVzcygkZXZlbnQpJyxcbiAgICAgICAgJ1tzdHlsZS50ZXh0LWFsaWduXSc6ICdcInJpZ2h0XCInLFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnVtZXJpY01hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljTWFza0RpcmVjdGl2ZSksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOdW1lcmljTWFza0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgICAvKipcbiAgICAgKiBMb2NhbGUgZm9yIGZvcm1hdHRpbmcgKGUuZy4gJ3B0LUJSJywgJ2VuLVVTJywgJ2RlLURFJylcbiAgICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGxvY2FsZSBmcm9tIExvY2FsZVNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9jYWxlID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gZGlzcGxheVxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWluRGVjaW1hbFBsYWNlcyA9IGlucHV0KDApO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgYWxsb3dlZFxuICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICovXG4gICAgcHVibGljIG1heERlY2ltYWxQbGFjZXMgPSBpbnB1dCgxMCk7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgbmVnYXRpdmUgdmFsdWVzXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsb3dOZWdhdGl2ZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc2NpZW50aWZpYyBub3RhdGlvbiBzdXBwb3J0XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxvd1NjaWVudGlmaWNOb3RhdGlvbiA9IGlucHV0KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSB2YWx1ZSBhbGxvd2VkXG4gICAgICovXG4gICAgcHVibGljIG1pbiA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gdmFsdWUgYWxsb3dlZFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXggPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBCbG9ja3MgdHlwaW5nL3Bhc3RpbmcgZGVjaW1hbCBkaWdpdHMgYmV5b25kIG1heERlY2ltYWxQbGFjZXMuXG4gICAgICogV2hlbiBtYXhEZWNpbWFsUGxhY2VzIGlzIDAsIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpdHNlbGYgY2Fubm90IGJlIGVudGVyZWQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBibG9ja0RlY2ltYWxPdmVyZmxvdyA9IGlucHV0KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogU3RyYXRlZ3kgYXBwbGllZCBvbiBibHVyIHdoZW4gYmxvY2tEZWNpbWFsT3ZlcmZsb3cgaXMgZmFsc2UuXG4gICAgICogJ3ByZXNlcnZlJyBrZWVwcyB0aGUgbW9kZWwgYXQgZnVsbCBwcmVjaXNpb247IG9ubHkgdGhlIGRpc3BsYXkgaXMgdHJ1bmNhdGVkIChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAqICd0cnVuY2F0ZScgY3V0cyB0aGUgZXhjZXNzIGRlY2ltYWxzIHdpdGhvdXQgcm91bmRpbmcgKHRvd2FyZHMgemVybyksIHVwZGF0aW5nIHRoZSBtb2RlbCB0b28uXG4gICAgICogJ3JvdW5kVXAnIGFsd2F5cyByb3VuZHMgdG8gdGhlIG5leHQgcmVwcmVzZW50YWJsZSB2YWx1ZSBhYm92ZSAoY2VpbGluZyksIHVwZGF0aW5nIHRoZSBtb2RlbCB0b28uXG4gICAgICogJ3JvdW5kRG93bicgYWx3YXlzIHJvdW5kcyB0byB0aGUgbmV4dCByZXByZXNlbnRhYmxlIHZhbHVlIGJlbG93IChmbG9vciksIHVwZGF0aW5nIHRoZSBtb2RlbCB0b28uXG4gICAgICogSGFzIG5vIGVmZmVjdCB3aGlsZSBibG9ja0RlY2ltYWxPdmVyZmxvdyBpcyB0cnVlLlxuICAgICAqIEBkZWZhdWx0ICdwcmVzZXJ2ZSdcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVjaW1hbFJvdW5kaW5nTW9kZSA9IGlucHV0PCdwcmVzZXJ2ZScgfCAndHJ1bmNhdGUnIHwgJ3JvdW5kVXAnIHwgJ3JvdW5kRG93bic+KCdwcmVzZXJ2ZScpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsZVNlcnZpY2UgPSBpbmplY3QoTG9jYWxlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwdWJsaWMgZGVjaW1hbFNlcGFyYXRvciA9IG1vZGVsKCcsJyk7XG4gICAgcHVibGljIHRob3VzYW5kU2VwYXJhdG9yID0gbW9kZWwoJy4nKTtcbiAgICBwcm90ZWN0ZWQgY3VycmVudExvY2FsZSA9ICdwdC1CUic7XG4gICAgcHJpdmF0ZSBsYXN0TW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlJ10gJiYgIWNoYW5nZXNbJ2xvY2FsZSddLmZpcnN0Q2hhbmdlICYmIHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5taW5EZWNpbWFsUGxhY2VzKCkgPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBOdW1lcmljTWFza0RpcmVjdGl2ZTogbWluRGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKX0pIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4RGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1heERlY2ltYWxQbGFjZXMoKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sb2NhbGUoKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gdGhpcy5sb2NhbGUoKSE7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2NhbGVTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlU2VydmljZSEuZ2V0TG9jYWxlT3B0aW9ucygpPy5sb2NhbGUgfHwgJ3B0LUJSJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgaW5wdXQgZXZlbnRzICh0eXBpbmcpXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICB2YWx1ZSA9IHRoaXMubm9ybWFsaXplU2VwYXJhdG9ycyh2YWx1ZSk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0lucHV0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBmb2N1cyBldmVudHMgKGdhaW5pbmcgZm9jdXMpXG4gICAgICovXG4gICAgcHVibGljIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0TW9kZWxWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5sYXN0TW9kZWxWYWx1ZS5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBtb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQsICd2YWx1ZScsIGRpc3BsYXlWYWx1ZSk7XG4gICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBibHVyIGV2ZW50cyAoZm9jdXMgbG9zcylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3VuZGluZ01vZGUgPSB0aGlzLmRlY2ltYWxSb3VuZGluZ01vZGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmJsb2NrRGVjaW1hbE92ZXJmbG93KCkgJiYgcm91bmRpbmdNb2RlICE9PSAncHJlc2VydmUnKSB7XG4gICAgICAgICAgICBjb25zdCByb3VuZGVkID0gdGhpcy50cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhcbiAgICAgICAgICAgICAgICBuZXcgQmlnTnVtYmVyKG1vZGVsVmFsdWUpLFxuICAgICAgICAgICAgICAgIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpLFxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVJvdW5kaW5nTW9kZShyb3VuZGluZ01vZGUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vZGVsVmFsdWUgPSByb3VuZGVkLnRvRml4ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmZyb21Nb2RlbFZhbHVlKG1vZGVsVmFsdWUpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBkaXNwbGF5VmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG1vZGVsVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBwYXN0ZSBldmVudHMgKGNsaXBib2FyZClcbiAgICAgKi9cbiAgICBwdWJsaWMgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpIHx8ICcnO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBhcnNlQ2xpcGJvYXJkVmFsdWUocGFzdGVkVGV4dCk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIHNwZWNpYWwga2V5cyAoKyBhbmQgLSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcblxuICAgICAgICBpZiAoa2V5ID09PSAnLScgfHwga2V5ID09PSAnKycpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnLScgJiYgdGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT09ICdlJyB8fCBjaGFyQmVmb3JlQ3Vyc29yID09PSAnRScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2lnbih2YWx1ZSwga2V5ID09PSAnLScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIGtleXByZXNzIHRvIGJsb2NrIGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgIGlmICgoa2V5ID09PSAnLScgfHwga2V5ID09PSAnKycpICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKSkge1xuICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICBpZiAoY2hhckJlZm9yZUN1cnNvciA9PT0gJ2UnIHx8IGNoYXJCZWZvcmVDdXJzb3IgPT09ICdFJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICcrJyB8fCBrZXkgPT09ICctJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRGlnaXQgPSAvXlswLTldJC8udGVzdChrZXkpO1xuICAgICAgICBjb25zdCBpc0RlY2ltYWxTZXBhcmF0b3IgPSBrZXkgPT09ICcsJyB8fCBrZXkgPT09ICcuJztcbiAgICAgICAgY29uc3QgaXNTY2llbnRpZmljTm90YXRpb24gPSAoa2V5ID09PSAnZScgfHwga2V5ID09PSAnRScpICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKTtcbiAgICAgICAgY29uc3QgaXNDb250cm9sS2V5ID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleTtcbiAgICAgICAgY29uc3QgaXNTcGVjaWFsS2V5ID0gW1xuICAgICAgICAgICAgJ0JhY2tzcGFjZScsXG4gICAgICAgICAgICAnVGFiJyxcbiAgICAgICAgICAgICdFbnRlcicsXG4gICAgICAgICAgICAnRXNjYXBlJyxcbiAgICAgICAgICAgICdBcnJvd0xlZnQnLFxuICAgICAgICAgICAgJ0Fycm93UmlnaHQnLFxuICAgICAgICAgICAgJ0RlbGV0ZScsXG4gICAgICAgICAgICAnSG9tZScsXG4gICAgICAgICAgICAnRW5kJyxcbiAgICAgICAgXS5pbmNsdWRlcyhrZXkpO1xuXG4gICAgICAgIGlmIChpc1NjaWVudGlmaWNOb3RhdGlvbikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCdlJykgfHwgdmFsdWUuaW5jbHVkZXMoJ0UnKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjaGFyQmVmb3JlQ3Vyc29yID0gdmFsdWVbY3Vyc29yUG9zaXRpb24gLSAxXTtcbiAgICAgICAgICAgIGlmICghY2hhckJlZm9yZUN1cnNvciB8fCAhL15bMC05XSQvLnRlc3QoY2hhckJlZm9yZUN1cnNvcikpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaWdpdCAmJiAhaXNEZWNpbWFsU2VwYXJhdG9yICYmICFpc1NjaWVudGlmaWNOb3RhdGlvbiAmJiAhaXNDb250cm9sS2V5ICYmICFpc1NwZWNpYWxLZXkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHNlcGFyYXRvcnMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlU2VwYXJhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VycmVudExvY2FsZSkuZm9ybWF0KDEyMzQuNSk7XG5cbiAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvci5zZXQoZm9ybWF0dGVkWzFdKTtcbiAgICAgICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yLnNldChmb3JtYXR0ZWRbNV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBpbnB1dCB2YWx1ZSBhbmQgdXBkYXRlcyB0aGUgaW5wdXQgYW5kIG1vZGVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSB8fCAhdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJsb2NrRGVjaW1hbE92ZXJmbG93KCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5hcHBseUJsb2NrTGltaXQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLnRvTW9kZWxWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gRHVyaW5nIHR5cGluZywgY2xlYXIgdGhlIHN0b3JlZCBtb2RlbCB2YWx1ZSBzbyBvbkZvY3VzIHdpbGwgcmVjYWxjdWxhdGVcbiAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGlucHV0bW9kZSBmb3IgbnVtZXJpYyBrZXlib2FyZCBvbiBtb2JpbGUgZGV2aWNlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRJbnB1dE1vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaW5wdXRtb2RlJywgJ2RlY2ltYWwnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdhdXRvY29tcGxldGUnLCAnb2ZmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBzZXBhcmF0b3JzIGZyb20gYSBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlU2VwYXJhdG9ycyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLnRob3VzYW5kU2VwYXJhdG9yKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRob3VzYW5kUmVnZXggPSBuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgodGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSwgJ2cnKTtcblxuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSh0aG91c2FuZFJlZ2V4LCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaXBzIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHplcm9zIGZyb20gZGVjaW1hbCBwYXJ0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0cmlwVHJhaWxpbmdaZXJvcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0ucmVwbGFjZSgvMCskLywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDAgPyBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpICsgZGVjaW1hbFBhcnQgOiBwYXJ0c1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBzZXBhcmF0b3JzIGR1cmluZyB0eXBpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgbm9ybWFsaXplU2VwYXJhdG9ycyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJlbW92ZVNlcGFyYXRvcnModmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSA9PT0gJywnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnLCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpID09PSAnLicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLC9nLCAnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnRzWzBdICsgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgKyBwYXJ0cy5zbGljZSgxKS5qb2luKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBmb3IgdXNlIGluIHJlZ2V4XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGVzY2FwZVJlZ2V4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlcyAob3Igcm91bmRzLCBkZXBlbmRpbmcgb24gcm91bmRpbmdNb2RlKSBhIG51bWJlciB0byB0aGUgc3BlY2lmaWVkIGRlY2ltYWwgcGxhY2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRydW5jYXRlVG9EZWNpbWFsUGxhY2VzKFxuICAgICAgICBiaWdOdW1iZXI6IEJpZ051bWJlcixcbiAgICAgICAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICAgICAgICByb3VuZGluZ01vZGU6IEJpZ051bWJlci5Sb3VuZGluZ01vZGUgPSBCaWdOdW1iZXIuUk9VTkRfRE9XTixcbiAgICApOiBCaWdOdW1iZXIge1xuICAgICAgICBpZiAoZGVjaW1hbFBsYWNlcyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiaWdOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IG5ldyBCaWdOdW1iZXIoMTApLnBvdyhkZWNpbWFsUGxhY2VzKTtcbiAgICAgICAgcmV0dXJuIGJpZ051bWJlci5tdWx0aXBsaWVkQnkobXVsdGlwbGllcikuaW50ZWdlclZhbHVlKHJvdW5kaW5nTW9kZSkuZGl2aWRlZEJ5KG11bHRpcGxpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgZGVjaW1hbFJvdW5kaW5nTW9kZSB0byB0aGUgY29ycmVzcG9uZGluZyBCaWdOdW1iZXIgcm91bmRpbmcgbW9kZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNvbHZlUm91bmRpbmdNb2RlKG1vZGU6ICd0cnVuY2F0ZScgfCAncm91bmRVcCcgfCAncm91bmREb3duJyk6IEJpZ051bWJlci5Sb3VuZGluZ01vZGUge1xuICAgICAgICBpZiAobW9kZSA9PT0gJ3JvdW5kVXAnKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLlJPVU5EX0NFSUw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGUgPT09ICdyb3VuZERvd24nKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLlJPVU5EX0ZMT09SO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBCaWdOdW1iZXIuUk9VTkRfRE9XTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1pdHMgdGhlIGRlY2ltYWwgcGFydCBvZiBhIHZhbHVlIGJlaW5nIHR5cGVkL3Bhc3RlZCB0byBtYXhEZWNpbWFsUGxhY2VzLFxuICAgICAqIHByZXNlcnZpbmcgYW55IHNjaWVudGlmaWMgbm90YXRpb24gZXhwb25lbnQgdW50b3VjaGVkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5QmxvY2tMaW1pdCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWF4RGVjaW1hbHMgPSB0aGlzLm1heERlY2ltYWxQbGFjZXMoKTtcbiAgICAgICAgY29uc3QgZUluZGV4ID0gdmFsdWUuc2VhcmNoKC9bZUVdLyk7XG4gICAgICAgIGNvbnN0IG1hbnRpc3NhID0gZUluZGV4ID49IDAgPyB2YWx1ZS5zbGljZSgwLCBlSW5kZXgpIDogdmFsdWU7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50ID0gZUluZGV4ID49IDAgPyB2YWx1ZS5zbGljZShlSW5kZXgpIDogJyc7XG5cbiAgICAgICAgY29uc3Qgc2VwSW5kZXggPSBtYW50aXNzYS5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHNlcEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heERlY2ltYWxzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFudGlzc2Euc2xpY2UoMCwgc2VwSW5kZXgpICsgZXhwb25lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFudGlzc2Euc2xpY2UoMCwgc2VwSW5kZXggKyAxICsgbWF4RGVjaW1hbHMpICsgZXhwb25lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIHZhbHVlIHRvIGl0cyBudW1lcmljIHJlcHJlc2VudGF0aW9uLCBoYW5kbGluZyBzZXBhcmF0b3JzIGFuZCBzaWduXG4gICAgICogUmV0dXJucyBCaWdOdW1iZXIgdG8gcHJlc2VydmUgZnVsbCBwcmVjaXNpb24gYW5kIG9wdGlvbmFsIG51bWJlciBjb252ZXJzaW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3RyaW5nVG9WYWx1ZSh2YWx1ZTogc3RyaW5nKTogeyBiaWdOdW1iZXI6IEJpZ051bWJlcjsgbnVtZXJpYzogbnVtYmVyOyBpc05lZ2F0aXZlOiBib29sZWFuIH0ge1xuICAgICAgICBjb25zdCBpc05lZ2F0aXZlID0gdmFsdWUuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICBsZXQgbnVtZXJpY1N0ciA9IHZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXi0vLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwke3RoaXMudGhvdXNhbmRTZXBhcmF0b3IoKX1gLCAnZycpLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwke3RoaXMuZGVjaW1hbFNlcGFyYXRvcigpfWAsICdnJyksICcuJyk7XG5cbiAgICAgICAgaWYgKG51bWVyaWNTdHIgPT09ICcuJyB8fCBudW1lcmljU3RyID09PSAnJykge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJztcbiAgICAgICAgfSBlbHNlIGlmIChudW1lcmljU3RyLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJyArIG51bWVyaWNTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcihudW1lcmljU3RyKTtcbiAgICAgICAgaWYgKGJpZ051bWJlci5pc05hTigpKSB7XG4gICAgICAgICAgICBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmVnYXRpdmUgJiYgdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGJpZ051bWJlciA9IGJpZ051bWJlci5uZWdhdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiaWdOdW1iZXIsIG51bWVyaWM6IGJpZ051bWJlci50b051bWJlcigpLCBpc05lZ2F0aXZlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIG51bWVyaWMgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKiBUcnVuY2F0ZXMgKG5ldmVyIHJvdW5kcykgdG8gbWF4RGVjaW1hbFBsYWNlcyBhbmQgcGFkcyB3aXRoIHplcm9zIHRvIG1pbkRlY2ltYWxQbGFjZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZm9ybWF0TnVtZXJpYyhudW1lcmljOiBudW1iZXIgfCBCaWdOdW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYmlnTnVtZXJpYyA9IG51bWVyaWMgaW5zdGFuY2VvZiBCaWdOdW1iZXIgPyBudW1lcmljIDogbmV3IEJpZ051bWJlcihudW1lcmljKTtcblxuICAgICAgICBjb25zdCB0cnVuY2F0ZWRWYWx1ZSA9IHRoaXMudHJ1bmNhdGVUb0RlY2ltYWxQbGFjZXMoYmlnTnVtZXJpYywgdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCkpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gdHJ1bmNhdGVkVmFsdWUudG9GaXhlZChNYXRoLm1heCh0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKSwgdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCkpKTtcblxuICAgICAgICBsZXQgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZVN0ci5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVkVmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICBjb25zdCBpbnRlZ2VyUGFydCA9IHBhcnRzWzBdO1xuICAgICAgICBsZXQgZGVjaW1hbFBhcnQgPSBwYXJ0c1sxXSB8fCAnJztcblxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRJbnRlZ2VyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VycmVudExvY2FsZSlcbiAgICAgICAgICAgIC5mb3JtYXQocGFyc2VJbnQoaW50ZWdlclBhcnQsIDEwKSB8fCAwKVxuICAgICAgICAgICAgLnNwbGl0KHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKVswXTtcblxuICAgICAgICBjb25zdCBlZmZlY3RpdmVEZWNpbWFsUGxhY2VzID0gZGVjaW1hbFBhcnQucmVwbGFjZSgvMCskLywgJycpLmxlbmd0aDtcblxuICAgICAgICBjb25zdCBkZWNpbWFsUGxhY2VzVG9TaG93ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICB0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKSxcbiAgICAgICAgICAgIE1hdGgubWluKGVmZmVjdGl2ZURlY2ltYWxQbGFjZXMsIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKSxcbiAgICAgICAgKTtcblxuICAgICAgICBkZWNpbWFsUGFydCA9IGRlY2ltYWxQYXJ0LnN1YnN0cmluZygwLCBkZWNpbWFsUGxhY2VzVG9TaG93KS5wYWRFbmQoZGVjaW1hbFBsYWNlc1RvU2hvdywgJzAnKTtcblxuICAgICAgICByZXR1cm4gZGVjaW1hbFBhcnQgPyBmb3JtYXR0ZWRJbnRlZ2VyICsgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgKyBkZWNpbWFsUGFydCA6IGZvcm1hdHRlZEludGVnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZvcm1hdHRlZCB2YWx1ZSB0byB0aGUgbW9kZWwgZm9ybWF0IChpbnRlcm5hdGlvbmFsIHN0YW5kYXJkIHN0cmluZylcbiAgICAgKiBBbHdheXMgcmV0dXJucyBkZWNpbWFsIG5vdGF0aW9uLCBuZXZlciBzY2llbnRpZmljIG5vdGF0aW9uXG4gICAgICogU3RvcmVzIHRoZSBmdWxsIHByZWNpc2lvbiB2YWx1ZSB3aXRob3V0IHRydW5jYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdG9Nb2RlbFZhbHVlKGZvcm1hdHRlZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWRWYWx1ZSB8fCBmb3JtYXR0ZWRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGJpZ051bWJlciB9ID0gdGhpcy5wYXJzZVN0cmluZ1RvVmFsdWUoZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICByZXR1cm4gYmlnTnVtYmVyLnRvRml4ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgbW9kZWwgdmFsdWUgdG8gZGlzcGxheSBmb3JtYXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZnJvbU1vZGVsVmFsdWUobW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChtb2RlbFZhbHVlID09PSBudWxsIHx8IG1vZGVsVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtb2RlbFZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChiaWdOdW1iZXIuaXNOYU4oKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWVyaWMoYmlnTnVtYmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcGFzdGVkIHZhbHVlIGZyb20gY2xpcGJvYXJkXG4gICAgICogQ29udmVydHMgc2NpZW50aWZpYyBub3RhdGlvbiB0byBkZWNpbWFsIHVzaW5nIEJpZ051bWJlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZUNsaXBib2FyZFZhbHVlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkgJiYgL1tlRV0vLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlnTnVtZXJpYyA9IG5ldyBCaWdOdW1iZXIodGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKCFiaWdOdW1lcmljLmlzTmFOKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpZ051bWVyaWMudG9GaXhlZCgpLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdm9pZCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVNlcGFyYXRvcnModGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgc2lnbiAoLSBvciArKSBvZiBhIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRvZ2dsZVNpZ24odmFsdWU6IHN0cmluZywgbWFrZU5lZ2F0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChtYWtlTmVnYXRpdmUgJiYgIW5ld1ZhbHVlLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSAnLScgKyBuZXdWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghbWFrZU5lZ2F0aXZlICYmIG5ld1ZhbHVlLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGlucHV0LCAndmFsdWUnLCBuZXdWYWx1ZSk7XG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLnRvTW9kZWxWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG1vZGVsVmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgfHwgIXRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGhhc0ZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZnJvbU1vZGVsVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLnN0cmlwVHJhaWxpbmdaZXJvcyh0aGlzLnJlbW92ZVNlcGFyYXRvcnMoZm9ybWF0dGVkVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHJhd1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChpc05hTihudW1lcmljVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkgJiYgbnVtZXJpY1ZhbHVlIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmVOb3RBbGxvd2VkOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG51bWVyaWNWYWx1ZSA8IG1pblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1pbjoge1xuICAgICAgICAgICAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IG51bWVyaWNWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbnVtZXJpY1ZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogbnVtZXJpY1ZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSB2YWx1ZS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNlc3NpdmVEZWNpbWFsUGxhY2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogZGVjaW1hbFBhcnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4iXX0=
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { NgModule } from '@angular/core';
|
|
2
2
|
import { NumericMaskDirective } from './numeric-mask.directive';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated Será removido na v20. Importe diretamente o standalone `NumericMaskDirective` (de
|
|
6
|
-
* `@seniorsistemas/angular-components/numeric-mask`) no lugar deste módulo.
|
|
7
|
-
*
|
|
8
|
-
* Migração automática (também executada pelo `ng update` na v20):
|
|
9
|
-
* `ng generate @seniorsistemas/angular-components:migrate-modules-to-standalone`
|
|
10
|
-
*/
|
|
11
4
|
export class CurrencyMaskModule {
|
|
12
5
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CurrencyMaskModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
13
6
|
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: CurrencyMaskModule, imports: [NumericMaskDirective], exports: [NumericMaskDirective] });
|
|
@@ -20,4 +13,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
20
13
|
exports: [NumericMaskDirective],
|
|
21
14
|
}]
|
|
22
15
|
}] });
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQU1oRSxNQUFNLE9BQU8sa0JBQWtCO3dHQUFsQixrQkFBa0I7eUdBQWxCLGtCQUFrQixZQUhqQixvQkFBb0IsYUFDcEIsb0JBQW9CO3lHQUVyQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBSjlCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQy9CLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO2lCQUNsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE51bWVyaWNNYXNrRGlyZWN0aXZlIH0gZnJvbSAnLi9udW1lcmljLW1hc2suZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbTnVtZXJpY01hc2tEaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtOdW1lcmljTWFza0RpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5TWFza01vZHVsZSB7fVxuXG4iXX0=
|