@sbb-esta/lyne-elements 2.3.0 → 2.5.0
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/autocomplete/autocomplete-base-element.d.ts +1 -0
- package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
- package/autocomplete/autocomplete.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid.js +0 -1
- package/autocomplete.js +28 -28
- package/button/common/button-common.d.ts +1 -2
- package/button/common/button-common.d.ts.map +1 -1
- package/button/common.js +4 -4
- package/calendar/calendar.d.ts +55 -11
- package/calendar/calendar.d.ts.map +1 -1
- package/calendar.js +374 -224
- package/card/common/card-action-common.d.ts.map +1 -1
- package/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/checkbox/checkbox-group.js +1 -1
- package/checkbox/common/checkbox-common.d.ts.map +1 -1
- package/clock/clock.d.ts +8 -0
- package/clock/clock.d.ts.map +1 -1
- package/clock.js +40 -31
- package/core/a11y/focus.d.ts.map +1 -1
- package/core/base-elements.js +36 -36
- package/core/controllers/escapable-overlay-controller.d.ts +11 -0
- package/core/controllers/escapable-overlay-controller.d.ts.map +1 -0
- package/core/controllers/inert-controller.d.ts +3 -3
- package/core/controllers/inert-controller.d.ts.map +1 -1
- package/core/controllers.d.ts +1 -0
- package/core/controllers.d.ts.map +1 -1
- package/core/controllers.js +79 -52
- package/core/datetime/date-adapter.d.ts +4 -2
- package/core/datetime/date-adapter.d.ts.map +1 -1
- package/core/datetime/native-date-adapter.d.ts +1 -1
- package/core/datetime/native-date-adapter.d.ts.map +1 -1
- package/core/datetime.js +51 -43
- package/core/decorators/date-converter.d.ts +8 -0
- package/core/decorators/date-converter.d.ts.map +1 -0
- package/core/decorators/date-only-type.d.ts +8 -0
- package/core/decorators/date-only-type.d.ts.map +1 -0
- package/core/decorators/force-type.d.ts +1 -1
- package/core/decorators/force-type.d.ts.map +1 -1
- package/core/decorators/get-override.d.ts.map +1 -1
- package/core/decorators/handle-distinct-change.d.ts.map +1 -1
- package/core/decorators/host-attributes.d.ts.map +1 -1
- package/core/decorators/slot-state.d.ts.map +1 -1
- package/core/decorators.d.ts +2 -0
- package/core/decorators.d.ts.map +1 -1
- package/core/decorators.js +61 -41
- package/core/dom/input-element.d.ts +1 -1
- package/core/dom/input-element.d.ts.map +1 -1
- package/core/dom.js +5 -5
- package/core/eventing/throttle.d.ts.map +1 -1
- package/core/i18n/i18n.d.ts +5 -0
- package/core/i18n/i18n.d.ts.map +1 -1
- package/core/i18n.js +138 -108
- package/core/mixins/animation-complete-mixin.d.ts +13 -0
- package/core/mixins/animation-complete-mixin.d.ts.map +1 -0
- package/core/mixins/disabled-mixin.d.ts.map +1 -1
- package/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
- package/core/mixins/form-associated-input-mixin.d.ts +25 -0
- package/core/mixins/form-associated-input-mixin.d.ts.map +1 -0
- package/core/mixins/form-associated-mixin.d.ts +13 -0
- package/core/mixins/form-associated-mixin.d.ts.map +1 -1
- package/core/mixins/form-associated-radio-button-mixin.d.ts.map +1 -1
- package/core/mixins/hydration-mixin.d.ts.map +1 -1
- package/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
- package/core/mixins/negative-mixin.d.ts.map +1 -1
- package/core/mixins/panel-mixin.d.ts.map +1 -1
- package/core/mixins/required-mixin.d.ts.map +1 -1
- package/core/mixins/update-scheduler-mixin.d.ts.map +1 -1
- package/core/mixins.d.ts +2 -0
- package/core/mixins.d.ts.map +1 -1
- package/core/mixins.js +566 -341
- package/core/styles/core.scss +84 -1
- package/core/styles/mixins/link.scss +14 -0
- package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +3 -0
- package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss +4 -1
- package/core/testing/mocha-extensions.d.ts.map +1 -1
- package/core/testing/wait-for-render.d.ts.map +1 -1
- package/core.css +53 -3
- package/custom-elements.json +37278 -30220
- package/date-input/date-input.d.ts +75 -0
- package/date-input/date-input.d.ts.map +1 -0
- package/date-input.d.ts +2 -0
- package/date-input.d.ts.map +1 -0
- package/date-input.js +155 -0
- package/datepicker/common/datepicker-button.d.ts.map +1 -1
- package/datepicker/common.js +49 -45
- package/datepicker/datepicker/datepicker.d.ts +16 -6
- package/datepicker/datepicker/datepicker.d.ts.map +1 -1
- package/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
- package/datepicker/datepicker-toggle.js +41 -38
- package/datepicker/datepicker.js +95 -77
- package/development/autocomplete/autocomplete-base-element.d.ts +1 -0
- package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
- package/development/autocomplete/autocomplete.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid.js +1 -2
- package/development/autocomplete.js +9 -4
- package/development/button/common/button-common.d.ts +1 -2
- package/development/button/common/button-common.d.ts.map +1 -1
- package/development/button/common.js +26 -24
- package/development/calendar/calendar.d.ts +55 -11
- package/development/calendar/calendar.d.ts.map +1 -1
- package/development/calendar.js +301 -87
- package/development/card/common/card-action-common.d.ts.map +1 -1
- package/development/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/development/checkbox/checkbox-group.js +2 -2
- package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
- package/development/clock/clock.d.ts +8 -0
- package/development/clock/clock.d.ts.map +1 -1
- package/development/clock.js +20 -2
- package/development/core/a11y/focus.d.ts.map +1 -1
- package/development/core/a11y.js +1 -1
- package/development/core/base-elements.js +6 -6
- package/development/core/controllers/escapable-overlay-controller.d.ts +11 -0
- package/development/core/controllers/escapable-overlay-controller.d.ts.map +1 -0
- package/development/core/controllers/inert-controller.d.ts +3 -3
- package/development/core/controllers/inert-controller.d.ts.map +1 -1
- package/development/core/controllers.d.ts +1 -0
- package/development/core/controllers.d.ts.map +1 -1
- package/development/core/controllers.js +41 -7
- package/development/core/datetime/date-adapter.d.ts +4 -2
- package/development/core/datetime/date-adapter.d.ts.map +1 -1
- package/development/core/datetime/native-date-adapter.d.ts +1 -1
- package/development/core/datetime/native-date-adapter.d.ts.map +1 -1
- package/development/core/datetime.js +14 -2
- package/development/core/decorators/date-converter.d.ts +8 -0
- package/development/core/decorators/date-converter.d.ts.map +1 -0
- package/development/core/decorators/date-only-type.d.ts +8 -0
- package/development/core/decorators/date-only-type.d.ts.map +1 -0
- package/development/core/decorators/force-type.d.ts +1 -1
- package/development/core/decorators/force-type.d.ts.map +1 -1
- package/development/core/decorators/get-override.d.ts.map +1 -1
- package/development/core/decorators/handle-distinct-change.d.ts.map +1 -1
- package/development/core/decorators/host-attributes.d.ts.map +1 -1
- package/development/core/decorators/slot-state.d.ts.map +1 -1
- package/development/core/decorators.d.ts +2 -0
- package/development/core/decorators.d.ts.map +1 -1
- package/development/core/decorators.js +27 -6
- package/development/core/dom/input-element.d.ts +1 -1
- package/development/core/dom/input-element.d.ts.map +1 -1
- package/development/core/dom.js +3 -3
- package/development/core/eventing/throttle.d.ts.map +1 -1
- package/development/core/i18n/i18n.d.ts +5 -0
- package/development/core/i18n/i18n.d.ts.map +1 -1
- package/development/core/i18n.js +36 -1
- package/development/core/mixins/animation-complete-mixin.d.ts +13 -0
- package/development/core/mixins/animation-complete-mixin.d.ts.map +1 -0
- package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
- package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
- package/development/core/mixins/form-associated-input-mixin.d.ts +25 -0
- package/development/core/mixins/form-associated-input-mixin.d.ts.map +1 -0
- package/development/core/mixins/form-associated-mixin.d.ts +13 -0
- package/development/core/mixins/form-associated-mixin.d.ts.map +1 -1
- package/development/core/mixins/form-associated-radio-button-mixin.d.ts.map +1 -1
- package/development/core/mixins/hydration-mixin.d.ts.map +1 -1
- package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
- package/development/core/mixins/negative-mixin.d.ts.map +1 -1
- package/development/core/mixins/panel-mixin.d.ts.map +1 -1
- package/development/core/mixins/required-mixin.d.ts.map +1 -1
- package/development/core/mixins/update-scheduler-mixin.d.ts.map +1 -1
- package/development/core/mixins.d.ts +2 -0
- package/development/core/mixins.d.ts.map +1 -1
- package/development/core/mixins.js +428 -88
- package/development/core/testing/mocha-extensions.d.ts.map +1 -1
- package/development/core/testing/wait-for-render.d.ts.map +1 -1
- package/development/date-input/date-input.d.ts +75 -0
- package/development/date-input/date-input.d.ts.map +1 -0
- package/development/date-input.d.ts +2 -0
- package/development/date-input.d.ts.map +1 -0
- package/development/date-input.js +267 -0
- package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
- package/development/datepicker/common.js +11 -2
- package/development/datepicker/datepicker/datepicker.d.ts +16 -6
- package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
- package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
- package/development/datepicker/datepicker-toggle.js +12 -3
- package/development/datepicker/datepicker.js +66 -39
- package/development/dialog/dialog/dialog.d.ts.map +1 -1
- package/development/dialog/dialog-title/dialog-title.d.ts +3 -1
- package/development/dialog/dialog-title/dialog-title.d.ts.map +1 -1
- package/development/dialog/dialog-title.js +7 -2
- package/development/dialog/dialog.js +3 -1
- package/development/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
- package/development/expansion-panel/expansion-panel.js +2 -2
- package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
- package/development/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
- package/development/flip-card/flip-card-details.js +5 -3
- package/development/form-field/form-field/form-field.d.ts +1 -1
- package/development/form-field/form-field/form-field.d.ts.map +1 -1
- package/development/form-field/form-field.js +19 -13
- package/development/header/common/header-action-common.d.ts.map +1 -1
- package/development/header/common.js +2 -2
- package/development/icon/icon-name-mixin.d.ts.map +1 -1
- package/development/icon/icon-request.d.ts.map +1 -1
- package/development/icon/icon-validate.d.ts.map +1 -1
- package/development/link/common/block-link-common.d.ts.map +1 -1
- package/development/link/common/inline-link-common.d.ts.map +1 -1
- package/development/link/common/link-common.d.ts.map +1 -1
- package/development/link/common.js +13 -1
- package/development/menu/common/menu-action-common.d.ts.map +1 -1
- package/development/menu/menu/menu.d.ts +1 -1
- package/development/menu/menu/menu.d.ts.map +1 -1
- package/development/menu/menu.js +8 -15
- package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
- package/development/navigation/navigation/navigation.d.ts +1 -3
- package/development/navigation/navigation/navigation.d.ts.map +1 -1
- package/development/navigation/navigation.js +11 -21
- package/development/overlay/overlay-base-element.d.ts +2 -2
- package/development/overlay/overlay-base-element.d.ts.map +1 -1
- package/development/overlay/overlay.d.ts.map +1 -1
- package/development/overlay.js +9 -13
- package/development/paginator/common/paginator-common.d.ts.map +1 -1
- package/development/popover/popover/popover.d.ts +1 -1
- package/development/popover/popover/popover.d.ts.map +1 -1
- package/development/popover/popover.js +5 -15
- package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
- package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/development/radio-button/radio-button-group.js +2 -2
- package/development/sbb-tokens-CSAKTXUi.js +1 -1
- package/development/select/select.d.ts +3 -1
- package/development/select/select.d.ts.map +1 -1
- package/development/select.js +12 -8
- package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/development/selection-expansion-panel.js +2 -2
- package/development/sidebar/common.d.ts +1 -0
- package/development/sidebar/common.d.ts.map +1 -0
- package/development/sidebar/common.js +114 -0
- package/development/sidebar/icon-sidebar/icon-sidebar.d.ts +23 -0
- package/development/sidebar/icon-sidebar/icon-sidebar.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-button/icon-sidebar-button.d.ts +19 -0
- package/development/sidebar/icon-sidebar-button/icon-sidebar-button.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-button.d.ts +2 -0
- package/development/sidebar/icon-sidebar-button.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-button.js +28 -0
- package/development/sidebar/icon-sidebar-container/icon-sidebar-container.d.ts +23 -0
- package/development/sidebar/icon-sidebar-container/icon-sidebar-container.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-container.d.ts +2 -0
- package/development/sidebar/icon-sidebar-container.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-container.js +45 -0
- package/development/sidebar/icon-sidebar-content/icon-sidebar-content.d.ts +17 -0
- package/development/sidebar/icon-sidebar-content/icon-sidebar-content.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-content.d.ts +2 -0
- package/development/sidebar/icon-sidebar-content.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-content.js +34 -0
- package/development/sidebar/icon-sidebar-link/icon-sidebar-link.d.ts +19 -0
- package/development/sidebar/icon-sidebar-link/icon-sidebar-link.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-link.d.ts +2 -0
- package/development/sidebar/icon-sidebar-link.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar-link.js +28 -0
- package/development/sidebar/icon-sidebar.d.ts +2 -0
- package/development/sidebar/icon-sidebar.d.ts.map +1 -0
- package/development/sidebar/icon-sidebar.js +85 -0
- package/development/sidebar/sidebar/sidebar.d.ts +76 -0
- package/development/sidebar/sidebar/sidebar.d.ts.map +1 -0
- package/development/sidebar/sidebar-close-button/sidebar-close-button.d.ts +22 -0
- package/development/sidebar/sidebar-close-button/sidebar-close-button.d.ts.map +1 -0
- package/development/sidebar/sidebar-close-button.d.ts +2 -0
- package/development/sidebar/sidebar-close-button.d.ts.map +1 -0
- package/development/sidebar/sidebar-close-button.js +55 -0
- package/development/sidebar/sidebar-container/sidebar-container.d.ts +34 -0
- package/development/sidebar/sidebar-container/sidebar-container.d.ts.map +1 -0
- package/development/sidebar/sidebar-container.d.ts +2 -0
- package/development/sidebar/sidebar-container.d.ts.map +1 -0
- package/development/sidebar/sidebar-container.js +153 -0
- package/development/sidebar/sidebar-content/sidebar-content.d.ts +18 -0
- package/development/sidebar/sidebar-content/sidebar-content.d.ts.map +1 -0
- package/development/sidebar/sidebar-content.d.ts +2 -0
- package/development/sidebar/sidebar-content.d.ts.map +1 -0
- package/development/sidebar/sidebar-content.js +37 -0
- package/development/sidebar/sidebar-title/sidebar-title.d.ts +17 -0
- package/development/sidebar/sidebar-title/sidebar-title.d.ts.map +1 -0
- package/development/sidebar/sidebar-title.d.ts +2 -0
- package/development/sidebar/sidebar-title.d.ts.map +1 -0
- package/development/sidebar/sidebar-title.js +63 -0
- package/development/sidebar/sidebar.d.ts +2 -0
- package/development/sidebar/sidebar.d.ts.map +1 -0
- package/development/sidebar/sidebar.js +523 -0
- package/development/sidebar.d.ts +12 -0
- package/development/sidebar.d.ts.map +1 -0
- package/development/sidebar.js +12 -0
- package/development/stepper/step/step.d.ts +0 -2
- package/development/stepper/step/step.d.ts.map +1 -1
- package/development/stepper/step.js +19 -23
- package/development/stepper/stepper/stepper.d.ts +11 -0
- package/development/stepper/stepper/stepper.d.ts.map +1 -1
- package/development/stepper/stepper.js +30 -3
- package/development/tag/tag/tag.d.ts +11 -0
- package/development/tag/tag/tag.d.ts.map +1 -1
- package/development/tag/tag-group/tag-group.d.ts +1 -1
- package/development/tag/tag-group/tag-group.d.ts.map +1 -1
- package/development/tag/tag-group.js +9 -3
- package/development/tag/tag.js +37 -10
- package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -1
- package/development/time-input/time-input.d.ts +3 -2
- package/development/time-input/time-input.d.ts.map +1 -1
- package/development/time-input.js +19 -10
- package/development/title/title-base.d.ts +2 -4
- package/development/title/title-base.d.ts.map +1 -1
- package/development/title/title.d.ts +3 -1
- package/development/title/title.d.ts.map +1 -1
- package/development/title.js +8 -8
- package/dialog/dialog/dialog.d.ts.map +1 -1
- package/dialog/dialog-title/dialog-title.d.ts +3 -1
- package/dialog/dialog-title/dialog-title.d.ts.map +1 -1
- package/dialog/dialog-title.js +16 -15
- package/dialog/dialog.js +2 -2
- package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
- package/expansion-panel/expansion-panel.js +1 -1
- package/file-selector/common/file-selector-common.d.ts.map +1 -1
- package/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
- package/flip-card/flip-card-details.js +14 -13
- package/form-field/form-field/form-field.d.ts +1 -1
- package/form-field/form-field/form-field.d.ts.map +1 -1
- package/form-field/form-field.js +30 -24
- package/header/common/header-action-common.d.ts.map +1 -1
- package/header/common.js +6 -6
- package/icon/icon-name-mixin.d.ts.map +1 -1
- package/icon/icon-request.d.ts.map +1 -1
- package/icon/icon-validate.d.ts.map +1 -1
- package/index.d.ts +22 -0
- package/index.js +22 -0
- package/link/common/block-link-common.d.ts.map +1 -1
- package/link/common/inline-link-common.d.ts.map +1 -1
- package/link/common/link-common.d.ts.map +1 -1
- package/link/common.js +12 -12
- package/menu/common/menu-action-common.d.ts.map +1 -1
- package/menu/menu/menu.d.ts +1 -1
- package/menu/menu/menu.d.ts.map +1 -1
- package/menu/menu.js +26 -35
- package/navigation/common/navigation-action-common.d.ts.map +1 -1
- package/navigation/navigation/navigation.d.ts +1 -3
- package/navigation/navigation/navigation.d.ts.map +1 -1
- package/navigation/navigation.js +47 -56
- package/overlay/overlay-base-element.d.ts +2 -2
- package/overlay/overlay-base-element.d.ts.map +1 -1
- package/overlay/overlay.d.ts.map +1 -1
- package/overlay.js +58 -64
- package/package.json +66 -1
- package/paginator/common/paginator-common.d.ts.map +1 -1
- package/popover/popover/popover.d.ts +1 -1
- package/popover/popover/popover.d.ts.map +1 -1
- package/popover/popover.js +101 -110
- package/radio-button/common/radio-button-common.d.ts.map +1 -1
- package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/radio-button/radio-button-group.js +1 -1
- package/select/select.d.ts +3 -1
- package/select/select.d.ts.map +1 -1
- package/select.js +39 -37
- package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/selection-expansion-panel.js +1 -1
- package/sidebar/common.d.ts +1 -0
- package/sidebar/common.d.ts.map +1 -0
- package/sidebar/common.js +7 -0
- package/sidebar/icon-sidebar/icon-sidebar.d.ts +23 -0
- package/sidebar/icon-sidebar/icon-sidebar.d.ts.map +1 -0
- package/sidebar/icon-sidebar-button/icon-sidebar-button.d.ts +19 -0
- package/sidebar/icon-sidebar-button/icon-sidebar-button.d.ts.map +1 -0
- package/sidebar/icon-sidebar-button.d.ts +2 -0
- package/sidebar/icon-sidebar-button.d.ts.map +1 -0
- package/sidebar/icon-sidebar-button.js +20 -0
- package/sidebar/icon-sidebar-container/icon-sidebar-container.d.ts +23 -0
- package/sidebar/icon-sidebar-container/icon-sidebar-container.d.ts.map +1 -0
- package/sidebar/icon-sidebar-container.d.ts +2 -0
- package/sidebar/icon-sidebar-container.d.ts.map +1 -0
- package/sidebar/icon-sidebar-container.js +35 -0
- package/sidebar/icon-sidebar-content/icon-sidebar-content.d.ts +17 -0
- package/sidebar/icon-sidebar-content/icon-sidebar-content.d.ts.map +1 -0
- package/sidebar/icon-sidebar-content.d.ts +2 -0
- package/sidebar/icon-sidebar-content.d.ts.map +1 -0
- package/sidebar/icon-sidebar-content.js +23 -0
- package/sidebar/icon-sidebar-link/icon-sidebar-link.d.ts +19 -0
- package/sidebar/icon-sidebar-link/icon-sidebar-link.d.ts.map +1 -0
- package/sidebar/icon-sidebar-link.d.ts +2 -0
- package/sidebar/icon-sidebar-link.d.ts.map +1 -0
- package/sidebar/icon-sidebar-link.js +20 -0
- package/sidebar/icon-sidebar.d.ts +2 -0
- package/sidebar/icon-sidebar.d.ts.map +1 -0
- package/sidebar/icon-sidebar.js +47 -0
- package/sidebar/sidebar/sidebar.d.ts +76 -0
- package/sidebar/sidebar/sidebar.d.ts.map +1 -0
- package/sidebar/sidebar-close-button/sidebar-close-button.d.ts +22 -0
- package/sidebar/sidebar-close-button/sidebar-close-button.d.ts.map +1 -0
- package/sidebar/sidebar-close-button.d.ts +2 -0
- package/sidebar/sidebar-close-button.d.ts.map +1 -0
- package/sidebar/sidebar-close-button.js +29 -0
- package/sidebar/sidebar-container/sidebar-container.d.ts +34 -0
- package/sidebar/sidebar-container/sidebar-container.d.ts.map +1 -0
- package/sidebar/sidebar-container.d.ts +2 -0
- package/sidebar/sidebar-container.d.ts.map +1 -0
- package/sidebar/sidebar-container.js +78 -0
- package/sidebar/sidebar-content/sidebar-content.d.ts +18 -0
- package/sidebar/sidebar-content/sidebar-content.d.ts.map +1 -0
- package/sidebar/sidebar-content.d.ts +2 -0
- package/sidebar/sidebar-content.d.ts.map +1 -0
- package/sidebar/sidebar-content.js +23 -0
- package/sidebar/sidebar-title/sidebar-title.d.ts +17 -0
- package/sidebar/sidebar-title/sidebar-title.d.ts.map +1 -0
- package/sidebar/sidebar-title.d.ts +2 -0
- package/sidebar/sidebar-title.d.ts.map +1 -0
- package/sidebar/sidebar-title.js +37 -0
- package/sidebar/sidebar.d.ts +2 -0
- package/sidebar/sidebar.d.ts.map +1 -0
- package/sidebar/sidebar.js +214 -0
- package/sidebar.d.ts +12 -0
- package/sidebar.d.ts.map +1 -0
- package/sidebar.js +11 -0
- package/standard-theme.css +53 -3
- package/stepper/step/step.d.ts +0 -2
- package/stepper/step/step.d.ts.map +1 -1
- package/stepper/step.js +23 -35
- package/stepper/stepper/stepper.d.ts +11 -0
- package/stepper/stepper/stepper.d.ts.map +1 -1
- package/stepper/stepper.js +59 -41
- package/tag/tag/tag.d.ts +11 -0
- package/tag/tag/tag.d.ts.map +1 -1
- package/tag/tag-group/tag-group.d.ts +1 -1
- package/tag/tag-group/tag-group.d.ts.map +1 -1
- package/tag/tag-group.js +32 -29
- package/tag/tag.js +60 -41
- package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
- package/time-input/time-input.d.ts +3 -2
- package/time-input/time-input.d.ts.map +1 -1
- package/time-input.js +44 -36
- package/title/title-base.d.ts +2 -4
- package/title/title-base.d.ts.map +1 -1
- package/title/title.d.ts +3 -1
- package/title/title.d.ts.map +1 -1
- package/title.js +11 -11
|
@@ -6,15 +6,63 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
6
6
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
7
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
8
|
import { __esDecorate, __runInitializers } from "tslib";
|
|
9
|
-
import { property, state } from "lit/decorators.js";
|
|
9
|
+
import { property, state, eventOptions } from "lit/decorators.js";
|
|
10
10
|
import { forceType, getOverride, hostAttributes } from "./decorators.js";
|
|
11
|
-
import { defaultConverter, isServer,
|
|
11
|
+
import { defaultConverter, isServer, html, nothing, css } from "lit";
|
|
12
12
|
import { SbbLanguageController, SbbConnectedAbortController } from "./controllers.js";
|
|
13
13
|
import { preventScrollOnSpacebarPress, EventEmitter } from "./eventing.js";
|
|
14
|
-
import { i18nCheckboxRequired, i18nSelectionRequired } from "./i18n.js";
|
|
15
|
-
import { isWebkit } from "./dom.js";
|
|
16
|
-
import { interactivityChecker, isArrowKeyPressed, getNextElementIndex } from "./a11y.js";
|
|
14
|
+
import { i18nCheckboxRequired, i18nInputRequired, i18nSelectionRequired } from "./i18n.js";
|
|
15
|
+
import { isWebkit, isFirefox } from "./dom.js";
|
|
16
|
+
import { sbbInputModalityDetector, interactivityChecker, isArrowKeyPressed, getNextElementIndex } from "./a11y.js";
|
|
17
17
|
import "../screen-reader-only.js";
|
|
18
|
+
const SbbAnimationCompleteMixin = (superClass) => {
|
|
19
|
+
class SbbAnimationCompleteElement extends superClass {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.isAnimating = false;
|
|
23
|
+
this._animationPromise = Promise.resolve();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns a promise which completes whenever an animation ends.
|
|
27
|
+
* When a new animation starts, a new Promise is returned.
|
|
28
|
+
*/
|
|
29
|
+
get animationComplete() {
|
|
30
|
+
return this._animationPromise;
|
|
31
|
+
}
|
|
32
|
+
disconnectedCallback() {
|
|
33
|
+
super.disconnectedCallback();
|
|
34
|
+
this.stopAnimation();
|
|
35
|
+
}
|
|
36
|
+
startAnimation() {
|
|
37
|
+
if (!this.isAnimating) {
|
|
38
|
+
this._animationPromise = this._enqueueAnimation();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Overriding stopAnimation() breaks functionality.
|
|
43
|
+
*/
|
|
44
|
+
stopAnimation() {
|
|
45
|
+
}
|
|
46
|
+
async _enqueueAnimation() {
|
|
47
|
+
this.isAnimating = true;
|
|
48
|
+
const stopAnimation = this.stopAnimation;
|
|
49
|
+
const result = new Promise((r) => {
|
|
50
|
+
this.stopAnimation = () => {
|
|
51
|
+
stopAnimation();
|
|
52
|
+
this.isAnimating = false;
|
|
53
|
+
r();
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
try {
|
|
57
|
+
await this._animationPromise;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
Promise.reject(e);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return SbbAnimationCompleteElement;
|
|
65
|
+
};
|
|
18
66
|
const SbbDisabledMixin = (superClass) => {
|
|
19
67
|
let SbbDisabledElement = (() => {
|
|
20
68
|
var _disabled_accessor_storage, _a;
|
|
@@ -115,6 +163,22 @@ const validityKeys = {
|
|
|
115
163
|
typeMismatch: false,
|
|
116
164
|
valueMissing: false
|
|
117
165
|
};
|
|
166
|
+
if (typeof ValidityState === "undefined") {
|
|
167
|
+
const validityClass = class ValidityState {
|
|
168
|
+
get valid() {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
constructor() {
|
|
172
|
+
throw new TypeError("Illegal constructor");
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
Object.entries(validityKeys).forEach(([key, value]) => Object.assign(validityClass.prototype, {
|
|
176
|
+
get [key]() {
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
}));
|
|
180
|
+
globalThis.ValidityState = validityClass;
|
|
181
|
+
}
|
|
118
182
|
const SbbFormAssociatedMixin = (superClass) => {
|
|
119
183
|
let SbbFormAssociatedElement = (() => {
|
|
120
184
|
var _formDisabled_accessor_storage, _a;
|
|
@@ -242,6 +306,16 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
242
306
|
this.formDisabled = disabled;
|
|
243
307
|
});
|
|
244
308
|
}
|
|
309
|
+
requestUpdate(name, oldValue, options) {
|
|
310
|
+
super.requestUpdate(name, oldValue, options);
|
|
311
|
+
if (this.hasUpdated && this.shouldValidate(name)) {
|
|
312
|
+
this.validate();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
firstUpdated(changedProperties) {
|
|
316
|
+
super.firstUpdated(changedProperties);
|
|
317
|
+
this.validate();
|
|
318
|
+
}
|
|
245
319
|
/**
|
|
246
320
|
* Marks this element as suffering from the constraint indicated by the
|
|
247
321
|
* flag argument and associates the given message to it.
|
|
@@ -249,8 +323,7 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
249
323
|
* consumers are always displayed before internal messages and internal
|
|
250
324
|
* messages are displayed in the order they were added.
|
|
251
325
|
* To set/define custom validity state flags, you need to extend the
|
|
252
|
-
* ValidityState prototype and
|
|
253
|
-
* ValidityStateFlags interface.
|
|
326
|
+
* ValidityState prototype (and the CustomValidityState interface).
|
|
254
327
|
*
|
|
255
328
|
* @example
|
|
256
329
|
*
|
|
@@ -262,49 +335,55 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
262
335
|
* });
|
|
263
336
|
*
|
|
264
337
|
* declare global {
|
|
265
|
-
* interface
|
|
338
|
+
* interface CustomValidityState {
|
|
266
339
|
* myError: boolean;
|
|
267
340
|
* }
|
|
268
|
-
* interface ValidityState {
|
|
269
|
-
* myError?: boolean;
|
|
270
|
-
* }
|
|
271
341
|
* }
|
|
272
342
|
*/
|
|
273
343
|
setValidityFlag(flag, message, flagValue) {
|
|
274
344
|
flagValue ?? (flagValue = true);
|
|
275
|
-
this._validityStates.
|
|
276
|
-
|
|
345
|
+
const validityState = this._validityStates.get(flag);
|
|
346
|
+
if (!validityState || validityState.message !== message || validityState.flagValue !== flagValue) {
|
|
347
|
+
this._validityStates.set(flag, { flagValue, message });
|
|
348
|
+
this._setInternalValidity();
|
|
349
|
+
}
|
|
277
350
|
}
|
|
351
|
+
/** Removes the validity state flag entry and updates validity state. */
|
|
278
352
|
removeValidityFlag(flag) {
|
|
279
|
-
this._validityStates.
|
|
280
|
-
|
|
353
|
+
if (this._validityStates.has(flag)) {
|
|
354
|
+
this._validityStates.delete(flag);
|
|
355
|
+
this._setInternalValidity();
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/** To be called whenever the current element needs to be validated. */
|
|
359
|
+
validate() {
|
|
360
|
+
}
|
|
361
|
+
/** Whether validation should be run on a property change with the given name. */
|
|
362
|
+
shouldValidate(name) {
|
|
363
|
+
return !name;
|
|
281
364
|
}
|
|
282
365
|
_setInternalValidity() {
|
|
283
366
|
var _a2;
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
flags.customError = true;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
this.internals.setValidity(flags, outputMessage);
|
|
300
|
-
if (isWebkit) {
|
|
301
|
-
Object.defineProperty(this.internals.validity, "customError", {
|
|
302
|
-
value: this._validityStates.has("customError") || !!flags.customError,
|
|
303
|
-
configurable: true
|
|
304
|
-
});
|
|
367
|
+
let outputMessage = (_a2 = this._validityStates.get("customError")) == null ? void 0 : _a2.message;
|
|
368
|
+
const flags = {};
|
|
369
|
+
this._validityStates.forEach(({ flagValue, message }, flag) => {
|
|
370
|
+
flags[flag] = flagValue;
|
|
371
|
+
outputMessage || (outputMessage = message);
|
|
372
|
+
});
|
|
373
|
+
const customFlags = Object.keys(ValidityState.prototype).filter((f) => !(f in validityKeys) && f !== "valid");
|
|
374
|
+
for (const flag of customFlags) {
|
|
375
|
+
const value = flag in flags ? flags[flag] : false;
|
|
376
|
+
Object.defineProperty(this.internals.validity, flag, { value, configurable: true });
|
|
377
|
+
if (value) {
|
|
378
|
+
flags.customError = true;
|
|
305
379
|
}
|
|
306
|
-
}
|
|
307
|
-
|
|
380
|
+
}
|
|
381
|
+
this.internals.setValidity(flags, outputMessage);
|
|
382
|
+
if (isWebkit) {
|
|
383
|
+
Object.defineProperty(this.internals.validity, "customError", {
|
|
384
|
+
value: this._validityStates.has("customError") || !!flags.customError,
|
|
385
|
+
configurable: true
|
|
386
|
+
});
|
|
308
387
|
}
|
|
309
388
|
}
|
|
310
389
|
}, _formDisabled_accessor_storage = new WeakMap(), (() => {
|
|
@@ -446,9 +525,9 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
446
525
|
}
|
|
447
526
|
/**
|
|
448
527
|
* Called when the browser is trying to restore element’s state to state in which case
|
|
449
|
-
* reason is
|
|
450
|
-
* user in which case reason is
|
|
451
|
-
* In the case of
|
|
528
|
+
* reason is "restore", or when the browser is trying to fulfill autofill on behalf of
|
|
529
|
+
* user in which case reason is "autocomplete".
|
|
530
|
+
* In the case of "restore", state is a string, File, or FormData object
|
|
452
531
|
* previously set as the second argument to setFormValue.
|
|
453
532
|
*
|
|
454
533
|
* @internal
|
|
@@ -458,16 +537,6 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
458
537
|
this.checked = state2 === "true";
|
|
459
538
|
}
|
|
460
539
|
}
|
|
461
|
-
requestUpdate(name, oldValue, options) {
|
|
462
|
-
super.requestUpdate(name, oldValue, options);
|
|
463
|
-
if (this.hasUpdated && (name === "checked" || name === "required" || !name)) {
|
|
464
|
-
this._setValidity();
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
firstUpdated(changedProperties) {
|
|
468
|
-
super.firstUpdated(changedProperties);
|
|
469
|
-
this._setValidity();
|
|
470
|
-
}
|
|
471
540
|
updateFormValue() {
|
|
472
541
|
if (this.checked) {
|
|
473
542
|
this.internals.setFormValue(this.value, `${this.checked}`);
|
|
@@ -475,7 +544,11 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
475
544
|
this.internals.setFormValue(null);
|
|
476
545
|
}
|
|
477
546
|
}
|
|
478
|
-
|
|
547
|
+
shouldValidate(name) {
|
|
548
|
+
return super.shouldValidate(name) || name === "checked" || name === "required";
|
|
549
|
+
}
|
|
550
|
+
validate() {
|
|
551
|
+
super.validate();
|
|
479
552
|
if (this.required && !this.checked) {
|
|
480
553
|
this.setValidityFlag("valueMissing", i18nCheckboxRequired[this._languageController.current]);
|
|
481
554
|
} else {
|
|
@@ -508,6 +581,272 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
508
581
|
})();
|
|
509
582
|
return SbbFormAssociatedCheckboxElement;
|
|
510
583
|
};
|
|
584
|
+
const SbbFormAssociatedInputMixin = (superClass) => {
|
|
585
|
+
let SbbFormAssociatedInputElement = (() => {
|
|
586
|
+
var _a;
|
|
587
|
+
let _classSuper = SbbRequiredMixin(SbbFormAssociatedMixin(superClass));
|
|
588
|
+
let _instanceExtraInitializers = [];
|
|
589
|
+
let _set_readOnly_decorators;
|
|
590
|
+
let _set_disabled_decorators;
|
|
591
|
+
let _set_placeholder_decorators;
|
|
592
|
+
let __cleanChildren_decorators;
|
|
593
|
+
return _a = class extends _classSuper {
|
|
594
|
+
/**
|
|
595
|
+
* Form type of element.
|
|
596
|
+
* @default 'text'
|
|
597
|
+
*/
|
|
598
|
+
get type() {
|
|
599
|
+
return "text";
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* The text value of the input element.
|
|
603
|
+
*/
|
|
604
|
+
set value(value) {
|
|
605
|
+
super.value = this._cleanText(value);
|
|
606
|
+
if (this.hasUpdated) {
|
|
607
|
+
this.innerHTML = super.value;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
get value() {
|
|
611
|
+
return super.value ?? "";
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Whether the component is readonly.
|
|
615
|
+
* @attr readonly
|
|
616
|
+
* @default false
|
|
617
|
+
*/
|
|
618
|
+
set readOnly(value) {
|
|
619
|
+
this.toggleAttribute("readonly", !!value);
|
|
620
|
+
this.internals.ariaReadOnly = value ? "true" : null;
|
|
621
|
+
this._updateContenteditable();
|
|
622
|
+
}
|
|
623
|
+
get readOnly() {
|
|
624
|
+
return this.hasAttribute("readonly");
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Whether the component is disabled.
|
|
628
|
+
* @attr disabled
|
|
629
|
+
* @default false
|
|
630
|
+
*/
|
|
631
|
+
set disabled(value) {
|
|
632
|
+
this.toggleAttribute("disabled", !!value);
|
|
633
|
+
this.internals.ariaDisabled = value ? "true" : null;
|
|
634
|
+
this._updateContenteditable();
|
|
635
|
+
}
|
|
636
|
+
get disabled() {
|
|
637
|
+
return this.hasAttribute("disabled");
|
|
638
|
+
}
|
|
639
|
+
set placeholder(value) {
|
|
640
|
+
if (value) {
|
|
641
|
+
this.setAttribute("placeholder", value);
|
|
642
|
+
} else {
|
|
643
|
+
this.removeAttribute("placeholder");
|
|
644
|
+
}
|
|
645
|
+
this.internals.ariaPlaceholder = value ? value : null;
|
|
646
|
+
}
|
|
647
|
+
get placeholder() {
|
|
648
|
+
return this.getAttribute("placeholder") ?? "";
|
|
649
|
+
}
|
|
650
|
+
constructor() {
|
|
651
|
+
var _a2, _b, _c, _d, _e, _f, _g;
|
|
652
|
+
super();
|
|
653
|
+
this._interacted = (__runInitializers(this, _instanceExtraInitializers), false);
|
|
654
|
+
this._shouldEmitChange = false;
|
|
655
|
+
this._shouldTriggerSubmit = false;
|
|
656
|
+
this.language = new SbbLanguageController(this);
|
|
657
|
+
this.internals.role = "textbox";
|
|
658
|
+
(_a2 = this.addEventListener) == null ? void 0 : _a2.call(this, "input", () => {
|
|
659
|
+
super.value = this._cleanText(this.textContent ?? "");
|
|
660
|
+
this._interacted = true;
|
|
661
|
+
this._shouldEmitChange = true;
|
|
662
|
+
}, { capture: true });
|
|
663
|
+
(_b = this.addEventListener) == null ? void 0 : _b.call(this, "change", () => this._shouldEmitChange = false, { capture: true });
|
|
664
|
+
(_c = this.addEventListener) == null ? void 0 : _c.call(this, "keydown", (event) => {
|
|
665
|
+
var _a3;
|
|
666
|
+
if ((event.key === "Enter" || event.key === "\n") && event.isTrusted) {
|
|
667
|
+
event.preventDefault();
|
|
668
|
+
event.stopImmediatePropagation();
|
|
669
|
+
this._shouldTriggerSubmit = this.dispatchEvent(new KeyboardEvent("keydown", event));
|
|
670
|
+
} else if (isWebkit && this.value && (event.key === "Backspace" || event.key === "Delete") && event.isTrusted) {
|
|
671
|
+
event.preventDefault();
|
|
672
|
+
event.stopImmediatePropagation();
|
|
673
|
+
if (!this.dispatchEvent(new KeyboardEvent("keydown", event))) {
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
const selectedRange = (_a3 = window.getSelection()) == null ? void 0 : _a3.getRangeAt(0);
|
|
677
|
+
if (!selectedRange) {
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (selectedRange.startOffset !== selectedRange.endOffset) {
|
|
681
|
+
selectedRange.deleteContents();
|
|
682
|
+
this._dispatchInputEvent();
|
|
683
|
+
} else if (event.key === "Backspace" && selectedRange.startOffset > 0) {
|
|
684
|
+
selectedRange.setStart(selectedRange.startContainer, selectedRange.startOffset - 1);
|
|
685
|
+
selectedRange.deleteContents();
|
|
686
|
+
this._dispatchInputEvent();
|
|
687
|
+
} else if (event.key === "Delete" && selectedRange.endOffset < this.value.length) {
|
|
688
|
+
selectedRange.setEnd(selectedRange.endContainer, selectedRange.endOffset + 1);
|
|
689
|
+
selectedRange.deleteContents();
|
|
690
|
+
this._dispatchInputEvent();
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
}, { capture: true });
|
|
694
|
+
(_d = this.addEventListener) == null ? void 0 : _d.call(this, "keyup", (event) => {
|
|
695
|
+
var _a3;
|
|
696
|
+
if (event.key === "Enter" || event.key === "\n") {
|
|
697
|
+
this._emitChangeIfNecessary();
|
|
698
|
+
if (this._shouldTriggerSubmit) {
|
|
699
|
+
this._shouldTriggerSubmit = false;
|
|
700
|
+
(_a3 = this.form) == null ? void 0 : _a3.requestSubmit();
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}, { capture: true });
|
|
704
|
+
(_e = this.addEventListener) == null ? void 0 : _e.call(this, "paste", (e) => {
|
|
705
|
+
var _a3, _b2;
|
|
706
|
+
e.preventDefault();
|
|
707
|
+
const text = this._cleanText(((_a3 = e.clipboardData) == null ? void 0 : _a3.getData("text/plain")) ?? "");
|
|
708
|
+
const selectedRange = (_b2 = window.getSelection()) == null ? void 0 : _b2.getRangeAt(0);
|
|
709
|
+
if (!selectedRange || !text) {
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
selectedRange.deleteContents();
|
|
713
|
+
selectedRange.insertNode(document.createTextNode(text));
|
|
714
|
+
selectedRange.setStart(selectedRange.endContainer, selectedRange.endOffset);
|
|
715
|
+
this._dispatchInputEvent();
|
|
716
|
+
});
|
|
717
|
+
(_f = this.addEventListener) == null ? void 0 : _f.call(this, "focus", () => {
|
|
718
|
+
var _a3;
|
|
719
|
+
if (sbbInputModalityDetector.mostRecentModality === "keyboard") {
|
|
720
|
+
(_a3 = window.getSelection()) == null ? void 0 : _a3.selectAllChildren(this);
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
(_g = this.addEventListener) == null ? void 0 : _g.call(this, "blur", () => {
|
|
724
|
+
var _a3;
|
|
725
|
+
(_a3 = window.getSelection()) == null ? void 0 : _a3.removeAllRanges();
|
|
726
|
+
this._emitChangeIfNecessary();
|
|
727
|
+
this.scrollLeft = 0;
|
|
728
|
+
}, { capture: true });
|
|
729
|
+
}
|
|
730
|
+
connectedCallback() {
|
|
731
|
+
super.connectedCallback();
|
|
732
|
+
this.internals.ariaMultiLine = "false";
|
|
733
|
+
this._updateContenteditable();
|
|
734
|
+
this.innerHTML = this.value;
|
|
735
|
+
}
|
|
736
|
+
focus(options) {
|
|
737
|
+
super.focus(options);
|
|
738
|
+
if (!isServer && !this.disabled && !this.readOnly && this.value) {
|
|
739
|
+
const selection = window.getSelection();
|
|
740
|
+
if (!selection) {
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
let range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
|
|
744
|
+
if (range && range.startOffset !== 0) {
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
range = document.createRange();
|
|
748
|
+
range.setStart(this.firstChild, this.textContent.length);
|
|
749
|
+
range.collapse(true);
|
|
750
|
+
selection.removeAllRanges();
|
|
751
|
+
selection.addRange(range);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
attributeChangedCallback(name, old, value) {
|
|
755
|
+
if (name !== "value" || !this._interacted) {
|
|
756
|
+
super.attributeChangedCallback(name, old, value);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
/**
|
|
760
|
+
* Is called whenever the form is being reset.
|
|
761
|
+
*
|
|
762
|
+
* @internal
|
|
763
|
+
*/
|
|
764
|
+
formResetCallback() {
|
|
765
|
+
this._interacted = false;
|
|
766
|
+
this.value = this.getAttribute("value") ?? "";
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Called when the browser is trying to restore element’s state to state in which case
|
|
770
|
+
* reason is "restore", or when the browser is trying to fulfill autofill on behalf of
|
|
771
|
+
* user in which case reason is "autocomplete".
|
|
772
|
+
* In the case of "restore", state is a string, File, or FormData object
|
|
773
|
+
* previously set as the second argument to setFormValue.
|
|
774
|
+
*
|
|
775
|
+
* @internal
|
|
776
|
+
*/
|
|
777
|
+
formStateRestoreCallback(state2, _reason) {
|
|
778
|
+
if (state2 && typeof state2 === "string") {
|
|
779
|
+
this.value = state2;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
updateFormValue() {
|
|
783
|
+
this.internals.setFormValue(this.value, this.value);
|
|
784
|
+
}
|
|
785
|
+
shouldValidate(name) {
|
|
786
|
+
return super.shouldValidate(name) || name === "value" || name === "required";
|
|
787
|
+
}
|
|
788
|
+
validate() {
|
|
789
|
+
super.validate();
|
|
790
|
+
if (this.required && !this.value) {
|
|
791
|
+
this.setValidityFlag("valueMissing", i18nInputRequired[this.language.current]);
|
|
792
|
+
} else {
|
|
793
|
+
this.removeValidityFlag("valueMissing");
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
_cleanText(value) {
|
|
797
|
+
return `${value}`.replace(/[\n\r]+/g, "");
|
|
798
|
+
}
|
|
799
|
+
_dispatchInputEvent() {
|
|
800
|
+
this.dispatchEvent(new InputEvent("input", { bubbles: true, composed: true }));
|
|
801
|
+
}
|
|
802
|
+
_cleanChildren() {
|
|
803
|
+
if (this.childElementCount) {
|
|
804
|
+
for (const element of this.children) {
|
|
805
|
+
element.remove();
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
_updateContenteditable() {
|
|
810
|
+
if (!isServer && this.isConnected) {
|
|
811
|
+
const value = this.disabled || this.readOnly ? "false" : isFirefox ? "true" : "plaintext-only";
|
|
812
|
+
this.setAttribute("contenteditable", value);
|
|
813
|
+
if (this.readOnly) {
|
|
814
|
+
this.setAttribute("tabindex", "0");
|
|
815
|
+
} else {
|
|
816
|
+
this.removeAttribute("tabindex");
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
_emitChangeIfNecessary() {
|
|
821
|
+
if (this._shouldEmitChange) {
|
|
822
|
+
this._shouldEmitChange = false;
|
|
823
|
+
this.dispatchEvent(new Event("change", { bubbles: true }));
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
render() {
|
|
827
|
+
return html`<slot @slotchange=${this._cleanChildren}></slot>`;
|
|
828
|
+
}
|
|
829
|
+
}, (() => {
|
|
830
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
831
|
+
_set_readOnly_decorators = [property({ type: Boolean })];
|
|
832
|
+
_set_disabled_decorators = [property({ type: Boolean })];
|
|
833
|
+
_set_placeholder_decorators = [property({ attribute: false })];
|
|
834
|
+
__cleanChildren_decorators = [eventOptions({ passive: true })];
|
|
835
|
+
__esDecorate(_a, null, _set_readOnly_decorators, { kind: "setter", name: "readOnly", static: false, private: false, access: { has: (obj) => "readOnly" in obj, set: (obj, value) => {
|
|
836
|
+
obj.readOnly = value;
|
|
837
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
838
|
+
__esDecorate(_a, null, _set_disabled_decorators, { kind: "setter", name: "disabled", static: false, private: false, access: { has: (obj) => "disabled" in obj, set: (obj, value) => {
|
|
839
|
+
obj.disabled = value;
|
|
840
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
841
|
+
__esDecorate(_a, null, _set_placeholder_decorators, { kind: "setter", name: "placeholder", static: false, private: false, access: { has: (obj) => "placeholder" in obj, set: (obj, value) => {
|
|
842
|
+
obj.placeholder = value;
|
|
843
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
844
|
+
__esDecorate(_a, null, __cleanChildren_decorators, { kind: "method", name: "_cleanChildren", static: false, private: false, access: { has: (obj) => "_cleanChildren" in obj, get: (obj) => obj._cleanChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
845
|
+
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
846
|
+
})(), _a;
|
|
847
|
+
})();
|
|
848
|
+
return SbbFormAssociatedInputElement;
|
|
849
|
+
};
|
|
511
850
|
const radioButtonRegistry = /* @__PURE__ */ new WeakMap();
|
|
512
851
|
const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
513
852
|
let SbbFormAssociatedRadioButtonElement = (() => {
|
|
@@ -573,8 +912,8 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
573
912
|
}
|
|
574
913
|
/**
|
|
575
914
|
* Called when the browser is trying to restore element’s state to state in which case
|
|
576
|
-
* reason is
|
|
577
|
-
* user in which case reason is
|
|
915
|
+
* reason is "restore", or when the browser is trying to fulfill autofill on behalf of
|
|
916
|
+
* user in which case reason is "autocomplete".
|
|
578
917
|
* @internal
|
|
579
918
|
*/
|
|
580
919
|
formStateRestoreCallback(state2, _reason) {
|
|
@@ -582,12 +921,6 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
582
921
|
this.checked = state2 === this.value;
|
|
583
922
|
}
|
|
584
923
|
}
|
|
585
|
-
requestUpdate(name, oldValue, options) {
|
|
586
|
-
super.requestUpdate(name, oldValue, options);
|
|
587
|
-
if (this.hasUpdated && (name === "checked" || name === "required" || !name)) {
|
|
588
|
-
this._setValidity();
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
924
|
willUpdate(changedProperties) {
|
|
592
925
|
super.willUpdate(changedProperties);
|
|
593
926
|
if (changedProperties.has("disabled")) {
|
|
@@ -598,7 +931,6 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
598
931
|
super.firstUpdated(changedProperties);
|
|
599
932
|
this._didLoad = true;
|
|
600
933
|
this.updateFocusableRadios();
|
|
601
|
-
this._setValidity();
|
|
602
934
|
}
|
|
603
935
|
/**
|
|
604
936
|
* Called on `value` change
|
|
@@ -611,6 +943,30 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
611
943
|
this.internals.setFormValue(null);
|
|
612
944
|
}
|
|
613
945
|
}
|
|
946
|
+
shouldValidate(name) {
|
|
947
|
+
return super.shouldValidate(name) || name === "checked" || name === "required";
|
|
948
|
+
}
|
|
949
|
+
/**
|
|
950
|
+
* Sets the validity of all associated radio buttons.
|
|
951
|
+
* If any radio button is required, all associated are required as well.
|
|
952
|
+
*/
|
|
953
|
+
validate() {
|
|
954
|
+
super.validate();
|
|
955
|
+
if (!this.associatedRadioButtons) {
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
958
|
+
let required = false;
|
|
959
|
+
let checked = false;
|
|
960
|
+
for (const radio of this.associatedRadioButtons) {
|
|
961
|
+
required || (required = radio.required);
|
|
962
|
+
checked || (checked = radio.checked);
|
|
963
|
+
}
|
|
964
|
+
if (required && !checked) {
|
|
965
|
+
this.associatedRadioButtons.forEach((r) => r.setValidityFlag("valueMissing", i18nSelectionRequired[this._languageController.current]));
|
|
966
|
+
} else {
|
|
967
|
+
this.associatedRadioButtons.forEach((r) => r.removeValidityFlag("valueMissing"));
|
|
968
|
+
}
|
|
969
|
+
}
|
|
614
970
|
/**
|
|
615
971
|
* Only a single radio should be focusable in the group. Defined as:
|
|
616
972
|
* - the checked radio;
|
|
@@ -672,7 +1028,7 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
672
1028
|
entries.push(this);
|
|
673
1029
|
}
|
|
674
1030
|
entries.forEach((r) => this.associatedRadioButtons.add(r));
|
|
675
|
-
this.
|
|
1031
|
+
this.validate();
|
|
676
1032
|
}
|
|
677
1033
|
/**
|
|
678
1034
|
* Remove `this` from the radioButton registry and, if the group is empty, delete the entry from the groups Map
|
|
@@ -683,31 +1039,11 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
683
1039
|
if (((_b = this.associatedRadioButtons) == null ? void 0 : _b.size) === 0) {
|
|
684
1040
|
(_c = this._radioButtonGroupsMap) == null ? void 0 : _c.delete(this.name);
|
|
685
1041
|
} else {
|
|
686
|
-
this.
|
|
1042
|
+
this.validate();
|
|
687
1043
|
}
|
|
688
1044
|
this.associatedRadioButtons = void 0;
|
|
689
1045
|
this._radioButtonGroupsMap = void 0;
|
|
690
1046
|
}
|
|
691
|
-
/**
|
|
692
|
-
* Sets the validity of all associated radio buttons.
|
|
693
|
-
* If any radio button is required, all associated are required as well.
|
|
694
|
-
*/
|
|
695
|
-
_setValidity() {
|
|
696
|
-
if (!this.associatedRadioButtons) {
|
|
697
|
-
return;
|
|
698
|
-
}
|
|
699
|
-
let required = false;
|
|
700
|
-
let checked = false;
|
|
701
|
-
for (const radio of this.associatedRadioButtons) {
|
|
702
|
-
required || (required = radio.required);
|
|
703
|
-
checked || (checked = radio.checked);
|
|
704
|
-
}
|
|
705
|
-
if (required && !checked) {
|
|
706
|
-
this.associatedRadioButtons.forEach((r) => r.setValidityFlag("valueMissing", i18nSelectionRequired[this._languageController.current]));
|
|
707
|
-
} else {
|
|
708
|
-
this.associatedRadioButtons.forEach((r) => r.removeValidityFlag("valueMissing"));
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
1047
|
/**
|
|
712
1048
|
* Return a list of 'interactable' grouped radios, ordered in DOM order
|
|
713
1049
|
*/
|
|
@@ -771,12 +1107,12 @@ const SbbHydrationMixin = (base) => {
|
|
|
771
1107
|
event.stopImmediatePropagation();
|
|
772
1108
|
}
|
|
773
1109
|
};
|
|
774
|
-
const
|
|
1110
|
+
const eventOptions2 = { capture: true };
|
|
775
1111
|
const slots = (_a = this.shadowRoot) == null ? void 0 : _a.querySelectorAll("slot");
|
|
776
1112
|
if (slots == null ? void 0 : slots.length) {
|
|
777
|
-
slots.forEach((slot) => slot.addEventListener("slotchange", suppressSlotchangeEvent,
|
|
1113
|
+
slots.forEach((slot) => slot.addEventListener("slotchange", suppressSlotchangeEvent, eventOptions2));
|
|
778
1114
|
this.hydrationComplete.then(() => slots.forEach((slot) => {
|
|
779
|
-
slot.removeEventListener("slotchange", suppressSlotchangeEvent,
|
|
1115
|
+
slot.removeEventListener("slotchange", suppressSlotchangeEvent, eventOptions2);
|
|
780
1116
|
if (slot.assignedNodes().length) {
|
|
781
1117
|
slot.dispatchEvent(new Event("slotchange", { bubbles: true }));
|
|
782
1118
|
}
|
|
@@ -991,12 +1327,14 @@ const SbbPanelMixin = (superClass) => {
|
|
|
991
1327
|
__privateSet(this, _expansionState_accessor_storage, value);
|
|
992
1328
|
}
|
|
993
1329
|
connectedCallback() {
|
|
1330
|
+
var _a2, _b;
|
|
994
1331
|
super.connectedCallback();
|
|
995
1332
|
this._panelConnected.emit();
|
|
1333
|
+
(_b = (_a2 = this.closest) == null ? void 0 : _a2.call(this, "sbb-radio-button-group, sbb-checkbox-group")) == null ? void 0 : _b.toggleAttribute("data-has-panel", true);
|
|
996
1334
|
}
|
|
997
1335
|
}, _color_accessor_storage = new WeakMap(), _borderless_accessor_storage = new WeakMap(), _expansionState_accessor_storage = new WeakMap(), (() => {
|
|
998
1336
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
999
|
-
_color_decorators = [property()];
|
|
1337
|
+
_color_decorators = [property({ reflect: true })];
|
|
1000
1338
|
_borderless_decorators = [forceType(), property({ reflect: true, type: Boolean })];
|
|
1001
1339
|
_expansionState_decorators = [forceType(), property()];
|
|
1002
1340
|
__esDecorate(_a, null, _color_decorators, { kind: "accessor", name: "color", static: false, private: false, access: { has: (obj) => "color" in obj, get: (obj) => obj.color, set: (obj, value) => {
|
|
@@ -1142,10 +1480,12 @@ slot[name=subtext] {
|
|
|
1142
1480
|
display: none;
|
|
1143
1481
|
}`;
|
|
1144
1482
|
export {
|
|
1483
|
+
SbbAnimationCompleteMixin,
|
|
1145
1484
|
SbbDisabledInteractiveMixin,
|
|
1146
1485
|
SbbDisabledMixin,
|
|
1147
1486
|
SbbDisabledTabIndexActionMixin,
|
|
1148
1487
|
SbbFormAssociatedCheckboxMixin,
|
|
1488
|
+
SbbFormAssociatedInputMixin,
|
|
1149
1489
|
SbbFormAssociatedMixin,
|
|
1150
1490
|
SbbFormAssociatedRadioButtonMixin,
|
|
1151
1491
|
SbbHydrationMixin,
|
|
@@ -1157,4 +1497,4 @@ export {
|
|
|
1157
1497
|
panelCommon as panelCommonStyle,
|
|
1158
1498
|
radioButtonRegistry
|
|
1159
1499
|
};
|
|
1160
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZGlzYWJsZWQtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3JlcXVpcmVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1jaGVja2JveC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9mb3JtLWFzc29jaWF0ZWQtcmFkaW8tYnV0dG9uLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2h5ZHJhdGlvbi1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9uYW1lZC1zbG90LWxpc3QtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvbmVnYXRpdmUtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvcGFuZWwtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvdXBkYXRlLXNjaGVkdWxlci1taXhpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUsIGdldE92ZXJyaWRlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRGlzYWJsZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgZGlzYWJsZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJEaXNhYmxlZE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgQGdldE92ZXJyaWRlKChlOiBTYmJEaXNhYmxlZEVsZW1lbnQsIHY6IGJvb2xlYW4pOiBib29sZWFuID0+IHYgfHwgZS5pc0Rpc2FibGVkRXh0ZXJuYWxseSgpKVxuICAgIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGFzICdvcicgY2hlY2sgdG8gdGhlIGN1cnJlbnQgZGlzYWJsZWQgc3RhdGUuXG4gICAgICogQ2FuIGUuZy4gYmUgdXNlZCB0byByZWFkIGRpc2FibGVkIHN0YXRlIG9mIGEgZ3JvdXAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJEaXNhYmxlZEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlPiAmIFQ7XG59O1xuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIGRpc2FibGVkIGludGVyYWN0aXZlIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRGlzYWJsZWRNaXhpblR5cGU+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZUVsZW1lbnRcbiAgICBleHRlbmRzIHN1cGVyQ2xhc3NcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT5cbiAge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGFyaWEtZGlzYWJsZWQgYnV0IHN0YXkgaW50ZXJhY3RpdmUuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGlzYWJsZWQtaW50ZXJhY3RpdmUnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBTYmJEaXNhYmxlZEludGVyYWN0aXZlRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbk1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGUgJiBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJEaXNhYmxlZFRhYkluZGV4QWN0aW9uXG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW4oU2JiRGlzYWJsZWRNaXhpbihzdXBlckNsYXNzKSlcbiAgICBpbXBsZW1lbnRzIFNiYkRpc2FibGVkTWl4aW5UeXBlLCBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlXG4gIHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZEludGVyYWN0aXZlJykpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYURpc2FibGVkID0gdGhpcy5kaXNhYmxlZEludGVyYWN0aXZlID8gJ3RydWUnIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFxuICAgIFNiYkRpc2FibGVkTWl4aW5UeXBlICYgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZVxuICA+ICZcbiAgICBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IGlzV2Via2l0IH0gZnJvbSAnLi4vZG9tLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmNvbnN0IHZhbGlkaXR5S2V5czogUmVxdWlyZWQ8VmFsaWRpdHlTdGF0ZUZsYWdzPiA9IHtcbiAgYmFkSW5wdXQ6IGZhbHNlLFxuICBjdXN0b21FcnJvcjogZmFsc2UsXG4gIHBhdHRlcm5NaXNtYXRjaDogZmFsc2UsXG4gIHJhbmdlT3ZlcmZsb3c6IGZhbHNlLFxuICByYW5nZVVuZGVyZmxvdzogZmFsc2UsXG4gIHN0ZXBNaXNtYXRjaDogZmFsc2UsXG4gIHRvb0xvbmc6IGZhbHNlLFxuICB0b29TaG9ydDogZmFsc2UsXG4gIHR5cGVNaXNtYXRjaDogZmFsc2UsXG4gIHZhbHVlTWlzc2luZzogZmFsc2UsXG59O1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWID0gc3RyaW5nPiB7XG4gIHB1YmxpYyBnZXQgZm9ybSgpOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsO1xuICBwdWJsaWMgYWNjZXNzb3IgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nO1xuICBwdWJsaWMgYWNjZXNzb3IgdmFsdWU6IFYgfCBudWxsO1xuXG4gIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZTtcbiAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGZvcm1EaXNhYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbjtcbiAgcHVibGljIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgcHVibGljIGZvcm1Bc3NvY2lhdGVkQ2FsbGJhY2s/KGZvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuICBwdWJsaWMgZm9ybURpc2FibGVkQ2FsbGJhY2soZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkO1xuICBwdWJsaWMgYWJzdHJhY3QgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcbiAgcHVibGljIGFic3RyYWN0IGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBzZXRWYWxpZGl0eUZsYWc8VCBleHRlbmRzIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFncz4oXG4gICAgZmxhZzogVCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZmxhZ1ZhbHVlPzogVmFsaWRpdHlTdGF0ZUZsYWdzW1RdLFxuICApOiB2b2lkO1xuICBwcm90ZWN0ZWQgcmVtb3ZlVmFsaWRpdHlGbGFnPFQgZXh0ZW5kcyBrZXlvZiBWYWxpZGl0eVN0YXRlRmxhZ3M+KGZsYWc6IFQpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBGb3JtQXNzb2NpYXRlZE1peGluIGVuYWJsZXMgbmF0aXZlIGZvcm0gc3VwcG9ydCBmb3IgY3VzdG9tIGNvbnRyb2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50PiwgViA9IHN0cmluZz4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZEVsZW1lbnRcbiAgICBleHRlbmRzIHN1cGVyQ2xhc3NcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+XG4gIHtcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1Bc3NvY2lhdGVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZvcm0gb3duZXIgb2YgdGhpcyBlbGVtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZm9ybSgpOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5mb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZvcm0gZWxlbWVudC4gV2lsbCBiZSByZWFkIGZyb20gbmFtZSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb24gRGV2ZWxvcGVyIG5vdGU6IEluIHRoaXMgY2FzZSB1cGRhdGluZyB0aGUgYXR0cmlidXRlIG11c3QgYmUgc3luY2hyb25vdXMuXG4gICAgICogRHVlIHRvIHRoaXMgaXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBnZXR0ZXIvc2V0dGVyIGFuZCB0aGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgaGFuZGxlcyB0aGUgZGlmZiBjaGVjay5cbiAgICAgKi9cbiAgICBAcHJvcGVydHkoKVxuICAgIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCduYW1lJywgYCR7bmFtZX1gKTtcblxuICAgICAgLy8gRm9yIGBGb3JtRGF0YWAgdmFsdWVzLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHVwZGF0ZSB0aGUgZmllbGROYW1lIGtleVxuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA/PyAnJztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7XG4gICAgfVxuXG4gICAgLyoqIFZhbHVlIG9mIHRoZSBmb3JtIGVsZW1lbnQuICovXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBWIHwgbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogViB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBwcml2YXRlIF92YWx1ZTogViB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgVmFsaWRpdHlTdGF0ZSBvYmplY3QgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbGlkaXR5KCk6IFZhbGlkaXR5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLnZhbGlkaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZXJyb3IgbWVzc2FnZSwgaWYgYXZhaWxhYmxlLCB3aGljaCBjb3JyZXNwb25kc1xuICAgICAqIHRvIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gc3RhdGUuXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBvbmx5IG9uZSBtZXNzYWdlIGlzIHJldHVybmVkIGF0IGEgdGltZSAoZS5nLiBpZlxuICAgICAqIG11bHRpcGxlIHZhbGlkaXR5IHN0YXRlcyBhcmUgaW52YWxpZCwgb25seSB0aGUgY2hyb25vbG9naWNhbGx5IGZpcnN0IG9uZVxuICAgICAqIGlzIHJldHVybmVkIHVudGlsIGl0IGlzIGZpeGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbmV4dCBtZXNzYWdlIG1pZ2h0IGJlXG4gICAgICogcmV0dXJuZWQsIGlmIGl0IGlzIHN0aWxsIGFwcGxpY2FibGUpLiBBbHNvIGEgY3VzdG9tIHZhbGlkaXR5IG1lc3NhZ2VcbiAgICAgKiAoc2VlIGJlbG93KSBoYXMgcHJlY2VkZW5jZSBvdmVyIG5hdGl2ZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbGVtZW50IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAgICogd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHdpbGxWYWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy53aWxsVmFsaWRhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuXG4gICAgcHJpdmF0ZSBfdmFsaWRpdHlTdGF0ZXMgPSBuZXcgTWFwPFxuICAgICAga2V5b2YgVmFsaWRpdHlTdGF0ZUZsYWdzLFxuICAgICAgeyBmbGFnVmFsdWU6IHVua25vd247IG1lc3NhZ2U6IHN0cmluZyB9XG4gICAgPigpO1xuXG4gICAgLyoqIFdoZW5ldmVyIGEgc3Vycm91bmRpbmcgZm9ybSBvciBmaWVsZHNldCBpcyBjaGFuZ2luZyBpdHMgZGlzYWJsZWQgc3RhdGUuICovXG4gICAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvcm1EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIC8vIFdlIHdhbnQgdG8gcHJldmVudCB0aGUgbmF0aXZlIGJyb3dzZXIgdmFsaWRhdGlvbiBtZXNzYWdlIHBvcG92ZXJcbiAgICAgIC8vIHRvIGJlIHNob3duLiBUaGlzIGFsc28gcHJldmVudHMgYSBidWcgaW4gV2ViS2l0LCB3aGljaCB3b3VsZCBub3RcbiAgICAgIC8vIGFsbG93IGhvc3QgYXMgdGhlIHZhbGlkaXR5IGFuY2hvcjogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2OTgzMlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2ludmFsaWQnLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAobmFtZSAhPT0gJ25hbWUnIHx8IG9sZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIHZhbGlkaXR5IHByb2JsZW1zOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogRmlyZXMgYW4gaW52YWxpZCBldmVudCBhdCB0aGUgZWxlbWVudCBpbiB0aGUgbGF0dGVyIGNhc2UuXG4gICAgICovXG4gICAgcHVibGljIGNoZWNrVmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMuY2hlY2tWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIHZhbGlkaXR5IHByb2JsZW1zOyBvdGhlcndpc2UsXG4gICAgICogcmV0dXJucyBmYWxzZSwgZmlyZXMgYW4gaW52YWxpZCBldmVudCBhdCB0aGUgZWxlbWVudCxcbiAgICAgKiBhbmQgKGlmIHRoZSBldmVudCBpc24ndCBjYW5jZWxlZCkgcmVwb3J0cyB0aGUgcHJvYmxlbSB0byB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXN0b20gdmFsaWRpdHkgbWVzc2FnZSBmb3IgdGhpcyBlbGVtZW50LiBVc2UgdGhlIGVtcHR5IHN0cmluZ1xuICAgICAqIHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIGN1c3RvbSB2YWxpZGl0eSBlcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNldFZhbGlkaXR5RmxhZygnY3VzdG9tRXJyb3InLCBtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKCdjdXN0b21FcnJvcicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIGZvcm0gZWxlbWVudCBjaGFuZ2VzLlxuICAgICAqIEVsZW1lbnRJbnRlcm5hbHMuZm9ybSByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGZyb20gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmb3JtQXNzb2NpYXRlZENhbGxiYWNrPyhmb3JtOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuZXZlciBhIHN1cnJvdW5kaW5nIGZvcm0gLyBmaWVsZHNldCBjaGFuZ2VzIGRpc2FibGVkIHN0YXRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZFxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZvcm1EaXNhYmxlZENhbGxiYWNrKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAvLyBUaGlzIGNhbGxiYWNrIGlzIHRyaWdnZXJlZCBpZiB0aGUgZGlzYWJsZWQgcHJvcGVydHkgY2hhbmdlcyBvciB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIG9mIGEgZmllbGRzZXQgb3IgZm9ybSBjaGFuZ2VzLlxuICAgICAgLy8gV2UgbmVlZCB0byBwb3N0cG9uZSB0aGUgYXNzaWdubWVudCwgb3RoZXJ3aXNlIGl0IGludGVyZmVyZXMgd2l0aCBkaXNhYmxlZCBzdGF0dXMgc2V0dGluZ1xuICAgICAgLy8gYW5kIGxlYWRzIHRvIGEgd3Jvbmcgc3RhdGUgKGUuZy4gZW1iZWRkZWQgc2JiLXZpc3VhbC1jaGVja2JveCkuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtRGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuZXZlciB0aGUgZm9ybSBpcyBiZWluZyByZXNldC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogIENhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byByZXN0b3JlIGVsZW1lbnTigJlzIHN0YXRlIHRvIHN0YXRlIGluIHdoaWNoIGNhc2VcbiAgICAgKiAgcmVhc29uIGlzIOKAnHJlc3RvcmXigJ0sIG9yIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGZ1bGZpbGwgYXV0b2ZpbGwgb24gYmVoYWxmIG9mXG4gICAgICogIHVzZXIgaW4gd2hpY2ggY2FzZSByZWFzb24gaXMg4oCcYXV0b2NvbXBsZXRl4oCdLlxuICAgICAqICBJbiB0aGUgY2FzZSBvZiDigJxyZXN0b3Jl4oCdLCBzdGF0ZSBpcyBhIHN0cmluZywgRmlsZSwgb3IgRm9ybURhdGEgb2JqZWN0XG4gICAgICogIHByZXZpb3VzbHkgc2V0IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gc2V0Rm9ybVZhbHVlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICAgIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICAgKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiBmb3JtIHZhbHVlIGlzIGNoYW5nZWQuXG4gICAgICogQWRhcHRzIGFuZCBzZXRzIHRoZSBmb3JtVmFsdWUgaW4gdGhlIHN1cHBvcnRlZCBmb3JtYXQgKHN0cmluZyB8IEZvcm1EYXRhIHwgRmlsZSB8IG51bGwpXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvc2V0Rm9ybVZhbHVlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogTWFya3MgdGhpcyBlbGVtZW50IGFzIHN1ZmZlcmluZyBmcm9tIHRoZSBjb25zdHJhaW50IGluZGljYXRlZCBieSB0aGVcbiAgICAgKiBmbGFnIGFyZ3VtZW50IGFuZCBhc3NvY2lhdGVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGl0LlxuICAgICAqIE5vdGUgdGhhdCBvbmx5IG9uZSBtZXNzYWdlIGlzIGRpc3BsYXllZCBhdCBhIHRpbWUgYW5kIGN1c3RvbSBtZXNzYWdlcyBieVxuICAgICAqIGNvbnN1bWVycyBhcmUgYWx3YXlzIGRpc3BsYXllZCBiZWZvcmUgaW50ZXJuYWwgbWVzc2FnZXMgYW5kIGludGVybmFsXG4gICAgICogbWVzc2FnZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGFkZGVkLlxuICAgICAqIFRvIHNldC9kZWZpbmUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGZsYWdzLCB5b3UgbmVlZCB0byBleHRlbmQgdGhlXG4gICAgICogVmFsaWRpdHlTdGF0ZSBwcm90b3R5cGUgYW5kIGJvdGggdGhlIFZhbGlkaXR5U3RhdGUgYW5kIHRoZVxuICAgICAqIFZhbGlkaXR5U3RhdGVGbGFncyBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogICAvLyBUaGUgdHlwZSBvZiB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGRvZXMgbm90IG5lZWQgdG8gYmUgYm9vbGVhbi5cbiAgICAgKiAgIE9iamVjdC5hc3NpZ24oVmFsaWRpdHlTdGF0ZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICAgZ2V0IG15RXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICogICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAqICAgICB9LFxuICAgICAqICAgfSk7XG4gICAgICpcbiAgICAgKiAgIGRlY2xhcmUgZ2xvYmFsIHtcbiAgICAgKiAgICAgaW50ZXJmYWNlIFZhbGlkaXR5U3RhdGUge1xuICAgICAqICAgICAgIG15RXJyb3I6IGJvb2xlYW47XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgaW50ZXJmYWNlIFZhbGlkaXR5U3RhdGUge1xuICAgICAqICAgICAgIG15RXJyb3I/OiBib29sZWFuO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNldFZhbGlkaXR5RmxhZzxUIGV4dGVuZHMga2V5b2YgVmFsaWRpdHlTdGF0ZUZsYWdzPihcbiAgICAgIGZsYWc6IFQsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBmbGFnVmFsdWU/OiBWYWxpZGl0eVN0YXRlRmxhZ3NbVF0sXG4gICAgKTogdm9pZCB7XG4gICAgICBmbGFnVmFsdWUgPz89IHRydWU7XG4gICAgICB0aGlzLl92YWxpZGl0eVN0YXRlcy5zZXQoZmxhZywgeyBmbGFnVmFsdWUsIG1lc3NhZ2UgfSk7XG4gICAgICB0aGlzLl9zZXRJbnRlcm5hbFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlbW92ZVZhbGlkaXR5RmxhZzxUIGV4dGVuZHMga2V5b2YgVmFsaWRpdHlTdGF0ZUZsYWdzPihmbGFnOiBUKTogdm9pZCB7XG4gICAgICB0aGlzLl92YWxpZGl0eVN0YXRlcy5kZWxldGUoZmxhZyk7XG4gICAgICB0aGlzLl9zZXRJbnRlcm5hbFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW50ZXJuYWxWYWxpZGl0eSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl92YWxpZGl0eVN0YXRlcy5zaXplKSB7XG4gICAgICAgIGxldCBvdXRwdXRNZXNzYWdlID0gdGhpcy5fdmFsaWRpdHlTdGF0ZXMuZ2V0KCdjdXN0b21FcnJvcicpPy5tZXNzYWdlO1xuICAgICAgICBjb25zdCBmbGFnczogVmFsaWRpdHlTdGF0ZUZsYWdzID0ge307XG4gICAgICAgIHRoaXMuX3ZhbGlkaXR5U3RhdGVzLmZvckVhY2goKHsgZmxhZ1ZhbHVlLCBtZXNzYWdlIH0sIGZsYWcpID0+IHtcbiAgICAgICAgICBmbGFnc1tmbGFnXSA9IGZsYWdWYWx1ZSBhcyBhbnk7XG4gICAgICAgICAgb3V0cHV0TWVzc2FnZSB8fD0gbWVzc2FnZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY3VzdG9tRmxhZ3MgPSBPYmplY3Qua2V5cyhWYWxpZGl0eVN0YXRlLnByb3RvdHlwZSkuZmlsdGVyKFxuICAgICAgICAgIChmKSA9PiAhKGYgaW4gdmFsaWRpdHlLZXlzKSAmJiBmICE9PSAndmFsaWQnLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IGZsYWcgb2YgY3VzdG9tRmxhZ3MpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZsYWcgaW4gZmxhZ3MgPyBmbGFnc1tmbGFnIGFzIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFnc10gOiBmYWxzZTtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5pbnRlcm5hbHMudmFsaWRpdHksIGZsYWcsIHsgdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIElmIGFueSBjdXN0b20gZXJyb3JzIGFyZSBwcm92aWRlZCwgd2UgbmVlZCB0byBzZXQgY3VzdG9tRXJyb3IgdG8gdHJ1ZSxcbiAgICAgICAgICAgIC8vIGFzIHRoaXMgaXMgdGhlIG9ubHkgY3VzdG9tIGVycm9yIHByb3BlcnR5IGJyb3dzZXJzIGFjY2VwdC5cbiAgICAgICAgICAgIGZsYWdzLmN1c3RvbUVycm9yID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVybmFscy5zZXRWYWxpZGl0eShmbGFncywgb3V0cHV0TWVzc2FnZSk7XG5cbiAgICAgICAgLy8gV2ViS2l0IHNlZW1zIHRvIGFsd2F5cyBzZXQgY3VzdG9tRXJyb3IgdG8gdHJ1ZSwgaWYgYW55IGVycm9yIGlzIGFjdGl2ZS5cbiAgICAgICAgLy8gRHVlIHRvIHRoaXMgd2UgcGF0Y2ggdGhlIGN1c3RvbUVycm9yIHZhbHVlIG1hbnVhbGx5LlxuICAgICAgICBpZiAoaXNXZWJraXQpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5pbnRlcm5hbHMudmFsaWRpdHksICdjdXN0b21FcnJvcicsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWxpZGl0eVN0YXRlcy5oYXMoJ2N1c3RvbUVycm9yJykgfHwgISFmbGFncy5jdXN0b21FcnJvcixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj4gJlxuICAgIFQ7XG59O1xuXG4vKipcbiAqIEEgdmFsdWUgdG8gYmUgcmVzdG9yZWQgZm9yIGEgY29tcG9uZW50J3MgZm9ybSB2YWx1ZS4gSWYgYSBjb21wb25lbnQncyBmb3JtXG4gKiBzdGF0ZSBpcyBhIGBGb3JtRGF0YWAgb2JqZWN0LCBpdHMgZW50cnkgbGlzdCBvZiBuYW1lIGFuZCB2YWx1ZXMgd2lsbCBiZVxuICogcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1SZXN0b3JlU3RhdGUgPSBGaWxlIHwgc3RyaW5nIHwgW3N0cmluZywgRm9ybURhdGFFbnRyeVZhbHVlXVtdO1xuXG4vKipcbiAqIFRoZSByZWFzb24gYSBmb3JtIGNvbXBvbmVudCBpcyBiZWluZyByZXN0b3JlZCBmb3IsIGVpdGhlciBgJ3Jlc3RvcmUnYCBmb3JcbiAqIGJyb3dzZXIgcmVzdG9yYXRpb24gb3IgYCdhdXRvY29tcGxldGUnYCBmb3IgcmVzdG9yaW5nIHVzZXIgdmFsdWVzLlxuICovXG5leHBvcnQgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbiA9ICdyZXN0b3JlJyB8ICdhdXRvY29tcGxldGUnO1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlIH0gZnJvbSAnLi9mb3JtLWFzc29jaWF0ZWQtbWl4aW4uanMnO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJSZXF1aXJlZE1peGluVHlwZSB7XG4gIHB1YmxpYyBhY2Nlc3NvciByZXF1aXJlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJSZXF1aXJlZE1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+LFxuICBWLFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiUmVxdWlyZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYlJlcXVpcmVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZC4gKi9cbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgLy8gVG8gcHJvdmlkZSB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgbmF0aXZlIHJlcXVpcmVkIHN0YXRlLFxuICAgICAgLy8gYW55IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uXG4gICAgICB0aGlzLl9yZXF1aXJlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkIHx8IHRoaXMuaXNSZXF1aXJlZEV4dGVybmFsbHkoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgLy8gRmlyZWZveCBuZWVkcyBleHBsaWNpdGx5IHNldCBhcmlhLXJlcXVpcmVkIHZhbHVlLlxuICAgICAgICB0aGlzLmludGVybmFscy5hcmlhUmVxdWlyZWQgPSBgJHt0aGlzLnJlcXVpcmVkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGFzICdvcicgY2hlY2sgdG8gdGhlIGN1cnJlbnQgcmVxdWlyZWQgc3RhdGUuXG4gICAgICogQ2FuIGUuZy4gYmUgdXNlZCB0byByZWFkIHJlcXVpcmVkIHN0YXRlIG9mIGEgZ3JvdXAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJSZXF1aXJlZEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHtcbiAgZGVmYXVsdENvbnZlcnRlcixcbiAgdHlwZSBMaXRFbGVtZW50LFxuICB0eXBlIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIHR5cGUgUHJvcGVydHlWYWx1ZXMsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHByZXZlbnRTY3JvbGxPblNwYWNlYmFyUHJlc3MgfSBmcm9tICcuLi9ldmVudGluZy5qcyc7XG5pbXBvcnQgeyBpMThuQ2hlY2tib3hSZXF1aXJlZCB9IGZyb20gJy4uL2kxOG4uanMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJEaXNhYmxlZE1peGluLCB0eXBlIFNiYkRpc2FibGVkTWl4aW5UeXBlIH0gZnJvbSAnLi9kaXNhYmxlZC1taXhpbi5qcyc7XG5pbXBvcnQge1xuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIHR5cGUgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGUsXG59IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcbmltcG9ydCB7IFNiYlJlcXVpcmVkTWl4aW4sIHR5cGUgU2JiUmVxdWlyZWRNaXhpblR5cGUgfSBmcm9tICcuL3JlcXVpcmVkLW1peGluLmpzJztcblxudHlwZSBDaGVja2VkU2V0dGVyVmFsdWUgPSB7IHZhbHVlOiBib29sZWFuOyBhdHRyaWJ1dGU6IGJvb2xlYW4gfTtcblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZVxuICBleHRlbmRzIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlXG4gIGltcGxlbWVudHMgUGFydGlhbDxTYmJEaXNhYmxlZE1peGluVHlwZT4sIFBhcnRpYWw8U2JiUmVxdWlyZWRNaXhpblR5cGU+XG57XG4gIHB1YmxpYyBnZXQgY2hlY2tlZCgpOiBib29sZWFuO1xuICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pO1xuXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pO1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbik7XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24pOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNSZXF1aXJlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHdpdGhVc2VySW50ZXJhY3Rpb24/KCk6IHZvaWQ7XG4gIHByb3RlY3RlZCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluIGVuYWJsZXMgbmF0aXZlIGZvcm0gc3VwcG9ydCBmb3IgY2hlY2tib3ggY29udHJvbHMuXG4gKlxuICogSW5oZXJpdGVkIGNsYXNzZXMgTVVTVCBpbXBsZW1lbnQgdGhlIGFyaWFDaGVja2VkIHN0YXRlIChFbGVtZW50SW50ZXJuYWxzKSB0aGVtc2VsdmVzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPiAmIFQgPT4ge1xuICBAaG9zdEF0dHJpYnV0ZXMoe1xuICAgIHRhYmluZGV4OiAnMCcsXG4gIH0pXG4gIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hFbGVtZW50XG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZE1peGluKFNiYlJlcXVpcmVkTWl4aW4oU2JiRm9ybUFzc29jaWF0ZWRNaXhpbihzdXBlckNsYXNzKSkpXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGU+XG4gIHtcbiAgICBwcml2YXRlIF9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYW5ndWFnZUNvbnRyb2xsZXIgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuICovXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBjb252ZXJ0ZXI6IHtcbiAgICAgICAgLi4uZGVmYXVsdENvbnZlcnRlcixcbiAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXR0ZXIgc28gdGhhdCB3ZSBrbm93IGl0IHdhcyBjYWxsZWQgYnkgYXR0cmlidXRlIGNoYW5nZS5cbiAgICAgICAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bik6IENoZWNrZWRTZXR0ZXJWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmYXVsdENvbnZlcnRlci5mcm9tQXR0cmlidXRlPy4odmFsdWUsIHR5cGUpO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQsIGF0dHJpYnV0ZTogdHJ1ZSB9IGFzIENoZWNrZWRTZXR0ZXJWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNldHRlciA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAodmFsdWUgYXMgdW5rbm93biBhcyBDaGVja2VkU2V0dGVyVmFsdWUpLmF0dHJpYnV0ZSA6IGZhbHNlO1xuICAgICAgaWYgKGF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIENoZWNrZWRTZXR0ZXJWYWx1ZSkudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzIHNvb24gYXMgbXV0YXRpb24gd2FzIGRvbmUgbm90IGJ5IHNldHRpbmcgYXR0cmlidXRlLFxuICAgICAgLy8gd2UgbmVlZCB0byBibG9jayBzeW5jaW5nIGF0dHJpYnV0ZS5cbiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQgJiYgIWF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICAgfVxuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgICAqIEBkZWZhdWx0ICdjaGVja2JveCdcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnY2hlY2tib3gnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmludGVybmFscy5yb2xlID0gJ2NoZWNrYm94JztcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NsaWNrJywgdGhpcy5faGFuZGxlVXNlckludGVyYWN0aW9uKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdrZXlkb3duJywgcHJldmVudFNjcm9sbE9uU3BhY2ViYXJQcmVzcyk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5dXAnLCB0aGlzLl9oYW5kbGVLZXlib2FyZEludGVyYWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICAvLyBBdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhZnRlciBwcm9ncmFtbWF0aWMgb3IgbWFudWFsIHN0YXRlIGNoYW5nZS5cbiAgICAgIGlmIChuYW1lICE9PSAnY2hlY2tlZCcgfHwgIXRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCkge1xuICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICAgIHRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyDigJxyZXN0b3Jl4oCdLCBvciB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBmdWxmaWxsIGF1dG9maWxsIG9uIGJlaGFsZiBvZlxuICAgICAqICB1c2VyIGluIHdoaWNoIGNhc2UgcmVhc29uIGlzIOKAnGF1dG9jb21wbGV0ZeKAnS5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2Yg4oCccmVzdG9yZeKAnSwgc3RhdGUgaXMgYSBzdHJpbmcsIEZpbGUsIG9yIEZvcm1EYXRhIG9iamVjdFxuICAgICAqICBwcmV2aW91c2x5IHNldCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldEZvcm1WYWx1ZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQgJiYgKG5hbWUgPT09ICdjaGVja2VkJyB8fCBuYW1lID09PSAncmVxdWlyZWQnIHx8ICFuYW1lKSkge1xuICAgICAgICB0aGlzLl9zZXRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgdGhpcy5fc2V0VmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGxvZ2ljIHdoaWNoIGlzIGJlaW5nIGV4ZWN1dGVkIHdoZW4gdXNlclxuICAgICAqIGludGVyYWN0aW9uIGhhcHBlbnMgYW5kIHN0YXRlIGlzIG5vdCBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlLCBgJHt0aGlzLmNoZWNrZWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0cmlnZ2VyZWQgb24ga2V5Ym9hcmQgdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNoZWNrYm94LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUtleWJvYXJkSW50ZXJhY3Rpb24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICB0aGlzLl9oYW5kbGVVc2VySW50ZXJhY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIE1ldGhvZCB0cmlnZ2VyZWQgb24gdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNoZWNrYm94LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZVVzZXJJbnRlcmFjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMud2l0aFVzZXJJbnRlcmFjdGlvbj8uKCk7XG4gICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgICAgdGhpcy5fYXR0cmlidXRlTXV0YXRpb25CbG9ja2VkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgY29tcG9zZWQ6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfc2V0VmFsaWRpdHkoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRpdHlGbGFnKFxuICAgICAgICAgICd2YWx1ZU1pc3NpbmcnLFxuICAgICAgICAgIGkxOG5DaGVja2JveFJlcXVpcmVkW3RoaXMuX2xhbmd1YWdlQ29udHJvbGxlci5jdXJyZW50XSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveEVsZW1lbnQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgeyBpc1NlcnZlciwgdHlwZSBMaXRFbGVtZW50LCB0eXBlIFByb3BlcnR5RGVjbGFyYXRpb24sIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IGdldE5leHRFbGVtZW50SW5kZXgsIGludGVyYWN0aXZpdHlDaGVja2VyLCBpc0Fycm93S2V5UHJlc3NlZCB9IGZyb20gJy4uL2ExMXkuanMnO1xuaW1wb3J0IHsgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyLCBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBpMThuU2VsZWN0aW9uUmVxdWlyZWQgfSBmcm9tICcuLi9pMThuLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHsgU2JiRGlzYWJsZWRNaXhpbiwgdHlwZSBTYmJEaXNhYmxlZE1peGluVHlwZSB9IGZyb20gJy4vZGlzYWJsZWQtbWl4aW4uanMnO1xuaW1wb3J0IHtcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICB0eXBlIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlLFxufSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5pbXBvcnQgeyBTYmJSZXF1aXJlZE1peGluLCB0eXBlIFNiYlJlcXVpcmVkTWl4aW5UeXBlIH0gZnJvbSAnLi9yZXF1aXJlZC1taXhpbi5qcyc7XG5cbi8qKlxuICogQSBzdGF0aWMgcmVnaXN0cnkgdGhhdCBob2xkcyBhIGNvbGxlY3Rpb24gb2YgZ3JvdXBlZCBgcmFkaW8tYnV0dG9uc2AuXG4gKiBHcm91cHMgb2YgcmFkaW8gYnV0dG9ucyBhcmUgbG9jYWwgdG8gdGhlIGZvcm0gdGhleSBiZWxvbmcgKG9yIHRoZSBgcmVuZGVyUm9vdGAgaWYgdGhleSdyZSBub3QgcGFydCBvZiBhbnkgZm9ybSlcbiAqIE11bHRpcGxlIGdyb3VwcyBvZiByYWRpbyB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGNvZXhpc3QgKGFzIGxvbmcgYXMgdGhleSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgZm9ybSAvIHJlbmRlclJvb3QpXG4gKiBJdCBpcyBtYWlubHkgdXNlZCB0byBzdXBwb3J0IHRoZSBzdGFuZGFsb25lIGdyb3VwcyBvZiByYWRpb3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJhZGlvQnV0dG9uUmVnaXN0cnkgPSBuZXcgV2Vha01hcDxcbiAgTm9kZSxcbiAgTWFwPHN0cmluZywgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+PlxuPigpO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlXG4gIGV4dGVuZHMgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGVcbiAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiwgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT5cbntcbiAgcHVibGljIGFjY2Vzc29yIGNoZWNrZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcHVibGljIGFjY2Vzc29yIHJlcXVpcmVkOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhc3NvY2lhdGVkUmFkaW9CdXR0b25zPzogU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+O1xuICAvKiogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseS4gKi9cbiAgcHJvdGVjdGVkIGFib3J0OiBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXI7XG5cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLCByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCB1cGRhdGVGb2N1c2FibGVSYWRpb3MoKTogdm9pZDtcbiAgcHJvdGVjdGVkIGVtaXRDaGFuZ2VFdmVudHMoKTogdm9pZDtcbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlLZXlib2FyZChyYWRpbzogU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZSk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogVGhlIFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIHJhZGlvIGNvbnRyb2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudFxuICAgIGV4dGVuZHMgU2JiRGlzYWJsZWRNaXhpbihTYmJSZXF1aXJlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oc3VwZXJDbGFzcykpKVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPlxuICB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIGNoZWNrZWQuXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fY2hlY2tlZCA9ICEhdmFsdWU7XG5cbiAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWNoZWNrZWQnLCB0aGlzLmNoZWNrZWQpO1xuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSB0aGlzLmNoZWNrZWQudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICAgfVxuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlci5uYW1lID0gdmFsdWU7XG5cbiAgICAgIHRoaXMuX2Rpc2Nvbm5lY3RGcm9tUmVnaXN0cnkoKTtcbiAgICAgIHRoaXMuX2Nvbm5lY3RUb1JlZ2lzdHJ5KCk7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTtcbiAgICB9XG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gc3VwZXIubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIHR5cGUgb2YgZWxlbWVudC5cbiAgICAgKiBAZGVmYXVsdCAncmFkaW8nXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ3JhZGlvJztcbiAgICB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseS4gKi9cbiAgICBwcm90ZWN0ZWQgYWJvcnQgPSBuZXcgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyKHRoaXMpO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIHJhZGlvIGJ1dHRvbnMgdGhhdCBiZWxvbmdzIHRvIHRoZSBzYW1lIGdyb3VwIG9mIGB0aGlzYC5cbiAgICAgKiBBc3N1bWUgdGhlbSBvcmRlcmVkIGluIERPTSBvcmRlclxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3NvY2lhdGVkUmFkaW9CdXR0b25zPzogU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50PjtcbiAgICBwcml2YXRlIF9yYWRpb0J1dHRvbkdyb3Vwc01hcD86IE1hcDxzdHJpbmcsIFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPj47XG4gICAgcHJpdmF0ZSBfZGlkTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhbmd1YWdlQ29udHJvbGxlciA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgdGhpcy5pbnRlcm5hbHMucm9sZSA9ICdyYWRpbyc7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5ZG93bicsIChlKSA9PiB0aGlzLl9oYW5kbGVBcnJvd0tleURvd24oZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLl9jb25uZWN0VG9SZWdpc3RyeSgpO1xuICAgICAgdGhpcy5fc3luY2hyb25pemVHcm91cFN0YXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuX2Rpc2Nvbm5lY3RGcm9tUmVnaXN0cnkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZvcm0gaXMgYmVpbmcgcmVzZXQuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMg4oCccmVzdG9yZeKAnSwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyDigJxhdXRvY29tcGxldGXigJ0uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICAgIF9yZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IHN0YXRlID09PSB0aGlzLnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQgJiYgKG5hbWUgPT09ICdjaGVja2VkJyB8fCBuYW1lID09PSAncmVxdWlyZWQnIHx8ICFuYW1lKSkge1xuICAgICAgICB0aGlzLl9zZXRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIHRoaXMuX2RpZExvYWQgPSB0cnVlO1xuICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICAgIHRoaXMuX3NldFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIG9uIGB2YWx1ZWAgY2hhbmdlXG4gICAgICogSWYgJ2NoZWNrZWQnLCB1cGRhdGUgdGhlIHZhbHVlLiBPdGhlcndpc2UsIGRvIG5vdGhpbmcuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ubHkgYSBzaW5nbGUgcmFkaW8gc2hvdWxkIGJlIGZvY3VzYWJsZSBpbiB0aGUgZ3JvdXAuIERlZmluZWQgYXM6XG4gICAgICogLSB0aGUgY2hlY2tlZCByYWRpbztcbiAgICAgKiAtIHRoZSBmaXJzdCBub24tZGlzYWJsZWQgcmFkaW8gaW4gRE9NIG9yZGVyO1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVGb2N1c2FibGVSYWRpb3MoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuX2RpZExvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmFkaW9zID0gdGhpcy5faW50ZXJhY3RhYmxlR3JvdXBlZFJhZGlvcygpO1xuICAgICAgY29uc3QgY2hlY2tlZEluZGV4ID0gcmFkaW9zLmZpbmRJbmRleCgocikgPT4gci5jaGVja2VkICYmICFyLmRpc2FibGVkICYmICFyLmZvcm1EaXNhYmxlZCk7XG4gICAgICBjb25zdCBmb2N1c2FibGVJbmRleCA9XG4gICAgICAgIGNoZWNrZWRJbmRleCAhPT0gLTFcbiAgICAgICAgICA/IGNoZWNrZWRJbmRleFxuICAgICAgICAgIDogcmFkaW9zLmZpbmRJbmRleCgocikgPT4gIXIuZGlzYWJsZWQgJiYgIXIuZm9ybURpc2FibGVkKTsgLy8gR2V0IHRoZSBmaXJzdCBmb2N1c2FibGUgcmFkaW9cblxuICAgICAgaWYgKGZvY3VzYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICByYWRpb3NbZm9jdXNhYmxlSW5kZXhdLnRhYkluZGV4ID0gMDtcbiAgICAgICAgcmFkaW9zLnNwbGljZShmb2N1c2FibGVJbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHRhYkluZGV4IG9uIG90aGVyIHJhZGlvc1xuICAgICAgcmFkaW9zLmZvckVhY2goKHIpID0+IHIucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbmF2aWdhdGVCeUtleWJvYXJkKG5leHQ6IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBuZXh0LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnRzKCk7XG5cbiAgICAgIGF3YWl0IG5leHQudXBkYXRlQ29tcGxldGU7XG4gICAgICBuZXh0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRDaGFuZ2VFdmVudHMoKTogdm9pZCB7XG4gICAgICAvLyBNYW51YWxseSBkaXNwYXRjaCBldmVudHMgdG8gc2ltdWxhdGUgYSB1c2VyIGludGVyYWN0aW9uXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2Rlc2VsZWN0R3JvdXBlZFJhZGlvcygpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYHRoaXNgIHRvIHRoZSByYWRpb0J1dHRvbiByZWdpc3RyeVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nvbm5lY3RUb1JlZ2lzdHJ5KCk6IHZvaWQge1xuICAgICAgaWYgKCF0aGlzLm5hbWUgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb290ID0gdGhpcy5mb3JtID8/IHRoaXMuZ2V0Um9vdE5vZGUoKTtcbiAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gcmFkaW9CdXR0b25SZWdpc3RyeS5nZXQocm9vdCk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlICdyb290JyBtYXAgZW50cnlcbiAgICAgIGlmICghdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXApIHtcbiAgICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJhZGlvQnV0dG9uUmVnaXN0cnkuc2V0KHJvb3QsIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID0gdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAuZ2V0KFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICApIGFzIHVua25vd24gYXMgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50PjtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgc2V0XG4gICAgICBpZiAoIXRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucykge1xuICAgICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwLnNldChcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zIGFzIHVua25vd24gYXMgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbnNlcnQgdGhlIG5ldyByYWRpbyBpbnRvIHRoZSBzZXQgYW5kIHNvcnQgZm9sbG93aW5nIHRoZSBET00gb3JkZXIuXG4gICAgICAvLyBTaW5jZSB0aGUgb3JkZXIgb2YgYSAnU2V0JyBpcyB0aGUgaW5zZXJ0IG9yZGVyLCB3ZSBoYXZlIHRvIGVtcHR5IGl0IGFuZCByZS1pbnNlcnQgcmFkaW9zIGluIG9yZGVyXG4gICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMpO1xuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zLmNsZWFyKCk7XG5cbiAgICAgIC8vIEZpbmQgYHRoaXNgIHBvc2l0aW9uIGFuZCBpbnNlcnQgaXRcbiAgICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoXG4gICAgICAgIChyKSA9PiB0aGlzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcsXG4gICAgICApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMCwgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyaWVzLnB1c2godGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcG9wdWxhdGUgdGhlIFNldFxuICAgICAgZW50cmllcy5mb3JFYWNoKChyKSA9PiB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMhLmFkZChyKSk7XG5cbiAgICAgIHRoaXMuX3NldFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGB0aGlzYCBmcm9tIHRoZSByYWRpb0J1dHRvbiByZWdpc3RyeSBhbmQsIGlmIHRoZSBncm91cCBpcyBlbXB0eSwgZGVsZXRlIHRoZSBlbnRyeSBmcm9tIHRoZSBncm91cHMgTWFwXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGlzY29ubmVjdEZyb21SZWdpc3RyeSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz8uZGVsZXRlKHRoaXMpO1xuXG4gICAgICBpZiAodGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zPy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwPy5kZWxldGUodGhpcy5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NldFZhbGlkaXR5KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbGlkaXR5IG9mIGFsbCBhc3NvY2lhdGVkIHJhZGlvIGJ1dHRvbnMuXG4gICAgICogSWYgYW55IHJhZGlvIGJ1dHRvbiBpcyByZXF1aXJlZCwgYWxsIGFzc29jaWF0ZWQgYXJlIHJlcXVpcmVkIGFzIHdlbGwuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0VmFsaWRpdHkoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCByZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zKSB7XG4gICAgICAgIHJlcXVpcmVkIHx8PSByYWRpby5yZXF1aXJlZDtcbiAgICAgICAgY2hlY2tlZCB8fD0gcmFkaW8uY2hlY2tlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVpcmVkICYmICFjaGVja2VkKSB7XG4gICAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucy5mb3JFYWNoKChyKSA9PlxuICAgICAgICAgIHIuc2V0VmFsaWRpdHlGbGFnKFxuICAgICAgICAgICAgJ3ZhbHVlTWlzc2luZycsXG4gICAgICAgICAgICBpMThuU2VsZWN0aW9uUmVxdWlyZWRbdGhpcy5fbGFuZ3VhZ2VDb250cm9sbGVyLmN1cnJlbnRdLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMuZm9yRWFjaCgocikgPT4gci5yZW1vdmVWYWxpZGl0eUZsYWcoJ3ZhbHVlTWlzc2luZycpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBsaXN0IG9mICdpbnRlcmFjdGFibGUnIGdyb3VwZWQgcmFkaW9zLCBvcmRlcmVkIGluIERPTSBvcmRlclxuICAgICAqL1xuICAgIHByaXZhdGUgX2ludGVyYWN0YWJsZUdyb3VwZWRSYWRpb3MoKTogU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPz8gW10pLmZpbHRlcigoZWwpID0+XG4gICAgICAgIGludGVyYWN0aXZpdHlDaGVja2VyLmlzVmlzaWJsZShlbCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IG90aGVyIHJhZGlvIG9mIHRoZSBzYW1lIGdyb3VwXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGVzZWxlY3RHcm91cGVkUmFkaW9zKCk6IHZvaWQge1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKHIpID0+IHIgIT09IHRoaXMpXG4gICAgICAgIC5mb3JFYWNoKChyKSA9PiAoci5jaGVja2VkID0gZmFsc2UpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9oYW5kbGVBcnJvd0tleURvd24oZXZ0OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIWlzQXJyb3dLZXlQcmVzc2VkKGV2dCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IGVuYWJsZWRSYWRpb3MgPSB0aGlzLl9pbnRlcmFjdGFibGVHcm91cGVkUmFkaW9zKCkuZmlsdGVyKFxuICAgICAgICAocikgPT4gIXIuZGlzYWJsZWQgJiYgIXIuZm9ybURpc2FibGVkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQ6IG51bWJlciA9IGVuYWJsZWRSYWRpb3MuaW5kZXhPZih0aGlzKTtcbiAgICAgIGNvbnN0IG5leHRJbmRleDogbnVtYmVyID0gZ2V0TmV4dEVsZW1lbnRJbmRleChldnQsIGN1cnJlbnQsIGVuYWJsZWRSYWRpb3MubGVuZ3RoKTtcblxuICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZUJ5S2V5Ym9hcmQoZW5hYmxlZFJhZGlvc1tuZXh0SW5kZXhdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbi8vIERlZmluZSB0aGUgaW50ZXJmYWNlIGZvciB0aGUgbWl4aW5cbmV4cG9ydCBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIFNiYkh5ZHJhdGlvbk1peGluVHlwZSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGNvbXBsZXRlZCBoeWRyYXRpb24uXG4gICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCByZXF1aXJlZCBoeWRyYXRpb25cbiAgICogYW5kIGBmYWxzZWAgaWYgbm90LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSBvZiBhIGJvb2xlYW4gdGhhdCByZXNvbHZlcyB0byB0cnVlIG9uY2UgdGhlIGh5ZHJhdGlvbiBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGh5ZHJhdGlvbkNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciBoeWRyYXRpb24gaXMgcmVxdWlyZWQgYW5kIG5vdCBjb21wbGV0ZWQuICovXG4gIHByb3RlY3RlZCBnZXQgaHlkcmF0aW9uUmVxdWlyZWQoKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGlzIG1peGluIGV4dGVuZHMgYSBiYXNlIGNsYXNzIHdpdGggZnVuY3Rpb25hbGl0eSB0byBjaGVjayBpZiBoeWRyYXRpb24gaXMgY29tcGxldGVkLlxuICogSXQgYWxzbyBkZWxheXMgc2xvdGNoYW5nZSBldmVudHMgdW50aWwgaHlkcmF0aW9uIGlzIGNvbXBsZXRlLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcmV0dXJucyBBIGNsYXNzIGV4dGVuZGVkIHdpdGggdGhlIGh5ZHJhdGlvbiBjaGVjayBmdW5jdGlvbmFsaXR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiSHlkcmF0aW9uTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBiYXNlOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJIeWRyYXRpb25NaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkh5ZHJhdGlvbk1peGluQ2xhc3MgZXh0ZW5kcyBiYXNlIGltcGxlbWVudHMgUGFydGlhbDxTYmJIeWRyYXRpb25NaXhpblR5cGU+IHtcbiAgICBwcml2YXRlIF9oeWRyYXRpb25SZXF1aXJlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9oeWRyYXRpb25Db21wbGV0ZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KFxuICAgICAgKHJlc29sdmUpID0+ICh0aGlzLl9yZXNvbHZlSHlkcmF0aW9uID0gcmVzb2x2ZSksXG4gICAgKTtcbiAgICBwcml2YXRlIF9yZXNvbHZlSHlkcmF0aW9uITogKGh5ZHJhdGlvblJlcXVpcmVkOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgaHlkcmF0aW9uLlxuICAgICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCByZXF1aXJlZCBoeWRyYXRpb25cbiAgICAgKiBhbmQgYGZhbHNlYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcHJvbWlzZSBvZiBhIGJvb2xlYW4gdGhhdCByZXNvbHZlcyB0byB0cnVlIG9uY2UgdGhlIGh5ZHJhdGlvbiBjb21wbGV0ZWQuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoeWRyYXRpb25Db21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIHJldHVybiB0aGlzLl9oeWRyYXRpb25Db21wbGV0ZTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyB3aGV0aGVyIGh5ZHJhdGlvbiBpcyByZXF1aXJlZCBhbmQgbm90IGNvbXBsZXRlZC4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGh5ZHJhdGlvblJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICAvLyBDaGVjayB3aGV0aGVyIGh5ZHJhdGlvbiBpcyBuZWVkZWQgYnkgY2hlY2tpbmcgd2hldGhlciB0aGUgc2hhZG93IHJvb3RcbiAgICAgIC8vIGlzIGF2YWlsYWJsZSBkdXJpbmcgY29uc3RydWN0aW9uL3VwZ3JhZGUgcGhhc2UuXG4gICAgICB0aGlzLl9oeWRyYXRpb25SZXF1aXJlZCA9ICEhdGhpcy5zaGFkb3dSb290O1xuICAgICAgaWYgKCF0aGlzLl9oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgICB0aGlzLl9yZXNvbHZlSHlkcmF0aW9uKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIER1cmluZyBoeWRyYXRpb24gcGhhc2UsIHdlIHdhbnQgdG8gc3VwcHJlc3Mgc2xvdGNoYW5nZSBldmVudHMgYXMgdGhleVxuICAgICAgICAvLyBjYW4gY2F1c2UgcmVuZGVyIGRpZmZlcmVuY2VzLCB3aGljaCB3b3VsZCBicmVhayBoeWRyYXRpb24uIEFmdGVyXG4gICAgICAgIC8vIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZSwgd2UgZGlzcGF0Y2ggYSBtYW51YWwgc2xvdGNoYW5nZSBldmVudCwgaWYgdGhlcmVcbiAgICAgICAgLy8gYXJlIGVsZW1lbnRzIGFzc2lnbmVkIHRvIGEgc2xvdC5cbiAgICAgICAgY29uc3Qgc3VwcHJlc3NTbG90Y2hhbmdlRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV2ZW50T3B0aW9uczogRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7IGNhcHR1cmU6IHRydWUgfTtcbiAgICAgICAgY29uc3Qgc2xvdHMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3Nsb3QnKTtcbiAgICAgICAgaWYgKHNsb3RzPy5sZW5ndGgpIHtcbiAgICAgICAgICBzbG90cy5mb3JFYWNoKChzbG90KSA9PlxuICAgICAgICAgICAgc2xvdC5hZGRFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgc3VwcHJlc3NTbG90Y2hhbmdlRXZlbnQsIGV2ZW50T3B0aW9ucyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlLnRoZW4oKCkgPT5cbiAgICAgICAgICAgIHNsb3RzLmZvckVhY2goKHNsb3QpID0+IHtcbiAgICAgICAgICAgICAgc2xvdC5yZW1vdmVFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgc3VwcHJlc3NTbG90Y2hhbmdlRXZlbnQsIGV2ZW50T3B0aW9ucyk7XG4gICAgICAgICAgICAgIGlmIChzbG90LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzbG90LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdzbG90Y2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICAvLyBXaGVuIGh5ZHJhdGlvbiBpcyBuZWVkZWQsIHdlIHdhaXQgdGhlIGh5ZHJhdGlvbiBwcm9jZXNzIHRvIGZpbmlzaCwgd2hpY2ggaXMgcGF0Y2hlZFxuICAgICAgLy8gaW50byB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgTGl0RWxlbWVudCBiYXNlIGNsYXNzLlxuICAgICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgaWYgKHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVIeWRyYXRpb24odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBTYmJIeWRyYXRpb25NaXhpbkNsYXNzIGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJIeWRyYXRpb25NaXhpblR5cGU+ICYgVDtcbn07XG4iLCJpbXBvcnQgeyBodG1sLCB0eXBlIExpdEVsZW1lbnQsIG5vdGhpbmcsIHR5cGUgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHsgU2JiSHlkcmF0aW9uTWl4aW4sIHR5cGUgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIH0gZnJvbSAnLi9oeWRyYXRpb24tbWl4aW4uanMnO1xuXG5pbXBvcnQgJy4uLy4uL3NjcmVlbi1yZWFkZXItb25seS5qcyc7XG5cbmNvbnN0IFNTUl9DSElMRF9DT1VOVF9BVFRSSUJVVEUgPSAnZGF0YS1zc3ItY2hpbGQtY291bnQnO1xuY29uc3QgU0xPVE5BTUVfUFJFRklYID0gJ2xpJztcblxuZXhwb3J0IHR5cGUgU2JiTmFtZWRTbG90UHJvcGVydGllcyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhcmlhSGlkZGVuOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3Igd2lsbFVwZGF0ZSBvciBzaW1pbGFyIGNoZWNrcy5cbiAqIEFsbG93cyB0aGUgdXNhZ2Ugb2YgdGhlIHN0cmluZyBsaXRlcmFsICdsaXN0Q2hpbGRyZW4nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8V2l0aExpc3RDaGlsZHJlbjx0aGlzPj4pOiB2b2lkIHtcbiAqICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGlzdENoaWxkcmVuJykpIHtcbiAqICAgICAuLi5cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgdHlwZSBXaXRoTGlzdENoaWxkcmVuPFxuICBUIGV4dGVuZHMgU2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxDPixcbiAgQyBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQsXG4+ID0gVCAmIHsgbGlzdENoaWxkcmVuOiBDW10gfTtcblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxcbiAgQyBleHRlbmRzIEhUTUxFbGVtZW50LFxuPiBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluVHlwZSB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBsaXN0Q2hpbGRMb2NhbE5hbWVzOiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIGFjY2Vzc29yIGxpc3RDaGlsZHJlbjogQ1tdO1xuICBwcm90ZWN0ZWQgcmVuZGVyTGlzdChcbiAgICBhdHRyaWJ1dGVzPzoge1xuICAgICAgY2xhc3M/OiBzdHJpbmc7XG4gICAgICBhcmlhTGFiZWw/OiBzdHJpbmc7XG4gICAgICBhcmlhTGFiZWxsZWRieT86IHN0cmluZztcbiAgICB9LFxuICAgIGxpc3RJdGVtQXR0cmlidXRlcz86IHtcbiAgICAgIGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBUZW1wbGF0ZVJlc3VsdDtcbiAgcHJvdGVjdGVkIGxpc3RTbG90RW50cmllcygpOiBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzW107XG4gIHByb3RlY3RlZCByZW5kZXJIaWRkZW5TbG90KCk6IFRlbXBsYXRlUmVzdWx0O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiTmFtZWRTbG90TGlzdE1peGluID0gPFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQsXG4gIFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxDPj4gJiBUID0+IHtcbiAgLyoqXG4gICAqIFRoaXMgYmFzZSBjbGFzcyBwcm92aWRlcyBuYW1lZCBzbG90IGxpc3Qgb2JzZXJ2ZXIgZnVuY3Rpb25hbGl0eS5cbiAgICogVGhpcyBhbGxvd3MgdXNpbmcgdGhlIHBhdHRlcm4gb2YgcmVuZGVyaW5nIGEgbmFtZWQgc2xvdCBmb3IgZWFjaCBjaGlsZCwgd2hpY2ggYWxsb3dzXG4gICAqIHdyYXBwaW5nIGNoaWxkcmVuIGluIGFuIHVsL2xpIGxpc3QuXG4gICAqL1xuICBhYnN0cmFjdCBjbGFzcyBOYW1lZFNsb3RMaXN0RWxlbWVudDxDIGV4dGVuZHMgSFRNTEVsZW1lbnQgPSBIVE1MRWxlbWVudD5cbiAgICBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluKHN1cGVyQ2xhc3MpXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYk5hbWVkU2xvdExpc3RNaXhpblR5cGU8Qz4+XG4gIHtcbiAgICAvKiogQSBsaXN0IG9mIGxvd2VyLWNhc2VkIHRhZyBuYW1lcyB0byBtYXRjaCBhZ2FpbnN0LiAoZS5nLiBgc2JiLWxpbmtgKSAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBsaXN0Q2hpbGRMb2NhbE5hbWVzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIHRoZSBkZWZpbmVkIHRhZyBuYW1lcy5cbiAgICAgKiBUaGlzIGFycmF5IGlzIG9ubHkgdXBkYXRlZCBpZiB0aGVyZSBpcyBhbiBhY3R1YWwgY2hhbmdlXG4gICAgICogdG8gdGhlIGNoaWxkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBsaXN0Q2hpbGRyZW46IENbXSA9IFtdO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2hhbmRsZVNsb3RjaGFuZ2UsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5zaGFkb3dSb290Py5yZW1vdmVFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgdGhpcy5faGFuZGxlU2xvdGNoYW5nZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlU2xvdGNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGxpc3RDaGlsZHJlbiA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiA/PyBbXSkuZmlsdGVyKChlKTogZSBpcyBDID0+XG4gICAgICAgIHRoaXMubGlzdENoaWxkTG9jYWxOYW1lcy5pbmNsdWRlcyhlLmxvY2FsTmFtZSksXG4gICAgICApO1xuICAgICAgLy8gSWYgdGhlIHNsb3R0ZWQgY2hpbGQgaW5zdGFuY2VzIGhhdmUgbm90IGNoYW5nZWQsIHdlIGNhbiBza2lwIHN5bmNpbmcgYW5kIHVwZGF0aW5nXG4gICAgICAvLyB0aGUgbGluayByZWZlcmVuY2UgbGlzdC5cbiAgICAgIGlmIChcbiAgICAgICAgbGlzdENoaWxkcmVuLmxlbmd0aCA9PT0gdGhpcy5saXN0Q2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIHRoaXMubGlzdENoaWxkcmVuLmV2ZXJ5KChlLCBpKSA9PiBsaXN0Q2hpbGRyZW5baV0gPT09IGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RDaGlsZHJlblxuICAgICAgICAuZmlsdGVyKChjKSA9PiAhbGlzdENoaWxkcmVuLmluY2x1ZGVzKGMpKVxuICAgICAgICAuZm9yRWFjaCgoYykgPT4gYy5yZW1vdmVBdHRyaWJ1dGUoJ3Nsb3QnKSk7XG4gICAgICB0aGlzLmxpc3RDaGlsZHJlbiA9IGxpc3RDaGlsZHJlbjtcbiAgICAgIHRoaXMubGlzdENoaWxkcmVuLmZvckVhY2goKGMsIGluZGV4KSA9PlxuICAgICAgICBjLnNldEF0dHJpYnV0ZSgnc2xvdCcsIGAke1NMT1ROQU1FX1BSRUZJWH0tJHtpbmRleH1gKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgc3NyIGF0dHJpYnV0ZSwgb25jZSB3ZSBoYXZlIGFjdHVhbGx5IGluaXRpYWxpemVkIHRoZSBjaGlsZHJlbiBlbGVtZW50cy5cbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKFNTUl9DSElMRF9DT1VOVF9BVFRSSUJVVEUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGxpc3QgYW5kIGxpc3Qgc2xvdHMgZm9yIHNsb3R0ZWQgY2hpbGRyZW4gb3IgYSBudW1iZXIgb2YgbGlzdCBzbG90c1xuICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBkYXRhLXNzci1jaGlsZC1jb3VudGAgYXR0cmlidXRlIHZhbHVlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhIHBvc3NpYmxlIG9wdGltaXphdGlvbiBmb3IgU1NSLCBhcyBpbiBhbiBTU1IgTGl0IGVudmlyb25tZW50XG4gICAgICogb3RoZXIgZWxlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUsIGJ1dCBtaWdodCBiZSBhdmFpbGFibGUgaW4gdGhlIG1ldGFcbiAgICAgKiBmcmFtZXdvcmsgd3JhcHBlciAobGlrZSBlLmcuIFJlYWN0KS4gVGhpcyBhbGxvd3MgdG8gcHJvdmlkZSB0aGUgbnVtYmVyIG9mXG4gICAgICogY2hpbGRyZW4gdG8gYmUgcGFzc2VkIHZpYSB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbmRlckxpc3QoXG4gICAgICBhdHRyaWJ1dGVzOiB7IGNsYXNzPzogc3RyaW5nOyBhcmlhTGFiZWw/OiBzdHJpbmc7IGFyaWFMYWJlbGxlZGJ5Pzogc3RyaW5nIH0gPSB7fSxcbiAgICAgIGxpc3RJdGVtQXR0cmlidXRlczogeyBsb2NhbE5hbWVWaXN1YWxPbmx5Pzogc3RyaW5nW10gfSA9IHt9LFxuICAgICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIGNvbnN0IGxpc3RTbG90TmFtZXM6IFNiYk5hbWVkU2xvdFByb3BlcnRpZXNbXSA9IHRoaXMubGlzdFNsb3RFbnRyaWVzKGxpc3RJdGVtQXR0cmlidXRlcyk7XG5cbiAgICAgIGlmIChsaXN0U2xvdE5hbWVzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx1bFxuICAgICAgICAgICAgY2xhc3M9JHthdHRyaWJ1dGVzLmNsYXNzIHx8IHRoaXMubG9jYWxOYW1lfVxuICAgICAgICAgICAgYXJpYS1sYWJlbD0ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9JHthdHRyaWJ1dGVzLmFyaWFMYWJlbGxlZGJ5IHx8IG5vdGhpbmd9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgJHtsaXN0U2xvdE5hbWVzLm1hcChcbiAgICAgICAgICAgICAgKHNsb3QpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgPGxpIGFyaWEtaGlkZGVuPSR7c2xvdC5hcmlhSGlkZGVuIHx8IG5vdGhpbmd9PlxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT0ke3Nsb3QubmFtZX0+PC9zbG90PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIGAsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgJHt0aGlzLnJlbmRlckhpZGRlblNsb3QoKX1cbiAgICAgICAgYDtcbiAgICAgIH0gZWxzZSBpZiAobGlzdFNsb3ROYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHthdHRyaWJ1dGVzLmFyaWFMYWJlbH08L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9JHthdHRyaWJ1dGVzLmNsYXNzIHx8IHRoaXMubG9jYWxOYW1lfT5cbiAgICAgICAgICAgIDxzcGFuPjxzbG90IG5hbWU9JHtsaXN0U2xvdE5hbWVzWzBdLm5hbWV9Pjwvc2xvdD48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICR7dGhpcy5yZW5kZXJIaWRkZW5TbG90KCl9IGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIaWRkZW5TbG90KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzLCB3aGljaCBob2xkcyB0aGUgbGlzdCBzbG90IG5hbWVzIGFuZCB0aGUgaGlkZGVuIHByb3BlcnR5O1xuICAgICAqIGl0cyBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBtYXRjaGVkIGNoaWxkcmVuIG9yIHRoZSBgZGF0YS1zc3ItY2hpbGQtY291bnRgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYSBwb3NzaWJsZSBvcHRpbWl6YXRpb24gZm9yIFNTUiwgYXMgaW4gYW4gU1NSIExpdCBlbnZpcm9ubWVudFxuICAgICAqIG90aGVyIGVsZW1lbnRzIGFyZSBub3QgYXZhaWxhYmxlLCBidXQgbWlnaHQgYmUgYXZhaWxhYmxlIGluIHRoZSBtZXRhXG4gICAgICogZnJhbWV3b3JrIHdyYXBwZXIgKGxpa2UgZS5nLiBSZWFjdCkuIFRoaXMgYWxsb3dzIHRvIHByb3ZpZGUgdGhlIG51bWJlciBvZlxuICAgICAqIGNoaWxkcmVuIHRvIGJlIHBhc3NlZCB2aWEgdGhlIGBkYXRhLXNzci1jaGlsZC1jb3VudGAgYXR0cmlidXRlIHZhbHVlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsaXN0U2xvdEVudHJpZXMobGlzdEl0ZW1BdHRyaWJ1dGVzOiB7XG4gICAgICBsb2NhbE5hbWVWaXN1YWxPbmx5Pzogc3RyaW5nW107XG4gICAgfSk6IFNiYk5hbWVkU2xvdFByb3BlcnRpZXNbXSB7XG4gICAgICBjb25zdCBsaXN0Q2hpbGRyZW4gPSB0aGlzLmxpc3RDaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgPyB0aGlzLmxpc3RDaGlsZHJlblxuICAgICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6ICsodGhpcy5nZXRBdHRyaWJ1dGUoU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSkgPz8gMCkgfSk7XG4gICAgICByZXR1cm4gbGlzdENoaWxkcmVuLm1hcCgoZSwgaSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGAke1NMT1ROQU1FX1BSRUZJWH0tJHtpfWAsXG4gICAgICAgICAgYXJpYUhpZGRlbjpcbiAgICAgICAgICAgIGxpc3RJdGVtQXR0cmlidXRlcz8ubG9jYWxOYW1lVmlzdWFsT25seT8uaW5jbHVkZXMoKGUgYXMgSFRNTEVsZW1lbnQpLmxvY2FsTmFtZSkgPz9cbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGhpZGRlbiBzbG90LCB3aGljaCBpcyBpbnRlbmRlZCBhcyB0aGUgY2hpbGRyZW4gY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgKiBXaGVuIGFuIGVsZW1lbnQgd2l0aG91dCBhIHNsb3QgYXR0cmlidXRlIGlzIHNsb3R0ZWQgdG8gdGhlIGVsZW1lbnQsIGl0IHRyaWdnZXJzXG4gICAgICogdGhlIHNsb3RjaGFuZ2UgZXZlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpdCB0byB0aGUgYXBwcm9wcmlhdGUgbmFtZWQgc2xvdC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVuZGVySGlkZGVuU2xvdCgpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgICByZXR1cm4gaHRtbGA8c3BhbiBoaWRkZW4+PHNsb3Q+PC9zbG90Pjwvc3Bhbj5gO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBOYW1lZFNsb3RMaXN0RWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxDPj4gJiBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJOZWdhdGl2ZU1peGluVHlwZSB7XG4gIHB1YmxpYyBhY2Nlc3NvciBuZWdhdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFbmhhbmNlIHlvdXIgY29tcG9uZW50IHdpdGggYSBuZWdhdGl2ZSBwcm9wZXJ0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYk5lZ2F0aXZlTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOZWdhdGl2ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiTmVnYXRpdmVFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIFNiYk5lZ2F0aXZlTWl4aW5UeXBlIHtcbiAgICAvKiogTmVnYXRpdmUgY29sb3JpbmcgdmFyaWFudCBmbGFnLiAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgbmVnYXRpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBTYmJOZWdhdGl2ZUVsZW1lbnQgYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOZWdhdGl2ZU1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9ldmVudGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJQYW5lbE1peGluVHlwZSB7XG4gIHB1YmxpYyBhY2Nlc3NvciBjb2xvcjogJ3doaXRlJyB8ICdtaWxrJztcbiAgcHVibGljIGFjY2Vzc29yIGJvcmRlcmxlc3M6IGJvb2xlYW47XG4gIHB1YmxpYyBhY2Nlc3NvciBleHBhbnNpb25TdGF0ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTYmJQYW5lbFNpemUgPSAncycgfCAnbSc7XG5cbi8qKlxuICogTWl4aW4gZm9yIGNvbW1vbiBwYW5lbCBiZWhhdmlvcnNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYlBhbmVsTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJQYW5lbE1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiUGFuZWxFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIFNiYlBhbmVsTWl4aW5UeXBlIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICAgIHBhbmVsQ29ubmVjdGVkOiAncGFuZWxDb25uZWN0ZWQnLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvKiogVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHBhbmVsLiAqL1xuICAgIEBwcm9wZXJ0eSgpIHB1YmxpYyBhY2Nlc3NvciBjb2xvcjogJ3doaXRlJyB8ICdtaWxrJyA9ICd3aGl0ZSc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgdW5zZWxlY3RlZCBwYW5lbCBoYXMgYSBib3JkZXIuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBib3JkZXJsZXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQGludGVybmFsIHVzZWQgZm9yIGFjY2Vzc2liaWxpdHkgbGFiZWwgd2hlbiBpbiBleHBhbnNpb24gcGFuZWwgKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoKVxuICAgIHB1YmxpYyBhY2Nlc3NvciBleHBhbnNpb25TdGF0ZTogc3RyaW5nID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBJbnRlcm5hbCBldmVudCB0aGF0IGVtaXRzIHdoZW4gdGhlIGNoZWNrYm94IGlzIGxvYWRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9wYW5lbENvbm5lY3RlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcihcbiAgICAgIHRoaXMsXG4gICAgICBTYmJQYW5lbEVsZW1lbnQuZXZlbnRzLnBhbmVsQ29ubmVjdGVkLFxuICAgICAgeyBidWJibGVzOiB0cnVlIH0sXG4gICAgKTtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuX3BhbmVsQ29ubmVjdGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiUGFuZWxFbGVtZW50IGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiUGFuZWxNaXhpblR5cGU+ICYgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuLy8gRGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtaXhpblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlIHtcbiAgcHJvdGVjdGVkIHN0YXJ0VXBkYXRlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBjb21wbGV0ZVVwZGF0ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoaXMgbWl4aW4gYWxsb3dzIHNjaGVkdWxpbmcgbWFudWFsIHVwZGF0ZXMsIHdoaWNoIGFmZmVjdCB1cGRhdGVDb21wbGV0ZS5cbiAqIEBwYXJhbSBiYXNlIFRoZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcmV0dXJucyBBIGNsYXNzIGV4dGVuZGVkIHdpdGggdGhlIHNsb3QgY2hpbGQgb2JzZXJ2ZXIgZnVuY3Rpb25hbGl0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYlVwZGF0ZVNjaGVkdWxlck1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgYmFzZTogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJVcGRhdGVTY2hlZHVsZXJFbGVtZW50XG4gICAgZXh0ZW5kcyBiYXNlXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZT5cbiAge1xuICAgIHByaXZhdGUgX3VwZGF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIF91cGRhdGVSZXNvbHZlID0gKCk6IHZvaWQgPT4ge307XG5cbiAgICBwcm90ZWN0ZWQgc3RhcnRVcGRhdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl91cGRhdGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+ICh0aGlzLl91cGRhdGVSZXNvbHZlID0gcikpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb21wbGV0ZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZ2V0VXBkYXRlQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlUHJvbWlzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBTYmJVcGRhdGVTY2hlZHVsZXJFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiJdLCJuYW1lcyI6WyJfYSIsInN0YXRlIiwiU2JiUGFuZWxFbGVtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQXFCYSxNQUFBLG1CQUFtQixDQUM5QixlQUNpRDtNQUNsQyxzQkFBa0IsTUFBQTs7c0JBQVM7Ozs7QUFBM0IsV0FBQSxtQkFBMkIsWUFBVTtBQUFBOztBQUtsRCx1REFBQSxrQkFBQSxNQUFBLHdCQUFvQyxLQUFLOzs7O01BQXpDLElBQWdCLFdBQTBCO0FBQUEsZUFBQSxtQkFBQTtBQUFBLE1BQUE7QUFBQSxNQUExQyxJQUFnQixTQUEwQixPQUFBO0FBQUEsMkJBQUEsNEJBQUE7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1oQyx1QkFBb0I7QUFDckIsZUFBQTtBQUFBLE1BQUE7QUFBQSxPQVBUOztBQUhDLDZCQUFBLENBQUEsYUFDQSxTQUFTLEVBQUUsU0FBUyxNQUFNLE1BQU0sUUFBUyxDQUFBLEdBQ3pDLFlBQVksQ0FBQyxHQUF1QixNQUF3QixLQUFLLEVBQUUscUJBQUEsQ0FBc0IsQ0FBQztBQUMzRSxtQkFBQSxJQUFBLE1BQUEsc0JBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxZQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLGNBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFBLFVBQUEsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFlBQUEsV0FBMEI7QUFBQSxXQUFBLFVBQUEsYUFBQSx3QkFBQSwyQkFBQTs7VUFMN0I7QUFBQTtB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
|
|
1500
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvYW5pbWF0aW9uLWNvbXBsZXRlLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Rpc2FibGVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9yZXF1aXJlZC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9mb3JtLWFzc29jaWF0ZWQtY2hlY2tib3gtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLWlucHV0LW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1yYWRpby1idXR0b24tbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvaHlkcmF0aW9uLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL25hbWVkLXNsb3QtbGlzdC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9uZWdhdGl2ZS1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9wYW5lbC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy91cGRhdGUtc2NoZWR1bGVyLW1peGluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJBbmltYXRpb25Db21wbGV0ZU1peGluVHlwZSB7XG4gIHB1YmxpYyBpc0FuaW1hdGluZzogYm9vbGVhbjtcbiAgcHVibGljIGdldCBhbmltYXRpb25Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHwgbnVsbDtcbiAgcHJvdGVjdGVkIHN0YXJ0QW5pbWF0aW9uKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBzdG9wQW5pbWF0aW9uKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogRW5oYW5jZXMgdGhlIGNvbXBvbmVudCB3aXRoIGEgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuZXZlciBhbiBhbmltYXRpb24gZW5kcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkFuaW1hdGlvbkNvbXBsZXRlTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJBbmltYXRpb25Db21wbGV0ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiQW5pbWF0aW9uQ29tcGxldGVFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkFuaW1hdGlvbkNvbXBsZXRlTWl4aW5UeXBlPlxuICB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGN1cnJlbnRseSBhbmltYXRpbmcuXG4gICAgICovXG4gICAgcHVibGljIGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB3aGljaCBjb21wbGV0ZXMgd2hlbmV2ZXIgYW4gYW5pbWF0aW9uIGVuZHMuXG4gICAgICogV2hlbiBhIG5ldyBhbmltYXRpb24gc3RhcnRzLCBhIG5ldyBQcm9taXNlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYW5pbWF0aW9uQ29tcGxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5pbWF0aW9uUHJvbWlzZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfYW5pbWF0aW9uUHJvbWlzZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5pc0FuaW1hdGluZykge1xuICAgICAgICB0aGlzLl9hbmltYXRpb25Qcm9taXNlID0gdGhpcy5fZW5xdWV1ZUFuaW1hdGlvbigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRpbmcgc3RvcEFuaW1hdGlvbigpIGJyZWFrcyBmdW5jdGlvbmFsaXR5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdG9wQW5pbWF0aW9uKCk6IHZvaWQge31cblxuICAgIHByaXZhdGUgYXN5bmMgX2VucXVldWVBbmltYXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHN0b3BBbmltYXRpb24gPSB0aGlzLnN0b3BBbmltYXRpb247XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICBzdG9wQW5pbWF0aW9uKCk7XG4gICAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHIoKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRW5zdXJlIGFueSBwcmV2aW91cyB1cGRhdGUgaGFzIHJlc29sdmVkIGJlZm9yZSB1cGRhdGluZy5cbiAgICAgICAgYXdhaXQgdGhpcy5fYW5pbWF0aW9uUHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gUmVmaXJlIGFueSBwcmV2aW91cyBlcnJvcnMgYXN5bmMgc28gdGhleSBkbyBub3QgZGlzcnVwdCB0aGUgdXBkYXRlXG4gICAgICAgIC8vIGN5Y2xlLiBFcnJvcnMgYXJlIHJlLWZpcmVkIHNvIGRldmVsb3BlcnMgaGF2ZSBhIGNoYW5jZSB0byBvYnNlcnZlXG4gICAgICAgIC8vIHRoZW0sIGFuZCB0aGlzIGNhbiBiZSBkb25lIGJ5IGltcGxlbWVudGluZ1xuICAgICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJBbmltYXRpb25Db21wbGV0ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkFuaW1hdGlvbkNvbXBsZXRlTWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUsIGdldE92ZXJyaWRlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRGlzYWJsZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgZGlzYWJsZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJEaXNhYmxlZE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgQGdldE92ZXJyaWRlKChlOiBTYmJEaXNhYmxlZEVsZW1lbnQsIHY6IGJvb2xlYW4pOiBib29sZWFuID0+IHYgfHwgZS5pc0Rpc2FibGVkRXh0ZXJuYWxseSgpKVxuICAgIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGFzICdvcicgY2hlY2sgdG8gdGhlIGN1cnJlbnQgZGlzYWJsZWQgc3RhdGUuXG4gICAgICogQ2FuIGUuZy4gYmUgdXNlZCB0byByZWFkIGRpc2FibGVkIHN0YXRlIG9mIGEgZ3JvdXAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJEaXNhYmxlZEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlPiAmIFQ7XG59O1xuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIGRpc2FibGVkIGludGVyYWN0aXZlIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRGlzYWJsZWRNaXhpblR5cGU+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZUVsZW1lbnRcbiAgICBleHRlbmRzIHN1cGVyQ2xhc3NcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT5cbiAge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGFyaWEtZGlzYWJsZWQgYnV0IHN0YXkgaW50ZXJhY3RpdmUuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGlzYWJsZWQtaW50ZXJhY3RpdmUnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBTYmJEaXNhYmxlZEludGVyYWN0aXZlRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbk1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGUgJiBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJEaXNhYmxlZFRhYkluZGV4QWN0aW9uXG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW4oU2JiRGlzYWJsZWRNaXhpbihzdXBlckNsYXNzKSlcbiAgICBpbXBsZW1lbnRzIFNiYkRpc2FibGVkTWl4aW5UeXBlLCBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlXG4gIHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZEludGVyYWN0aXZlJykpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYURpc2FibGVkID0gdGhpcy5kaXNhYmxlZEludGVyYWN0aXZlID8gJ3RydWUnIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFxuICAgIFNiYkRpc2FibGVkTWl4aW5UeXBlICYgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZVxuICA+ICZcbiAgICBUO1xufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqL1xuaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IGlzV2Via2l0IH0gZnJvbSAnLi4vZG9tLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgLyoqXG4gICAqIERlZmluZXMgY3VzdG9tIHZhbGlkaWR0eSBzdGF0ZSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgaW50ZXJmYWNlIEN1c3RvbVZhbGlkaXR5U3RhdGUge31cbiAgaW50ZXJmYWNlIFZhbGlkaXR5U3RhdGUgZXh0ZW5kcyBDdXN0b21WYWxpZGl0eVN0YXRlIHt9XG4gIGludGVyZmFjZSBWYWxpZGl0eVN0YXRlRmxhZ3MgZXh0ZW5kcyBQYXJ0aWFsPEN1c3RvbVZhbGlkaXR5U3RhdGU+IHt9XG59XG5cbmNvbnN0IHZhbGlkaXR5S2V5czogUmVxdWlyZWQ8T21pdDxWYWxpZGl0eVN0YXRlRmxhZ3MsIGtleW9mIEN1c3RvbVZhbGlkaXR5U3RhdGU+PiA9IHtcbiAgYmFkSW5wdXQ6IGZhbHNlLFxuICBjdXN0b21FcnJvcjogZmFsc2UsXG4gIHBhdHRlcm5NaXNtYXRjaDogZmFsc2UsXG4gIHJhbmdlT3ZlcmZsb3c6IGZhbHNlLFxuICByYW5nZVVuZGVyZmxvdzogZmFsc2UsXG4gIHN0ZXBNaXNtYXRjaDogZmFsc2UsXG4gIHRvb0xvbmc6IGZhbHNlLFxuICB0b29TaG9ydDogZmFsc2UsXG4gIHR5cGVNaXNtYXRjaDogZmFsc2UsXG4gIHZhbHVlTWlzc2luZzogZmFsc2UsXG59O1xuLy8gV2UgbmVlZCBWYWxpZGl0eVN0YXRlIGluIHRoZSBnbG9iYWwgY29udGV4dCwgYXMgd2UgY2hlY2sgdGhlIHByb3RvdHlwZSBmb3Jcbi8vIGV4dGVuc2lvbnMuIEluIGVudmlyb25tZW50cyB3aGVyZSB0aGF0IGlzIG5vdCB0aGUgY2FzZSAoZS5nLiBOb2RlLmpzKSB3ZVxuLy8gcGF0Y2ggaXQgd2l0aCBhIG1pbmltYWwgc2hpbS5cbmlmICh0eXBlb2YgVmFsaWRpdHlTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgY29uc3QgdmFsaWRpdHlDbGFzcyA9IGNsYXNzIFZhbGlkaXR5U3RhdGUge1xuICAgIHB1YmxpYyBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5lbnRyaWVzKHZhbGlkaXR5S2V5cykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PlxuICAgIE9iamVjdC5hc3NpZ24odmFsaWRpdHlDbGFzcy5wcm90b3R5cGUsIHtcbiAgICAgIGdldCBba2V5XSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICB9KSxcbiAgKTtcbiAgZ2xvYmFsVGhpcy5WYWxpZGl0eVN0YXRlID0gdmFsaWRpdHlDbGFzcyBhcyB1bmtub3duIGFzIHR5cGVvZiBWYWxpZGl0eVN0YXRlO1xufVxuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWID0gc3RyaW5nPiB7XG4gIHB1YmxpYyBnZXQgZm9ybSgpOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsO1xuICBwdWJsaWMgYWNjZXNzb3IgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nO1xuICBwdWJsaWMgYWNjZXNzb3IgdmFsdWU6IFYgfCBudWxsO1xuXG4gIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZTtcbiAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGZvcm1EaXNhYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbjtcbiAgcHVibGljIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgcHVibGljIGZvcm1Bc3NvY2lhdGVkQ2FsbGJhY2s/KGZvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuICBwdWJsaWMgZm9ybURpc2FibGVkQ2FsbGJhY2soZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkO1xuICBwdWJsaWMgYWJzdHJhY3QgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcbiAgcHVibGljIGFic3RyYWN0IGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBzZXRWYWxpZGl0eUZsYWc8VCBleHRlbmRzIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFncz4oXG4gICAgZmxhZzogVCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZmxhZ1ZhbHVlPzogVmFsaWRpdHlTdGF0ZUZsYWdzW1RdLFxuICApOiB2b2lkO1xuICBwcm90ZWN0ZWQgcmVtb3ZlVmFsaWRpdHlGbGFnPFQgZXh0ZW5kcyBrZXlvZiBWYWxpZGl0eVN0YXRlRmxhZ3M+KGZsYWc6IFQpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdmFsaWRhdGUoKTogdm9pZDtcbiAgcHJvdGVjdGVkIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgRm9ybUFzc29jaWF0ZWRNaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIGN1c3RvbSBjb250cm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4sIFYgPSBzdHJpbmc+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PlxuICB7XG4gICAgcHVibGljIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmb3JtIG93bmVyIG9mIHRoaXMgZWxlbWVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvcm0oKTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMuZm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBmb3JtIGVsZW1lbnQuIFdpbGwgYmUgcmVhZCBmcm9tIG5hbWUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uIERldmVsb3BlciBub3RlOiBJbiB0aGlzIGNhc2UgdXBkYXRpbmcgdGhlIGF0dHJpYnV0ZSBtdXN0IGJlIHN5bmNocm9ub3VzLlxuICAgICAqIER1ZSB0byB0aGlzIGl0IGlzIGltcGxlbWVudGVkIGFzIGEgZ2V0dGVyL3NldHRlciBhbmQgdGhlIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpIGhhbmRsZXMgdGhlIGRpZmYgY2hlY2suXG4gICAgICovXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgc2V0IG5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbmFtZScsIGAke25hbWV9YCk7XG5cbiAgICAgIC8vIEZvciBgRm9ybURhdGFgIHZhbHVlcywgd2UgaGF2ZSB0byBtYW51YWxseSB1cGRhdGUgdGhlIGZpZWxkTmFtZSBrZXlcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCduYW1lJykgPz8gJyc7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMubG9jYWxOYW1lO1xuICAgIH1cblxuICAgIC8qKiBWYWx1ZSBvZiB0aGUgZm9ybSBlbGVtZW50LiAqL1xuICAgIEBwcm9wZXJ0eSgpXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogViB8IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFYgfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfdmFsdWU6IFYgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFZhbGlkaXR5U3RhdGUgb2JqZWN0IGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZGl0eSgpOiBWYWxpZGl0eVN0YXRlIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy52YWxpZGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVycm9yIG1lc3NhZ2UsIGlmIGF2YWlsYWJsZSwgd2hpY2ggY29ycmVzcG9uZHNcbiAgICAgKiB0byB0aGUgY3VycmVudCB2YWxpZGF0aW9uIHN0YXRlLlxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQgb25seSBvbmUgbWVzc2FnZSBpcyByZXR1cm5lZCBhdCBhIHRpbWUgKGUuZy4gaWZcbiAgICAgKiBtdWx0aXBsZSB2YWxpZGl0eSBzdGF0ZXMgYXJlIGludmFsaWQsIG9ubHkgdGhlIGNocm9ub2xvZ2ljYWxseSBmaXJzdCBvbmVcbiAgICAgKiBpcyByZXR1cm5lZCB1bnRpbCBpdCBpcyBmaXhlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIG5leHQgbWVzc2FnZSBtaWdodCBiZVxuICAgICAqIHJldHVybmVkLCBpZiBpdCBpcyBzdGlsbCBhcHBsaWNhYmxlKS4gQWxzbyBhIGN1c3RvbSB2YWxpZGl0eSBtZXNzYWdlXG4gICAgICogKHNlZSBiZWxvdykgaGFzIHByZWNlZGVuY2Ugb3ZlciBuYXRpdmUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMudmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCB3aWxsIGJlIHZhbGlkYXRlZFxuICAgICAqIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWxsVmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMud2lsbFZhbGlkYXRlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcblxuICAgIHByaXZhdGUgX3ZhbGlkaXR5U3RhdGVzID0gbmV3IE1hcDxcbiAgICAgIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFncyxcbiAgICAgIHsgZmxhZ1ZhbHVlOiB1bmtub3duOyBtZXNzYWdlOiBzdHJpbmcgfVxuICAgID4oKTtcblxuICAgIC8qKiBXaGVuZXZlciBhIHN1cnJvdW5kaW5nIGZvcm0gb3IgZmllbGRzZXQgaXMgY2hhbmdpbmcgaXRzIGRpc2FibGVkIHN0YXRlLiAqL1xuICAgIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb3JtRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICAvLyBXZSB3YW50IHRvIHByZXZlbnQgdGhlIG5hdGl2ZSBicm93c2VyIHZhbGlkYXRpb24gbWVzc2FnZSBwb3BvdmVyXG4gICAgICAvLyB0byBiZSBzaG93bi4gVGhpcyBhbHNvIHByZXZlbnRzIGEgYnVnIGluIFdlYktpdCwgd2hpY2ggd291bGQgbm90XG4gICAgICAvLyBhbGxvdyBob3N0IGFzIHRoZSB2YWxpZGl0eSBhbmNob3I6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjk4MzJcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdpbnZhbGlkJywgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIG9sZDogc3RyaW5nIHwgbnVsbCxcbiAgICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKG5hbWUgIT09ICduYW1lJyB8fCBvbGQgIT09IHZhbHVlKSB7XG4gICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbGVtZW50IGhhcyBubyB2YWxpZGl0eSBwcm9ibGVtczsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEZpcmVzIGFuIGludmFsaWQgZXZlbnQgYXQgdGhlIGVsZW1lbnQgaW4gdGhlIGxhdHRlciBjYXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVja1ZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLmNoZWNrVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbGVtZW50IGhhcyBubyB2YWxpZGl0eSBwcm9ibGVtczsgb3RoZXJ3aXNlLFxuICAgICAqIHJldHVybnMgZmFsc2UsIGZpcmVzIGFuIGludmFsaWQgZXZlbnQgYXQgdGhlIGVsZW1lbnQsXG4gICAgICogYW5kIChpZiB0aGUgZXZlbnQgaXNuJ3QgY2FuY2VsZWQpIHJlcG9ydHMgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VzdG9tIHZhbGlkaXR5IG1lc3NhZ2UgZm9yIHRoaXMgZWxlbWVudC4gVXNlIHRoZSBlbXB0eSBzdHJpbmdcbiAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjdXN0b20gdmFsaWRpdHkgZXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ2N1c3RvbUVycm9yJywgbWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVZhbGlkaXR5RmxhZygnY3VzdG9tRXJyb3InKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBmb3JtIGVsZW1lbnQgY2hhbmdlcy5cbiAgICAgKiBFbGVtZW50SW50ZXJuYWxzLmZvcm0gcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBmcm9tIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybUFzc29jaWF0ZWRDYWxsYmFjaz8oZm9ybTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbmV2ZXIgYSBzdXJyb3VuZGluZyBmb3JtIC8gZmllbGRzZXQgY2hhbmdlcyBkaXNhYmxlZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWRcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmb3JtRGlzYWJsZWRDYWxsYmFjayhkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgLy8gVGhpcyBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgaWYgdGhlIGRpc2FibGVkIHByb3BlcnR5IGNoYW5nZXMgb3IgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBvZiBhIGZpZWxkc2V0IG9yIGZvcm0gY2hhbmdlcy5cbiAgICAgIC8vIFdlIG5lZWQgdG8gcG9zdHBvbmUgdGhlIGFzc2lnbm1lbnQsIG90aGVyd2lzZSBpdCBpbnRlcmZlcmVzIHdpdGggZGlzYWJsZWQgc3RhdHVzIHNldHRpbmdcbiAgICAgIC8vIGFuZCBsZWFkcyB0byBhIHdyb25nIHN0YXRlIChlLmcuIGVtYmVkZGVkIHNiYi12aXN1YWwtY2hlY2tib3gpLlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybURpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZvcm0gaXMgYmVpbmcgcmVzZXQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyBcInJlc3RvcmVcIiwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyBcImF1dG9jb21wbGV0ZVwiLlxuICAgICAqICBJbiB0aGUgY2FzZSBvZiBcInJlc3RvcmVcIiwgc3RhdGUgaXMgYSBzdHJpbmcsIEZpbGUsIG9yIEZvcm1EYXRhIG9iamVjdFxuICAgICAqICBwcmV2aW91c2x5IHNldCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldEZvcm1WYWx1ZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICAgICk6IHZvaWQ7XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVxdWVzdFVwZGF0ZShcbiAgICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICk6IHZvaWQge1xuICAgICAgc3VwZXIucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICBpZiAodGhpcy5oYXNVcGRhdGVkICYmIHRoaXMuc2hvdWxkVmFsaWRhdGUobmFtZSkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiBmb3JtIHZhbHVlIGlzIGNoYW5nZWQuXG4gICAgICogQWRhcHRzIGFuZCBzZXRzIHRoZSBmb3JtVmFsdWUgaW4gdGhlIHN1cHBvcnRlZCBmb3JtYXQgKHN0cmluZyB8IEZvcm1EYXRhIHwgRmlsZSB8IG51bGwpXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvc2V0Rm9ybVZhbHVlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogTWFya3MgdGhpcyBlbGVtZW50IGFzIHN1ZmZlcmluZyBmcm9tIHRoZSBjb25zdHJhaW50IGluZGljYXRlZCBieSB0aGVcbiAgICAgKiBmbGFnIGFyZ3VtZW50IGFuZCBhc3NvY2lhdGVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGl0LlxuICAgICAqIE5vdGUgdGhhdCBvbmx5IG9uZSBtZXNzYWdlIGlzIGRpc3BsYXllZCBhdCBhIHRpbWUgYW5kIGN1c3RvbSBtZXNzYWdlcyBieVxuICAgICAqIGNvbnN1bWVycyBhcmUgYWx3YXlzIGRpc3BsYXllZCBiZWZvcmUgaW50ZXJuYWwgbWVzc2FnZXMgYW5kIGludGVybmFsXG4gICAgICogbWVzc2FnZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGFkZGVkLlxuICAgICAqIFRvIHNldC9kZWZpbmUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGZsYWdzLCB5b3UgbmVlZCB0byBleHRlbmQgdGhlXG4gICAgICogVmFsaWRpdHlTdGF0ZSBwcm90b3R5cGUgKGFuZCB0aGUgQ3VzdG9tVmFsaWRpdHlTdGF0ZSBpbnRlcmZhY2UpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgLy8gVGhlIHR5cGUgb2YgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJvb2xlYW4uXG4gICAgICogICBPYmplY3QuYXNzaWduKFZhbGlkaXR5U3RhdGUucHJvdG90eXBlLCB7XG4gICAgICogICAgIGdldCBteUVycm9yKCk6IGJvb2xlYW4ge1xuICAgICAqICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgIH0pO1xuICAgICAqXG4gICAgICogICBkZWNsYXJlIGdsb2JhbCB7XG4gICAgICogICAgIGludGVyZmFjZSBDdXN0b21WYWxpZGl0eVN0YXRlIHtcbiAgICAgKiAgICAgICBteUVycm9yOiBib29sZWFuO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNldFZhbGlkaXR5RmxhZzxUIGV4dGVuZHMga2V5b2YgVmFsaWRpdHlTdGF0ZUZsYWdzPihcbiAgICAgIGZsYWc6IFQsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBmbGFnVmFsdWU/OiBWYWxpZGl0eVN0YXRlRmxhZ3NbVF0sXG4gICAgKTogdm9pZCB7XG4gICAgICBmbGFnVmFsdWUgPz89IHRydWU7XG4gICAgICBjb25zdCB2YWxpZGl0eVN0YXRlID0gdGhpcy5fdmFsaWRpdHlTdGF0ZXMuZ2V0KGZsYWcpO1xuICAgICAgaWYgKFxuICAgICAgICAhdmFsaWRpdHlTdGF0ZSB8fFxuICAgICAgICB2YWxpZGl0eVN0YXRlLm1lc3NhZ2UgIT09IG1lc3NhZ2UgfHxcbiAgICAgICAgdmFsaWRpdHlTdGF0ZS5mbGFnVmFsdWUgIT09IGZsYWdWYWx1ZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkaXR5U3RhdGVzLnNldChmbGFnLCB7IGZsYWdWYWx1ZSwgbWVzc2FnZSB9KTtcbiAgICAgICAgdGhpcy5fc2V0SW50ZXJuYWxWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZW1vdmVzIHRoZSB2YWxpZGl0eSBzdGF0ZSBmbGFnIGVudHJ5IGFuZCB1cGRhdGVzIHZhbGlkaXR5IHN0YXRlLiAqL1xuICAgIHByb3RlY3RlZCByZW1vdmVWYWxpZGl0eUZsYWc8VCBleHRlbmRzIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFncz4oZmxhZzogVCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuX3ZhbGlkaXR5U3RhdGVzLmhhcyhmbGFnKSkge1xuICAgICAgICB0aGlzLl92YWxpZGl0eVN0YXRlcy5kZWxldGUoZmxhZyk7XG4gICAgICAgIHRoaXMuX3NldEludGVybmFsVmFsaWRpdHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBjdXJyZW50IGVsZW1lbnQgbmVlZHMgdG8gYmUgdmFsaWRhdGVkLiAqL1xuICAgIHByb3RlY3RlZCB2YWxpZGF0ZSgpOiB2b2lkIHt9XG5cbiAgICAvKiogV2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBydW4gb24gYSBwcm9wZXJ0eSBjaGFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gKi9cbiAgICBwcm90ZWN0ZWQgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhbmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRJbnRlcm5hbFZhbGlkaXR5KCk6IHZvaWQge1xuICAgICAgbGV0IG91dHB1dE1lc3NhZ2UgPSB0aGlzLl92YWxpZGl0eVN0YXRlcy5nZXQoJ2N1c3RvbUVycm9yJyk/Lm1lc3NhZ2U7XG4gICAgICBjb25zdCBmbGFnczogVmFsaWRpdHlTdGF0ZUZsYWdzID0ge307XG4gICAgICB0aGlzLl92YWxpZGl0eVN0YXRlcy5mb3JFYWNoKCh7IGZsYWdWYWx1ZSwgbWVzc2FnZSB9LCBmbGFnKSA9PiB7XG4gICAgICAgIGZsYWdzW2ZsYWddID0gZmxhZ1ZhbHVlIGFzIGFueTtcbiAgICAgICAgb3V0cHV0TWVzc2FnZSB8fD0gbWVzc2FnZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjdXN0b21GbGFncyA9IE9iamVjdC5rZXlzKFZhbGlkaXR5U3RhdGUucHJvdG90eXBlKS5maWx0ZXIoXG4gICAgICAgIChmKSA9PiAhKGYgaW4gdmFsaWRpdHlLZXlzKSAmJiBmICE9PSAndmFsaWQnLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgZmxhZyBvZiBjdXN0b21GbGFncykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZsYWcgaW4gZmxhZ3MgPyBmbGFnc1tmbGFnIGFzIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFnc10gOiBmYWxzZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuaW50ZXJuYWxzLnZhbGlkaXR5LCBmbGFnLCB7IHZhbHVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIC8vIElmIGFueSBjdXN0b20gZXJyb3JzIGFyZSBwcm92aWRlZCwgd2UgbmVlZCB0byBzZXQgY3VzdG9tRXJyb3IgdG8gdHJ1ZSxcbiAgICAgICAgICAvLyBhcyB0aGlzIGlzIHRoZSBvbmx5IGN1c3RvbSBlcnJvciBwcm9wZXJ0eSBicm93c2VycyBhY2NlcHQuXG4gICAgICAgICAgZmxhZ3MuY3VzdG9tRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW50ZXJuYWxzLnNldFZhbGlkaXR5KGZsYWdzLCBvdXRwdXRNZXNzYWdlKTtcblxuICAgICAgLy8gV2ViS2l0IHNlZW1zIHRvIGFsd2F5cyBzZXQgY3VzdG9tRXJyb3IgdG8gdHJ1ZSwgaWYgYW55IGVycm9yIGlzIGFjdGl2ZS5cbiAgICAgIC8vIER1ZSB0byB0aGlzIHdlIHBhdGNoIHRoZSBjdXN0b21FcnJvciB2YWx1ZSBtYW51YWxseS5cbiAgICAgIGlmIChpc1dlYmtpdCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5pbnRlcm5hbHMudmFsaWRpdHksICdjdXN0b21FcnJvcicsIHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fdmFsaWRpdHlTdGF0ZXMuaGFzKCdjdXN0b21FcnJvcicpIHx8ICEhZmxhZ3MuY3VzdG9tRXJyb3IsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkZvcm1Bc3NvY2lhdGVkRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+ICZcbiAgICBUO1xufTtcblxuLyoqXG4gKiBBIHZhbHVlIHRvIGJlIHJlc3RvcmVkIGZvciBhIGNvbXBvbmVudCdzIGZvcm0gdmFsdWUuIElmIGEgY29tcG9uZW50J3MgZm9ybVxuICogc3RhdGUgaXMgYSBgRm9ybURhdGFgIG9iamVjdCwgaXRzIGVudHJ5IGxpc3Qgb2YgbmFtZSBhbmQgdmFsdWVzIHdpbGwgYmVcbiAqIHByb3ZpZGVkLlxuICovXG5leHBvcnQgdHlwZSBGb3JtUmVzdG9yZVN0YXRlID0gRmlsZSB8IHN0cmluZyB8IFtzdHJpbmcsIEZvcm1EYXRhRW50cnlWYWx1ZV1bXTtcblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgZm9ybSBjb21wb25lbnQgaXMgYmVpbmcgcmVzdG9yZWQgZm9yLCBlaXRoZXIgYCdyZXN0b3JlJ2AgZm9yXG4gKiBicm93c2VyIHJlc3RvcmF0aW9uIG9yIGAnYXV0b2NvbXBsZXRlJ2AgZm9yIHJlc3RvcmluZyB1c2VyIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVJlc3RvcmVSZWFzb24gPSAncmVzdG9yZScgfCAnYXV0b2NvbXBsZXRlJztcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiUmVxdWlyZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIHJlcXVpcmVkIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiUmVxdWlyZWRNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PixcbiAgVixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJSZXF1aXJlZEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT4ge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIC8vIFRvIHByb3ZpZGUgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIG5hdGl2ZSByZXF1aXJlZCBzdGF0ZSxcbiAgICAgIC8vIGFueSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLlxuICAgICAgdGhpcy5fcmVxdWlyZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCB8fCB0aGlzLmlzUmVxdWlyZWRFeHRlcm5hbGx5KCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgZXhwbGljaXRseSBzZXQgYXJpYS1yZXF1aXJlZCB2YWx1ZS5cbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYVJlcXVpcmVkID0gYCR7dGhpcy5yZXF1aXJlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBhcyAnb3InIGNoZWNrIHRvIHRoZSBjdXJyZW50IHJlcXVpcmVkIHN0YXRlLlxuICAgICAqIENhbiBlLmcuIGJlIHVzZWQgdG8gcmVhZCByZXF1aXJlZCBzdGF0ZSBvZiBhIGdyb3VwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiUmVxdWlyZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJSZXF1aXJlZE1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB7IGRlZmF1bHRDb252ZXJ0ZXIsIHR5cGUgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHByZXZlbnRTY3JvbGxPblNwYWNlYmFyUHJlc3MgfSBmcm9tICcuLi9ldmVudGluZy5qcyc7XG5pbXBvcnQgeyBpMThuQ2hlY2tib3hSZXF1aXJlZCB9IGZyb20gJy4uL2kxOG4uanMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJEaXNhYmxlZE1peGluLCB0eXBlIFNiYkRpc2FibGVkTWl4aW5UeXBlIH0gZnJvbSAnLi9kaXNhYmxlZC1taXhpbi5qcyc7XG5pbXBvcnQge1xuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIHR5cGUgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGUsXG59IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcbmltcG9ydCB7IFNiYlJlcXVpcmVkTWl4aW4sIHR5cGUgU2JiUmVxdWlyZWRNaXhpblR5cGUgfSBmcm9tICcuL3JlcXVpcmVkLW1peGluLmpzJztcblxudHlwZSBDaGVja2VkU2V0dGVyVmFsdWUgPSB7IHZhbHVlOiBib29sZWFuOyBhdHRyaWJ1dGU6IGJvb2xlYW4gfTtcblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZVxuICBleHRlbmRzIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlXG4gIGltcGxlbWVudHMgUGFydGlhbDxTYmJEaXNhYmxlZE1peGluVHlwZT4sIFBhcnRpYWw8U2JiUmVxdWlyZWRNaXhpblR5cGU+XG57XG4gIHB1YmxpYyBnZXQgY2hlY2tlZCgpOiBib29sZWFuO1xuICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pO1xuXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pO1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbik7XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24pOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNSZXF1aXJlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHdpdGhVc2VySW50ZXJhY3Rpb24/KCk6IHZvaWQ7XG4gIHByb3RlY3RlZCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluIGVuYWJsZXMgbmF0aXZlIGZvcm0gc3VwcG9ydCBmb3IgY2hlY2tib3ggY29udHJvbHMuXG4gKlxuICogSW5oZXJpdGVkIGNsYXNzZXMgTVVTVCBpbXBsZW1lbnQgdGhlIGFyaWFDaGVja2VkIHN0YXRlIChFbGVtZW50SW50ZXJuYWxzKSB0aGVtc2VsdmVzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPiAmIFQgPT4ge1xuICBAaG9zdEF0dHJpYnV0ZXMoe1xuICAgIHRhYmluZGV4OiAnMCcsXG4gIH0pXG4gIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hFbGVtZW50XG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZE1peGluKFNiYlJlcXVpcmVkTWl4aW4oU2JiRm9ybUFzc29jaWF0ZWRNaXhpbihzdXBlckNsYXNzKSkpXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGU+XG4gIHtcbiAgICBwcml2YXRlIF9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYW5ndWFnZUNvbnRyb2xsZXIgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuICovXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBjb252ZXJ0ZXI6IHtcbiAgICAgICAgLi4uZGVmYXVsdENvbnZlcnRlcixcbiAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXR0ZXIgc28gdGhhdCB3ZSBrbm93IGl0IHdhcyBjYWxsZWQgYnkgYXR0cmlidXRlIGNoYW5nZS5cbiAgICAgICAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bik6IENoZWNrZWRTZXR0ZXJWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmYXVsdENvbnZlcnRlci5mcm9tQXR0cmlidXRlPy4odmFsdWUsIHR5cGUpO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQsIGF0dHJpYnV0ZTogdHJ1ZSB9IGFzIENoZWNrZWRTZXR0ZXJWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNldHRlciA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAodmFsdWUgYXMgdW5rbm93biBhcyBDaGVja2VkU2V0dGVyVmFsdWUpLmF0dHJpYnV0ZSA6IGZhbHNlO1xuICAgICAgaWYgKGF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIENoZWNrZWRTZXR0ZXJWYWx1ZSkudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzIHNvb24gYXMgbXV0YXRpb24gd2FzIGRvbmUgbm90IGJ5IHNldHRpbmcgYXR0cmlidXRlLFxuICAgICAgLy8gd2UgbmVlZCB0byBibG9jayBzeW5jaW5nIGF0dHJpYnV0ZS5cbiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQgJiYgIWF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICAgfVxuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgICAqIEBkZWZhdWx0ICdjaGVja2JveCdcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnY2hlY2tib3gnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmludGVybmFscy5yb2xlID0gJ2NoZWNrYm94JztcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NsaWNrJywgdGhpcy5faGFuZGxlVXNlckludGVyYWN0aW9uKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdrZXlkb3duJywgcHJldmVudFNjcm9sbE9uU3BhY2ViYXJQcmVzcyk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5dXAnLCB0aGlzLl9oYW5kbGVLZXlib2FyZEludGVyYWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICAvLyBBdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhZnRlciBwcm9ncmFtbWF0aWMgb3IgbWFudWFsIHN0YXRlIGNoYW5nZS5cbiAgICAgIGlmIChuYW1lICE9PSAnY2hlY2tlZCcgfHwgIXRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCkge1xuICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICAgIHRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyBcInJlc3RvcmVcIiwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyBcImF1dG9jb21wbGV0ZVwiLlxuICAgICAqICBJbiB0aGUgY2FzZSBvZiBcInJlc3RvcmVcIiwgc3RhdGUgaXMgYSBzdHJpbmcsIEZpbGUsIG9yIEZvcm1EYXRhIG9iamVjdFxuICAgICAqICBwcmV2aW91c2x5IHNldCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldEZvcm1WYWx1ZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgbG9naWMgd2hpY2ggaXMgYmVpbmcgZXhlY3V0ZWQgd2hlbiB1c2VyXG4gICAgICogaW50ZXJhY3Rpb24gaGFwcGVucyBhbmQgc3RhdGUgaXMgbm90IGRpc2FibGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUsIGAke3RoaXMuY2hlY2tlZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBzdXBlci5zaG91bGRWYWxpZGF0ZShuYW1lKSB8fCBuYW1lID09PSAnY2hlY2tlZCcgfHwgbmFtZSA9PT0gJ3JlcXVpcmVkJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgIXRoaXMuY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnNldFZhbGlkaXR5RmxhZyhcbiAgICAgICAgICAndmFsdWVNaXNzaW5nJyxcbiAgICAgICAgICBpMThuQ2hlY2tib3hSZXF1aXJlZFt0aGlzLl9sYW5ndWFnZUNvbnRyb2xsZXIuY3VycmVudF0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVZhbGlkaXR5RmxhZygndmFsdWVNaXNzaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0cmlnZ2VyZWQgb24ga2V5Ym9hcmQgdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNoZWNrYm94LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUtleWJvYXJkSW50ZXJhY3Rpb24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICB0aGlzLl9oYW5kbGVVc2VySW50ZXJhY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIE1ldGhvZCB0cmlnZ2VyZWQgb24gdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNoZWNrYm94LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZVVzZXJJbnRlcmFjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMud2l0aFVzZXJJbnRlcmFjdGlvbj8uKCk7XG4gICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgICAgdGhpcy5fYXR0cmlidXRlTXV0YXRpb25CbG9ja2VkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgY29tcG9zZWQ6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hFbGVtZW50IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuIiwiaW1wb3J0IHsgaHRtbCwgaXNTZXJ2ZXIsIHR5cGUgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBldmVudE9wdGlvbnMsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJy4uL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGlzRmlyZWZveCwgaXNXZWJraXQgfSBmcm9tICcuLi9kb20uanMnO1xuaW1wb3J0IHsgaTE4bklucHV0UmVxdWlyZWQgfSBmcm9tICcuLi9pMThuLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICB0eXBlIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlLFxufSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5pbXBvcnQgeyBTYmJSZXF1aXJlZE1peGluLCB0eXBlIFNiYlJlcXVpcmVkTWl4aW5UeXBlIH0gZnJvbSAnLi9yZXF1aXJlZC1taXhpbi5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpblR5cGVcbiAgZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZVxuICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiUmVxdWlyZWRNaXhpblR5cGU+XG57XG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pO1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHNldCByZWFkT25seSh2YWx1ZTogYm9vbGVhbik7XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKTtcbiAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZyk7XG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nO1xuXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCwgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIHdpdGhVc2VySW50ZXJhY3Rpb24/KCk6IHZvaWQ7XG4gIHByb3RlY3RlZCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbiAgcHJvdGVjdGVkIGxhbmd1YWdlOiBTYmJMYW5ndWFnZUNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogVGhlIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIHRleHQgaW5wdXQgY29udHJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRFbGVtZW50XG4gICAgZXh0ZW5kcyBTYmJSZXF1aXJlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oc3VwZXJDbGFzcykpXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpblR5cGU+XG4gIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmF0aXZlIHRleHQgaW5wdXQgY2hhbmdlcyB0aGUgdmFsdWUgcHJvcGVydHkgd2hlbiB0aGUgdmFsdWUgYXR0cmlidXRlIGlzXG4gICAgICogY2hhbmdlZCB1bmRlciB0aGUgY29uZGl0aW9uIHRoYXQgbm8gaW5wdXQgZXZlbnQgaGFzIG9jY3VyZWQgc2luY2UgY3JlYXRpb25cbiAgICAgKiBvciB0aGUgbGFzdCBmb3JtIHJlc2V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBBbiBlbGVtZW50IHdpdGggY29udGVudGVkaXRhYmxlIHdpbGwgbm90IGVtaXQgYSBjaGFuZ2UgZXZlbnQuIFRvIGFjaGlldmUgcGFyaXR5XG4gICAgICogd2l0aCBhIG5hdGl2ZSB0ZXh0IGlucHV0LCB3ZSBuZWVkIHRvIHRyYWNrIHdoZXRoZXIgYSBjaGFuZ2UgZXZlbnQgc2hvdWxkIGJlXG4gICAgICogZW1pdHRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaG91bGRFbWl0Q2hhbmdlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQSBuYXRpdmUgdGV4dCBpbnB1dCBhdHRlbXB0cyB0byBzdWJtaXQgdGhlIGZvcm0gd2hlbiBwcmVzc2luZyBFbnRlci5cbiAgICAgKiBUaGlzIGNhbiBiZSBwcmV2ZW50ZWQgYnkgY2FsbGluZyBwcmV2ZW50RGVmYXVsdCBvbiB0aGUga2V5ZG93biBldmVudC5cbiAgICAgKiBXZSB0cmFjayB3aGV0aGVyIHRvIHJlcXVlc3Qgc3VibWl0LCB3aGljaCBzaG91bGQgb2NjdXIgYmVmb3JlIHRoZSBrZXl1cFxuICAgICAqIGV2ZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nob3VsZFRyaWdnZXJTdWJtaXQgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBsYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIHR5cGUgb2YgZWxlbWVudC5cbiAgICAgKiBAZGVmYXVsdCAndGV4dCdcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAndGV4dCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlci52YWx1ZSA9IHRoaXMuX2NsZWFuVGV4dCh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuaW5uZXJIVE1MID0gc3VwZXIudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzdXBlci52YWx1ZSA/PyAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgcmVhZG9ubHkuXG4gICAgICogQGF0dHIgcmVhZG9ubHlcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgncmVhZG9ubHknLCAhIXZhbHVlKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFSZWFkT25seSA9IHZhbHVlID8gJ3RydWUnIDogbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZUNvbnRlbnRlZGl0YWJsZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdyZWFkb25seScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICAgKiBAYXR0ciBkaXNhYmxlZFxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkaXNhYmxlZCcsICEhdmFsdWUpO1xuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYURpc2FibGVkID0gdmFsdWUgPyAndHJ1ZScgOiBudWxsO1xuICAgICAgdGhpcy5fdXBkYXRlQ29udGVudGVkaXRhYmxlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYVBsYWNlaG9sZGVyID0gdmFsdWUgPyB2YWx1ZSA6IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInKSA/PyAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgdGhpcy5pbnRlcm5hbHMucm9sZSA9ICd0ZXh0Ym94JztcbiAgICAgIC8vIFdlIHByaW1hcmlseSB1c2UgY2FwdHVyZSBldmVudCBsaXN0ZW5lcnMsIGFzIHdlIHdhbnRcbiAgICAgIC8vIG91ciBsaXN0ZW5lcnMgdG8gb2NjdXIgYmVmb3JlIGNvbnN1bWVyIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgc3VwZXIudmFsdWUgPSB0aGlzLl9jbGVhblRleHQodGhpcy50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgICAgICAgdGhpcy5faW50ZXJhY3RlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc2hvdWxkRW1pdENoYW5nZSA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjaGFuZ2UnLCAoKSA9PiAodGhpcy5fc2hvdWxkRW1pdENoYW5nZSA9IGZhbHNlKSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oXG4gICAgICAgICdrZXlkb3duJyxcbiAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gV2UgcHJldmVudCByZWN1cnNpdmUgZXZlbnRzIGJ5IGNoZWNraW5nIHRoZSBvcmlnaW5hbCBldmVudCBmb3IgaXNUcnVzdGVkXG4gICAgICAgICAgLy8gd2hpY2ggaXMgZmFsc2UgZm9yIG1hbnVhbGx5IGRpc3BhdGNoZWQgZXZlbnRzICh3aGljaCB3ZSBkaXNwYXRjaCBiZWxvdykuXG4gICAgICAgICAgaWYgKChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnXFxuJykgJiYgZXZlbnQuaXNUcnVzdGVkKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9zaG91bGRUcmlnZ2VyU3VibWl0ID0gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnQpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgaXNXZWJraXQgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJiZcbiAgICAgICAgICAgIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmXG4gICAgICAgICAgICBldmVudC5pc1RydXN0ZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEluIFdlYmtpdCBwcmVzc2luZyBCYWNrc3BhY2Ugb3IgRGVsZXRlIGNvbXBsZXRlbHkgcmVtb3ZlcyBhbGwgdGhlIGNvbnRlbnRcbiAgICAgICAgICAgIC8vIGlmIGNvbnRlbnRlZGl0YWJsZSBpcyBzZXQgb24gYSB3ZWIgY29tcG9uZW50IGhvc3QuXG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHJlcGxpY2F0ZSB0aGUgbm9ybWFsIGRlbGV0ZSBiZWhhdmlvci5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleWRvd24nLCBldmVudCkpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRSYW5nZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWRSYW5nZSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFJhbmdlLnN0YXJ0T2Zmc2V0ICE9PSBzZWxlY3RlZFJhbmdlLmVuZE9mZnNldCkge1xuICAgICAgICAgICAgICAvLyBJZiBhIHRleHQgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gZGVsZXRlIHRoaXMgcmFuZ2VcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaElucHV0RXZlbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJiBzZWxlY3RlZFJhbmdlLnN0YXJ0T2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgICAvLyBXaGVuIHByZXNzaW5nIEJhY2tzcGFjZSwgd2Ugc2VsZWN0IHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgZnJvbVxuICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gYW5kIGRlbGV0ZSBpdC5cbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZS5zZXRTdGFydChzZWxlY3RlZFJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3RlZFJhbmdlLnN0YXJ0T2Zmc2V0IC0gMSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hJbnB1dEV2ZW50KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScgJiYgc2VsZWN0ZWRSYW5nZS5lbmRPZmZzZXQgPCB0aGlzLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAvLyBXaGVuIHByZXNzaW5nIERlbGV0ZSwgd2Ugc2VsZWN0IHRoZSBuZXh0IGNoYXJhY3RlciBmcm9tXG4gICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBhbmQgZGVsZXRlIGl0LlxuICAgICAgICAgICAgICBzZWxlY3RlZFJhbmdlLnNldEVuZChzZWxlY3RlZFJhbmdlLmVuZENvbnRhaW5lciwgc2VsZWN0ZWRSYW5nZS5lbmRPZmZzZXQgKyAxKTtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaElucHV0RXZlbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKFxuICAgICAgICAna2V5dXAnLFxuICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VJZk5lY2Vzc2FyeSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFRyaWdnZXJTdWJtaXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fc2hvdWxkVHJpZ2dlclN1Ym1pdCA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmZvcm0/LnJlcXVlc3RTdWJtaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIC8vIGNvbnRlbnRlZGl0YWJsZSBhbGxvd3MgcGFzdGluZyByaWNoIGNvbnRlbnQgaW50byBpdHMgaG9zdC5cbiAgICAgIC8vIFdlIHByZXZlbnQgdGhpcyBieSBsaXN0ZW5pbmcgdG8gdGhlIHBhc3RlIGV2ZW50IGFuZFxuICAgICAgLy8gZXh0cmFjdGluZyB0aGUgcGxhaW4gdGV4dCBmcm9tIHRoZSBwYXN0ZWQgY29udGVudFxuICAgICAgLy8gYW5kIGluc2VydGluZyBpdCBpbnRvIHRoZSBzZWxlY3RlZCByYW5nZSAoY3Vyc29yIHBvc2l0aW9uXG4gICAgICAvLyBvciBzZWxlY3Rpb24pLlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ3Bhc3RlJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5fY2xlYW5UZXh0KGUuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dC9wbGFpbicpID8/ICcnKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSYW5nZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgaWYgKCFzZWxlY3RlZFJhbmdlIHx8ICF0ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0ZWRSYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICBzZWxlY3RlZFJhbmdlLmluc2VydE5vZGUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuICAgICAgICBzZWxlY3RlZFJhbmdlLnNldFN0YXJ0KHNlbGVjdGVkUmFuZ2UuZW5kQ29udGFpbmVyLCBzZWxlY3RlZFJhbmdlLmVuZE9mZnNldCk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoSW5wdXRFdmVudCgpO1xuICAgICAgfSk7XG4gICAgICAvLyBXaGVuIGZvY3VzaW5nIGEgdGV4dCBpbnB1dCB2aWEga2V5Ym9hcmQsIHRoZSB0ZXh0IGNvbnRlbnQgc2hvdWxkIGJlIHNlbGVjdGVkLlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICBpZiAoc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLm1vc3RSZWNlbnRNb2RhbGl0eSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uc2VsZWN0QWxsQ2hpbGRyZW4odGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gT24gYmx1ciB0aGUgbmF0aXZlIHRleHQgaW5wdXQgc2Nyb2xscyB0aGUgdGV4dCB0byB0aGUgc3RhcnQgb2YgdGhlIHRleHQuXG4gICAgICAvLyBXZSBtaW1pY2sgdGhhdCBieSByZXNldHRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgIC8vIFdlIGFsc28gdW5zZXQgYW55IHNlbGVjdGlvbiB0byBhbGlnbiB3aXRoIHRoZSBuYXRpdmUgdGV4dCBpbnB1dC5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKFxuICAgICAgICAnYmx1cicsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VJZk5lY2Vzc2FyeSgpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIH0sXG4gICAgICAgIHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYU11bHRpTGluZSA9ICdmYWxzZSc7XG4gICAgICB0aGlzLl91cGRhdGVDb250ZW50ZWRpdGFibGUoKTtcblxuICAgICAgLy8gV2Ugd2FudCB0byByZXBsYWNlIGFueSBjb250ZW50IGJ5IGp1c3QgdGhlIHRleHQgY29udGVudC5cbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgICAgc3VwZXIuZm9jdXMob3B0aW9ucyk7XG4gICAgICAvLyBCeSBkZWZhdWx0LCB3aGVuIGNhbGxpbmcgZm9jdXMgb24gYW4gaW5wdXQgZWxlbWVudCwgdGhlIGN1cnNvciBpcyBwbGFjZWRcbiAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IHRleHQuIEhvd2V2ZXIsIHdpdGggY29udGVudGVkaXRhYmxlLCB0aGUgY3Vyc29yXG4gICAgICAvLyBpcyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZywgc28gd2UgbW92ZSBpdCB0byB0aGUgZW5kLCBpZiB0aGF0IGlzIHRoZSBjYXNlLlxuICAgICAgaWYgKCFpc1NlcnZlciAmJiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkT25seSAmJiB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhbmdlID0gc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwID8gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkgOiBudWxsO1xuICAgICAgICBpZiAocmFuZ2UgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHRoaXMuZmlyc3RDaGlsZCEsIHRoaXMudGV4dENvbnRlbnQhLmxlbmd0aCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIG9sZDogc3RyaW5nIHwgbnVsbCxcbiAgICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKG5hbWUgIT09ICd2YWx1ZScgfHwgIXRoaXMuX2ludGVyYWN0ZWQpIHtcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuZXZlciB0aGUgZm9ybSBpcyBiZWluZyByZXNldC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2ludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA/PyAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMgXCJyZXN0b3JlXCIsIG9yIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGZ1bGZpbGwgYXV0b2ZpbGwgb24gYmVoYWxmIG9mXG4gICAgICogIHVzZXIgaW4gd2hpY2ggY2FzZSByZWFzb24gaXMgXCJhdXRvY29tcGxldGVcIi5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2YgXCJyZXN0b3JlXCIsIHN0YXRlIGlzIGEgc3RyaW5nLCBGaWxlLCBvciBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiAgcHJldmlvdXNseSBzZXQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRGb3JtVmFsdWUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnZhbHVlID0gc3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlLCB0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBzdXBlci5zaG91bGRWYWxpZGF0ZShuYW1lKSB8fCBuYW1lID09PSAndmFsdWUnIHx8IG5hbWUgPT09ICdyZXF1aXJlZCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgICAgc3VwZXIudmFsaWRhdGUoKTtcbiAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnLCBpMThuSW5wdXRSZXF1aXJlZFt0aGlzLmxhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhblRleHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAvLyBUaGUgbmF0aXZlIHRleHQgaW5wdXQgcmVtb3ZlcyBhbGwgbmV3bGluZSBjaGFyYWN0ZXJzIGlmIHBhc3NlZCB0byB0aGUgdmFsdWUgcHJvcGVydHlcbiAgICAgIHJldHVybiBgJHt2YWx1ZX1gLnJlcGxhY2UoL1tcXG5cXHJdKy9nLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzcGF0Y2hJbnB1dEV2ZW50KCk6IHZvaWQge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICAgIH1cblxuICAgIEBldmVudE9wdGlvbnMoeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBfY2xlYW5DaGlsZHJlbigpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkRWxlbWVudENvdW50KSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUNvbnRlbnRlZGl0YWJsZSgpOiB2b2lkIHtcbiAgICAgIGlmICghaXNTZXJ2ZXIgJiYgdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IHlldCBzdXBwb3J0IHBsYWludGV4dC1vbmx5LiBPbmNlIHRoaXMgaXMgYXZhaWxhYmxlXG4gICAgICAgIC8vIGZvciBvdXIgc3VwcG9ydGVkIGJyb3dzZXIgcmFuZ2UsIHdlIGNhbiBzd2l0Y2ggdG8gaXQgZnVsbHkuXG4gICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICB0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZE9ubHkgPyAnZmFsc2UnIDogaXNGaXJlZm94ID8gJ3RydWUnIDogJ3BsYWludGV4dC1vbmx5JztcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIHZhbHVlKTtcbiAgICAgICAgLy8gSW4gdGhlIHJlYWRvbmx5IGNhc2UsIHdlIGRpc2FibGUgY29udGVudGVkaXRhYmxlLCBidXQgaXQgc3RpbGxcbiAgICAgICAgLy8gbmVlZHMgdG8gYmUgZm9jdXNhYmxlLiBXZSBhY2hpZXZlIHRoaXMgYnkgc2V0dGluZyB0YWJpbmRleCBpbiB0aGF0IGNhc2UuXG4gICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2VtaXRDaGFuZ2VJZk5lY2Vzc2FyeSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl9zaG91bGRFbWl0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX3Nob3VsZEVtaXRDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IHVua25vd24ge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLl9jbGVhbkNoaWxkcmVufT48L3Nsb3Q+YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRJbnB1dEVsZW1lbnQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgeyBpc1NlcnZlciwgdHlwZSBMaXRFbGVtZW50LCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4LCBpbnRlcmFjdGl2aXR5Q2hlY2tlciwgaXNBcnJvd0tleVByZXNzZWQgfSBmcm9tICcuLi9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgaTE4blNlbGVjdGlvblJlcXVpcmVkIH0gZnJvbSAnLi4vaTE4bi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB7IFNiYkRpc2FibGVkTWl4aW4sIHR5cGUgU2JiRGlzYWJsZWRNaXhpblR5cGUgfSBmcm9tICcuL2Rpc2FibGVkLW1peGluLmpzJztcbmltcG9ydCB7XG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgdHlwZSBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSxcbn0gZnJvbSAnLi9mb3JtLWFzc29jaWF0ZWQtbWl4aW4uanMnO1xuaW1wb3J0IHsgU2JiUmVxdWlyZWRNaXhpbiwgdHlwZSBTYmJSZXF1aXJlZE1peGluVHlwZSB9IGZyb20gJy4vcmVxdWlyZWQtbWl4aW4uanMnO1xuXG4vKipcbiAqIEEgc3RhdGljIHJlZ2lzdHJ5IHRoYXQgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIGdyb3VwZWQgYHJhZGlvLWJ1dHRvbnNgLlxuICogR3JvdXBzIG9mIHJhZGlvIGJ1dHRvbnMgYXJlIGxvY2FsIHRvIHRoZSBmb3JtIHRoZXkgYmVsb25nIChvciB0aGUgYHJlbmRlclJvb3RgIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgYW55IGZvcm0pXG4gKiBNdWx0aXBsZSBncm91cHMgb2YgcmFkaW8gd2l0aCB0aGUgc2FtZSBuYW1lIGNhbiBjb2V4aXN0IChhcyBsb25nIGFzIHRoZXkgYmVsb25nIHRvIGEgZGlmZmVyZW50IGZvcm0gLyByZW5kZXJSb290KVxuICogSXQgaXMgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgc3RhbmRhbG9uZSBncm91cHMgb2YgcmFkaW9zLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCByYWRpb0J1dHRvblJlZ2lzdHJ5ID0gbmV3IFdlYWtNYXA8XG4gIE5vZGUsXG4gIE1hcDxzdHJpbmcsIFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPj5cbj4oKTtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZVxuICBleHRlbmRzIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlXG4gIGltcGxlbWVudHMgUGFydGlhbDxTYmJEaXNhYmxlZE1peGluVHlwZT4sIFBhcnRpYWw8U2JiUmVxdWlyZWRNaXhpblR5cGU+XG57XG4gIHB1YmxpYyBhY2Nlc3NvciBjaGVja2VkOiBib29sZWFuO1xuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhY2Nlc3NvciByZXF1aXJlZDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz86IFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPjtcbiAgLyoqIEBkZXByZWNhdGVkIE5vIGxvbmdlciB1c2VkIGludGVybmFsbHkuICovXG4gIHByb3RlY3RlZCBhYm9ydDogU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyO1xuXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCwgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcbiAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBlbWl0Q2hhbmdlRXZlbnRzKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5S2V5Ym9hcmQocmFkaW86IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGUpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFRoZSBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW4gZW5hYmxlcyBuYXRpdmUgZm9ybSBzdXBwb3J0IGZvciByYWRpbyBjb250cm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4gJiBUID0+IHtcbiAgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnRcbiAgICBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oU2JiUmVxdWlyZWRNaXhpbihTYmJGb3JtQXNzb2NpYXRlZE1peGluKHN1cGVyQ2xhc3MpKSlcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT5cbiAge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHJhZGlvIGJ1dHRvbiBpcyBjaGVja2VkLlxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuX2NoZWNrZWQgPSAhIXZhbHVlO1xuXG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1jaGVja2VkJywgdGhpcy5jaGVja2VkKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gdGhpcy5jaGVja2VkLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZSgpO1xuICAgICAgdGhpcy5fc3luY2hyb25pemVHcm91cFN0YXRlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICAgIH1cbiAgICBwcml2YXRlIF9jaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgc3VwZXIubmFtZSA9IHZhbHVlO1xuXG4gICAgICB0aGlzLl9kaXNjb25uZWN0RnJvbVJlZ2lzdHJ5KCk7XG4gICAgICB0aGlzLl9jb25uZWN0VG9SZWdpc3RyeSgpO1xuICAgICAgdGhpcy5fc3luY2hyb25pemVHcm91cFN0YXRlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHN1cGVyLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAgICogQGRlZmF1bHQgJ3JhZGlvJ1xuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdyYWRpbyc7XG4gICAgfVxuXG4gICAgLyoqIEBkZXByZWNhdGVkIE5vIGxvbmdlciB1c2VkIGludGVybmFsbHkuICovXG4gICAgcHJvdGVjdGVkIGFib3J0ID0gbmV3IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlcih0aGlzKTtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiByYWRpbyBidXR0b25zIHRoYXQgYmVsb25ncyB0byB0aGUgc2FtZSBncm91cCBvZiBgdGhpc2AuXG4gICAgICogQXNzdW1lIHRoZW0gb3JkZXJlZCBpbiBET00gb3JkZXJcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz86IFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudD47XG4gICAgcHJpdmF0ZSBfcmFkaW9CdXR0b25Hcm91cHNNYXA/OiBNYXA8c3RyaW5nLCBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4+O1xuICAgIHByaXZhdGUgX2RpZExvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYW5ndWFnZUNvbnRyb2xsZXIgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgIHRoaXMuaW50ZXJuYWxzLnJvbGUgPSAncmFkaW8nO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlQXJyb3dLZXlEb3duKGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5fY29ubmVjdFRvUmVnaXN0cnkoKTtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplR3JvdXBTdGF0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLl9kaXNjb25uZWN0RnJvbVJlZ2lzdHJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMuaGFzQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIENhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byByZXN0b3JlIGVsZW1lbnTigJlzIHN0YXRlIHRvIHN0YXRlIGluIHdoaWNoIGNhc2VcbiAgICAgKiAgcmVhc29uIGlzIFwicmVzdG9yZVwiLCBvciB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBmdWxmaWxsIGF1dG9maWxsIG9uIGJlaGFsZiBvZlxuICAgICAqICB1c2VyIGluIHdoaWNoIGNhc2UgcmVhc29uIGlzIFwiYXV0b2NvbXBsZXRlXCIuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICAgIF9yZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IHN0YXRlID09PSB0aGlzLnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIHRoaXMuX2RpZExvYWQgPSB0cnVlO1xuICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYHZhbHVlYCBjaGFuZ2VcbiAgICAgKiBJZiAnY2hlY2tlZCcsIHVwZGF0ZSB0aGUgdmFsdWUuIE90aGVyd2lzZSwgZG8gbm90aGluZy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuY2hlY2tlZCkge1xuICAgICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUodGhpcy52YWx1ZSwgdGhpcy52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHwgbmFtZSA9PT0gJ2NoZWNrZWQnIHx8IG5hbWUgPT09ICdyZXF1aXJlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsaWRpdHkgb2YgYWxsIGFzc29jaWF0ZWQgcmFkaW8gYnV0dG9ucy5cbiAgICAgKiBJZiBhbnkgcmFkaW8gYnV0dG9uIGlzIHJlcXVpcmVkLCBhbGwgYXNzb2NpYXRlZCBhcmUgcmVxdWlyZWQgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgICAgaWYgKCF0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgIGxldCBjaGVja2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucykge1xuICAgICAgICByZXF1aXJlZCB8fD0gcmFkaW8ucmVxdWlyZWQ7XG4gICAgICAgIGNoZWNrZWQgfHw9IHJhZGlvLmNoZWNrZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1aXJlZCAmJiAhY2hlY2tlZCkge1xuICAgICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMuZm9yRWFjaCgocikgPT5cbiAgICAgICAgICByLnNldFZhbGlkaXR5RmxhZyhcbiAgICAgICAgICAgICd2YWx1ZU1pc3NpbmcnLFxuICAgICAgICAgICAgaTE4blNlbGVjdGlvblJlcXVpcmVkW3RoaXMuX2xhbmd1YWdlQ29udHJvbGxlci5jdXJyZW50XSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zLmZvckVhY2goKHIpID0+IHIucmVtb3ZlVmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT25seSBhIHNpbmdsZSByYWRpbyBzaG91bGQgYmUgZm9jdXNhYmxlIGluIHRoZSBncm91cC4gRGVmaW5lZCBhczpcbiAgICAgKiAtIHRoZSBjaGVja2VkIHJhZGlvO1xuICAgICAqIC0gdGhlIGZpcnN0IG5vbi1kaXNhYmxlZCByYWRpbyBpbiBET00gb3JkZXI7XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUZvY3VzYWJsZVJhZGlvcygpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5fZGlkTG9hZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByYWRpb3MgPSB0aGlzLl9pbnRlcmFjdGFibGVHcm91cGVkUmFkaW9zKCk7XG4gICAgICBjb25zdCBjaGVja2VkSW5kZXggPSByYWRpb3MuZmluZEluZGV4KChyKSA9PiByLmNoZWNrZWQgJiYgIXIuZGlzYWJsZWQgJiYgIXIuZm9ybURpc2FibGVkKTtcbiAgICAgIGNvbnN0IGZvY3VzYWJsZUluZGV4ID1cbiAgICAgICAgY2hlY2tlZEluZGV4ICE9PSAtMVxuICAgICAgICAgID8gY2hlY2tlZEluZGV4XG4gICAgICAgICAgOiByYWRpb3MuZmluZEluZGV4KChyKSA9PiAhci5kaXNhYmxlZCAmJiAhci5mb3JtRGlzYWJsZWQpOyAvLyBHZXQgdGhlIGZpcnN0IGZvY3VzYWJsZSByYWRpb1xuXG4gICAgICBpZiAoZm9jdXNhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHJhZGlvc1tmb2N1c2FibGVJbmRleF0udGFiSW5kZXggPSAwO1xuICAgICAgICByYWRpb3Muc3BsaWNlKGZvY3VzYWJsZUluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgdGFiSW5kZXggb24gb3RoZXIgcmFkaW9zXG4gICAgICByYWRpb3MuZm9yRWFjaCgocikgPT4gci5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBuYXZpZ2F0ZUJ5S2V5Ym9hcmQobmV4dDogU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIG5leHQuY2hlY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudHMoKTtcblxuICAgICAgYXdhaXQgbmV4dC51cGRhdGVDb21wbGV0ZTtcbiAgICAgIG5leHQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZW1pdENoYW5nZUV2ZW50cygpOiB2b2lkIHtcbiAgICAgIC8vIE1hbnVhbGx5IGRpc3BhdGNoIGV2ZW50cyB0byBzaW11bGF0ZSBhIHVzZXIgaW50ZXJhY3Rpb25cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IElucHV0RXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3N5bmNocm9uaXplR3JvdXBTdGF0ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5fZGVzZWxlY3RHcm91cGVkUmFkaW9zKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUZvY3VzYWJsZVJhZGlvcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBgdGhpc2AgdG8gdGhlIHJhZGlvQnV0dG9uIHJlZ2lzdHJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfY29ubmVjdFRvUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMubmFtZSB8fCBpc1NlcnZlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZvcm0gPz8gdGhpcy5nZXRSb290Tm9kZSgpO1xuICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAgPSByYWRpb0J1dHRvblJlZ2lzdHJ5LmdldChyb290KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgJ3Jvb3QnIG1hcCBlbnRyeVxuICAgICAgaWYgKCF0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcCkge1xuICAgICAgICB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmFkaW9CdXR0b25SZWdpc3RyeS5zZXQocm9vdCwgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPSB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcC5nZXQoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICkgYXMgdW5rbm93biBhcyBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnQ+O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBncm91cCBzZXRcbiAgICAgIGlmICghdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zKSB7XG4gICAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAuc2V0KFxuICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgYXMgdW5rbm93biBhcyBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluc2VydCB0aGUgbmV3IHJhZGlvIGludG8gdGhlIHNldCBhbmQgc29ydCBmb2xsb3dpbmcgdGhlIERPTSBvcmRlci5cbiAgICAgIC8vIFNpbmNlIHRoZSBvcmRlciBvZiBhICdTZXQnIGlzIHRoZSBpbnNlcnQgb3JkZXIsIHdlIGhhdmUgdG8gZW1wdHkgaXQgYW5kIHJlLWluc2VydCByYWRpb3MgaW4gb3JkZXJcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyk7XG4gICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMuY2xlYXIoKTtcblxuICAgICAgLy8gRmluZCBgdGhpc2AgcG9zaXRpb24gYW5kIGluc2VydCBpdFxuICAgICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleChcbiAgICAgICAgKHIpID0+IHRoaXMuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyxcbiAgICAgICk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAwLCB0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3B1bGF0ZSB0aGUgU2V0XG4gICAgICBlbnRyaWVzLmZvckVhY2goKHIpID0+IHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyEuYWRkKHIpKTtcblxuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgdGhpc2AgZnJvbSB0aGUgcmFkaW9CdXR0b24gcmVnaXN0cnkgYW5kLCBpZiB0aGUgZ3JvdXAgaXMgZW1wdHksIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgZ3JvdXBzIE1hcFxuICAgICAqL1xuICAgIHByaXZhdGUgX2Rpc2Nvbm5lY3RGcm9tUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnM/LmRlbGV0ZSh0aGlzKTtcblxuICAgICAgaWYgKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz8uc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcD8uZGVsZXRlKHRoaXMubmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGxpc3Qgb2YgJ2ludGVyYWN0YWJsZScgZ3JvdXBlZCByYWRpb3MsIG9yZGVyZWQgaW4gRE9NIG9yZGVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfaW50ZXJhY3RhYmxlR3JvdXBlZFJhZGlvcygpOiBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA/PyBbXSkuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgaW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNWaXNpYmxlKGVsKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgb3RoZXIgcmFkaW8gb2YgdGhlIHNhbWUgZ3JvdXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kZXNlbGVjdEdyb3VwZWRSYWRpb3MoKTogdm9pZCB7XG4gICAgICBBcnJheS5mcm9tKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigocikgPT4gciAhPT0gdGhpcylcbiAgICAgICAgLmZvckVhY2goKHIpID0+IChyLmNoZWNrZWQgPSBmYWxzZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2hhbmRsZUFycm93S2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghaXNBcnJvd0tleVByZXNzZWQoZXZ0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZW5hYmxlZFJhZGlvcyA9IHRoaXMuX2ludGVyYWN0YWJsZUdyb3VwZWRSYWRpb3MoKS5maWx0ZXIoXG4gICAgICAgIChyKSA9PiAhci5kaXNhYmxlZCAmJiAhci5mb3JtRGlzYWJsZWQsXG4gICAgICApO1xuICAgICAgY29uc3QgY3VycmVudDogbnVtYmVyID0gZW5hYmxlZFJhZGlvcy5pbmRleE9mKHRoaXMpO1xuICAgICAgY29uc3QgbmV4dEluZGV4OiBudW1iZXIgPSBnZXROZXh0RWxlbWVudEluZGV4KGV2dCwgY3VycmVudCwgZW5hYmxlZFJhZGlvcy5sZW5ndGgpO1xuXG4gICAgICBhd2FpdCB0aGlzLm5hdmlnYXRlQnlLZXlib2FyZChlbmFibGVkUmFkaW9zW25leHRJbmRleF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuLy8gRGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtaXhpblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBoYXMgY29tcGxldGVkIGh5ZHJhdGlvbi5cbiAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVkIGh5ZHJhdGlvblxuICAgKiBhbmQgYGZhbHNlYCBpZiBub3QuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgb25jZSB0aGUgaHlkcmF0aW9uIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaHlkcmF0aW9uQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKiogUmV0dXJucyB3aGV0aGVyIGh5ZHJhdGlvbiBpcyByZXF1aXJlZCBhbmQgbm90IGNvbXBsZXRlZC4gKi9cbiAgcHJvdGVjdGVkIGdldCBoeWRyYXRpb25SZXF1aXJlZCgpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoaXMgbWl4aW4gZXh0ZW5kcyBhIGJhc2UgY2xhc3Mgd2l0aCBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIGlmIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZWQuXG4gKiBJdCBhbHNvIGRlbGF5cyBzbG90Y2hhbmdlIGV2ZW50cyB1bnRpbCBoeWRyYXRpb24gaXMgY29tcGxldGUuXG4gKlxuICogQHBhcmFtIGJhc2UgVGhlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEByZXR1cm5zIEEgY2xhc3MgZXh0ZW5kZWQgd2l0aCB0aGUgaHlkcmF0aW9uIGNoZWNrIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJIeWRyYXRpb25NaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIGJhc2U6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiSHlkcmF0aW9uTWl4aW5DbGFzcyBleHRlbmRzIGJhc2UgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4ge1xuICAgIHByaXZhdGUgX2h5ZHJhdGlvblJlcXVpcmVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2h5ZHJhdGlvbkNvbXBsZXRlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oXG4gICAgICAocmVzb2x2ZSkgPT4gKHRoaXMuX3Jlc29sdmVIeWRyYXRpb24gPSByZXNvbHZlKSxcbiAgICApO1xuICAgIHByaXZhdGUgX3Jlc29sdmVIeWRyYXRpb24hOiAoaHlkcmF0aW9uUmVxdWlyZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGNvbXBsZXRlZCBoeWRyYXRpb24uXG4gICAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVkIGh5ZHJhdGlvblxuICAgICAqIGFuZCBgZmFsc2VgIGlmIG5vdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgb25jZSB0aGUgaHlkcmF0aW9uIGNvbXBsZXRlZC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGh5ZHJhdGlvbkNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2h5ZHJhdGlvbkNvbXBsZXRlO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgaHlkcmF0aW9uIGlzIHJlcXVpcmVkIGFuZCBub3QgY29tcGxldGVkLiAqL1xuICAgIHByb3RlY3RlZCBnZXQgaHlkcmF0aW9uUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgaHlkcmF0aW9uIGlzIG5lZWRlZCBieSBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGFkb3cgcm9vdFxuICAgICAgLy8gaXMgYXZhaWxhYmxlIGR1cmluZyBjb25zdHJ1Y3Rpb24vdXBncmFkZSBwaGFzZS5cbiAgICAgIHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkID0gISF0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoIXRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVIeWRyYXRpb24oZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiBwaGFzZSwgd2Ugd2FudCB0byBzdXBwcmVzcyBzbG90Y2hhbmdlIGV2ZW50cyBhcyB0aGV5XG4gICAgICAgIC8vIGNhbiBjYXVzZSByZW5kZXIgZGlmZmVyZW5jZXMsIHdoaWNoIHdvdWxkIGJyZWFrIGh5ZHJhdGlvbi4gQWZ0ZXJcbiAgICAgICAgLy8gaHlkcmF0aW9uIGlzIGNvbXBsZXRlLCB3ZSBkaXNwYXRjaCBhIG1hbnVhbCBzbG90Y2hhbmdlIGV2ZW50LCBpZiB0aGVyZVxuICAgICAgICAvLyBhcmUgZWxlbWVudHMgYXNzaWduZWQgdG8gYSBzbG90LlxuICAgICAgICBjb25zdCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXZlbnRPcHRpb25zOiBFdmVudExpc3RlbmVyT3B0aW9ucyA9IHsgY2FwdHVyZTogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBzbG90cyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgnc2xvdCcpO1xuICAgICAgICBpZiAoc2xvdHM/Lmxlbmd0aCkge1xuICAgICAgICAgIHNsb3RzLmZvckVhY2goKHNsb3QpID0+XG4gICAgICAgICAgICBzbG90LmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCwgZXZlbnRPcHRpb25zKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaHlkcmF0aW9uQ29tcGxldGUudGhlbigoKSA9PlxuICAgICAgICAgICAgc2xvdHMuZm9yRWFjaCgoc2xvdCkgPT4ge1xuICAgICAgICAgICAgICBzbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCwgZXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgICAgaWYgKHNsb3QuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNsb3QuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Nsb3RjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIC8vIFdoZW4gaHlkcmF0aW9uIGlzIG5lZWRlZCwgd2Ugd2FpdCB0aGUgaHlkcmF0aW9uIHByb2Nlc3MgdG8gZmluaXNoLCB3aGljaCBpcyBwYXRjaGVkXG4gICAgICAvLyBpbnRvIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBMaXRFbGVtZW50IGJhc2UgY2xhc3MuXG4gICAgICBzdXBlci51cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAodGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUh5ZHJhdGlvbih0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkh5ZHJhdGlvbk1peGluQ2xhc3MgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB7IGh0bWwsIHR5cGUgTGl0RWxlbWVudCwgbm90aGluZywgdHlwZSBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJIeWRyYXRpb25NaXhpbiwgdHlwZSBTYmJIeWRyYXRpb25NaXhpblR5cGUgfSBmcm9tICcuL2h5ZHJhdGlvbi1taXhpbi5qcyc7XG5cbmltcG9ydCAnLi4vLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuY29uc3QgU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSA9ICdkYXRhLXNzci1jaGlsZC1jb3VudCc7XG5jb25zdCBTTE9UTkFNRV9QUkVGSVggPSAnbGknO1xuXG5leHBvcnQgdHlwZSBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFyaWFIaWRkZW46IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB3aWxsVXBkYXRlIG9yIHNpbWlsYXIgY2hlY2tzLlxuICogQWxsb3dzIHRoZSB1c2FnZSBvZiB0aGUgc3RyaW5nIGxpdGVyYWwgJ2xpc3RDaGlsZHJlbicuXG4gKlxuICogQGV4YW1wbGVcbiAqIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczxXaXRoTGlzdENoaWxkcmVuPHRoaXM+Pik6IHZvaWQge1xuICogICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsaXN0Q2hpbGRyZW4nKSkge1xuICogICAgIC4uLlxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCB0eXBlIFdpdGhMaXN0Q2hpbGRyZW48XG4gIFQgZXh0ZW5kcyBTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+LFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQgPSBIVE1MRWxlbWVudCxcbj4gPSBUICYgeyBsaXN0Q2hpbGRyZW46IENbXSB9O1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQsXG4+IGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgYWNjZXNzb3IgbGlzdENoaWxkcmVuOiBDW107XG4gIHByb3RlY3RlZCByZW5kZXJMaXN0KFxuICAgIGF0dHJpYnV0ZXM/OiB7XG4gICAgICBjbGFzcz86IHN0cmluZztcbiAgICAgIGFyaWFMYWJlbD86IHN0cmluZztcbiAgICAgIGFyaWFMYWJlbGxlZGJ5Pzogc3RyaW5nO1xuICAgIH0sXG4gICAgbGlzdEl0ZW1BdHRyaWJ1dGVzPzoge1xuICAgICAgbG9jYWxOYW1lVmlzdWFsT25seT86IHN0cmluZ1tdO1xuICAgIH0sXG4gICk6IFRlbXBsYXRlUmVzdWx0O1xuICBwcm90ZWN0ZWQgbGlzdFNsb3RFbnRyaWVzKCk6IFNiYk5hbWVkU2xvdFByb3BlcnRpZXNbXTtcbiAgcHJvdGVjdGVkIHJlbmRlckhpZGRlblNsb3QoKTogVGVtcGxhdGVSZXN1bHQ7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJOYW1lZFNsb3RMaXN0TWl4aW4gPSA8XG4gIEMgZXh0ZW5kcyBIVE1MRWxlbWVudCxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4sXG4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PiAmIFQgPT4ge1xuICAvKipcbiAgICogVGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIG5hbWVkIHNsb3QgbGlzdCBvYnNlcnZlciBmdW5jdGlvbmFsaXR5LlxuICAgKiBUaGlzIGFsbG93cyB1c2luZyB0aGUgcGF0dGVybiBvZiByZW5kZXJpbmcgYSBuYW1lZCBzbG90IGZvciBlYWNoIGNoaWxkLCB3aGljaCBhbGxvd3NcbiAgICogd3JhcHBpbmcgY2hpbGRyZW4gaW4gYW4gdWwvbGkgbGlzdC5cbiAgICovXG4gIGFic3RyYWN0IGNsYXNzIE5hbWVkU2xvdExpc3RFbGVtZW50PEMgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PlxuICAgIGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW4oc3VwZXJDbGFzcylcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxDPj5cbiAge1xuICAgIC8qKiBBIGxpc3Qgb2YgbG93ZXItY2FzZWQgdGFnIG5hbWVzIHRvIG1hdGNoIGFnYWluc3QuIChlLmcuIGBzYmItbGlua2ApICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGRlZmluZWQgdGFnIG5hbWVzLlxuICAgICAqIFRoaXMgYXJyYXkgaXMgb25seSB1cGRhdGVkIGlmIHRoZXJlIGlzIGFuIGFjdHVhbCBjaGFuZ2VcbiAgICAgKiB0byB0aGUgY2hpbGQgZWxlbWVudHMuXG4gICAgICovXG4gICAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGxpc3RDaGlsZHJlbjogQ1tdID0gW107XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgdGhpcy5faGFuZGxlU2xvdGNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3Q/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9oYW5kbGVTbG90Y2hhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVTbG90Y2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbGlzdENoaWxkcmVuID0gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuID8/IFtdKS5maWx0ZXIoKGUpOiBlIGlzIEMgPT5cbiAgICAgICAgdGhpcy5saXN0Q2hpbGRMb2NhbE5hbWVzLmluY2x1ZGVzKGUubG9jYWxOYW1lKSxcbiAgICAgICk7XG4gICAgICAvLyBJZiB0aGUgc2xvdHRlZCBjaGlsZCBpbnN0YW5jZXMgaGF2ZSBub3QgY2hhbmdlZCwgd2UgY2FuIHNraXAgc3luY2luZyBhbmQgdXBkYXRpbmdcbiAgICAgIC8vIHRoZSBsaW5rIHJlZmVyZW5jZSBsaXN0LlxuICAgICAgaWYgKFxuICAgICAgICBsaXN0Q2hpbGRyZW4ubGVuZ3RoID09PSB0aGlzLmxpc3RDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZXZlcnkoKGUsIGkpID0+IGxpc3RDaGlsZHJlbltpXSA9PT0gZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdENoaWxkcmVuXG4gICAgICAgIC5maWx0ZXIoKGMpID0+ICFsaXN0Q2hpbGRyZW4uaW5jbHVkZXMoYykpXG4gICAgICAgIC5mb3JFYWNoKChjKSA9PiBjLnJlbW92ZUF0dHJpYnV0ZSgnc2xvdCcpKTtcbiAgICAgIHRoaXMubGlzdENoaWxkcmVuID0gbGlzdENoaWxkcmVuO1xuICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZm9yRWFjaCgoYywgaW5kZXgpID0+XG4gICAgICAgIGMuc2V0QXR0cmlidXRlKCdzbG90JywgYCR7U0xPVE5BTUVfUFJFRklYfS0ke2luZGV4fWApLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBzc3IgYXR0cmlidXRlLCBvbmNlIHdlIGhhdmUgYWN0dWFsbHkgaW5pdGlhbGl6ZWQgdGhlIGNoaWxkcmVuIGVsZW1lbnRzLlxuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgbGlzdCBhbmQgbGlzdCBzbG90cyBmb3Igc2xvdHRlZCBjaGlsZHJlbiBvciBhIG51bWJlciBvZiBsaXN0IHNsb3RzXG4gICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgcG9zc2libGUgb3B0aW1pemF0aW9uIGZvciBTU1IsIGFzIGluIGFuIFNTUiBMaXQgZW52aXJvbm1lbnRcbiAgICAgKiBvdGhlciBlbGVtZW50cyBhcmUgbm90IGF2YWlsYWJsZSwgYnV0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbWV0YVxuICAgICAqIGZyYW1ld29yayB3cmFwcGVyIChsaWtlIGUuZy4gUmVhY3QpLiBUaGlzIGFsbG93cyB0byBwcm92aWRlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBjaGlsZHJlbiB0byBiZSBwYXNzZWQgdmlhIHRoZSBgZGF0YS1zc3ItY2hpbGQtY291bnRgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVuZGVyTGlzdChcbiAgICAgIGF0dHJpYnV0ZXM6IHsgY2xhc3M/OiBzdHJpbmc7IGFyaWFMYWJlbD86IHN0cmluZzsgYXJpYUxhYmVsbGVkYnk/OiBzdHJpbmcgfSA9IHt9LFxuICAgICAgbGlzdEl0ZW1BdHRyaWJ1dGVzOiB7IGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXSB9ID0ge30sXG4gICAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgICAgY29uc3QgbGlzdFNsb3ROYW1lczogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdID0gdGhpcy5saXN0U2xvdEVudHJpZXMobGlzdEl0ZW1BdHRyaWJ1dGVzKTtcblxuICAgICAgaWYgKGxpc3RTbG90TmFtZXMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzcz0ke2F0dHJpYnV0ZXMuY2xhc3MgfHwgdGhpcy5sb2NhbE5hbWV9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPSR7YXR0cmlidXRlcy5hcmlhTGFiZWwgfHwgbm90aGluZ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsbGVkYnkgfHwgbm90aGluZ31cbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2xpc3RTbG90TmFtZXMubWFwKFxuICAgICAgICAgICAgICAoc2xvdCkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgICA8bGkgYXJpYS1oaWRkZW49JHtzbG90LmFyaWFIaWRkZW4gfHwgbm90aGluZ30+XG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPSR7c2xvdC5uYW1lfT48L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgYCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICAke3RoaXMucmVuZGVySGlkZGVuU2xvdCgpfVxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChsaXN0U2xvdE5hbWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gaHRtbGA8c2JiLXNjcmVlbi1yZWFkZXItb25seT4ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0ke2F0dHJpYnV0ZXMuY2xhc3MgfHwgdGhpcy5sb2NhbE5hbWV9PlxuICAgICAgICAgICAgPHNwYW4+PHNsb3QgbmFtZT0ke2xpc3RTbG90TmFtZXNbMF0ubmFtZX0+PC9zbG90Pjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgJHt0aGlzLnJlbmRlckhpZGRlblNsb3QoKX0gYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckhpZGRlblNsb3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNiYk5hbWVkU2xvdFByb3BlcnRpZXMsIHdoaWNoIGhvbGRzIHRoZSBsaXN0IHNsb3QgbmFtZXMgYW5kIHRoZSBoaWRkZW4gcHJvcGVydHk7XG4gICAgICogaXRzIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgY2hpbGRyZW4gb3IgdGhlIGBkYXRhLXNzci1jaGlsZC1jb3VudGAgYXR0cmlidXRlIHZhbHVlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhIHBvc3NpYmxlIG9wdGltaXphdGlvbiBmb3IgU1NSLCBhcyBpbiBhbiBTU1IgTGl0IGVudmlyb25tZW50XG4gICAgICogb3RoZXIgZWxlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUsIGJ1dCBtaWdodCBiZSBhdmFpbGFibGUgaW4gdGhlIG1ldGFcbiAgICAgKiBmcmFtZXdvcmsgd3JhcHBlciAobGlrZSBlLmcuIFJlYWN0KS4gVGhpcyBhbGxvd3MgdG8gcHJvdmlkZSB0aGUgbnVtYmVyIG9mXG4gICAgICogY2hpbGRyZW4gdG8gYmUgcGFzc2VkIHZpYSB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxpc3RTbG90RW50cmllcyhsaXN0SXRlbUF0dHJpYnV0ZXM6IHtcbiAgICAgIGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXTtcbiAgICB9KTogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdIHtcbiAgICAgIGNvbnN0IGxpc3RDaGlsZHJlbiA9IHRoaXMubGlzdENoaWxkcmVuLmxlbmd0aFxuICAgICAgICA/IHRoaXMubGlzdENoaWxkcmVuXG4gICAgICAgIDogQXJyYXkuZnJvbSh7IGxlbmd0aDogKyh0aGlzLmdldEF0dHJpYnV0ZShTU1JfQ0hJTERfQ09VTlRfQVRUUklCVVRFKSA/PyAwKSB9KTtcbiAgICAgIHJldHVybiBsaXN0Q2hpbGRyZW4ubWFwKChlLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogYCR7U0xPVE5BTUVfUFJFRklYfS0ke2l9YCxcbiAgICAgICAgICBhcmlhSGlkZGVuOlxuICAgICAgICAgICAgbGlzdEl0ZW1BdHRyaWJ1dGVzPy5sb2NhbE5hbWVWaXN1YWxPbmx5Py5pbmNsdWRlcygoZSBhcyBIVE1MRWxlbWVudCkubG9jYWxOYW1lKSA/P1xuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaGlkZGVuIHNsb3QsIHdoaWNoIGlzIGludGVuZGVkIGFzIHRoZSBjaGlsZHJlbiBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAqIFdoZW4gYW4gZWxlbWVudCB3aXRob3V0IGEgc2xvdCBhdHRyaWJ1dGUgaXMgc2xvdHRlZCB0byB0aGUgZWxlbWVudCwgaXQgdHJpZ2dlcnNcbiAgICAgKiB0aGUgc2xvdGNoYW5nZSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXNzaWduIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lZCBzbG90LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJIaWRkZW5TbG90KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIHJldHVybiBodG1sYDxzcGFuIGhpZGRlbj48c2xvdD48L3Nsb3Q+PC9zcGFuPmA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE5hbWVkU2xvdExpc3RFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYk5lZ2F0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIG5lZ2F0aXZlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIG5lZ2F0aXZlIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiTmVnYXRpdmVNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5lZ2F0aXZlTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJOZWdhdGl2ZUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgU2JiTmVnYXRpdmVNaXhpblR5cGUge1xuICAgIC8qKiBOZWdhdGl2ZSBjb2xvcmluZyB2YXJpYW50IGZsYWcuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBuZWdhdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIFNiYk5lZ2F0aXZlRWxlbWVudCBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5lZ2F0aXZlTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2V2ZW50aW5nLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYlBhbmVsTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnO1xuICBwdWJsaWMgYWNjZXNzb3IgYm9yZGVybGVzczogYm9vbGVhbjtcbiAgcHVibGljIGFjY2Vzc29yIGV4cGFuc2lvblN0YXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNiYlBhbmVsU2l6ZSA9ICdzJyB8ICdtJztcblxuLyoqXG4gKiBNaXhpbiBmb3IgY29tbW9uIHBhbmVsIGJlaGF2aW9yc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiUGFuZWxNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlBhbmVsTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJQYW5lbEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgU2JiUGFuZWxNaXhpblR5cGUge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgICAgcGFuZWxDb25uZWN0ZWQ6ICdwYW5lbENvbm5lY3RlZCcsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIC8qKiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgcGFuZWwuICovXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSB9KSBwdWJsaWMgYWNjZXNzb3IgY29sb3I6ICd3aGl0ZScgfCAnbWlsaycgPSAnd2hpdGUnO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHVuc2VsZWN0ZWQgcGFuZWwgaGFzIGEgYm9yZGVyLiAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgYm9yZGVybGVzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEBpbnRlcm5hbCB1c2VkIGZvciBhY2Nlc3NpYmlsaXR5IGxhYmVsIHdoZW4gaW4gZXhwYW5zaW9uIHBhbmVsICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgYWNjZXNzb3IgZXhwYW5zaW9uU3RhdGU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogSW50ZXJuYWwgZXZlbnQgdGhhdCBlbWl0cyB3aGVuIHRoZSBjaGVja2JveCBpcyBsb2FkZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcGFuZWxDb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgU2JiUGFuZWxFbGVtZW50LmV2ZW50cy5wYW5lbENvbm5lY3RlZCxcbiAgICAgIHsgYnViYmxlczogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLl9wYW5lbENvbm5lY3RlZC5lbWl0KCk7XG5cbiAgICAgIHRoaXMuY2xvc2VzdD8uKCdzYmItcmFkaW8tYnV0dG9uLWdyb3VwLCBzYmItY2hlY2tib3gtZ3JvdXAnKT8udG9nZ2xlQXR0cmlidXRlKFxuICAgICAgICAnZGF0YS1oYXMtcGFuZWwnLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiUGFuZWxFbGVtZW50IGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiUGFuZWxNaXhpblR5cGU+ICYgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuLy8gRGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtaXhpblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlIHtcbiAgcHJvdGVjdGVkIHN0YXJ0VXBkYXRlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBjb21wbGV0ZVVwZGF0ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoaXMgbWl4aW4gYWxsb3dzIHNjaGVkdWxpbmcgbWFudWFsIHVwZGF0ZXMsIHdoaWNoIGFmZmVjdCB1cGRhdGVDb21wbGV0ZS5cbiAqIEBwYXJhbSBiYXNlIFRoZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcmV0dXJucyBBIGNsYXNzIGV4dGVuZGVkIHdpdGggdGhlIHNsb3QgY2hpbGQgb2JzZXJ2ZXIgZnVuY3Rpb25hbGl0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYlVwZGF0ZVNjaGVkdWxlck1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgYmFzZTogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJVcGRhdGVTY2hlZHVsZXJFbGVtZW50XG4gICAgZXh0ZW5kcyBiYXNlXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZT5cbiAge1xuICAgIHByaXZhdGUgX3VwZGF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIF91cGRhdGVSZXNvbHZlID0gKCk6IHZvaWQgPT4ge307XG5cbiAgICBwcm90ZWN0ZWQgc3RhcnRVcGRhdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl91cGRhdGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+ICh0aGlzLl91cGRhdGVSZXNvbHZlID0gcikpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb21wbGV0ZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZ2V0VXBkYXRlQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlUHJvbWlzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBTYmJVcGRhdGVTY2hlZHVsZXJFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiJdLCJuYW1lcyI6WyJfYSIsInN0YXRlIiwiX2IiLCJldmVudE9wdGlvbnMiLCJTYmJQYW5lbEVsZW1lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZWEsTUFBQSw0QkFBNEIsQ0FDdkMsZUFDMEQ7QUFBQSxFQUMxRCxNQUFlLG9DQUNMLFdBQVU7QUFBQSxJQURwQixjQUFBOztBQU9TLFdBQVcsY0FBRztBQVNiLFdBQUEsb0JBQW1D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
|