@testgorilla/tgo-ui 3.2.4 → 3.2.5
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 +95 -95
- package/components/autocomplete/autocomplete.component.d.ts +8 -1
- package/components/empty-state/empty-state.component.d.ts +1 -1
- package/components/icon/icon.model.d.ts +1 -1
- package/components/step/step.component.d.ts +18 -3
- package/components/step/step.component.module.d.ts +2 -1
- package/components/stepper/stepper.component.d.ts +14 -6
- package/components/stepper/stepper.model.d.ts +1 -0
- package/esm2022/components/accordion/accordion.component.mjs +3 -3
- package/esm2022/components/accordion/accordion.component.module.mjs +1 -1
- package/esm2022/components/accordion/accordion.model.mjs +1 -1
- package/esm2022/components/alert-banner/alert-banner.component.mjs +3 -3
- package/esm2022/components/alert-banner/alert-banner.component.module.mjs +1 -1
- package/esm2022/components/alert-banner/alert-banner.model.mjs +1 -1
- package/esm2022/components/autocomplete/autocomplete.component.mjs +5 -3
- package/esm2022/components/autocomplete/autocomplete.component.module.mjs +1 -1
- package/esm2022/components/autocomplete/autocomplete.model.mjs +1 -1
- package/esm2022/components/autocomplete/includes.pipe.mjs +1 -1
- package/esm2022/components/autocomplete/prevent-input.directive.mjs +1 -1
- package/esm2022/components/autocomplete/transform-Item.pipe.mjs +1 -1
- package/esm2022/components/avatar/avatar.component.mjs +3 -3
- package/esm2022/components/avatar/avatar.component.module.mjs +1 -1
- package/esm2022/components/avatar/avatar.model.mjs +1 -1
- package/esm2022/components/badge/badge.component.mjs +3 -3
- package/esm2022/components/badge/badge.component.module.mjs +1 -1
- package/esm2022/components/badge/badge.model.mjs +1 -1
- package/esm2022/components/button/button.component.module.mjs +1 -1
- package/esm2022/components/button/button.model.mjs +1 -1
- package/esm2022/components/card/card.component.mjs +3 -3
- package/esm2022/components/card/card.component.module.mjs +1 -1
- package/esm2022/components/card/card.model.mjs +1 -1
- package/esm2022/components/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/components/checkbox/checkbox.component.module.mjs +1 -1
- package/esm2022/components/checkbox/focus-visible.directive.mjs +1 -1
- package/esm2022/components/checklist/checklist.component.mjs +3 -3
- package/esm2022/components/checklist/checklist.model.mjs +1 -1
- package/esm2022/components/confirm-dialog/confirm-dialog.component.module.mjs +1 -1
- package/esm2022/components/datepicker/datepicker.component.module.mjs +1 -1
- package/esm2022/components/datepicker/datepicker.service.mjs +1 -1
- package/esm2022/components/datepicker/no-date-format.directive.mjs +1 -1
- package/esm2022/components/deprecated-paginator/deprecated-paginator.component.mjs +3 -3
- package/esm2022/components/deprecated-paginator/deprecated-paginator.component.module.mjs +1 -1
- package/esm2022/components/dialog/dialog.component.module.mjs +1 -1
- package/esm2022/components/dialog/dialog.model.mjs +1 -1
- package/esm2022/components/divider/divider.component.mjs +3 -3
- package/esm2022/components/divider/divider.component.module.mjs +1 -1
- package/esm2022/components/divider/divider.model.mjs +1 -1
- package/esm2022/components/dropdown/dropdown.component.mjs +5 -5
- package/esm2022/components/dropdown/dropdown.component.module.mjs +1 -1
- package/esm2022/components/dropdown/dropdown.model.mjs +1 -1
- package/esm2022/components/elevation-shadow/elevation-shadow.component.mjs +3 -3
- package/esm2022/components/elevation-shadow/elevation-shadow.component.module.mjs +1 -1
- package/esm2022/components/elevation-shadow/elevation-shadow.constant.mjs +1 -1
- package/esm2022/components/empty-state/empty-state.component.mjs +3 -3
- package/esm2022/components/empty-state/empty-state.component.module.mjs +1 -1
- package/esm2022/components/empty-state/empty-state.model.mjs +1 -1
- package/esm2022/components/field/field.component.mjs +3 -3
- package/esm2022/components/field/field.component.module.mjs +1 -1
- package/esm2022/components/field/field.model.mjs +1 -1
- package/esm2022/components/file-upload/file-upload.component.module.mjs +1 -1
- package/esm2022/components/filter-button/filter-button.component.module.mjs +1 -1
- package/esm2022/components/filter-button/filter-button.model.mjs +1 -1
- package/esm2022/components/gaussian-chart/gaussian-chart.component.mjs +3 -3
- package/esm2022/components/gaussian-chart/gaussian-chart.module.mjs +1 -1
- package/esm2022/components/icon/icon.component.mjs +3 -3
- package/esm2022/components/icon/icon.component.module.mjs +1 -1
- package/esm2022/components/icon/icon.model.mjs +1 -1
- package/esm2022/components/icon-label/icon-label.component.mjs +3 -3
- package/esm2022/components/icon-label/icon-label.component.module.mjs +1 -1
- package/esm2022/components/logo/logo.component.mjs +3 -3
- package/esm2022/components/logo/logo.component.module.mjs +1 -1
- package/esm2022/components/logo/logo.model.mjs +1 -1
- package/esm2022/components/media-card/media-card.component.mjs +3 -3
- package/esm2022/components/multi-input/multi-input.component.mjs +3 -3
- package/esm2022/components/multi-input/multi-input.component.module.mjs +1 -1
- package/esm2022/components/multi-input/multi-input.model.mjs +1 -1
- package/esm2022/components/navbar/mobile-navbar-side-sheet/mobile-navbar-side-sheet.component.mjs +3 -3
- package/esm2022/components/navbar/navbar.component.mjs +3 -3
- package/esm2022/components/navbar/navbar.component.module.mjs +1 -1
- package/esm2022/components/navbar/navbar.model.mjs +1 -1
- package/esm2022/components/overflow-menu/overflow-menu.component.module.mjs +1 -1
- package/esm2022/components/overflow-menu/overflow-menu.model.mjs +1 -1
- package/esm2022/components/page-header/page-header.component.mjs +3 -3
- package/esm2022/components/page-header/page-header.component.module.mjs +1 -1
- package/esm2022/components/paginator/paginator.component.mjs +3 -3
- package/esm2022/components/paginator/paginator.component.module.mjs +1 -1
- package/esm2022/components/password-criteria/password.component.mjs +3 -3
- package/esm2022/components/password-criteria/password.component.module.mjs +1 -1
- package/esm2022/components/password-strength/password-strength.component.mjs +3 -3
- package/esm2022/components/password-strength/password-strength.component.module.mjs +1 -1
- package/esm2022/components/phone-input/join-strings.pipe.mjs +1 -1
- package/esm2022/components/phone-input/phone-input.component.mjs +3 -3
- package/esm2022/components/phone-input/phone-input.component.module.mjs +1 -1
- package/esm2022/components/phone-input/phone-input.model.mjs +1 -1
- package/esm2022/components/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2022/components/progress-bar/progress-bar.component.module.mjs +1 -1
- package/esm2022/components/radial-progress/radial-progress.component.mjs +3 -3
- package/esm2022/components/radial-progress/radial-progress.component.module.mjs +1 -1
- package/esm2022/components/radial-progress/radial-progress.model.mjs +1 -1
- package/esm2022/components/radio-button/radio-button.component.mjs +3 -3
- package/esm2022/components/radio-button/radio-button.component.module.mjs +1 -1
- package/esm2022/components/radio-button/radio-button.model.mjs +1 -1
- package/esm2022/components/rating/half-star.pipe.mjs +1 -1
- package/esm2022/components/rating/rating.component.mjs +3 -3
- package/esm2022/components/rating/rating.component.module.mjs +1 -1
- package/esm2022/components/scale/scale.component.module.mjs +1 -1
- package/esm2022/components/segmented-bar/segmented-bar.component.mjs +3 -3
- package/esm2022/components/segmented-bar/segmented-bar.model.mjs +1 -1
- package/esm2022/components/segmented-button/segmented-button.component.mjs +1 -1
- package/esm2022/components/segmented-button/segmented-button.component.module.mjs +1 -1
- package/esm2022/components/segmented-button/segmented-button.model.mjs +1 -1
- package/esm2022/components/side-panel/side-panel.animations.mjs +1 -1
- package/esm2022/components/side-sheet/side-sheet.component.mjs +3 -3
- package/esm2022/components/side-sheet/side-sheet.component.module.mjs +1 -1
- package/esm2022/components/side-sheet/side-sheet.model.mjs +1 -1
- package/esm2022/components/side-sheet/side-sheet.service.mjs +1 -1
- package/esm2022/components/skeleton/skeleton.component.mjs +3 -3
- package/esm2022/components/skeleton/skeleton.model.mjs +1 -1
- package/esm2022/components/slider/slider.component.mjs +3 -3
- package/esm2022/components/slider/slider.component.module.mjs +1 -1
- package/esm2022/components/slider/slider.model.mjs +1 -1
- package/esm2022/components/snackbar/snackbar.component.mjs +3 -3
- package/esm2022/components/snackbar/snackbar.component.module.mjs +1 -1
- package/esm2022/components/snackbar/snackbar.model.mjs +1 -1
- package/esm2022/components/snackbar/snackbar.service.mjs +1 -1
- package/esm2022/components/spider-chart/spider-chart.component.mjs +3 -3
- package/esm2022/components/spider-chart/spider-chart.model.mjs +1 -1
- package/esm2022/components/spider-chart/spider-chart.module.mjs +1 -1
- package/esm2022/components/spinner/spinner.model.mjs +1 -1
- package/esm2022/components/step/step.component.mjs +23 -3
- package/esm2022/components/step/step.component.module.mjs +5 -4
- package/esm2022/components/stepper/stepper.component.mjs +19 -5
- package/esm2022/components/stepper/stepper.component.module.mjs +1 -1
- package/esm2022/components/stepper/stepper.model.mjs +1 -1
- package/esm2022/components/table/sentence-case.pipe.mjs +1 -1
- package/esm2022/components/table/table.component.mjs +3 -3
- package/esm2022/components/table/table.component.module.mjs +1 -1
- package/esm2022/components/table/table.model.mjs +1 -1
- package/esm2022/components/tabs/tabs.component.module.mjs +1 -1
- package/esm2022/components/tag/tag.component.mjs +3 -3
- package/esm2022/components/tag/tag.component.module.mjs +1 -1
- package/esm2022/components/tag/tag.model.mjs +1 -1
- package/esm2022/components/toggle/toggle.component.mjs +3 -3
- package/esm2022/components/toggle/toggle.component.module.mjs +1 -1
- package/esm2022/components/toggle/toggle.model.mjs +1 -1
- package/esm2022/components/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/components/tooltip/tooltip.model.mjs +1 -1
- package/esm2022/components/universal-skills-report/universal-skills-report.component.mjs +3 -3
- package/esm2022/components/universal-skills-report/universal-skills-report.component.module.mjs +1 -1
- package/esm2022/components/universal-skills-spider-charts/universal-skills-spider-charts.component.mjs +3 -3
- package/esm2022/components/universal-skills-spider-charts/universal-skills-spider-charts.component.module.mjs +1 -1
- package/esm2022/components/validation-error/validation-error.component.mjs +3 -3
- package/esm2022/components/validation-error/validation-error.model.mjs +1 -1
- package/esm2022/components/validation-error/validation-error.module.mjs +1 -1
- package/esm2022/directives/digits-only.directive.mjs +1 -1
- package/esm2022/directives/drag-drop.directive.mjs +1 -1
- package/esm2022/directives/dynamic-component.directive.mjs +1 -1
- package/esm2022/directives/ellipse-text.directive.mjs +1 -1
- package/esm2022/directives/select-text.directive.mjs +1 -1
- package/esm2022/directives/step-line-element.directive.mjs +1 -1
- package/esm2022/models/application-theme.model.mjs +1 -1
- package/esm2022/models/checkbox.model.mjs +1 -1
- package/esm2022/models/colors.model.mjs +1 -1
- package/esm2022/models/keyboard-events.model.mjs +1 -1
- package/esm2022/models/screen-breakpoints.model.mjs +2 -1
- package/esm2022/models/universal-skills-report.model.mjs +1 -1
- package/esm2022/pipes/data-property-getter.mjs +1 -1
- package/esm2022/pipes/has-validation-error.pipe.mjs +1 -1
- package/esm2022/pipes/memoize-func.pipe.mjs +1 -1
- package/esm2022/pipes/name-initials.pipe.mjs +1 -1
- package/esm2022/pipes/ui-ordinal-suffix.pipe.mjs +1 -1
- package/esm2022/pipes/ui-translate.pipe.mjs +1 -1
- package/esm2022/providers/is-large-tablet.mjs +11 -0
- package/esm2022/services/icons.service.mjs +1 -1
- package/esm2022/services/universal-skills.service.mjs +1 -1
- package/esm2022/utils/alert-bar.model.mjs +1 -1
- package/esm2022/utils/alert-bars.utils.mjs +1 -1
- package/esm2022/utils/autocomplete-utils.mjs +2 -2
- package/esm2022/utils/color-contrast.mjs +1 -1
- package/esm2022/utils/hex-to-rgb.mjs +1 -1
- package/esm2022/utils/localization/language.model.mjs +1 -1
- package/esm2022/utils/localization/language.service.mjs +1 -1
- package/esm2022/utils/table.utils.mjs +1 -1
- package/fesm2022/testgorilla-tgo-ui.mjs +143 -102
- package/fesm2022/testgorilla-tgo-ui.mjs.map +1 -1
- package/models/screen-breakpoints.model.d.ts +2 -1
- package/package.json +1 -1
- package/projects/tgo-canopy-ui/assets/i18n/da-dk.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/de.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/es.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/fr.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/it-it.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/ja-jp.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/nb-no.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/nl.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/pl-pl.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/pt-br.json +180 -180
- package/projects/tgo-canopy-ui/assets/i18n/sv-se.json +180 -180
- package/projects/tgo-canopy-ui/assets/icons/Add.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Archive.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Arrow_down.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Arrow_left.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Arrow_right.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Arrow_up.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Assessment.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Attempts.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Book.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Calendar.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Candidates.svg +8 -8
- package/projects/tgo-canopy-ui/assets/icons/Chat-notifications.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Chat.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Check.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Clone.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Close.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Code.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Company.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Copy.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Custom-questions.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Delete.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Devices.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Document.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Dot.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Download.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Edit.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Email-message.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Employee.svg +8 -8
- package/projects/tgo-canopy-ui/assets/icons/Empty-placeholder.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Error.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Essay.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Eye-hide.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Eye-view.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Fast-forward.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Fast-rewind.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Feedback-1.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Feedback-2.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Feedback-3.svg +6 -6
- package/projects/tgo-canopy-ui/assets/icons/Feedback-4.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Feedback-5.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/File-attach.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/File-upload.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Filter.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Fire.svg +10 -10
- package/projects/tgo-canopy-ui/assets/icons/Folder.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-add-file.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-add-table.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-align-L.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-align-R.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-align-center.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-align-justify.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-bold.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-code-active.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-code-block.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-edit-table.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-format.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-function.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-italics.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-list-bulleted.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-list-numbered.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-picker.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-quote.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-subscript.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-superscript.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-text-direction-L.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-text-direction-R.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-text-size.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-underline.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Format-variable.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Full-screen.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Gender-female.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Gender-male.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Gift.svg +7 -7
- package/projects/tgo-canopy-ui/assets/icons/Google.svg +6 -6
- package/projects/tgo-canopy-ui/assets/icons/Grab.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Help-2.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Help.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Image.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Info.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Integration.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Language.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Layout.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Learn.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Level.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Light-bulb.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Link.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Loading-spinner.svg +10 -10
- package/projects/tgo-canopy-ui/assets/icons/Localisation.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Location.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Lock.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Log-out.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Menu-burger.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Menu-ellipsis.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Microphone.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Minimize.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Minus.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Money-bag.svg +5 -5
- package/projects/tgo-canopy-ui/assets/icons/Mouse-cursor.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Mouse-grab-cursor.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Mouse.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Multi-choice.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Notifications.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Password.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Path.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Pin-marker.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Plan-billing.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Plus.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Premium.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Promotion.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Question-count.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Refer.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Reset.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Review.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Round-check-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Round-check.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Search.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Secure-checkout.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Send.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Settings.svg +8 -8
- package/projects/tgo-canopy-ui/assets/icons/Share.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Skip-next.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Skip-previous.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/Social-facebook.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Social-instagram.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Social-linkedin.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Sorting-down-1.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Sorting-down.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Sparkles.svg +18 -18
- package/projects/tgo-canopy-ui/assets/icons/Speedometer.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Star-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Star-half.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Star-outline.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Suitcase.svg +6 -6
- package/projects/tgo-canopy-ui/assets/icons/Support.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Sync.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Team.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Test.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/TestGorilla.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/Thunder.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Timer.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Trophy.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Type.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Unarchive.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Unlock.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Upgrade.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Upload.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/User-access.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/User-add.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/User-invite.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/User-profile.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/User-reject.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/User-switch.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Video-pause.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Video-play.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Video-record.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Video-stop.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Video.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Volume.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Warning.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/Zoom-in.svg +6 -6
- package/projects/tgo-canopy-ui/assets/icons/Zoom-out.svg +5 -5
- package/projects/tgo-canopy-ui/assets/icons/rating-icons/Star-filled-disabled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rating-icons/Star-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rating-icons/Star-half.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rating-icons/Star-outline.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Add-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Add-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Archive-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Archive-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-down-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-down-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-left-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-left-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-right-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-right-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-up-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-chevron-up-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-down-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-down-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-up-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Arrow-up-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Assessment-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Assessment-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Attach-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Attach-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Attempts-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Attempts-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Book-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Book-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Calendar-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Calendar-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Candidates-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Candidates-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Chat-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Chat-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Check-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Check-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Check-round-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Check-round-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Circle-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Circle-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Clone-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Clone-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Close-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Close-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Code-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Code-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Company-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Company-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Copy-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Copy-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Delete-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Delete-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Devices-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Devices-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Disconnected-in-line.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Document-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Document-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Dot-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Dot-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Download-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Download-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Edit-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Edit-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Edit-text-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Edit-text-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Employee-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Employee-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Empty-search-in-line.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Error-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Error-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Essay-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Essay-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Experience-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Experience-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Facebook-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Facebook-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Fast-forward-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Fast-forward-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Fast-rewind-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Fast-rewind-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Filter-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Filter-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Fire-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Fire-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Folder-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Folder-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Full-screen-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Full-screen-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Gender-female-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Gender-female-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Gender-male-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Gender-male-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Gift-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Gift-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Google-filled.svg +6 -6
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Google-in-line.svg +6 -6
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Grab-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Grab-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Help-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Help-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Hide-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Hide-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Image-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Image-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Info-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Info-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Instagram-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Instagram-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Integration-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Integration-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Invite-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Invite-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Language-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Language-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Layout-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Layout-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Learn-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Learn-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Level-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Level-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Light-bulb-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Light-bulb-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Link-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Link-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Linkedin-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Linkedin-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Localization-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Localization-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Location-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Location-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Lock-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Lock-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Logout-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Logout-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Lost-found-404-in-line.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Medal-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Medal-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Menu-burger-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Menu-burger-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Menu-ellipsis-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Menu-ellipsis-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Mic-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Mic-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Minimize-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Minimize-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Minus-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Minus-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Mouse-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Mouse-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Multi-choice-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Multi-choice-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Notification-bell-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Notification-bell-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Password-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Password-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Path-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Path-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Pause-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Pause-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Pin-marker-filled.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Pin-marker-in-line.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Plan-billing-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Plan-billing-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Play-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Play-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Plus-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Plus-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Premium-circle-in-line.svg +5 -5
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Premium-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Premium-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Question-count-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Question-count-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Question-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Question-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Record-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Record-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Refer-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Refer-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Reject-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Reject-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Reset-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Reset-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-1-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-1-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-2-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-2-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-3-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-3-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-4-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-4-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-5-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-emoji-5-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-half-star-filled.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-half-star-in-line.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-star-filled-disabled.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-star-filled.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Review-star-in-line.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Round-check-in-line.svg +4 -4
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Search-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Search-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Secure-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Secure-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Send-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Send-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Settings-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Settings-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Share-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Share-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Skip-next-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Skip-next-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Skip-previous-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Skip-previous-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Sparkle-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Sparkle-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Speedometer-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Speedometer-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Star-filled.svg +5 -5
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Star-in-line.svg +5 -5
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Stop-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Stop-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Switch-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Switch-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Sync-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Sync-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Team-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Team-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Test-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Test-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/TestGorilla-Pink-filled.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/TestGorilla-Pink-in-line.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/TestGorilla-filled.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/TestGorilla-in-line.svg +11 -11
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Timer-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Timer-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Trophy-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Trophy-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Type-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Type-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Unarchive-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Unarchive-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Unlock-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Unlock-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Upgrade-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Upgrade-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Upload-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Upload-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/User-access-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/User-access-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/User-add-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/User-add-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/User-profile-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/User-profile-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Validated-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Validated-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Verified-badge-filled.svg +23 -23
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Verified-badge-in-line.svg +23 -23
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Video-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Video-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/View-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/View-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Volume-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Volume-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Warning-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Warning-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Zoom-in-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Zoom-in-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Zoom-out-filled.svg +3 -3
- package/projects/tgo-canopy-ui/assets/icons/rebrand/Zoom-out-in-line.svg +3 -3
- package/projects/tgo-canopy-ui/assets/images/empty-state-default.svg +9 -9
- package/projects/tgo-canopy-ui/assets/images/poweredbyTG.svg +37 -37
- package/projects/tgo-canopy-ui/assets/images/premium.svg +5 -5
- package/projects/tgo-canopy-ui/assets/images/rebrand-last-step-icon-black.svg +3 -3
- package/projects/tgo-canopy-ui/assets/images/rebrand-last-step-icon-light.svg +3 -3
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/powered-by.svg +22 -22
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/primary_brandmark_pink.svg +10 -10
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/primary_lockup_pink.svg +22 -22
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/primary_wordmark_pink.svg +21 -21
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/secondary_brandmark_black.svg +11 -11
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/secondary_brandmark_cream.svg +11 -11
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/secondary_lockup_black.svg +23 -23
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/secondary_lockup_cream.svg +23 -23
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/secondary_wordmark_black.svg +21 -21
- package/projects/tgo-canopy-ui/assets/images/rebrand-logo/secondary_wordmark_cream.svg +21 -21
- package/projects/tgo-canopy-ui/assets/images/reverseTG.svg +84 -84
- package/projects/tgo-canopy-ui/assets/images/step-finish.svg +6 -6
- package/projects/tgo-canopy-ui/assets/images/testgorilla.svg +76 -76
- package/projects/tgo-canopy-ui/theme/_alert-bars.scss +110 -110
- package/projects/tgo-canopy-ui/theme/_breakpoints-mixin.scss +12 -12
- package/projects/tgo-canopy-ui/theme/_button.scss +72 -72
- package/projects/tgo-canopy-ui/theme/_core.scss +19 -19
- package/projects/tgo-canopy-ui/theme/_font.scss +95 -95
- package/projects/tgo-canopy-ui/theme/_icon.scss +5 -5
- package/projects/tgo-canopy-ui/theme/_lib-styles.scss +35 -35
- package/projects/tgo-canopy-ui/theme/_mat-paginator.scss +59 -59
- package/projects/tgo-canopy-ui/theme/_variables.scss +163 -163
- package/projects/tgo-canopy-ui/theme/line-clamp.scss +8 -8
- package/projects/tgo-canopy-ui/theme/theme.scss +67 -67
- package/providers/is-large-tablet.d.ts +2 -0
|
@@ -685,11 +685,11 @@ export class AutocompleteComponent {
|
|
|
685
685
|
this.matAutocomplete._setScrollTop(this.matAutocomplete._keyManager.activeItemIndex * optionHeight);
|
|
686
686
|
}
|
|
687
687
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }, { token: i2.NgControl, optional: true, self: true }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i3.FocusMonitor }, { token: i0.DestroyRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
688
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AutocompleteComponent, selector: "ui-autocomplete", inputs: { itemsList: "itemsList", suggestionsList: "suggestionsList", disabled: "disabled", allowAdd: "allowAdd", textField: "textField", valueField: "valueField", label: "label", placeholder: "placeholder", itemValue: "itemValue", type: "type", minCharactersSearch: "minCharactersSearch", variant: "variant", showBottomContent: "showBottomContent", valuePrimitive: "valuePrimitive", fullWidth: "fullWidth", applicationTheme: "applicationTheme", required: "required", errors: "errors", companyColor: "companyColor", hideBuiltInErrors: "hideBuiltInErrors", hideLabelInErrors: "hideLabelInErrors", virtualScroll: ["virtualScroll", "virtualScroll", booleanAttribute], compareWith: "compareWith", dropdownPanelClass: "dropdownPanelClass", closeOnScroll: "closeOnScroll", size: "size", allowUserInput: "allowUserInput", clearable: "clearable", exactMatchSelect: "exactMatchSelect", maxItemSelected: "maxItemSelected", isDynamicFilteringEnabled: "isDynamicFilteringEnabled", dynamicFilterLoading: "dynamicFilterLoading", dynamicFilteredList: "dynamicFilteredList", infiniteScroll: "infiniteScroll", hasMoreOptionsForInfiniteScroll: "hasMoreOptionsForInfiniteScroll" }, outputs: { selectionChange: "selectionChange", searchTextChange: "searchTextChange", blur: "blur", focus: "focus", scrollViewportBottomReached: "scrollViewportBottomReached" }, host: { properties: { "class.full-width": "this.fullWidth", "attr.theme": "this.applicationTheme" } }, viewQueries: [{ propertyName: "formFieldElement", first: true, predicate: ["formField"], descendants: true }, { propertyName: "tagContainer", first: true, predicate: ["tagContainer"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["autocomplete"], descendants: true }, { propertyName: "matInput", first: true, predicate: ["matInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\n <mat-form-field\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' ')) ) ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\n >\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\n <div #formField class=\"input-container\">\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\"\n aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [uiPreventInput]=\"!allowUserInput\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n matInput\n [placeholder]=\"value && value.length ? '': placeholder\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n @if (size === 'small') {\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\n </div>\n } @else {\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\n <ui-tag [applicationTheme]=\"applicationTheme\"\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\n </div>\n }\n </div>\n </div>\n\n <ui-icon\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\n class=\"remove-selected\"\n [tabIndex]=\"disabled ? -1 : 0\"\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\n *ngIf=\"isDropdown\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"gotoUp()\"\n >\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"suggestionsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n\n @if (isGrouped) {\n @for (group of itemsList; track group) {\n\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n }\n }\n }\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [class]=\"'selected-option'\"\n [value]=\"value\"\n >\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-template #dropdownList>\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll || infiniteScroll; else defaultViewPort\" [itemSize]=\"48\"\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\n @if (!isGrouped) {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n\n @if(infiniteScroll && hasMoreOptionsForInfiniteScroll) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n }\n } @else {\n @for (group of itemsList; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n } }\n }\n\n </cdk-virtual-scroll-viewport>\n\n <ng-template #defaultViewPort>\n @if (!isGrouped) {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n } @else {\n @for (group of itemsList; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n }\n }\n }\n </ng-template>\n\n </ng-template>\n\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n @if (isGrouped && filteredItemsList.length) {\n @for (group of filteredItemsList; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.filteredItems\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.filteredItems\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n }\n }\n }\n\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length && !isGrouped; else showItemListWithGroup\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredItemsList.length && !isGrouped\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n @if(isDynamicFilteringEnabled && dynamicFilterLoading) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n } @else if(inputValue) {\n @if (allowAdd && !isAlreadyAdded) {\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\n </mat-option>\n }\n }\n </ng-container>\n </ng-container>\n }\n </mat-autocomplete>\n <mat-hint class=\"error\"\n *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\n <div class=\"errors\"\n *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\n </div>\n <ng-container *ngIf=\"safeErrors.length\">\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span [innerHTML]=\"error\"></span>\n </div>\n </ng-container>\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\n\n </mat-hint>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}.loading-option{display:flex}.loading-option .loading-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:absolute;top:0;left:0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i10.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "applicationTheme", "useFullIconName"] }, { kind: "component", type: i11.ValidationErrorComponent, selector: "ui-validation-error", inputs: ["ngControl", "touchedOn", "errorMessage", "label", "applicationTheme"] }, { kind: "directive", type: i12.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i12.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i12.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i13.PreventInputDirective, selector: "[uiPreventInput]", inputs: ["uiPreventInput"] }, { kind: "component", type: i14.SpinnerComponent, selector: "ui-spinner", inputs: ["size", "isLoader", "text", "applicationTheme", "iconName", "iconSize"] }, { kind: "directive", type: i15.SelectTextDirective, selector: "[selectText]", inputs: ["selectText"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i16.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i17.HasValidationErrorPipe, name: "hasValidationError" }, { kind: "pipe", type: i18.TransformItemPipe, name: "transformItem" }, { kind: "pipe", type: i19.IncludesPipe, name: "includes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
688
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AutocompleteComponent, selector: "ui-autocomplete", inputs: { itemsList: "itemsList", suggestionsList: "suggestionsList", disabled: "disabled", allowAdd: "allowAdd", textField: "textField", valueField: "valueField", label: "label", placeholder: "placeholder", itemValue: "itemValue", type: "type", minCharactersSearch: "minCharactersSearch", variant: "variant", showBottomContent: "showBottomContent", valuePrimitive: "valuePrimitive", fullWidth: "fullWidth", applicationTheme: "applicationTheme", required: "required", errors: "errors", companyColor: "companyColor", hideBuiltInErrors: "hideBuiltInErrors", hideLabelInErrors: "hideLabelInErrors", virtualScroll: ["virtualScroll", "virtualScroll", booleanAttribute], compareWith: "compareWith", dropdownPanelClass: "dropdownPanelClass", closeOnScroll: "closeOnScroll", size: "size", allowUserInput: "allowUserInput", clearable: "clearable", exactMatchSelect: "exactMatchSelect", maxItemSelected: "maxItemSelected", maxLength: "maxLength", isDynamicFilteringEnabled: "isDynamicFilteringEnabled", dynamicFilterLoading: "dynamicFilterLoading", dynamicFilteredList: "dynamicFilteredList", infiniteScroll: "infiniteScroll", hasMoreOptionsForInfiniteScroll: "hasMoreOptionsForInfiniteScroll" }, outputs: { selectionChange: "selectionChange", searchTextChange: "searchTextChange", blur: "blur", focus: "focus", scrollViewportBottomReached: "scrollViewportBottomReached" }, host: { properties: { "class.full-width": "this.fullWidth", "attr.theme": "this.applicationTheme" } }, viewQueries: [{ propertyName: "formFieldElement", first: true, predicate: ["formField"], descendants: true }, { propertyName: "tagContainer", first: true, predicate: ["tagContainer"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["autocomplete"], descendants: true }, { propertyName: "matInput", first: true, predicate: ["matInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container>\r\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\r\n <mat-form-field\r\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' ')) ) ? 'warn' : 'accent'\"\r\n [appearance]=\"'outline'\"\r\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\r\n >\r\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\r\n <div #formField class=\"input-container\">\r\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\"\r\n aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\r\n\r\n <input\r\n #trigger=\"matAutocompleteTrigger\"\r\n #matInput\r\n [maxLength]=\"maxLength\"\r\n [uiPreventInput]=\"!allowUserInput\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\r\n (blur)=\"refillInput()\"\r\n (focusin)=\"onFocus()\"\r\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\r\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\r\n matInput\r\n [placeholder]=\"value && value.length ? '': placeholder\"\r\n [type]=\"'text'\"\r\n [matAutocomplete]=\"autocomplete\"\r\n (input)=\"onInputChange($event)\"\r\n [(ngModel)]=\"inputValue\"\r\n />\r\n <div\r\n class=\"selected-items\"\r\n #tagContainer\r\n *ngIf=\"\r\n (type === autocompleteType.LARGE && this.value) ||\r\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\r\n \"\r\n >\r\n <ui-tag\r\n class=\"value-tag\"\r\n [id]=\"'ui-tag-' + i\"\r\n *ngFor=\"let valueItem of value; let i = index\"\r\n [label]=\"valueItem | transformItem: textField\"\r\n [allowClose]=\"true\"\r\n [applicationTheme]=\"applicationTheme\"\r\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\r\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\r\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\r\n [ngClass]=\"{\r\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\r\n }\"\r\n (close)=\"onOptionRemoved(valueItem)\"\r\n ></ui-tag>\r\n @if (size === 'small') {\r\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\r\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\r\n </div>\r\n } @else {\r\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\r\n <ui-tag [applicationTheme]=\"applicationTheme\"\r\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ui-icon\r\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\r\n class=\"remove-selected\"\r\n [tabIndex]=\"disabled ? -1 : 0\"\r\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\r\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\r\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\r\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\r\n [size]=\"'24'\"\r\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\r\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\r\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\r\n ></ui-icon>\r\n\r\n <ui-icon\r\n class=\"arrow-state\"\r\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\r\n *ngIf=\"isDropdown\"\r\n [size]=\"'24'\"\r\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\r\n (click)=\"onChevronClick(autocomplete)\"\r\n ></ui-icon>\r\n\r\n\r\n <mat-autocomplete\r\n #autocomplete\r\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\r\n (optionSelected)=\"onOptionSelected($event)\"\r\n [disableRipple]=\"applicationTheme !== 'classic'\"\r\n [hideSingleSelectionIndicator]=\"false\"\r\n (opened)=\"gotoUp()\"\r\n >\r\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\r\n <ng-container *ngIf=\"!(searchResult$ | async)\">\r\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\r\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"suggestionsList.length\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\r\n *ngFor=\"let suggested of suggestionsList\"\r\n [value]=\"suggested\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n\r\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of value\"\r\n [value]=\"item\"\r\n >\r\n <span>{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n\r\n\r\n @if (isGrouped) {\r\n @for (group of itemsList; track group) {\r\n\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n }\r\n }\r\n }\r\n\r\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [class]=\"'selected-option'\"\r\n [value]=\"value\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n </ng-container>\r\n\r\n <ng-template #dropdownList>\r\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll || infiniteScroll; else defaultViewPort\" [itemSize]=\"48\"\r\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\r\n @if (!isGrouped) {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *cdkVirtualFor=\"let item of itemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n\r\n @if(infiniteScroll && hasMoreOptionsForInfiniteScroll) {\r\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\r\n <div class=\"loading-container\">\r\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\r\n </div>\r\n </mat-option>\r\n }\r\n } @else {\r\n @for (group of itemsList; track group) {\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *cdkVirtualFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *cdkVirtualFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n } }\r\n }\r\n\r\n </cdk-virtual-scroll-viewport>\r\n\r\n <ng-template #defaultViewPort>\r\n @if (!isGrouped) {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of itemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n } @else {\r\n @for (group of itemsList; track group) {\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n }\r\n }\r\n }\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\r\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\r\n @if (isGrouped && filteredItemsList.length) {\r\n @for (group of filteredItemsList; track group) {\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.filteredItems\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.filteredItems\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n }\r\n }\r\n }\r\n\r\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"filteredSuggestionList.length\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of filteredSuggestionList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n\r\n <ng-container *ngIf=\"!filteredSuggestionList.length && !isGrouped; else showItemListWithGroup\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of filteredItemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </ng-container>\r\n\r\n <ng-template #showItemListWithGroup>\r\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"filteredItemsList.length && !isGrouped\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of filteredItemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n </ng-template>\r\n\r\n @if(isDynamicFilteringEnabled && dynamicFilterLoading) {\r\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\r\n <div class=\"loading-container\">\r\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\r\n </div>\r\n </mat-option>\r\n } @else if(inputValue) {\r\n @if (allowAdd && !isAlreadyAdded) {\r\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\r\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\r\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\r\n </mat-option>\r\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\r\n <mat-option [style.pointer-events]=\"'none'\">\r\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\r\n </mat-option>\r\n }\r\n }\r\n </ng-container>\r\n </ng-container>\r\n }\r\n </mat-autocomplete>\r\n <mat-hint class=\"error\"\r\n *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\r\n <div class=\"errors\"\r\n *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\r\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\r\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\r\n </div>\r\n <ng-container *ngIf=\"safeErrors.length\">\r\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\r\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\r\n <span [innerHTML]=\"error\"></span>\r\n </div>\r\n </ng-container>\r\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\r\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\r\n\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n</ng-container>\r\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}.loading-option{display:flex}.loading-option .loading-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:absolute;top:0;left:0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i10.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "applicationTheme", "useFullIconName"] }, { kind: "component", type: i11.ValidationErrorComponent, selector: "ui-validation-error", inputs: ["ngControl", "touchedOn", "errorMessage", "label", "applicationTheme"] }, { kind: "directive", type: i12.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i12.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i12.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i13.PreventInputDirective, selector: "[uiPreventInput]", inputs: ["uiPreventInput"] }, { kind: "component", type: i14.SpinnerComponent, selector: "ui-spinner", inputs: ["size", "isLoader", "text", "applicationTheme", "iconName", "iconSize"] }, { kind: "directive", type: i15.SelectTextDirective, selector: "[selectText]", inputs: ["selectText"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i16.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i17.HasValidationErrorPipe, name: "hasValidationError" }, { kind: "pipe", type: i18.TransformItemPipe, name: "transformItem" }, { kind: "pipe", type: i19.IncludesPipe, name: "includes" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
689
689
|
}
|
|
690
690
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteComponent, decorators: [{
|
|
691
691
|
type: Component,
|
|
692
|
-
args: [{ selector: 'ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\n <mat-form-field\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' ')) ) ? 'warn' : 'accent'\"\n [appearance]=\"'outline'\"\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\n >\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\n <div #formField class=\"input-container\">\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\"\n aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\n\n <input\n #trigger=\"matAutocompleteTrigger\"\n #matInput\n [uiPreventInput]=\"!allowUserInput\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\n (blur)=\"refillInput()\"\n (focusin)=\"onFocus()\"\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n matInput\n [placeholder]=\"value && value.length ? '': placeholder\"\n [type]=\"'text'\"\n [matAutocomplete]=\"autocomplete\"\n (input)=\"onInputChange($event)\"\n [(ngModel)]=\"inputValue\"\n />\n <div\n class=\"selected-items\"\n #tagContainer\n *ngIf=\"\n (type === autocompleteType.LARGE && this.value) ||\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\n \"\n >\n <ui-tag\n class=\"value-tag\"\n [id]=\"'ui-tag-' + i\"\n *ngFor=\"let valueItem of value; let i = index\"\n [label]=\"valueItem | transformItem: textField\"\n [allowClose]=\"true\"\n [applicationTheme]=\"applicationTheme\"\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\n [ngClass]=\"{\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\n }\"\n (close)=\"onOptionRemoved(valueItem)\"\n ></ui-tag>\n @if (size === 'small') {\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\n </div>\n } @else {\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\n <ui-tag [applicationTheme]=\"applicationTheme\"\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\n </div>\n }\n </div>\n </div>\n\n <ui-icon\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\n class=\"remove-selected\"\n [tabIndex]=\"disabled ? -1 : 0\"\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\n [size]=\"'24'\"\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\n ></ui-icon>\n\n <ui-icon\n class=\"arrow-state\"\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\n *ngIf=\"isDropdown\"\n [size]=\"'24'\"\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\n (click)=\"onChevronClick(autocomplete)\"\n ></ui-icon>\n\n\n <mat-autocomplete\n #autocomplete\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\n (optionSelected)=\"onOptionSelected($event)\"\n [disableRipple]=\"applicationTheme !== 'classic'\"\n [hideSingleSelectionIndicator]=\"false\"\n (opened)=\"gotoUp()\"\n >\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\n <ng-container *ngIf=\"!(searchResult$ | async)\">\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"suggestionsList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\n *ngFor=\"let suggested of suggestionsList\"\n [value]=\"suggested\"\n >\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of value\"\n [value]=\"item\"\n >\n <span>{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n\n @if (isGrouped) {\n @for (group of itemsList; track group) {\n\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n }\n }\n }\n\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [class]=\"'selected-option'\"\n [value]=\"value\"\n >\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-container>\n\n <ng-template #dropdownList>\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll || infiniteScroll; else defaultViewPort\" [itemSize]=\"48\"\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\n @if (!isGrouped) {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n\n @if(infiniteScroll && hasMoreOptionsForInfiniteScroll) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n }\n } @else {\n @for (group of itemsList; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *cdkVirtualFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n } }\n }\n\n </cdk-virtual-scroll-viewport>\n\n <ng-template #defaultViewPort>\n @if (!isGrouped) {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of itemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n } @else {\n @for (group of itemsList; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.items\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n }\n }\n }\n </ng-template>\n\n </ng-template>\n\n </ng-container>\n\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\n @if (isGrouped && filteredItemsList.length) {\n @for (group of filteredItemsList; track group) {\n @if (group.groupName) {\n <mat-optgroup [label]=\"group.groupName\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.filteredItems\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n } @else {\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of group.filteredItems\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n }\n }\n }\n\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredSuggestionList.length\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredSuggestionList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n\n <ng-container *ngIf=\"!filteredSuggestionList.length && !isGrouped; else showItemListWithGroup\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </ng-container>\n\n <ng-template #showItemListWithGroup>\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\n *ngIf=\"filteredItemsList.length && !isGrouped\">\n <mat-option\n (mousedown)=$event.preventDefault()\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\n *ngFor=\"let item of filteredItemsList\"\n [value]=\"item\"\n >\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\n <ui-icon [applicationTheme]=\"applicationTheme\"\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\n </mat-option>\n </mat-optgroup>\n </ng-template>\n\n @if(isDynamicFilteringEnabled && dynamicFilterLoading) {\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\n <div class=\"loading-container\">\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\n </div>\n </mat-option>\n } @else if(inputValue) {\n @if (allowAdd && !isAlreadyAdded) {\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\n </mat-option>\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\n <mat-option [style.pointer-events]=\"'none'\">\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\n </mat-option>\n }\n }\n </ng-container>\n </ng-container>\n }\n </mat-autocomplete>\n <mat-hint class=\"error\"\n *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\n <div class=\"errors\"\n *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\n </div>\n <ng-container *ngIf=\"safeErrors.length\">\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\n <span [innerHTML]=\"error\"></span>\n </div>\n </ng-container>\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\n\n </mat-hint>\n </mat-form-field>\n </div>\n</ng-container>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}.loading-option{display:flex}.loading-option .loading-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:absolute;top:0;left:0}\n"] }]
|
|
692
|
+
args: [{ selector: 'ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\r\n <div class=\"autocomplete-wrapper\" [ngClass]=\"{ 'full-width': fullWidth, disabled: disabled }\">\r\n <mat-form-field\r\n [color]=\"(safeErrors.length || (ngControl?.errors && ngControl?.touched ) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' ')) ) ? 'warn' : 'accent'\"\r\n [appearance]=\"'outline'\"\r\n [ngClass]=\"{ 'large-size': type === autocompleteType.LARGE, 'hide-bottom-content': !showBottomContent, 'keyboard-focused': keyboardFocused(), 'has-label': !!label }\"\r\n >\r\n <mat-label *ngIf=\"label\">{{ label }} <span *ngIf=\"required\">*</span></mat-label>\r\n <div #formField class=\"input-container\">\r\n <span style=\"position: absolute; left: -9999px\" *ngIf=\"textField ? value?.[textField] : value === inputValue\"\r\n aria-live=\"polite\">{{ (('SELECTED') | uiTranslate | async) + ' ' + inputValue }}</span>\r\n\r\n <input\r\n #trigger=\"matAutocompleteTrigger\"\r\n #matInput\r\n [maxLength]=\"maxLength\"\r\n [uiPreventInput]=\"!allowUserInput\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"{ 'unset-margin': this.value && type === autocompleteType.LARGE, 'no-caret': !allowUserInput }\"\r\n (blur)=\"refillInput()\"\r\n (focusin)=\"onFocus()\"\r\n [attr.aria-label]=\"((translationContext + 'SELECTED') | uiTranslate | async) + ' ' + (value | transformItem: textField : true)\"\r\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\r\n matInput\r\n [placeholder]=\"value && value.length ? '': placeholder\"\r\n [type]=\"'text'\"\r\n [matAutocomplete]=\"autocomplete\"\r\n (input)=\"onInputChange($event)\"\r\n [(ngModel)]=\"inputValue\"\r\n />\r\n <div\r\n class=\"selected-items\"\r\n #tagContainer\r\n *ngIf=\"\r\n (type === autocompleteType.LARGE && this.value) ||\r\n (!(inputValue && this.isInputFocus) && this.value && type !== autocompleteType.SINGLE)\r\n \"\r\n >\r\n <ui-tag\r\n class=\"value-tag\"\r\n [id]=\"'ui-tag-' + i\"\r\n *ngFor=\"let valueItem of value; let i = index\"\r\n [label]=\"valueItem | transformItem: textField\"\r\n [allowClose]=\"true\"\r\n [applicationTheme]=\"applicationTheme\"\r\n [style.opacity]=\"type === autocompleteType.MULTI ? inputOpacity : 1\"\r\n [style.display]=\"(isOverLapping && i > 0 && i >= overlapIndex) || (size === 'small' && value.length > 1) ? 'none' : 'block'\"\r\n [ngStyle]=\"{ '--tag-max-width': type === autocompleteType.LARGE ? 'fit-content' : firstTagMaxWidth + 'px' }\"\r\n [ngClass]=\"{\r\n 'overlap-tag': isOverlapChecking && overlapIndex && i >= overlapIndex && type === autocompleteType.MULTI\r\n }\"\r\n (close)=\"onOptionRemoved(valueItem)\"\r\n ></ui-tag>\r\n @if (size === 'small') {\r\n <div class=\"selected-count\" *ngIf=\"value.length > 1\">\r\n {{ (translationContext + 'SELECTED_AMOUNT' | uiTranslate : { numberSelected: (value | slice: overlapIndex).length }) | async }}\r\n </div>\r\n } @else {\r\n <div *ngIf=\"value.length > 1 && isOverLapping\" class=\"overlap-count\">\r\n <ui-tag [applicationTheme]=\"applicationTheme\"\r\n [label]=\"'+' + (value.length - overlapIndex)\"></ui-tag>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ui-icon\r\n *ngIf=\"clearable && (type === autocompleteType.SINGLE && (value?.length || hasObjectValue)) || (type !== autocompleteType.SINGLE && value && value.length > 1 && ((AutocompleteUtils.isPrimitive(value) && value.length) || (!AutocompleteUtils.isPrimitive(value) && (AutocompleteUtils.isArray(value) && value.length || !AutocompleteUtils.isArray(value) && !value.length))))\"\r\n class=\"remove-selected\"\r\n [tabIndex]=\"disabled ? -1 : 0\"\r\n (keydown.enter)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\r\n (keydown.space)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\r\n [ngClass]=\"{ 'large-input-icon': type === autocompleteType.LARGE }\"\r\n (click)=\"onClear();$event.preventDefault();$event.stopPropagation()\"\r\n [size]=\"'24'\"\r\n [color]=\"applicationTheme === 'classic' ? 'inherit' : 'rebrand-black'\"\r\n [attr.aria-label]=\"('COMMON.CLEAR') | uiTranslate | async\"\r\n [name]=\"applicationTheme === 'classic' ? 'Close' : 'Close-in-line'\"\r\n ></ui-icon>\r\n\r\n <ui-icon\r\n class=\"arrow-state\"\r\n [ngClass]=\"{ opened: autocomplete.isOpen, 'large-input-icon': type === autocompleteType.LARGE }\"\r\n *ngIf=\"isDropdown\"\r\n [size]=\"'24'\"\r\n [name]=\"applicationTheme !== 'classic' ? 'Arrow-chevron-down-in-line' : 'Arrow_down'\"\r\n (click)=\"onChevronClick(autocomplete)\"\r\n ></ui-icon>\r\n\r\n\r\n <mat-autocomplete\r\n #autocomplete\r\n [class]=\"applicationTheme + ' ' + dropdownPanelClass\"\r\n (optionSelected)=\"onOptionSelected($event)\"\r\n [disableRipple]=\"applicationTheme !== 'classic'\"\r\n [hideSingleSelectionIndicator]=\"false\"\r\n (opened)=\"gotoUp()\"\r\n >\r\n @if (type !== autocompleteType.MULTI || value?.length < maxItemSelected) {\r\n <ng-container *ngIf=\"!(searchResult$ | async)\">\r\n <ng-container *ngIf=\"!isDropdown; else dropdownList\">\r\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"suggestionsList.length\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': suggested | includes: value : valueField }\"\r\n *ngFor=\"let suggested of suggestionsList\"\r\n [value]=\"suggested\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ suggested | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n\r\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"value?.length && type !== autocompleteType.SINGLE\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of value\"\r\n [value]=\"item\"\r\n >\r\n <span>{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n\r\n\r\n @if (isGrouped) {\r\n @for (group of itemsList; track group) {\r\n\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n }\r\n }\r\n }\r\n\r\n <mat-optgroup [label]=\"((translationContext + 'SELECTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"value?.length && type === autocompleteType.SINGLE\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [class]=\"'selected-option'\"\r\n [value]=\"value\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ value | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n </ng-container>\r\n\r\n <ng-template #dropdownList>\r\n <cdk-virtual-scroll-viewport *ngIf=\"virtualScroll || infiniteScroll; else defaultViewPort\" [itemSize]=\"48\"\r\n [style.height]=\"'200px'\" class=\"virtual-scroll\">\r\n @if (!isGrouped) {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *cdkVirtualFor=\"let item of itemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n\r\n @if(infiniteScroll && hasMoreOptionsForInfiniteScroll) {\r\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\r\n <div class=\"loading-container\">\r\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\r\n </div>\r\n </mat-option>\r\n }\r\n } @else {\r\n @for (group of itemsList; track group) {\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *cdkVirtualFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *cdkVirtualFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n } }\r\n }\r\n\r\n </cdk-virtual-scroll-viewport>\r\n\r\n <ng-template #defaultViewPort>\r\n @if (!isGrouped) {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of itemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n } @else {\r\n @for (group of itemsList; track group) {\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.items\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n }\r\n }\r\n }\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"filteredSuggestionList$ | async as filteredSuggestionList\">\r\n <ng-container *ngIf=\"filteredItemsList$ | async as filteredItemsList\">\r\n @if (isGrouped && filteredItemsList.length) {\r\n @for (group of filteredItemsList; track group) {\r\n @if (group.groupName) {\r\n <mat-optgroup [label]=\"group.groupName\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.filteredItems\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n } @else {\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of group.filteredItems\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n }\r\n }\r\n }\r\n\r\n <mat-optgroup [label]=\"((translationContext + 'SUGGESTED') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"filteredSuggestionList.length\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of filteredSuggestionList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n\r\n <ng-container *ngIf=\"!filteredSuggestionList.length && !isGrouped; else showItemListWithGroup\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of filteredItemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </ng-container>\r\n\r\n <ng-template #showItemListWithGroup>\r\n <mat-optgroup [label]=\"((translationContext + 'ALL_ITEMS') | uiTranslate | async)! | uppercase\"\r\n *ngIf=\"filteredItemsList.length && !isGrouped\">\r\n <mat-option\r\n (mousedown)=$event.preventDefault()\r\n [ngClass]=\"{ 'selected-option': item | includes: value : valueField }\"\r\n *ngFor=\"let item of filteredItemsList\"\r\n [value]=\"item\"\r\n >\r\n <span [selectText]=\"userInput$ | async\">{{ item | transformItem: textField }}</span>\r\n <ui-icon [applicationTheme]=\"applicationTheme\"\r\n [name]=\"applicationTheme === 'classic' ? 'Check' : 'Check-in-line'\"></ui-icon>\r\n </mat-option>\r\n </mat-optgroup>\r\n </ng-template>\r\n\r\n @if(isDynamicFilteringEnabled && dynamicFilterLoading) {\r\n <mat-option class=\"loading-option\" [style.pointer-events]=\"'none'\">\r\n <div class=\"loading-container\">\r\n <ui-spinner size=\"small\" [isLoader]=\"false\"></ui-spinner>\r\n </div>\r\n </mat-option>\r\n } @else if(inputValue) {\r\n @if (allowAdd && !isAlreadyAdded) {\r\n <mat-option (mousedown)=$event.preventDefault() [value]=\"inputValue\">\r\n <span>{{ ('COMMON.ADD') | uiTranslate | async }}</span>\r\n <span class=\"add-suggestion\">\"{{ inputValue }}\"</span>\r\n </mat-option>\r\n } @else if (!filteredItemsList.length && !filteredSuggestionList.length) {\r\n <mat-option [style.pointer-events]=\"'none'\">\r\n <span>{{ (translationContext + 'NO_RESULTS_FOUND') | uiTranslate | async }}</span>\r\n </mat-option>\r\n }\r\n }\r\n </ng-container>\r\n </ng-container>\r\n }\r\n </mat-autocomplete>\r\n <mat-hint class=\"error\"\r\n *ngIf=\"safeErrors.length || (ngControl?.errors | hasValidationError) || (AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\r\n <div class=\"errors\"\r\n *ngIf=\"(AutocompleteUtils.isArray(value) && value.length) > maxItemSelected || ((AutocompleteUtils.isArray(value) && value.length) >= maxItemSelected && (inputValue && inputValue !== ' '))\">\r\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\r\n <span>{{ (translationContext + 'MAX_SELECTED_ERROR') | uiTranslate : { max: maxItemSelected } | async }}</span>\r\n </div>\r\n <ng-container *ngIf=\"safeErrors.length\">\r\n <div class=\"errors\" *ngFor=\"let error of safeErrors; trackBy: trackByFn\">\r\n <ui-icon [applicationTheme]=\"applicationTheme\" [name]=\"'Error'\"></ui-icon>\r\n <span [innerHTML]=\"error\"></span>\r\n </div>\r\n </ng-container>\r\n <ui-validation-error *ngIf=\"ngControl && !hideBuiltInErrors\" [ngControl]=\"ngControl\"\r\n [label]=\"hideLabelInErrors ? null : label\"></ui-validation-error>\r\n\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n</ng-container>\r\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{width:320px;display:block}:host.full-width{width:100%}:host ui-tag{height:32px;margin:4px}:host ui-tag ::ng-deep .tag-container{margin:0!important}:host ui-tag ::ng-deep .tag-wrapper{max-width:fit-content}.large-size input{margin:10px 0}.large-size .selected-items{margin:5px 0;flex-wrap:wrap}.large-size .input-container{display:flex;flex-direction:column-reverse}.large-size ::ng-deep .mat-mdc-form-field-infix,.large-size .mat-mdc-form-field-flex{align-items:unset!important}.disabled *{pointer-events:none}.input-container{width:100%;margin:auto;display:flex;flex-direction:row-reverse}.input-container .selected-items{display:flex;padding-left:4px}.input-container .selected-items .selected-count{white-space:nowrap}.input-container .selected-items .value-tag{max-width:var(--tag-max-width)}.input-container .selected-items .value-tag ::ng-deep .tag-container{max-width:var(--tag-max-width)}.input-container .selected-items .overlap-count{font-size:14px;line-height:20px}.input-container .selected-items .overlap-count ui-tag{display:block}.input-container .selected-items .overlap-tag{position:absolute;opacity:0}.input-container input{margin-left:6px}.input-container input.unset-margin{margin-top:unset}.input-container input.no-caret{cursor:pointer;caret-color:transparent!important}.add-suggestion{margin:0 5px;color:#000;font-weight:700}.remove-selected{cursor:pointer;margin-right:2px;border-radius:50px;height:fit-content}.remove-selected.large-input-icon{margin-top:10px}.arrow-state{height:24px;cursor:pointer}.arrow-state.large-input-icon{margin-top:10px}.arrow-state.opened{transform:rotateX(180deg)}::ng-deep .autocomplete-wrapper .mat-mdc-form-field{width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#cb7b7a}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{display:flex;flex-flow:column;row-gap:4px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors{display:flex}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error .errors ui-icon{margin-right:8px}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint.error svg{color:#e02800!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-bottom-align:before{height:0}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper{padding:0 0 12px;font-size:12px;line-height:16px;position:relative}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-hint-wrapper .mat-form-field-hint-spacer{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field.hide-bottom-content .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{top:28px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:22px!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-text-field-wrapper{padding-left:12px!important;height:unset!important;max-height:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{color:#276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__notch{border-bottom:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__leading{border-left:2px solid #276678!important;border-bottom:2px solid #276678!important;border-top:2px solid #276678!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline__trailing{border:2px solid #276678!important;border-left:unset!important}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-infix,::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mat-mdc-form-field-flex{min-height:48px!important;max-height:184px!important;overflow-y:auto;overflow-x:hidden;padding:0!important;display:flex;justify-content:center;text-align:center;align-items:center;flex-direction:row;width:100%}::ng-deep .autocomplete-wrapper .mat-mdc-form-field .mdc-line-ripple{display:none!important}::ng-deep .mat-mdc-autocomplete-panel{box-shadow:0 8px 24px 4px #00000014;max-height:312px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option:focus:not(.mdc-list-item--disabled),::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mat-mdc-option-active,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:#e9f0f1!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option{padding-right:32px;padding-left:12px!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option ui-icon{display:none;position:absolute;right:0;bottom:calc(50% - 8px);margin:0 10px}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option{background:#e9f0f1}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.selected-option ui-icon{display:block}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option.mdc-list-item--selected .mdc-list-item__primary-text,::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mdc-list-item--activated .mdc-list-item__primary-text{color:#000!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-option .mat-pseudo-checkbox{display:none}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mat-mdc-optgroup-label{font-weight:700!important}::ng-deep .mat-mdc-autocomplete-panel .mat-mdc-optgroup .mdc-list-item__primary-text{color:#000;font-size:12px;line-height:16px;font-weight:700}.active-field .mdc-notched-outline__leading{border-left-width:2px;border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__notch{border-top-width:2px;border-bottom-width:2px}.active-field .mdc-notched-outline__trailing{border-top-width:2px;border-bottom-width:2px;border-right-width:2px}.loading-option{display:flex}.loading-option .loading-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:absolute;top:0;left:0}\n"] }]
|
|
693
693
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
694
694
|
type: Optional
|
|
695
695
|
}, {
|
|
@@ -770,6 +770,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
770
770
|
type: Input
|
|
771
771
|
}], maxItemSelected: [{
|
|
772
772
|
type: Input
|
|
773
|
+
}], maxLength: [{
|
|
774
|
+
type: Input
|
|
773
775
|
}], isDynamicFilteringEnabled: [{
|
|
774
776
|
type: Input
|
|
775
777
|
}], dynamicFilterLoading: [{
|
|
@@ -809,4 +811,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
809
811
|
type: ViewChild,
|
|
810
812
|
args: ['matInput']
|
|
811
813
|
}] } });
|
|
812
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFJVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsSUFBSSxFQUNKLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQXFCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRcEUsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyxxQkFBcUI7SUF5RGhD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QXBCLEtBQUs7Z0JBUUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQVFHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFRa0MsYUFBYTtzQkFBcEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFPN0IsV0FBVztzQkFBbkIsS0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBUUcsY0FBYztzQkFBdEIsS0FBSztnQkFRRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFRRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csK0JBQStCO3NCQUF2QyxLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUVpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0gsWUFBWTtzQkFBakMsU0FBUzt1QkFBQyxTQUFTO2dCQUN3Qyx3QkFBd0I7c0JBQW5GLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQXVCM0IsZUFBZTtzQkFBekMsU0FBUzt1QkFBQyxjQUFjO2dCQUNGLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBTZWxmLFxuICBzaWduYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBtYXAsIFJlcGxheVN1YmplY3QsIHN0YXJ0V2l0aCwgU3Vic2NyaXB0aW9uLCB0YXAsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25UaGVtZSB9IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi10aGVtZS5tb2RlbCc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL2F1dG9jb21wbGV0ZS11dGlscyc7XG5pbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIEF1dG9jb21wbGV0ZVNpemUsXG4gIEF1dG9jb21wbGV0ZVR5cGUsXG4gIERyb3Bkb3duVmFyaWF0aW9uLFxuICBQYWRkaW5nLFxuICBUaW1lb3V0LFxufSBmcm9tICcuL2F1dG9jb21wbGV0ZS5tb2RlbCc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBJS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9rZXlib2FyZC1ldmVudHMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd1aS1hdXRvY29tcGxldGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tY29uZmxpY3RpbmctbGlmZWN5Y2xlXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBpdGVtc0xpc3RcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsaXN0IG9mIGl0ZW1zIHRvIGRpc3BsYXkgaW4gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgaXRlbXNMaXN0OiBhbnlbXSB8IHsgZ3JvdXBOYW1lOiBzdHJpbmc7IGl0ZW1zOiBhbnlbXTsgaXNHcm91cDogYm9vbGVhbiB9W10gPSBbXTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHN1Z2dlc3Rpb25zTGlzdFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBzdWdnZXN0aW9uc0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb24gSWYgYHRydWVgLCB0aGUgYXV0b2NvbXBsZXRlIGlzIGRpc2FibGVkLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWxsb3dBZGRcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIGFkZGluZyBuZXcgdmFsdWVzIHRvIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGFsbG93QWRkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHRleHRGaWVsZFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGZpZWxkIHRvIGJlIHVzZWQgYXMgdGhlIGRpc3BsYXkgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB0ZXh0RmllbGQgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlRmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWVsZCB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBpbiB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZUZpZWxkID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsYWJlbFxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGxhY2Vob2xkZXJcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIGF1dG9jb21wbGV0ZSBpbnB1dC5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VsZWN0ZWQgdmFsdWUocykgaW4gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGl0ZW1WYWx1ZSh2OiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2KSA/IHYgOiB2ID8gW3ZdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHR5cGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0eXBlIG9mIHRoZSBhdXRvY29tcGxldGUgKCdzaW5nbGUnLCAnbXVsdGknLCBldGMuKS5cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgdHlwZTogQXV0b2NvbXBsZXRlVHlwZSA9ICdtdWx0aSc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtaW5DaGFyYWN0ZXJzU2VhcmNoXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWluaW11bSBjaGFyYWN0ZXJzIHRvIHRyaWdnZXIgc2VhcmNoLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtaW5DaGFyYWN0ZXJzU2VhcmNoID0gMztcblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhcmlhbnRcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB2YXJpYW50IG9mIEF1dG9jb21wbGV0ZVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB2YXJpYW50ID0gRHJvcGRvd25WYXJpYXRpb24uQVVUT0NPTVBMRVRFO1xuXG4gIC8qKlxuICAgKiBTaG93IHJlc2VydmVkIGNvbnRlbnQgYmVsb3cgZm9ybSBmaWVsZFxuICAgKiBAcHJvcGVydHkgc2hvd0JvdHRvbUNvbnRlbnRcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNob3dCb3R0b21Db250ZW50ID0gdHJ1ZTtcblxuICAvKipcbiAgICogUmV0dXJuIGZ1bGwgb2JqZWN0IGlmIHRydWVcbiAgICogQHByb3BlcnR5IHZhbHVlUHJpbWl0aXZlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZVByaW1pdGl2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0b3Igb2YgdGhlIGF1dG9jb21wbGV0ZSB3aWR0aFxuICAgKiBAcHJvcGVydHkgZnVsbFdpZHRoXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZ1bGwtd2lkdGgnKVxuICBASW5wdXQoKVxuICBmdWxsV2lkdGggPSBmYWxzZTtcblxuICAvKipcbiAgICpcbiAgICogRGVmaW5lcyB0aGUgYXBwbGljYXRpb24gdGhlbWVcbiAgICpcbiAgICogQHR5cGUge0FwcGxpY2F0aW9uVGhlbWV9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBIb3N0QmluZGluZygnYXR0ci50aGVtZScpXG4gIEBJbnB1dCgpXG4gIGFwcGxpY2F0aW9uVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUgPSAnbGlnaHQnO1xuXG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgaXMgcmVxdWlyZWQgb3Igbm90XG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5wdXQgZmllbGQgZXJyb3JzXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVycm9ycyhlcnJvcnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zYWZlRXJyb3JzID0gZXJyb3JzPy5maWx0ZXIoQm9vbGVhbikubWFwKGVycm9yID0+IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sb3Igb2YgdGhlIG9wdGlvbiBob3Zlci5cbiAgICogRGVmYXVsdHMgdG8gVGVzdCBHb3JpbGxhIHByaW1hcnkgY29sb3IuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGNvbXBhbnlDb2xvcjogc3RyaW5nIHwgbnVsbCA9ICcjRkZGMkZDJztcblxuICAvKipcbiAgICogSGlkZSBpbi1idWlsZCBlcnJvcnMgZm9yIFJlYWN0aXZlIEZvcm1zXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVCdWlsdEluRXJyb3JzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgbGFiZWwgaW4gZXJyb3JzXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVMYWJlbEluRXJyb3JzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgZHJvcGRvd24gbGlzdCB0byB2aXJ0dWFsIHNjcm9sbCBtb2RlXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY29tcGFyZVdpdGhcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSBjb21wYXJpc29uIGxvZ2ljIGZvciB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBjb21wYXJlV2l0aDogKGE6IGFueSwgYjogYW55KSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZHJvcGRvd25QYW5lbENsYXNzXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIGNsYXNzIG9uIGF1dG9jb21wbGV0ZSBkcm9wZG93blxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBkcm9wZG93blBhbmVsQ2xhc3MgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IGNsb3NlT25TY3JvbGxcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgaWYgZHJvcGRvd24gc2hvdWxkIGJlIGNsb3NlZCBvbiBwYWdlIHNjcm9sbFxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBjbG9zZU9uU2Nyb2xsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBBdXRvY29tcGxldGVTaXplXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBhdXRvY29tcGxldGUuIFNtYWxsIGNoYW5nZXMgdGhlIHRhZ3MgdG8gY291bnRlcjsgbWVkaXVtIGlzIGRlZmF1bHQuXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNpemU6IEF1dG9jb21wbGV0ZVNpemUgPSAnbWVkaXVtJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IGFsbG93VXNlcklucHV0XG4gICAqIEBkZXNjcmlwdGlvbiBJZiBgdHJ1ZWAsIGFsbG93cyB0aGUgdXNlciB0byBpbnB1dCBjdXN0b20gdmFsdWVzIGluIHRoZSBhdXRvY29tcGxldGUuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBhbGxvd1VzZXJJbnB1dCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjbGVhcmFibGVcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIHRoZSB1c2VyIHRvIGNsZWFyIHRoZSBpbnB1dCB2YWx1ZXNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBleGFjdE1hdGNoU2VsZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBJZiBgdHJ1ZWAsIGFsbG93cyB0byBzZWxlY3QgdGhlIGV4YWN0IG1hdGNoIGZyb20gdGhlIHN1Z2dlc3Rpb25zIGxpc3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGV4YWN0TWF0Y2hTZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWF4SXRlbVNlbGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBpbiB0aGUgYXV0b2NvbXBsZXRlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBtYXhJdGVtU2VsZWN0ZWQgPSBJbmZpbml0eTtcblxuICBASW5wdXQoKSBpc0R5bmFtaWNGaWx0ZXJpbmdFbmFibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGR5bmFtaWNGaWx0ZXJMb2FkaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGR5bmFtaWNGaWx0ZXJlZExpc3Q6IGFueVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcbiAgQElucHV0KCkgaGFzTW9yZU9wdGlvbnNGb3JJbmZpbml0ZVNjcm9sbCA9IHRydWU7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc2VhcmNoVGV4dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2Nyb2xsVmlld3BvcnRCb3R0b21SZWFjaGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2Zvcm1GaWVsZCcpIGZvcm1GaWVsZEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0YWdDb250YWluZXInKSB0YWdDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgYXV0b2NvbXBsZXRlOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoXG4gICAgdmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydFxuICApIHtcbiAgICBpZiAodGhpcy5zYXZlZFZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnNhdmVkVmlydHVhbFNjcm9sbFZpZXdwb3J0ID0gdmlld3BvcnQ7XG5cbiAgICAgIGlmICh0aGlzLmluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgIHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5zYXZlZFZpcnR1YWxTY3JvbGxWaWV3cG9ydFxuICAgICAgICAgIC5lbGVtZW50U2Nyb2xsZWQoKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgnYm90dG9tJykpLFxuICAgICAgICAgICAgZmlsdGVyKG9mZnNldCA9PiBvZmZzZXQgPCB0aGlzLnNhdmVkVmlydHVhbFNjcm9sbFZpZXdwb3J0LmdldFZpZXdwb3J0U2l6ZSgpICogMC4yKSxcbiAgICAgICAgICAgIHRocm90dGxlVGltZSgyMDApLFxuICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNjcm9sbFZpZXdwb3J0Qm90dG9tUmVhY2hlZC5lbWl0KCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAVmlld0NoaWxkKCdhdXRvY29tcGxldGUnKSBtYXRBdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZCgnbWF0SW5wdXQnKSBtYXRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgc2FmZUVycm9yczogU2FmZUh0bWxbXSA9IFtdO1xuICBwcm90ZWN0ZWQgdmFsdWU6IGFueTtcbiAgcHJvdGVjdGVkIGlucHV0VmFsdWU6IGFueSA9ICcnO1xuICBwcm90ZWN0ZWQgaXNJbnB1dEZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhdXRvY29tcGxldGVUeXBlID0gQXV0b2NvbXBsZXRlO1xuICBwcm90ZWN0ZWQgaXNPdmVyTGFwcGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNPdmVybGFwQ2hlY2tpbmcgPSB0cnVlO1xuICBwcm90ZWN0ZWQgb3ZlcmxhcEluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIGlucHV0T3BhY2l0eSA9IDE7XG4gIHByb3RlY3RlZCBmaXJzdFRhZ01heFdpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZVNlYXJjaCQgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xuICBwcm90ZWN0ZWQgdXNlcklucHV0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG4gIHByb3RlY3RlZCBkeW5hbWljRmlsdGVyZWRMaXN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10gfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShcbiAgICBzdGFydFdpdGgoJycpLFxuICAgIG1hcChpbnB1dFZhbHVlID0+XG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aFxuICAgICAgICA/IEF1dG9jb21wbGV0ZVV0aWxzLmZpbHRlckl0ZW1zKHRoaXMuaXRlbXNMaXN0LCBpbnB1dFZhbHVlLCB0aGlzLnRleHRGaWVsZCwgdGhpcy5pc0dyb3VwZWQpXG4gICAgICAgIDogbnVsbFxuICAgIClcbiAgKTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkU3VnZ2VzdGlvbkxpc3QkID0gdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5waXBlKFxuICAgIG1hcChpbnB1dFZhbHVlID0+XG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aCA/IEF1dG9jb21wbGV0ZVV0aWxzLmZpbHRlckl0ZW1zKHRoaXMuc3VnZ2VzdGlvbnNMaXN0LCBpbnB1dFZhbHVlLCB0aGlzLnRleHRGaWVsZCkgOiBudWxsXG4gICAgKVxuICApO1xuICBwcm90ZWN0ZWQgc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgcHJvdGVjdGVkIHNhdmVkVmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNjcm9sbEV2ZW50ID0gKGV2ZW50OiBhbnkpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpc05vdEF1dG9jb21wbGV0ZVNjcm9sbCA9XG4gICAgICAhZXZlbnQudGFyZ2V0Py5pZD8uaW5jbHVkZXMoJ21hdC1hdXRvY29tcGxldGUtJykgJiZcbiAgICAgICFldmVudC50YXJnZXQ/LnBhcmVudEVsZW1lbnQ/LmlkPy5pbmNsdWRlcygnbWF0LWF1dG9jb21wbGV0ZS0nKSAmJlxuICAgICAgIWV2ZW50LnRhcmdldD8uY2xhc3NMaXN0Py5jb250YWlucygnbWF0LW1kYy1hdXRvY29tcGxldGUtdHJpZ2dlcicpO1xuXG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlLnBhbmVsT3BlbiAmJiBpc05vdEF1dG9jb21wbGV0ZVNjcm9sbCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgfTtcblxuICBwcm90ZWN0ZWQgc2VhcmNoUmVzdWx0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShtYXAoaW5wdXRWYWx1ZSA9PiAhIWlucHV0VmFsdWUudHJpbSgpKSk7XG4gIHByb3RlY3RlZCB0cmFuc2xhdGlvbkNvbnRleHQgPSAnQVVUT0NPTVBMRVRFLic7XG4gIHByb3RlY3RlZCByZWFkb25seSBBdXRvY29tcGxldGVVdGlscyA9IEF1dG9jb21wbGV0ZVV0aWxzO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzUGxhdGZvcm0gPSBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpO1xuICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRGb2N1c2VkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlucHV0VmFsdWVJbml0aWFsaXplZCA9IGZhbHNlO1xuICBpc0FscmVhZHlBZGRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoJ0NBTk9QWVVJX0RFRkFVTFRfQVBQTElDQVRJT05fVEhFTUUnKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcHBUaGVtZTogQXBwbGljYXRpb25UaGVtZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IGFueSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0QXBwVGhlbWUpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25UaGVtZSA9IGRlZmF1bHRBcHBUaGVtZTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmliZXJEaXNwbGF5Q2hhbmdlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0R5bmFtaWNGaWx0ZXJpbmdFbmFibGVkKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuZHluYW1pY0ZpbHRlcmVkTGlzdCQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWFyayBjb21wb25lbnQgdmlldyBhcyBkaXJ0eSB3aGVuIHRvdWNoZWQgcHJvZ3JhbW1hdGljYWxseSB3aXRoIG1hcmtBc1RvdWNoZWQvbWFya0FsbEFzVG91Y2hlZCBvciBlcnJvcnNcbiAgICogdG8gZGlzcGxheSB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IG1pZ2h0IGhhcHBlbiAoZS5nLiByZXF1aXJlZClcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tY29uZmxpY3RpbmctbGlmZWN5Y2xlXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2w/LnRvdWNoZWQgfHwgdGhpcy5uZ0NvbnRyb2w/LmVycm9ycykge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHluYW1pY0ZpbHRlcmluZ0VuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXJlZExpc3QgPSBjaGFuZ2VzWydkeW5hbWljRmlsdGVyZWRMaXN0J10/LmN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKGR5bmFtaWNGaWx0ZXJlZExpc3QpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmlsdGVyZWRMaXN0JC5uZXh0KGR5bmFtaWNGaWx0ZXJlZExpc3QpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlc1snZHluYW1pY0ZpbHRlckxvYWRpbmcnXT8uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY0ZpbHRlcmVkTGlzdCQubmV4dChbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snaXRlbXNMaXN0J10gfHwgY2hhbmdlc1snc3VnZ2VzdGlvbnNMaXN0J10gfHwgY2hhbmdlc1sndmFsdWVGaWVsZCddKSB7XG4gICAgICB0aGlzLml0ZW1zTGlzdCA9IHRoaXMuaXNHcm91cGVkXG4gICAgICAgID8gdGhpcy5pdGVtc0xpc3RcbiAgICAgICAgOiBBdXRvY29tcGxldGVVdGlscy5leGNsdWRlU3VnZ2VzdGlvbnModGhpcy5pdGVtc0xpc3QsIHRoaXMuc3VnZ2VzdGlvbnNMaXN0LCB0aGlzLnZhbHVlRmllbGQpO1xuICAgICAgdGhpcy5pbml0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BsYXRmb3JtICYmIGNoYW5nZXNbJ2NvbXBhbnlDb2xvciddKSB7XG4gICAgICB0aGlzLnNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgIT09IEF1dG9jb21wbGV0ZS5MQVJHRSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0NPTVBPTkVOVF9MT0FELCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1BsYXRmb3JtICYmIHRoaXMuc2V0Q29tcGFueUNvbG9yVmFyaWFibGUoKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uU2Nyb2xsKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c01vbml0b3JcbiAgICAgIC5tb25pdG9yKHRoaXMubWF0SW5wdXQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUob3JpZ2luID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5rZXlib2FyZEZvY3VzZWQuc2V0KG9yaWdpbiA9PT0gJ2tleWJvYXJkJyk7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgdGhpcy5tYXRJbnB1dC5uYXRpdmVFbGVtZW50Lm9ua2V5ZG93biA9IHRoaXMub25LZXlkb3duLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCwgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgb25Ub3VjaCA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVQcmltaXRpdmUgJiYgdGhpcy50ZXh0RmllbGQgJiYgdGhpcy52YWx1ZUZpZWxkKSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBBdXRvY29tcGxldGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHRoaXMuaXRlbXNMaXN0LmZpbHRlcihpdGVtID0+IHZhbHVlLmZpbmQoKHY6IGFueSkgPT4gdiA9PT0gaXRlbVt0aGlzLnZhbHVlRmllbGRdKSlcbiAgICAgICAgICA6IFt0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSldO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoID8gdGhpcy52YWx1ZSA6IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuaW5pdFZhbHVlKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pbnB1dFZhbHVlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuaW5pdFZhbHVlKCk7XG5cbiAgICAgIHRoaXMuaW5wdXRWYWx1ZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNHcm91cGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zTGlzdD8uc29tZSgoaXRlbTogYW55KSA9PiBpdGVtLmlzR3JvdXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uT3B0aW9uU2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZXZlbnQub3B0aW9uLnZhbHVlO1xuICAgIGNvbnN0IGl0ZW1WYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmNyZWF0ZVZhbHVlSXRlbShpbnB1dFZhbHVlLCB0aGlzLnRleHRGaWVsZCwgdGhpcy52YWx1ZUZpZWxkKTtcbiAgICB0aGlzLmFkZE5ld1ZhbHVlKGl0ZW1WYWx1ZSk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuY2hlY2tPdmVybGFwKCk7XG4gICAgfVxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25VcGRhdGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk9wdGlvblJlbW92ZWQob3B0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlUGFuZWwoKSwgMCk7XG4gICAgY29uc3QgZm91bmRWYWx1ZSA9IHRoaXMudmFsdWUuZmluZCgodjogYW55KSA9PiAodGhpcy5jb21wYXJlV2l0aCA/IHRoaXMuY29tcGFyZVdpdGgodiwgb3B0aW9uKSA6IHYgPT09IG9wdGlvbikpO1xuXG4gICAgaWYgKGZvdW5kVmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcigodjogYW55KSA9PiAodGhpcy5jb21wYXJlV2l0aCA/ICF0aGlzLmNvbXBhcmVXaXRoKHYsIG9wdGlvbikgOiB2ICE9PSBvcHRpb24pKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICBpZiAob3B0aW9uLnZhbHVlLnZhbHVlID09PSBmb3VuZFZhbHVlLnZhbHVlKSB7XG4gICAgICAgICAgb3B0aW9uLmRlc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLm9uVXBkYXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnVzZXJJbnB1dCQubmV4dChpbnB1dFZhbHVlKTtcbiAgICBpZiAoaW5wdXRWYWx1ZS5sZW5ndGggPj0gdGhpcy5taW5DaGFyYWN0ZXJzU2VhcmNoKSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLm5leHQoaW5wdXRWYWx1ZSk7XG4gICAgICB0aGlzLnNlYXJjaFRleHRDaGFuZ2UuZW1pdChpbnB1dFZhbHVlKTtcbiAgICAgIGNvbnN0IGl0ZW1MaXN0ID0gdGhpcy5pc0dyb3VwZWQgPyB0aGlzLml0ZW1zTGlzdC5mbGF0TWFwKGdyb3VwcyA9PiBncm91cHMuaXRlbXMpIDogdGhpcy5pdGVtc0xpc3QuZmxhdCgpO1xuXG4gICAgICBjb25zdCBmaW5kVmFsdWUgPSBbLi4udGhpcy5zdWdnZXN0aW9uc0xpc3QsIC4uLml0ZW1MaXN0XS5maW5kKFxuICAgICAgICB2ID0+IGlucHV0VmFsdWUgPT09ICh0aGlzLnRleHRGaWVsZCA/IHZbdGhpcy50ZXh0RmllbGRdIDogdilcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3VudCA9IEF1dG9jb21wbGV0ZVV0aWxzLmNvdW50TWF0Y2hpbmdXb3JkcyhcbiAgICAgICAgWy4uLnRoaXMuc3VnZ2VzdGlvbnNMaXN0LCAuLi5pdGVtTGlzdF0sXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy50ZXh0RmllbGRcbiAgICAgICk7XG4gICAgICBpZiAoZmluZFZhbHVlICYmIGNvdW50ID09PSAxICYmIHRoaXMuZXhhY3RNYXRjaFNlbGVjdCkge1xuICAgICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQoeyBvcHRpb246IHsgdmFsdWU6IGZpbmRWYWx1ZSB9IH0gYXMgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQubmV4dCgnJyk7XG4gICAgICB0aGlzLnVzZXJJbnB1dCQubmV4dCgnJyk7XG4gICAgfVxuICAgIHRoaXMuaXNBbHJlYWR5QWRkZWQgPSAhISh0aGlzLmNvbXBhcmVXaXRoXG4gICAgICA/IHRoaXMudmFsdWUuZmluZCgodjogYW55KSA9PiB0aGlzLmNvbXBhcmVXaXRoKHYsIGlucHV0VmFsdWUpKVxuICAgICAgOiBBdXRvY29tcGxldGVVdGlscy5maW5kRHVwbGljYXRlKHRoaXMudmFsdWUsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFtdIDogJyc7XG4gICAgdGhpcy5pc092ZXJMYXBwaW5nID0gZmFsc2U7XG4gICAgdGhpcy5vdmVybGFwSW5kZXggPSAwO1xuICAgIHRoaXMub25VcGRhdGUoKTtcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZT8ub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBvcHRpb24uZGVzZWxlY3QoKSk7XG4gICAgdGhpcy5vblRvdWNoKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmaWxsSW5wdXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUgJiYgIXRoaXMuaW5wdXRWYWx1ZSkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUodGhpcy52YWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pbnB1dFZhbHVlICYmIHRoaXMudmFsdWU/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSAnICc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaW5wdXRWYWx1ZSAmJiB0aGlzLnR5cGUgPT09IEF1dG9jb21wbGV0ZS5TSU5HTEUgJiYgdGhpcy52YWx1ZSAmJiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKFxuICAgICAgICAgIEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlWzBdIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICB0aGlzLnRleHRGaWVsZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlucHV0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyAnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLm5leHQoJycpO1xuICAgICAgdGhpcy51c2VySW5wdXQkLm5leHQoJycpO1xuICAgICAgdGhpcy5pc0lucHV0Rm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub25Ub3VjaCgpO1xuICAgICAgdGhpcy5ibHVyLmVtaXQoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnb3RvVXAoKSB7XG4gICAgaWYgKHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgIHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlzSW5wdXRGb2N1cyA9IHRydWU7XG5cbiAgICBjb25zdCBpbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh0aGlzLmlucHV0VmFsdWUpID8gdGhpcy5pbnB1dFZhbHVlWzBdIDogdGhpcy5pbnB1dFZhbHVlO1xuXG4gICAgaWYgKEF1dG9jb21wbGV0ZVV0aWxzLmlzUHJpbWl0aXZlKGlucHV0VmFsdWUpKSB7XG4gICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWUgIT09ICdudW1iZXInICYmIGlucHV0VmFsdWU/Lm1hdGNoKC9eXFxzKy9nbSkpIHtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS50cmltU3RhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlucHV0VmFsdWVbdGhpcy50ZXh0RmllbGRdPy5tYXRjaCgvXlxccysvZ20pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWVbdGhpcy50ZXh0RmllbGRdLnRyaW1TdGFydCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvY3VzLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tPdmVybGFwKGRlbGF5ID0gVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0FGVEVSX0FDVElPTiwgaW5pdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5pc092ZXJMYXBwaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc092ZXJsYXBDaGVja2luZyA9IHRydWU7XG4gICAgdGhpcy5pbnB1dE9wYWNpdHkgPSAwO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dFdpZHRoID0gdGhpcy5pbnB1dFdpZHRoO1xuICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy52YWx1ZS10YWcnKTtcbiAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICAgIGxldCBmaXJzdFRhZ1dpZHRoID0gMDtcblxuICAgICAgICB0YWdzLmZvckVhY2goKHRhZzogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgd2lkdGggKz0gdGFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAgICAgaWYgKCFpbmRleCkge1xuICAgICAgICAgICAgZmlyc3RUYWdXaWR0aCA9IHdpZHRoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlucFdpZHRoID0gdGhpcy5mb3JtRmllbGRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gMjA7XG4gICAgICAgICAgdGhpcy5maXJzdFRhZ01heFdpZHRoID1cbiAgICAgICAgICAgIHRhZ3MubGVuZ3RoID4gMVxuICAgICAgICAgICAgICA/IGlucFdpZHRoIC1cbiAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50ID09PSBEcm9wZG93blZhcmlhdGlvbi5EUk9QRE9XTlxuICAgICAgICAgICAgICAgICAgPyBQYWRkaW5nLkRST1BET1dOX1NQQUNFX0NPTlRBSU5FUlxuICAgICAgICAgICAgICAgICAgOiBQYWRkaW5nLkFVVE9DT01QTEVURV9TUEFDRV9DT05UQUlORVIpXG4gICAgICAgICAgICAgIDogaW5wV2lkdGg7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNPdmVyTGFwcGluZyAmJiB3aWR0aCA+IGlucHV0V2lkdGggJiYgaW5kZXggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmlzT3ZlckxhcHBpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vdmVybGFwSW5kZXggPSBpbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzT3ZlcmxhcENoZWNraW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWVbMF0sIHRoaXMudGV4dEZpZWxkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWU/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWdDb250YWluZXJXaWR0aCA9IHRoaXMudGFnQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIHRoaXMudGFnQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSB0YWdDb250YWluZXJXaWR0aCAvIDEwMCA/ICcxMDAlJyA6IHRhZ0NvbnRhaW5lcldpZHRoICsgJ3B4JztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmlucHV0T3BhY2l0eSA9IDE7XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblVwZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLm5leHQoJycpO1xuICAgIHRoaXMudXNlcklucHV0JC5uZXh0KCcnKTtcbiAgICBpZiAoIXRoaXMudmFsdWVQcmltaXRpdmUpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IEF1dG9jb21wbGV0ZS5TSU5HTEUpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlW3RoaXMudmFsdWVGaWVsZF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlLm1hcCgodjogYW55KSA9PiB2W3RoaXMudmFsdWVGaWVsZF0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb250cm9sTWF4TGVuZ3RoVmFsaWRpdHkoKTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb250cm9sTWF4TGVuZ3RoVmFsaWRpdHkoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMubmdDb250cm9sPy5jb250cm9sO1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09IEF1dG9jb21wbGV0ZS5TSU5HTEUpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3JzID0gY29udHJvbC5lcnJvcnMgfHwge307XG5cbiAgICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA+IHRoaXMubWF4SXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgICAuLi5leGlzdGluZ0Vycm9ycyxcbiAgICAgICAgICBtYXhJdGVtU2VsZWN0ZWQ6IHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLm1heEl0ZW1TZWxlY3RlZCxcbiAgICAgICAgICAgIGFjdHVhbDogdGhpcy52YWx1ZS5sZW5ndGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nRXJyb3JzWydtYXhJdGVtU2VsZWN0ZWQnXSkge1xuICAgICAgICAgIGRlbGV0ZSBleGlzdGluZ0Vycm9yc1snbWF4SXRlbVNlbGVjdGVkJ107XG4gICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXhpc3RpbmdFcnJvcnMpLmxlbmd0aCA/IGV4aXN0aW5nRXJyb3JzIDogbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmIHRoaXMudmFyaWFudCAhPT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV04pIHtcbiAgICAgIGlmIChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlWzBdLCB0aGlzLnRleHRGaWVsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlID8gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSBEcm9wZG93blZhcmlhdGlvbi5EUk9QRE9XTikge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID1cbiAgICAgICAgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIXRoaXMudmFsdWU/Lmxlbmd0aCkgfHwgIXRoaXMudmFsdWVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB0aGlzLnR5cGUgPT09IEF1dG9jb21wbGV0ZS5TSU5HTEVcbiAgICAgICAgICA/IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWVbMF0gOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLnRleHRGaWVsZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID8gJyAnIDogJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgZm91bmREdXBsaWNhdGUgPSB0aGlzLmNvbXBhcmVXaXRoXG4gICAgICA/IHRoaXMudmFsdWUuZmluZCgodjogYW55KSA9PiB0aGlzLmNvbXBhcmVXaXRoKHYsIG5ld1ZhbHVlKSlcbiAgICAgIDogQXV0b2NvbXBsZXRlVXRpbHMuZmluZER1cGxpY2F0ZSh0aGlzLnZhbHVlLCBuZXdWYWx1ZSwgdGhpcy50ZXh0RmllbGQpO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGZvdW5kRHVwbGljYXRlXG4gICAgICAgID8gdGhpcy52YWx1ZS5maWx0ZXIoKHY6IGFueSkgPT5cbiAgICAgICAgICAgIHRoaXMuY29tcGFyZVdpdGggPyAhdGhpcy5jb21wYXJlV2l0aCh2LCBmb3VuZER1cGxpY2F0ZSkgOiB2ICE9PSBmb3VuZER1cGxpY2F0ZVxuICAgICAgICAgIClcbiAgICAgICAgOiBbLi4udGhpcy52YWx1ZSwgbmV3VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc0Ryb3Bkb3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09IERyb3Bkb3duVmFyaWF0aW9uLkRST1BET1dOO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2hldnJvbkNsaWNrKGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlKTogdm9pZCB7XG4gICAgaWYgKGF1dG9jb21wbGV0ZS5pc09wZW4pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlucHV0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5mb3JtRmllbGRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC1cbiAgICAgICh0aGlzLmlzRHJvcGRvd24gPyBQYWRkaW5nLkRST1BET1dOX0NPTlRBSU5FUiA6IFBhZGRpbmcuQVVUT0NPTVBMRVRFX0NPTlRBSU5FUilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlGbiA9IChpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSA9PiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuXG4gIC8qKlxuICAgKiBBZGRpbmcgY29tcGFueSBjb2xvciB2YXJpYWJsZSB0byB0aGUgYm9keSB0byBzdHlsZSBvdmVybGF5IGNvbnRhaW5lciB0aGF0J3Mgb3V0IG9mIHRoZSBjb21wb25lbnQgc2NvcGUuXG4gICAqL1xuICBwcml2YXRlIHNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJy0tdWktYXV0b2NvbXBsZXRlLW9wdGlvbi1jb2xvcicsIGAke3RoaXMuY29tcGFueUNvbG9yfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVyRGlzcGxheUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRvY29tcGxldGVIb3N0RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgbXV0YXRpb25zLmZvckVhY2gobXV0YXRpb24gPT4ge1xuICAgICAgICBpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgaWYgKGRpc3BsYXlTdHlsZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaGFzT2JqZWN0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPyAhIU9iamVjdC5rZXlzKHRoaXMudmFsdWUpLmxlbmd0aCA6IGZhbHNlO1xuICB9XG5cbiAgb25LZXlkb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IG9wdGlvbkhlaWdodCA9IDQ4O1xuXG4gICAgaWYgKCRldmVudC5rZXkgPT09IElLZXlib2FyZEV2ZW50LkhPTUUpIHtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuRU5EKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuUEFHRV9ET1dOKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgfSBlbHNlIGlmICgkZXZlbnQua2V5ID09PSBJS2V5Ym9hcmRFdmVudC5QQUdFX1VQKSB7XG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX3NldFNjcm9sbFRvcCh0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXghICogb3B0aW9uSGVpZ2h0KTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS13cmFwcGVyXCIgW25nQ2xhc3NdPVwieyAnZnVsbC13aWR0aCc6IGZ1bGxXaWR0aCwgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgIFtjb2xvcl09XCIoc2FmZUVycm9ycy5sZW5ndGggfHwgKG5nQ29udHJvbD8uZXJyb3JzICYmIG5nQ29udHJvbD8udG91Y2hlZCApIHx8IChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgKGlucHV0VmFsdWUgJiYgaW5wdXRWYWx1ZSAhPT0gJyAnKSkgKSA/ICd3YXJuJyA6ICdhY2NlbnQnXCJcbiAgICAgIFthcHBlYXJhbmNlXT1cIidvdXRsaW5lJ1wiXG4gICAgICBbbmdDbGFzc109XCJ7ICdsYXJnZS1zaXplJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgJ2hpZGUtYm90dG9tLWNvbnRlbnQnOiAhc2hvd0JvdHRvbUNvbnRlbnQsICdrZXlib2FyZC1mb2N1c2VkJzoga2V5Ym9hcmRGb2N1c2VkKCksICdoYXMtbGFiZWwnOiAhIWxhYmVsIH1cIlxuICAgID5cbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19IDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvbWF0LWxhYmVsPlxuICAgICAgPGRpdiAjZm9ybUZpZWxkIGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtOTk5OXB4XCIgKm5nSWY9XCJ0ZXh0RmllbGQgPyB2YWx1ZT8uW3RleHRGaWVsZF0gOiB2YWx1ZSA9PT0gaW5wdXRWYWx1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7ICgoJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSArICcgJyArIGlucHV0VmFsdWUgfX08L3NwYW4+XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI3RyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcbiAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICBbdWlQcmV2ZW50SW5wdXRdPVwiIWFsbG93VXNlcklucHV0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2V0LW1hcmdpbic6IHRoaXMudmFsdWUgJiYgdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSwgJ25vLWNhcmV0JzogIWFsbG93VXNlcklucHV0IH1cIlxuICAgICAgICAgIChibHVyKT1cInJlZmlsbElucHV0KClcIlxuICAgICAgICAgIChmb2N1c2luKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykgKyAnICcgKyAodmFsdWUgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgOiB0cnVlKVwiXG4gICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSA/IGlucHV0T3BhY2l0eSA6IDFcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInZhbHVlICYmIHZhbHVlLmxlbmd0aCA/ICcnOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2VsZWN0ZWQtaXRlbXNcIlxuICAgICAgICAgICN0YWdDb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgJiYgdGhpcy52YWx1ZSkgfHxcbiAgICAgICAgICAgICghKGlucHV0VmFsdWUgJiYgdGhpcy5pc0lucHV0Rm9jdXMpICYmIHRoaXMudmFsdWUgJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx1aS10YWdcbiAgICAgICAgICAgIGNsYXNzPVwidmFsdWUtdGFnXCJcbiAgICAgICAgICAgIFtpZF09XCIndWktdGFnLScgKyBpXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZUl0ZW0gb2YgdmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInZhbHVlSXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZFwiXG4gICAgICAgICAgICBbYWxsb3dDbG9zZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSA/IGlucHV0T3BhY2l0eSA6IDFcIlxuICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiKGlzT3ZlckxhcHBpbmcgJiYgaSA+IDAgJiYgaSA+PSBvdmVybGFwSW5kZXgpIHx8IChzaXplID09PSAnc21hbGwnICYmIHZhbHVlLmxlbmd0aCA+IDEpICA/ICdub25lJyA6ICdibG9jaydcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnLS10YWctbWF4LXdpZHRoJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSA/ICdmaXQtY29udGVudCcgOiBmaXJzdFRhZ01heFdpZHRoICsgJ3B4JyB9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ292ZXJsYXAtdGFnJzogaXNPdmVybGFwQ2hlY2tpbmcgJiYgb3ZlcmxhcEluZGV4ICYmIGkgPj0gb3ZlcmxhcEluZGV4ICYmIHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTVVMVElcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKGNsb3NlKT1cIm9uT3B0aW9uUmVtb3ZlZCh2YWx1ZUl0ZW0pXCJcbiAgICAgICAgICA+PC91aS10YWc+XG4gICAgICAgICAgQGlmIChzaXplID09PSAnc21hbGwnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtY291bnRcIiAqbmdJZj1cInZhbHVlLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAge3sgKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRF9BTU9VTlQnIHwgdWlUcmFuc2xhdGUgOiB7IG51bWJlclNlbGVjdGVkOiAodmFsdWUgfCBzbGljZTogb3ZlcmxhcEluZGV4KS5sZW5ndGggfSkgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFsdWUubGVuZ3RoID4gMSAmJiBpc092ZXJMYXBwaW5nXCIgY2xhc3M9XCJvdmVybGFwLWNvdW50XCI+XG4gICAgICAgICAgICAgIDx1aS10YWcgW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicrJyArICh2YWx1ZS5sZW5ndGggLSBvdmVybGFwSW5kZXgpXCI+PC91aS10YWc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDx1aS1pY29uXG4gICAgICAgICpuZ0lmPVwiY2xlYXJhYmxlICYmICh0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiAodmFsdWU/Lmxlbmd0aCB8fCBoYXNPYmplY3RWYWx1ZSkpIHx8ICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRSAmJiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAxICYmICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNQcmltaXRpdmUodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgfHwgKCFBdXRvY29tcGxldGVVdGlscy5pc1ByaW1pdGl2ZSh2YWx1ZSkgJiYgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCB8fCAhQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkpKSlcIlxuICAgICAgICBjbGFzcz1cInJlbW92ZS1zZWxlY3RlZFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJkaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uQ2xlYXIoKTskZXZlbnQucHJldmVudERlZmF1bHQoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnbGFyZ2UtaW5wdXQtaWNvbic6IHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgfVwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXG4gICAgICAgIFtjb2xvcl09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnaW5oZXJpdCcgOiAncmVicmFuZC1ibGFjaydcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIignQ09NTU9OLkNMRUFSJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jXCJcbiAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Nsb3NlJyA6ICdDbG9zZS1pbi1saW5lJ1wiXG4gICAgICA+PC91aS1pY29uPlxuXG4gICAgICA8dWktaWNvblxuICAgICAgICBjbGFzcz1cImFycm93LXN0YXRlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBvcGVuZWQ6IGF1dG9jb21wbGV0ZS5pc09wZW4sICdsYXJnZS1pbnB1dC1pY29uJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSB9XCJcbiAgICAgICAgKm5nSWY9XCJpc0Ryb3Bkb3duXCJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXG4gICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgIT09ICdjbGFzc2ljJyA/ICdBcnJvdy1jaGV2cm9uLWRvd24taW4tbGluZScgOiAnQXJyb3dfZG93bidcIlxuICAgICAgICAoY2xpY2spPVwib25DaGV2cm9uQ2xpY2soYXV0b2NvbXBsZXRlKVwiXG4gICAgICA+PC91aS1pY29uPlxuXG5cbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICNhdXRvY29tcGxldGVcbiAgICAgICAgW2NsYXNzXT1cImFwcGxpY2F0aW9uVGhlbWUgKyAnICcgKyBkcm9wZG93blBhbmVsQ2xhc3NcIlxuICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiYXBwbGljYXRpb25UaGVtZSAhPT0gJ2NsYXNzaWMnXCJcbiAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwiZmFsc2VcIlxuICAgICAgICAob3BlbmVkKT1cImdvdG9VcCgpXCJcbiAgICAgID5cbiAgICAgICAgQGlmICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJIHx8IHZhbHVlPy5sZW5ndGggPCBtYXhJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShzZWFyY2hSZXN1bHQkIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRHJvcGRvd247IGVsc2UgZHJvcGRvd25MaXN0XCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NVR0dFU1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1Z2dlc3Rpb25zTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IHN1Z2dlc3RlZCB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkIG9mIHN1Z2dlc3Rpb25zTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic3VnZ2VzdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBzdWdnZXN0ZWQgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTRUxFQ1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuXG4gICAgICAgICAgICAgIEBpZiAoaXNHcm91cGVkKSB7XG4gICAgICAgICAgICAgICAgQGZvciAoZ3JvdXAgb2YgaXRlbXNMaXN0OyB0cmFjayBncm91cCkge1xuXG4gICAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLmdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCJncm91cC5ncm91cE5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidmFsdWU/Lmxlbmd0aCAmJiB0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLlNJTkdMRVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidzZWxlY3RlZC1vcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgdmFsdWUgfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Ryb3Bkb3duTGlzdD5cbiAgICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCAqbmdJZj1cInZpcnR1YWxTY3JvbGwgfHwgaW5maW5pdGVTY3JvbGw7IGVsc2UgZGVmYXVsdFZpZXdQb3J0XCIgW2l0ZW1TaXplXT1cIjQ4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIicyMDBweCdcIiBjbGFzcz1cInZpcnR1YWwtc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgQGlmICghaXNHcm91cGVkKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc0xpc3RcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICBAaWYoaW5maW5pdGVTY3JvbGwgJiYgaGFzTW9yZU9wdGlvbnNGb3JJbmZpbml0ZVNjcm9sbCkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImxvYWRpbmctb3B0aW9uXCIgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIidub25lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVpLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCIgW2lzTG9hZGVyXT1cImZhbHNlXCI+PC91aS1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICBAZm9yIChncm91cCBvZiBpdGVtc0xpc3Q7IHRyYWNrIGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZ3JvdXAuZ3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiZ3JvdXAuZ3JvdXBOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIGdyb3VwLml0ZW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Vmlld1BvcnQ+XG4gICAgICAgICAgICAgICAgQGlmICghaXNHcm91cGVkKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBmb3IgKGdyb3VwIG9mIGl0ZW1zTGlzdDsgdHJhY2sgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5ncm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCJncm91cC5ncm91cE5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0JCB8IGFzeW5jIGFzIGZpbHRlcmVkU3VnZ2VzdGlvbkxpc3RcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZEl0ZW1zTGlzdCQgfCBhc3luYyBhcyBmaWx0ZXJlZEl0ZW1zTGlzdFwiPlxuICAgICAgICAgICAgICBAaWYgKGlzR3JvdXBlZCAmJiBmaWx0ZXJlZEl0ZW1zTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBAZm9yIChncm91cCBvZiBmaWx0ZXJlZEl0ZW1zTGlzdDsgdHJhY2sgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoZ3JvdXAuZ3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cImdyb3VwLmdyb3VwTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5maWx0ZXJlZEl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmZpbHRlcmVkSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NVR0dFU1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlcmVkU3VnZ2VzdGlvbkxpc3QubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkU3VnZ2VzdGlvbkxpc3RcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpbHRlcmVkU3VnZ2VzdGlvbkxpc3QubGVuZ3RoICYmICFpc0dyb3VwZWQ7IGVsc2Ugc2hvd0l0ZW1MaXN0V2l0aEdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkSXRlbXNMaXN0XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93SXRlbUxpc3RXaXRoR3JvdXA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnQUxMX0lURU1TJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJlZEl0ZW1zTGlzdC5sZW5ndGggJiYgIWlzR3JvdXBlZFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkSXRlbXNMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICBAaWYoaXNEeW5hbWljRmlsdGVyaW5nRW5hYmxlZCAmJiBkeW5hbWljRmlsdGVyTG9hZGluZykge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwibG9hZGluZy1vcHRpb25cIiBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiJ25vbmUnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCIgW2lzTG9hZGVyXT1cImZhbHNlXCI+PC91aS1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmKGlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGFsbG93QWRkICYmICFpc0FscmVhZHlBZGRlZCkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KCkgW3ZhbHVlXT1cImlucHV0VmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKCdDT01NT04uQUREJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1zdWdnZXN0aW9uXCI+XCJ7eyBpbnB1dFZhbHVlIH19XCI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoIWZpbHRlcmVkSXRlbXNMaXN0Lmxlbmd0aCAmJiAhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKHRyYW5zbGF0aW9uQ29udGV4dCArICdOT19SRVNVTFRTX0ZPVU5EJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgIDxtYXQtaGludCBjbGFzcz1cImVycm9yXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNhZmVFcnJvcnMubGVuZ3RoIHx8IChuZ0NvbnRyb2w/LmVycm9ycyB8IGhhc1ZhbGlkYXRpb25FcnJvcikgfHwgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgPiBtYXhJdGVtU2VsZWN0ZWQgfHwgKChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID49IG1heEl0ZW1TZWxlY3RlZCAmJiAoaW5wdXRWYWx1ZSAmJiBpbnB1dFZhbHVlICE9PSAnICcpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3JzXCJcbiAgICAgICAgICAgICAqbmdJZj1cIihBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgKGlucHV0VmFsdWUgJiYgaW5wdXRWYWx1ZSAhPT0gJyAnKSlcIj5cbiAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCIgW25hbWVdPVwiJ0Vycm9yJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAodHJhbnNsYXRpb25Db250ZXh0ICsgJ01BWF9TRUxFQ1RFRF9FUlJPUicpIHwgdWlUcmFuc2xhdGUgOiB7IG1heDogbWF4SXRlbVNlbGVjdGVkIH0gfCBhc3luYyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzYWZlRXJyb3JzLmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvcnNcIiAqbmdGb3I9XCJsZXQgZXJyb3Igb2Ygc2FmZUVycm9yczsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XG4gICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCIgW25hbWVdPVwiJ0Vycm9yJ1wiPjwvdWktaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiZXJyb3JcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8dWktdmFsaWRhdGlvbi1lcnJvciAqbmdJZj1cIm5nQ29udHJvbCAmJiAhaGlkZUJ1aWx0SW5FcnJvcnNcIiBbbmdDb250cm9sXT1cIm5nQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJoaWRlTGFiZWxJbkVycm9ycyA/IG51bGwgOiBsYWJlbFwiPjwvdWktdmFsaWRhdGlvbi1lcnJvcj5cblxuICAgICAgPC9tYXQtaGludD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|
|
814
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFJVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsSUFBSSxFQUNKLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQWdCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRcEUsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyxxQkFBcUI7SUF5RGhD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QXBCLEtBQUs7Z0JBUUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQVFHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFRa0MsYUFBYTtzQkFBcEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFPN0IsV0FBVztzQkFBbkIsS0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBUUcsY0FBYztzQkFBdEIsS0FBSztnQkFRRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFRRyxlQUFlO3NCQUF2QixLQUFLO2dCQVFHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRywrQkFBK0I7c0JBQXZDLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBRWlCLGdCQUFnQjtzQkFBdkMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDSCxZQUFZO3NCQUFqQyxTQUFTO3VCQUFDLFNBQVM7Z0JBQ3dDLHdCQUF3QjtzQkFBbkYsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBdUIzQixlQUFlO3NCQUF6QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0YsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIERlc3Ryb3lSZWYsXHJcbiAgRG9DaGVjayxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgTmdab25lLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFBMQVRGT1JNX0lELFxyXG4gIFNlbGYsXHJcbiAgc2lnbmFsLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBtYXAsIFJlcGxheVN1YmplY3QsIHN0YXJ0V2l0aCwgU3Vic2NyaXB0aW9uLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXBwbGljYXRpb25UaGVtZSB9IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi10aGVtZS5tb2RlbCc7XHJcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXV0b2NvbXBsZXRlLXV0aWxzJztcclxuaW1wb3J0IHtcclxuICBBdXRvY29tcGxldGUsXHJcbiAgQXV0b2NvbXBsZXRlU2l6ZSxcclxuICBBdXRvY29tcGxldGVUeXBlLFxyXG4gIERyb3Bkb3duVmFyaWF0aW9uLFxyXG4gIFBhZGRpbmcsXHJcbiAgVGltZW91dCxcclxufSBmcm9tICcuL2F1dG9jb21wbGV0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQgeyBJS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9rZXlib2FyZC1ldmVudHMubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1hdXRvY29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxyXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgT25EZXN0cm95IHtcclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgaXRlbXNMaXN0XHJcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsaXN0IG9mIGl0ZW1zIHRvIGRpc3BsYXkgaW4gdGhlIGF1dG9jb21wbGV0ZS5cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgaXRlbXNMaXN0OiBhbnlbXSB8IHsgZ3JvdXBOYW1lOiBzdHJpbmc7IGl0ZW1zOiBhbnlbXTsgaXNHcm91cDogYm9vbGVhbiB9W10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IHN1Z2dlc3Rpb25zTGlzdFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGlzdCBvZiBzdWdnZXN0aW9ucyB0byBkaXNwbGF5IGluIHRoZSBhdXRvY29tcGxldGUuXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25zTGlzdDogYW55W10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXHJcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgdGhlIGF1dG9jb21wbGV0ZSBpcyBkaXNhYmxlZC5cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IGFsbG93QWRkXHJcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIGFkZGluZyBuZXcgdmFsdWVzIHRvIHRoZSBhdXRvY29tcGxldGUuXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFsbG93QWRkID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IHRleHRGaWVsZFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZmllbGQgdG8gYmUgdXNlZCBhcyB0aGUgZGlzcGxheSB0ZXh0IGluIHRoZSBhdXRvY29tcGxldGUuXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRleHRGaWVsZCA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgdmFsdWVGaWVsZFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZmllbGQgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgaW4gdGhlIGF1dG9jb21wbGV0ZS5cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgdmFsdWVGaWVsZCA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgbGFiZWxcclxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxyXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgcGxhY2Vob2xkZXJcclxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHBsYWNlaG9sZGVyIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxyXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgdmFsdWVcclxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlbGVjdGVkIHZhbHVlKHMpIGluIHRoZSBhdXRvY29tcGxldGUuXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBpdGVtVmFsdWUodjogYW55KSB7XHJcbiAgICB0aGlzLnZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2KSA/IHYgOiB2ID8gW3ZdIDogW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgdHlwZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiB0aGUgYXV0b2NvbXBsZXRlICgnc2luZ2xlJywgJ211bHRpJywgZXRjLikuXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHR5cGU6IEF1dG9jb21wbGV0ZVR5cGUgPSAnbXVsdGknO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgbWluQ2hhcmFjdGVyc1NlYXJjaFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWluaW11bSBjaGFyYWN0ZXJzIHRvIHRyaWdnZXIgc2VhcmNoLlxyXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBtaW5DaGFyYWN0ZXJzU2VhcmNoID0gMztcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IHZhcmlhbnRcclxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHZhcmlhbnQgb2YgQXV0b2NvbXBsZXRlXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHZhcmlhbnQgPSBEcm9wZG93blZhcmlhdGlvbi5BVVRPQ09NUExFVEU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgcmVzZXJ2ZWQgY29udGVudCBiZWxvdyBmb3JtIGZpZWxkXHJcbiAgICogQHByb3BlcnR5IHNob3dCb3R0b21Db250ZW50XHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNob3dCb3R0b21Db250ZW50ID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGZ1bGwgb2JqZWN0IGlmIHRydWVcclxuICAgKiBAcHJvcGVydHkgdmFsdWVQcmltaXRpdmVcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgdmFsdWVQcmltaXRpdmUgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdG9yIG9mIHRoZSBhdXRvY29tcGxldGUgd2lkdGhcclxuICAgKiBAcHJvcGVydHkgZnVsbFdpZHRoXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnVsbC13aWR0aCcpXHJcbiAgQElucHV0KClcclxuICBmdWxsV2lkdGggPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBEZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiB0aGVtZVxyXG4gICAqXHJcbiAgICogQHR5cGUge0FwcGxpY2F0aW9uVGhlbWV9XHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci50aGVtZScpXHJcbiAgQElucHV0KClcclxuICBhcHBsaWNhdGlvblRoZW1lOiBBcHBsaWNhdGlvblRoZW1lID0gJ2xpZ2h0JztcclxuXHJcbiAgLyoqXHJcbiAgICogQXV0b2NvbXBsZXRlIGlzIHJlcXVpcmVkIG9yIG5vdFxyXG4gICAqXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBJbnB1dCBmaWVsZCBlcnJvcnNcclxuICAgKlxyXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IGVycm9ycyhlcnJvcnM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnNhZmVFcnJvcnMgPSBlcnJvcnM/LmZpbHRlcihCb29sZWFuKS5tYXAoZXJyb3IgPT4gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoZXJyb3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbG9yIG9mIHRoZSBvcHRpb24gaG92ZXIuXHJcbiAgICogRGVmYXVsdHMgdG8gVGVzdCBHb3JpbGxhIHByaW1hcnkgY29sb3IuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBjb21wYW55Q29sb3I6IHN0cmluZyB8IG51bGwgPSAnI0ZGRjJGQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhpZGUgaW4tYnVpbGQgZXJyb3JzIGZvciBSZWFjdGl2ZSBGb3Jtc1xyXG4gICAqXHJcbiAgICogQHR5cGUge251bWJlcn1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgaGlkZUJ1aWx0SW5FcnJvcnMgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSGlkZSBsYWJlbCBpbiBlcnJvcnNcclxuICAgKlxyXG4gICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGhpZGVMYWJlbEluRXJyb3JzID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgZHJvcGRvd24gbGlzdCB0byB2aXJ0dWFsIHNjcm9sbCBtb2RlXHJcbiAgICpcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IGNvbXBhcmVXaXRoXHJcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSBjb21wYXJpc29uIGxvZ2ljIGZvciB0aGUgYXV0b2NvbXBsZXRlLlxyXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBjb21wYXJlV2l0aDogKGE6IGFueSwgYjogYW55KSA9PiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgZHJvcGRvd25QYW5lbENsYXNzXHJcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgY2xhc3Mgb24gYXV0b2NvbXBsZXRlIGRyb3Bkb3duXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRyb3Bkb3duUGFuZWxDbGFzcyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgY2xvc2VPblNjcm9sbFxyXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGlmIGRyb3Bkb3duIHNob3VsZCBiZSBjbG9zZWQgb24gcGFnZSBzY3JvbGxcclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgY2xvc2VPblNjcm9sbCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgQXV0b2NvbXBsZXRlU2l6ZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBhdXRvY29tcGxldGUuIFNtYWxsIGNoYW5nZXMgdGhlIHRhZ3MgdG8gY291bnRlcjsgbWVkaXVtIGlzIGRlZmF1bHQuXHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNpemU6IEF1dG9jb21wbGV0ZVNpemUgPSAnbWVkaXVtJztcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IGFsbG93VXNlcklucHV0XHJcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIHRoZSB1c2VyIHRvIGlucHV0IGN1c3RvbSB2YWx1ZXMgaW4gdGhlIGF1dG9jb21wbGV0ZS5cclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgYWxsb3dVc2VySW5wdXQgPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgY2xlYXJhYmxlXHJcbiAgICogQGRlc2NyaXB0aW9uIElmIGB0cnVlYCwgYWxsb3dzIHRoZSB1c2VyIHRvIGNsZWFyIHRoZSBpbnB1dCB2YWx1ZXNcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgY2xlYXJhYmxlID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByb3BlcnR5IGV4YWN0TWF0Y2hTZWxlY3RcclxuICAgKiBAZGVzY3JpcHRpb24gSWYgYHRydWVgLCBhbGxvd3MgdG8gc2VsZWN0IHRoZSBleGFjdCBtYXRjaCBmcm9tIHRoZSBzdWdnZXN0aW9ucyBsaXN0XHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEF1dG9jb21wbGV0ZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGV4YWN0TWF0Y2hTZWxlY3QgPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJvcGVydHkgbWF4SXRlbVNlbGVjdGVkXHJcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIHRoZSBhdXRvY29tcGxldGVcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4SXRlbVNlbGVjdGVkID0gSW5maW5pdHk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwcm9wZXJ0eSBtYXhJdGVtU2VsZWN0ZWRcclxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGF1dG9jb21wbGV0ZSBpbnB1dFxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBBdXRvY29tcGxldGVDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlcjtcclxuXHJcbiAgQElucHV0KCkgaXNEeW5hbWljRmlsdGVyaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGR5bmFtaWNGaWx0ZXJMb2FkaW5nID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZHluYW1pY0ZpbHRlcmVkTGlzdDogYW55W10gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgaW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcclxuICBASW5wdXQoKSBoYXNNb3JlT3B0aW9uc0ZvckluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZWFyY2hUZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBzY3JvbGxWaWV3cG9ydEJvdHRvbVJlYWNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Zvcm1GaWVsZCcpIGZvcm1GaWVsZEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ3RhZ0NvbnRhaW5lcicpIHRhZ0NvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicpIGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoXHJcbiAgICB2aWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0XHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5zYXZlZFZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zYXZlZFZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmlld3BvcnQpIHtcclxuICAgICAgdGhpcy5zYXZlZFZpcnR1YWxTY3JvbGxWaWV3cG9ydCA9IHZpZXdwb3J0O1xyXG5cclxuICAgICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgICB0aGlzLnNhdmVkVmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbiA9IHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnRcclxuICAgICAgICAgIC5lbGVtZW50U2Nyb2xsZWQoKVxyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLnNhdmVkVmlydHVhbFNjcm9sbFZpZXdwb3J0Lm1lYXN1cmVTY3JvbGxPZmZzZXQoJ2JvdHRvbScpKSxcclxuICAgICAgICAgICAgZmlsdGVyKG9mZnNldCA9PiBvZmZzZXQgPCB0aGlzLnNhdmVkVmlydHVhbFNjcm9sbFZpZXdwb3J0LmdldFZpZXdwb3J0U2l6ZSgpICogMC4yKSxcclxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDIwMCksXHJcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2Nyb2xsVmlld3BvcnRCb3R0b21SZWFjaGVkLmVtaXQoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlJykgbWF0QXV0b2NvbXBsZXRlOiBNYXRBdXRvY29tcGxldGU7XHJcbiAgQFZpZXdDaGlsZCgnbWF0SW5wdXQnKSBtYXRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgcHJvdGVjdGVkIHNhZmVFcnJvcnM6IFNhZmVIdG1sW10gPSBbXTtcclxuICBwcm90ZWN0ZWQgdmFsdWU6IGFueTtcclxuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZTogYW55ID0gJyc7XHJcbiAgcHJvdGVjdGVkIGlzSW5wdXRGb2N1cyA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBhdXRvY29tcGxldGVUeXBlID0gQXV0b2NvbXBsZXRlO1xyXG4gIHByb3RlY3RlZCBpc092ZXJMYXBwaW5nID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIGlzT3ZlcmxhcENoZWNraW5nID0gdHJ1ZTtcclxuICBwcm90ZWN0ZWQgb3ZlcmxhcEluZGV4ID0gMDtcclxuICBwcm90ZWN0ZWQgaW5wdXRPcGFjaXR5ID0gMTtcclxuICBwcm90ZWN0ZWQgZmlyc3RUYWdNYXhXaWR0aDogbnVtYmVyID0gMDtcclxuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZVNlYXJjaCQgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xyXG4gIHByb3RlY3RlZCB1c2VySW5wdXQkID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcclxuICBwcm90ZWN0ZWQgZHluYW1pY0ZpbHRlcmVkTGlzdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdIHwgbnVsbD4obnVsbCk7XHJcbiAgcHJvdGVjdGVkIGZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShcclxuICAgIHN0YXJ0V2l0aCgnJyksXHJcbiAgICBtYXAoaW5wdXRWYWx1ZSA9PlxyXG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aFxyXG4gICAgICAgID8gQXV0b2NvbXBsZXRlVXRpbHMuZmlsdGVySXRlbXModGhpcy5pdGVtc0xpc3QsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkLCB0aGlzLmlzR3JvdXBlZClcclxuICAgICAgICA6IG51bGxcclxuICAgIClcclxuICApO1xyXG4gIHByb3RlY3RlZCBmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShcclxuICAgIG1hcChpbnB1dFZhbHVlID0+XHJcbiAgICAgIGlucHV0VmFsdWUubGVuZ3RoID8gQXV0b2NvbXBsZXRlVXRpbHMuZmlsdGVySXRlbXModGhpcy5zdWdnZXN0aW9uc0xpc3QsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkKSA6IG51bGxcclxuICAgIClcclxuICApO1xyXG4gIHByb3RlY3RlZCBzYXZlZFZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xyXG4gIHByb3RlY3RlZCBzYXZlZFZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgc2Nyb2xsRXZlbnQgPSAoZXZlbnQ6IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgaXNOb3RBdXRvY29tcGxldGVTY3JvbGwgPVxyXG4gICAgICAhZXZlbnQudGFyZ2V0Py5pZD8uaW5jbHVkZXMoJ21hdC1hdXRvY29tcGxldGUtJykgJiZcclxuICAgICAgIWV2ZW50LnRhcmdldD8ucGFyZW50RWxlbWVudD8uaWQ/LmluY2x1ZGVzKCdtYXQtYXV0b2NvbXBsZXRlLScpICYmXHJcbiAgICAgICFldmVudC50YXJnZXQ/LmNsYXNzTGlzdD8uY29udGFpbnMoJ21hdC1tZGMtYXV0b2NvbXBsZXRlLXRyaWdnZXInKTtcclxuXHJcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGUucGFuZWxPcGVuICYmIGlzTm90QXV0b2NvbXBsZXRlU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlUGFuZWwoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgc2VhcmNoUmVzdWx0JCA9IHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQucGlwZShtYXAoaW5wdXRWYWx1ZSA9PiAhIWlucHV0VmFsdWUudHJpbSgpKSk7XHJcbiAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uQ29udGV4dCA9ICdBVVRPQ09NUExFVEUuJztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQXV0b2NvbXBsZXRlVXRpbHMgPSBBdXRvY29tcGxldGVVdGlscztcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzUGxhdGZvcm0gPSBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpO1xyXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XHJcbiAgcHJvdGVjdGVkIGtleWJvYXJkRm9jdXNlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHJvdGVjdGVkIGlucHV0VmFsdWVJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIGlzQWxyZWFkeUFkZGVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdCgnQ0FOT1BZVUlfREVGQVVMVF9BUFBMSUNBVElPTl9USEVNRScpIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEFwcFRoZW1lOiBBcHBsaWNhdGlvblRoZW1lLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkOiBhbnksXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcclxuICApIHtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkZWZhdWx0QXBwVGhlbWUpIHtcclxuICAgICAgdGhpcy5hcHBsaWNhdGlvblRoZW1lID0gZGVmYXVsdEFwcFRoZW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlckRpc3BsYXlDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNEeW5hbWljRmlsdGVyaW5nRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXNMaXN0JCA9IHRoaXMuZHluYW1pY0ZpbHRlcmVkTGlzdCQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIG1hcmsgY29tcG9uZW50IHZpZXcgYXMgZGlydHkgd2hlbiB0b3VjaGVkIHByb2dyYW1tYXRpY2FsbHkgd2l0aCBtYXJrQXNUb3VjaGVkL21hcmtBbGxBc1RvdWNoZWQgb3IgZXJyb3JzXHJcbiAgICogdG8gZGlzcGxheSB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IG1pZ2h0IGhhcHBlbiAoZS5nLiByZXF1aXJlZClcclxuICAgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxyXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbD8udG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbD8uZXJyb3JzKSB7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0R5bmFtaWNGaWx0ZXJpbmdFbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXJlZExpc3QgPSBjaGFuZ2VzWydkeW5hbWljRmlsdGVyZWRMaXN0J10/LmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgIGlmIChkeW5hbWljRmlsdGVyZWRMaXN0KSB7XHJcbiAgICAgICAgdGhpcy5keW5hbWljRmlsdGVyZWRMaXN0JC5uZXh0KGR5bmFtaWNGaWx0ZXJlZExpc3QpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2hhbmdlc1snZHluYW1pY0ZpbHRlckxvYWRpbmcnXT8uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5keW5hbWljRmlsdGVyZWRMaXN0JC5uZXh0KFtdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydpdGVtc0xpc3QnXSB8fCBjaGFuZ2VzWydzdWdnZXN0aW9uc0xpc3QnXSB8fCBjaGFuZ2VzWyd2YWx1ZUZpZWxkJ10pIHtcclxuICAgICAgdGhpcy5pdGVtc0xpc3QgPSB0aGlzLmlzR3JvdXBlZFxyXG4gICAgICAgID8gdGhpcy5pdGVtc0xpc3RcclxuICAgICAgICA6IEF1dG9jb21wbGV0ZVV0aWxzLmV4Y2x1ZGVTdWdnZXN0aW9ucyh0aGlzLml0ZW1zTGlzdCwgdGhpcy5zdWdnZXN0aW9uc0xpc3QsIHRoaXMudmFsdWVGaWVsZCk7XHJcbiAgICAgIHRoaXMuaW5pdFZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNQbGF0Zm9ybSAmJiBjaGFuZ2VzWydjb21wYW55Q29sb3InXSkge1xyXG4gICAgICB0aGlzLnNldENvbXBhbnlDb2xvclZhcmlhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnR5cGUgIT09IEF1dG9jb21wbGV0ZS5MQVJHRSkge1xyXG4gICAgICB0aGlzLmNoZWNrT3ZlcmxhcChUaW1lb3V0LlZJRVdfSU5JVElBTElaRURfQ09NUE9ORU5UX0xPQUQsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1BsYXRmb3JtICYmIHRoaXMuc2V0Q29tcGFueUNvbG9yVmFyaWFibGUoKTtcclxuICAgIGlmICh0aGlzLmNsb3NlT25TY3JvbGwpIHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRXZlbnQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9jdXNNb25pdG9yXHJcbiAgICAgIC5tb25pdG9yKHRoaXMubWF0SW5wdXQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKG9yaWdpbiA9PlxyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmtleWJvYXJkRm9jdXNlZC5zZXQob3JpZ2luID09PSAna2V5Ym9hcmQnKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG5cclxuICAgIHRoaXMubWF0SW5wdXQubmF0aXZlRWxlbWVudC5vbmtleWRvd24gPSB0aGlzLm9uS2V5ZG93bi5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1jb25mbGljdGluZy1saWZlY3ljbGVcclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbEV2ZW50LCB0cnVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xyXG4gICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XHJcbiAgb25Ub3VjaCA9ICgpID0+IHt9O1xyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy52YWx1ZVByaW1pdGl2ZSAmJiB0aGlzLnRleHRGaWVsZCAmJiB0aGlzLnZhbHVlRmllbGQpIHtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQXV0b2NvbXBsZXRlLlNJTkdMRSkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLml0ZW1zTGlzdC5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpXHJcbiAgICAgICAgICA/IHRoaXMuaXRlbXNMaXN0LmZpbHRlcihpdGVtID0+IHZhbHVlLmZpbmQoKHY6IGFueSkgPT4gdiA9PT0gaXRlbVt0aGlzLnZhbHVlRmllbGRdKSlcclxuICAgICAgICAgIDogW3RoaXMuaXRlbXNMaXN0LmZpbmQoaXRlbSA9PiBpdGVtW3RoaXMudmFsdWVGaWVsZF0gPT09IHZhbHVlKV07XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA/IHRoaXMudmFsdWUgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmluZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuaW5pdFZhbHVlKCk7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlucHV0VmFsdWVJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmluaXRWYWx1ZSgpO1xyXG5cclxuICAgICAgdGhpcy5pbnB1dFZhbHVlSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBpc0dyb3VwZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtc0xpc3Q/LnNvbWUoKGl0ZW06IGFueSkgPT4gaXRlbS5pc0dyb3VwKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZXZlbnQub3B0aW9uLnZhbHVlO1xyXG4gICAgY29uc3QgaXRlbVZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMuY3JlYXRlVmFsdWVJdGVtKGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkLCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgdGhpcy5hZGROZXdWYWx1ZShpdGVtVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xyXG4gICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlLCB0aGlzLnRleHRGaWVsZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm9uVXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25PcHRpb25SZW1vdmVkKG9wdGlvbjogYW55KTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlUGFuZWwoKSwgMCk7XHJcbiAgICBjb25zdCBmb3VuZFZhbHVlID0gdGhpcy52YWx1ZS5maW5kKCh2OiBhbnkpID0+ICh0aGlzLmNvbXBhcmVXaXRoID8gdGhpcy5jb21wYXJlV2l0aCh2LCBvcHRpb24pIDogdiA9PT0gb3B0aW9uKSk7XHJcblxyXG4gICAgaWYgKGZvdW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKCh2OiBhbnkpID0+ICh0aGlzLmNvbXBhcmVXaXRoID8gIXRoaXMuY29tcGFyZVdpdGgodiwgb3B0aW9uKSA6IHYgIT09IG9wdGlvbikpO1xyXG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICBpZiAob3B0aW9uLnZhbHVlLnZhbHVlID09PSBmb3VuZFZhbHVlLnZhbHVlKSB7XHJcbiAgICAgICAgICBvcHRpb24uZGVzZWxlY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5NVUxUSSkge1xyXG4gICAgICB0aGlzLmNoZWNrT3ZlcmxhcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vblVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuICAgIHRoaXMudXNlcklucHV0JC5uZXh0KGlucHV0VmFsdWUpO1xyXG4gICAgaWYgKGlucHV0VmFsdWUubGVuZ3RoID49IHRoaXMubWluQ2hhcmFjdGVyc1NlYXJjaCkge1xyXG4gICAgICB0aGlzLmlucHV0VmFsdWVTZWFyY2gkLm5leHQoaW5wdXRWYWx1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZS5lbWl0KGlucHV0VmFsdWUpO1xyXG4gICAgICBjb25zdCBpdGVtTGlzdCA9IHRoaXMuaXNHcm91cGVkID8gdGhpcy5pdGVtc0xpc3QuZmxhdE1hcChncm91cHMgPT4gZ3JvdXBzLml0ZW1zKSA6IHRoaXMuaXRlbXNMaXN0LmZsYXQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpbmRWYWx1ZSA9IFsuLi50aGlzLnN1Z2dlc3Rpb25zTGlzdCwgLi4uaXRlbUxpc3RdLmZpbmQoXHJcbiAgICAgICAgdiA9PiBpbnB1dFZhbHVlID09PSAodGhpcy50ZXh0RmllbGQgPyB2W3RoaXMudGV4dEZpZWxkXSA6IHYpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gQXV0b2NvbXBsZXRlVXRpbHMuY291bnRNYXRjaGluZ1dvcmRzKFxyXG4gICAgICAgIFsuLi50aGlzLnN1Z2dlc3Rpb25zTGlzdCwgLi4uaXRlbUxpc3RdLFxyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSxcclxuICAgICAgICB0aGlzLnRleHRGaWVsZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZmluZFZhbHVlICYmIGNvdW50ID09PSAxICYmIHRoaXMuZXhhY3RNYXRjaFNlbGVjdCkge1xyXG4gICAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZCh7IG9wdGlvbjogeyB2YWx1ZTogZmluZFZhbHVlIH0gfSBhcyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcclxuICAgICAgdGhpcy51c2VySW5wdXQkLm5leHQoJycpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0FscmVhZHlBZGRlZCA9ICEhKHRoaXMuY29tcGFyZVdpdGhcclxuICAgICAgPyB0aGlzLnZhbHVlLmZpbmQoKHY6IGFueSkgPT4gdGhpcy5jb21wYXJlV2l0aCh2LCBpbnB1dFZhbHVlKSlcclxuICAgICAgOiBBdXRvY29tcGxldGVVdGlscy5maW5kRHVwbGljYXRlKHRoaXMudmFsdWUsIGlucHV0VmFsdWUsIHRoaXMudGV4dEZpZWxkKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25DbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xyXG4gICAgdGhpcy52YWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgPyBbXSA6ICcnO1xyXG4gICAgdGhpcy5pc092ZXJMYXBwaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLm92ZXJsYXBJbmRleCA9IDA7XHJcbiAgICB0aGlzLm9uVXBkYXRlKCk7XHJcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZT8ub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBvcHRpb24uZGVzZWxlY3QoKSk7XHJcbiAgICB0aGlzLm9uVG91Y2goKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWZpbGxJbnB1dCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUgJiYgIXRoaXMuaW5wdXRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlLCB0aGlzLnRleHRGaWVsZCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5wdXRWYWx1ZSAmJiB0aGlzLnZhbHVlPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSAnICc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dFZhbHVlICYmIHRoaXMudHlwZSA9PT0gQXV0b2NvbXBsZXRlLlNJTkdMRSAmJiB0aGlzLnZhbHVlICYmIE9iamVjdC5rZXlzKHRoaXMudmFsdWUpLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IEF1dG9jb21wbGV0ZVV0aWxzLnRyYW5zZm9ybURpc3BsYXlWYWx1ZShcclxuICAgICAgICAgIEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlWzBdIDogdGhpcy52YWx1ZSxcclxuICAgICAgICAgIHRoaXMudGV4dEZpZWxkXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmlucHV0VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSAnICc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVNlYXJjaCQubmV4dCgnJyk7XHJcbiAgICAgIHRoaXMudXNlcklucHV0JC5uZXh0KCcnKTtcclxuICAgICAgdGhpcy5pc0lucHV0Rm9jdXMgPSBmYWxzZTtcclxuICAgICAgdGhpcy5vblRvdWNoKCk7XHJcbiAgICAgIHRoaXMuYmx1ci5lbWl0KCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnb3RvVXAoKSB7XHJcbiAgICBpZiAodGhpcy5zYXZlZFZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xyXG4gICAgICB0aGlzLnNhdmVkVmlydHVhbFNjcm9sbFZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoMCk7XHJcbiAgICAgIHRoaXMuc2F2ZWRWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0lucHV0Rm9jdXMgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMuaW5wdXRWYWx1ZSkgPyB0aGlzLmlucHV0VmFsdWVbMF0gOiB0aGlzLmlucHV0VmFsdWU7XHJcblxyXG4gICAgaWYgKEF1dG9jb21wbGV0ZVV0aWxzLmlzUHJpbWl0aXZlKGlucHV0VmFsdWUpKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgaW5wdXRWYWx1ZSAhPT0gJ251bWJlcicgJiYgaW5wdXRWYWx1ZT8ubWF0Y2goL15cXHMrL2dtKSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUudHJpbVN0YXJ0KCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbnB1dFZhbHVlW3RoaXMudGV4dEZpZWxkXT8ubWF0Y2goL15cXHMrL2dtKSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWVbdGhpcy50ZXh0RmllbGRdLnRyaW1TdGFydCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvY3VzLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tPdmVybGFwKGRlbGF5ID0gVGltZW91dC5WSUVXX0lOSVRJQUxJWkVEX0FGVEVSX0FDVElPTiwgaW5pdCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3ZlckxhcHBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNPdmVybGFwQ2hlY2tpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5pbnB1dE9wYWNpdHkgPSAwO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbnB1dFdpZHRoID0gdGhpcy5pbnB1dFdpZHRoO1xyXG4gICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnZhbHVlLXRhZycpO1xyXG4gICAgICBpZiAodGFncykge1xyXG4gICAgICAgIGxldCB3aWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IGZpcnN0VGFnV2lkdGggPSAwO1xyXG5cclxuICAgICAgICB0YWdzLmZvckVhY2goKHRhZzogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICB3aWR0aCArPSB0YWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcblxyXG4gICAgICAgICAgaWYgKCFpbmRleCkge1xyXG4gICAgICAgICAgICBmaXJzdFRhZ1dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaW5wV2lkdGggPSB0aGlzLmZvcm1GaWVsZEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSAyMDtcclxuICAgICAgICAgIHRoaXMuZmlyc3RUYWdNYXhXaWR0aCA9XHJcbiAgICAgICAgICAgIHRhZ3MubGVuZ3RoID4gMVxyXG4gICAgICAgICAgICAgID8gaW5wV2lkdGggLVxyXG4gICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudCA9PT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV05cclxuICAgICAgICAgICAgICAgICAgPyBQYWRkaW5nLkRST1BET1dOX1NQQUNFX0NPTlRBSU5FUlxyXG4gICAgICAgICAgICAgICAgICA6IFBhZGRpbmcuQVVUT0NPTVBMRVRFX1NQQUNFX0NPTlRBSU5FUilcclxuICAgICAgICAgICAgICA6IGlucFdpZHRoO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5pc092ZXJMYXBwaW5nICYmIHdpZHRoID4gaW5wdXRXaWR0aCAmJiBpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pc092ZXJMYXBwaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vdmVybGFwSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlzT3ZlcmxhcENoZWNraW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGluaXQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gQXV0b2NvbXBsZXRlVXRpbHMudHJhbnNmb3JtRGlzcGxheVZhbHVlKHRoaXMudmFsdWVbMF0sIHRoaXMudGV4dEZpZWxkKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcgJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFnQ29udGFpbmVyV2lkdGggPSB0aGlzLnRhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG4gICAgICAgIHRoaXMudGFnQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSB0YWdDb250YWluZXJXaWR0aCAvIDEwMCA/ICcxMDAlJyA6IHRhZ0NvbnRhaW5lcldpZHRoICsgJ3B4JztcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlucHV0T3BhY2l0eSA9IDE7XHJcbiAgICB9LCBkZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlU2VhcmNoJC5uZXh0KCcnKTtcclxuICAgIHRoaXMudXNlcklucHV0JC5uZXh0KCcnKTtcclxuICAgIGlmICghdGhpcy52YWx1ZVByaW1pdGl2ZSkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQXV0b2NvbXBsZXRlLlNJTkdMRSkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZVt0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUubWFwKCh2OiBhbnkpID0+IHZbdGhpcy52YWx1ZUZpZWxkXSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUNvbnRyb2xNYXhMZW5ndGhWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udHJvbE1heExlbmd0aFZhbGlkaXR5KCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMubmdDb250cm9sPy5jb250cm9sO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy50eXBlICE9PSBBdXRvY29tcGxldGUuU0lOR0xFKSB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3JzID0gY29udHJvbC5lcnJvcnMgfHwge307XHJcblxyXG4gICAgICBpZiAodGhpcy52YWx1ZS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TZWxlY3RlZCkge1xyXG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIC4uLmV4aXN0aW5nRXJyb3JzLFxyXG4gICAgICAgICAgbWF4SXRlbVNlbGVjdGVkOiB7XHJcbiAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLm1heEl0ZW1TZWxlY3RlZCxcclxuICAgICAgICAgICAgYWN0dWFsOiB0aGlzLnZhbHVlLmxlbmd0aCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nRXJyb3JzWydtYXhJdGVtU2VsZWN0ZWQnXSkge1xyXG4gICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRXJyb3JzWydtYXhJdGVtU2VsZWN0ZWQnXTtcclxuICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGV4aXN0aW5nRXJyb3JzKS5sZW5ndGggPyBleGlzdGluZ0Vycm9ycyA6IG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0VmFsdWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLmF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFICYmIHRoaXMudmFyaWFudCAhPT0gRHJvcGRvd25WYXJpYXRpb24uRFJPUERPV04pIHtcclxuICAgICAgaWYgKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUodGhpcy52YWx1ZVswXSwgdGhpcy50ZXh0RmllbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMudmFsdWUgPyBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUodGhpcy52YWx1ZSwgdGhpcy50ZXh0RmllbGQpIDogJyc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYW50ID09PSBEcm9wZG93blZhcmlhdGlvbi5EUk9QRE9XTikge1xyXG4gICAgICB0aGlzLmlucHV0VmFsdWUgPVxyXG4gICAgICAgIChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHRoaXMudmFsdWUpICYmICF0aGlzLnZhbHVlPy5sZW5ndGgpIHx8ICF0aGlzLnZhbHVlXHJcbiAgICAgICAgICA/ICcnXHJcbiAgICAgICAgICA6IHRoaXMudHlwZSA9PT0gQXV0b2NvbXBsZXRlLlNJTkdMRVxyXG4gICAgICAgICAgPyBBdXRvY29tcGxldGVVdGlscy50cmFuc2Zvcm1EaXNwbGF5VmFsdWUoXHJcbiAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWVbMF0gOiB0aGlzLnZhbHVlLFxyXG4gICAgICAgICAgICAgIHRoaXMudGV4dEZpZWxkXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIDogJyAnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA/ICcgJyA6ICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLk1VTFRJKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tPdmVybGFwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnR5cGUgIT09IHRoaXMuYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUgJiYgIXRoaXMudmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvdW5kRHVwbGljYXRlID0gdGhpcy5jb21wYXJlV2l0aFxyXG4gICAgICA/IHRoaXMudmFsdWUuZmluZCgodjogYW55KSA9PiB0aGlzLmNvbXBhcmVXaXRoKHYsIG5ld1ZhbHVlKSlcclxuICAgICAgOiBBdXRvY29tcGxldGVVdGlscy5maW5kRHVwbGljYXRlKHRoaXMudmFsdWUsIG5ld1ZhbHVlLCB0aGlzLnRleHRGaWVsZCk7XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdGhpcy5hdXRvY29tcGxldGVUeXBlLlNJTkdMRSkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gZm91bmREdXBsaWNhdGVcclxuICAgICAgICA/IHRoaXMudmFsdWUuZmlsdGVyKCh2OiBhbnkpID0+XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZVdpdGggPyAhdGhpcy5jb21wYXJlV2l0aCh2LCBmb3VuZER1cGxpY2F0ZSkgOiB2ICE9PSBmb3VuZER1cGxpY2F0ZVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogWy4uLnRoaXMudmFsdWUsIG5ld1ZhbHVlXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXQgaXNEcm9wZG93bigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09IERyb3Bkb3duVmFyaWF0aW9uLkRST1BET1dOO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uQ2hldnJvbkNsaWNrKGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlKTogdm9pZCB7XHJcbiAgICBpZiAoYXV0b2NvbXBsZXRlLmlzT3Blbikge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBpbnB1dFdpZHRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmZvcm1GaWVsZEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLVxyXG4gICAgICAodGhpcy5pc0Ryb3Bkb3duID8gUGFkZGluZy5EUk9QRE9XTl9DT05UQUlORVIgOiBQYWRkaW5nLkFVVE9DT01QTEVURV9DT05UQUlORVIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHRyYWNrQnlGbiA9IChpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSA9PiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xyXG5cclxuICAvKipcclxuICAgKiBBZGRpbmcgY29tcGFueSBjb2xvciB2YXJpYWJsZSB0byB0aGUgYm9keSB0byBzdHlsZSBvdmVybGF5IGNvbnRhaW5lciB0aGF0J3Mgb3V0IG9mIHRoZSBjb21wb25lbnQgc2NvcGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRDb21wYW55Q29sb3JWYXJpYWJsZSgpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJy0tdWktYXV0b2NvbXBsZXRlLW9wdGlvbi1jb2xvcicsIGAke3RoaXMuY29tcGFueUNvbG9yfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVyRGlzcGxheUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGF1dG9jb21wbGV0ZUhvc3RFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xyXG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaChtdXRhdGlvbiA9PiB7XHJcbiAgICAgICAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdzdHlsZScpIHtcclxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoYXV0b2NvbXBsZXRlSG9zdEVsZW1lbnQpLmRpc3BsYXk7XHJcbiAgICAgICAgICBpZiAoZGlzcGxheVN0eWxlICE9PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJsYXAoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGF1dG9jb21wbGV0ZUhvc3RFbGVtZW50LCB7XHJcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXHJcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGhhc09iamVjdFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPyAhIU9iamVjdC5rZXlzKHRoaXMudmFsdWUpLmxlbmd0aCA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25LZXlkb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3Qgb3B0aW9uSGVpZ2h0ID0gNDg7XHJcblxyXG4gICAgaWYgKCRldmVudC5rZXkgPT09IElLZXlib2FyZEV2ZW50LkhPTUUpIHtcclxuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XHJcbiAgICB9IGVsc2UgaWYgKCRldmVudC5rZXkgPT09IElLZXlib2FyZEV2ZW50LkVORCkge1xyXG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIGlmICgkZXZlbnQua2V5ID09PSBJS2V5Ym9hcmRFdmVudC5QQUdFX0RPV04pIHtcclxuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcclxuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcclxuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSBpZiAoJGV2ZW50LmtleSA9PT0gSUtleWJvYXJkRXZlbnQuUEFHRV9VUCkge1xyXG4gICAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcclxuICAgICAgdGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XHJcbiAgICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlLl9zZXRTY3JvbGxUb3AodGhpcy5tYXRBdXRvY29tcGxldGUuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4ISAqIG9wdGlvbkhlaWdodCk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXI+XHJcbiAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS13cmFwcGVyXCIgW25nQ2xhc3NdPVwieyAnZnVsbC13aWR0aCc6IGZ1bGxXaWR0aCwgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICBbY29sb3JdPVwiKHNhZmVFcnJvcnMubGVuZ3RoIHx8IChuZ0NvbnRyb2w/LmVycm9ycyAmJiBuZ0NvbnRyb2w/LnRvdWNoZWQgKSB8fCAoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+IG1heEl0ZW1TZWxlY3RlZCB8fCAoKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgPj0gbWF4SXRlbVNlbGVjdGVkICYmIChpbnB1dFZhbHVlICYmIGlucHV0VmFsdWUgIT09ICcgJykpICkgPyAnd2FybicgOiAnYWNjZW50J1wiXHJcbiAgICAgIFthcHBlYXJhbmNlXT1cIidvdXRsaW5lJ1wiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2xhcmdlLXNpemUnOiB0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLkxBUkdFLCAnaGlkZS1ib3R0b20tY29udGVudCc6ICFzaG93Qm90dG9tQ29udGVudCwgJ2tleWJvYXJkLWZvY3VzZWQnOiBrZXlib2FyZEZvY3VzZWQoKSwgJ2hhcy1sYWJlbCc6ICEhbGFiZWwgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19IDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIj4qPC9zcGFuPjwvbWF0LWxhYmVsPlxyXG4gICAgICA8ZGl2ICNmb3JtRmllbGQgY2xhc3M9XCJpbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgICA8c3BhbiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogLTk5OTlweFwiICpuZ0lmPVwidGV4dEZpZWxkID8gdmFsdWU/Llt0ZXh0RmllbGRdIDogdmFsdWUgPT09IGlucHV0VmFsdWVcIlxyXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7ICgoJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSArICcgJyArIGlucHV0VmFsdWUgfX08L3NwYW4+XHJcblxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgI3RyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcclxuICAgICAgICAgICNtYXRJbnB1dFxyXG4gICAgICAgICAgW21heExlbmd0aF09XCJtYXhMZW5ndGhcIlxyXG4gICAgICAgICAgW3VpUHJldmVudElucHV0XT1cIiFhbGxvd1VzZXJJbnB1dFwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAndW5zZXQtbWFyZ2luJzogdGhpcy52YWx1ZSAmJiB0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLkxBUkdFLCAnbm8tY2FyZXQnOiAhYWxsb3dVc2VySW5wdXQgfVwiXHJcbiAgICAgICAgICAoYmx1cik9XCJyZWZpbGxJbnB1dCgpXCJcclxuICAgICAgICAgIChmb2N1c2luKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSArICcgJyArICh2YWx1ZSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCA6IHRydWUpXCJcclxuICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cInR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTVVMVEkgPyBpbnB1dE9wYWNpdHkgOiAxXCJcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidmFsdWUgJiYgdmFsdWUubGVuZ3RoID8gJyc6IHBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXHJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdGVkLWl0ZW1zXCJcclxuICAgICAgICAgICN0YWdDb250YWluZXJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICh0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLkxBUkdFICYmIHRoaXMudmFsdWUpIHx8XHJcbiAgICAgICAgICAgICghKGlucHV0VmFsdWUgJiYgdGhpcy5pc0lucHV0Rm9jdXMpICYmIHRoaXMudmFsdWUgJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDx1aS10YWdcclxuICAgICAgICAgICAgY2xhc3M9XCJ2YWx1ZS10YWdcIlxyXG4gICAgICAgICAgICBbaWRdPVwiJ3VpLXRhZy0nICsgaVwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZUl0ZW0gb2YgdmFsdWU7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwidmFsdWVJdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgW2FsbG93Q2xvc2VdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxyXG4gICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJ0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJID8gaW5wdXRPcGFjaXR5IDogMVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIihpc092ZXJMYXBwaW5nICYmIGkgPiAwICYmIGkgPj0gb3ZlcmxhcEluZGV4KSB8fCAoc2l6ZSA9PT0gJ3NtYWxsJyAmJiB2YWx1ZS5sZW5ndGggPiAxKSAgPyAnbm9uZScgOiAnYmxvY2snXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnLS10YWctbWF4LXdpZHRoJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSA/ICdmaXQtY29udGVudCcgOiBmaXJzdFRhZ01heFdpZHRoICsgJ3B4JyB9XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICdvdmVybGFwLXRhZyc6IGlzT3ZlcmxhcENoZWNraW5nICYmIG92ZXJsYXBJbmRleCAmJiBpID49IG92ZXJsYXBJbmRleCAmJiB0eXBlID09PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAoY2xvc2UpPVwib25PcHRpb25SZW1vdmVkKHZhbHVlSXRlbSlcIlxyXG4gICAgICAgICAgPjwvdWktdGFnPlxyXG4gICAgICAgICAgQGlmIChzaXplID09PSAnc21hbGwnKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1jb3VudFwiICpuZ0lmPVwidmFsdWUubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgIHt7ICh0cmFuc2xhdGlvbkNvbnRleHQgKyAnU0VMRUNURURfQU1PVU5UJyB8IHVpVHJhbnNsYXRlIDogeyBudW1iZXJTZWxlY3RlZDogKHZhbHVlIHwgc2xpY2U6IG92ZXJsYXBJbmRleCkubGVuZ3RoIH0pIHwgYXN5bmMgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZhbHVlLmxlbmd0aCA+IDEgJiYgaXNPdmVyTGFwcGluZ1wiIGNsYXNzPVwib3ZlcmxhcC1jb3VudFwiPlxyXG4gICAgICAgICAgICAgIDx1aS10YWcgW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJysnICsgKHZhbHVlLmxlbmd0aCAtIG92ZXJsYXBJbmRleClcIj48L3VpLXRhZz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHVpLWljb25cclxuICAgICAgICAqbmdJZj1cImNsZWFyYWJsZSAmJiAodHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUgJiYgKHZhbHVlPy5sZW5ndGggfHwgaGFzT2JqZWN0VmFsdWUpKSB8fCAodHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEUgJiYgdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMSAmJiAoKEF1dG9jb21wbGV0ZVV0aWxzLmlzUHJpbWl0aXZlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpIHx8ICghQXV0b2NvbXBsZXRlVXRpbHMuaXNQcmltaXRpdmUodmFsdWUpICYmIChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggfHwgIUF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpKSkpXCJcclxuICAgICAgICBjbGFzcz1cInJlbW92ZS1zZWxlY3RlZFwiXHJcbiAgICAgICAgW3RhYkluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcclxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvbkNsZWFyKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7ICdsYXJnZS1pbnB1dC1pY29uJzogdHlwZSA9PT0gYXV0b2NvbXBsZXRlVHlwZS5MQVJHRSB9XCJcclxuICAgICAgICAoY2xpY2spPVwib25DbGVhcigpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgW3NpemVdPVwiJzI0J1wiXHJcbiAgICAgICAgW2NvbG9yXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdpbmhlcml0JyA6ICdyZWJyYW5kLWJsYWNrJ1wiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ0NPTU1PTi5DTEVBUicpIHwgdWlUcmFuc2xhdGUgfCBhc3luY1wiXHJcbiAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Nsb3NlJyA6ICdDbG9zZS1pbi1saW5lJ1wiXHJcbiAgICAgID48L3VpLWljb24+XHJcblxyXG4gICAgICA8dWktaWNvblxyXG4gICAgICAgIGNsYXNzPVwiYXJyb3ctc3RhdGVcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBhdXRvY29tcGxldGUuaXNPcGVuLCAnbGFyZ2UtaW5wdXQtaWNvbic6IHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuTEFSR0UgfVwiXHJcbiAgICAgICAgKm5nSWY9XCJpc0Ryb3Bkb3duXCJcclxuICAgICAgICBbc2l6ZV09XCInMjQnXCJcclxuICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lICE9PSAnY2xhc3NpYycgPyAnQXJyb3ctY2hldnJvbi1kb3duLWluLWxpbmUnIDogJ0Fycm93X2Rvd24nXCJcclxuICAgICAgICAoY2xpY2spPVwib25DaGV2cm9uQ2xpY2soYXV0b2NvbXBsZXRlKVwiXHJcbiAgICAgID48L3VpLWljb24+XHJcblxyXG5cclxuICAgICAgPG1hdC1hdXRvY29tcGxldGVcclxuICAgICAgICAjYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgW2NsYXNzXT1cImFwcGxpY2F0aW9uVGhlbWUgKyAnICcgKyBkcm9wZG93blBhbmVsQ2xhc3NcIlxyXG4gICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cImFwcGxpY2F0aW9uVGhlbWUgIT09ICdjbGFzc2ljJ1wiXHJcbiAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwiZmFsc2VcIlxyXG4gICAgICAgIChvcGVuZWQpPVwiZ290b1VwKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgQGlmICh0eXBlICE9PSBhdXRvY29tcGxldGVUeXBlLk1VTFRJIHx8IHZhbHVlPy5sZW5ndGggPCBtYXhJdGVtU2VsZWN0ZWQpIHtcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHNlYXJjaFJlc3VsdCQgfCBhc3luYylcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0Ryb3Bkb3duOyBlbHNlIGRyb3Bkb3duTGlzdFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NVR0dFU1RFRCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYykhIHwgdXBwZXJjYXNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3VnZ2VzdGlvbnNMaXN0Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogc3VnZ2VzdGVkIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcclxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN1Z2dlc3RlZCBvZiBzdWdnZXN0aW9uc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic3VnZ2VzdGVkXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgc3VnZ2VzdGVkIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cclxuXHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnU0VMRUNURUQnKSB8IHVpVHJhbnNsYXRlIHwgYXN5bmMpISB8IHVwcGVyY2FzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggJiYgdHlwZSAhPT0gYXV0b2NvbXBsZXRlVHlwZS5TSU5HTEVcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcblxyXG5cclxuICAgICAgICAgICAgICBAaWYgKGlzR3JvdXBlZCkge1xyXG4gICAgICAgICAgICAgICAgQGZvciAoZ3JvdXAgb2YgaXRlbXNMaXN0OyB0cmFjayBncm91cCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5ncm91cE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCJncm91cC5ncm91cE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5pdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5pdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cIigodHJhbnNsYXRpb25Db250ZXh0ICsgJ1NFTEVDVEVEJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ2YWx1ZT8ubGVuZ3RoICYmIHR5cGUgPT09IGF1dG9jb21wbGV0ZVR5cGUuU0lOR0xFXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3NlbGVjdGVkLW9wdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyB2YWx1ZSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkcm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCAqbmdJZj1cInZpcnR1YWxTY3JvbGwgfHwgaW5maW5pdGVTY3JvbGw7IGVsc2UgZGVmYXVsdFZpZXdQb3J0XCIgW2l0ZW1TaXplXT1cIjQ4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzIwMHB4J1wiIGNsYXNzPVwidmlydHVhbC1zY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgIEBpZiAoIWlzR3JvdXBlZCkge1xyXG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgQGlmKGluZmluaXRlU2Nyb2xsICYmIGhhc01vcmVPcHRpb25zRm9ySW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImxvYWRpbmctb3B0aW9uXCIgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIidub25lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1zcGlubmVyIHNpemU9XCJzbWFsbFwiIFtpc0xvYWRlcl09XCJmYWxzZVwiPjwvdWktc3Bpbm5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIEBmb3IgKGdyb3VwIG9mIGl0ZW1zTGlzdDsgdHJhY2sgZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLmdyb3VwTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiZ3JvdXAuZ3JvdXBOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIGdyb3VwLml0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpjZGtWaXJ0dWFsRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWaWV3UG9ydD5cclxuICAgICAgICAgICAgICAgIEBpZiAoIWlzR3JvdXBlZCkge1xyXG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBAZm9yIChncm91cCBvZiBpdGVtc0xpc3Q7IHRyYWNrIGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5ncm91cE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgW2xhYmVsXT1cImdyb3VwLmdyb3VwTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtb3B0aW9uJzogaXRlbSB8IGluY2x1ZGVzOiB2YWx1ZSA6IHZhbHVlRmllbGQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZFN1Z2dlc3Rpb25MaXN0JCB8IGFzeW5jIGFzIGZpbHRlcmVkU3VnZ2VzdGlvbkxpc3RcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkSXRlbXNMaXN0JCB8IGFzeW5jIGFzIGZpbHRlcmVkSXRlbXNMaXN0XCI+XHJcbiAgICAgICAgICAgICAgQGlmIChpc0dyb3VwZWQgJiYgZmlsdGVyZWRJdGVtc0xpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBAZm9yIChncm91cCBvZiBmaWx0ZXJlZEl0ZW1zTGlzdDsgdHJhY2sgZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5ncm91cE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCJncm91cC5ncm91cE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5maWx0ZXJlZEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc2VsZWN0VGV4dF09XCJ1c2VySW5wdXQkIHwgYXN5bmNcIj57eyBpdGVtIHwgdHJhbnNmb3JtSXRlbTogdGV4dEZpZWxkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0NoZWNrJyA6ICdDaGVjay1pbi1saW5lJ1wiPjwvdWktaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cclxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmZpbHRlcmVkSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzZWxlY3RUZXh0XT1cInVzZXJJbnB1dCQgfCBhc3luY1wiPnt7IGl0ZW0gfCB0cmFuc2Zvcm1JdGVtOiB0ZXh0RmllbGQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIFtsYWJlbF09XCIoKHRyYW5zbGF0aW9uQ29udGV4dCArICdTVUdHRVNURUQnKSB8IHVpVHJhbnNsYXRlIHwgYXN5bmMpISB8IHVwcGVyY2FzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlcmVkU3VnZ2VzdGlvbkxpc3QubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT0kZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcclxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRTdWdnZXN0aW9uTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGggJiYgIWlzR3JvdXBlZDsgZWxzZSBzaG93SXRlbUxpc3RXaXRoR3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkLW9wdGlvbic6IGl0ZW0gfCBpbmNsdWRlczogdmFsdWUgOiB2YWx1ZUZpZWxkIH1cIlxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgPT09ICdjbGFzc2ljJyA/ICdDaGVjaycgOiAnQ2hlY2staW4tbGluZSdcIj48L3VpLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0l0ZW1MaXN0V2l0aEdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBbbGFiZWxdPVwiKCh0cmFuc2xhdGlvbkNvbnRleHQgKyAnQUxMX0lURU1TJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jKSEgfCB1cHBlcmNhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlcmVkSXRlbXNMaXN0Lmxlbmd0aCAmJiAhaXNHcm91cGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9JGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZC1vcHRpb24nOiBpdGVtIHwgaW5jbHVkZXM6IHZhbHVlIDogdmFsdWVGaWVsZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3NlbGVjdFRleHRdPVwidXNlcklucHV0JCB8IGFzeW5jXCI+e3sgaXRlbSB8IHRyYW5zZm9ybUl0ZW06IHRleHRGaWVsZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8dWktaWNvbiBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhcHBsaWNhdGlvblRoZW1lID09PSAnY2xhc3NpYycgPyAnQ2hlY2snIDogJ0NoZWNrLWluLWxpbmUnXCI+PC91aS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICBAaWYoaXNEeW5hbWljRmlsdGVyaW5nRW5hYmxlZCAmJiBkeW5hbWljRmlsdGVyTG9hZGluZykge1xyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJsb2FkaW5nLW9wdGlvblwiIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInbm9uZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVpLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCIgW2lzTG9hZGVyXT1cImZhbHNlXCI+PC91aS1zcGlubmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICB9IEBlbHNlIGlmKGlucHV0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIEBpZiAoYWxsb3dBZGQgJiYgIWlzQWxyZWFkeUFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChtb3VzZWRvd24pPSRldmVudC5wcmV2ZW50RGVmYXVsdCgpIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKCdDT01NT04uQUREJykgfCB1aVRyYW5zbGF0ZSB8IGFzeW5jIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLXN1Z2dlc3Rpb25cIj5cInt7IGlucHV0VmFsdWUgfX1cIjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoIWZpbHRlcmVkSXRlbXNMaXN0Lmxlbmd0aCAmJiAhZmlsdGVyZWRTdWdnZXN0aW9uTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIidub25lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICh0cmFuc2xhdGlvbkNvbnRleHQgKyAnTk9fUkVTVUxUU19GT1VORCcpIHwgdWlUcmFuc2xhdGUgfCBhc3luYyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgPG1hdC1oaW50IGNsYXNzPVwiZXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzYWZlRXJyb3JzLmxlbmd0aCB8fCAobmdDb250cm9sPy5lcnJvcnMgfCBoYXNWYWxpZGF0aW9uRXJyb3IpIHx8IChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID4gbWF4SXRlbVNlbGVjdGVkIHx8ICgoQXV0b2NvbXBsZXRlVXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSA+PSBtYXhJdGVtU2VsZWN0ZWQgJiYgKGlucHV0VmFsdWUgJiYgaW5wdXRWYWx1ZSAhPT0gJyAnKSlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3JzXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiKEF1dG9jb21wbGV0ZVV0aWxzLmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkgPiBtYXhJdGVtU2VsZWN0ZWQgfHwgKChBdXRvY29tcGxldGVVdGlscy5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpID49IG1heEl0ZW1TZWxlY3RlZCAmJiAoaW5wdXRWYWx1ZSAmJiBpbnB1dFZhbHVlICE9PSAnICcpKVwiPlxyXG4gICAgICAgICAgPHVpLWljb24gW2FwcGxpY2F0aW9uVGhlbWVdPVwiYXBwbGljYXRpb25UaGVtZVwiIFtuYW1lXT1cIidFcnJvcidcIj48L3VpLWljb24+XHJcbiAgICAgICAgICA8c3Bhbj57eyAodHJhbnNsYXRpb25Db250ZXh0ICsgJ01BWF9TRUxFQ1RFRF9FUlJPUicpIHwgdWlUcmFuc2xhdGUgOiB7IG1heDogbWF4SXRlbVNlbGVjdGVkIH0gfCBhc3luYyB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2FmZUVycm9ycy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvcnNcIiAqbmdGb3I9XCJsZXQgZXJyb3Igb2Ygc2FmZUVycm9yczsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XHJcbiAgICAgICAgICAgIDx1aS1pY29uIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIiBbbmFtZV09XCInRXJyb3InXCI+PC91aS1pY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImVycm9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPHVpLXZhbGlkYXRpb24tZXJyb3IgKm5nSWY9XCJuZ0NvbnRyb2wgJiYgIWhpZGVCdWlsdEluRXJyb3JzXCIgW25nQ29udHJvbF09XCJuZ0NvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJoaWRlTGFiZWxJbkVycm9ycyA/IG51bGwgOiBsYWJlbFwiPjwvdWktdmFsaWRhdGlvbi1lcnJvcj5cclxuXHJcbiAgICAgIDwvbWF0LWhpbnQ+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
|