@sbb-esta/lyne-elements 2.2.0 → 2.4.1
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/accordion.js +6 -6
- package/alert/alert-group.js +4 -4
- package/alert/alert.js +9 -9
- 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-button.js +4 -4
- package/autocomplete-grid/autocomplete-grid-optgroup.js +4 -4
- package/autocomplete-grid/autocomplete-grid-row.js +4 -4
- package/autocomplete-grid/autocomplete-grid.js +0 -1
- package/autocomplete.js +29 -29
- package/badge.css +31 -0
- package/breadcrumb/breadcrumb-group.js +4 -4
- package/breadcrumb/breadcrumb.js +19 -19
- package/button/accent-button-link.js +9 -9
- package/button/accent-button-static.js +6 -6
- package/button/accent-button.js +6 -6
- package/button/button-link.js +7 -7
- package/button/button-static.js +7 -7
- package/button/button.js +8 -8
- package/button/common/button-common.d.ts.map +1 -1
- package/button/common.js +1 -1
- package/button/mini-button-group.js +8 -8
- package/button/secondary-button-link.js +7 -7
- package/button/secondary-button-static.js +7 -7
- package/button/secondary-button.js +3 -3
- package/button/transparent-button-link.js +6 -6
- package/button/transparent-button-static.js +5 -5
- package/button/transparent-button.js +6 -6
- package/calendar/calendar.d.ts +55 -11
- package/calendar/calendar.d.ts.map +1 -1
- package/calendar.js +374 -224
- package/card/card-badge.js +9 -9
- package/card/card-button.js +5 -5
- package/card/card-link.js +7 -7
- package/card/card.js +1 -1
- 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/checkbox-panel.js +16 -16
- package/checkbox/checkbox.js +15 -15
- package/checkbox/common/checkbox-common.d.ts.map +1 -1
- package/checkbox/common.js +3 -3
- package/clock.js +8 -8
- package/container/container.js +4 -4
- package/core/base-elements.js +10 -10
- package/core/controllers/escapable-overlay-controller.d.ts +11 -0
- package/core/controllers/escapable-overlay-controller.d.ts.map +1 -0
- package/core/controllers.d.ts +1 -0
- package/core/controllers.d.ts.map +1 -1
- package/core/controllers.js +73 -47
- 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/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 +52 -31
- 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/eventing.js +4 -4
- package/core/i18n/i18n.d.ts +6 -0
- package/core/i18n/i18n.d.ts.map +1 -1
- package/core/i18n.js +106 -70
- 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 +16 -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 +1 -0
- package/core/mixins.d.ts.map +1 -1
- package/core/mixins.js +574 -295
- package/core/styles/badge.scss +3 -0
- package/core/styles/core.scss +3 -1
- package/core/styles/mixins/badge.scss +26 -1
- package/core/styles/mixins/font-face.scss +12 -12
- package/core/styles/mixins/link.scss +32 -8
- package/core/styles/standard-theme.scss +1 -0
- package/core/testing/mocha-extensions.d.ts.map +1 -1
- package/core/testing/wait-for-render.d.ts.map +1 -1
- package/core/testing.js +14 -14
- package/core.css +5 -5
- package/custom-elements.json +28284 -17221
- package/date-input/date-input.d.ts +67 -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 +149 -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 +43 -40
- package/datepicker/datepicker.js +94 -76
- package/development/alert/alert-group.js +1 -1
- package/development/alert/alert.js +1 -1
- 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 +10 -5
- package/development/breadcrumb/breadcrumb.js +5 -2
- package/development/button/common/button-common.d.ts.map +1 -1
- package/development/button/common.js +18 -14
- package/development/calendar/calendar.d.ts +55 -11
- package/development/calendar/calendar.d.ts.map +1 -1
- package/development/calendar.js +302 -88
- package/development/card/card.js +1 -1
- 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/checkbox-panel.js +1 -1
- package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
- 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.d.ts +1 -0
- package/development/core/controllers.d.ts.map +1 -1
- package/development/core/controllers.js +36 -1
- 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/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 +23 -2
- 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 +6 -0
- package/development/core/i18n/i18n.d.ts.map +1 -1
- package/development/core/i18n.js +43 -1
- 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 +16 -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 +1 -0
- package/development/core/mixins.d.ts.map +1 -1
- package/development/core/mixins.js +460 -32
- 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 +67 -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 +259 -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 +13 -4
- package/development/datepicker/datepicker.js +65 -39
- package/development/dialog/dialog/dialog.d.ts.map +1 -1
- package/development/dialog/dialog-title.js +1 -1
- 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-header.js +1 -1
- package/development/expansion-panel/expansion-panel.js +3 -3
- package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
- package/development/file-selector/common.js +1 -1
- package/development/footer.js +1 -1
- 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 +23 -14
- package/development/header/common/header-action-common.d.ts.map +1 -1
- 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/image.js +1 -1
- package/development/journey-header.js +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 +19 -7
- package/development/link-list/common.js +1 -1
- package/development/map-container.js +1 -1
- package/development/menu/common/menu-action-common.d.ts +3 -0
- package/development/menu/common/menu-action-common.d.ts.map +1 -1
- package/development/menu/common.js +35 -12
- package/development/menu/menu/menu.d.ts +1 -1
- package/development/menu/menu/menu.d.ts.map +1 -1
- package/development/menu/menu.js +5 -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-section.js +1 -1
- package/development/navigation/navigation.js +8 -21
- package/development/notification.js +1 -1
- 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 +7 -14
- 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/radio-button/radio-button-panel.js +1 -1
- package/development/select/select.d.ts +6 -1
- package/development/select/select.d.ts.map +1 -1
- package/development/select.js +28 -6
- package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/development/selection-expansion-panel.js +2 -2
- package/development/skiplink-list.js +1 -1
- package/development/slider.js +1 -1
- package/development/stepper/step/step.d.ts +0 -2
- package/development/stepper/step/step.d.ts.map +1 -1
- package/development/stepper/step.js +1 -16
- 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/tabs/tab-label.js +1 -1
- 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/timetable-occupancy.js +1 -1
- package/development/toast.js +1 -1
- package/development/toggle/toggle/toggle.d.ts +25 -6
- package/development/toggle/toggle/toggle.d.ts.map +1 -1
- package/development/toggle/toggle-option/toggle-option.d.ts +2 -6
- package/development/toggle/toggle-option/toggle-option.d.ts.map +1 -1
- package/development/toggle/toggle-option.js +21 -39
- package/development/toggle/toggle.js +57 -39
- package/development/train/train-formation.js +1 -1
- package/development/train/train.js +1 -1
- package/development/visual-checkbox.js +1 -1
- package/dialog/dialog/dialog.d.ts.map +1 -1
- package/dialog/dialog-content.js +3 -3
- package/dialog/dialog-title.js +8 -8
- package/dialog/dialog.js +2 -2
- package/divider.js +12 -12
- package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
- package/expansion-panel/expansion-panel-header.js +1 -1
- package/expansion-panel/expansion-panel.js +2 -2
- package/file-selector/common/file-selector-common.d.ts.map +1 -1
- package/file-selector/common.js +9 -9
- package/file-selector/file-selector-dropzone.js +5 -5
- package/file-selector/file-selector.js +6 -6
- package/flip-card/flip-card-details.js +4 -4
- package/flip-card/flip-card-summary.js +9 -9
- package/font-characters-extension.css +3 -3
- package/footer.js +4 -4
- 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 +32 -24
- package/header/common/header-action-common.d.ts.map +1 -1
- package/header/header-button.js +5 -5
- package/header/header-link.js +5 -5
- 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/icon.js +36 -36
- package/image.js +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/journey-header.js +5 -5
- package/link/block-link-button.js +4 -4
- package/link/block-link-static.js +9 -9
- package/link/block-link.js +4 -4
- 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 +28 -28
- package/link/link-button.js +7 -7
- package/link/link-static.js +7 -7
- package/link/link.js +4 -4
- package/link-list/common.js +15 -15
- package/loading-indicator-circle.js +11 -11
- package/map-container.js +5 -5
- package/menu/common/menu-action-common.d.ts +3 -0
- package/menu/common/menu-action-common.d.ts.map +1 -1
- package/menu/common.js +34 -30
- package/menu/menu/menu.d.ts +1 -1
- package/menu/menu/menu.d.ts.map +1 -1
- package/menu/menu-button.js +8 -8
- package/menu/menu-link.js +6 -6
- package/menu/menu.js +29 -38
- 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-button.js +4 -4
- package/navigation/navigation-link.js +7 -7
- package/navigation/navigation-list.js +4 -4
- package/navigation/navigation-marker.js +3 -3
- package/navigation/navigation-section.js +1 -1
- package/navigation/navigation.js +45 -54
- package/notification.js +18 -18
- package/option/optgroup.js +11 -11
- 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 +57 -63
- package/package.json +11 -2
- package/paginator/common/paginator-common.d.ts.map +1 -1
- package/paginator/common.js +6 -6
- package/popover/popover/popover.d.ts +1 -1
- package/popover/popover/popover.d.ts.map +1 -1
- package/popover/popover.js +105 -114
- 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/radio-button/radio-button-panel.js +6 -6
- package/screen-reader-only.js +5 -5
- package/select/select.d.ts +6 -1
- package/select/select.d.ts.map +1 -1
- package/select.js +52 -43
- package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/selection-expansion-panel.js +1 -1
- package/skiplink-list.js +3 -3
- package/slider.js +13 -13
- package/standard-theme.css +37 -5
- package/status.js +3 -3
- package/stepper/step/step.d.ts +0 -2
- package/stepper/step/step.d.ts.map +1 -1
- package/stepper/step-label.js +4 -4
- package/stepper/step.js +24 -36
- package/stepper/stepper/stepper.d.ts +11 -0
- package/stepper/stepper/stepper.d.ts.map +1 -1
- package/stepper/stepper.js +59 -41
- package/table/table-wrapper.js +4 -4
- package/tabs/tab-group.js +24 -24
- package/tabs/tab-label.js +1 -1
- package/tabs/tab.js +4 -4
- 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 +34 -31
- package/tag/tag.js +60 -41
- package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
- package/teaser-product/common.js +5 -5
- package/teaser-product/teaser-product-static.js +2 -2
- package/timetable-occupancy-icon.js +3 -3
- package/timetable-occupancy.js +6 -6
- package/toast.js +5 -5
- package/toggle/toggle/toggle.d.ts +25 -6
- package/toggle/toggle/toggle.d.ts.map +1 -1
- package/toggle/toggle-option/toggle-option.d.ts +2 -6
- package/toggle/toggle-option/toggle-option.d.ts.map +1 -1
- package/toggle/toggle-option.js +44 -52
- package/toggle/toggle.js +103 -83
- package/toggle-check.js +5 -5
- package/train/train-formation.js +1 -1
- package/train/train.js +29 -29
- package/visual-checkbox.js +1 -1
|
@@ -6,12 +6,14 @@ 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
11
|
import { defaultConverter, isServer, html, nothing, css } from "lit";
|
|
12
|
+
import { SbbLanguageController, SbbConnectedAbortController } from "./controllers.js";
|
|
12
13
|
import { preventScrollOnSpacebarPress, EventEmitter } from "./eventing.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
14
|
+
import { i18nCheckboxRequired, i18nInputRequired, i18nSelectionRequired } from "./i18n.js";
|
|
15
|
+
import { isWebkit, isFirefox } from "./dom.js";
|
|
16
|
+
import { sbbInputModalityDetector, interactivityChecker, isArrowKeyPressed, getNextElementIndex } from "./a11y.js";
|
|
15
17
|
import "../screen-reader-only.js";
|
|
16
18
|
const SbbDisabledMixin = (superClass) => {
|
|
17
19
|
let SbbDisabledElement = (() => {
|
|
@@ -101,6 +103,34 @@ const SbbDisabledTabIndexActionMixin = (superClass) => {
|
|
|
101
103
|
}
|
|
102
104
|
return SbbDisabledTabIndexAction;
|
|
103
105
|
};
|
|
106
|
+
const validityKeys = {
|
|
107
|
+
badInput: false,
|
|
108
|
+
customError: false,
|
|
109
|
+
patternMismatch: false,
|
|
110
|
+
rangeOverflow: false,
|
|
111
|
+
rangeUnderflow: false,
|
|
112
|
+
stepMismatch: false,
|
|
113
|
+
tooLong: false,
|
|
114
|
+
tooShort: false,
|
|
115
|
+
typeMismatch: false,
|
|
116
|
+
valueMissing: false
|
|
117
|
+
};
|
|
118
|
+
if (typeof ValidityState === "undefined") {
|
|
119
|
+
const validityClass = class ValidityState {
|
|
120
|
+
get valid() {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
constructor() {
|
|
124
|
+
throw new TypeError("Illegal constructor");
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
Object.entries(validityKeys).forEach(([key, value]) => Object.assign(validityClass.prototype, {
|
|
128
|
+
get [key]() {
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
}));
|
|
132
|
+
globalThis.ValidityState = validityClass;
|
|
133
|
+
}
|
|
104
134
|
const SbbFormAssociatedMixin = (superClass) => {
|
|
105
135
|
let SbbFormAssociatedElement = (() => {
|
|
106
136
|
var _formDisabled_accessor_storage, _a;
|
|
@@ -112,16 +142,19 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
112
142
|
let _formDisabled_initializers = [];
|
|
113
143
|
let _formDisabled_extraInitializers = [];
|
|
114
144
|
return _a = class extends _classSuper {
|
|
115
|
-
constructor() {
|
|
116
|
-
|
|
145
|
+
constructor(...args) {
|
|
146
|
+
var _a2;
|
|
147
|
+
super(...args);
|
|
117
148
|
__privateAdd(this, _formDisabled_accessor_storage);
|
|
118
149
|
this._value = (__runInitializers(this, _instanceExtraInitializers), null);
|
|
119
150
|
this.internals = this.attachInternals();
|
|
151
|
+
this._validityStates = /* @__PURE__ */ new Map();
|
|
120
152
|
__privateSet(this, _formDisabled_accessor_storage, __runInitializers(this, _formDisabled_initializers, false));
|
|
121
153
|
__runInitializers(this, _formDisabled_extraInitializers);
|
|
154
|
+
(_a2 = this.addEventListener) == null ? void 0 : _a2.call(this, "invalid", (e) => e.preventDefault());
|
|
122
155
|
}
|
|
123
156
|
/**
|
|
124
|
-
* Returns the form owner of
|
|
157
|
+
* Returns the form owner of this element.
|
|
125
158
|
*/
|
|
126
159
|
get form() {
|
|
127
160
|
return this.internals.form;
|
|
@@ -152,27 +185,26 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
152
185
|
return this._value;
|
|
153
186
|
}
|
|
154
187
|
/**
|
|
155
|
-
* Returns the ValidityState object for
|
|
156
|
-
*
|
|
157
|
-
* @internal
|
|
188
|
+
* Returns the ValidityState object for this element.
|
|
158
189
|
*/
|
|
159
190
|
get validity() {
|
|
160
191
|
return this.internals.validity;
|
|
161
192
|
}
|
|
162
193
|
/**
|
|
163
|
-
* Returns the error message
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
194
|
+
* Returns the current error message, if available, which corresponds
|
|
195
|
+
* to the current validation state.
|
|
196
|
+
* Please note that only one message is returned at a time (e.g. if
|
|
197
|
+
* multiple validity states are invalid, only the chronologically first one
|
|
198
|
+
* is returned until it is fixed, at which point the next message might be
|
|
199
|
+
* returned, if it is still applicable). Also a custom validity message
|
|
200
|
+
* (see below) has precedence over native validation messages.
|
|
167
201
|
*/
|
|
168
202
|
get validationMessage() {
|
|
169
203
|
return this.internals.validationMessage;
|
|
170
204
|
}
|
|
171
205
|
/**
|
|
172
|
-
* Returns true if
|
|
206
|
+
* Returns true if this element will be validated
|
|
173
207
|
* when the form is submitted; false otherwise.
|
|
174
|
-
*
|
|
175
|
-
* @internal
|
|
176
208
|
*/
|
|
177
209
|
get willValidate() {
|
|
178
210
|
return this.internals.willValidate;
|
|
@@ -190,24 +222,31 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
190
222
|
}
|
|
191
223
|
}
|
|
192
224
|
/**
|
|
193
|
-
* Returns true if
|
|
225
|
+
* Returns true if this element has no validity problems; false otherwise.
|
|
194
226
|
* Fires an invalid event at the element in the latter case.
|
|
195
|
-
*
|
|
196
|
-
* @internal
|
|
197
227
|
*/
|
|
198
228
|
checkValidity() {
|
|
199
229
|
return this.internals.checkValidity();
|
|
200
230
|
}
|
|
201
231
|
/**
|
|
202
|
-
* Returns true if
|
|
232
|
+
* Returns true if this element has no validity problems; otherwise,
|
|
203
233
|
* returns false, fires an invalid event at the element,
|
|
204
234
|
* and (if the event isn't canceled) reports the problem to the user.
|
|
205
|
-
*
|
|
206
|
-
* @internal
|
|
207
235
|
*/
|
|
208
236
|
reportValidity() {
|
|
209
237
|
return this.internals.reportValidity();
|
|
210
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Sets the custom validity message for this element. Use the empty string
|
|
241
|
+
* to indicate that the element does not have a custom validity error.
|
|
242
|
+
*/
|
|
243
|
+
setCustomValidity(message) {
|
|
244
|
+
if (message) {
|
|
245
|
+
this.setValidityFlag("customError", message);
|
|
246
|
+
} else {
|
|
247
|
+
this.removeValidityFlag("customError");
|
|
248
|
+
}
|
|
249
|
+
}
|
|
211
250
|
/**
|
|
212
251
|
* Is called whenever a surrounding form / fieldset changes disabled state.
|
|
213
252
|
* @param disabled
|
|
@@ -219,6 +258,86 @@ const SbbFormAssociatedMixin = (superClass) => {
|
|
|
219
258
|
this.formDisabled = disabled;
|
|
220
259
|
});
|
|
221
260
|
}
|
|
261
|
+
requestUpdate(name, oldValue, options) {
|
|
262
|
+
super.requestUpdate(name, oldValue, options);
|
|
263
|
+
if (this.hasUpdated && this.shouldValidate(name)) {
|
|
264
|
+
this.validate();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
firstUpdated(changedProperties) {
|
|
268
|
+
super.firstUpdated(changedProperties);
|
|
269
|
+
this.validate();
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Marks this element as suffering from the constraint indicated by the
|
|
273
|
+
* flag argument and associates the given message to it.
|
|
274
|
+
* Note that only one message is displayed at a time and custom messages by
|
|
275
|
+
* consumers are always displayed before internal messages and internal
|
|
276
|
+
* messages are displayed in the order they were added.
|
|
277
|
+
* To set/define custom validity state flags, you need to extend the
|
|
278
|
+
* ValidityState prototype (and the CustomValidityState interface).
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
*
|
|
282
|
+
* // The type of the custom validity state does not need to be boolean.
|
|
283
|
+
* Object.assign(ValidityState.prototype, {
|
|
284
|
+
* get myError(): boolean {
|
|
285
|
+
* return false;
|
|
286
|
+
* },
|
|
287
|
+
* });
|
|
288
|
+
*
|
|
289
|
+
* declare global {
|
|
290
|
+
* interface CustomValidityState {
|
|
291
|
+
* myError: boolean;
|
|
292
|
+
* }
|
|
293
|
+
* }
|
|
294
|
+
*/
|
|
295
|
+
setValidityFlag(flag, message, flagValue) {
|
|
296
|
+
flagValue ?? (flagValue = true);
|
|
297
|
+
const validityState = this._validityStates.get(flag);
|
|
298
|
+
if (!validityState || validityState.message !== message || validityState.flagValue !== flagValue) {
|
|
299
|
+
this._validityStates.set(flag, { flagValue, message });
|
|
300
|
+
this._setInternalValidity();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/** Removes the validity state flag entry and updates validity state. */
|
|
304
|
+
removeValidityFlag(flag) {
|
|
305
|
+
if (this._validityStates.has(flag)) {
|
|
306
|
+
this._validityStates.delete(flag);
|
|
307
|
+
this._setInternalValidity();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/** To be called whenever the current element needs to be validated. */
|
|
311
|
+
validate() {
|
|
312
|
+
}
|
|
313
|
+
/** Whether validation should be run on a property change with the given name. */
|
|
314
|
+
shouldValidate(name) {
|
|
315
|
+
return !name;
|
|
316
|
+
}
|
|
317
|
+
_setInternalValidity() {
|
|
318
|
+
var _a2;
|
|
319
|
+
let outputMessage = (_a2 = this._validityStates.get("customError")) == null ? void 0 : _a2.message;
|
|
320
|
+
const flags = {};
|
|
321
|
+
this._validityStates.forEach(({ flagValue, message }, flag) => {
|
|
322
|
+
flags[flag] = flagValue;
|
|
323
|
+
outputMessage || (outputMessage = message);
|
|
324
|
+
});
|
|
325
|
+
const customFlags = Object.keys(ValidityState.prototype).filter((f) => !(f in validityKeys) && f !== "valid");
|
|
326
|
+
for (const flag of customFlags) {
|
|
327
|
+
const value = flag in flags ? flags[flag] : false;
|
|
328
|
+
Object.defineProperty(this.internals.validity, flag, { value, configurable: true });
|
|
329
|
+
if (value) {
|
|
330
|
+
flags.customError = true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
this.internals.setValidity(flags, outputMessage);
|
|
334
|
+
if (isWebkit) {
|
|
335
|
+
Object.defineProperty(this.internals.validity, "customError", {
|
|
336
|
+
value: this._validityStates.has("customError") || !!flags.customError,
|
|
337
|
+
configurable: true
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
222
341
|
}, _formDisabled_accessor_storage = new WeakMap(), (() => {
|
|
223
342
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
224
343
|
_set_name_decorators = [property()];
|
|
@@ -319,6 +438,7 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
319
438
|
var _a2, _b, _c;
|
|
320
439
|
super();
|
|
321
440
|
this._attributeMutationBlocked = (__runInitializers(this, _instanceExtraInitializers), false);
|
|
441
|
+
this._languageController = new SbbLanguageController(this);
|
|
322
442
|
this._checked = false;
|
|
323
443
|
this._handleKeyboardInteraction = (event) => {
|
|
324
444
|
if (event.key === " ") {
|
|
@@ -357,9 +477,9 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
357
477
|
}
|
|
358
478
|
/**
|
|
359
479
|
* Called when the browser is trying to restore element’s state to state in which case
|
|
360
|
-
* reason is
|
|
361
|
-
* user in which case reason is
|
|
362
|
-
* In the case of
|
|
480
|
+
* reason is "restore", or when the browser is trying to fulfill autofill on behalf of
|
|
481
|
+
* user in which case reason is "autocomplete".
|
|
482
|
+
* In the case of "restore", state is a string, File, or FormData object
|
|
363
483
|
* previously set as the second argument to setFormValue.
|
|
364
484
|
*
|
|
365
485
|
* @internal
|
|
@@ -376,6 +496,17 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
376
496
|
this.internals.setFormValue(null);
|
|
377
497
|
}
|
|
378
498
|
}
|
|
499
|
+
shouldValidate(name) {
|
|
500
|
+
return super.shouldValidate(name) || name === "checked" || name === "required";
|
|
501
|
+
}
|
|
502
|
+
validate() {
|
|
503
|
+
super.validate();
|
|
504
|
+
if (this.required && !this.checked) {
|
|
505
|
+
this.setValidityFlag("valueMissing", i18nCheckboxRequired[this._languageController.current]);
|
|
506
|
+
} else {
|
|
507
|
+
this.removeValidityFlag("valueMissing");
|
|
508
|
+
}
|
|
509
|
+
}
|
|
379
510
|
}, _classThis = _a, (() => {
|
|
380
511
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
381
512
|
_set_checked_decorators = [property({
|
|
@@ -402,6 +533,272 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
|
|
|
402
533
|
})();
|
|
403
534
|
return SbbFormAssociatedCheckboxElement;
|
|
404
535
|
};
|
|
536
|
+
const SbbFormAssociatedInputMixin = (superClass) => {
|
|
537
|
+
let SbbFormAssociatedInputElement = (() => {
|
|
538
|
+
var _a;
|
|
539
|
+
let _classSuper = SbbRequiredMixin(SbbFormAssociatedMixin(superClass));
|
|
540
|
+
let _instanceExtraInitializers = [];
|
|
541
|
+
let _set_readOnly_decorators;
|
|
542
|
+
let _set_disabled_decorators;
|
|
543
|
+
let _set_placeholder_decorators;
|
|
544
|
+
let __cleanChildren_decorators;
|
|
545
|
+
return _a = class extends _classSuper {
|
|
546
|
+
/**
|
|
547
|
+
* Form type of element.
|
|
548
|
+
* @default 'text'
|
|
549
|
+
*/
|
|
550
|
+
get type() {
|
|
551
|
+
return "text";
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* The text value of the input element.
|
|
555
|
+
*/
|
|
556
|
+
set value(value) {
|
|
557
|
+
super.value = this._cleanText(value);
|
|
558
|
+
if (this.hasUpdated) {
|
|
559
|
+
this.innerHTML = super.value;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
get value() {
|
|
563
|
+
return super.value ?? "";
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Whether the component is readonly.
|
|
567
|
+
* @attr readonly
|
|
568
|
+
* @default false
|
|
569
|
+
*/
|
|
570
|
+
set readOnly(value) {
|
|
571
|
+
this.toggleAttribute("readonly", !!value);
|
|
572
|
+
this.internals.ariaReadOnly = value ? "true" : null;
|
|
573
|
+
this._updateContenteditable();
|
|
574
|
+
}
|
|
575
|
+
get readOnly() {
|
|
576
|
+
return this.hasAttribute("readonly");
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Whether the component is disabled.
|
|
580
|
+
* @attr disabled
|
|
581
|
+
* @default false
|
|
582
|
+
*/
|
|
583
|
+
set disabled(value) {
|
|
584
|
+
this.toggleAttribute("disabled", !!value);
|
|
585
|
+
this.internals.ariaDisabled = value ? "true" : null;
|
|
586
|
+
this._updateContenteditable();
|
|
587
|
+
}
|
|
588
|
+
get disabled() {
|
|
589
|
+
return this.hasAttribute("disabled");
|
|
590
|
+
}
|
|
591
|
+
set placeholder(value) {
|
|
592
|
+
if (value) {
|
|
593
|
+
this.setAttribute("placeholder", value);
|
|
594
|
+
} else {
|
|
595
|
+
this.removeAttribute("placeholder");
|
|
596
|
+
}
|
|
597
|
+
this.internals.ariaPlaceholder = value ? value : null;
|
|
598
|
+
}
|
|
599
|
+
get placeholder() {
|
|
600
|
+
return this.getAttribute("placeholder") ?? "";
|
|
601
|
+
}
|
|
602
|
+
constructor() {
|
|
603
|
+
var _a2, _b, _c, _d, _e, _f, _g;
|
|
604
|
+
super();
|
|
605
|
+
this._interacted = (__runInitializers(this, _instanceExtraInitializers), false);
|
|
606
|
+
this._shouldEmitChange = false;
|
|
607
|
+
this._shouldTriggerSubmit = false;
|
|
608
|
+
this.language = new SbbLanguageController(this);
|
|
609
|
+
this.internals.role = "textbox";
|
|
610
|
+
(_a2 = this.addEventListener) == null ? void 0 : _a2.call(this, "input", () => {
|
|
611
|
+
super.value = this._cleanText(this.textContent ?? "");
|
|
612
|
+
this._interacted = true;
|
|
613
|
+
this._shouldEmitChange = true;
|
|
614
|
+
}, { capture: true });
|
|
615
|
+
(_b = this.addEventListener) == null ? void 0 : _b.call(this, "change", () => this._shouldEmitChange = false, { capture: true });
|
|
616
|
+
(_c = this.addEventListener) == null ? void 0 : _c.call(this, "keydown", (event) => {
|
|
617
|
+
var _a3;
|
|
618
|
+
if ((event.key === "Enter" || event.key === "\n") && event.isTrusted) {
|
|
619
|
+
event.preventDefault();
|
|
620
|
+
event.stopImmediatePropagation();
|
|
621
|
+
this._shouldTriggerSubmit = this.dispatchEvent(new KeyboardEvent("keydown", event));
|
|
622
|
+
} else if (isWebkit && this.value && (event.key === "Backspace" || event.key === "Delete") && event.isTrusted) {
|
|
623
|
+
event.preventDefault();
|
|
624
|
+
event.stopImmediatePropagation();
|
|
625
|
+
if (!this.dispatchEvent(new KeyboardEvent("keydown", event))) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
const selectedRange = (_a3 = window.getSelection()) == null ? void 0 : _a3.getRangeAt(0);
|
|
629
|
+
if (!selectedRange) {
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
if (selectedRange.startOffset !== selectedRange.endOffset) {
|
|
633
|
+
selectedRange.deleteContents();
|
|
634
|
+
this._dispatchInputEvent();
|
|
635
|
+
} else if (event.key === "Backspace" && selectedRange.startOffset > 0) {
|
|
636
|
+
selectedRange.setStart(selectedRange.startContainer, selectedRange.startOffset - 1);
|
|
637
|
+
selectedRange.deleteContents();
|
|
638
|
+
this._dispatchInputEvent();
|
|
639
|
+
} else if (event.key === "Delete" && selectedRange.endOffset < this.value.length) {
|
|
640
|
+
selectedRange.setEnd(selectedRange.endContainer, selectedRange.endOffset + 1);
|
|
641
|
+
selectedRange.deleteContents();
|
|
642
|
+
this._dispatchInputEvent();
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}, { capture: true });
|
|
646
|
+
(_d = this.addEventListener) == null ? void 0 : _d.call(this, "keyup", (event) => {
|
|
647
|
+
var _a3;
|
|
648
|
+
if (event.key === "Enter" || event.key === "\n") {
|
|
649
|
+
this._emitChangeIfNecessary();
|
|
650
|
+
if (this._shouldTriggerSubmit) {
|
|
651
|
+
this._shouldTriggerSubmit = false;
|
|
652
|
+
(_a3 = this.form) == null ? void 0 : _a3.requestSubmit();
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}, { capture: true });
|
|
656
|
+
(_e = this.addEventListener) == null ? void 0 : _e.call(this, "paste", (e) => {
|
|
657
|
+
var _a3, _b2;
|
|
658
|
+
e.preventDefault();
|
|
659
|
+
const text = this._cleanText(((_a3 = e.clipboardData) == null ? void 0 : _a3.getData("text/plain")) ?? "");
|
|
660
|
+
const selectedRange = (_b2 = window.getSelection()) == null ? void 0 : _b2.getRangeAt(0);
|
|
661
|
+
if (!selectedRange || !text) {
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
selectedRange.deleteContents();
|
|
665
|
+
selectedRange.insertNode(document.createTextNode(text));
|
|
666
|
+
selectedRange.setStart(selectedRange.endContainer, selectedRange.endOffset);
|
|
667
|
+
this._dispatchInputEvent();
|
|
668
|
+
});
|
|
669
|
+
(_f = this.addEventListener) == null ? void 0 : _f.call(this, "focus", () => {
|
|
670
|
+
var _a3;
|
|
671
|
+
if (sbbInputModalityDetector.mostRecentModality === "keyboard") {
|
|
672
|
+
(_a3 = window.getSelection()) == null ? void 0 : _a3.selectAllChildren(this);
|
|
673
|
+
}
|
|
674
|
+
});
|
|
675
|
+
(_g = this.addEventListener) == null ? void 0 : _g.call(this, "blur", () => {
|
|
676
|
+
var _a3;
|
|
677
|
+
(_a3 = window.getSelection()) == null ? void 0 : _a3.removeAllRanges();
|
|
678
|
+
this._emitChangeIfNecessary();
|
|
679
|
+
this.scrollLeft = 0;
|
|
680
|
+
}, { capture: true });
|
|
681
|
+
}
|
|
682
|
+
connectedCallback() {
|
|
683
|
+
super.connectedCallback();
|
|
684
|
+
this.internals.ariaMultiLine = "false";
|
|
685
|
+
this._updateContenteditable();
|
|
686
|
+
this.innerHTML = this.value;
|
|
687
|
+
}
|
|
688
|
+
focus(options) {
|
|
689
|
+
super.focus(options);
|
|
690
|
+
if (!isServer && !this.disabled && !this.readOnly && this.value) {
|
|
691
|
+
const selection = window.getSelection();
|
|
692
|
+
if (!selection) {
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
let range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
|
|
696
|
+
if (range && range.startOffset !== 0) {
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
range = document.createRange();
|
|
700
|
+
range.setStart(this.firstChild, this.textContent.length);
|
|
701
|
+
range.collapse(true);
|
|
702
|
+
selection.removeAllRanges();
|
|
703
|
+
selection.addRange(range);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
attributeChangedCallback(name, old, value) {
|
|
707
|
+
if (name !== "value" || !this._interacted) {
|
|
708
|
+
super.attributeChangedCallback(name, old, value);
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Is called whenever the form is being reset.
|
|
713
|
+
*
|
|
714
|
+
* @internal
|
|
715
|
+
*/
|
|
716
|
+
formResetCallback() {
|
|
717
|
+
this._interacted = false;
|
|
718
|
+
this.value = this.getAttribute("value") ?? "";
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* Called when the browser is trying to restore element’s state to state in which case
|
|
722
|
+
* reason is "restore", or when the browser is trying to fulfill autofill on behalf of
|
|
723
|
+
* user in which case reason is "autocomplete".
|
|
724
|
+
* In the case of "restore", state is a string, File, or FormData object
|
|
725
|
+
* previously set as the second argument to setFormValue.
|
|
726
|
+
*
|
|
727
|
+
* @internal
|
|
728
|
+
*/
|
|
729
|
+
formStateRestoreCallback(state2, _reason) {
|
|
730
|
+
if (state2 && typeof state2 === "string") {
|
|
731
|
+
this.value = state2;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
updateFormValue() {
|
|
735
|
+
this.internals.setFormValue(this.value, this.value);
|
|
736
|
+
}
|
|
737
|
+
shouldValidate(name) {
|
|
738
|
+
return super.shouldValidate(name) || name === "value" || name === "required";
|
|
739
|
+
}
|
|
740
|
+
validate() {
|
|
741
|
+
super.validate();
|
|
742
|
+
if (this.required && !this.value) {
|
|
743
|
+
this.setValidityFlag("valueMissing", i18nInputRequired[this.language.current]);
|
|
744
|
+
} else {
|
|
745
|
+
this.removeValidityFlag("valueMissing");
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
_cleanText(value) {
|
|
749
|
+
return `${value}`.replace(/[\n\r]+/g, "");
|
|
750
|
+
}
|
|
751
|
+
_dispatchInputEvent() {
|
|
752
|
+
this.dispatchEvent(new InputEvent("input", { bubbles: true, composed: true }));
|
|
753
|
+
}
|
|
754
|
+
_cleanChildren() {
|
|
755
|
+
if (this.childElementCount) {
|
|
756
|
+
for (const element of this.children) {
|
|
757
|
+
element.remove();
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
_updateContenteditable() {
|
|
762
|
+
if (!isServer && this.isConnected) {
|
|
763
|
+
const value = this.disabled || this.readOnly ? "false" : isFirefox ? "true" : "plaintext-only";
|
|
764
|
+
this.setAttribute("contenteditable", value);
|
|
765
|
+
if (this.readOnly) {
|
|
766
|
+
this.setAttribute("tabindex", "0");
|
|
767
|
+
} else {
|
|
768
|
+
this.removeAttribute("tabindex");
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
_emitChangeIfNecessary() {
|
|
773
|
+
if (this._shouldEmitChange) {
|
|
774
|
+
this._shouldEmitChange = false;
|
|
775
|
+
this.dispatchEvent(new Event("change", { bubbles: true }));
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
render() {
|
|
779
|
+
return html`<slot @slotchange=${this._cleanChildren}></slot>`;
|
|
780
|
+
}
|
|
781
|
+
}, (() => {
|
|
782
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
783
|
+
_set_readOnly_decorators = [property({ type: Boolean })];
|
|
784
|
+
_set_disabled_decorators = [property({ type: Boolean })];
|
|
785
|
+
_set_placeholder_decorators = [property({ attribute: false })];
|
|
786
|
+
__cleanChildren_decorators = [eventOptions({ passive: true })];
|
|
787
|
+
__esDecorate(_a, null, _set_readOnly_decorators, { kind: "setter", name: "readOnly", static: false, private: false, access: { has: (obj) => "readOnly" in obj, set: (obj, value) => {
|
|
788
|
+
obj.readOnly = value;
|
|
789
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
790
|
+
__esDecorate(_a, null, _set_disabled_decorators, { kind: "setter", name: "disabled", static: false, private: false, access: { has: (obj) => "disabled" in obj, set: (obj, value) => {
|
|
791
|
+
obj.disabled = value;
|
|
792
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
793
|
+
__esDecorate(_a, null, _set_placeholder_decorators, { kind: "setter", name: "placeholder", static: false, private: false, access: { has: (obj) => "placeholder" in obj, set: (obj, value) => {
|
|
794
|
+
obj.placeholder = value;
|
|
795
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
796
|
+
__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);
|
|
797
|
+
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
798
|
+
})(), _a;
|
|
799
|
+
})();
|
|
800
|
+
return SbbFormAssociatedInputElement;
|
|
801
|
+
};
|
|
405
802
|
const radioButtonRegistry = /* @__PURE__ */ new WeakMap();
|
|
406
803
|
const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
407
804
|
let SbbFormAssociatedRadioButtonElement = (() => {
|
|
@@ -445,6 +842,7 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
445
842
|
this._checked = (__runInitializers(this, _instanceExtraInitializers), false);
|
|
446
843
|
this.abort = new SbbConnectedAbortController(this);
|
|
447
844
|
this._didLoad = false;
|
|
845
|
+
this._languageController = new SbbLanguageController(this);
|
|
448
846
|
this.internals.role = "radio";
|
|
449
847
|
(_a2 = this.addEventListener) == null ? void 0 : _a2.call(this, "keydown", (e) => this._handleArrowKeyDown(e));
|
|
450
848
|
}
|
|
@@ -466,8 +864,8 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
466
864
|
}
|
|
467
865
|
/**
|
|
468
866
|
* Called when the browser is trying to restore element’s state to state in which case
|
|
469
|
-
* reason is
|
|
470
|
-
* user in which case reason is
|
|
867
|
+
* reason is "restore", or when the browser is trying to fulfill autofill on behalf of
|
|
868
|
+
* user in which case reason is "autocomplete".
|
|
471
869
|
* @internal
|
|
472
870
|
*/
|
|
473
871
|
formStateRestoreCallback(state2, _reason) {
|
|
@@ -497,6 +895,30 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
497
895
|
this.internals.setFormValue(null);
|
|
498
896
|
}
|
|
499
897
|
}
|
|
898
|
+
shouldValidate(name) {
|
|
899
|
+
return super.shouldValidate(name) || name === "checked" || name === "required";
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Sets the validity of all associated radio buttons.
|
|
903
|
+
* If any radio button is required, all associated are required as well.
|
|
904
|
+
*/
|
|
905
|
+
validate() {
|
|
906
|
+
super.validate();
|
|
907
|
+
if (!this.associatedRadioButtons) {
|
|
908
|
+
return;
|
|
909
|
+
}
|
|
910
|
+
let required = false;
|
|
911
|
+
let checked = false;
|
|
912
|
+
for (const radio of this.associatedRadioButtons) {
|
|
913
|
+
required || (required = radio.required);
|
|
914
|
+
checked || (checked = radio.checked);
|
|
915
|
+
}
|
|
916
|
+
if (required && !checked) {
|
|
917
|
+
this.associatedRadioButtons.forEach((r) => r.setValidityFlag("valueMissing", i18nSelectionRequired[this._languageController.current]));
|
|
918
|
+
} else {
|
|
919
|
+
this.associatedRadioButtons.forEach((r) => r.removeValidityFlag("valueMissing"));
|
|
920
|
+
}
|
|
921
|
+
}
|
|
500
922
|
/**
|
|
501
923
|
* Only a single radio should be focusable in the group. Defined as:
|
|
502
924
|
* - the checked radio;
|
|
@@ -558,6 +980,7 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
558
980
|
entries.push(this);
|
|
559
981
|
}
|
|
560
982
|
entries.forEach((r) => this.associatedRadioButtons.add(r));
|
|
983
|
+
this.validate();
|
|
561
984
|
}
|
|
562
985
|
/**
|
|
563
986
|
* Remove `this` from the radioButton registry and, if the group is empty, delete the entry from the groups Map
|
|
@@ -567,6 +990,8 @@ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
|
|
|
567
990
|
(_a2 = this.associatedRadioButtons) == null ? void 0 : _a2.delete(this);
|
|
568
991
|
if (((_b = this.associatedRadioButtons) == null ? void 0 : _b.size) === 0) {
|
|
569
992
|
(_c = this._radioButtonGroupsMap) == null ? void 0 : _c.delete(this.name);
|
|
993
|
+
} else {
|
|
994
|
+
this.validate();
|
|
570
995
|
}
|
|
571
996
|
this.associatedRadioButtons = void 0;
|
|
572
997
|
this._radioButtonGroupsMap = void 0;
|
|
@@ -634,12 +1059,12 @@ const SbbHydrationMixin = (base) => {
|
|
|
634
1059
|
event.stopImmediatePropagation();
|
|
635
1060
|
}
|
|
636
1061
|
};
|
|
637
|
-
const
|
|
1062
|
+
const eventOptions2 = { capture: true };
|
|
638
1063
|
const slots = (_a = this.shadowRoot) == null ? void 0 : _a.querySelectorAll("slot");
|
|
639
1064
|
if (slots == null ? void 0 : slots.length) {
|
|
640
|
-
slots.forEach((slot) => slot.addEventListener("slotchange", suppressSlotchangeEvent,
|
|
1065
|
+
slots.forEach((slot) => slot.addEventListener("slotchange", suppressSlotchangeEvent, eventOptions2));
|
|
641
1066
|
this.hydrationComplete.then(() => slots.forEach((slot) => {
|
|
642
|
-
slot.removeEventListener("slotchange", suppressSlotchangeEvent,
|
|
1067
|
+
slot.removeEventListener("slotchange", suppressSlotchangeEvent, eventOptions2);
|
|
643
1068
|
if (slot.assignedNodes().length) {
|
|
644
1069
|
slot.dispatchEvent(new Event("slotchange", { bubbles: true }));
|
|
645
1070
|
}
|
|
@@ -854,12 +1279,14 @@ const SbbPanelMixin = (superClass) => {
|
|
|
854
1279
|
__privateSet(this, _expansionState_accessor_storage, value);
|
|
855
1280
|
}
|
|
856
1281
|
connectedCallback() {
|
|
1282
|
+
var _a2, _b;
|
|
857
1283
|
super.connectedCallback();
|
|
858
1284
|
this._panelConnected.emit();
|
|
1285
|
+
(_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);
|
|
859
1286
|
}
|
|
860
1287
|
}, _color_accessor_storage = new WeakMap(), _borderless_accessor_storage = new WeakMap(), _expansionState_accessor_storage = new WeakMap(), (() => {
|
|
861
1288
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
862
|
-
_color_decorators = [property()];
|
|
1289
|
+
_color_decorators = [property({ reflect: true })];
|
|
863
1290
|
_borderless_decorators = [forceType(), property({ reflect: true, type: Boolean })];
|
|
864
1291
|
_expansionState_decorators = [forceType(), property()];
|
|
865
1292
|
__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) => {
|
|
@@ -1009,6 +1436,7 @@ export {
|
|
|
1009
1436
|
SbbDisabledMixin,
|
|
1010
1437
|
SbbDisabledTabIndexActionMixin,
|
|
1011
1438
|
SbbFormAssociatedCheckboxMixin,
|
|
1439
|
+
SbbFormAssociatedInputMixin,
|
|
1012
1440
|
SbbFormAssociatedMixin,
|
|
1013
1441
|
SbbFormAssociatedRadioButtonMixin,
|
|
1014
1442
|
SbbHydrationMixin,
|
|
@@ -1020,4 +1448,4 @@ export {
|
|
|
1020
1448
|
panelCommon as panelCommonStyle,
|
|
1021
1449
|
radioButtonRegistry
|
|
1022
1450
|
};
|
|
1023
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZGlzYWJsZWQtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3JlcXVpcmVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1jaGVja2JveC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9mb3JtLWFzc29jaWF0ZWQtcmFkaW8tYnV0dG9uLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2h5ZHJhdGlvbi1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9uYW1lZC1zbG90LWxpc3QtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvbmVnYXRpdmUtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvcGFuZWwtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvdXBkYXRlLXNjaGVkdWxlci1taXhpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUsIGdldE92ZXJyaWRlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRGlzYWJsZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgZGlzYWJsZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJEaXNhYmxlZE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgQGdldE92ZXJyaWRlKChlOiBTYmJEaXNhYmxlZEVsZW1lbnQsIHY6IGJvb2xlYW4pOiBib29sZWFuID0+IHYgfHwgZS5pc0Rpc2FibGVkRXh0ZXJuYWxseSgpKVxuICAgIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGFzICdvcicgY2hlY2sgdG8gdGhlIGN1cnJlbnQgZGlzYWJsZWQgc3RhdGUuXG4gICAgICogQ2FuIGUuZy4gYmUgdXNlZCB0byByZWFkIGRpc2FibGVkIHN0YXRlIG9mIGEgZ3JvdXAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJEaXNhYmxlZEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlPiAmIFQ7XG59O1xuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIGRpc2FibGVkIGludGVyYWN0aXZlIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRGlzYWJsZWRNaXhpblR5cGU+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZUVsZW1lbnRcbiAgICBleHRlbmRzIHN1cGVyQ2xhc3NcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT5cbiAge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBidXR0b24gc2hvdWxkIGJlIGFyaWEtZGlzYWJsZWQgYnV0IHN0YXkgaW50ZXJhY3RpdmUuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGlzYWJsZWQtaW50ZXJhY3RpdmUnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBTYmJEaXNhYmxlZEludGVyYWN0aXZlRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbk1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU+LFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGUgJiBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJEaXNhYmxlZFRhYkluZGV4QWN0aW9uXG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW4oU2JiRGlzYWJsZWRNaXhpbihzdXBlckNsYXNzKSlcbiAgICBpbXBsZW1lbnRzIFNiYkRpc2FibGVkTWl4aW5UeXBlLCBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlXG4gIHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZEludGVyYWN0aXZlJykpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYURpc2FibGVkID0gdGhpcy5kaXNhYmxlZEludGVyYWN0aXZlID8gJ3RydWUnIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFxuICAgIFNiYkRpc2FibGVkTWl4aW5UeXBlICYgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZVxuICA+ICZcbiAgICBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWID0gc3RyaW5nPiB7XG4gIHB1YmxpYyBnZXQgZm9ybSgpOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsO1xuICBwdWJsaWMgYWNjZXNzb3IgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nO1xuICBwdWJsaWMgYWNjZXNzb3IgdmFsdWU6IFYgfCBudWxsO1xuXG4gIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZTtcbiAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGZvcm1EaXNhYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgZm9ybUFzc29jaWF0ZWRDYWxsYmFjaz8oZm9ybTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtRGlzYWJsZWRDYWxsYmFjayhkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQ7XG4gIHB1YmxpYyBhYnN0cmFjdCBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgYWJzdHJhY3QgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICApOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgRm9ybUFzc29jaWF0ZWRNaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIGN1c3RvbSBjb250cm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4sIFYgPSBzdHJpbmc+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PlxuICB7XG4gICAgcHVibGljIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmb3JtIG93bmVyIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZm9ybSgpOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5mb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZvcm0gZWxlbWVudC4gV2lsbCBiZSByZWFkIGZyb20gbmFtZSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb24gRGV2ZWxvcGVyIG5vdGU6IEluIHRoaXMgY2FzZSB1cGRhdGluZyB0aGUgYXR0cmlidXRlIG11c3QgYmUgc3luY2hyb25vdXMuXG4gICAgICogRHVlIHRvIHRoaXMgaXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBnZXR0ZXIvc2V0dGVyIGFuZCB0aGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgaGFuZGxlcyB0aGUgZGlmZiBjaGVjay5cbiAgICAgKi9cbiAgICBAcHJvcGVydHkoKVxuICAgIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCduYW1lJywgYCR7bmFtZX1gKTtcblxuICAgICAgLy8gRm9yIGBGb3JtRGF0YWAgdmFsdWVzLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHVwZGF0ZSB0aGUgZmllbGROYW1lIGtleVxuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA/PyAnJztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7XG4gICAgfVxuXG4gICAgLyoqIFZhbHVlIG9mIHRoZSBmb3JtIGVsZW1lbnQuICovXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBWIHwgbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogViB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBwcml2YXRlIF92YWx1ZTogViB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgVmFsaWRpdHlTdGF0ZSBvYmplY3QgZm9yIGludGVybmFscyB0YXJnZXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMudmFsaWRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IHdvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyXG4gICAgICogaWYgaW50ZXJuYWxzIHRhcmdldCBlbGVtZW50IHdhcyB0byBiZSBjaGVja2VkIGZvciB2YWxpZGl0eS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW50ZXJuYWxzIHRhcmdldCBlbGVtZW50IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAgICogd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLndpbGxWYWxpZGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG5cbiAgICAvKiogV2hlbmV2ZXIgYSBzdXJyb3VuZGluZyBmb3JtIG9yIGZpZWxkc2V0IGlzIGNoYW5naW5nIGl0cyBkaXNhYmxlZCBzdGF0ZS4gKi9cbiAgICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAobmFtZSAhPT0gJ25hbWUnIHx8IG9sZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpbnRlcm5hbHMgdGFyZ2V0IGVsZW1lbnQgaGFzIG5vIHZhbGlkaXR5IHByb2JsZW1zOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogRmlyZXMgYW4gaW52YWxpZCBldmVudCBhdCB0aGUgZWxlbWVudCBpbiB0aGUgbGF0dGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGludGVybmFscyB0YXJnZXQgZWxlbWVudCBoYXMgbm8gdmFsaWRpdHkgcHJvYmxlbXM7IG90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIGZhbHNlLCBmaXJlcyBhbiBpbnZhbGlkIGV2ZW50IGF0IHRoZSBlbGVtZW50LFxuICAgICAqIGFuZCAoaWYgdGhlIGV2ZW50IGlzbid0IGNhbmNlbGVkKSByZXBvcnRzIHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgZm9ybSBlbGVtZW50IGNoYW5nZXMuXG4gICAgICogRWxlbWVudEludGVybmFscy5mb3JtIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgZnJvbSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZvcm1Bc3NvY2lhdGVkQ2FsbGJhY2s/KGZvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIGEgc3Vycm91bmRpbmcgZm9ybSAvIGZpZWxkc2V0IGNoYW5nZXMgZGlzYWJsZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybURpc2FibGVkQ2FsbGJhY2soZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIGlmIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eSBjaGFuZ2VzIG9yIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgb2YgYSBmaWVsZHNldCBvciBmb3JtIGNoYW5nZXMuXG4gICAgICAvLyBXZSBuZWVkIHRvIHBvc3Rwb25lIHRoZSBhc3NpZ25tZW50LCBvdGhlcndpc2UgaXQgaW50ZXJmZXJlcyB3aXRoIGRpc2FibGVkIHN0YXR1cyBzZXR0aW5nXG4gICAgICAvLyBhbmQgbGVhZHMgdG8gYSB3cm9uZyBzdGF0ZSAoZS5nLiBlbWJlZGRlZCBzYmItdmlzdWFsLWNoZWNrYm94KS5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1EaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMg4oCccmVzdG9yZeKAnSwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyDigJxhdXRvY29tcGxldGXigJ0uXG4gICAgICogIEluIHRoZSBjYXNlIG9mIOKAnHJlc3RvcmXigJ0sIHN0YXRlIGlzIGEgc3RyaW5nLCBGaWxlLCBvciBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiAgcHJldmlvdXNseSBzZXQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRGb3JtVmFsdWUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGZvcm0gdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBBZGFwdHMgYW5kIHNldHMgdGhlIGZvcm1WYWx1ZSBpbiB0aGUgc3VwcG9ydGVkIGZvcm1hdCAoc3RyaW5nIHwgRm9ybURhdGEgfCBGaWxlIHwgbnVsbClcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9zZXRGb3JtVmFsdWVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIH1cbiAgcmV0dXJuIFNiYkZvcm1Bc3NvY2lhdGVkRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+ICZcbiAgICBUO1xufTtcblxuLyoqXG4gKiBBIHZhbHVlIHRvIGJlIHJlc3RvcmVkIGZvciBhIGNvbXBvbmVudCdzIGZvcm0gdmFsdWUuIElmIGEgY29tcG9uZW50J3MgZm9ybVxuICogc3RhdGUgaXMgYSBgRm9ybURhdGFgIG9iamVjdCwgaXRzIGVudHJ5IGxpc3Qgb2YgbmFtZSBhbmQgdmFsdWVzIHdpbGwgYmVcbiAqIHByb3ZpZGVkLlxuICovXG5leHBvcnQgdHlwZSBGb3JtUmVzdG9yZVN0YXRlID0gRmlsZSB8IHN0cmluZyB8IFtzdHJpbmcsIEZvcm1EYXRhRW50cnlWYWx1ZV1bXTtcblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgZm9ybSBjb21wb25lbnQgaXMgYmVpbmcgcmVzdG9yZWQgZm9yLCBlaXRoZXIgYCdyZXN0b3JlJ2AgZm9yXG4gKiBicm93c2VyIHJlc3RvcmF0aW9uIG9yIGAnYXV0b2NvbXBsZXRlJ2AgZm9yIHJlc3RvcmluZyB1c2VyIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVJlc3RvcmVSZWFzb24gPSAncmVzdG9yZScgfCAnYXV0b2NvbXBsZXRlJztcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiUmVxdWlyZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIHJlcXVpcmVkIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiUmVxdWlyZWRNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PixcbiAgVixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJSZXF1aXJlZEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT4ge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIC8vIFRvIHByb3ZpZGUgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIG5hdGl2ZSByZXF1aXJlZCBzdGF0ZSxcbiAgICAgIC8vIGFueSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLlxuICAgICAgdGhpcy5fcmVxdWlyZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCB8fCB0aGlzLmlzUmVxdWlyZWRFeHRlcm5hbGx5KCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgZXhwbGljaXRseSBzZXQgYXJpYS1yZXF1aXJlZCB2YWx1ZS5cbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYVJlcXVpcmVkID0gYCR7dGhpcy5yZXF1aXJlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBhcyAnb3InIGNoZWNrIHRvIHRoZSBjdXJyZW50IHJlcXVpcmVkIHN0YXRlLlxuICAgICAqIENhbiBlLmcuIGJlIHVzZWQgdG8gcmVhZCByZXF1aXJlZCBzdGF0ZSBvZiBhIGdyb3VwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiUmVxdWlyZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJSZXF1aXJlZE1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB7IGRlZmF1bHRDb252ZXJ0ZXIsIHR5cGUgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHByZXZlbnRTY3JvbGxPblNwYWNlYmFyUHJlc3MgfSBmcm9tICcuLi9ldmVudGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB7IFNiYkRpc2FibGVkTWl4aW4sIHR5cGUgU2JiRGlzYWJsZWRNaXhpblR5cGUgfSBmcm9tICcuL2Rpc2FibGVkLW1peGluLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgdHlwZSBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSxcbn0gZnJvbSAnLi9mb3JtLWFzc29jaWF0ZWQtbWl4aW4uanMnO1xuaW1wb3J0IHsgU2JiUmVxdWlyZWRNaXhpbiwgdHlwZSBTYmJSZXF1aXJlZE1peGluVHlwZSB9IGZyb20gJy4vcmVxdWlyZWQtbWl4aW4uanMnO1xuXG50eXBlIENoZWNrZWRTZXR0ZXJWYWx1ZSA9IHsgdmFsdWU6IGJvb2xlYW47IGF0dHJpYnV0ZTogYm9vbGVhbiB9O1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlXG4gIGV4dGVuZHMgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGVcbiAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiwgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT5cbntcbiAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbik7XG5cbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbik7XG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKTtcbiAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCwgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcbiAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW4gZW5hYmxlcyBuYXRpdmUgZm9ybSBzdXBwb3J0IGZvciBjaGVja2JveCBjb250cm9scy5cbiAqXG4gKiBJbmhlcml0ZWQgY2xhc3NlcyBNVVNUIGltcGxlbWVudCB0aGUgYXJpYUNoZWNrZWQgc3RhdGUgKEVsZW1lbnRJbnRlcm5hbHMpIHRoZW1zZWx2ZXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGU+ICYgVCA9PiB7XG4gIEBob3N0QXR0cmlidXRlcyh7XG4gICAgdGFiaW5kZXg6ICcwJyxcbiAgfSlcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveEVsZW1lbnRcbiAgICBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oU2JiUmVxdWlyZWRNaXhpbihTYmJGb3JtQXNzb2NpYXRlZE1peGluKHN1cGVyQ2xhc3MpKSlcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZT5cbiAge1xuICAgIHByaXZhdGUgX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuICovXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBjb252ZXJ0ZXI6IHtcbiAgICAgICAgLi4uZGVmYXVsdENvbnZlcnRlcixcbiAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXR0ZXIgc28gdGhhdCB3ZSBrbm93IGl0IHdhcyBjYWxsZWQgYnkgYXR0cmlidXRlIGNoYW5nZS5cbiAgICAgICAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bik6IENoZWNrZWRTZXR0ZXJWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmYXVsdENvbnZlcnRlci5mcm9tQXR0cmlidXRlPy4odmFsdWUsIHR5cGUpO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQsIGF0dHJpYnV0ZTogdHJ1ZSB9IGFzIENoZWNrZWRTZXR0ZXJWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNldHRlciA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAodmFsdWUgYXMgdW5rbm93biBhcyBDaGVja2VkU2V0dGVyVmFsdWUpLmF0dHJpYnV0ZSA6IGZhbHNlO1xuICAgICAgaWYgKGF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIENoZWNrZWRTZXR0ZXJWYWx1ZSkudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzIHNvb24gYXMgbXV0YXRpb24gd2FzIGRvbmUgbm90IGJ5IHNldHRpbmcgYXR0cmlidXRlLFxuICAgICAgLy8gd2UgbmVlZCB0byBibG9jayBzeW5jaW5nIGF0dHJpYnV0ZS5cbiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQgJiYgIWF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICAgfVxuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgICAqIEBkZWZhdWx0ICdjaGVja2JveCdcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnY2hlY2tib3gnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmludGVybmFscy5yb2xlID0gJ2NoZWNrYm94JztcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NsaWNrJywgdGhpcy5faGFuZGxlVXNlckludGVyYWN0aW9uKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdrZXlkb3duJywgcHJldmVudFNjcm9sbE9uU3BhY2ViYXJQcmVzcyk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5dXAnLCB0aGlzLl9oYW5kbGVLZXlib2FyZEludGVyYWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICAvLyBBdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhZnRlciBwcm9ncmFtbWF0aWMgb3IgbWFudWFsIHN0YXRlIGNoYW5nZS5cbiAgICAgIGlmIChuYW1lICE9PSAnY2hlY2tlZCcgfHwgIXRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCkge1xuICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICAgIHRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyDigJxyZXN0b3Jl4oCdLCBvciB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBmdWxmaWxsIGF1dG9maWxsIG9uIGJlaGFsZiBvZlxuICAgICAqICB1c2VyIGluIHdoaWNoIGNhc2UgcmVhc29uIGlzIOKAnGF1dG9jb21wbGV0ZeKAnS5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2Yg4oCccmVzdG9yZeKAnSwgc3RhdGUgaXMgYSBzdHJpbmcsIEZpbGUsIG9yIEZvcm1EYXRhIG9iamVjdFxuICAgICAqICBwcmV2aW91c2x5IHNldCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldEZvcm1WYWx1ZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgbG9naWMgd2hpY2ggaXMgYmVpbmcgZXhlY3V0ZWQgd2hlbiB1c2VyXG4gICAgICogaW50ZXJhY3Rpb24gaGFwcGVucyBhbmQgc3RhdGUgaXMgbm90IGRpc2FibGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUsIGAke3RoaXMuY2hlY2tlZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRyaWdnZXJlZCBvbiBrZXlib2FyZCB1c2VyIGludGVyYWN0aW9uIHdpdGggY2hlY2tib3guICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZVVzZXJJbnRlcmFjdGlvbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogTWV0aG9kIHRyaWdnZXJlZCBvbiB1c2VyIGludGVyYWN0aW9uIHdpdGggY2hlY2tib3guICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlVXNlckludGVyYWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy53aXRoVXNlckludGVyYWN0aW9uPy4oKTtcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IElucHV0RXZlbnQoJ2lucHV0JywgeyBjb21wb3NlZDogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveEVsZW1lbnQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgeyBpc1NlcnZlciwgdHlwZSBMaXRFbGVtZW50LCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4LCBpbnRlcmFjdGl2aXR5Q2hlY2tlciwgaXNBcnJvd0tleVByZXNzZWQgfSBmcm9tICcuLi9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJy4uL2NvbnRyb2xsZXJzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHsgU2JiRGlzYWJsZWRNaXhpbiwgdHlwZSBTYmJEaXNhYmxlZE1peGluVHlwZSB9IGZyb20gJy4vZGlzYWJsZWQtbWl4aW4uanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICB0eXBlIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlLFxufSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5pbXBvcnQgeyBTYmJSZXF1aXJlZE1peGluLCB0eXBlIFNiYlJlcXVpcmVkTWl4aW5UeXBlIH0gZnJvbSAnLi9yZXF1aXJlZC1taXhpbi5qcyc7XG5cbi8qKlxuICogQSBzdGF0aWMgcmVnaXN0cnkgdGhhdCBob2xkcyBhIGNvbGxlY3Rpb24gb2YgZ3JvdXBlZCBgcmFkaW8tYnV0dG9uc2AuXG4gKiBHcm91cHMgb2YgcmFkaW8gYnV0dG9ucyBhcmUgbG9jYWwgdG8gdGhlIGZvcm0gdGhleSBiZWxvbmcgKG9yIHRoZSBgcmVuZGVyUm9vdGAgaWYgdGhleSdyZSBub3QgcGFydCBvZiBhbnkgZm9ybSlcbiAqIE11bHRpcGxlIGdyb3VwcyBvZiByYWRpbyB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGNvZXhpc3QgKGFzIGxvbmcgYXMgdGhleSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgZm9ybSAvIHJlbmRlclJvb3QpXG4gKiBJdCBpcyBtYWlubHkgdXNlZCB0byBzdXBwb3J0IHRoZSBzdGFuZGFsb25lIGdyb3VwcyBvZiByYWRpb3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHJhZGlvQnV0dG9uUmVnaXN0cnkgPSBuZXcgV2Vha01hcDxcbiAgTm9kZSxcbiAgTWFwPHN0cmluZywgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+PlxuPigpO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlXG4gIGV4dGVuZHMgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGVcbiAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiwgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT5cbntcbiAgcHVibGljIGFjY2Vzc29yIGNoZWNrZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcHVibGljIGFjY2Vzc29yIHJlcXVpcmVkOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhc3NvY2lhdGVkUmFkaW9CdXR0b25zPzogU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+O1xuICAvKiogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseS4gKi9cbiAgcHJvdGVjdGVkIGFib3J0OiBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXI7XG5cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLCByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCB1cGRhdGVGb2N1c2FibGVSYWRpb3MoKTogdm9pZDtcbiAgcHJvdGVjdGVkIGVtaXRDaGFuZ2VFdmVudHMoKTogdm9pZDtcbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlLZXlib2FyZChyYWRpbzogU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZSk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogVGhlIFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIHJhZGlvIGNvbnRyb2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudFxuICAgIGV4dGVuZHMgU2JiRGlzYWJsZWRNaXhpbihTYmJSZXF1aXJlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oc3VwZXJDbGFzcykpKVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPlxuICB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIGNoZWNrZWQuXG4gICAgICovXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fY2hlY2tlZCA9ICEhdmFsdWU7XG5cbiAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWNoZWNrZWQnLCB0aGlzLmNoZWNrZWQpO1xuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSB0aGlzLmNoZWNrZWQudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICAgfVxuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlci5uYW1lID0gdmFsdWU7XG5cbiAgICAgIHRoaXMuX2Rpc2Nvbm5lY3RGcm9tUmVnaXN0cnkoKTtcbiAgICAgIHRoaXMuX2Nvbm5lY3RUb1JlZ2lzdHJ5KCk7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTtcbiAgICB9XG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gc3VwZXIubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIHR5cGUgb2YgZWxlbWVudC5cbiAgICAgKiBAZGVmYXVsdCAncmFkaW8nXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ3JhZGlvJztcbiAgICB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseS4gKi9cbiAgICBwcm90ZWN0ZWQgYWJvcnQgPSBuZXcgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyKHRoaXMpO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIHJhZGlvIGJ1dHRvbnMgdGhhdCBiZWxvbmdzIHRvIHRoZSBzYW1lIGdyb3VwIG9mIGB0aGlzYC5cbiAgICAgKiBBc3N1bWUgdGhlbSBvcmRlcmVkIGluIERPTSBvcmRlclxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3NvY2lhdGVkUmFkaW9CdXR0b25zPzogU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50PjtcbiAgICBwcml2YXRlIF9yYWRpb0J1dHRvbkdyb3Vwc01hcD86IE1hcDxzdHJpbmcsIFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPj47XG4gICAgcHJpdmF0ZSBfZGlkTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgIHRoaXMuaW50ZXJuYWxzLnJvbGUgPSAncmFkaW8nO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlQXJyb3dLZXlEb3duKGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5fY29ubmVjdFRvUmVnaXN0cnkoKTtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplR3JvdXBTdGF0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLl9kaXNjb25uZWN0RnJvbVJlZ2lzdHJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMuaGFzQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIENhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byByZXN0b3JlIGVsZW1lbnTigJlzIHN0YXRlIHRvIHN0YXRlIGluIHdoaWNoIGNhc2VcbiAgICAgKiAgcmVhc29uIGlzIOKAnHJlc3RvcmXigJ0sIG9yIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGZ1bGZpbGwgYXV0b2ZpbGwgb24gYmVoYWxmIG9mXG4gICAgICogIHVzZXIgaW4gd2hpY2ggY2FzZSByZWFzb24gaXMg4oCcYXV0b2NvbXBsZXRl4oCdLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICB0aGlzLl9kaWRMb2FkID0gdHJ1ZTtcbiAgICAgIHRoaXMudXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIG9uIGB2YWx1ZWAgY2hhbmdlXG4gICAgICogSWYgJ2NoZWNrZWQnLCB1cGRhdGUgdGhlIHZhbHVlLiBPdGhlcndpc2UsIGRvIG5vdGhpbmcuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ubHkgYSBzaW5nbGUgcmFkaW8gc2hvdWxkIGJlIGZvY3VzYWJsZSBpbiB0aGUgZ3JvdXAuIERlZmluZWQgYXM6XG4gICAgICogLSB0aGUgY2hlY2tlZCByYWRpbztcbiAgICAgKiAtIHRoZSBmaXJzdCBub24tZGlzYWJsZWQgcmFkaW8gaW4gRE9NIG9yZGVyO1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVGb2N1c2FibGVSYWRpb3MoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuX2RpZExvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmFkaW9zID0gdGhpcy5faW50ZXJhY3RhYmxlR3JvdXBlZFJhZGlvcygpO1xuICAgICAgY29uc3QgY2hlY2tlZEluZGV4ID0gcmFkaW9zLmZpbmRJbmRleCgocikgPT4gci5jaGVja2VkICYmICFyLmRpc2FibGVkICYmICFyLmZvcm1EaXNhYmxlZCk7XG4gICAgICBjb25zdCBmb2N1c2FibGVJbmRleCA9XG4gICAgICAgIGNoZWNrZWRJbmRleCAhPT0gLTFcbiAgICAgICAgICA/IGNoZWNrZWRJbmRleFxuICAgICAgICAgIDogcmFkaW9zLmZpbmRJbmRleCgocikgPT4gIXIuZGlzYWJsZWQgJiYgIXIuZm9ybURpc2FibGVkKTsgLy8gR2V0IHRoZSBmaXJzdCBmb2N1c2FibGUgcmFkaW9cblxuICAgICAgaWYgKGZvY3VzYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICByYWRpb3NbZm9jdXNhYmxlSW5kZXhdLnRhYkluZGV4ID0gMDtcbiAgICAgICAgcmFkaW9zLnNwbGljZShmb2N1c2FibGVJbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHRhYkluZGV4IG9uIG90aGVyIHJhZGlvc1xuICAgICAgcmFkaW9zLmZvckVhY2goKHIpID0+IHIucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbmF2aWdhdGVCeUtleWJvYXJkKG5leHQ6IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBuZXh0LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnRzKCk7XG5cbiAgICAgIGF3YWl0IG5leHQudXBkYXRlQ29tcGxldGU7XG4gICAgICBuZXh0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRDaGFuZ2VFdmVudHMoKTogdm9pZCB7XG4gICAgICAvLyBNYW51YWxseSBkaXNwYXRjaCBldmVudHMgdG8gc2ltdWxhdGUgYSB1c2VyIGludGVyYWN0aW9uXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2Rlc2VsZWN0R3JvdXBlZFJhZGlvcygpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYHRoaXNgIHRvIHRoZSByYWRpb0J1dHRvbiByZWdpc3RyeVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nvbm5lY3RUb1JlZ2lzdHJ5KCk6IHZvaWQge1xuICAgICAgaWYgKCF0aGlzLm5hbWUgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb290ID0gdGhpcy5mb3JtID8/IHRoaXMuZ2V0Um9vdE5vZGUoKTtcbiAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gcmFkaW9CdXR0b25SZWdpc3RyeS5nZXQocm9vdCk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlICdyb290JyBtYXAgZW50cnlcbiAgICAgIGlmICghdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXApIHtcbiAgICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJhZGlvQnV0dG9uUmVnaXN0cnkuc2V0KHJvb3QsIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID0gdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAuZ2V0KFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICApIGFzIHVua25vd24gYXMgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50PjtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgc2V0XG4gICAgICBpZiAoIXRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucykge1xuICAgICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwLnNldChcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zIGFzIHVua25vd24gYXMgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbnNlcnQgdGhlIG5ldyByYWRpbyBpbnRvIHRoZSBzZXQgYW5kIHNvcnQgZm9sbG93aW5nIHRoZSBET00gb3JkZXIuXG4gICAgICAvLyBTaW5jZSB0aGUgb3JkZXIgb2YgYSAnU2V0JyBpcyB0aGUgaW5zZXJ0IG9yZGVyLCB3ZSBoYXZlIHRvIGVtcHR5IGl0IGFuZCByZS1pbnNlcnQgcmFkaW9zIGluIG9yZGVyXG4gICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMpO1xuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zLmNsZWFyKCk7XG5cbiAgICAgIC8vIEZpbmQgYHRoaXNgIHBvc2l0aW9uIGFuZCBpbnNlcnQgaXRcbiAgICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoXG4gICAgICAgIChyKSA9PiB0aGlzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcsXG4gICAgICApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMCwgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyaWVzLnB1c2godGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcG9wdWxhdGUgdGhlIFNldFxuICAgICAgZW50cmllcy5mb3JFYWNoKChyKSA9PiB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMhLmFkZChyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGB0aGlzYCBmcm9tIHRoZSByYWRpb0J1dHRvbiByZWdpc3RyeSBhbmQsIGlmIHRoZSBncm91cCBpcyBlbXB0eSwgZGVsZXRlIHRoZSBlbnRyeSBmcm9tIHRoZSBncm91cHMgTWFwXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGlzY29ubmVjdEZyb21SZWdpc3RyeSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz8uZGVsZXRlKHRoaXMpO1xuXG4gICAgICBpZiAodGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zPy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwPy5kZWxldGUodGhpcy5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBvZiAnaW50ZXJhY3RhYmxlJyBncm91cGVkIHJhZGlvcywgb3JkZXJlZCBpbiBET00gb3JkZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9pbnRlcmFjdGFibGVHcm91cGVkUmFkaW9zKCk6IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50W10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID8/IFtdKS5maWx0ZXIoKGVsKSA9PlxuICAgICAgICBpbnRlcmFjdGl2aXR5Q2hlY2tlci5pc1Zpc2libGUoZWwpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBvdGhlciByYWRpbyBvZiB0aGUgc2FtZSBncm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgX2Rlc2VsZWN0R3JvdXBlZFJhZGlvcygpOiB2b2lkIHtcbiAgICAgIEFycmF5LmZyb20odGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChyKSA9PiByICE9PSB0aGlzKVxuICAgICAgICAuZm9yRWFjaCgocikgPT4gKHIuY2hlY2tlZCA9IGZhbHNlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlQXJyb3dLZXlEb3duKGV2dDogS2V5Ym9hcmRFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKCFpc0Fycm93S2V5UHJlc3NlZChldnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBlbmFibGVkUmFkaW9zID0gdGhpcy5faW50ZXJhY3RhYmxlR3JvdXBlZFJhZGlvcygpLmZpbHRlcihcbiAgICAgICAgKHIpID0+ICFyLmRpc2FibGVkICYmICFyLmZvcm1EaXNhYmxlZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50OiBudW1iZXIgPSBlbmFibGVkUmFkaW9zLmluZGV4T2YodGhpcyk7XG4gICAgICBjb25zdCBuZXh0SW5kZXg6IG51bWJlciA9IGdldE5leHRFbGVtZW50SW5kZXgoZXZ0LCBjdXJyZW50LCBlbmFibGVkUmFkaW9zLmxlbmd0aCk7XG5cbiAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGVCeUtleWJvYXJkKGVuYWJsZWRSYWRpb3NbbmV4dEluZGV4XSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG4vLyBEZWZpbmUgdGhlIGludGVyZmFjZSBmb3IgdGhlIG1peGluXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJIeWRyYXRpb25NaXhpblR5cGUge1xuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgaHlkcmF0aW9uLlxuICAgKiBUaGUgUHJvbWlzZSB2YWx1ZSBpcyBhIGJvb2xlYW4gdGhhdCBpcyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZWQgaHlkcmF0aW9uXG4gICAqIGFuZCBgZmFsc2VgIGlmIG5vdC5cbiAgICpcbiAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBvbmNlIHRoZSBoeWRyYXRpb24gY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBoeWRyYXRpb25Db21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgaHlkcmF0aW9uIGlzIHJlcXVpcmVkIGFuZCBub3QgY29tcGxldGVkLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGh5ZHJhdGlvblJlcXVpcmVkKCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhpcyBtaXhpbiBleHRlbmRzIGEgYmFzZSBjbGFzcyB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgaWYgaHlkcmF0aW9uIGlzIGNvbXBsZXRlZC5cbiAqIEl0IGFsc28gZGVsYXlzIHNsb3RjaGFuZ2UgZXZlbnRzIHVudGlsIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAcGFyYW0gYmFzZSBUaGUgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHJldHVybnMgQSBjbGFzcyBleHRlbmRlZCB3aXRoIHRoZSBoeWRyYXRpb24gY2hlY2sgZnVuY3Rpb25hbGl0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkh5ZHJhdGlvbk1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgYmFzZTogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiSHlkcmF0aW9uTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJIeWRyYXRpb25NaXhpbkNsYXNzIGV4dGVuZHMgYmFzZSBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiSHlkcmF0aW9uTWl4aW5UeXBlPiB7XG4gICAgcHJpdmF0ZSBfaHlkcmF0aW9uUmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfaHlkcmF0aW9uQ29tcGxldGUgPSBuZXcgUHJvbWlzZTxib29sZWFuPihcbiAgICAgIChyZXNvbHZlKSA9PiAodGhpcy5fcmVzb2x2ZUh5ZHJhdGlvbiA9IHJlc29sdmUpLFxuICAgICk7XG4gICAgcHJpdmF0ZSBfcmVzb2x2ZUh5ZHJhdGlvbiE6IChoeWRyYXRpb25SZXF1aXJlZDogYm9vbGVhbikgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBoYXMgY29tcGxldGVkIGh5ZHJhdGlvbi5cbiAgICAgKiBUaGUgUHJvbWlzZSB2YWx1ZSBpcyBhIGJvb2xlYW4gdGhhdCBpcyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZWQgaHlkcmF0aW9uXG4gICAgICogYW5kIGBmYWxzZWAgaWYgbm90LlxuICAgICAqXG4gICAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBvbmNlIHRoZSBoeWRyYXRpb24gY29tcGxldGVkLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaHlkcmF0aW9uQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICByZXR1cm4gdGhpcy5faHlkcmF0aW9uQ29tcGxldGU7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgd2hldGhlciBoeWRyYXRpb24gaXMgcmVxdWlyZWQgYW5kIG5vdCBjb21wbGV0ZWQuICovXG4gICAgcHJvdGVjdGVkIGdldCBoeWRyYXRpb25SZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9oeWRyYXRpb25SZXF1aXJlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciBoeWRyYXRpb24gaXMgbmVlZGVkIGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNoYWRvdyByb290XG4gICAgICAvLyBpcyBhdmFpbGFibGUgZHVyaW5nIGNvbnN0cnVjdGlvbi91cGdyYWRlIHBoYXNlLlxuICAgICAgdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQgPSAhIXRoaXMuc2hhZG93Um9vdDtcbiAgICAgIGlmICghdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUh5ZHJhdGlvbihmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uIHBoYXNlLCB3ZSB3YW50IHRvIHN1cHByZXNzIHNsb3RjaGFuZ2UgZXZlbnRzIGFzIHRoZXlcbiAgICAgICAgLy8gY2FuIGNhdXNlIHJlbmRlciBkaWZmZXJlbmNlcywgd2hpY2ggd291bGQgYnJlYWsgaHlkcmF0aW9uLiBBZnRlclxuICAgICAgICAvLyBoeWRyYXRpb24gaXMgY29tcGxldGUsIHdlIGRpc3BhdGNoIGEgbWFudWFsIHNsb3RjaGFuZ2UgZXZlbnQsIGlmIHRoZXJlXG4gICAgICAgIC8vIGFyZSBlbGVtZW50cyBhc3NpZ25lZCB0byBhIHNsb3QuXG4gICAgICAgIGNvbnN0IHN1cHByZXNzU2xvdGNoYW5nZUV2ZW50ID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBldmVudE9wdGlvbnM6IEV2ZW50TGlzdGVuZXJPcHRpb25zID0geyBjYXB0dXJlOiB0cnVlIH07XG4gICAgICAgIGNvbnN0IHNsb3RzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yQWxsKCdzbG90Jyk7XG4gICAgICAgIGlmIChzbG90cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgc2xvdHMuZm9yRWFjaCgoc2xvdCkgPT5cbiAgICAgICAgICAgIHNsb3QuYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHN1cHByZXNzU2xvdGNoYW5nZUV2ZW50LCBldmVudE9wdGlvbnMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5oeWRyYXRpb25Db21wbGV0ZS50aGVuKCgpID0+XG4gICAgICAgICAgICBzbG90cy5mb3JFYWNoKChzbG90KSA9PiB7XG4gICAgICAgICAgICAgIHNsb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHN1cHByZXNzU2xvdGNoYW5nZUV2ZW50LCBldmVudE9wdGlvbnMpO1xuICAgICAgICAgICAgICBpZiAoc2xvdC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2xvdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnc2xvdGNoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgLy8gV2hlbiBoeWRyYXRpb24gaXMgbmVlZGVkLCB3ZSB3YWl0IHRoZSBoeWRyYXRpb24gcHJvY2VzcyB0byBmaW5pc2gsIHdoaWNoIGlzIHBhdGNoZWRcbiAgICAgIC8vIGludG8gdGhlIHVwZGF0ZSBtZXRob2Qgb2YgdGhlIExpdEVsZW1lbnQgYmFzZSBjbGFzcy5cbiAgICAgIHN1cGVyLnVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAgIGlmICh0aGlzLl9oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgICB0aGlzLl9oeWRyYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZXNvbHZlSHlkcmF0aW9uKHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiSHlkcmF0aW9uTWl4aW5DbGFzcyBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiSHlkcmF0aW9uTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHsgaHRtbCwgdHlwZSBMaXRFbGVtZW50LCBub3RoaW5nLCB0eXBlIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB7IFNiYkh5ZHJhdGlvbk1peGluLCB0eXBlIFNiYkh5ZHJhdGlvbk1peGluVHlwZSB9IGZyb20gJy4vaHlkcmF0aW9uLW1peGluLmpzJztcblxuaW1wb3J0ICcuLi8uLi9zY3JlZW4tcmVhZGVyLW9ubHkuanMnO1xuXG5jb25zdCBTU1JfQ0hJTERfQ09VTlRfQVRUUklCVVRFID0gJ2RhdGEtc3NyLWNoaWxkLWNvdW50JztcbmNvbnN0IFNMT1ROQU1FX1BSRUZJWCA9ICdsaSc7XG5cbmV4cG9ydCB0eXBlIFNiYk5hbWVkU2xvdFByb3BlcnRpZXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXJpYUhpZGRlbjogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogSGVscGVyIHR5cGUgZm9yIHdpbGxVcGRhdGUgb3Igc2ltaWxhciBjaGVja3MuXG4gKiBBbGxvd3MgdGhlIHVzYWdlIG9mIHRoZSBzdHJpbmcgbGl0ZXJhbCAnbGlzdENoaWxkcmVuJy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPFdpdGhMaXN0Q2hpbGRyZW48dGhpcz4+KTogdm9pZCB7XG4gKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xpc3RDaGlsZHJlbicpKSB7XG4gKiAgICAgLi4uXG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IHR5cGUgV2l0aExpc3RDaGlsZHJlbjxcbiAgVCBleHRlbmRzIFNiYk5hbWVkU2xvdExpc3RNaXhpblR5cGU8Qz4sXG4gIEMgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50LFxuPiA9IFQgJiB7IGxpc3RDaGlsZHJlbjogQ1tdIH07XG5cbmV4cG9ydCBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIFNiYk5hbWVkU2xvdExpc3RNaXhpblR5cGU8XG4gIEMgZXh0ZW5kcyBIVE1MRWxlbWVudCxcbj4gZXh0ZW5kcyBTYmJIeWRyYXRpb25NaXhpblR5cGUge1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgbGlzdENoaWxkTG9jYWxOYW1lczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBhY2Nlc3NvciBsaXN0Q2hpbGRyZW46IENbXTtcbiAgcHJvdGVjdGVkIHJlbmRlckxpc3QoXG4gICAgYXR0cmlidXRlcz86IHtcbiAgICAgIGNsYXNzPzogc3RyaW5nO1xuICAgICAgYXJpYUxhYmVsPzogc3RyaW5nO1xuICAgICAgYXJpYUxhYmVsbGVkYnk/OiBzdHJpbmc7XG4gICAgfSxcbiAgICBsaXN0SXRlbUF0dHJpYnV0ZXM/OiB7XG4gICAgICBsb2NhbE5hbWVWaXN1YWxPbmx5Pzogc3RyaW5nW107XG4gICAgfSxcbiAgKTogVGVtcGxhdGVSZXN1bHQ7XG4gIHByb3RlY3RlZCBsaXN0U2xvdEVudHJpZXMoKTogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdO1xuICBwcm90ZWN0ZWQgcmVuZGVySGlkZGVuU2xvdCgpOiBUZW1wbGF0ZVJlc3VsdDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYk5hbWVkU2xvdExpc3RNaXhpbiA9IDxcbiAgQyBleHRlbmRzIEhUTUxFbGVtZW50LFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5hbWVkU2xvdExpc3RNaXhpblR5cGU8Qz4+ICYgVCA9PiB7XG4gIC8qKlxuICAgKiBUaGlzIGJhc2UgY2xhc3MgcHJvdmlkZXMgbmFtZWQgc2xvdCBsaXN0IG9ic2VydmVyIGZ1bmN0aW9uYWxpdHkuXG4gICAqIFRoaXMgYWxsb3dzIHVzaW5nIHRoZSBwYXR0ZXJuIG9mIHJlbmRlcmluZyBhIG5hbWVkIHNsb3QgZm9yIGVhY2ggY2hpbGQsIHdoaWNoIGFsbG93c1xuICAgKiB3cmFwcGluZyBjaGlsZHJlbiBpbiBhbiB1bC9saSBsaXN0LlxuICAgKi9cbiAgYWJzdHJhY3QgY2xhc3MgTmFtZWRTbG90TGlzdEVsZW1lbnQ8QyBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gICAgZXh0ZW5kcyBTYmJIeWRyYXRpb25NaXhpbihzdXBlckNsYXNzKVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PlxuICB7XG4gICAgLyoqIEEgbGlzdCBvZiBsb3dlci1jYXNlZCB0YWcgbmFtZXMgdG8gbWF0Y2ggYWdhaW5zdC4gKGUuZy4gYHNiYi1saW5rYCkgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgbGlzdENoaWxkTG9jYWxOYW1lczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZGVmaW5lZCB0YWcgbmFtZXMuXG4gICAgICogVGhpcyBhcnJheSBpcyBvbmx5IHVwZGF0ZWQgaWYgdGhlcmUgaXMgYW4gYWN0dWFsIGNoYW5nZVxuICAgICAqIHRvIHRoZSBjaGlsZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgbGlzdENoaWxkcmVuOiBDW10gPSBbXTtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9oYW5kbGVTbG90Y2hhbmdlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuc2hhZG93Um9vdD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2hhbmRsZVNsb3RjaGFuZ2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVNsb3RjaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBsaXN0Q2hpbGRyZW4gPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gPz8gW10pLmZpbHRlcigoZSk6IGUgaXMgQyA9PlxuICAgICAgICB0aGlzLmxpc3RDaGlsZExvY2FsTmFtZXMuaW5jbHVkZXMoZS5sb2NhbE5hbWUpLFxuICAgICAgKTtcbiAgICAgIC8vIElmIHRoZSBzbG90dGVkIGNoaWxkIGluc3RhbmNlcyBoYXZlIG5vdCBjaGFuZ2VkLCB3ZSBjYW4gc2tpcCBzeW5jaW5nIGFuZCB1cGRhdGluZ1xuICAgICAgLy8gdGhlIGxpbmsgcmVmZXJlbmNlIGxpc3QuXG4gICAgICBpZiAoXG4gICAgICAgIGxpc3RDaGlsZHJlbi5sZW5ndGggPT09IHRoaXMubGlzdENoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICB0aGlzLmxpc3RDaGlsZHJlbi5ldmVyeSgoZSwgaSkgPT4gbGlzdENoaWxkcmVuW2ldID09PSBlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0Q2hpbGRyZW5cbiAgICAgICAgLmZpbHRlcigoYykgPT4gIWxpc3RDaGlsZHJlbi5pbmNsdWRlcyhjKSlcbiAgICAgICAgLmZvckVhY2goKGMpID0+IGMucmVtb3ZlQXR0cmlidXRlKCdzbG90JykpO1xuICAgICAgdGhpcy5saXN0Q2hpbGRyZW4gPSBsaXN0Q2hpbGRyZW47XG4gICAgICB0aGlzLmxpc3RDaGlsZHJlbi5mb3JFYWNoKChjLCBpbmRleCkgPT5cbiAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCBgJHtTTE9UTkFNRV9QUkVGSVh9LSR7aW5kZXh9YCksXG4gICAgICApO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIHNzciBhdHRyaWJ1dGUsIG9uY2Ugd2UgaGF2ZSBhY3R1YWxseSBpbml0aWFsaXplZCB0aGUgY2hpbGRyZW4gZWxlbWVudHMuXG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShTU1JfQ0hJTERfQ09VTlRfQVRUUklCVVRFKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBsaXN0IGFuZCBsaXN0IHNsb3RzIGZvciBzbG90dGVkIGNoaWxkcmVuIG9yIGEgbnVtYmVyIG9mIGxpc3Qgc2xvdHNcbiAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBgZGF0YS1zc3ItY2hpbGQtY291bnRgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYSBwb3NzaWJsZSBvcHRpbWl6YXRpb24gZm9yIFNTUiwgYXMgaW4gYW4gU1NSIExpdCBlbnZpcm9ubWVudFxuICAgICAqIG90aGVyIGVsZW1lbnRzIGFyZSBub3QgYXZhaWxhYmxlLCBidXQgbWlnaHQgYmUgYXZhaWxhYmxlIGluIHRoZSBtZXRhXG4gICAgICogZnJhbWV3b3JrIHdyYXBwZXIgKGxpa2UgZS5nLiBSZWFjdCkuIFRoaXMgYWxsb3dzIHRvIHByb3ZpZGUgdGhlIG51bWJlciBvZlxuICAgICAqIGNoaWxkcmVuIHRvIGJlIHBhc3NlZCB2aWEgdGhlIGBkYXRhLXNzci1jaGlsZC1jb3VudGAgYXR0cmlidXRlIHZhbHVlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJMaXN0KFxuICAgICAgYXR0cmlidXRlczogeyBjbGFzcz86IHN0cmluZzsgYXJpYUxhYmVsPzogc3RyaW5nOyBhcmlhTGFiZWxsZWRieT86IHN0cmluZyB9ID0ge30sXG4gICAgICBsaXN0SXRlbUF0dHJpYnV0ZXM6IHsgbG9jYWxOYW1lVmlzdWFsT25seT86IHN0cmluZ1tdIH0gPSB7fSxcbiAgICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgICBjb25zdCBsaXN0U2xvdE5hbWVzOiBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzW10gPSB0aGlzLmxpc3RTbG90RW50cmllcyhsaXN0SXRlbUF0dHJpYnV0ZXMpO1xuXG4gICAgICBpZiAobGlzdFNsb3ROYW1lcy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPSR7YXR0cmlidXRlcy5jbGFzcyB8fCB0aGlzLmxvY2FsTmFtZX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9JHthdHRyaWJ1dGVzLmFyaWFMYWJlbCB8fCBub3RoaW5nfVxuICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PSR7YXR0cmlidXRlcy5hcmlhTGFiZWxsZWRieSB8fCBub3RoaW5nfVxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7bGlzdFNsb3ROYW1lcy5tYXAoXG4gICAgICAgICAgICAgIChzbG90KSA9PiBodG1sYFxuICAgICAgICAgICAgICAgIDxsaSBhcmlhLWhpZGRlbj0ke3Nsb3QuYXJpYUhpZGRlbiB8fCBub3RoaW5nfT5cbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9JHtzbG90Lm5hbWV9Pjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICBgLFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICAgICR7dGhpcy5yZW5kZXJIaWRkZW5TbG90KCl9XG4gICAgICAgIGA7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RTbG90TmFtZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBodG1sYDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7YXR0cmlidXRlcy5hcmlhTGFiZWx9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPSR7YXR0cmlidXRlcy5jbGFzcyB8fCB0aGlzLmxvY2FsTmFtZX0+XG4gICAgICAgICAgICA8c3Bhbj48c2xvdCBuYW1lPSR7bGlzdFNsb3ROYW1lc1swXS5uYW1lfT48L3Nsb3Q+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAke3RoaXMucmVuZGVySGlkZGVuU2xvdCgpfSBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGlkZGVuU2xvdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgU2JiTmFtZWRTbG90UHJvcGVydGllcywgd2hpY2ggaG9sZHMgdGhlIGxpc3Qgc2xvdCBuYW1lcyBhbmQgdGhlIGhpZGRlbiBwcm9wZXJ0eTtcbiAgICAgKiBpdHMgbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZSBudW1iZXIgb2YgbWF0Y2hlZCBjaGlsZHJlbiBvciB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgcG9zc2libGUgb3B0aW1pemF0aW9uIGZvciBTU1IsIGFzIGluIGFuIFNTUiBMaXQgZW52aXJvbm1lbnRcbiAgICAgKiBvdGhlciBlbGVtZW50cyBhcmUgbm90IGF2YWlsYWJsZSwgYnV0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbWV0YVxuICAgICAqIGZyYW1ld29yayB3cmFwcGVyIChsaWtlIGUuZy4gUmVhY3QpLiBUaGlzIGFsbG93cyB0byBwcm92aWRlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBjaGlsZHJlbiB0byBiZSBwYXNzZWQgdmlhIHRoZSBgZGF0YS1zc3ItY2hpbGQtY291bnRgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbGlzdFNsb3RFbnRyaWVzKGxpc3RJdGVtQXR0cmlidXRlczoge1xuICAgICAgbG9jYWxOYW1lVmlzdWFsT25seT86IHN0cmluZ1tdO1xuICAgIH0pOiBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzW10ge1xuICAgICAgY29uc3QgbGlzdENoaWxkcmVuID0gdGhpcy5saXN0Q2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgID8gdGhpcy5saXN0Q2hpbGRyZW5cbiAgICAgICAgOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiArKHRoaXMuZ2V0QXR0cmlidXRlKFNTUl9DSElMRF9DT1VOVF9BVFRSSUJVVEUpID8/IDApIH0pO1xuICAgICAgcmV0dXJuIGxpc3RDaGlsZHJlbi5tYXAoKGUsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBgJHtTTE9UTkFNRV9QUkVGSVh9LSR7aX1gLFxuICAgICAgICAgIGFyaWFIaWRkZW46XG4gICAgICAgICAgICBsaXN0SXRlbUF0dHJpYnV0ZXM/LmxvY2FsTmFtZVZpc3VhbE9ubHk/LmluY2x1ZGVzKChlIGFzIEhUTUxFbGVtZW50KS5sb2NhbE5hbWUpID8/XG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBoaWRkZW4gc2xvdCwgd2hpY2ggaXMgaW50ZW5kZWQgYXMgdGhlIGNoaWxkcmVuIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICogV2hlbiBhbiBlbGVtZW50IHdpdGhvdXQgYSBzbG90IGF0dHJpYnV0ZSBpcyBzbG90dGVkIHRvIHRoZSBlbGVtZW50LCBpdCB0cmlnZ2Vyc1xuICAgICAqIHRoZSBzbG90Y2hhbmdlIGV2ZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBhc3NpZ24gaXQgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbWVkIHNsb3QuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbmRlckhpZGRlblNsb3QoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgICAgcmV0dXJuIGh0bWxgPHNwYW4gaGlkZGVuPjxzbG90Pjwvc2xvdD48L3NwYW4+YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTmFtZWRTbG90TGlzdEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5hbWVkU2xvdExpc3RNaXhpblR5cGU8Qz4+ICYgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uL2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiTmVnYXRpdmVNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgbmVnYXRpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgbmVnYXRpdmUgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJOZWdhdGl2ZU1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiTmVnYXRpdmVNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYk5lZ2F0aXZlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBTYmJOZWdhdGl2ZU1peGluVHlwZSB7XG4gICAgLyoqIE5lZ2F0aXZlIGNvbG9yaW5nIHZhcmlhbnQgZmxhZy4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIG5lZ2F0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gU2JiTmVnYXRpdmVFbGVtZW50IGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiTmVnYXRpdmVNaXhpblR5cGU+ICYgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vZXZlbnRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiUGFuZWxNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgY29sb3I6ICd3aGl0ZScgfCAnbWlsayc7XG4gIHB1YmxpYyBhY2Nlc3NvciBib3JkZXJsZXNzOiBib29sZWFuO1xuICBwdWJsaWMgYWNjZXNzb3IgZXhwYW5zaW9uU3RhdGU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2JiUGFuZWxTaXplID0gJ3MnIHwgJ20nO1xuXG4vKipcbiAqIE1peGluIGZvciBjb21tb24gcGFuZWwgYmVoYXZpb3JzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJQYW5lbE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiUGFuZWxNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYlBhbmVsRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBTYmJQYW5lbE1peGluVHlwZSB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgICBwYW5lbENvbm5lY3RlZDogJ3BhbmVsQ29ubmVjdGVkJyxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgLyoqIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBwYW5lbC4gKi9cbiAgICBAcHJvcGVydHkoKSBwdWJsaWMgYWNjZXNzb3IgY29sb3I6ICd3aGl0ZScgfCAnbWlsaycgPSAnd2hpdGUnO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHVuc2VsZWN0ZWQgcGFuZWwgaGFzIGEgYm9yZGVyLiAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgYm9yZGVybGVzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEBpbnRlcm5hbCB1c2VkIGZvciBhY2Nlc3NpYmlsaXR5IGxhYmVsIHdoZW4gaW4gZXhwYW5zaW9uIHBhbmVsICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgYWNjZXNzb3IgZXhwYW5zaW9uU3RhdGU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogSW50ZXJuYWwgZXZlbnQgdGhhdCBlbWl0cyB3aGVuIHRoZSBjaGVja2JveCBpcyBsb2FkZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcGFuZWxDb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgU2JiUGFuZWxFbGVtZW50LmV2ZW50cy5wYW5lbENvbm5lY3RlZCxcbiAgICAgIHsgYnViYmxlczogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLl9wYW5lbENvbm5lY3RlZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFNiYlBhbmVsRWxlbWVudCBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlBhbmVsTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbi8vIERlZmluZSB0aGUgaW50ZXJmYWNlIGZvciB0aGUgbWl4aW5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZSB7XG4gIHByb3RlY3RlZCBzdGFydFVwZGF0ZSgpOiB2b2lkO1xuICBwcm90ZWN0ZWQgY29tcGxldGVVcGRhdGUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGlzIG1peGluIGFsbG93cyBzY2hlZHVsaW5nIG1hbnVhbCB1cGRhdGVzLCB3aGljaCBhZmZlY3QgdXBkYXRlQ29tcGxldGUuXG4gKiBAcGFyYW0gYmFzZSBUaGUgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHJldHVybnMgQSBjbGFzcyBleHRlbmRlZCB3aXRoIHRoZSBzbG90IGNoaWxkIG9ic2VydmVyIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIGJhc2U6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiVXBkYXRlU2NoZWR1bGVyRWxlbWVudFxuICAgIGV4dGVuZHMgYmFzZVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGU+XG4gIHtcbiAgICBwcml2YXRlIF91cGRhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcHJpdmF0ZSBfdXBkYXRlUmVzb2x2ZSA9ICgpOiB2b2lkID0+IHt9O1xuXG4gICAgcHJvdGVjdGVkIHN0YXJ0VXBkYXRlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiAodGhpcy5fdXBkYXRlUmVzb2x2ZSA9IHIpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29tcGxldGVVcGRhdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl91cGRhdGVSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVByb21pc2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiVXBkYXRlU2NoZWR1bGVyRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iXSwibmFtZXMiOlsiX2EiLCJzdGF0ZSIsIlNiYlBhbmVsRWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBcUJhLE1BQUEsbUJBQW1CLENBQzlCLGVBQ2lEO01BQ2xDLHNCQUFrQixNQUFBOztzQkFBUzs7OztBQUEzQixXQUFBLG1CQUEyQixZQUFVO0FBQUE7O0FBS2xELHVEQUFBLGtCQUFBLE1BQUEsd0JBQW9DLEtBQUs7Ozs7TUFBekMsSUFBZ0IsV0FBMEI7QUFBQSxlQUFBLG1CQUFBO0FBQUEsTUFBQTtBQUFBLE1BQTFDLElBQWdCLFNBQTBCLE9BQUE7QUFBQSwyQkFBQSw0QkFBQTtBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BTWhDLHVCQUFvQjtBQUNyQixlQUFBO0FBQUEsTUFBQTtBQUFBLE9BUFQ7O0FBSEMsNkJBQUEsQ0FBQSxhQUNBLFNBQVMsRUFBRSxTQUFTLE1BQU0sTUFBTSxRQUFTLENBQUEsR0FDekMsWUFBWSxDQUFDLEdBQXVCLE1BQXdCLEtBQUssRUFBRSxxQkFBQSxDQUFzQixDQUFDO0FBQzNFLG1CQUFBLElBQUEsTUFBQSxzQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLFlBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsY0FBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEsVUFBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsWUFBQSxXQUEwQjtBQUFBLFdBQUEsVUFBQSxhQUFBLHdCQUFBLDJCQUFBOztVQUw3QjtBQUFBO0FBZ0JSLFNBQUE7QUFDVDtBQU1hLE1BQUEsOEJBQThCLENBR3pDLGVBQzREO01BQzdDLGlDQUE2QixNQUFBOztzQkFDbEM7Ozs7QUFESyxXQUFBLG1CQUNMLFlBQVU7QUFBQTs7QUFNbEIsa0VBQUEsa0JBQUEsTUFBQSxtQ0FBK0MsS0FBSzs7OztNQUFwRCxJQUFnQixzQkFBcUM7QUFBQSxlQUFBLG1CQUFBO0FBQUEsTUFBQTtBQUFBLE1BQXJELElBQWdCLG9CQUFxQyxPQUFBO0FBQUEsMkJBQUEsdUNBQUE7QUFBQSxNQUFBO0FBQUEsT0FBckQ7O0FBRkMsd0NBQUEsQ0FBQSxhQUNBLFNBQVMsRUFBRSxXQUFXLHdCQUF3QixNQUFNLFNBQVMsU0FBUyxLQUFNLENBQUEsQ0FBQztBQUM5RCxtQkFBQSxJQUFBLE1BQUEsaUNBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSx1QkFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSx5QkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEscUJBQUEsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFlBQUEsc0JBQXFDO0FBQUEsV0FBQSxVQUFBLGFBQUEsbUNBQUEsc0NBQUE7O1VBUHhDO0FBQUE7QUFVUixTQUFBO0FBRVQ7QUFHYSxNQUFBLGlDQUFpQyxDQUc1QyxlQUNtRjtBQUFBLEVBQ25GLE1BQWUsa0NBQ0wsNEJBQTRCLGlCQUFpQixVQUFVLENBQUMsRUFBQztBQUFBLElBRzlDLFdBQVcsbUJBQXVDO0FBQ25FLFlBQU0sV0FBVyxpQkFBaUI7QUFFOUIsVUFBQSxrQkFBa0IsSUFBSSxxQkFBcUIsR0FBRztBQUNoRCxhQUFLLFVBQVUsZUFBZSxLQUFLLHNCQUFzQixTQUFTO0FBQUEsTUFBQTtBQUdwRSxVQUFJLENBQUMsa0JBQWtCLElBQUksVUFBVSxHQUFHO0FBQ3RDO0FBQUEsTUFBQTtBQUdFLFVBQUEsQ0FBQyxLQUFLLFVBQVU7QUFDYixhQUFBLGFBQWEsWUFBWSxHQUFHO0FBQUEsTUFBQSxPQUM1QjtBQUNMLGFBQUssZ0JBQWdCLFVBQVU7QUFBQSxNQUFBO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBRUssU0FBQTtBQUlUO0FDOURhLE1BQUEseUJBQXlCLENBQ3BDLGVBQzBEO01BQzNDLDRCQUF3QixNQUFBOztzQkFDN0I7Ozs7Ozs7QUFESyxXQUFBLG1CQUNMLFlBQVU7QUFBQTs7QUE4RVQ7QUFuQ0QsYUFBQSxVQTVDSyxrQkFBQSxNQUFBLDBCQUFBLEdBNENjO0FBZ0NSLGFBQUEsWUFBOEIsS0FBSztBQUcxQiwyQkFBQSxnQ0FBQSxrQkFBQSxNQUFBLDRCQUF3QixLQUFLOzs7Ozs7TUF0RXpELElBQVcsT0FBSTtBQUNiLGVBQU8sS0FBSyxVQUFVO0FBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BVXhCLElBQVcsS0FBSyxNQUFZO0FBQzFCLGFBQUssYUFBYSxRQUFRLEdBQUcsSUFBSSxFQUFFO0FBR25DLGFBQUssZ0JBQWU7QUFBQSxNQUFBO0FBQUEsTUFFdEIsSUFBVyxPQUFJO0FBQ04sZUFBQSxLQUFLLGFBQWEsTUFBTSxLQUFLO0FBQUEsTUFBQTtBQUFBO0FBQUEsTUFJdEMsSUFBVyxPQUFJO0FBQ2IsZUFBTyxLQUFLO0FBQUEsTUFBQTtBQUFBO0FBQUEsTUFLZCxJQUFXLE1BQU0sT0FBZTtBQUM5QixhQUFLLFNBQVM7QUFDZCxhQUFLLGdCQUFlO0FBQUEsTUFBQTtBQUFBLE1BRXRCLElBQVcsUUFBSztBQUNkLGVBQU8sS0FBSztBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTZCxJQUFXLFdBQVE7QUFDakIsZUFBTyxLQUFLLFVBQVU7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTeEIsSUFBVyxvQkFBaUI7QUFDMUIsZUFBTyxLQUFLLFVBQVU7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTeEIsSUFBVyxlQUFZO0FBQ3JCLGVBQU8sS0FBSyxVQUFVO0FBQUEsTUFBQTtBQUFBO0FBQUEsTUFPZixJQUFtQixlQUE4QjtBQUFBLGVBQUEsbUJBQUE7QUFBQSxNQUFBO0FBQUEsTUFBakQsSUFBbUIsYUFBOEIsT0FBQTtBQUFBLDJCQUFBLGdDQUFBO0FBQUEsTUFBQTtBQUFBLE1BRTFDLHlCQUNkLE1BQ0EsS0FDQSxPQUFvQjtBQUVoQixZQUFBLFNBQVMsVUFBVSxRQUFRLE9BQU87QUFDOUIsZ0JBQUEseUJBQXlCLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFBQTtBQUFBLE1BQ2pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTSyxnQkFBYTtBQUNYLGVBQUEsS0FBSyxVQUFVOzs7Ozs7Ozs7TUFVakIsaUJBQWM7QUFDWixlQUFBLEtBQUssVUFBVTs7Ozs7Ozs7TUFpQmpCLHFCQUFxQixVQUFpQjtBQUluQyxnQkFBQSxVQUFVLEtBQUssTUFBSztBQUMxQixlQUFLLGVBQWU7QUFBQSxRQUFBLENBQ3JCO0FBQUEsTUFBQTtBQUFBLE9BckRNOztBQTVEUiw2QkFBQSxDQUFBLFVBQVU7QUFpQlYsOEJBQUEsQ0FBQSxVQUFVO0FBMkNWLGlDQUFBLENBQUEsT0FBTztBQTNEUixtQkFBQSxJQUFBLE1BQUEsc0JBQUEsRUFBQSxNQUFBLFVBQUEsTUFBQSxRQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLFVBQUEsS0FBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsWUFBVyxPQUtWO0FBQUEsV0FBQSxVQUFBLGFBQUEsTUFBQSwwQkFBQTtBQVlELG1CQUFBLElBQUEsTUFBQSx1QkFBQSxFQUFBLE1BQUEsVUFBQSxNQUFBLFNBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsV0FBQSxLQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxZQUFXLFFBR1Y7QUFBQSxXQUFBLFVBQUEsYUFBQSxNQUFBLDBCQUFBO0FBdUMyQixtQkFBQSxJQUFBLE1BQUEsMEJBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxnQkFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxrQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEsY0FBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsWUFBQSxlQUE4QjtBQUFBLFdBQUEsVUFBQSxhQUFBLDRCQUFBLCtCQUFBOztVQTNFNUMsR0FBYyxpQkFBRyxNQUpsQjtBQUFBO0FBbUtSLFNBQUE7QUFFVDtBQzdMYSxNQUFBLG1CQUFtQixDQUk5QixlQUNpRDtNQUNsQyxzQkFBa0IsTUFBQTs7c0JBQVM7OztBQUEzQixXQUFBLG1CQUEyQixZQUFVO0FBQUE7O0FBVzFDLGFBQUEsYUFYSyxrQkFBQSxNQUFBLDBCQUFBLEdBV2dCO0FBQUEsTUFBQTtBQUFBO0FBQUEsTUFSN0IsSUFBVyxTQUFTLE9BQWM7QUFHM0IsYUFBQSxZQUFZLFFBQVEsS0FBSztBQUFBLE1BQUE7QUFBQSxNQUVoQyxJQUFXLFdBQVE7QUFDVixlQUFBLEtBQUssYUFBYSxLQUFLOztNQUliLFdBQVcsbUJBQXVDO0FBQ25FLGNBQU0sV0FBVyxpQkFBaUI7QUFFOUIsWUFBQSxrQkFBa0IsSUFBSSxVQUFVLEdBQUc7QUFFckMsZUFBSyxVQUFVLGVBQWUsR0FBRyxLQUFLLFFBQVE7QUFBQSxRQUFBO0FBQUEsTUFDaEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT1EsdUJBQW9CO0FBQ3JCLGVBQUE7QUFBQSxNQUFBO0FBQUE7O2tDQXpCUixTQUFTLEVBQUUsU0FBUyxNQUFNLE1BQU0sUUFBQSxDQUFTLENBQUM7QUFDM0MsbUJBQUEsSUFBQSxNQUFBLDBCQUFBLEVBQUEsTUFBQSxVQUFBLE1BQUEsWUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxjQUFBLEtBQUEsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFlBQVcsV0FJVjtBQUFBLFdBQUEsVUFBQSxhQUFBLE1BQUEsMEJBQUE7O1VBUFk7QUFBQTtBQStCUixTQUFBO0FBQ1Q7QUNQYSxNQUFBLGlDQUFpQyxDQUM1QyxlQUN1RDtNQUl4QyxvQ0FBZ0MsTUFBQTs7QUFIOUMsUUFBQSxtQkFBQSxDQUFBLGVBQWU7QUFBQSxNQUNkLFVBQVU7QUFBQSxJQUFBLENBQ1gsQ0FBQzs7OztzQkFFUSxpQkFBaUIsaUJBQWlCLHVCQUF1QixVQUFVLENBQUMsQ0FBQzs7O0FBQTdFLElBQUEsbUJBQVEsWUFBc0U7QUFBQTtBQUFBLE1BaUI5RSxJQUFXLFFBQVEsT0FBYztBQUMvQixjQUFNLGtCQUNKLE9BQU8sVUFBVSxXQUFZLE1BQXdDLFlBQVk7QUFDbkYsWUFBSSxpQkFBaUI7QUFDbkIsa0JBQVMsTUFBd0M7QUFBQSxRQUFBO0FBSy9DLFlBQUEsS0FBSyxjQUFjLENBQUMsaUJBQWlCO0FBQ3ZDLGVBQUssNEJBQTRCO0FBQUEsUUFBQTtBQUU5QixhQUFBLFdBQVcsUUFBUSxLQUFLO0FBQzdCLGFBQUssZ0JBQWU7QUFBQSxNQUFBO0FBQUEsTUFFdEIsSUFBVyxVQUFPO0FBQ2hCLGVBQU8sS0FBSztBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BUWQsSUFBb0IsT0FBSTtBQUNmLGVBQUE7QUFBQSxNQUFBO0FBQUEsTUFHVCxjQUFBOzs7QUExQ1EsYUFBQSw2QkFKSyxrQkFBQSxNQUFBLDBCQUFBLEdBSXVCO0FBZ0M1QixhQUFRLFdBQVk7QUEwRXBCLGFBQUEsNkJBQTZCLENBQUMsVUFBOEI7QUFDOUQsY0FBQSxNQUFNLFFBQVEsS0FBSztBQUNyQixpQkFBSyx1QkFBc0I7QUFBQSxVQUFBO0FBQUEsUUFFL0I7QUFHUSxhQUFzQix5QkFBRyxNQUFXOztBQUMxQyxjQUFJLEtBQUssVUFBVTtBQUNqQjtBQUFBLFVBQUE7QUFFRixXQUFBQSxNQUFBLEtBQUssd0JBQUwsZ0JBQUFBLElBQUE7QUFDSyxlQUFBLFVBQVUsQ0FBQyxLQUFLO0FBQ3JCLGVBQUssNEJBQTRCO0FBRTVCLGVBQUEsY0FBYyxJQUFJLFdBQVcsU0FBUyxFQUFFLFVBQVUsTUFBTSxTQUFTLEtBQU0sQ0FBQSxDQUFDO0FBQ3hFLGVBQUEsY0FBYyxJQUFJLE1BQU0sVUFBVSxFQUFFLFNBQVMsS0FBQSxDQUFNLENBQUM7QUFBQSxRQUMzRDtBQTlFRSxhQUFLLFVBQVUsT0FBTztBQUVqQixTQUFBQSxNQUFBLEtBQUEscUJBQUEsZ0JBQUFBLElBQUEsV0FBbUIsU0FBUyxLQUFLO0FBQ2pDLG1CQUFBLHFCQUFBLDhCQUFtQixXQUFXO0FBQzlCLG1CQUFBLHFCQUFBLDhCQUFtQixTQUFTLEtBQUs7QUFBQSxNQUEwQjtBQUFBLE1BR2xELHlCQUNkLE1BQ0EsS0FDQSxPQUFvQjtBQUdwQixZQUFJLFNBQVMsYUFBYSxDQUFDLEtBQUssMkJBQTJCO0FBQ25ELGdCQUFBLHlCQUF5QixNQUFNLEtBQUssS0FBSztBQUFBLFFBQUE7QUFBQSxNQUNqRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVFjLG9CQUFpQjtBQUMxQixhQUFBLFVBQVUsS0FBSyxhQUFhLFNBQVM7QUFDMUMsYUFBSyw0QkFBNEI7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFZbkIseUJBQ2RDLFFBQ0EsU0FBMEI7QUFFMUIsWUFBSUEsUUFBTztBQUNULGVBQUssVUFBVUEsV0FBVTtBQUFBLFFBQUE7QUFBQSxNQUMzQjtBQUFBLE1BU2lCLGtCQUFlO0FBQ2hDLFlBQUksS0FBSyxTQUFTO0FBQ2hCLGVBQUssVUFBVSxhQUFhLEtBQUssT0FBTyxHQUFHLEtBQUssT0FBTyxFQUFFO0FBQUEsUUFBQSxPQUNwRDtBQUNBLGVBQUEsVUFBVSxhQUFhLElBQUk7QUFBQSxRQUFBO0FBQUEsTUFDbEM7QUFBQSxJQUNGOztBQXBHQyxnQ0FBQSxDQUFBLFNBQVM7QUFBQSxRQUNSLE1BQU07QUFBQSxRQUNOLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQTtBQUFBLFVBRUgsZUFBZSxDQUFDLE9BQXNCLFNBQXNDOztBQUMxRSxrQkFBTSxVQUFTLE1BQUFELE1BQUEsa0JBQWlCLGtCQUFqQix3QkFBQUEsS0FBaUMsT0FBTztBQUN2RCxtQkFBTyxFQUFFLE9BQU8sUUFBUSxXQUFXLEtBQUk7QUFBQSxVQUFBO0FBQUEsUUFDekM7QUFBQSxNQUNELENBQ0YsQ0FBQztBQUNGLG1CQUFBLElBQUEsTUFBQSx5QkFBQSxFQUFBLE1BQUEsVUFBQSxNQUFBLFdBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsYUFBQSxLQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxZQUFXLFVBY1Y7QUFBQSxXQUFBLFVBQUEsYUFBQSxNQUFBLDBCQUFBO0FBaENILG1CQWdJQyxNQUFBLG1CQUFBLEVBQUEsT0FBQSxXQUFBLEdBQUEsa0JBQUEsRUFBQSxNQUFBLFNBQUEsTUFBQSxXQUFBLE1BQUEsVUFBQSxVQUFBLEdBQUEsTUFBQSx1QkFBQTs7O0FBaEljLHdCQUFnQyxZQUFBLHVCQUFBO0FBQUEsSUFBQSxNQUM3Qzs7O0FBaUlLLFNBQUE7QUFFVDtBQ2pLYSxNQUFBLDBDQUEwQjtBQWlDMUIsTUFBQSxvQ0FBb0MsQ0FDL0MsZUFDMEQ7TUFDcEQsdUNBQW1DLE1BQUE7O3NCQUMvQixpQkFBaUIsaUJBQWlCLHVCQUF1QixVQUFVLENBQUMsQ0FBQzs7O0FBRHpFLFdBQUEsbUJBQ0ksWUFBc0U7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU85RSxJQUFXLFFBQVEsT0FBYztBQUMxQixhQUFBLFdBQVcsQ0FBQyxDQUFDO0FBRWIsYUFBQSxnQkFBZ0IsZ0JBQWdCLEtBQUssT0FBTztBQUNqRCxhQUFLLFVBQVUsY0FBYyxLQUFLLFFBQVEsU0FBUTtBQUNsRCxhQUFLLGdCQUFlO0FBQ3BCLGFBQUssdUJBQXNCO0FBQUEsTUFBQTtBQUFBLE1BRTdCLElBQVcsVUFBTztBQUNoQixlQUFPLEtBQUs7QUFBQSxNQUFBO0FBQUEsTUFJZCxJQUFvQixLQUFLLE9BQWE7QUFDcEMsY0FBTSxPQUFPO0FBRWIsYUFBSyx3QkFBdUI7QUFDNUIsYUFBSyxtQkFBa0I7QUFDdkIsYUFBSyx1QkFBc0I7QUFBQSxNQUFBO0FBQUEsTUFFN0IsSUFBb0IsT0FBSTtBQUN0QixlQUFPLE1BQU07QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9mLElBQW9CLE9BQUk7QUFDZixlQUFBO0FBQUEsTUFBQTtBQUFBLE1BY1QsY0FBQTs7O0FBaENRLGFBQUEsWUFuQkosa0JBQUEsTUFBQSwwQkFBQSxHQW1Cd0I7QUFzQmxCLGFBQUEsUUFBUSxJQUFJLDRCQUE0QixJQUFJO0FBUTlDLGFBQVEsV0FBWTtBQUsxQixhQUFLLFVBQVUsT0FBTztBQUN0QixTQUFBQSxNQUFBLEtBQUsscUJBQUwsZ0JBQUFBLElBQUEsV0FBd0IsV0FBVyxDQUFDLE1BQU0sS0FBSyxvQkFBb0IsQ0FBQztBQUFBLE1BQUM7QUFBQSxNQUd2RCxvQkFBaUI7QUFDL0IsY0FBTSxrQkFBaUI7QUFDdkIsYUFBSyxtQkFBa0I7QUFDdkIsYUFBSyx1QkFBc0I7QUFBQSxNQUFBO0FBQUEsTUFHYix1QkFBb0I7QUFDbEMsY0FBTSxxQkFBb0I7QUFDMUIsYUFBSyx3QkFBdUI7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9kLG9CQUFpQjtBQUMxQixhQUFBLFVBQVUsS0FBSyxhQUFhLFNBQVM7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTNUIseUJBQ2RDLFFBQ0EsU0FBMEI7QUFFMUIsWUFBSUEsUUFBTztBQUNKLGVBQUEsVUFBVUEsV0FBVSxLQUFLO0FBQUEsUUFBQTtBQUFBLE1BQ2hDO0FBQUEsTUFHaUIsV0FBVyxtQkFBdUM7QUFDbkUsY0FBTSxXQUFXLGlCQUFpQjtBQUU5QixZQUFBLGtCQUFrQixJQUFJLFVBQVUsR0FBRztBQUNyQyxlQUFLLHNCQUFxQjtBQUFBLFFBQUE7QUFBQSxNQUM1QjtBQUFBLE1BR2lCLGFBQWEsbUJBQXVDO0FBQ3JFLGNBQU0sYUFBYSxpQkFBaUI7QUFDcEMsYUFBSyxXQUFXO0FBQ2hCLGFBQUssc0JBQXFCO0FBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPVCxrQkFBZTtBQUNoQyxZQUFJLEtBQUssU0FBUztBQUNoQixlQUFLLFVBQVUsYUFBYSxLQUFLLE9BQU8sS0FBSyxLQUFLO0FBQUEsUUFBQSxPQUM3QztBQUNBLGVBQUEsVUFBVSxhQUFhLElBQUk7QUFBQSxRQUFBO0FBQUEsTUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFRUSx3QkFBcUI7QUFDekIsWUFBQSxDQUFDLEtBQUssVUFBVTtBQUNsQjtBQUFBLFFBQUE7QUFFSSxjQUFBLFNBQVMsS0FBSztBQUNwQixjQUFNLGVBQWUsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVk7QUFDeEYsY0FBTSxpQkFDSixpQkFBaUIsS0FDYixlQUNBLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVk7QUFFNUQsWUFBSSxtQkFBbUIsSUFBSTtBQUNsQixpQkFBQSxjQUFjLEVBQUUsV0FBVztBQUMzQixpQkFBQSxPQUFPLGdCQUFnQixDQUFDO0FBQUEsUUFBQTtBQUlqQyxlQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLFVBQVUsQ0FBQztBQUFBLE1BQUE7QUFBQSxNQUczQyxNQUFNLG1CQUFtQixNQUF5QztBQUMxRSxhQUFLLFVBQVU7QUFDZixhQUFLLGlCQUFnQjtBQUVyQixjQUFNLEtBQUs7QUFDWCxhQUFLLE1BQUs7QUFBQSxNQUFBO0FBQUEsTUFHRixtQkFBZ0I7QUFFeEIsYUFBSyxjQUNILElBQUksV0FBVyxTQUFTLEVBQUUsU0FBUyxNQUFNLFlBQVksTUFBTSxVQUFVLEtBQU0sQ0FBQSxDQUFDO0FBRXpFLGFBQUEsY0FBYyxJQUFJLE1BQU0sVUFBVSxFQUFFLFNBQVMsS0FBQSxDQUFNLENBQUM7QUFBQSxNQUFBO0FBQUEsTUFHbkQseUJBQXNCO0FBQzVCLFlBQUksS0FBSyxTQUFTO0FBQ2hCLGVBQUssdUJBQXNCO0FBQUEsUUFBQTtBQUU3QixhQUFLLHNCQUFxQjtBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1wQixxQkFBa0I7QUFDcEIsWUFBQSxDQUFDLEtBQUssUUFBUSxVQUFVO0FBQzFCO0FBQUEsUUFBQTtBQUdGLGNBQU0sT0FBTyxLQUFLLFFBQVEsS0FBSyxZQUFXO0FBQ3JDLGFBQUEsd0JBQXdCLG9CQUFvQixJQUFJLElBQUk7QUFHckQsWUFBQSxDQUFDLEtBQUssdUJBQXVCO0FBQzFCLGVBQUEsNENBQTRCO0FBQ2IsOEJBQUEsSUFBSSxNQUFNLEtBQUsscUJBQXFCO0FBQUEsUUFBQTtBQUcxRCxhQUFLLHlCQUF5QixLQUFLLHNCQUFzQixJQUN2RCxLQUFLLElBQUk7QUFJUCxZQUFBLENBQUMsS0FBSyx3QkFBd0I7QUFDM0IsZUFBQSw2Q0FBNkI7QUFDbEMsZUFBSyxzQkFBc0IsSUFDekIsS0FBSyxNQUNMLEtBQUssc0JBQStFO0FBQUEsUUFBQTtBQU14RixjQUFNLFVBQVUsTUFBTSxLQUFLLEtBQUssc0JBQXNCO0FBQ3RELGFBQUssdUJBQXVCO0FBR3RCLGNBQUEsUUFBUSxRQUFRLFVBQ3BCLENBQUMsTUFBTSxLQUFLLHdCQUF3QixDQUFDLElBQUksS0FBSywyQkFBMkI7QUFFM0UsWUFBSSxVQUFVLElBQUk7QUFDUixrQkFBQSxPQUFPLE9BQU8sR0FBRyxJQUFJO0FBQUEsUUFBQSxPQUN4QjtBQUNMLGtCQUFRLEtBQUssSUFBSTtBQUFBLFFBQUE7QUFJbkIsZ0JBQVEsUUFBUSxDQUFDLE1BQU0sS0FBSyx1QkFBd0IsSUFBSSxDQUFDLENBQUM7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFNcEQsMEJBQXVCOztBQUN4QixTQUFBRCxNQUFBLEtBQUEsMkJBQUEsZ0JBQUFBLElBQXdCLE9BQU87QUFFaEMsY0FBQSxVQUFLLDJCQUFMLG1CQUE2QixVQUFTLEdBQUc7QUFDdEMscUJBQUEsMEJBQUEsbUJBQXVCLE9BQU8sS0FBSztBQUFBLFFBQUk7QUFHOUMsYUFBSyx5QkFBeUI7QUFDOUIsYUFBSyx3QkFBd0I7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFNdkIsNkJBQTBCO0FBQ2hDLGVBQU8sTUFBTSxLQUFLLEtBQUssMEJBQTBCLENBQUUsQ0FBQSxFQUFFLE9BQU8sQ0FBQyxPQUMzRCxxQkFBcUIsVUFBVSxFQUFFLENBQUM7QUFBQSxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPOUIseUJBQXNCO0FBQzVCLGNBQU0sS0FBSyxLQUFLLDBCQUEwQixDQUFFLENBQUEsRUFDekMsT0FBTyxDQUFDLE1BQU0sTUFBTSxJQUFJLEVBQ3hCLFFBQVEsQ0FBQyxNQUFPLEVBQUUsVUFBVSxLQUFNO0FBQUEsTUFBQTtBQUFBLE1BRy9CLE1BQU0sb0JBQW9CLEtBQWtCO0FBQzlDLFlBQUEsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHO0FBQzNCO0FBQUEsUUFBQTtBQUVGLFlBQUksZUFBYztBQUVsQixjQUFNLGdCQUFnQixLQUFLLDZCQUE2QixPQUN0RCxDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVk7QUFFakMsY0FBQSxVQUFrQixjQUFjLFFBQVEsSUFBSTtBQUNsRCxjQUFNLFlBQW9CLG9CQUFvQixLQUFLLFNBQVMsY0FBYyxNQUFNO0FBRWhGLGNBQU0sS0FBSyxtQkFBbUIsY0FBYyxTQUFTLENBQUM7QUFBQSxNQUFBO0FBQUE7O0FBNVB2RCxnQ0FBQSxDQUFBLFNBQVMsRUFBRSxNQUFNLFFBQVMsQ0FBQSxDQUFDO0FBQzVCLG1CQUFBLElBQUEsTUFBQSx5QkFBQSxFQUFBLE1BQUEsVUFBQSxNQUFBLFdBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsYUFBQSxLQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxZQUFXLFVBT1Y7QUFBQSxXQUFBLFVBQUEsYUFBQSxNQUFBLDBCQUFBOztVQWZHO0FBQUE7QUF1UUMsU0FBQTtBQUVUO0FDelNhLE1BQUEsb0JBQW9CLENBQy9CLFNBQ2tEO0FBQUEsRUFDbEQsTUFBZSwrQkFBK0IsS0FBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWVoRCxJQUFXLG9CQUFpQjtBQUMxQixhQUFPLEtBQUs7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUlkLElBQWMsb0JBQWlCO0FBQzdCLGFBQU8sS0FBSztBQUFBLElBQUE7QUFBQSxJQUdkLGVBQXNCLE1BQVc7O0FBQy9CLFlBQU0sR0FBRyxJQUFJO0FBdkJQLFdBQUEscUJBQXFCLElBQUksUUFDL0IsQ0FBQyxZQUFhLEtBQUssb0JBQW9CLE9BQVE7QUF5QjFDLFdBQUEscUJBQXFCLENBQUMsQ0FBQyxLQUFLO0FBQzdCLFVBQUEsQ0FBQyxLQUFLLG9CQUFvQjtBQUM1QixhQUFLLGtCQUFrQixLQUFLO0FBQUEsTUFBQSxPQUN2QjtBQUtDLGNBQUEsMEJBQTBCLENBQUMsVUFBc0I7QUFDckQsY0FBSSxLQUFLLG9CQUFvQjtBQUMzQixrQkFBTSx5QkFBd0I7QUFBQSxVQUFBO0FBQUEsUUFFbEM7QUFDTSxjQUFBLGVBQXFDLEVBQUUsU0FBUztBQUN0RCxjQUFNLFNBQVEsVUFBSyxlQUFMLG1CQUFpQixpQkFBaUI7QUFDaEQsWUFBSSwrQkFBTyxRQUFRO0FBQ1gsZ0JBQUEsUUFBUSxDQUFDLFNBQ2IsS0FBSyxpQkFBaUIsY0FBYyx5QkFBeUIsWUFBWSxDQUFDO0FBRTVFLGVBQUssa0JBQWtCLEtBQUssTUFDMUIsTUFBTSxRQUFRLENBQUMsU0FBUTtBQUNoQixpQkFBQSxvQkFBb0IsY0FBYyx5QkFBeUIsWUFBWTtBQUN4RSxnQkFBQSxLQUFLLGdCQUFnQixRQUFRO0FBQzFCLG1CQUFBLGNBQWMsSUFBSSxNQUFNLGNBQWMsRUFBRSxTQUFTLEtBQUEsQ0FBTSxDQUFDO0FBQUEsWUFBQTtBQUFBLFVBQy9ELENBQ0QsQ0FBQztBQUFBLFFBQUE7QUFBQSxNQUVOO0FBQUEsSUFDRjtBQUFBLElBR2lCLE9BQU8sbUJBQXVDO0FBRy9ELFlBQU0sT0FBTyxpQkFBaUI7QUFFOUIsVUFBSSxLQUFLLG9CQUFvQjtBQUMzQixhQUFLLHFCQUFxQjtBQUMxQixhQUFLLGtCQUFrQixJQUFJO0FBQUEsTUFBQTtBQUFBLElBQzdCO0FBQUEsRUFDRjtBQUVLLFNBQUE7QUFDVDtBQzdGQSxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLGtCQUFrQjtBQTJDWCxNQUFBLHdCQUF3QixDQUluQyxlQUN5RDtNQU0xQyx3QkFBb0IsTUFBQTs7c0JBQ3pCLGtCQUFrQixVQUFVOzs7O0FBRHZCLFdBQUEsbUJBQ0wsWUFBNkI7QUFBQTs7QUFXNUI7QUFBbUIsMkJBQUEsZ0NBQUEsa0JBQUEsTUFBQSw0QkFBb0IsQ0FBQSxDQUFFO0FBWTFDLGFBQWlCLHFCQUFBLGtCQUFBLE1BQUEsK0JBQUEsR0FBRyxNQUFXO0FBQ3JDLGdCQUFNLGVBQWUsTUFBTSxLQUFLLEtBQUssWUFBWSxDQUFBLENBQUUsRUFBRSxPQUFPLENBQUMsTUFDM0QsS0FBSyxvQkFBb0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztBQUloRCxjQUNFLGFBQWEsV0FBVyxLQUFLLGFBQWEsVUFDMUMsS0FBSyxhQUFhLE1BQU0sQ0FBQyxHQUFHLE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUN2RDtBQUNBO0FBQUEsVUFBQTtBQUdGLGVBQUssYUFDRixPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsU0FBUyxDQUFDLENBQUMsRUFDdkMsUUFBUSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsTUFBTSxDQUFDO0FBQzNDLGVBQUssZUFBZTtBQUNwQixlQUFLLGFBQWEsUUFBUSxDQUFDLEdBQUcsVUFDNUIsRUFBRSxhQUFhLFFBQVEsR0FBRyxlQUFlLElBQUksS0FBSyxFQUFFLENBQUM7QUFJdkQsZUFBSyxnQkFBZ0IseUJBQXlCO0FBQUEsUUFBQTtBQUFBLE1BQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BbkNTLElBQW1CLGVBQXVCO0FBQUEsZUFBQSxtQkFBQTtBQUFBLE1BQUE7QUFBQSxNQUExQyxJQUFtQixhQUF1QixPQUFBO0FBQUEsMkJBQUEsZ0NBQUE7QUFBQSxNQUFBO0FBQUEsTUFFbkMsb0JBQWlCOztBQUMvQixjQUFNLGtCQUFpQjtBQUNsQixTQUFBQSxNQUFBLEtBQUEsZUFBQSxnQkFBQUEsSUFBWSxpQkFBaUIsY0FBYyxLQUFLLG1CQUFtQixFQUFFLFNBQVM7TUFBTTtBQUFBLE1BRzNFLHVCQUFvQjs7QUFDbEMsY0FBTSxxQkFBb0I7QUFDMUIsU0FBQUEsTUFBQSxLQUFLLGVBQUwsZ0JBQUFBLElBQWlCLG9CQUFvQixjQUFjLEtBQUs7QUFBQSxNQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BcUNqRSxXQUNSLGFBQThFLElBQzlFLHFCQUF5RCxDQUFBLEdBQUU7QUFFckQsY0FBQSxnQkFBMEMsS0FBSyxnQkFBZ0Isa0JBQWtCO0FBRW5GLFlBQUEsY0FBYyxVQUFVLEdBQUc7QUFDdEIsaUJBQUE7QUFBQTtBQUFBLG9CQUVLLFdBQVcsU0FBUyxLQUFLLFNBQVM7QUFBQSx5QkFDN0IsV0FBVyxhQUFhLE9BQU87QUFBQSw4QkFDMUIsV0FBVyxrQkFBa0IsT0FBTztBQUFBO0FBQUEsY0FFcEQsY0FBYyxJQUNkLENBQUMsU0FBUztBQUFBLGtDQUNVLEtBQUssY0FBYyxPQUFPO0FBQUEsK0JBQzdCLEtBQUssSUFBSTtBQUFBO0FBQUEsZUFFekIsQ0FDRjtBQUFBO0FBQUEsWUFFRCxLQUFLLGlCQUFrQixDQUFBO0FBQUE7QUFBQSxRQUFBLFdBRWxCLGNBQWMsV0FBVyxHQUFHO0FBQzlCLGlCQUFBLCtCQUErQixXQUFXLFNBQVM7QUFBQSx3QkFDMUMsV0FBVyxTQUFTLEtBQUssU0FBUztBQUFBLCtCQUMzQixjQUFjLENBQUMsRUFBRSxJQUFJO0FBQUE7QUFBQSxZQUV4QyxLQUFLLGlCQUFrQixDQUFBO0FBQUEsUUFBQSxPQUN0QjtBQUNMLGlCQUFPLEtBQUssaUJBQWdCO0FBQUEsUUFBQTtBQUFBLE1BQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFZUSxnQkFBZ0Isb0JBRXpCO0FBQ0MsY0FBTSxlQUFlLEtBQUssYUFBYSxTQUNuQyxLQUFLLGVBQ0wsTUFBTSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssYUFBYSx5QkFBeUIsS0FBSyxJQUFJO0FBQy9FLGVBQU8sYUFBYSxJQUFJLENBQUMsR0FBRyxNQUFLOztBQUN4QixpQkFBQTtBQUFBLFlBQ0wsTUFBTSxHQUFHLGVBQWUsSUFBSSxDQUFDO0FBQUEsWUFDN0IsY0FDRUEsTUFBQSx5REFBb0Isd0JBQXBCLGdCQUFBQSxJQUF5QyxTQUFVLEVBQWtCLGVBQ3JFO0FBQUE7U0FFTDtBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFRTyxtQkFBZ0I7QUFDakIsZUFBQTtBQUFBLE1BQUE7QUFBQSxPQS9HQTs7QUFBUixpQ0FBQSxDQUFBLE9BQU87QUFBb0IsbUJBQUEsSUFBQSxNQUFBLDBCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsZ0JBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsa0JBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFBLGNBQUEsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFlBQUEsZUFBdUI7QUFBQSxXQUFBLFVBQUEsYUFBQSw0QkFBQSwrQkFBQTs7VUFadEM7QUFBQTtBQStIUixTQUFBO0FBQ1Q7QUNoTGEsTUFBQSxtQkFBbUIsQ0FDOUIsZUFDaUQ7TUFDbEMsc0JBQWtCLE1BQUE7O3NCQUFTOzs7O0FBQTNCLFdBQUEsbUJBQTJCLFlBQVU7QUFBQTs7QUFJbEQsdURBQUEsa0JBQUEsTUFBQSx3QkFBb0MsS0FBSzs7OztNQUF6QyxJQUFnQixXQUEwQjtBQUFBLGVBQUEsbUJBQUE7QUFBQSxNQUFBO0FBQUEsTUFBMUMsSUFBZ0IsU0FBMEIsT0FBQTtBQUFBLDJCQUFBLDRCQUFBO0FBQUEsTUFBQTtBQUFBLE9BQTFDOztBQUZDLDZCQUFBLENBQUEsVUFBVyxHQUNYLFNBQVMsRUFBRSxTQUFTLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDM0IsbUJBQUEsSUFBQSxNQUFBLHNCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsWUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxjQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBQSxVQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxZQUFBLFdBQTBCO0FBQUEsV0FBQSxVQUFBLGFBQUEsd0JBQUEsMkJBQUE7O1VBSjdCO0FBQUE7QUFPUixTQUFBO0FBQ1Q7QUNOYSxNQUFBLGdCQUFnQixDQUMzQixlQUM4QztNQUMvQixtQkFBZSxNQUFBOztzQkFBUzs7Ozs7Ozs7OztBQUF4QixXQUFBLG1CQUF3QixZQUFVO0FBQUE7O0FBTW5DO0FBS1o7QUFLQTtBQVY0QiwyQkFBQSx5QkFBQSxrQkFBQSxNQUFBLHFCQUEwQixPQUFPO0FBSzdDLDJCQUFBLCtCQUFBLGtCQUFBLE1BQUEsd0JBQUEsR0FBQSxrQkFBQSxNQUFBLDBCQUFzQixLQUFLO0FBSzNCLDJCQUFBLG1DQUFBLGtCQUFBLE1BQUEsNkJBQUEsR0FBQSxrQkFBQSxNQUFBLDhCQUF5QixFQUFFO0FBTW5DLGFBQUEsK0VBQXNDLElBQUksYUFDaEQsTUFDQUUsR0FBZ0IsT0FBTyxnQkFDdkIsRUFBRSxTQUFTLEtBQU0sQ0FBQTtBQUFBLE1BQUE7QUFBQTtBQUFBLE1BbkJQLElBQWdCLFFBQWtDO0FBQUEsZUFBQSxtQkFBQTtBQUFBLE1BQUE7QUFBQSxNQUFsRCxJQUFnQixNQUFrQyxPQUFBO0FBQUEsMkJBQUEseUJBQUE7QUFBQSxNQUFBO0FBQUE7QUFBQSxNQUs5RCxJQUFnQixhQUE0QjtBQUFBLGVBQUEsbUJBQUE7QUFBQSxNQUFBO0FBQUEsTUFBNUMsSUFBZ0IsV0FBNEIsT0FBQTtBQUFBLDJCQUFBLDhCQUFBO0FBQUEsTUFBQTtBQUFBO0FBQUEsTUFLNUMsSUFBZ0IsaUJBQTRCO0FBQUEsZUFBQSxtQkFBQTtBQUFBLE1BQUE7QUFBQSxNQUE1QyxJQUFnQixlQUE0QixPQUFBO0FBQUEsMkJBQUEsa0NBQUE7QUFBQSxNQUFBO0FBQUEsTUFZNUIsb0JBQWlCO0FBQy9CLGNBQU0sa0JBQWlCO0FBRXZCLGFBQUssZ0JBQWdCOztPQXpCWCx5Q0FLWiw4Q0FLQTs7QUFWQywwQkFBQSxDQUFBLFVBQVU7QUFHViwrQkFBQSxDQUFBLFVBQVcsR0FDWCxTQUFTLEVBQUUsU0FBUyxNQUFNLE1BQU0sU0FBUyxDQUFDO29DQUkxQyxhQUNBLFVBQVU7QUFUaUIsbUJBQUEsSUFBQSxNQUFBLG1CQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsU0FBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxXQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBQSxPQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxZQUFBLFFBQWtDO0FBQUEsV0FBQSxVQUFBLGFBQUEscUJBQUEsd0JBQUE7QUFLOUMsbUJBQUEsSUFBQSxNQUFBLHdCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsY0FBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxnQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEsWUFBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsWUFBQSxhQUE0QjtBQUFBLFdBQUEsVUFBQSxhQUFBLDBCQUFBLDZCQUFBO0FBSzVCLG1CQUFBLElBQUEsTUFBQSw0QkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLGtCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLG9CQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBQSxnQkFBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsWUFBQSxpQkFBNEI7QUFBQSxXQUFBLFVBQUEsYUFBQSw4QkFBQSxpQ0FBQTs7VUFmckIsR0FBQSxTQUFTO0FBQUEsTUFDOUIsZ0JBQWdCO0FBQUEsSUFDUixHQUhHO0FBQUE7QUFtQ1IsU0FBQTtBQUNUO0FDM0NhLE1BQUEsMEJBQTBCLENBQ3JDLFNBQ3dEO0FBQUEsRUFDeEQsTUFBZSxrQ0FDTCxLQUFJO0FBQUEsSUFEZCxjQUFBOztBQUlVLFdBQUEsaUJBQWlCLFFBQVE7QUFDekIsV0FBQSxpQkFBaUIsTUFBVztBQUFBLE1BQUU7QUFBQSxJQUFBO0FBQUEsSUFFNUIsY0FBVztBQUNuQixXQUFLLGlCQUFpQixJQUFJLFFBQWMsQ0FBQyxNQUFPLEtBQUssaUJBQWlCLENBQUU7QUFBQSxJQUFBO0FBQUEsSUFHaEUsaUJBQWM7QUFDdEIsV0FBSyxlQUFjO0FBQUEsSUFBQTtBQUFBLElBR0YsTUFBTSxvQkFBaUI7QUFDbEMsWUFBQSxTQUFTLE1BQU0sTUFBTTtBQUMzQixZQUFNLEtBQUs7QUFDSixhQUFBO0FBQUEsSUFBQTtBQUFBLEVBQ1Q7QUFFSyxTQUFBO0FBRVQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==
|
|
1451
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZGlzYWJsZWQtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3JlcXVpcmVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1jaGVja2JveC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9mb3JtLWFzc29jaWF0ZWQtaW5wdXQtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLXJhZGlvLWJ1dHRvbi1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9oeWRyYXRpb24tbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvbmFtZWQtc2xvdC1saXN0LW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL25lZ2F0aXZlLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3BhbmVsLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3VwZGF0ZS1zY2hlZHVsZXItbWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgZm9yY2VUeXBlLCBnZXRPdmVycmlkZSB9IGZyb20gJy4uL2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGUgfSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYkRpc2FibGVkTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZSB7XG4gIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZEludGVyYWN0aXZlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIGRpc2FibGVkIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRGlzYWJsZWRNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJEaXNhYmxlZEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgUGFydGlhbDxTYmJEaXNhYmxlZE1peGluVHlwZT4ge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIEBnZXRPdmVycmlkZSgoZTogU2JiRGlzYWJsZWRFbGVtZW50LCB2OiBib29sZWFuKTogYm9vbGVhbiA9PiB2IHx8IGUuaXNEaXNhYmxlZEV4dGVybmFsbHkoKSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBhcyAnb3InIGNoZWNrIHRvIHRoZSBjdXJyZW50IGRpc2FibGVkIHN0YXRlLlxuICAgICAqIENhbiBlLmcuIGJlIHVzZWQgdG8gcmVhZCBkaXNhYmxlZCBzdGF0ZSBvZiBhIGdyb3VwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiRGlzYWJsZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJEaXNhYmxlZE1peGluVHlwZT4gJiBUO1xufTtcblxuLyoqXG4gKiBFbmhhbmNlIHlvdXIgY29tcG9uZW50IHdpdGggYSBkaXNhYmxlZCBpbnRlcmFjdGl2ZSBwcm9wZXJ0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkRpc2FibGVkTWl4aW5UeXBlPixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+XG4gIHtcbiAgICAvKiogV2hldGhlciB0aGUgYnV0dG9uIHNob3VsZCBiZSBhcmlhLWRpc2FibGVkIGJ1dCBzdGF5IGludGVyYWN0aXZlLiAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Rpc2FibGVkLWludGVyYWN0aXZlJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZEludGVyYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkRpc2FibGVkVGFiSW5kZXhBY3Rpb25NaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlICYgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvblxuICAgIGV4dGVuZHMgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluKFNiYkRpc2FibGVkTWl4aW4oc3VwZXJDbGFzcykpXG4gICAgaW1wbGVtZW50cyBTYmJEaXNhYmxlZE1peGluVHlwZSwgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZVxuICB7XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZGlzYWJsZWRJbnRlcmFjdGl2ZScpKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFEaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZSA/ICd0cnVlJyA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkRpc2FibGVkVGFiSW5kZXhBY3Rpb24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxcbiAgICBTYmJEaXNhYmxlZE1peGluVHlwZSAmIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGVcbiAgPiAmXG4gICAgVDtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGUgKi9cbmltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlEZWNsYXJhdGlvbiwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBpc1dlYmtpdCB9IGZyb20gJy4uL2RvbS5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIGN1c3RvbSB2YWxpZGlkdHkgc3RhdGUgcHJvcGVydGllcy5cbiAgICovXG4gIGludGVyZmFjZSBDdXN0b21WYWxpZGl0eVN0YXRlIHt9XG4gIGludGVyZmFjZSBWYWxpZGl0eVN0YXRlIGV4dGVuZHMgQ3VzdG9tVmFsaWRpdHlTdGF0ZSB7fVxuICBpbnRlcmZhY2UgVmFsaWRpdHlTdGF0ZUZsYWdzIGV4dGVuZHMgUGFydGlhbDxDdXN0b21WYWxpZGl0eVN0YXRlPiB7fVxufVxuXG5jb25zdCB2YWxpZGl0eUtleXM6IFJlcXVpcmVkPE9taXQ8VmFsaWRpdHlTdGF0ZUZsYWdzLCBrZXlvZiBDdXN0b21WYWxpZGl0eVN0YXRlPj4gPSB7XG4gIGJhZElucHV0OiBmYWxzZSxcbiAgY3VzdG9tRXJyb3I6IGZhbHNlLFxuICBwYXR0ZXJuTWlzbWF0Y2g6IGZhbHNlLFxuICByYW5nZU92ZXJmbG93OiBmYWxzZSxcbiAgcmFuZ2VVbmRlcmZsb3c6IGZhbHNlLFxuICBzdGVwTWlzbWF0Y2g6IGZhbHNlLFxuICB0b29Mb25nOiBmYWxzZSxcbiAgdG9vU2hvcnQ6IGZhbHNlLFxuICB0eXBlTWlzbWF0Y2g6IGZhbHNlLFxuICB2YWx1ZU1pc3Npbmc6IGZhbHNlLFxufTtcbi8vIFdlIG5lZWQgVmFsaWRpdHlTdGF0ZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQsIGFzIHdlIGNoZWNrIHRoZSBwcm90b3R5cGUgZm9yXG4vLyBleHRlbnNpb25zLiBJbiBlbnZpcm9ubWVudHMgd2hlcmUgdGhhdCBpcyBub3QgdGhlIGNhc2UgKGUuZy4gTm9kZS5qcykgd2Vcbi8vIHBhdGNoIGl0IHdpdGggYSBtaW5pbWFsIHNoaW0uXG5pZiAodHlwZW9mIFZhbGlkaXR5U3RhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnN0IHZhbGlkaXR5Q2xhc3MgPSBjbGFzcyBWYWxpZGl0eVN0YXRlIHtcbiAgICBwdWJsaWMgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICB9O1xuICBPYmplY3QuZW50cmllcyh2YWxpZGl0eUtleXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT5cbiAgICBPYmplY3QuYXNzaWduKHZhbGlkaXR5Q2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBnZXQgW2tleV0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgfSksXG4gICk7XG4gIGdsb2JhbFRoaXMuVmFsaWRpdHlTdGF0ZSA9IHZhbGlkaXR5Q2xhc3MgYXMgdW5rbm93biBhcyB0eXBlb2YgVmFsaWRpdHlTdGF0ZTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8ViA9IHN0cmluZz4ge1xuICBwdWJsaWMgZ2V0IGZvcm0oKTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbDtcbiAgcHVibGljIGFjY2Vzc29yIG5hbWU6IHN0cmluZztcbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZztcbiAgcHVibGljIGFjY2Vzc29yIHZhbHVlOiBWIHwgbnVsbDtcblxuICBwdWJsaWMgZ2V0IHZhbGlkaXR5KCk6IFZhbGlkaXR5U3RhdGU7XG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IHdpbGxWYWxpZGF0ZSgpOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBmb3JtRGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgcHVibGljIGNoZWNrVmFsaWRpdHkoKTogYm9vbGVhbjtcbiAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuXG4gIHB1YmxpYyBmb3JtQXNzb2NpYXRlZENhbGxiYWNrPyhmb3JtOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsKTogdm9pZDtcbiAgcHVibGljIGZvcm1EaXNhYmxlZENhbGxiYWNrKGRpc2FibGVkOiBib29sZWFuKTogdm9pZDtcbiAgcHVibGljIGFic3RyYWN0IGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBhYnN0cmFjdCBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xuICBwcm90ZWN0ZWQgc2V0VmFsaWRpdHlGbGFnPFQgZXh0ZW5kcyBrZXlvZiBWYWxpZGl0eVN0YXRlRmxhZ3M+KFxuICAgIGZsYWc6IFQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGZsYWdWYWx1ZT86IFZhbGlkaXR5U3RhdGVGbGFnc1tUXSxcbiAgKTogdm9pZDtcbiAgcHJvdGVjdGVkIHJlbW92ZVZhbGlkaXR5RmxhZzxUIGV4dGVuZHMga2V5b2YgVmFsaWRpdHlTdGF0ZUZsYWdzPihmbGFnOiBUKTogdm9pZDtcbiAgcHJvdGVjdGVkIHZhbGlkYXRlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBzaG91bGRWYWxpZGF0ZShuYW1lOiBQcm9wZXJ0eUtleSB8IHVuZGVmaW5lZCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIEZvcm1Bc3NvY2lhdGVkTWl4aW4gZW5hYmxlcyBuYXRpdmUgZm9ybSBzdXBwb3J0IGZvciBjdXN0b20gY29udHJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJGb3JtQXNzb2NpYXRlZE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+LCBWID0gc3RyaW5nPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkRWxlbWVudFxuICAgIGV4dGVuZHMgc3VwZXJDbGFzc1xuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj5cbiAge1xuICAgIHB1YmxpYyBzdGF0aWMgZm9ybUFzc29jaWF0ZWQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZm9ybSBvd25lciBvZiB0aGlzIGVsZW1lbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBmb3JtKCk6IEhUTUxGb3JtRWxlbWVudCB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLmZvcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZm9ybSBlbGVtZW50LiBXaWxsIGJlIHJlYWQgZnJvbSBuYW1lIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXZlbG9wZXIgbm90ZTogSW4gdGhpcyBjYXNlIHVwZGF0aW5nIHRoZSBhdHRyaWJ1dGUgbXVzdCBiZSBzeW5jaHJvbm91cy5cbiAgICAgKiBEdWUgdG8gdGhpcyBpdCBpcyBpbXBsZW1lbnRlZCBhcyBhIGdldHRlci9zZXR0ZXIgYW5kIHRoZSBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSBoYW5kbGVzIHRoZSBkaWZmIGNoZWNrLlxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSgpXG4gICAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBgJHtuYW1lfWApO1xuXG4gICAgICAvLyBGb3IgYEZvcm1EYXRhYCB2YWx1ZXMsIHdlIGhhdmUgdG8gbWFudWFsbHkgdXBkYXRlIHRoZSBmaWVsZE5hbWUga2V5XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbmFtZScpID8/ICcnO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsTmFtZTtcbiAgICB9XG5cbiAgICAvKiogVmFsdWUgb2YgdGhlIGZvcm0gZWxlbWVudC4gKi9cbiAgICBAcHJvcGVydHkoKVxuICAgIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFYgfCBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBWIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgX3ZhbHVlOiBWIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBWYWxpZGl0eVN0YXRlIG9iamVjdCBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMudmFsaWRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBlcnJvciBtZXNzYWdlLCBpZiBhdmFpbGFibGUsIHdoaWNoIGNvcnJlc3BvbmRzXG4gICAgICogdG8gdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBzdGF0ZS5cbiAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IG9ubHkgb25lIG1lc3NhZ2UgaXMgcmV0dXJuZWQgYXQgYSB0aW1lIChlLmcuIGlmXG4gICAgICogbXVsdGlwbGUgdmFsaWRpdHkgc3RhdGVzIGFyZSBpbnZhbGlkLCBvbmx5IHRoZSBjaHJvbm9sb2dpY2FsbHkgZmlyc3Qgb25lXG4gICAgICogaXMgcmV0dXJuZWQgdW50aWwgaXQgaXMgZml4ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IG1lc3NhZ2UgbWlnaHQgYmVcbiAgICAgKiByZXR1cm5lZCwgaWYgaXQgaXMgc3RpbGwgYXBwbGljYWJsZSkuIEFsc28gYSBjdXN0b20gdmFsaWRpdHkgbWVzc2FnZVxuICAgICAqIChzZWUgYmVsb3cpIGhhcyBwcmVjZWRlbmNlIG92ZXIgbmF0aXZlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgd2lsbCBiZSB2YWxpZGF0ZWRcbiAgICAgKiB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZDsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLndpbGxWYWxpZGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG5cbiAgICBwcml2YXRlIF92YWxpZGl0eVN0YXRlcyA9IG5ldyBNYXA8XG4gICAgICBrZXlvZiBWYWxpZGl0eVN0YXRlRmxhZ3MsXG4gICAgICB7IGZsYWdWYWx1ZTogdW5rbm93bjsgbWVzc2FnZTogc3RyaW5nIH1cbiAgICA+KCk7XG5cbiAgICAvKiogV2hlbmV2ZXIgYSBzdXJyb3VuZGluZyBmb3JtIG9yIGZpZWxkc2V0IGlzIGNoYW5naW5nIGl0cyBkaXNhYmxlZCBzdGF0ZS4gKi9cbiAgICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgICAgLy8gV2Ugd2FudCB0byBwcmV2ZW50IHRoZSBuYXRpdmUgYnJvd3NlciB2YWxpZGF0aW9uIG1lc3NhZ2UgcG9wb3ZlclxuICAgICAgLy8gdG8gYmUgc2hvd24uIFRoaXMgYWxzbyBwcmV2ZW50cyBhIGJ1ZyBpbiBXZWJLaXQsIHdoaWNoIHdvdWxkIG5vdFxuICAgICAgLy8gYWxsb3cgaG9zdCBhcyB0aGUgdmFsaWRpdHkgYW5jaG9yOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY5ODMyXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignaW52YWxpZCcsIChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBvbGQ6IHN0cmluZyB8IG51bGwsXG4gICAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChuYW1lICE9PSAnbmFtZScgfHwgb2xkICE9PSB2YWx1ZSkge1xuICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBoYXMgbm8gdmFsaWRpdHkgcHJvYmxlbXM7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiBGaXJlcyBhbiBpbnZhbGlkIGV2ZW50IGF0IHRoZSBlbGVtZW50IGluIHRoZSBsYXR0ZXIgY2FzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBoYXMgbm8gdmFsaWRpdHkgcHJvYmxlbXM7IG90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIGZhbHNlLCBmaXJlcyBhbiBpbnZhbGlkIGV2ZW50IGF0IHRoZSBlbGVtZW50LFxuICAgICAqIGFuZCAoaWYgdGhlIGV2ZW50IGlzbid0IGNhbmNlbGVkKSByZXBvcnRzIHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZXBvcnRWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGN1c3RvbSB2YWxpZGl0eSBtZXNzYWdlIGZvciB0aGlzIGVsZW1lbnQuIFVzZSB0aGUgZW1wdHkgc3RyaW5nXG4gICAgICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgY3VzdG9tIHZhbGlkaXR5IGVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRpdHlGbGFnKCdjdXN0b21FcnJvcicsIG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVWYWxpZGl0eUZsYWcoJ2N1c3RvbUVycm9yJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgZm9ybSBlbGVtZW50IGNoYW5nZXMuXG4gICAgICogRWxlbWVudEludGVybmFscy5mb3JtIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgZnJvbSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZvcm1Bc3NvY2lhdGVkQ2FsbGJhY2s/KGZvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIGEgc3Vycm91bmRpbmcgZm9ybSAvIGZpZWxkc2V0IGNoYW5nZXMgZGlzYWJsZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybURpc2FibGVkQ2FsbGJhY2soZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIGlmIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eSBjaGFuZ2VzIG9yIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgb2YgYSBmaWVsZHNldCBvciBmb3JtIGNoYW5nZXMuXG4gICAgICAvLyBXZSBuZWVkIHRvIHBvc3Rwb25lIHRoZSBhc3NpZ25tZW50LCBvdGhlcndpc2UgaXQgaW50ZXJmZXJlcyB3aXRoIGRpc2FibGVkIHN0YXR1cyBzZXR0aW5nXG4gICAgICAvLyBhbmQgbGVhZHMgdG8gYSB3cm9uZyBzdGF0ZSAoZS5nLiBlbWJlZGRlZCBzYmItdmlzdWFsLWNoZWNrYm94KS5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1EaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMgXCJyZXN0b3JlXCIsIG9yIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGZ1bGZpbGwgYXV0b2ZpbGwgb24gYmVoYWxmIG9mXG4gICAgICogIHVzZXIgaW4gd2hpY2ggY2FzZSByZWFzb24gaXMgXCJhdXRvY29tcGxldGVcIi5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2YgXCJyZXN0b3JlXCIsIHN0YXRlIGlzIGEgc3RyaW5nLCBGaWxlLCBvciBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiAgcHJldmlvdXNseSBzZXQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRGb3JtVmFsdWUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIHJlcXVlc3RVcGRhdGUoXG4gICAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKHRoaXMuaGFzVXBkYXRlZCAmJiB0aGlzLnNob3VsZFZhbGlkYXRlKG5hbWUpKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gZm9ybSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEFkYXB0cyBhbmQgc2V0cyB0aGUgZm9ybVZhbHVlIGluIHRoZSBzdXBwb3J0ZWQgZm9ybWF0IChzdHJpbmcgfCBGb3JtRGF0YSB8IEZpbGUgfCBudWxsKVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3NldEZvcm1WYWx1ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoaXMgZWxlbWVudCBhcyBzdWZmZXJpbmcgZnJvbSB0aGUgY29uc3RyYWludCBpbmRpY2F0ZWQgYnkgdGhlXG4gICAgICogZmxhZyBhcmd1bWVudCBhbmQgYXNzb2NpYXRlcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBpdC5cbiAgICAgKiBOb3RlIHRoYXQgb25seSBvbmUgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYXQgYSB0aW1lIGFuZCBjdXN0b20gbWVzc2FnZXMgYnlcbiAgICAgKiBjb25zdW1lcnMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQgYmVmb3JlIGludGVybmFsIG1lc3NhZ2VzIGFuZCBpbnRlcm5hbFxuICAgICAqIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZC5cbiAgICAgKiBUbyBzZXQvZGVmaW5lIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBmbGFncywgeW91IG5lZWQgdG8gZXh0ZW5kIHRoZVxuICAgICAqIFZhbGlkaXR5U3RhdGUgcHJvdG90eXBlIChhbmQgdGhlIEN1c3RvbVZhbGlkaXR5U3RhdGUgaW50ZXJmYWNlKS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAgIC8vIFRoZSB0eXBlIG9mIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgZG9lcyBub3QgbmVlZCB0byBiZSBib29sZWFuLlxuICAgICAqICAgT2JqZWN0LmFzc2lnbihWYWxpZGl0eVN0YXRlLnByb3RvdHlwZSwge1xuICAgICAqICAgICBnZXQgbXlFcnJvcigpOiBib29sZWFuIHtcbiAgICAgKiAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICogICAgIH0sXG4gICAgICogICB9KTtcbiAgICAgKlxuICAgICAqICAgZGVjbGFyZSBnbG9iYWwge1xuICAgICAqICAgICBpbnRlcmZhY2UgQ3VzdG9tVmFsaWRpdHlTdGF0ZSB7XG4gICAgICogICAgICAgbXlFcnJvcjogYm9vbGVhbjtcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZXRWYWxpZGl0eUZsYWc8VCBleHRlbmRzIGtleW9mIFZhbGlkaXR5U3RhdGVGbGFncz4oXG4gICAgICBmbGFnOiBULFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgZmxhZ1ZhbHVlPzogVmFsaWRpdHlTdGF0ZUZsYWdzW1RdLFxuICAgICk6IHZvaWQge1xuICAgICAgZmxhZ1ZhbHVlID8/PSB0cnVlO1xuICAgICAgY29uc3QgdmFsaWRpdHlTdGF0ZSA9IHRoaXMuX3ZhbGlkaXR5U3RhdGVzLmdldChmbGFnKTtcbiAgICAgIGlmIChcbiAgICAgICAgIXZhbGlkaXR5U3RhdGUgfHxcbiAgICAgICAgdmFsaWRpdHlTdGF0ZS5tZXNzYWdlICE9PSBtZXNzYWdlIHx8XG4gICAgICAgIHZhbGlkaXR5U3RhdGUuZmxhZ1ZhbHVlICE9PSBmbGFnVmFsdWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLl92YWxpZGl0eVN0YXRlcy5zZXQoZmxhZywgeyBmbGFnVmFsdWUsIG1lc3NhZ2UgfSk7XG4gICAgICAgIHRoaXMuX3NldEludGVybmFsVmFsaWRpdHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmVtb3ZlcyB0aGUgdmFsaWRpdHkgc3RhdGUgZmxhZyBlbnRyeSBhbmQgdXBkYXRlcyB2YWxpZGl0eSBzdGF0ZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlVmFsaWRpdHlGbGFnPFQgZXh0ZW5kcyBrZXlvZiBWYWxpZGl0eVN0YXRlRmxhZ3M+KGZsYWc6IFQpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl92YWxpZGl0eVN0YXRlcy5oYXMoZmxhZykpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRpdHlTdGF0ZXMuZGVsZXRlKGZsYWcpO1xuICAgICAgICB0aGlzLl9zZXRJbnRlcm5hbFZhbGlkaXR5KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRvIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY3VycmVudCBlbGVtZW50IG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4gKi9cbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGUoKTogdm9pZCB7fVxuXG4gICAgLyoqIFdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgcnVuIG9uIGEgcHJvcGVydHkgY2hhbmdlIHdpdGggdGhlIGdpdmVuIG5hbWUuICovXG4gICAgcHJvdGVjdGVkIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIW5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW50ZXJuYWxWYWxpZGl0eSgpOiB2b2lkIHtcbiAgICAgIGxldCBvdXRwdXRNZXNzYWdlID0gdGhpcy5fdmFsaWRpdHlTdGF0ZXMuZ2V0KCdjdXN0b21FcnJvcicpPy5tZXNzYWdlO1xuICAgICAgY29uc3QgZmxhZ3M6IFZhbGlkaXR5U3RhdGVGbGFncyA9IHt9O1xuICAgICAgdGhpcy5fdmFsaWRpdHlTdGF0ZXMuZm9yRWFjaCgoeyBmbGFnVmFsdWUsIG1lc3NhZ2UgfSwgZmxhZykgPT4ge1xuICAgICAgICBmbGFnc1tmbGFnXSA9IGZsYWdWYWx1ZSBhcyBhbnk7XG4gICAgICAgIG91dHB1dE1lc3NhZ2UgfHw9IG1lc3NhZ2U7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY3VzdG9tRmxhZ3MgPSBPYmplY3Qua2V5cyhWYWxpZGl0eVN0YXRlLnByb3RvdHlwZSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gIShmIGluIHZhbGlkaXR5S2V5cykgJiYgZiAhPT0gJ3ZhbGlkJyxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGZsYWcgb2YgY3VzdG9tRmxhZ3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmbGFnIGluIGZsYWdzID8gZmxhZ3NbZmxhZyBhcyBrZXlvZiBWYWxpZGl0eVN0YXRlRmxhZ3NdIDogZmFsc2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmludGVybmFscy52YWxpZGl0eSwgZmxhZywgeyB2YWx1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAvLyBJZiBhbnkgY3VzdG9tIGVycm9ycyBhcmUgcHJvdmlkZWQsIHdlIG5lZWQgdG8gc2V0IGN1c3RvbUVycm9yIHRvIHRydWUsXG4gICAgICAgICAgLy8gYXMgdGhpcyBpcyB0aGUgb25seSBjdXN0b20gZXJyb3IgcHJvcGVydHkgYnJvd3NlcnMgYWNjZXB0LlxuICAgICAgICAgIGZsYWdzLmN1c3RvbUVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmludGVybmFscy5zZXRWYWxpZGl0eShmbGFncywgb3V0cHV0TWVzc2FnZSk7XG5cbiAgICAgIC8vIFdlYktpdCBzZWVtcyB0byBhbHdheXMgc2V0IGN1c3RvbUVycm9yIHRvIHRydWUsIGlmIGFueSBlcnJvciBpcyBhY3RpdmUuXG4gICAgICAvLyBEdWUgdG8gdGhpcyB3ZSBwYXRjaCB0aGUgY3VzdG9tRXJyb3IgdmFsdWUgbWFudWFsbHkuXG4gICAgICBpZiAoaXNXZWJraXQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuaW50ZXJuYWxzLnZhbGlkaXR5LCAnY3VzdG9tRXJyb3InLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbGlkaXR5U3RhdGVzLmhhcygnY3VzdG9tRXJyb3InKSB8fCAhIWZsYWdzLmN1c3RvbUVycm9yLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBTYmJGb3JtQXNzb2NpYXRlZEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PiAmXG4gICAgVDtcbn07XG5cbi8qKlxuICogQSB2YWx1ZSB0byBiZSByZXN0b3JlZCBmb3IgYSBjb21wb25lbnQncyBmb3JtIHZhbHVlLiBJZiBhIGNvbXBvbmVudCdzIGZvcm1cbiAqIHN0YXRlIGlzIGEgYEZvcm1EYXRhYCBvYmplY3QsIGl0cyBlbnRyeSBsaXN0IG9mIG5hbWUgYW5kIHZhbHVlcyB3aWxsIGJlXG4gKiBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSA9IEZpbGUgfCBzdHJpbmcgfCBbc3RyaW5nLCBGb3JtRGF0YUVudHJ5VmFsdWVdW107XG5cbi8qKlxuICogVGhlIHJlYXNvbiBhIGZvcm0gY29tcG9uZW50IGlzIGJlaW5nIHJlc3RvcmVkIGZvciwgZWl0aGVyIGAncmVzdG9yZSdgIGZvclxuICogYnJvd3NlciByZXN0b3JhdGlvbiBvciBgJ2F1dG9jb21wbGV0ZSdgIGZvciByZXN0b3JpbmcgdXNlciB2YWx1ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1SZXN0b3JlUmVhc29uID0gJ3Jlc3RvcmUnIHwgJ2F1dG9jb21wbGV0ZSc7XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGUgfSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYlJlcXVpcmVkTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIHJlcXVpcmVkOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNSZXF1aXJlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFbmhhbmNlIHlvdXIgY29tcG9uZW50IHdpdGggYSByZXF1aXJlZCBwcm9wZXJ0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYlJlcXVpcmVkTWl4aW4gPSA8XG4gIFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQgJiBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj4sXG4gIFYsXG4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJSZXF1aXJlZE1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiUmVxdWlyZWRFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiUmVxdWlyZWRNaXhpblR5cGU+IHtcbiAgICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkLiAqL1xuICAgIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAvLyBUbyBwcm92aWRlIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBuYXRpdmUgcmVxdWlyZWQgc3RhdGUsXG4gICAgICAvLyBhbnkgdmFsdWUgaXMgY29udmVydGVkIHRvIGEgYm9vbGVhbi5cbiAgICAgIHRoaXMuX3JlcXVpcmVkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQgfHwgdGhpcy5pc1JlcXVpcmVkRXh0ZXJuYWxseSgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncmVxdWlyZWQnKSkge1xuICAgICAgICAvLyBGaXJlZm94IG5lZWRzIGV4cGxpY2l0bHkgc2V0IGFyaWEtcmVxdWlyZWQgdmFsdWUuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFSZXF1aXJlZCA9IGAke3RoaXMucmVxdWlyZWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVzZWQgYXMgJ29yJyBjaGVjayB0byB0aGUgY3VycmVudCByZXF1aXJlZCBzdGF0ZS5cbiAgICAgKiBDYW4gZS5nLiBiZSB1c2VkIHRvIHJlYWQgcmVxdWlyZWQgc3RhdGUgb2YgYSBncm91cC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaXNSZXF1aXJlZEV4dGVybmFsbHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFNiYlJlcXVpcmVkRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiUmVxdWlyZWRNaXhpblR5cGU+ICYgVDtcbn07XG4iLCJpbXBvcnQgeyBkZWZhdWx0Q29udmVydGVyLCB0eXBlIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJy4uL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGhvc3RBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwcmV2ZW50U2Nyb2xsT25TcGFjZWJhclByZXNzIH0gZnJvbSAnLi4vZXZlbnRpbmcuanMnO1xuaW1wb3J0IHsgaTE4bkNoZWNrYm94UmVxdWlyZWQgfSBmcm9tICcuLi9pMThuLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHsgU2JiRGlzYWJsZWRNaXhpbiwgdHlwZSBTYmJEaXNhYmxlZE1peGluVHlwZSB9IGZyb20gJy4vZGlzYWJsZWQtbWl4aW4uanMnO1xuaW1wb3J0IHtcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICB0eXBlIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlLFxufSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5pbXBvcnQgeyBTYmJSZXF1aXJlZE1peGluLCB0eXBlIFNiYlJlcXVpcmVkTWl4aW5UeXBlIH0gZnJvbSAnLi9yZXF1aXJlZC1taXhpbi5qcyc7XG5cbnR5cGUgQ2hlY2tlZFNldHRlclZhbHVlID0geyB2YWx1ZTogYm9vbGVhbjsgYXR0cmlidXRlOiBib29sZWFuIH07XG5cbmV4cG9ydCBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGVcbiAgZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZVxuICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRNaXhpblR5cGU+LCBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPlxue1xuICBwdWJsaWMgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbjtcbiAgcHVibGljIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKTtcblxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKTtcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pO1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLCByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIEZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIGNoZWNrYm94IGNvbnRyb2xzLlxuICpcbiAqIEluaGVyaXRlZCBjbGFzc2VzIE1VU1QgaW1wbGVtZW50IHRoZSBhcmlhQ2hlY2tlZCBzdGF0ZSAoRWxlbWVudEludGVybmFscykgdGhlbXNlbHZlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZT4gJiBUID0+IHtcbiAgQGhvc3RBdHRyaWJ1dGVzKHtcbiAgICB0YWJpbmRleDogJzAnLFxuICB9KVxuICBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94RWxlbWVudFxuICAgIGV4dGVuZHMgU2JiRGlzYWJsZWRNaXhpbihTYmJSZXF1aXJlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oc3VwZXJDbGFzcykpKVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPlxuICB7XG4gICAgcHJpdmF0ZSBfYXR0cmlidXRlTXV0YXRpb25CbG9ja2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb250cm9sbGVyID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyBjaGVja2VkLiAqL1xuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgY29udmVydGVyOiB7XG4gICAgICAgIC4uLmRlZmF1bHRDb252ZXJ0ZXIsXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byB0aGUgc2V0dGVyIHNvIHRoYXQgd2Uga25vdyBpdCB3YXMgY2FsbGVkIGJ5IGF0dHJpYnV0ZSBjaGFuZ2UuXG4gICAgICAgIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IHVua25vd24pOiBDaGVja2VkU2V0dGVyVmFsdWUgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZmF1bHRDb252ZXJ0ZXIuZnJvbUF0dHJpYnV0ZT8uKHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBhdHRyaWJ1dGU6IHRydWUgfSBhcyBDaGVja2VkU2V0dGVyVmFsdWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pXG4gICAgcHVibGljIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVTZXR0ZXIgPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gKHZhbHVlIGFzIHVua25vd24gYXMgQ2hlY2tlZFNldHRlclZhbHVlKS5hdHRyaWJ1dGUgOiBmYWxzZTtcbiAgICAgIGlmIChhdHRyaWJ1dGVTZXR0ZXIpIHtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgdW5rbm93biBhcyBDaGVja2VkU2V0dGVyVmFsdWUpLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBcyBzb29uIGFzIG11dGF0aW9uIHdhcyBkb25lIG5vdCBieSBzZXR0aW5nIGF0dHJpYnV0ZSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gYmxvY2sgc3luY2luZyBhdHRyaWJ1dGUuXG4gICAgICBpZiAodGhpcy5oYXNVcGRhdGVkICYmICFhdHRyaWJ1dGVTZXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fYXR0cmlidXRlTXV0YXRpb25CbG9ja2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICAgIH1cbiAgICBwcml2YXRlIF9jaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIHR5cGUgb2YgZWxlbWVudC5cbiAgICAgKiBAZGVmYXVsdCAnY2hlY2tib3gnXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ2NoZWNrYm94JztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgdGhpcy5pbnRlcm5hbHMucm9sZSA9ICdjaGVja2JveCc7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjbGljaycsIHRoaXMuX2hhbmRsZVVzZXJJbnRlcmFjdGlvbik7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5ZG93bicsIHByZXZlbnRTY3JvbGxPblNwYWNlYmFyUHJlc3MpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleXVwJywgdGhpcy5faGFuZGxlS2V5Ym9hcmRJbnRlcmFjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIG9sZDogc3RyaW5nIHwgbnVsbCxcbiAgICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICk6IHZvaWQge1xuICAgICAgLy8gQXR0cmlidXRlIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYWZ0ZXIgcHJvZ3JhbW1hdGljIG9yIG1hbnVhbCBzdGF0ZSBjaGFuZ2UuXG4gICAgICBpZiAobmFtZSAhPT0gJ2NoZWNrZWQnIHx8ICF0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQpIHtcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuZXZlciB0aGUgZm9ybSBpcyBiZWluZyByZXNldC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMuaGFzQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMgXCJyZXN0b3JlXCIsIG9yIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGZ1bGZpbGwgYXV0b2ZpbGwgb24gYmVoYWxmIG9mXG4gICAgICogIHVzZXIgaW4gd2hpY2ggY2FzZSByZWFzb24gaXMgXCJhdXRvY29tcGxldGVcIi5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2YgXCJyZXN0b3JlXCIsIHN0YXRlIGlzIGEgc3RyaW5nLCBGaWxlLCBvciBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiAgcHJldmlvdXNseSBzZXQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRGb3JtVmFsdWUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5jaGVja2VkID0gc3RhdGUgPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGxvZ2ljIHdoaWNoIGlzIGJlaW5nIGV4ZWN1dGVkIHdoZW4gdXNlclxuICAgICAqIGludGVyYWN0aW9uIGhhcHBlbnMgYW5kIHN0YXRlIGlzIG5vdCBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlLCBgJHt0aGlzLmNoZWNrZWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHwgbmFtZSA9PT0gJ2NoZWNrZWQnIHx8IG5hbWUgPT09ICdyZXF1aXJlZCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgICAgc3VwZXIudmFsaWRhdGUoKTtcbiAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICF0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoXG4gICAgICAgICAgJ3ZhbHVlTWlzc2luZycsXG4gICAgICAgICAgaTE4bkNoZWNrYm94UmVxdWlyZWRbdGhpcy5fbGFuZ3VhZ2VDb250cm9sbGVyLmN1cnJlbnRdLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVWYWxpZGl0eUZsYWcoJ3ZhbHVlTWlzc2luZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdHJpZ2dlcmVkIG9uIGtleWJvYXJkIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCBjaGVja2JveC4gKi9cbiAgICBwcml2YXRlIF9oYW5kbGVLZXlib2FyZEludGVyYWN0aW9uID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVXNlckludGVyYWN0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBNZXRob2QgdHJpZ2dlcmVkIG9uIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCBjaGVja2JveC4gKi9cbiAgICBwcml2YXRlIF9oYW5kbGVVc2VySW50ZXJhY3Rpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLndpdGhVc2VySW50ZXJhY3Rpb24/LigpO1xuICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDtcbiAgICAgIHRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IHRydWU7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7IGNvbXBvc2VkOiB0cnVlLCBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94RWxlbWVudCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiIsImltcG9ydCB7IGh0bWwsIGlzU2VydmVyLCB0eXBlIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yIH0gZnJvbSAnLi4vYTExeS5qcyc7XG5pbXBvcnQgeyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBpc0ZpcmVmb3gsIGlzV2Via2l0IH0gZnJvbSAnLi4vZG9tLmpzJztcbmltcG9ydCB7IGkxOG5JbnB1dFJlcXVpcmVkIH0gZnJvbSAnLi4vaTE4bi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgdHlwZSBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSxcbn0gZnJvbSAnLi9mb3JtLWFzc29jaWF0ZWQtbWl4aW4uanMnO1xuaW1wb3J0IHsgU2JiUmVxdWlyZWRNaXhpbiwgdHlwZSBTYmJSZXF1aXJlZE1peGluVHlwZSB9IGZyb20gJy4vcmVxdWlyZWQtbWl4aW4uanMnO1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW5UeXBlXG4gIGV4dGVuZHMgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGVcbiAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPlxue1xuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKTtcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsdWU6IGJvb2xlYW4pO1xuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbik7XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpO1xuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZztcblxuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24pOiB2b2lkO1xuXG4gIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBsYW5ndWFnZTogU2JiTGFuZ3VhZ2VDb250cm9sbGVyO1xufVxuXG4vKipcbiAqIFRoZSBTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW4gZW5hYmxlcyBuYXRpdmUgZm9ybSBzdXBwb3J0IGZvciB0ZXh0IGlucHV0IGNvbnRyb2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRJbnB1dE1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZElucHV0RWxlbWVudFxuICAgIGV4dGVuZHMgU2JiUmVxdWlyZWRNaXhpbihTYmJGb3JtQXNzb2NpYXRlZE1peGluKHN1cGVyQ2xhc3MpKVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW5UeXBlPlxuICB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hdGl2ZSB0ZXh0IGlucHV0IGNoYW5nZXMgdGhlIHZhbHVlIHByb3BlcnR5IHdoZW4gdGhlIHZhbHVlIGF0dHJpYnV0ZSBpc1xuICAgICAqIGNoYW5nZWQgdW5kZXIgdGhlIGNvbmRpdGlvbiB0aGF0IG5vIGlucHV0IGV2ZW50IGhhcyBvY2N1cmVkIHNpbmNlIGNyZWF0aW9uXG4gICAgICogb3IgdGhlIGxhc3QgZm9ybSByZXNldC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pbnRlcmFjdGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQW4gZWxlbWVudCB3aXRoIGNvbnRlbnRlZGl0YWJsZSB3aWxsIG5vdCBlbWl0IGEgY2hhbmdlIGV2ZW50LiBUbyBhY2hpZXZlIHBhcml0eVxuICAgICAqIHdpdGggYSBuYXRpdmUgdGV4dCBpbnB1dCwgd2UgbmVlZCB0byB0cmFjayB3aGV0aGVyIGEgY2hhbmdlIGV2ZW50IHNob3VsZCBiZVxuICAgICAqIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2hvdWxkRW1pdENoYW5nZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEEgbmF0aXZlIHRleHQgaW5wdXQgYXR0ZW1wdHMgdG8gc3VibWl0IHRoZSBmb3JtIHdoZW4gcHJlc3NpbmcgRW50ZXIuXG4gICAgICogVGhpcyBjYW4gYmUgcHJldmVudGVkIGJ5IGNhbGxpbmcgcHJldmVudERlZmF1bHQgb24gdGhlIGtleWRvd24gZXZlbnQuXG4gICAgICogV2UgdHJhY2sgd2hldGhlciB0byByZXF1ZXN0IHN1Ym1pdCwgd2hpY2ggc2hvdWxkIG9jY3VyIGJlZm9yZSB0aGUga2V5dXBcbiAgICAgKiBldmVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaG91bGRUcmlnZ2VyU3VibWl0ID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAgICogQGRlZmF1bHQgJ3RleHQnXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ3RleHQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgc3VwZXIudmFsdWUgPSB0aGlzLl9jbGVhblRleHQodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICB0aGlzLmlubmVySFRNTCA9IHN1cGVyLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gc3VwZXIudmFsdWUgPz8gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIHJlYWRvbmx5LlxuICAgICAqIEBhdHRyIHJlYWRvbmx5XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIHNldCByZWFkT25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgISF2YWx1ZSk7XG4gICAgICB0aGlzLmludGVybmFscy5hcmlhUmVhZE9ubHkgPSB2YWx1ZSA/ICd0cnVlJyA6IG51bGw7XG4gICAgICB0aGlzLl91cGRhdGVDb250ZW50ZWRpdGFibGUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQuXG4gICAgICogQGF0dHIgZGlzYWJsZWRcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAhIXZhbHVlKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFEaXNhYmxlZCA9IHZhbHVlID8gJ3RydWUnIDogbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZUNvbnRlbnRlZGl0YWJsZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgICBwdWJsaWMgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgncGxhY2Vob2xkZXInKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFQbGFjZWhvbGRlciA9IHZhbHVlID8gdmFsdWUgOiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJykgPz8gJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgIHRoaXMuaW50ZXJuYWxzLnJvbGUgPSAndGV4dGJveCc7XG4gICAgICAvLyBXZSBwcmltYXJpbHkgdXNlIGNhcHR1cmUgZXZlbnQgbGlzdGVuZXJzLCBhcyB3ZSB3YW50XG4gICAgICAvLyBvdXIgbGlzdGVuZXJzIHRvIG9jY3VyIGJlZm9yZSBjb25zdW1lciBldmVudCBsaXN0ZW5lcnMuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LihcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHN1cGVyLnZhbHVlID0gdGhpcy5fY2xlYW5UZXh0KHRoaXMudGV4dENvbnRlbnQgPz8gJycpO1xuICAgICAgICAgIHRoaXMuX2ludGVyYWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3Nob3VsZEVtaXRDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignY2hhbmdlJywgKCkgPT4gKHRoaXMuX3Nob3VsZEVtaXRDaGFuZ2UgPSBmYWxzZSksIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKFxuICAgICAgICAna2V5ZG93bicsXG4gICAgICAgIChldmVudCkgPT4ge1xuICAgICAgICAgIC8vIFdlIHByZXZlbnQgcmVjdXJzaXZlIGV2ZW50cyBieSBjaGVja2luZyB0aGUgb3JpZ2luYWwgZXZlbnQgZm9yIGlzVHJ1c3RlZFxuICAgICAgICAgIC8vIHdoaWNoIGlzIGZhbHNlIGZvciBtYW51YWxseSBkaXNwYXRjaGVkIGV2ZW50cyAod2hpY2ggd2UgZGlzcGF0Y2ggYmVsb3cpLlxuICAgICAgICAgIGlmICgoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ1xcbicpICYmIGV2ZW50LmlzVHJ1c3RlZCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5fc2hvdWxkVHJpZ2dlclN1Ym1pdCA9IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCgna2V5ZG93bicsIGV2ZW50KSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGlzV2Via2l0ICYmXG4gICAgICAgICAgICB0aGlzLnZhbHVlICYmXG4gICAgICAgICAgICAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fCBldmVudC5rZXkgPT09ICdEZWxldGUnKSAmJlxuICAgICAgICAgICAgZXZlbnQuaXNUcnVzdGVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJbiBXZWJraXQgcHJlc3NpbmcgQmFja3NwYWNlIG9yIERlbGV0ZSBjb21wbGV0ZWx5IHJlbW92ZXMgYWxsIHRoZSBjb250ZW50XG4gICAgICAgICAgICAvLyBpZiBjb250ZW50ZWRpdGFibGUgaXMgc2V0IG9uIGEgd2ViIGNvbXBvbmVudCBob3N0LlxuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZXBsaWNhdGUgdGhlIG5vcm1hbCBkZWxldGUgYmVoYXZpb3IuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnQpKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkUmFuZ2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRSYW5nZS5zdGFydE9mZnNldCAhPT0gc2VsZWN0ZWRSYW5nZS5lbmRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYSB0ZXh0IHJhbmdlIGlzIHNlbGVjdGVkLCB0aGVuIGRlbGV0ZSB0aGlzIHJhbmdlXG4gICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hJbnB1dEV2ZW50KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgJiYgc2VsZWN0ZWRSYW5nZS5zdGFydE9mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzc2luZyBCYWNrc3BhY2UsIHdlIHNlbGVjdCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGZyb21cbiAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGFuZCBkZWxldGUgaXQuXG4gICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2Uuc2V0U3RhcnQoc2VsZWN0ZWRSYW5nZS5zdGFydENvbnRhaW5lciwgc2VsZWN0ZWRSYW5nZS5zdGFydE9mZnNldCAtIDEpO1xuICAgICAgICAgICAgICBzZWxlY3RlZFJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoSW5wdXRFdmVudCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdEZWxldGUnICYmIHNlbGVjdGVkUmFuZ2UuZW5kT2Zmc2V0IDwgdGhpcy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gV2hlbiBwcmVzc2luZyBEZWxldGUsIHdlIHNlbGVjdCB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbVxuICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gYW5kIGRlbGV0ZSBpdC5cbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZS5zZXRFbmQoc2VsZWN0ZWRSYW5nZS5lbmRDb250YWluZXIsIHNlbGVjdGVkUmFuZ2UuZW5kT2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgIHNlbGVjdGVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hJbnB1dEV2ZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LihcbiAgICAgICAgJ2tleXVwJyxcbiAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlSWZOZWNlc3NhcnkoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zaG91bGRUcmlnZ2VyU3VibWl0KSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Nob3VsZFRyaWdnZXJTdWJtaXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtPy5yZXF1ZXN0U3VibWl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICAvLyBjb250ZW50ZWRpdGFibGUgYWxsb3dzIHBhc3RpbmcgcmljaCBjb250ZW50IGludG8gaXRzIGhvc3QuXG4gICAgICAvLyBXZSBwcmV2ZW50IHRoaXMgYnkgbGlzdGVuaW5nIHRvIHRoZSBwYXN0ZSBldmVudCBhbmRcbiAgICAgIC8vIGV4dHJhY3RpbmcgdGhlIHBsYWluIHRleHQgZnJvbSB0aGUgcGFzdGVkIGNvbnRlbnRcbiAgICAgIC8vIGFuZCBpbnNlcnRpbmcgaXQgaW50byB0aGUgc2VsZWN0ZWQgcmFuZ2UgKGN1cnNvciBwb3NpdGlvblxuICAgICAgLy8gb3Igc2VsZWN0aW9uKS5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdwYXN0ZScsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuX2NsZWFuVGV4dChlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvcGxhaW4nKSA/PyAnJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWRSYW5nZSB8fCAhdGV4dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgc2VsZWN0ZWRSYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICAgICAgc2VsZWN0ZWRSYW5nZS5zZXRTdGFydChzZWxlY3RlZFJhbmdlLmVuZENvbnRhaW5lciwgc2VsZWN0ZWRSYW5nZS5lbmRPZmZzZXQpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaElucHV0RXZlbnQoKTtcbiAgICAgIH0pO1xuICAgICAgLy8gV2hlbiBmb2N1c2luZyBhIHRleHQgaW5wdXQgdmlhIGtleWJvYXJkLCB0aGUgdGV4dCBjb250ZW50IHNob3VsZCBiZSBzZWxlY3RlZC5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdmb2N1cycsICgpID0+IHtcbiAgICAgICAgaWYgKHNiYklucHV0TW9kYWxpdHlEZXRlY3Rvci5tb3N0UmVjZW50TW9kYWxpdHkgPT09ICdrZXlib2FyZCcpIHtcbiAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LnNlbGVjdEFsbENoaWxkcmVuKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIE9uIGJsdXIgdGhlIG5hdGl2ZSB0ZXh0IGlucHV0IHNjcm9sbHMgdGhlIHRleHQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LlxuICAgICAgLy8gV2UgbWltaWNrIHRoYXQgYnkgcmVzZXR0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24uXG4gICAgICAvLyBXZSBhbHNvIHVuc2V0IGFueSBzZWxlY3Rpb24gdG8gYWxpZ24gd2l0aCB0aGUgbmF0aXZlIHRleHQgaW5wdXQuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LihcbiAgICAgICAgJ2JsdXInLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlSWZOZWNlc3NhcnkoKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSAwO1xuICAgICAgICB9LFxuICAgICAgICB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFNdWx0aUxpbmUgPSAnZmFsc2UnO1xuICAgICAgdGhpcy5fdXBkYXRlQ29udGVudGVkaXRhYmxlKCk7XG5cbiAgICAgIC8vIFdlIHdhbnQgdG8gcmVwbGFjZSBhbnkgY29udGVudCBieSBqdXN0IHRoZSB0ZXh0IGNvbnRlbnQuXG4gICAgICB0aGlzLmlubmVySFRNTCA9IHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGZvY3VzKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZvY3VzKG9wdGlvbnMpO1xuICAgICAgLy8gQnkgZGVmYXVsdCwgd2hlbiBjYWxsaW5nIGZvY3VzIG9uIGFuIGlucHV0IGVsZW1lbnQsIHRoZSBjdXJzb3IgaXMgcGxhY2VkXG4gICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCB0ZXh0LiBIb3dldmVyLCB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgdGhlIGN1cnNvclxuICAgICAgLy8gaXMgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcsIHNvIHdlIG1vdmUgaXQgdG8gdGhlIGVuZCwgaWYgdGhhdCBpcyB0aGUgY2FzZS5cbiAgICAgIGlmICghaXNTZXJ2ZXIgJiYgIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZE9ubHkgJiYgdGhpcy52YWx1ZSkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByYW5nZSA9IHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCA/IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApIDogbnVsbDtcbiAgICAgICAgaWYgKHJhbmdlICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZXRTdGFydCh0aGlzLmZpcnN0Q2hpbGQhLCB0aGlzLnRleHRDb250ZW50IS5sZW5ndGgpO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBvbGQ6IHN0cmluZyB8IG51bGwsXG4gICAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChuYW1lICE9PSAndmFsdWUnIHx8ICF0aGlzLl9pbnRlcmFjdGVkKSB7XG4gICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZvcm0gaXMgYmVpbmcgcmVzZXQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZCB7XG4gICAgICB0aGlzLl9pbnRlcmFjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgPz8gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIENhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byByZXN0b3JlIGVsZW1lbnTigJlzIHN0YXRlIHRvIHN0YXRlIGluIHdoaWNoIGNhc2VcbiAgICAgKiAgcmVhc29uIGlzIFwicmVzdG9yZVwiLCBvciB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBmdWxmaWxsIGF1dG9maWxsIG9uIGJlaGFsZiBvZlxuICAgICAqICB1c2VyIGluIHdoaWNoIGNhc2UgcmVhc29uIGlzIFwiYXV0b2NvbXBsZXRlXCIuXG4gICAgICogIEluIHRoZSBjYXNlIG9mIFwicmVzdG9yZVwiLCBzdGF0ZSBpcyBhIHN0cmluZywgRmlsZSwgb3IgRm9ybURhdGEgb2JqZWN0XG4gICAgICogIHByZXZpb3VzbHkgc2V0IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gc2V0Rm9ybVZhbHVlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICAgIF9yZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUodGhpcy52YWx1ZSwgdGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHwgbmFtZSA9PT0gJ3ZhbHVlJyB8fCBuYW1lID09PSAncmVxdWlyZWQnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICAgIHN1cGVyLnZhbGlkYXRlKCk7XG4gICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAhdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnNldFZhbGlkaXR5RmxhZygndmFsdWVNaXNzaW5nJywgaTE4bklucHV0UmVxdWlyZWRbdGhpcy5sYW5ndWFnZS5jdXJyZW50XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVZhbGlkaXR5RmxhZygndmFsdWVNaXNzaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2xlYW5UZXh0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgLy8gVGhlIG5hdGl2ZSB0ZXh0IGlucHV0IHJlbW92ZXMgYWxsIG5ld2xpbmUgY2hhcmFjdGVycyBpZiBwYXNzZWQgdG8gdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC9bXFxuXFxyXSsvZywgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Rpc3BhdGNoSW5wdXRFdmVudCgpOiB2b2lkIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBAZXZlbnRPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgIHByaXZhdGUgX2NsZWFuQ2hpbGRyZW4oKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGlsZEVsZW1lbnRDb3VudCkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF91cGRhdGVDb250ZW50ZWRpdGFibGUoKTogdm9pZCB7XG4gICAgICBpZiAoIWlzU2VydmVyICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgLy8gRmlyZWZveCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBwbGFpbnRleHQtb25seS4gT25jZSB0aGlzIGlzIGF2YWlsYWJsZVxuICAgICAgICAvLyBmb3Igb3VyIHN1cHBvcnRlZCBicm93c2VyIHJhbmdlLCB3ZSBjYW4gc3dpdGNoIHRvIGl0IGZ1bGx5LlxuICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRPbmx5ID8gJ2ZhbHNlJyA6IGlzRmlyZWZveCA/ICd0cnVlJyA6ICdwbGFpbnRleHQtb25seSc7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB2YWx1ZSk7XG4gICAgICAgIC8vIEluIHRoZSByZWFkb25seSBjYXNlLCB3ZSBkaXNhYmxlIGNvbnRlbnRlZGl0YWJsZSwgYnV0IGl0IHN0aWxsXG4gICAgICAgIC8vIG5lZWRzIHRvIGJlIGZvY3VzYWJsZS4gV2UgYWNoaWV2ZSB0aGlzIGJ5IHNldHRpbmcgdGFiaW5kZXggaW4gdGhhdCBjYXNlLlxuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbWl0Q2hhbmdlSWZOZWNlc3NhcnkoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5fc2hvdWxkRW1pdENoYW5nZSkge1xuICAgICAgICB0aGlzLl9zaG91bGRFbWl0Q2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiB1bmtub3duIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5fY2xlYW5DaGlsZHJlbn0+PC9zbG90PmA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRFbGVtZW50IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRJbnB1dE1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuIiwiaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgTGl0RWxlbWVudCwgdHlwZSBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgZ2V0TmV4dEVsZW1lbnRJbmRleCwgaW50ZXJhY3Rpdml0eUNoZWNrZXIsIGlzQXJyb3dLZXlQcmVzc2VkIH0gZnJvbSAnLi4vYTExeS5qcyc7XG5pbXBvcnQgeyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIsIFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJy4uL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGkxOG5TZWxlY3Rpb25SZXF1aXJlZCB9IGZyb20gJy4uL2kxOG4uanMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJEaXNhYmxlZE1peGluLCB0eXBlIFNiYkRpc2FibGVkTWl4aW5UeXBlIH0gZnJvbSAnLi9kaXNhYmxlZC1taXhpbi5qcyc7XG5pbXBvcnQge1xuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIHR5cGUgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGUsXG59IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcbmltcG9ydCB7IFNiYlJlcXVpcmVkTWl4aW4sIHR5cGUgU2JiUmVxdWlyZWRNaXhpblR5cGUgfSBmcm9tICcuL3JlcXVpcmVkLW1peGluLmpzJztcblxuLyoqXG4gKiBBIHN0YXRpYyByZWdpc3RyeSB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBncm91cGVkIGByYWRpby1idXR0b25zYC5cbiAqIEdyb3VwcyBvZiByYWRpbyBidXR0b25zIGFyZSBsb2NhbCB0byB0aGUgZm9ybSB0aGV5IGJlbG9uZyAob3IgdGhlIGByZW5kZXJSb290YCBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIGFueSBmb3JtKVxuICogTXVsdGlwbGUgZ3JvdXBzIG9mIHJhZGlvIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gY29leGlzdCAoYXMgbG9uZyBhcyB0aGV5IGJlbG9uZyB0byBhIGRpZmZlcmVudCBmb3JtIC8gcmVuZGVyUm9vdClcbiAqIEl0IGlzIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIHN0YW5kYWxvbmUgZ3JvdXBzIG9mIHJhZGlvcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcmFkaW9CdXR0b25SZWdpc3RyeSA9IG5ldyBXZWFrTWFwPFxuICBOb2RlLFxuICBNYXA8c3RyaW5nLCBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4+XG4+KCk7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGVcbiAgZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZVxuICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRNaXhpblR5cGU+LCBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPlxue1xuICBwdWJsaWMgYWNjZXNzb3IgY2hlY2tlZDogYm9vbGVhbjtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkOiBib29sZWFuO1xuICBwdWJsaWMgYWNjZXNzb3IgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFzc29jaWF0ZWRSYWRpb0J1dHRvbnM/OiBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT47XG4gIC8qKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgdXNlZCBpbnRlcm5hbGx5LiAqL1xuICBwcm90ZWN0ZWQgYWJvcnQ6IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlcjtcblxuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24pOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNSZXF1aXJlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHdpdGhVc2VySW50ZXJhY3Rpb24/KCk6IHZvaWQ7XG4gIHByb3RlY3RlZCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbiAgcHJvdGVjdGVkIHVwZGF0ZUZvY3VzYWJsZVJhZGlvcygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgZW1pdENoYW5nZUV2ZW50cygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGVCeUtleWJvYXJkKHJhZGlvOiBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBUaGUgU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluIGVuYWJsZXMgbmF0aXZlIGZvcm0gc3VwcG9ydCBmb3IgcmFkaW8gY29udHJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+ICYgVCA9PiB7XG4gIGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50XG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZE1peGluKFNiYlJlcXVpcmVkTWl4aW4oU2JiRm9ybUFzc29jaWF0ZWRNaXhpbihzdXBlckNsYXNzKSkpXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+XG4gIHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSByYWRpbyBidXR0b24gaXMgY2hlY2tlZC5cbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9jaGVja2VkID0gISF2YWx1ZTtcblxuICAgICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtY2hlY2tlZCcsIHRoaXMuY2hlY2tlZCk7XG4gICAgICB0aGlzLmludGVybmFscy5hcmlhQ2hlY2tlZCA9IHRoaXMuY2hlY2tlZC50b1N0cmluZygpO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplR3JvdXBTdGF0ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tlZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyLm5hbWUgPSB2YWx1ZTtcblxuICAgICAgdGhpcy5fZGlzY29ubmVjdEZyb21SZWdpc3RyeSgpO1xuICAgICAgdGhpcy5fY29ubmVjdFRvUmVnaXN0cnkoKTtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplR3JvdXBTdGF0ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzdXBlci5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgICAqIEBkZWZhdWx0ICdyYWRpbydcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAncmFkaW8nO1xuICAgIH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgdXNlZCBpbnRlcm5hbGx5LiAqL1xuICAgIHByb3RlY3RlZCBhYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgcmFkaW8gYnV0dG9ucyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHNhbWUgZ3JvdXAgb2YgYHRoaXNgLlxuICAgICAqIEFzc3VtZSB0aGVtIG9yZGVyZWQgaW4gRE9NIG9yZGVyXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzc29jaWF0ZWRSYWRpb0J1dHRvbnM/OiBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnQ+O1xuICAgIHByaXZhdGUgX3JhZGlvQnV0dG9uR3JvdXBzTWFwPzogTWFwPHN0cmluZywgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+PjtcbiAgICBwcml2YXRlIF9kaWRMb2FkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb250cm9sbGVyID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmludGVybmFscy5yb2xlID0gJ3JhZGlvJztcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdrZXlkb3duJywgKGUpID0+IHRoaXMuX2hhbmRsZUFycm93S2V5RG93bihlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuX2Nvbm5lY3RUb1JlZ2lzdHJ5KCk7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5fZGlzY29ubmVjdEZyb21SZWdpc3RyeSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuZXZlciB0aGUgZm9ybSBpcyBiZWluZyByZXNldC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZCB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLmhhc0F0dHJpYnV0ZSgnY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyBcInJlc3RvcmVcIiwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyBcImF1dG9jb21wbGV0ZVwiLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICB0aGlzLl9kaWRMb2FkID0gdHJ1ZTtcbiAgICAgIHRoaXMudXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIG9uIGB2YWx1ZWAgY2hhbmdlXG4gICAgICogSWYgJ2NoZWNrZWQnLCB1cGRhdGUgdGhlIHZhbHVlLiBPdGhlcndpc2UsIGRvIG5vdGhpbmcuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRWYWxpZGF0ZShuYW1lOiBQcm9wZXJ0eUtleSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZFZhbGlkYXRlKG5hbWUpIHx8IG5hbWUgPT09ICdjaGVja2VkJyB8fCBuYW1lID09PSAncmVxdWlyZWQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbGlkaXR5IG9mIGFsbCBhc3NvY2lhdGVkIHJhZGlvIGJ1dHRvbnMuXG4gICAgICogSWYgYW55IHJhZGlvIGJ1dHRvbiBpcyByZXF1aXJlZCwgYWxsIGFzc29jaWF0ZWQgYXJlIHJlcXVpcmVkIGFzIHdlbGwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgICAgc3VwZXIudmFsaWRhdGUoKTtcbiAgICAgIGlmICghdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHJlcXVpcmVkID0gZmFsc2U7XG4gICAgICBsZXQgY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMpIHtcbiAgICAgICAgcmVxdWlyZWQgfHw9IHJhZGlvLnJlcXVpcmVkO1xuICAgICAgICBjaGVja2VkIHx8PSByYWRpby5jaGVja2VkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWlyZWQgJiYgIWNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zLmZvckVhY2goKHIpID0+XG4gICAgICAgICAgci5zZXRWYWxpZGl0eUZsYWcoXG4gICAgICAgICAgICAndmFsdWVNaXNzaW5nJyxcbiAgICAgICAgICAgIGkxOG5TZWxlY3Rpb25SZXF1aXJlZFt0aGlzLl9sYW5ndWFnZUNvbnRyb2xsZXIuY3VycmVudF0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucy5mb3JFYWNoKChyKSA9PiByLnJlbW92ZVZhbGlkaXR5RmxhZygndmFsdWVNaXNzaW5nJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ubHkgYSBzaW5nbGUgcmFkaW8gc2hvdWxkIGJlIGZvY3VzYWJsZSBpbiB0aGUgZ3JvdXAuIERlZmluZWQgYXM6XG4gICAgICogLSB0aGUgY2hlY2tlZCByYWRpbztcbiAgICAgKiAtIHRoZSBmaXJzdCBub24tZGlzYWJsZWQgcmFkaW8gaW4gRE9NIG9yZGVyO1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVGb2N1c2FibGVSYWRpb3MoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuX2RpZExvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmFkaW9zID0gdGhpcy5faW50ZXJhY3RhYmxlR3JvdXBlZFJhZGlvcygpO1xuICAgICAgY29uc3QgY2hlY2tlZEluZGV4ID0gcmFkaW9zLmZpbmRJbmRleCgocikgPT4gci5jaGVja2VkICYmICFyLmRpc2FibGVkICYmICFyLmZvcm1EaXNhYmxlZCk7XG4gICAgICBjb25zdCBmb2N1c2FibGVJbmRleCA9XG4gICAgICAgIGNoZWNrZWRJbmRleCAhPT0gLTFcbiAgICAgICAgICA/IGNoZWNrZWRJbmRleFxuICAgICAgICAgIDogcmFkaW9zLmZpbmRJbmRleCgocikgPT4gIXIuZGlzYWJsZWQgJiYgIXIuZm9ybURpc2FibGVkKTsgLy8gR2V0IHRoZSBmaXJzdCBmb2N1c2FibGUgcmFkaW9cblxuICAgICAgaWYgKGZvY3VzYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICByYWRpb3NbZm9jdXNhYmxlSW5kZXhdLnRhYkluZGV4ID0gMDtcbiAgICAgICAgcmFkaW9zLnNwbGljZShmb2N1c2FibGVJbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHRhYkluZGV4IG9uIG90aGVyIHJhZGlvc1xuICAgICAgcmFkaW9zLmZvckVhY2goKHIpID0+IHIucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbmF2aWdhdGVCeUtleWJvYXJkKG5leHQ6IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBuZXh0LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnRzKCk7XG5cbiAgICAgIGF3YWl0IG5leHQudXBkYXRlQ29tcGxldGU7XG4gICAgICBuZXh0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRDaGFuZ2VFdmVudHMoKTogdm9pZCB7XG4gICAgICAvLyBNYW51YWxseSBkaXNwYXRjaCBldmVudHMgdG8gc2ltdWxhdGUgYSB1c2VyIGludGVyYWN0aW9uXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zeW5jaHJvbml6ZUdyb3VwU3RhdGUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2Rlc2VsZWN0R3JvdXBlZFJhZGlvcygpO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYHRoaXNgIHRvIHRoZSByYWRpb0J1dHRvbiByZWdpc3RyeVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nvbm5lY3RUb1JlZ2lzdHJ5KCk6IHZvaWQge1xuICAgICAgaWYgKCF0aGlzLm5hbWUgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb290ID0gdGhpcy5mb3JtID8/IHRoaXMuZ2V0Um9vdE5vZGUoKTtcbiAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gcmFkaW9CdXR0b25SZWdpc3RyeS5nZXQocm9vdCk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlICdyb290JyBtYXAgZW50cnlcbiAgICAgIGlmICghdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXApIHtcbiAgICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJhZGlvQnV0dG9uUmVnaXN0cnkuc2V0KHJvb3QsIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID0gdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXAuZ2V0KFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICApIGFzIHVua25vd24gYXMgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25FbGVtZW50PjtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgc2V0XG4gICAgICBpZiAoIXRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucykge1xuICAgICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwLnNldChcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zIGFzIHVua25vd24gYXMgU2V0PFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbnNlcnQgdGhlIG5ldyByYWRpbyBpbnRvIHRoZSBzZXQgYW5kIHNvcnQgZm9sbG93aW5nIHRoZSBET00gb3JkZXIuXG4gICAgICAvLyBTaW5jZSB0aGUgb3JkZXIgb2YgYSAnU2V0JyBpcyB0aGUgaW5zZXJ0IG9yZGVyLCB3ZSBoYXZlIHRvIGVtcHR5IGl0IGFuZCByZS1pbnNlcnQgcmFkaW9zIGluIG9yZGVyXG4gICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMpO1xuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zLmNsZWFyKCk7XG5cbiAgICAgIC8vIEZpbmQgYHRoaXNgIHBvc2l0aW9uIGFuZCBpbnNlcnQgaXRcbiAgICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoXG4gICAgICAgIChyKSA9PiB0aGlzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcsXG4gICAgICApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMCwgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyaWVzLnB1c2godGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcG9wdWxhdGUgdGhlIFNldFxuICAgICAgZW50cmllcy5mb3JFYWNoKChyKSA9PiB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMhLmFkZChyKSk7XG5cbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYHRoaXNgIGZyb20gdGhlIHJhZGlvQnV0dG9uIHJlZ2lzdHJ5IGFuZCwgaWYgdGhlIGdyb3VwIGlzIGVtcHR5LCBkZWxldGUgdGhlIGVudHJ5IGZyb20gdGhlIGdyb3VwcyBNYXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kaXNjb25uZWN0RnJvbVJlZ2lzdHJ5KCk6IHZvaWQge1xuICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zPy5kZWxldGUodGhpcyk7XG5cbiAgICAgIGlmICh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnM/LnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5fcmFkaW9CdXR0b25Hcm91cHNNYXA/LmRlbGV0ZSh0aGlzLm5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBsaXN0IG9mICdpbnRlcmFjdGFibGUnIGdyb3VwZWQgcmFkaW9zLCBvcmRlcmVkIGluIERPTSBvcmRlclxuICAgICAqL1xuICAgIHByaXZhdGUgX2ludGVyYWN0YWJsZUdyb3VwZWRSYWRpb3MoKTogU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMgPz8gW10pLmZpbHRlcigoZWwpID0+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+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiUGFuZWxFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIFNiYlBhbmVsTWl4aW5UeXBlIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICAgIHBhbmVsQ29ubmVjdGVkOiAncGFuZWxDb25uZWN0ZWQnLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvKiogVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHBhbmVsLiAqL1xuICAgIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnID0gJ3doaXRlJztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSB1bnNlbGVjdGVkIHBhbmVsIGhhcyBhIGJvcmRlci4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGJvcmRlcmxlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAaW50ZXJuYWwgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSBsYWJlbCB3aGVuIGluIGV4cGFuc2lvbiBwYW5lbCAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSgpXG4gICAgcHVibGljIGFjY2Vzc29yIGV4cGFuc2lvblN0YXRlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEludGVybmFsIGV2ZW50IHRoYXQgZW1pdHMgd2hlbiB0aGUgY2hlY2tib3ggaXMgbG9hZGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3BhbmVsQ29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgICAgdGhpcyxcbiAgICAgIFNiYlBhbmVsRWxlbWVudC5ldmVudHMucGFuZWxDb25uZWN0ZWQsXG4gICAgICB7IGJ1YmJsZXM6IHRydWUgfSxcbiAgICApO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5fcGFuZWxDb25uZWN0ZWQuZW1pdCgpO1xuXG4gICAgICB0aGlzLmNsb3Nlc3Q/Lignc2JiLXJhZGlvLWJ1dHRvbi1ncm91cCwgc2JiLWNoZWNrYm94LWdyb3VwJyk/LnRvZ2dsZUF0dHJpYnV0ZShcbiAgICAgICAgJ2RhdGEtaGFzLXBhbmVsJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFNiYlBhbmVsRWxlbWVudCBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlBhbmVsTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbi8vIERlZmluZSB0aGUgaW50ZXJmYWNlIGZvciB0aGUgbWl4aW5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZSB7XG4gIHByb3RlY3RlZCBzdGFydFVwZGF0ZSgpOiB2b2lkO1xuICBwcm90ZWN0ZWQgY29tcGxldGVVcGRhdGUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGlzIG1peGluIGFsbG93cyBzY2hlZHVsaW5nIG1hbnVhbCB1cGRhdGVzLCB3aGljaCBhZmZlY3QgdXBkYXRlQ29tcGxldGUuXG4gKiBAcGFyYW0gYmFzZSBUaGUgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHJldHVybnMgQSBjbGFzcyBleHRlbmRlZCB3aXRoIHRoZSBzbG90IGNoaWxkIG9ic2VydmVyIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIGJhc2U6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiVXBkYXRlU2NoZWR1bGVyRWxlbWVudFxuICAgIGV4dGVuZHMgYmFzZVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGU+XG4gIHtcbiAgICBwcml2YXRlIF91cGRhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcHJpdmF0ZSBfdXBkYXRlUmVzb2x2ZSA9ICgpOiB2b2lkID0+IHt9O1xuXG4gICAgcHJvdGVjdGVkIHN0YXJ0VXBkYXRlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiAodGhpcy5fdXBkYXRlUmVzb2x2ZSA9IHIpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29tcGxldGVVcGRhdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl91cGRhdGVSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVByb21pc2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiVXBkYXRlU2NoZWR1bGVyRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iXSwibmFtZXMiOlsiX2EiLCJzdGF0ZSIsIl9iIiwiZXZlbnRPcHRpb25zIiwiU2JiUGFuZWxFbGVtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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
|