@recursyve/nice-ui-kit.v2 14.0.0-beta.98 → 15.0.0-beta.119
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/esm2020/lib/api/interceptors/transform-response.interceptor.mjs +3 -3
- package/esm2020/lib/components/alert/alert.component.mjs +4 -4
- package/esm2020/lib/components/alert/alert.module.mjs +4 -4
- package/esm2020/lib/components/alert/alert.service.mjs +3 -3
- package/esm2020/lib/components/assets-carousel/assets-carousel.component.mjs +78 -49
- package/esm2020/lib/components/assets-carousel/assets-carousel.module.mjs +15 -10
- package/esm2020/lib/components/assets-carousel/directives/assets-carousel-active-content.directive.mjs +14 -0
- package/esm2020/lib/components/assets-carousel/public-api.mjs +2 -1
- package/esm2020/lib/components/async-typeahead/async-typeahead.component.mjs +48 -35
- package/esm2020/lib/components/async-typeahead/async-typeahead.module.mjs +4 -4
- package/esm2020/lib/components/async-typeahead/providers/async-typeahead.service.mjs +15 -4
- package/esm2020/lib/components/async-typeahead/public-api.mjs +2 -1
- package/esm2020/lib/components/base-form/base-form.component.mjs +5 -16
- package/esm2020/lib/components/base-form/base-form.module.mjs +4 -4
- package/esm2020/lib/components/base-form/form-submit.directive.mjs +3 -3
- package/esm2020/lib/components/card/card.component.mjs +3 -3
- package/esm2020/lib/components/card/card.module.mjs +4 -4
- package/esm2020/lib/components/carousel/carousel.component.mjs +7 -7
- package/esm2020/lib/components/carousel/carousel.module.mjs +4 -4
- package/esm2020/lib/components/carousel/picture-modal/picture-modal.component.mjs +3 -3
- package/esm2020/lib/components/carousel/picture-modal/picture-modal.service.mjs +3 -3
- package/esm2020/lib/components/carousel/pipe/carousel-layout.pipe.mjs +3 -3
- package/esm2020/lib/components/collapsable/collapsable.component.mjs +36 -0
- package/esm2020/lib/components/collapsable/collapsable.module.mjs +25 -0
- package/esm2020/lib/components/collapsable/index.mjs +2 -0
- package/esm2020/lib/components/collapsable/public-api.mjs +3 -0
- package/esm2020/lib/components/date-range-picker/components/header/header.component.mjs +57 -0
- package/esm2020/lib/components/date-range-picker/components/range-preset/range-preset.component.mjs +107 -0
- package/esm2020/lib/components/date-range-picker/date-range-picker.component.mjs +74 -0
- package/esm2020/lib/components/date-range-picker/date-range-picker.module.mjs +56 -0
- package/esm2020/lib/components/date-range-picker/index.mjs +2 -0
- package/esm2020/lib/components/date-range-picker/providers/date-range-picker.service.mjs +17 -0
- package/esm2020/lib/components/date-range-picker/public-api.mjs +3 -0
- package/esm2020/lib/components/drawer/drawer.component.mjs +3 -3
- package/esm2020/lib/components/drawer/drawer.module.mjs +4 -4
- package/esm2020/lib/components/drawer/drawer.service.mjs +3 -3
- package/esm2020/lib/components/export-bottom-sheet/export-bottom-sheet.component.mjs +5 -6
- package/esm2020/lib/components/export-bottom-sheet/export-bottom-sheet.module.mjs +4 -4
- package/esm2020/lib/components/export-bottom-sheet/providers/export-bottom-sheet.service.mjs +6 -6
- package/esm2020/lib/components/form-error/control-status.directive.mjs +31 -11
- package/esm2020/lib/components/form-error/form-error.component.mjs +12 -21
- package/esm2020/lib/components/form-error/form-error.module.mjs +6 -7
- package/esm2020/lib/components/horizontal-stepper/horizontal-stepper.component.mjs +3 -3
- package/esm2020/lib/components/horizontal-stepper/horizontal-stepper.module.mjs +4 -4
- package/esm2020/lib/components/horizontal-stepper/step.component.mjs +3 -3
- package/esm2020/lib/components/image-cropper/image-cropper.component.mjs +35 -35
- package/esm2020/lib/components/image-cropper/image-cropper.module.mjs +4 -4
- package/esm2020/lib/components/layout/layout.component.mjs +3 -3
- package/esm2020/lib/components/layout/layout.module.mjs +4 -4
- package/esm2020/lib/components/loading-spinner/loading-spinner.component.mjs +3 -3
- package/esm2020/lib/components/loading-spinner/loading-spinner.module.mjs +4 -4
- package/esm2020/lib/components/loading-spinner/loading.directive.mjs +10 -10
- package/esm2020/lib/components/lottie/lottie.component.mjs +3 -3
- package/esm2020/lib/components/lottie/lottie.module.mjs +4 -4
- package/esm2020/lib/components/navigation/components/hint-component-base.mjs +120 -0
- package/esm2020/lib/components/navigation/directives/show-hint.directive.mjs +187 -0
- package/esm2020/lib/components/navigation/horizontal/components/basic/basic.component.mjs +3 -3
- package/esm2020/lib/components/navigation/horizontal/components/branch/branch.component.mjs +6 -5
- package/esm2020/lib/components/navigation/horizontal/components/divider/divider.component.mjs +3 -3
- package/esm2020/lib/components/navigation/horizontal/components/spacer/spacer.component.mjs +3 -3
- package/esm2020/lib/components/navigation/horizontal/horizontal.component.mjs +13 -12
- package/esm2020/lib/components/navigation/navigation.component.mjs +3 -3
- package/esm2020/lib/components/navigation/navigation.module.mjs +18 -7
- package/esm2020/lib/components/navigation/navigation.service.mjs +3 -3
- package/esm2020/lib/components/navigation/navigation.types.mjs +1 -1
- package/esm2020/lib/components/navigation/pipes/should-hide.pipe.mjs +31 -0
- package/esm2020/lib/components/navigation/pipes/should-show-hint.pipe.mjs +32 -0
- package/esm2020/lib/components/navigation/providers/hide-item.resolver.mjs +3 -0
- package/esm2020/lib/components/navigation/providers/hint.resolver.mjs +3 -0
- package/esm2020/lib/components/navigation/providers/hint.service.mjs +20 -0
- package/esm2020/lib/components/navigation/public-api.mjs +4 -1
- package/esm2020/lib/components/navigation/vertical/components/aside/aside.component.mjs +3 -3
- package/esm2020/lib/components/navigation/vertical/components/basic/basic.component.mjs +8 -6
- package/esm2020/lib/components/navigation/vertical/components/collapsable/collapsable.component.mjs +7 -5
- package/esm2020/lib/components/navigation/vertical/components/divider/divider.component.mjs +3 -3
- package/esm2020/lib/components/navigation/vertical/components/group/group.component.mjs +6 -5
- package/esm2020/lib/components/navigation/vertical/components/spacer/spacer.component.mjs +3 -3
- package/esm2020/lib/components/navigation/vertical/vertical.component.mjs +47 -24
- package/esm2020/lib/components/public-api.mjs +4 -1
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +5 -5
- package/esm2020/lib/components/search-bar/search-bar.module.mjs +4 -4
- package/esm2020/lib/components/sweet-alert/sweet-alert.component.mjs +3 -3
- package/esm2020/lib/components/sweet-alert/sweet-alert.directive.mjs +3 -3
- package/esm2020/lib/components/sweet-alert/sweet-alert.module.mjs +4 -4
- package/esm2020/lib/components/sweet-alert/sweet-alert.service.mjs +3 -3
- package/esm2020/lib/components/toast/toast.component.mjs +4 -4
- package/esm2020/lib/components/toast/toast.module.mjs +4 -4
- package/esm2020/lib/components/toast/toast.service.mjs +3 -3
- package/esm2020/lib/components/toggle-button-group/toggle-button-group.component.mjs +5 -5
- package/esm2020/lib/components/toggle-button-group/toggle-button-group.module.mjs +4 -4
- package/esm2020/lib/components/toggle-button-group/toggle-button.component.mjs +3 -3
- package/esm2020/lib/components/translation-form/components/textarea/translation-form-textarea.component.mjs +37 -0
- package/esm2020/lib/components/translation-form/components/textfield/translation-form-textfield.component.mjs +25 -0
- package/esm2020/lib/components/translation-form/components/translation-form.component.mjs +164 -0
- package/esm2020/lib/components/translation-form/components/translation-form.module.mjs +71 -0
- package/esm2020/lib/components/translation-form/decorators/translation-form.decorator.mjs +4 -0
- package/esm2020/lib/components/translation-form/directives/translation-context.directive.mjs +34 -0
- package/esm2020/lib/components/translation-form/index.mjs +2 -0
- package/esm2020/lib/components/translation-form/providers/translation-form.service.mjs +46 -0
- package/esm2020/lib/components/translation-form/public-api.mjs +10 -0
- package/esm2020/lib/components/translation-form/toggle/translation-toggle.component.mjs +26 -0
- package/esm2020/lib/components/translation-form/translation.form.mjs +6 -0
- package/esm2020/lib/components/translation-form/validators/require-for-languages.validator.mjs +42 -0
- package/esm2020/lib/components/typeahead/directives/options-scroll.directive.mjs +3 -3
- package/esm2020/lib/components/typeahead/directives/options-scroll.module.mjs +4 -4
- package/esm2020/lib/components/typeahead/typeahead.component.mjs +60 -60
- package/esm2020/lib/components/typeahead/typeahead.module.mjs +4 -4
- package/esm2020/lib/directives/autofocus/autofocus.directive.mjs +3 -3
- package/esm2020/lib/directives/autofocus/autofocus.module.mjs +4 -4
- package/esm2020/lib/directives/autogrow/autogrow.directive.mjs +3 -3
- package/esm2020/lib/directives/autogrow/autogrow.module.mjs +4 -4
- package/esm2020/lib/directives/chip-async-typeahead/chip-async-typeahead.directive.mjs +3 -3
- package/esm2020/lib/directives/chip-list/chip-list-items/chip-list-item-label.directive.mjs +3 -3
- package/esm2020/lib/directives/chip-list/chip-list-items/chip-list-items.component.mjs +22 -8
- package/esm2020/lib/directives/chip-list/chip-list.constant.mjs +3 -0
- package/esm2020/lib/directives/chip-list/chip-list.directive.mjs +44 -17
- package/esm2020/lib/directives/chip-list/chip-list.module.mjs +24 -5
- package/esm2020/lib/directives/draggable-list/draggable-list.directive.mjs +94 -0
- package/esm2020/lib/directives/draggable-list/draggable-list.module.mjs +18 -0
- package/esm2020/lib/directives/draggable-list/index.mjs +2 -0
- package/esm2020/lib/directives/draggable-list/public-api.mjs +3 -0
- package/esm2020/lib/directives/dropzone/dropzone.directive.mjs +3 -3
- package/esm2020/lib/directives/dropzone/dropzone.module.mjs +4 -4
- package/esm2020/lib/directives/image-error-placeholder/image-error-placeholder.directive.mjs +3 -3
- package/esm2020/lib/directives/image-error-placeholder/image-error-placeholder.module.mjs +4 -4
- package/esm2020/lib/directives/material/material.module.mjs +4 -4
- package/esm2020/lib/directives/material/nice-material-style.directive.mjs +4 -4
- package/esm2020/lib/directives/material/nice-rounded-style.directive.mjs +4 -4
- package/esm2020/lib/directives/modals/modal-on-click.directive.mjs +3 -3
- package/esm2020/lib/directives/modals/modal-opener.directive.mjs +3 -3
- package/esm2020/lib/directives/public-api.mjs +4 -1
- package/esm2020/lib/directives/rerender/index.mjs +2 -0
- package/esm2020/lib/directives/rerender/public-api.mjs +2 -0
- package/esm2020/lib/directives/rerender/rerender.directive.mjs +22 -0
- package/esm2020/lib/directives/resolve/index.mjs +2 -0
- package/esm2020/lib/directives/resolve/public-api.mjs +2 -0
- package/esm2020/lib/directives/resolve/resolve.directive.mjs +32 -0
- package/esm2020/lib/directives/scroll-reset/scroll-reset.directive.mjs +3 -3
- package/esm2020/lib/directives/scroll-reset/scroll-reset.module.mjs +4 -4
- package/esm2020/lib/directives/scrollbar/scrollbar.directive.mjs +3 -3
- package/esm2020/lib/directives/scrollbar/scrollbar.module.mjs +4 -4
- package/esm2020/lib/directives/stop-propagation/click-stop-propagation.directive.mjs +3 -3
- package/esm2020/lib/directives/stop-propagation/stop-propagation.module.mjs +4 -4
- package/esm2020/lib/directives/window/prevent-close-window.directive.mjs +3 -3
- package/esm2020/lib/directives/window/window-directive.module.mjs +4 -4
- package/esm2020/lib/nice.module.mjs +57 -5
- package/esm2020/lib/pipes/boolean.pipe.mjs +3 -3
- package/esm2020/lib/pipes/capitalize-first-letter.pipe.mjs +3 -3
- package/esm2020/lib/pipes/ceil.pipe.mjs +3 -3
- package/esm2020/lib/pipes/entries.pipe.mjs +3 -3
- package/esm2020/lib/pipes/find-by-key.pipe.mjs +3 -3
- package/esm2020/lib/pipes/first-letter.pipe.mjs +3 -3
- package/esm2020/lib/pipes/floor.pipe.mjs +3 -3
- package/esm2020/lib/pipes/join-if-defined.pipe.mjs +3 -3
- package/esm2020/lib/pipes/link.pipe.mjs +3 -3
- package/esm2020/lib/pipes/localized-boolean.pipe.mjs +3 -3
- package/esm2020/lib/pipes/localized-currency.pipe.mjs +3 -3
- package/esm2020/lib/pipes/localized-date-only.pipe.mjs +3 -3
- package/esm2020/lib/pipes/localized-date.pipe.mjs +3 -3
- package/esm2020/lib/pipes/minutes-to-time.pipe.mjs +3 -3
- package/esm2020/lib/pipes/number-to-ordinal-indicator.pipe.mjs +3 -3
- package/esm2020/lib/pipes/pad.pipe.mjs +3 -3
- package/esm2020/lib/pipes/phone.pipe.mjs +9 -9
- package/esm2020/lib/pipes/pipes.module.mjs +14 -9
- package/esm2020/lib/pipes/postal-code.pipe.mjs +9 -9
- package/esm2020/lib/pipes/public-api.mjs +2 -1
- package/esm2020/lib/pipes/range.pipe.mjs +3 -3
- package/esm2020/lib/pipes/round.pipe.mjs +3 -3
- package/esm2020/lib/pipes/sanitize-bypass.pipe.mjs +3 -3
- package/esm2020/lib/pipes/seconds-to-time.pipe.mjs +3 -3
- package/esm2020/lib/pipes/track-by-prop.pipe.mjs +14 -0
- package/esm2020/lib/providers/config/config.module.mjs +4 -4
- package/esm2020/lib/providers/config/config.service.mjs +3 -3
- package/esm2020/lib/providers/media-watcher/media-watcher.module.mjs +4 -4
- package/esm2020/lib/providers/media-watcher/media-watcher.service.mjs +3 -3
- package/esm2020/lib/providers/overlay/dynamic-overlay-container.service.mjs +3 -3
- package/esm2020/lib/providers/overlay/dynamic-overlay.service.mjs +3 -3
- package/esm2020/lib/providers/splash-screen/splash-screen.module.mjs +4 -4
- package/esm2020/lib/providers/splash-screen/splash-screen.service.mjs +3 -3
- package/esm2020/lib/providers/utils/utils.module.mjs +4 -4
- package/esm2020/lib/providers/utils/utils.service.mjs +3 -3
- package/esm2020/lib/utils/case.utils.mjs +7 -5
- package/esm2020/lib/utils/keyboard.utils.mjs +2 -1
- package/esm2020/lib/utils/lexorank.utils.mjs +28 -0
- package/esm2020/lib/utils/public-api.mjs +2 -1
- package/fesm2015/recursyve-nice-ui-kit.v2.mjs +3124 -1635
- package/fesm2015/recursyve-nice-ui-kit.v2.mjs.map +1 -1
- package/fesm2020/recursyve-nice-ui-kit.v2.mjs +3072 -1591
- package/fesm2020/recursyve-nice-ui-kit.v2.mjs.map +1 -1
- package/lib/api/nice.api.d.ts +1 -1
- package/lib/components/alert/alert.component.d.ts +1 -1
- package/lib/components/alert/alert.types.d.ts +3 -3
- package/lib/components/assets-carousel/assets-carousel.component.d.ts +9 -3
- package/lib/components/assets-carousel/assets-carousel.module.d.ts +10 -8
- package/lib/components/assets-carousel/directives/assets-carousel-active-content.directive.d.ts +8 -0
- package/lib/components/assets-carousel/public-api.d.ts +1 -0
- package/lib/components/async-typeahead/async-typeahead.component.d.ts +5 -1
- package/lib/components/async-typeahead/public-api.d.ts +1 -0
- package/lib/components/base-form/base-form.component.d.ts +1 -2
- package/lib/components/base-form/form-submit.directive.d.ts +1 -1
- package/lib/components/card/card.component.d.ts +1 -1
- package/lib/components/card/card.types.d.ts +1 -1
- package/lib/components/carousel/carousel.component.d.ts +1 -1
- package/lib/components/carousel/picture-modal/picture-modal.component.d.ts +1 -1
- package/lib/components/collapsable/collapsable.component.d.ts +15 -0
- package/lib/components/collapsable/collapsable.module.d.ts +9 -0
- package/lib/components/collapsable/index.d.ts +1 -0
- package/lib/components/collapsable/public-api.d.ts +2 -0
- package/lib/components/date-range-picker/components/header/header.component.d.ts +20 -0
- package/lib/components/date-range-picker/components/range-preset/range-preset.component.d.ts +23 -0
- package/lib/components/date-range-picker/date-range-picker.component.d.ts +29 -0
- package/lib/components/date-range-picker/date-range-picker.module.d.ts +18 -0
- package/lib/components/date-range-picker/index.d.ts +1 -0
- package/lib/components/date-range-picker/providers/date-range-picker.service.d.ts +8 -0
- package/lib/components/date-range-picker/public-api.d.ts +2 -0
- package/lib/components/drawer/drawer.component.d.ts +1 -1
- package/lib/components/drawer/drawer.types.d.ts +2 -2
- package/lib/components/export-bottom-sheet/export-bottom-sheet.component.d.ts +1 -1
- package/lib/components/export-bottom-sheet/models/export-strategy.model.d.ts +1 -1
- package/lib/components/form-error/control-status.directive.d.ts +1 -1
- package/lib/components/form-error/form-error.component.d.ts +1 -1
- package/lib/components/horizontal-stepper/horizontal-stepper.component.d.ts +1 -1
- package/lib/components/horizontal-stepper/step.component.d.ts +1 -1
- package/lib/components/image-cropper/image-cropper.component.d.ts +2 -2
- package/lib/components/layout/layout.component.d.ts +1 -1
- package/lib/components/loading-spinner/loading-spinner.component.d.ts +1 -1
- package/lib/components/loading-spinner/loading.directive.d.ts +1 -1
- package/lib/components/lottie/lottie.component.d.ts +1 -1
- package/lib/components/navigation/components/hint-component-base.d.ts +65 -0
- package/lib/components/navigation/directives/show-hint.directive.d.ts +39 -0
- package/lib/components/navigation/horizontal/components/basic/basic.component.d.ts +1 -1
- package/lib/components/navigation/horizontal/components/branch/branch.component.d.ts +1 -1
- package/lib/components/navigation/horizontal/components/divider/divider.component.d.ts +1 -1
- package/lib/components/navigation/horizontal/components/spacer/spacer.component.d.ts +1 -1
- package/lib/components/navigation/horizontal/horizontal.component.d.ts +1 -1
- package/lib/components/navigation/navigation.component.d.ts +1 -1
- package/lib/components/navigation/navigation.module.d.ts +13 -10
- package/lib/components/navigation/navigation.types.d.ts +12 -5
- package/lib/components/navigation/pipes/should-hide.pipe.d.ts +11 -0
- package/lib/components/navigation/pipes/should-show-hint.pipe.d.ts +12 -0
- package/lib/components/navigation/providers/hide-item.resolver.d.ts +5 -0
- package/lib/components/navigation/providers/hint.resolver.d.ts +4 -0
- package/lib/components/navigation/providers/hint.service.d.ts +9 -0
- package/lib/components/navigation/public-api.d.ts +3 -0
- package/lib/components/navigation/vertical/components/aside/aside.component.d.ts +1 -1
- package/lib/components/navigation/vertical/components/basic/basic.component.d.ts +1 -1
- package/lib/components/navigation/vertical/components/collapsable/collapsable.component.d.ts +1 -1
- package/lib/components/navigation/vertical/components/divider/divider.component.d.ts +1 -1
- package/lib/components/navigation/vertical/components/group/group.component.d.ts +1 -1
- package/lib/components/navigation/vertical/components/spacer/spacer.component.d.ts +1 -1
- package/lib/components/navigation/vertical/vertical.component.d.ts +8 -2
- package/lib/components/public-api.d.ts +3 -0
- package/lib/components/search-bar/search-bar.component.d.ts +1 -1
- package/lib/components/sweet-alert/sweet-alert.component.d.ts +1 -1
- package/lib/components/sweet-alert/sweet-alert.directive.d.ts +1 -1
- package/lib/components/toast/toast.component.d.ts +1 -1
- package/lib/components/toggle-button-group/toggle-button-group.component.d.ts +2 -2
- package/lib/components/toggle-button-group/toggle-button.component.d.ts +1 -1
- package/lib/components/translation-form/components/textarea/translation-form-textarea.component.d.ts +9 -0
- package/lib/components/translation-form/components/textfield/translation-form-textfield.component.d.ts +6 -0
- package/lib/components/translation-form/components/translation-form.component.d.ts +55 -0
- package/lib/components/translation-form/components/translation-form.module.d.ts +16 -0
- package/lib/components/translation-form/decorators/translation-form.decorator.d.ts +1 -0
- package/lib/components/translation-form/directives/translation-context.directive.d.ts +15 -0
- package/lib/components/translation-form/index.d.ts +1 -0
- package/lib/components/translation-form/providers/translation-form.service.d.ts +12 -0
- package/lib/components/translation-form/public-api.d.ts +9 -0
- package/lib/components/translation-form/toggle/translation-toggle.component.d.ts +14 -0
- package/lib/components/translation-form/translation.form.d.ts +5 -0
- package/lib/components/translation-form/validators/require-for-languages.validator.d.ts +14 -0
- package/lib/components/typeahead/directives/options-scroll.directive.d.ts +1 -1
- package/lib/components/typeahead/typeahead.component.d.ts +1 -1
- package/lib/directives/autofocus/autofocus.directive.d.ts +1 -1
- package/lib/directives/autogrow/autogrow.directive.d.ts +1 -1
- package/lib/directives/chip-async-typeahead/chip-async-typeahead.directive.d.ts +1 -1
- package/lib/directives/chip-list/chip-list-items/chip-list-item-label.directive.d.ts +1 -1
- package/lib/directives/chip-list/chip-list-items/chip-list-items.component.d.ts +14 -2
- package/lib/directives/chip-list/chip-list.constant.d.ts +2 -0
- package/lib/directives/chip-list/chip-list.directive.d.ts +7 -4
- package/lib/directives/chip-list/chip-list.module.d.ts +3 -0
- package/lib/directives/draggable-list/draggable-list.directive.d.ts +24 -0
- package/lib/directives/draggable-list/draggable-list.module.d.ts +8 -0
- package/lib/directives/draggable-list/index.d.ts +1 -0
- package/lib/directives/draggable-list/public-api.d.ts +2 -0
- package/lib/directives/dropzone/dropzone.directive.d.ts +1 -1
- package/lib/directives/image-error-placeholder/image-error-placeholder.directive.d.ts +1 -1
- package/lib/directives/material/nice-material-style.directive.d.ts +1 -1
- package/lib/directives/material/nice-rounded-style.directive.d.ts +1 -1
- package/lib/directives/modals/modal-on-click.directive.d.ts +1 -1
- package/lib/directives/modals/modal-opener.directive.d.ts +1 -1
- package/lib/directives/public-api.d.ts +3 -0
- package/lib/directives/rerender/index.d.ts +1 -0
- package/lib/directives/rerender/public-api.d.ts +1 -0
- package/lib/directives/rerender/rerender.directive.d.ts +10 -0
- package/lib/directives/resolve/index.d.ts +1 -0
- package/lib/directives/resolve/public-api.d.ts +1 -0
- package/lib/directives/resolve/resolve.directive.d.ts +18 -0
- package/lib/directives/scroll-reset/scroll-reset.directive.d.ts +1 -1
- package/lib/directives/scrollbar/scrollbar.directive.d.ts +1 -1
- package/lib/directives/stop-propagation/click-stop-propagation.directive.d.ts +1 -1
- package/lib/directives/window/prevent-close-window.directive.d.ts +1 -1
- package/lib/pipes/phone.pipe.d.ts +3 -3
- package/lib/pipes/pipes.module.d.ts +2 -1
- package/lib/pipes/postal-code.pipe.d.ts +3 -3
- package/lib/pipes/public-api.d.ts +1 -0
- package/lib/pipes/track-by-prop.pipe.d.ts +7 -0
- package/lib/providers/config/config.model.d.ts +3 -3
- package/lib/types/constructor.d.ts +2 -2
- package/lib/utils/array.utils.d.ts +1 -1
- package/lib/utils/keyboard.utils.d.ts +2 -1
- package/lib/utils/lexorank.utils.d.ts +6 -0
- package/lib/utils/public-api.d.ts +1 -0
- package/package.json +10 -10
- package/src/lib/components/assets-carousel/assets-carousel.theme.scss +21 -15
- package/src/lib/components/collapsable/collapsable.theme.scss +48 -0
- package/src/lib/components/date-range-picker/date-range-picker.theme.scss +47 -0
- package/src/lib/components/navigation/vertical/styles/appearances/default.theme.scss +38 -0
- package/src/lib/components/navigation/vertical/styles/appearances/dense.theme.scss +2 -2
- package/src/lib/directives/chip-list/chip-list-items/chip-list-items.theme.scss +5 -1
- package/src/lib/nice.theme.scss +26 -9
- package/styles/main.scss +1 -4
- package/styles/overrides/angular-material.scss +505 -766
- package/styles/overrides/quill.scss +42 -5
- package/styles/tailwind.scss +47 -1
- package/styles/core/tailwind-config.scss +0 -6
|
@@ -53,6 +53,34 @@ export var ImgCropperError;
|
|
|
53
53
|
ImgCropperError[ImgCropperError["Other"] = 2] = "Other";
|
|
54
54
|
})(ImgCropperError || (ImgCropperError = {}));
|
|
55
55
|
export class NiceImageCropperComponent {
|
|
56
|
+
set config(val) {
|
|
57
|
+
this._config = mergeDeep({}, new ImgCropperConfig(), val);
|
|
58
|
+
this._configPrimary = mergeDeep({}, this._config);
|
|
59
|
+
this._primaryAreaWidth = this.config.width;
|
|
60
|
+
this._primaryAreaHeight = this.config.height;
|
|
61
|
+
if (this._config.round
|
|
62
|
+
&& this.config.width !== this.config.height) {
|
|
63
|
+
throw new Error(`${NiceImageCropperComponent.и}: Both width and height must be equal when using \`ImgCropperConfig.round = true\``);
|
|
64
|
+
}
|
|
65
|
+
const maxFileSize = this._config.maxFileSize;
|
|
66
|
+
if (maxFileSize) {
|
|
67
|
+
this.maxFileSize = maxFileSize;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
get config() {
|
|
71
|
+
return this._config;
|
|
72
|
+
}
|
|
73
|
+
/** Set scale */
|
|
74
|
+
set scale(val) {
|
|
75
|
+
this.setScale(val);
|
|
76
|
+
}
|
|
77
|
+
get scale() {
|
|
78
|
+
return this._scale;
|
|
79
|
+
}
|
|
80
|
+
/** Get min scale */
|
|
81
|
+
get minScale() {
|
|
82
|
+
return this._minScale;
|
|
83
|
+
}
|
|
56
84
|
constructor(_renderer, _elementRef, cd, _ngZone, _document, viewPortRuler) {
|
|
57
85
|
this._renderer = _renderer;
|
|
58
86
|
this._elementRef = _elementRef;
|
|
@@ -185,34 +213,6 @@ export class NiceImageCropperComponent {
|
|
|
185
213
|
.pipe(takeUntil(this._destroy))
|
|
186
214
|
.subscribe(() => this._ngZone.run(() => this.updateCropperPosition()));
|
|
187
215
|
}
|
|
188
|
-
set config(val) {
|
|
189
|
-
this._config = mergeDeep({}, new ImgCropperConfig(), val);
|
|
190
|
-
this._configPrimary = mergeDeep({}, this._config);
|
|
191
|
-
this._primaryAreaWidth = this.config.width;
|
|
192
|
-
this._primaryAreaHeight = this.config.height;
|
|
193
|
-
if (this._config.round
|
|
194
|
-
&& this.config.width !== this.config.height) {
|
|
195
|
-
throw new Error(`${NiceImageCropperComponent.и}: Both width and height must be equal when using \`ImgCropperConfig.round = true\``);
|
|
196
|
-
}
|
|
197
|
-
const maxFileSize = this._config.maxFileSize;
|
|
198
|
-
if (maxFileSize) {
|
|
199
|
-
this.maxFileSize = maxFileSize;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
get config() {
|
|
203
|
-
return this._config;
|
|
204
|
-
}
|
|
205
|
-
/** Set scale */
|
|
206
|
-
set scale(val) {
|
|
207
|
-
this.setScale(val);
|
|
208
|
-
}
|
|
209
|
-
get scale() {
|
|
210
|
-
return this._scale;
|
|
211
|
-
}
|
|
212
|
-
/** Get min scale */
|
|
213
|
-
get minScale() {
|
|
214
|
-
return this._minScale;
|
|
215
|
-
}
|
|
216
216
|
ngOnInit() {
|
|
217
217
|
this._ngZone.runOutsideAngular(() => {
|
|
218
218
|
const element = this._imgContainer.nativeElement;
|
|
@@ -848,9 +848,9 @@ export class NiceImageCropperComponent {
|
|
|
848
848
|
}
|
|
849
849
|
}
|
|
850
850
|
NiceImageCropperComponent.и = "NiceImageCropper";
|
|
851
|
-
NiceImageCropperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
852
|
-
NiceImageCropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
853
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
851
|
+
NiceImageCropperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NiceImageCropperComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: DOCUMENT }, { token: i1.ViewportRuler }], target: i0.ɵɵFactoryTarget.Component });
|
|
852
|
+
NiceImageCropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NiceImageCropperComponent, selector: "nice-img-cropper, nice-image-cropper", inputs: { config: "config", scale: "scale", maxFileSize: "maxFileSize" }, outputs: { scaleChange: "scaleChange", minScaleChange: "minScale", maxScaleChange: "maxScale", imageLoaded: "imageLoaded", ready: "ready", cropped: "cropped", cleaned: "cleaned", error: "error" }, viewQueries: [{ propertyName: "_imgContainer", first: true, predicate: ["_imgContainer"], descendants: true, static: true }, { propertyName: "_areaRef", first: true, predicate: ["_area"], descendants: true, read: ElementRef }, { propertyName: "_imgCanvas", first: true, predicate: ["_imgCanvas"], descendants: true, static: true }], ngImport: i0, template: "<!-- (selectstart): On Safari starting to slide temporarily triggers text selection mode which\nshow the wrong cursor. We prevent it by stopping the `selectstart` event. -->\n<div class=\"image-container\" #_imgContainer\n (selectstart)=\"$event.preventDefault()\"\n>\n <canvas #_imgCanvas></canvas>\n</div>\n<nice-cropper-area\n #_area\n *ngIf=\"_isLoadedImg\"\n [round]=\"!!config.round\"\n [resizableArea]=\"!!config.resizableArea\"\n [keepAspectRatio]=\"!!config.keepAspectRatio\"\n [ngStyle]=\"{\n width: config.width + 'px',\n height: config.height + 'px'\n }\"\n></nice-cropper-area>\n<button class=\"close-button\" mat-icon-button *ngIf=\"_isLoadedImg\" (click)=\"clean()\">\n <mat-icon>arrow_back</mat-icon>\n</button>\n", styles: ["nice-image-cropper,nice-img-cropper{-webkit-user-select:none;user-select:none;display:flex;overflow:hidden;position:relative;justify-content:center;align-items:center}nice-image-cropper .image-container,nice-img-cropper .image-container{cursor:move;position:absolute;top:0;left:0;display:flex;touch-action:none}nice-image-cropper .image-container>canvas,nice-img-cropper .image-container>canvas{display:block}nice-image-cropper .close-button,nice-img-cropper .close-button{position:absolute;top:8px;left:8px;background-color:#fff!important;border-radius:4px;height:20px;width:20px;min-height:20px}nice-image-cropper .close-button .mat-icon,nice-img-cropper .close-button .mat-icon{height:14px!important;width:14px!important;font-size:14px!important;line-height:14px!important}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i2.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(function () { return i3.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i4.MatIcon; }), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i0.forwardRef(function () { return NiceCropperAreaComponent; }), selector: "nice-cropper-area", inputs: ["keepAspectRatio", "round", "resizableArea"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
853
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NiceImageCropperComponent, decorators: [{
|
|
854
854
|
type: Component,
|
|
855
855
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: "nice-img-cropper, nice-image-cropper", encapsulation: ViewEncapsulation.None, template: "<!-- (selectstart): On Safari starting to slide temporarily triggers text selection mode which\nshow the wrong cursor. We prevent it by stopping the `selectstart` event. -->\n<div class=\"image-container\" #_imgContainer\n (selectstart)=\"$event.preventDefault()\"\n>\n <canvas #_imgCanvas></canvas>\n</div>\n<nice-cropper-area\n #_area\n *ngIf=\"_isLoadedImg\"\n [round]=\"!!config.round\"\n [resizableArea]=\"!!config.resizableArea\"\n [keepAspectRatio]=\"!!config.keepAspectRatio\"\n [ngStyle]=\"{\n width: config.width + 'px',\n height: config.height + 'px'\n }\"\n></nice-cropper-area>\n<button class=\"close-button\" mat-icon-button *ngIf=\"_isLoadedImg\" (click)=\"clean()\">\n <mat-icon>arrow_back</mat-icon>\n</button>\n", styles: ["nice-image-cropper,nice-img-cropper{-webkit-user-select:none;user-select:none;display:flex;overflow:hidden;position:relative;justify-content:center;align-items:center}nice-image-cropper .image-container,nice-img-cropper .image-container{cursor:move;position:absolute;top:0;left:0;display:flex;touch-action:none}nice-image-cropper .image-container>canvas,nice-img-cropper .image-container>canvas{display:block}nice-image-cropper .close-button,nice-img-cropper .close-button{position:absolute;top:8px;left:8px;background-color:#fff!important;border-radius:4px;height:20px;width:20px;min-height:20px}nice-image-cropper .close-button .mat-icon,nice-img-cropper .close-button .mat-icon{height:14px!important;width:14px!important;font-size:14px!important;line-height:14px!important}\n"] }]
|
|
856
856
|
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
@@ -1245,9 +1245,9 @@ export class NiceCropperAreaComponent {
|
|
|
1245
1245
|
return this._document.defaultView || window;
|
|
1246
1246
|
}
|
|
1247
1247
|
}
|
|
1248
|
-
NiceCropperAreaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1249
|
-
NiceCropperAreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
1250
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1248
|
+
NiceCropperAreaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NiceCropperAreaComponent, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: NiceImageCropperComponent }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
1249
|
+
NiceCropperAreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: NiceCropperAreaComponent, selector: "nice-cropper-area", inputs: { keepAspectRatio: "keepAspectRatio", round: "round", resizableArea: "resizableArea" }, host: { properties: { "class.round": "this.round" } }, viewQueries: [{ propertyName: "_resizer", first: true, predicate: ["resizer"], descendants: true }], ngImport: i0, template: "<div class=\"resizer\" #resizer *ngIf=\"resizableArea\"></div>\n", styles: ["nice-cropper-area{pointer-events:none;box-shadow:0 0 0 20000px #0006;margin:auto;position:absolute;inset:0}nice-cropper-area.round{border-radius:50%}nice-cropper-area:before,nice-cropper-area:after{position:absolute;inset:0;content:\"\"}nice-cropper-area:before{width:0;height:0;margin:auto;border-radius:50%;background:#fff;border:solid 2px rgb(255,255,255)}nice-cropper-area:after{border:solid 2px rgb(255,255,255);border-radius:inherit}nice-cropper-area .resizer{width:10px;height:10px;background:#fff;border-radius:3px;position:absolute;touch-action:none;bottom:0;pointer-events:all}nice-cropper-area .resizer:before{content:\"\";width:20px;height:20px;transform:translate(-25%,-25%)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NiceCropperAreaComponent, decorators: [{
|
|
1251
1251
|
type: Component,
|
|
1252
1252
|
args: [{ selector: "nice-cropper-area", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"resizer\" #resizer *ngIf=\"resizableArea\"></div>\n", styles: ["nice-cropper-area{pointer-events:none;box-shadow:0 0 0 20000px #0006;margin:auto;position:absolute;inset:0}nice-cropper-area.round{border-radius:50%}nice-cropper-area:before,nice-cropper-area:after{position:absolute;inset:0;content:\"\"}nice-cropper-area:before{width:0;height:0;margin:auto;border-radius:50%;background:#fff;border:solid 2px rgb(255,255,255)}nice-cropper-area:after{border:solid 2px rgb(255,255,255);border-radius:inherit}nice-cropper-area .resizer{width:10px;height:10px;background:#fff;border-radius:3px;position:absolute;touch-action:none;bottom:0;pointer-events:all}nice-cropper-area .resizer:before{content:\"\";width:20px;height:20px;transform:translate(-25%,-25%)}\n"] }]
|
|
1253
1253
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
@@ -1266,4 +1266,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.3", ngImpor
|
|
|
1266
1266
|
}], resizableArea: [{
|
|
1267
1267
|
type: Input
|
|
1268
1268
|
}] } });
|
|
1269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uaWNlLXVpLWtpdC12Mi9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2UtY3JvcHBlci9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ltYWdlLWNyb3BwZXIudGVtcGxhdGUuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ltYWdlLWNyb3BwZXItYXJlYS50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFBRSxXQUFXLEVBQ3pCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7O0FBRS9DLE1BQU0sa0JBQWtC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QUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDeEQ7SUFDTCxDQUFDO0lBRUQsK0ZBQStGO0lBQ3ZGLFVBQVU7UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQztJQUNoRCxDQUFDOztxSEFsU1Esd0JBQXdCLGtCQTJCckIsUUFBUTt5R0EzQlgsd0JBQXdCLHFURTd6Q3JDLGtFQUNBOzJGRjR6Q2Esd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNJLG1CQUFtQixpQkFHZCxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzswQkE2QjFDLE1BQU07MkJBQUMsUUFBUTsrSEF6QkgsUUFBUTtzQkFEeEIsU0FBUzt1QkFBQyxTQUFTO2dCQUliLGVBQWU7c0JBRHJCLEtBQUs7Z0JBS0MsS0FBSztzQkFGWCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGFBQWE7Z0JBOEJmLGFBQWE7c0JBRHZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vQS1sLXktbC1lL0FseWxlLVVJL3RyZWUvMTAuNS4zL3NyYy9saWIvaW1hZ2UtY3JvcHBlclxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3BsYXRmb3JtXCI7XG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IHJlc2l6ZUNhbnZhcyB9IGZyb20gXCIuL3Jlc2l6ZS1jYW52YXNcIjtcblxuY29uc3QgYWN0aXZlRXZlbnRPcHRpb25zID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4vKiogSW1hZ2UgQ3JvcHBlciBDb25maWcgKi9cbmV4cG9ydCBjbGFzcyBJbWdDcm9wcGVyQ29uZmlnIHtcbiAgICAvKiogQ3JvcHBlciBhcmVhIHdpZHRoICovXG4gICAgd2lkdGggPSAyNTA7XG4gICAgLyoqIENyb3BwZXIgYXJlYSBoZWlnaHQgKi9cbiAgICBoZWlnaHQgPSAyMDA7XG4gICAgbWluV2lkdGggPSA0MDtcbiAgICBtaW5IZWlnaHQgPSA0MDtcbiAgICAvKiogSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwgdGhlIG5ldyBpbWFnZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVmaW5lZC4gKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yKCBkZWZhdWx0OiBudWxsKSwgaWYgaXMgbnVsbCBpbiBwbmcgaXMgdHJhbnNwYXJlbnQgYnV0IG5vdCBpbiBqcGcuICovXG4gICAgZmlsbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2V0IGFudGktYWxpYXNlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYXMgdGhlIGNyb3BwZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSB0aGUgaW1hZ2VcbiAgICAgKiB0byB0aGUgYmVzdCBxdWFsaXR5XG4gICAgICovXG4gICAgYW50aUFsaWFzZWQgPSB0cnVlO1xuICAgIGF1dG9Dcm9wPzogYm9vbGVhbjtcbiAgICBvdXRwdXQ/OiBJbWdPdXRwdXQgfCBJbWdSZXNvbHV0aW9uID0gSW1nUmVzb2x1dGlvbi5EZWZhdWx0O1xuICAgIC8qKlxuICAgICAqIFpvb20gb3V0IHVudGlsIHRoZSBlbnRpcmUgaW1hZ2UgZml0cyBpbnRvIHRoZSBjcm9wcGluZyBhcmVhLlxuICAgICAqIGRlZmF1bHQ6IGZhbHNlXG4gICAgICovXG4gICAgZXh0cmFab29tT3V0PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFbWl0IGV2ZW50IGBlcnJvcmAgaWYgdGhlIGZpbGUgc2l6ZSBpbiBieXRlcyBmb3IgdGhlIGxpbWl0LlxuICAgICAqIE5vdGU6IEl0IG9ubHkgd29ya3Mgd2hlbiB0aGUgaW1hZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgYDxpbnB1dD5gIGV2ZW50LlxuICAgICAqL1xuICAgIG1heEZpbGVTaXplPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjcm9wcGVyIGFyZWEgd2lsbCBiZSByb3VuZC5cbiAgICAgKiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgY3JvcHBlciBhcmVhIHdpbGwgbWFpbnRhaW4gaXRzIGFzcGVjdCByYXRpby5cbiAgICAgKiBkZWZhdWx0OiBmYWxzZVxuICAgICAqL1xuICAgIHJvdW5kPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjcm9wcGVyIGFyZWEgaXMgcmVzaXphYmxlLlxuICAgICAqIGRlZmF1bHQ6IGZhbHNlXG4gICAgICovXG4gICAgcmVzaXphYmxlQXJlYT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogS2VlcCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZ3Jvd2luZyBhcmVhIHRoZSBzYW1lIGFjY29yZGluZ1xuICAgICAqIHRvIGBJbWdDcm9wcGVyQ29uZmlnLndpZHRoYCBhbmQgYEltZ0Nyb3BwZXJDb25maWcuaGVpZ2h0YFxuICAgICAqIGRlZmF1bHQ6IGZhbHNlXG4gICAgICovXG4gICAga2VlcEFzcGVjdFJhdGlvPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjcm9wcGVyIGFyZWEgaXMgcmVzcG9uc2l2ZS5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY3JvcHBlciBhcmVhIGlzIGZpeGVkLFxuICAgICAqIHNvIGNhbiB1c2Ugd2hlbiB0aGUgY3JvcHBlciBhcmVhIGlzIGxhcmdlciB0aGFuIGl0cyBjb250YWluZXIsXG4gICAgICogb3RoZXJ3aXNlIHRoaXMgd2lsbCBicmluZyBwcm9ibGVtcyB3aGVuIGNyb3BwaW5nLlxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVBcmVhPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb3V0cHV0IGltYWdlXG4gKiBXaXRoIHRoaXMgb3B0aW9uIHlvdSBjYW4gcmVzaXplIHRoZSBvdXRwdXQgaW1hZ2UuXG4gKiBJZiBgd2lkdGhgIG9yIGBoZWlnaHRgIGFyZSAwLCB0aGlzIHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkuXG4gKiBCb3RoIGNhbm5vdCBiZSAwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltZ091dHB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIGNyb3BwZWQgaW1hZ2Ugd2lsbCBiZSByZXNpemVkIHRvIHRoaXMgYHdpZHRoYC5cbiAgICAgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENyb3BwZWQgaW1hZ2Ugd2lsbCBiZSByZXNpemVkIHRvIHRoaXMgYGhlaWdodGAuXG4gICAgICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBJbWFnZSBvdXRwdXQgKi9cbmV4cG9ydCBlbnVtIEltZ1Jlc29sdXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSBlcXVhbCB0byB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBjcm9wcGVyIGFyZWEuXG4gICAgICovXG4gICAgRGVmYXVsdCxcbiAgICAvKiogSnVzdCBjcm9wIHRoZSBpbWFnZSB3aXRob3V0IHJlc2l6aW5nICovXG4gICAgT3JpZ2luYWxJbWFnZVxufVxuXG4vKiogSW1hZ2Ugb3V0cHV0ICovXG5leHBvcnQgZW51bSBJbWdDcm9wcGVyRXJyb3Ige1xuICAgIC8qKiBUaGUgbG9hZGVkIGltYWdlIGV4Y2VlZHMgdGhlIHNpemUgbGltaXQgc2V0LiAqL1xuICAgIFNpemUsXG4gICAgLyoqIFRoZSBmaWxlIGxvYWRlZCBpcyBub3QgaW1hZ2UuICovXG4gICAgVHlwZSxcbiAgICAvKiogV2hlbiB0aGUgaW1hZ2UgaGFzIG5vdCBiZWVuIGxvYWRlZC4gKi9cbiAgICBPdGhlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltZ0Nyb3BwZXJFdmVudCB7XG4gICAgLyoqIENyb3BwZWQgaW1hZ2UgZGF0YSBVUkwgKi9cbiAgICBkYXRhVVJMPzogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEZpbGV0eXBlICovXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvKiogQ3JvcHBlZCBhcmVhIHdpZHRoICovXG4gICAgYXJlYVdpZHRoOiBudW1iZXI7XG4gICAgLyoqIENyb3BwZWQgYXJlYSBoZWlnaHQgKi9cbiAgICBhcmVhSGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqIENyb3BwZWQgaW1hZ2Ugd2lkdGggKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDcm9wcGVkIGltYWdlIGhlaWdodCAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBPcmlnaW5hbCBJbWFnZSBkYXRhIFVSTCAqL1xuICAgIG9yaWdpbmFsRGF0YVVSTD86IHN0cmluZztcbiAgICBzY2FsZTogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IHJvdGF0aW9uIGluIGRlZ3JlZXMgKi9cbiAgICByb3RhdGlvbjogbnVtYmVyO1xuICAgIC8qKiBTaXplIG9mIHRoZSBpbWFnZSBpbiBieXRlcyAqL1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvKiogU2NhbGVkIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGltYWdlICovXG4gICAgbGVmdDogbnVtYmVyO1xuICAgIC8qKiBTY2FsZWQgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBpbWFnZSAqL1xuICAgIHRvcDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNjYWxlZCBvZmZzZXQgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBpbWFnZSB0byBjZW50ZXIgb2YgYXJlYVxuICAgICAqIENhbiBiZSB1c2VkIHRvIHNldCBpbWFnZSBwb3NpdGlvblxuICAgICAqL1xuICAgIHhPcmlnaW46IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTY2FsZWQgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBpbWFnZSB0byBjZW50ZXIgb2YgYXJlYVxuICAgICAqIENhbiBiZSB1c2VkIHRvIHNldCBpbWFnZSBwb3NpdGlvblxuICAgICAqL1xuICAgIHlPcmlnaW46IG51bWJlcjtcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB4T3JpZ2luICYgeU9yaWdpbmAgaW5zdGVhZC4gKi9cbiAgICBwb3NpdGlvbj86IHtcbiAgICAgICAgeDogbnVtYmVyXG4gICAgICAgIHk6IG51bWJlclxuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1nQ3JvcHBlckVycm9yRXZlbnQge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFNpemUgb2YgdGhlIGltYWdlIGluIGJ5dGVzICovXG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8qKiBGaWxldHlwZSAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKiogVHlwZSBvZiBlcnJvciAqL1xuICAgIGVycm9yOiBJbWdDcm9wcGVyRXJyb3I7XG4gICAgZXJyb3JNc2c/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbWdSZWN0IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHhjOiBudW1iZXI7XG4gICAgeWM6IG51bWJlcjtcbiAgICAvKiogdHJhbnNmb3JtIHdpdGggKi9cbiAgICB3dDogbnVtYmVyO1xuICAgIGh0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1nQ3JvcHBlckxvYWRlckNvbmZpZyB7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEZpbGV0eXBlICovXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvKiogQ3JvcHBlZCBhcmVhIHdpZHRoICovXG4gICAgYXJlYVdpZHRoPzogbnVtYmVyO1xuICAgIC8qKiBDcm9wcGVkIGFyZWEgaGVpZ2h0ICovXG4gICAgYXJlYUhlaWdodD86IG51bWJlcjtcbiAgICAvKiogQ3JvcHBlZCBpbWFnZSB3aWR0aCAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKiBDcm9wcGVkIGltYWdlIGhlaWdodCAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKiogT3JpZ2luYWwgSW1hZ2UgZGF0YSBVUkwgKi9cbiAgICBvcmlnaW5hbERhdGFVUkw6IHN0cmluZztcbiAgICBzY2FsZT86IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCByb3RhdGlvbiBpbiBkZWdyZWVzICovXG4gICAgcm90YXRpb24/OiBudW1iZXI7XG4gICAgLyoqIFNpemUgb2YgdGhlIGltYWdlIGluIGJ5dGVzICovXG4gICAgc2l6ZT86IG51bWJlcjtcbiAgICAvKiogT2Zmc2V0IGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW1hZ2UgdG8gY2VudGVyIG9mIGFyZWEgKi9cbiAgICB4T3JpZ2luPzogbnVtYmVyO1xuICAgIC8qKiBPZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGltYWdlIHRvIGNlbnRlciBvZiBhcmVhICovXG4gICAgeU9yaWdpbj86IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc2VsZWN0b3I6IFwibmljZS1pbWctY3JvcHBlciwgbmljZS1pbWFnZS1jcm9wcGVyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiaW1hZ2UtY3JvcHBlci50ZW1wbGF0ZS5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCJpbWFnZS1jcm9wcGVyLnN0eWxlLnNjc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOaWNlSW1hZ2VDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyByZWFkb25seSDQuCA9IFwiTmljZUltYWdlQ3JvcHBlclwiO1xuXG4gICAgcHJpdmF0ZSBfY3VycmVudExvYWRDb25maWc/OiBJbWdDcm9wcGVyTG9hZGVyQ29uZmlnO1xuXG4gICAgLyoqIE9yaWdpbmFsIGltYWdlICovXG4gICAgcHJpdmF0ZSBfaW1nOiBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHByaXZhdGUgb2Zmc2V0Pzoge1xuICAgICAgICB4OiBudW1iZXJcbiAgICAgICAgeTogbnVtYmVyXG4gICAgICAgIGxlZnQ6IG51bWJlclxuICAgICAgICB0b3A6IG51bWJlclxuICAgIH07XG4gICAgcHJpdmF0ZSBfc2NhbGU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfc2NhbDNGaXg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWluU2NhbGU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWF4U2NhbGU/OiBudW1iZXI7XG4gICAgLyoqIEluaXRpYWwgY29uZmlnICovXG4gICAgcHJpdmF0ZSBfY29uZmlnUHJpbWFyeTogSW1nQ3JvcHBlckNvbmZpZztcbiAgICBwcml2YXRlIF9jb25maWc6IEltZ0Nyb3BwZXJDb25maWc7XG4gICAgcHJpdmF0ZSBfaW1nUmVjdDogSW1nUmVjdCA9IHt9IGFzIGFueTtcbiAgICBwcml2YXRlIF9yb3RhdGlvbiA9IDA7XG4gICAgLy8gcHJpdmF0ZSBfc2l6ZUluQnl0ZXM6IG51bWJlciB8IG51bGw7XG4gICAgcHJpdmF0ZSBfaXNTbGlkaW5nOiBib29sZWFuO1xuICAgIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgbGFzdCBwb2ludGVyIGV2ZW50IHRoYXQgd2FzIGNhcHR1cmVkIGJ5IHRoZSBjcm9wIGFyZWEuICovXG4gICAgcHJpdmF0ZSBfbGFzdFBvaW50ZXJFdmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQgfCBudWxsO1xuICAgIHByaXZhdGUgX3N0YXJ0UG9pbnRlckV2ZW50OiB7XG4gICAgICAgIHg6IG51bWJlclxuICAgICAgICB5OiBudW1iZXJcbiAgICB9IHwgbnVsbDtcbiAgICBwdWJsaWMgX3ByaW1hcnlBcmVhV2lkdGg6IG51bWJlcjtcbiAgICBwdWJsaWMgX3ByaW1hcnlBcmVhSGVpZ2h0OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgX2Fic29sdXRlU2NhbGU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gaXMgbG9hZGVkIGltYWdlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF9pc0xvYWRlZEltZzogYm9vbGVhbjtcblxuICAgIC8qKiBXaGVuIGlzIGxvYWRlZCBpbWFnZSAmIHJlYWR5IGZvciBjcm9wICovXG4gICAgcHVibGljIGlzTG9hZGVkOiBib29sZWFuO1xuICAgIC8qKiBXaGVuIHRoZSBjcm9wcGVyIGlzIHJlYWR5IHRvIGJlIGludGVyYWN0ZWQgICovXG4gICAgcHVibGljIGlzUmVhZHk6IGJvb2xlYW47XG4gICAgcHVibGljIGlzQ3JvcHBlZDogYm9vbGVhbjtcblxuICAgIEBWaWV3Q2hpbGQoXCJfaW1nQ29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBfaW1nQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZChcIl9hcmVhXCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgX2FyZWFSZWY6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChcIl9pbWdDYW52YXNcIiwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIF9pbWdDYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGNvbmZpZyh2YWw6IEltZ0Nyb3BwZXJDb25maWcpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gbWVyZ2VEZWVwKHt9LCBuZXcgSW1nQ3JvcHBlckNvbmZpZygpLCB2YWwpO1xuICAgICAgICB0aGlzLl9jb25maWdQcmltYXJ5ID0gbWVyZ2VEZWVwKHt9LCB0aGlzLl9jb25maWcpO1xuICAgICAgICB0aGlzLl9wcmltYXJ5QXJlYVdpZHRoID0gdGhpcy5jb25maWcud2lkdGg7XG4gICAgICAgIHRoaXMuX3ByaW1hcnlBcmVhSGVpZ2h0ID0gdGhpcy5jb25maWcuaGVpZ2h0O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9jb25maWcucm91bmRcbiAgICAgICAgICAgICYmIHRoaXMuY29uZmlnLndpZHRoICE9PSB0aGlzLmNvbmZpZy5oZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7TmljZUltYWdlQ3JvcHBlckNvbXBvbmVudC7QuH06IEJvdGggd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGVxdWFsIHdoZW4gdXNpbmcgXFxgSW1nQ3JvcHBlckNvbmZpZy5yb3VuZCA9IHRydWVcXGBgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMuX2NvbmZpZy5tYXhGaWxlU2l6ZTtcbiAgICAgICAgaWYgKG1heEZpbGVTaXplKSB7XG4gICAgICAgICAgICB0aGlzLm1heEZpbGVTaXplID0gbWF4RmlsZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGdldCBjb25maWcoKTogSW1nQ3JvcHBlckNvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gICAgfVxuICAgIC8qKiBTZXQgc2NhbGUgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc2NhbGUodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTY2FsZSh2YWwpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHNjYWxlKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGV2ZW50IGBlcnJvcmAgaWYgdGhlIGZpbGUgc2l6ZSBmb3IgdGhlIGxpbWl0LlxuICAgICAqIE5vdGU6IEl0IG9ubHkgd29ya3Mgd2hlbiB0aGUgaW1hZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgYDxpbnB1dD5gIGV2ZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heEZpbGVTaXplOiBudW1iZXI7XG5cbiAgICAvKiogR2V0IG1pbiBzY2FsZSAqL1xuICAgIHB1YmxpYyBnZXQgbWluU2NhbGUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pblNjYWxlO1xuICAgIH1cblxuICAgIEBPdXRwdXQoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NhbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKiBFbWl0cyBtaW5pbXVtIHN1cHBvcnRlZCBpbWFnZSBzY2FsZSAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgQE91dHB1dChcIm1pblNjYWxlXCIpXG4gICAgcHJpdmF0ZSByZWFkb25seSBtaW5TY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqIEVtaXRzIG1heGltdW0gc3VwcG9ydGVkIGltYWdlIHNjYWxlICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1yZW5hbWVcbiAgICBAT3V0cHV0KFwibWF4U2NhbGVcIilcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heFNjYWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgaW1hZ2UgaXMgbG9hZGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbWFnZUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SW1nQ3JvcHBlckV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGNyb3BwZXIgaXMgcmVhZHkgdG8gYmUgaW50ZXJhY3RlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPEltZ0Nyb3BwZXJFdmVudD4oKTtcblxuICAgIC8qKiBPbiBjcm9wIG5ldyBpbWFnZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3JvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SW1nQ3JvcHBlckV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGNyb3BwZXIgaXMgY2xlYW5lZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFbWl0IGFuIGVycm9yIHdoZW4gdGhlIGxvYWRlZCBpbWFnZSBpcyBub3QgdmFsaWQgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW91dHB1dC1uYXRpdmVcbiAgICBAT3V0cHV0KClcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxJbWdDcm9wcGVyRXJyb3JFdmVudD4oKTtcblxuICAgIHByaXZhdGUgX2N1cnJlbnRJbnB1dEVsZW1lbnQ/OiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgLyoqIEVtaXRzIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIFVzZWQgdG8gc3Vic2NyaWJlIHRvIGdsb2JhbCBtb3ZlIGFuZCBlbmQgZXZlbnRzICovXG4gICAgcHJvdGVjdGVkIF9kb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIF9kb2N1bWVudDogYW55LFxuICAgICAgICB2aWV3UG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50O1xuICAgICAgICB2aWV3UG9ydFJ1bGVyLmNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLnVwZGF0ZUNyb3BwZXJQb3NpdGlvbigpKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5faW1nQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuX3BvaW50ZXJEb3duLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kubmV4dCgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9pbWdDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbW92ZUdsb2JhbEV2ZW50cygpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqIExvYWQgaW1hZ2Ugd2l0aCBjYW52YXMgKi9cbiAgICBwcml2YXRlIF9pbWdMb2FkZWQoaW1nRWxlbWVudDogSFRNTEltYWdlRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoaW1nRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5faW1nID0gaW1nRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1nRWxlbWVudC53aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWdFbGVtZW50LmhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGltZ0VsZW1lbnQud2lkdGgsIGltZ0VsZW1lbnQuaGVpZ2h0KTtcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nRWxlbWVudCwgMCwgMCk7XG5cbiAgICAgICAgICAgIC8qKiBzZXQgbWluIHNjYWxlICovXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNaW5TY2FsZShjYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4U2NhbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NldFN0eWxlc0ZvckNvbnRJbWcodmFsdWVzOiB7IHg/OiBudW1iZXIsIHk/OiBudW1iZXIgfSkge1xuICAgICAgICBjb25zdCBuZXdTdHlsZXMgPSB7IH0gYXMgYW55O1xuICAgICAgICBpZiAodmFsdWVzLnggIT0gbnVsbCAmJiB2YWx1ZXMueSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb290UmVjdCA9IHRoaXMuX3Jvb3RSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCB4ID0gcm9vdFJlY3Qud2lkdGggLyAyIC0gKHZhbHVlcy54KTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSByb290UmVjdC5oZWlnaHQgLyAyIC0gKHZhbHVlcy55KTtcblxuICAgICAgICAgICAgdGhpcy5faW1nUmVjdC54ID0gKHZhbHVlcy54KTtcbiAgICAgICAgICAgIHRoaXMuX2ltZ1JlY3QueSA9ICh2YWx1ZXMueSk7XG4gICAgICAgICAgICB0aGlzLl9pbWdSZWN0LnhjID0gKHgpO1xuICAgICAgICAgICAgdGhpcy5faW1nUmVjdC55YyA9ICh5KTtcblxuICAgICAgICB9XG4gICAgICAgIG5ld1N0eWxlcy50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHsodGhpcy5faW1nUmVjdC54KX1weCwkeyh0aGlzLl9pbWdSZWN0LnkpfXB4LCAwKWA7XG4gICAgICAgIG5ld1N0eWxlcy50cmFuc2Zvcm0gKz0gYHNjYWxlKCR7dGhpcy5fc2NhbDNGaXh9KWA7XG4gICAgICAgIG5ld1N0eWxlcy50cmFuc2Zvcm1PcmlnaW4gPSBgJHt0aGlzLl9pbWdSZWN0LnhjfXB4ICR7dGhpcy5faW1nUmVjdC55Y31weCAwYDtcbiAgICAgICAgbmV3U3R5bGVzW1wiLXdlYmtpdC10cmFuc2Zvcm1cIl0gPSBuZXdTdHlsZXMudHJhbnNmb3JtO1xuICAgICAgICBuZXdTdHlsZXNbXCItd2Via2l0LXRyYW5zZm9ybS1vcmlnaW5cIl0gPSBuZXdTdHlsZXMudHJhbnNmb3JtT3JpZ2luO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdHlsZXMpIHtcbiAgICAgICAgICAgIGlmIChuZXdTdHlsZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2ltZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBrZXksIG5ld1N0eWxlc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYXJlYSBhbmQgaW1hZ2UgcG9zaXRpb24gb25seSBpZiBuZWVkZWQsXG4gICAgICogdGhpcyBpcyB1c2VkIHdoZW4gd2luZG93IHJlc2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDcm9wcGVyUG9zaXRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVBcmVhSWZOZWVkZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBMb2FkIEltYWdlIGZyb20gaW5wdXQgZXZlbnQgKi9cbiAgICBwdWJsaWMgc2VsZWN0SW5wdXRFdmVudChpbWc6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbnB1dEVsZW1lbnQgPSBpbWcudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IF9pbWcgPSBpbWcudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmIChfaW1nLmZpbGVzICYmIF9pbWcuZmlsZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZVNpemUgPSBfaW1nLmZpbGVzWzBdLnNpemU7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gX2ltZy52YWx1ZS5yZXBsYWNlKC8uKihcXC98XFxcXCkvLCBcIlwiKTtcblxuICAgICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSAmJiBmaWxlU2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNyb3BFdmVudDogSW1nQ3JvcHBlckVycm9yRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogX2ltZy5maWxlc1swXS50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGZpbGVTaXplLFxuICAgICAgICAgICAgICAgIGVycm9yOiBJbWdDcm9wcGVyRXJyb3IuU2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW4oKTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChjcm9wRXZlbnQgYXMgSW1nQ3JvcHBlckVycm9yRXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3IE9ic2VydmFibGU8UHJvZ3Jlc3NFdmVudD4ob2JzZXJ2ZXIgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVyciA9PiBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmVhZGVyLm9uYWJvcnQgPSBlcnIgPT4gb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXYpID0+IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZXYpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoX2ltZy5maWxlc1swXSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIChsb2FkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhVVJMID0gKGxvYWRFdmVudC50YXJnZXQgYXMgRmlsZVJlYWRlcikucmVzdWx0IGFzIHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRJbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IF9pbWcuZmlsZXNbMF0uc2l6ZSwgLy8gc2l6ZSBpbiBieXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25maWcudHlwZSB8fCBfaW1nLmZpbGVzWzBdLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFVUkxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JvcEV2ZW50OiBJbWdDcm9wcGVyRXJyb3JFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogSW1nQ3JvcHBlckVycm9yLk90aGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2c6IFwiVGhlIEZpbGUgY291bGQgbm90IGJlIGxvYWRlZC5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IF9pbWcuZmlsZXNbMF0udHlwZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFuKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChjcm9wRXZlbnQgYXMgSW1nQ3JvcHBlckVycm9yRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICB9XG5cbiAgICAvKiogU2V0IHRoZSBzaXplIG9mIHRoZSBpbWFnZSwgdGhlIHZhbHVlcyBjYW4gYmUgMCBiZXR3ZWVuIDEsIHdoZXJlIDEgaXMgdGhlIG9yaWdpbmFsIHNpemUgKi9cbiAgICBwdWJsaWMgc2V0U2NhbGUoc2l6ZT86IG51bWJlciwgbm9BdXRvQ3JvcD86IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gZml4IG1pbiBzY2FsZVxuICAgICAgICBjb25zdCBuZXdTaXplID0gc2l6ZSA+PSB0aGlzLm1pblNjYWxlICYmIHNpemUgPD0gMSA/IHNpemUgOiB0aGlzLm1pblNjYWxlO1xuXG4gICAgICAgIC8vIGNoZWNrXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBzaXplICE9IG51bGwgJiYgc2l6ZSAhPT0gdGhpcy5zY2FsZSAmJiBuZXdTaXplICE9PSB0aGlzLnNjYWxlO1xuICAgICAgICB0aGlzLl9zY2FsZSA9IHNpemU7XG4gICAgICAgIGlmICghY2hhbmdlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NjYWwzRml4ID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQWJzb2x1dGVTY2FsZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRlZCkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5Qb3NpdGlvbiA9IHsuLi50aGlzLl9pbWdSZWN0fTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogb3JpZ2luUG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICAgICAgeTogb3JpZ2luUG9zaXRpb24ueSxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogb3JpZ2luUG9zaXRpb24ueGMsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogb3JpZ2luUG9zaXRpb24ueWNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFN0eWxlc0ZvckNvbnRJbWcoe30pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NpbXVsYXRlUG9pbnRlck1vdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWluU2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFN0eWxlc0ZvckNvbnRJbWcoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2dldENlbnRlclBvaW50cygpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NhbGVDaGFuZ2UuZW1pdChzaXplKTtcbiAgICAgICAgaWYgKCFub0F1dG9Dcm9wKSB7XG4gICAgICAgICAgICB0aGlzLl9jcm9wSWZBdXRvQ3JvcCgpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDZW50ZXJQb2ludHMoKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGltZyA9IHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB4ID0gKHJvb3Qub2Zmc2V0V2lkdGggLSAoaW1nLndpZHRoKSkgLyAyO1xuICAgICAgICBjb25zdCB5ID0gKHJvb3Qub2Zmc2V0SGVpZ2h0IC0gKGltZy5oZWlnaHQpKSAvIDI7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpdCB0byBzY3JlZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZml0VG9TY3JlZW4oKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgbWluID0ge1xuICAgICAgICAgICAgd2lkdGg6IGNvbnRhaW5lci5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogY29udGFpbmVyLm9mZnNldEhlaWdodFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2ltZztcbiAgICAgICAgY29uc3QgbWluU2NhbGUgPSB7XG4gICAgICAgICAgICB3aWR0aDogbWluLndpZHRoIC8gd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1pbi5oZWlnaHQgLyBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTWF0aC5tYXgobWluU2NhbGUud2lkdGgsIG1pblNjYWxlLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2V0U2NhbGUocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZml0KCkge1xuICAgICAgICB0aGlzLnNldFNjYWxlKHRoaXMubWluU2NhbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BvaW50ZXJEb3duID0gKGV2ZW50OiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVcbiAgICAgICAgLy8gdXNlciBpcyB1c2luZyBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSBtYWluIG1vdXNlIGJ1dHRvbi5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZyB8fCAoIWlzVG91Y2hFdmVudChldmVudCkgJiYgZXZlbnQuYnV0dG9uICE9PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSB7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5faW1nUmVjdC54LFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuX2ltZ1JlY3QueSxcbiAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLl9pbWdSZWN0LnhjLFxuICAgICAgICAgICAgICAgIHRvcDogdGhpcy5faW1nUmVjdC55Y1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RQb2ludGVyRXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9pbnRlckV2ZW50ID0gZ2V0R2VzdHVyZVBvaW50RnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9iaW5kR2xvYmFsRXZlbnRzKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaW11bGF0ZSBwb2ludGVyTW92ZSB3aXRoIGNsaWVudFggPSAwIGFuZCBjbGllbnRZID0gMCxcbiAgICAgKiB0aGlzIGlzIHVzZWQgYnkgYHNldFNjYWxlYCBhbmQgYHJvdGF0ZWBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaW11bGF0ZVBvaW50ZXJNb3ZlKCkge1xuICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9zdGFydFBvaW50ZXJFdmVudCA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3BvaW50ZXJNb3ZlKHtcbiAgICAgICAgICAgIGNsaWVudFg6IDAsXG4gICAgICAgICAgICBjbGllbnRZOiAwLFxuICAgICAgICAgICAgdHlwZTogXCJuXCIsXG4gICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge31cbiAgICAgICAgfSBhcyBNb3VzZUV2ZW50KTtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9pbnRlckV2ZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgX21hcmtGb3JDaGVjaygpIHtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlaXIgcG9pbnRlciBhZnRlclxuICAgICAqIHN0YXJ0aW5nIHRvIGRyYWcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcG9pbnRlck1vdmUgPSAoZXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICBsZXQgeDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVGaXggPSB0aGlzLl9zY2FsM0ZpeDtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IGdldEdlc3R1cmVQb2ludEZyb21FdmVudChldmVudCk7XG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBwb2ludC54IC0gdGhpcy5fc3RhcnRQb2ludGVyRXZlbnQueDtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IHBvaW50LnkgLSB0aGlzLl9zdGFydFBvaW50ZXJFdmVudC55O1xuICAgICAgICAgICAgaWYgKCFzY2FsZUZpeCB8fCAhc3RhcnRQKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc01pblNjYWxlWSA9IGNhbnZhcy5oZWlnaHQgKiBzY2FsZUZpeCA8IGNvbmZpZy5oZWlnaHQgJiYgY29uZmlnLmV4dHJhWm9vbU91dDtcbiAgICAgICAgICAgIGNvbnN0IGlzTWluU2NhbGVYID0gY2FudmFzLndpZHRoICogc2NhbGVGaXggPCBjb25maWcud2lkdGggJiYgY29uZmlnLmV4dHJhWm9vbU91dDtcblxuICAgICAgICAgICAgY29uc3QgbGltaXRMZWZ0ID0gKGNvbmZpZy53aWR0aCAvIDIgLyBzY2FsZUZpeCkgPj0gc3RhcnRQLmxlZnQgLSAoZGVsdGFYIC8gc2NhbGVGaXgpO1xuICAgICAgICAgICAgY29uc3QgbGltaXRSaWdodCA9IChjb25maWcud2lkdGggLyAyIC8gc2NhbGVGaXgpICtcbiAgICAgICAgICAgICAgICAoY2FudmFzLndpZHRoKSAtIChzdGFydFAubGVmdCAtIChkZWx0YVggLyBzY2FsZUZpeCkpIDw9IGNvbmZpZy53aWR0aCAvIHNjYWxlRml4O1xuICAgICAgICAgICAgY29uc3QgbGltaXRUb3AgPSAoKGNvbmZpZy5oZWlnaHQgLyAyIC8gc2NhbGVGaXgpID49IChzdGFydFAudG9wIC0gKGRlbHRhWSAvIHNjYWxlRml4KSkpO1xuICAgICAgICAgICAgY29uc3QgbGltaXRCb3R0b20gPSAoXG4gICAgICAgICAgICAgICAgKChjb25maWcuaGVpZ2h0IC8gMiAvIHNjYWxlRml4KSArIChjYW52YXMuaGVpZ2h0KSAtIChzdGFydFAudG9wIC0gKGRlbHRhWSAvIHNjYWxlRml4KSkpIDw9IChjb25maWcuaGVpZ2h0IC8gc2NhbGVGaXgpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBMaW1pdCBmb3IgbGVmdFxuICAgICAgICAgICAgaWYgKChsaW1pdExlZnQgJiYgIWlzTWluU2NhbGVYKSB8fCAoIWxpbWl0TGVmdCAmJiBpc01pblNjYWxlWCkpIHtcbiAgICAgICAgICAgICAgICB4ID0gc3RhcnRQLnggKyAoc3RhcnRQLmxlZnQpIC0gKGNvbmZpZy53aWR0aCAvIDIgLyBzY2FsZUZpeCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpbWl0IGZvciByaWdodFxuICAgICAgICAgICAgaWYgKChsaW1pdFJpZ2h0ICYmICFpc01pblNjYWxlWCkgfHwgKCFsaW1pdFJpZ2h0ICYmIGlzTWluU2NhbGVYKSkge1xuICAgICAgICAgICAgICAgIHggPSBzdGFydFAueCArIChzdGFydFAubGVmdCkgKyAoY29uZmlnLndpZHRoIC8gMiAvIHNjYWxlRml4KSAtIGNhbnZhcy53aWR0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTGltaXQgZm9yIHRvcFxuICAgICAgICAgICAgaWYgKChsaW1pdFRvcCAmJiAhaXNNaW5TY2FsZVkpIHx8ICghbGltaXRUb3AgJiYgaXNNaW5TY2FsZVkpKSB7XG4gICAgICAgICAgICAgICAgeSA9IHN0YXJ0UC55ICsgKHN0YXJ0UC50b3ApIC0gKGNvbmZpZy5oZWlnaHQgLyAyIC8gc2NhbGVGaXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMaW1pdCBmb3IgYm90dG9tXG4gICAgICAgICAgICBpZiAoKGxpbWl0Qm90dG9tICYmICFpc01pblNjYWxlWSkgfHwgKCFsaW1pdEJvdHRvbSAmJiBpc01pblNjYWxlWSkpIHtcbiAgICAgICAgICAgICAgICB5ID0gc3RhcnRQLnkgKyAoc3RhcnRQLnRvcCkgKyAoY29uZmlnLmhlaWdodCAvIDIgLyBzY2FsZUZpeCkgLSBjYW52YXMuaGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIHByZXNzIHNoaWZ0S2V5LCBkZXByZWNhdGVkXG4gICAgICAgICAgICAvLyBpZiAoZXZlbnQuc3JjRXZlbnQgJiYgZXZlbnQuc3JjRXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIC8vICAgaWYgKE1hdGguYWJzKGV2ZW50LmRlbHRhWCkgPT09IE1hdGgubWF4KE1hdGguYWJzKGV2ZW50LmRlbHRhWCksIE1hdGguYWJzKGV2ZW50LmRlbHRhWSkpKSB7XG4gICAgICAgICAgICAvLyAgICAgeSA9IHRoaXMub2Zmc2V0LnRvcDtcbiAgICAgICAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB4ID0gdGhpcy5vZmZzZXQubGVmdDtcbiAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAoeCA9PT0gdm9pZCAwKSB7IHggPSAoZGVsdGFYIC8gc2NhbGVGaXgpICsgKHN0YXJ0UC54KTsgfVxuICAgICAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0gKGRlbHRhWSAvIHNjYWxlRml4KSArIChzdGFydFAueSk7IH1cbiAgICAgICAgICAgIHRoaXMuX3NldFN0eWxlc0ZvckNvbnRJbWcoe1xuICAgICAgICAgICAgICAgIHgsIHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQ7XG4gICAgcHVibGljIHVwZGF0ZVBvc2l0aW9uKHhPcmlnaW46IG51bWJlciwgeU9yaWdpbjogbnVtYmVyKTogdm9pZDtcbiAgICBwdWJsaWMgdXBkYXRlUG9zaXRpb24oeE9yaWdpbj86IG51bWJlciwgeU9yaWdpbj86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuX3Jvb3RSZWN0KCk7XG4gICAgICAgIGNvbnN0IGFyZWFSZWN0ID0gdGhpcy5fYXJlYUNyb3BwZXJSZWN0KCk7XG4gICAgICAgIGNvbnN0IGFyZWFXaWR0aCA9IGFyZWFSZWN0LndpZHRoID4gaG9zdFJlY3Qud2lkdGhcbiAgICAgICAgICAgID8gaG9zdFJlY3Qud2lkdGhcbiAgICAgICAgICAgIDogYXJlYVJlY3Qud2lkdGg7XG4gICAgICAgIGNvbnN0IGFyZWFIZWlnaHQgPSBhcmVhUmVjdC5oZWlnaHQgPiBob3N0UmVjdC5oZWlnaHRcbiAgICAgICAgICAgID8gaG9zdFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICA6IGFyZWFSZWN0LmhlaWdodDtcbiAgICAgICAgbGV0IHg6IG51bWJlcjtcbiAgICAgICAgbGV0IHk6IG51bWJlcjtcbiAgICAgICAgaWYgKHhPcmlnaW4gPT0gbnVsbCAmJiB5T3JpZ2luID09IG51bGwpIHtcbiAgICAgICAgICAgIHhPcmlnaW4gPSB0aGlzLl9pbWdSZWN0LnhjO1xuICAgICAgICAgICAgeU9yaWdpbiA9IHRoaXMuX2ltZ1JlY3QueWM7XG4gICAgICAgIH1cbiAgICAgICAgeCA9IChhcmVhUmVjdC5sZWZ0IC0gaG9zdFJlY3QubGVmdCk7XG4gICAgICAgIHkgPSAoYXJlYVJlY3QudG9wIC0gaG9zdFJlY3QudG9wKTtcbiAgICAgICAgeCAtPSAoeE9yaWdpbiAtIChhcmVhV2lkdGggLyAyKSk7XG4gICAgICAgIHkgLT0gKHlPcmlnaW4gLSAoYXJlYUhlaWdodCAvIDIpKTtcblxuICAgICAgICB0aGlzLl9zZXRTdHlsZXNGb3JDb250SW1nKHtcbiAgICAgICAgICAgIHgsIHlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIF9zbGlkZUVuZCgpIHtcbiAgICAgICAgdGhpcy5fY3JvcElmQXV0b0Nyb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcm9wSWZBdXRvQ3JvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9Dcm9wKSB7XG4gICAgICAgICAgICB0aGlzLmNyb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiArICovXG4gICAgcHVibGljIHpvb21JbigpIHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLl9zY2FsM0ZpeCArIC4wNTtcbiAgICAgICAgaWYgKHNjYWxlID4gdGhpcy5taW5TY2FsZSAmJiBzY2FsZSA8PSB0aGlzLl9tYXhTY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2FsZShzY2FsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKHRoaXMuX21heFNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBDbGVhbiB0aGUgaW1nIGNyb3BwZXIgKi9cbiAgICBwdWJsaWMgY2xlYW4oKSB7XG4gICAgICAgIC8vIGZpeCBjaG9vc2luZyB0aGUgc2FtZSBpbWFnZSBkb2VzIG5vdCBsb2FkXG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5wdXRFbGVtZW50LnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbnB1dEVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbWdSZWN0ID0geyB9IGFzIGFueTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zY2FsZSA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICAgICAgICB0aGlzLl9zY2FsM0ZpeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uID0gMDtcbiAgICAgICAgICAgIHRoaXMuX21pblNjYWxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5faXNMb2FkZWRJbWcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNDcm9wcGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50TG9hZENvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5fY29uZmlnUHJpbWFyeTtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gMDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgICAgICAgdGhpcy5jbGVhbmVkLmVtaXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIC0gKi9cbiAgICBwdWJsaWMgem9vbU91dCgpIHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLl9zY2FsM0ZpeCAtIC4wNTtcbiAgICAgICAgaWYgKHNjYWxlID4gdGhpcy5taW5TY2FsZSAmJiBzY2FsZSA8PSB0aGlzLl9tYXhTY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2FsZShzY2FsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBjZW50ZXIoKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0eWxlcyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2dldENlbnRlclBvaW50cygpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3NldFN0eWxlc0ZvckNvbnRJbWcobmV3U3R5bGVzKTtcbiAgICAgICAgdGhpcy5fY3JvcElmQXV0b0Nyb3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogbG9hZCBhbiBpbWFnZSBmcm9tIGEgZ2l2ZW4gY29uZmlndXJhdGlvbixcbiAgICAgKiBvciBmcm9tIHRoZSByZXN1bHQgb2YgYSBjcm9wcGVkIGltYWdlXG4gICAgICovXG4gICAgcHVibGljIGxvYWRJbWFnZShjb25maWc6IEltZ0Nyb3BwZXJMb2FkZXJDb25maWcgfCBzdHJpbmcsIGZuPzogKCkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmNsZWFuKCk7XG4gICAgICAgIGNvbnN0IF9jb25maWcgPSB0aGlzLl9jdXJyZW50TG9hZENvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8geyBvcmlnaW5hbERhdGFVUkw6IGNvbmZpZyB9XG4gICAgICAgICAgICA6IHsgLi4uY29uZmlnIH07XG4gICAgICAgIGxldCBzcmMgPSBfY29uZmlnLm9yaWdpbmFsRGF0YVVSTDtcbiAgICAgICAgdGhpcy5fcHJpbWFyeUFyZWFXaWR0aCA9IHRoaXMuX2NvbmZpZ1ByaW1hcnkud2lkdGg7XG4gICAgICAgIHRoaXMuX3ByaW1hcnlBcmVhSGVpZ2h0ID0gdGhpcy5fY29uZmlnUHJpbWFyeS5oZWlnaHQ7XG4gICAgICAgIGlmIChfY29uZmlnLmFyZWFXaWR0aCAmJiBfY29uZmlnLmFyZWFIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLndpZHRoID0gX2NvbmZpZy5hcmVhV2lkdGg7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5oZWlnaHQgPSBfY29uZmlnLmFyZWFIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3JjID0gbm9ybWFsaXplU1ZHKHNyYyk7XG5cbiAgICAgICAgY29uc3QgaW1nID0gY3JlYXRlSHRtbEltZyhzcmMpO1xuXG4gICAgICAgIGNvbnN0IGNyb3BFdmVudCA9IHsgLi4uX2NvbmZpZyB9IGFzIEltZ0Nyb3BwZXJFdmVudDtcblxuICAgICAgICBuZXcgT2JzZXJ2YWJsZTx2b2lkPihvYnNlcnZlciA9PiB7XG5cbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gZXJyID0+IG9ic2VydmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICBpbWcub25hYm9ydCA9IGVyciA9PiBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IG9ic2VydmVyLm5leHQobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1nTG9hZGVkKGltZyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTG9hZGVkSW1nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZUxvYWRlZC5lbWl0KGNyb3BFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25TdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuX3Bvc2l0aW9uSW1nKGNyb3BFdmVudCwgZm4pKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEltZ0Nyb3BwZXJFcnJvckV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogX2NvbmZpZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEltZ0Nyb3BwZXJFcnJvci5UeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogX2NvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogX2NvbmZpZy5zaXplXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91cGRhdGVBcmVhSWZOZWVkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLnJlc3BvbnNpdmVBcmVhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb290UmVjdCA9IHRoaXMuX3Jvb3RSZWN0KCk7XG4gICAgICAgIGNvbnN0IGFyZWFSZWN0ID0gdGhpcy5fYXJlYUNyb3BwZXJSZWN0KCk7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gdGhpcy5jb25maWcubWluV2lkdGggfHwgMTtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gdGhpcy5jb25maWcubWluSGVpZ2h0IHx8IDE7XG4gICAgICAgIGlmICghKFxuICAgICAgICAgICAgYXJlYVJlY3Qud2lkdGggPiByb290UmVjdC53aWR0aFxuICAgICAgICAgICAgfHwgYXJlYVJlY3QuaGVpZ2h0ID4gcm9vdFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICB8fCBhcmVhUmVjdC53aWR0aCA8IHRoaXMuX3ByaW1hcnlBcmVhV2lkdGhcbiAgICAgICAgICAgIHx8IGFyZWFSZWN0LmhlaWdodCA8IHRoaXMuX3ByaW1hcnlBcmVhSGVpZ2h0XG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmVhV2lkdGhDb25mID0gTWF0aC5tYXgodGhpcy5jb25maWcud2lkdGgsIG1pbldpZHRoKTtcbiAgICAgICAgY29uc3QgYXJlYVdpZHRoTWF4ID0gTWF0aC5tYXgocm9vdFJlY3Qud2lkdGgsIG1pbldpZHRoKTtcbiAgICAgICAgY29uc3QgbWluSG9zdCA9IE1hdGgubWluKFxuICAgICAgICAgICAgTWF0aC5tYXgocm9vdFJlY3Qud2lkdGgsIG1pbldpZHRoKSwgTWF0aC5tYXgocm9vdFJlY3QuaGVpZ2h0LCBtaW5IZWlnaHQpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTY2FsZSA9IHRoaXMuX3NjYWwzRml4O1xuICAgICAgICBsZXQgbmV3U2NhbGUgPSAwO1xuICAgICAgICBjb25zdCByb3VuZENvbmYgPSB0aGlzLmNvbmZpZy5yb3VuZDtcblxuICAgICAgICBpZiAocm91bmRDb25mKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy53aWR0aCA9IHRoaXMuY29uZmlnLmhlaWdodCA9IG1pbkhvc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYXJlYVdpZHRoQ29uZiA9PT0gYXJlYVJlY3Qud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJlYVdpZHRoTWF4ID4gdGhpcy5fcHJpbWFyeUFyZWFXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy53aWR0aCA9IHRoaXMuX3ByaW1hcnlBcmVhV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmhlaWdodCA9ICh0aGlzLl9wcmltYXJ5QXJlYVdpZHRoICogYXJlYVJlY3QuaGVpZ2h0KSAvIGFyZWFSZWN0LndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IChjdXJyZW50U2NhbGUgKiB0aGlzLl9wcmltYXJ5QXJlYVdpZHRoKSAvIGFyZWFSZWN0LndpZHRoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLndpZHRoID0gYXJlYVdpZHRoTWF4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5oZWlnaHQgPSAoYXJlYVdpZHRoTWF4ICogYXJlYVJlY3QuaGVpZ2h0KSAvIGFyZWFSZWN0LndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IChjdXJyZW50U2NhbGUgKiBhcmVhV2lkdGhNYXgpIC8gYXJlYVJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1pblNjYWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4U2NhbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNjYWxlKG5ld1NjYWxlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUFic29sdXRlU2NhbGUoKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fc2NhbDNGaXggLyAodGhpcy5jb25maWcud2lkdGggLyB0aGlzLl9wcmltYXJ5QXJlYVdpZHRoKTtcbiAgICAgICAgdGhpcy5fYWJzb2x1dGVTY2FsZSA9IHNjYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgSW1hZ2UgZnJvbSBVUkxcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYGxvYWRJbWFnZWAgaW5zdGVhZCBvZiBgc2V0SW1hZ2VVcmxgXG4gICAgICogQHBhcmFtIHNyYyBVUkxcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZW1pdCB0aGUgZXZlbnQgbG9hZGVkXG4gICAgICovXG4gICAgcHVibGljIHNldEltYWdlVXJsKHNyYzogc3RyaW5nLCBmbj86ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5sb2FkSW1hZ2Uoc3JjLCBmbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcG9zaXRpb25JbWcoY3JvcEV2ZW50OiBJbWdDcm9wcGVyRXZlbnQsIGZuPzogKCkgPT4gdm9pZCkge1xuICAgICAgICBjb25zdCBsb2FkQ29uZmlnID0gdGhpcy5fY3VycmVudExvYWRDb25maWc7XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1pblNjYWxlKHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWF4U2NhbGUoKTtcbiAgICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobG9hZENvbmZpZy5zY2FsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2NhbGUobG9hZENvbmZpZy5zY2FsZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2NhbGUodGhpcy5taW5TY2FsZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvdGF0ZShsb2FkQ29uZmlnLnJvdGF0aW9uIHx8IDApO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXJlYUlmTmVlZGVkKCk7XG4gICAgICAgICAgICB0aGlzLl9tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbmdab25lXG4gICAgICAgICAgICAgICAgICAgIC5vblN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ29uZmlnLnhPcmlnaW4gIT0gbnVsbCAmJiBsb2FkQ29uZmlnLnlPcmlnaW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24obG9hZENvbmZpZy54T3JpZ2luLCBsb2FkQ29uZmlnLnlPcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXJlYUlmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nyb3BJZkF1dG9Dcm9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWR5LmVtaXQoY3JvcEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJvdGF0ZShkZWdyZWVzOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHZhbGlkRGVncmVlcyA9IF9ub3JtYWxpemVEZWdyZWVzKGRlZ3JlZXMpO1xuICAgICAgICAvLyBJZiBuZWdhdGl2ZSBjb252ZXJ0IHRvIHBvc2l0aXZlXG4gICAgICAgIGlmICh2YWxpZERlZ3JlZXMgPCAwKSB7XG4gICAgICAgICAgICB2YWxpZERlZ3JlZXMgKz0gMzYwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JvdGF0aW9uID0gX25vcm1hbGl6ZURlZ3JlZXMoKHRoaXMuX3JvdGF0aW9uIHx8IDApICsgdmFsaWREZWdyZWVzKTtcbiAgICAgICAgaWYgKG5ld1JvdGF0aW9uID09PSB0aGlzLl9yb3RhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZ3JlZXNSYWQgPSB2YWxpZERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9pbWdDYW52YXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FudmFzQ2xvbiA9IGNyZWF0ZUNhbnZhc0ltZyhjYW52YXMpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IG5ld1JvdGF0aW9uO1xuXG4gICAgICAgIC8vIGNsZWFyXG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzQ2xvbi53aWR0aCwgY2FudmFzQ2xvbi5oZWlnaHQpO1xuXG4gICAgICAgIC8vIHJvdGF0ZSBjYW52YXMgaW1hZ2VcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gYHJvdGF0ZSgke3ZhbGlkRGVncmVlc31kZWcpIHNjYWxlKCR7MSAvIHRoaXMuX3NjYWwzRml4fSlgO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1PcmlnaW4gPSBgJHt0aGlzLl9pbWdSZWN0LnhjfXB4ICR7dGhpcy5faW1nUmVjdC55Y31weCAwYDtcbiAgICAgICAgY2FudmFzLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxuICAgICAgICBjYW52YXMuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICBjYW52YXMuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gdHJhbnNmb3JtT3JpZ2luO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXG4gICAgICAgIGNhbnZhcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm1PcmlnaW4gPSB0cmFuc2Zvcm1PcmlnaW47XG5cbiAgICAgICAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBhcyBET01SZWN0O1xuXG4gICAgICAgIC8vIHNhdmUgcmVjdFxuICAgICAgICBjb25zdCBjYW52YXNSZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIHJlbW92ZSByb3RhdGUgc3R5bGVzXG4gICAgICAgIGNhbnZhcy5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcblxuICAgICAgICAvLyBzZXQgdyAmIGhcbiAgICAgICAgY29uc3QgdyA9IGNhbnZhc1JlY3Qud2lkdGg7XG4gICAgICAgIGNvbnN0IGggPSBjYW52YXNSZWN0LmhlaWdodDtcbiAgICAgICAgY3R4LmNhbnZhcy53aWR0aCA9IHc7XG4gICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gaDtcblxuICAgICAgICAvLyBjbGVhclxuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuXG4gICAgICAgIC8vIHRyYW5zbGF0ZSBhbmQgcm90YXRlXG4gICAgICAgIGN0eC50cmFuc2xhdGUodyAvIDIsIGggLyAyKTtcbiAgICAgICAgY3R4LnJvdGF0ZShkZWdyZWVzUmFkKTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShjYW52YXNDbG9uLCAtY2FudmFzQ2xvbi53aWR0aCAvIDIsIC1jYW52YXNDbG9uLmhlaWdodCAvIDIpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBtaW4gc2NhbGVcbiAgICAgICAgdGhpcy5fdXBkYXRlTWluU2NhbGUoY2FudmFzKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWF4U2NhbGUoKTtcblxuICAgICAgICAvLyBzZXQgdGhlIG1pbmltdW0gc2NhbGUsIG9ubHkgaWYgbmVjZXNzYXJ5XG4gICAgICAgIGlmICh0aGlzLnNjYWxlIDwgdGhpcy5taW5TY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2FsZSgwLCB0cnVlKTtcbiAgICAgICAgfSAvLyAgICAgICAgICAgICAgICDihpEgbm8gQXV0b0Nyb3BcblxuICAgICAgICBjb25zdCByb290UmVjdCA9IHRoaXMuX3Jvb3RSZWN0KCk7XG5cbiAgICAgICAgdGhpcy5fc2V0U3R5bGVzRm9yQ29udEltZyh7XG4gICAgICAgICAgICB4OiAobGVmdCAtIHJvb3RSZWN0LmxlZnQpLFxuICAgICAgICAgICAgeTogKHRvcCAtIHJvb3RSZWN0LnRvcClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8ga2VlcCBpbWFnZSBpbnNpZGUgdGhlIGZyYW1lXG4gICAgICAgIGNvbnN0IG9yaWdpblBvc2l0aW9uID0gey4uLnRoaXMuX2ltZ1JlY3R9O1xuICAgICAgICB0aGlzLm9mZnNldCA9IHtcbiAgICAgICAgICAgIHg6IG9yaWdpblBvc2l0aW9uLngsXG4gICAgICAgICAgICB5OiBvcmlnaW5Qb3NpdGlvbi55LFxuICAgICAgICAgICAgbGVmdDogb3JpZ2luUG9zaXRpb24ueGMsXG4gICAgICAgICAgICB0b3A6IG9yaWdpblBvc2l0aW9uLnljXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3NldFN0eWxlc0ZvckNvbnRJbWcoe30pO1xuICAgICAgICB0aGlzLl9zaW11bGF0ZVBvaW50ZXJNb3ZlKCk7XG5cbiAgICAgICAgdGhpcy5fY3JvcElmQXV0b0Nyb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3VwZGF0ZU1pblNjYWxlKGNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgICAgICBjYW52YXMgPSB0aGlzLl9pbWdDYW52YXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgY29uc3QgbWluU2NhbGUgPSAoY29uZmlnLmV4dHJhWm9vbU91dCA/IE1hdGgubWluIDogTWF0aC5tYXgpKFxuICAgICAgICAgICAgY29uZmlnLndpZHRoIC8gY2FudmFzLndpZHRoLFxuICAgICAgICAgICAgY29uZmlnLmhlaWdodCAvIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB0aGlzLl9taW5TY2FsZSA9IG1pblNjYWxlO1xuICAgICAgICB0aGlzLm1pblNjYWxlQ2hhbmdlLmVtaXQobWluU2NhbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZU1heFNjYWxlKCkge1xuICAgICAgICBjb25zdCBtYXhTY2FsZSA9ICh0aGlzLmNvbmZpZy53aWR0aCAvIHRoaXMuX3ByaW1hcnlBcmVhV2lkdGgpO1xuICAgICAgICB0aGlzLl9tYXhTY2FsZSA9IG1heFNjYWxlO1xuICAgICAgICB0aGlzLm1heFNjYWxlQ2hhbmdlLmVtaXQobWF4U2NhbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSAmIGNyb3AgaW1hZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JvcChjb25maWc/OiBJbWdDcm9wcGVyQ29uZmlnKTogSW1nQ3JvcHBlckV2ZW50IHtcbiAgICAgICAgY29uc3QgbmV3Q29uZmlnID0gY29uZmlnXG4gICAgICAgICAgICA/IG1lcmdlRGVlcCh7IH0sIHRoaXMuY29uZmlnIHx8IG5ldyBJbWdDcm9wcGVyQ29uZmlnKCksIGNvbmZpZykgOiB0aGlzLmNvbmZpZztcbiAgICAgICAgY29uc3QgY3JvcEV2ZW50ID0gdGhpcy5faW1nQ3JvcChuZXdDb25maWcpO1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICByZXR1cm4gY3JvcEV2ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9pbWdDcm9wKG15Q29uZmlnOiBJbWdDcm9wcGVyQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQ6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgY29uc3QgYXJlYVJlY3QgPSB0aGlzLl9hcmVhQ3JvcHBlclJlY3QoKTtcbiAgICAgICAgY29uc3QgY2FudmFzUmVjdCA9IHRoaXMuX2NhbnZhc1JlY3QoKTtcbiAgICAgICAgY29uc3Qgc2NhbGVGaXggPSB0aGlzLl9zY2FsM0ZpeDtcbiAgICAgICAgY29uc3QgbGVmdCA9IChhcmVhUmVjdC5sZWZ0IC0gY2FudmFzUmVjdC5sZWZ0KSAvIHNjYWxlRml4O1xuICAgICAgICBjb25zdCB0b3AgPSAoYXJlYVJlY3QudG9wIC0gY2FudmFzUmVjdC50b3ApIC8gc2NhbGVGaXg7XG4gICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBteUNvbmZpZztcbiAgICAgICAgY29uc3QgY3VycmVudEltYWdlTG9hZENvbmZpZyA9IHRoaXMuX2N1cnJlbnRMb2FkQ29uZmlnO1xuICAgICAgICBjb25zdCBhcmVhID0ge1xuICAgICAgICAgICAgd2lkdGg6IG15Q29uZmlnLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBteUNvbmZpZy5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY2FudmFzRWxlbWVudC53aWR0aCA9IGFyZWEud2lkdGggLyBzY2FsZUZpeDtcbiAgICAgICAgY2FudmFzRWxlbWVudC5oZWlnaHQgPSBhcmVhLmhlaWdodCAvIHNjYWxlRml4O1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgaWYgKG15Q29uZmlnLmZpbGwpIHtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBteUNvbmZpZy5maWxsO1xuICAgICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhc0VsZW1lbnQud2lkdGgsIGNhbnZhc0VsZW1lbnQuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZHJhd0ltYWdlKHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgLShsZWZ0KSwgLSh0b3ApLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjYW52YXNFbGVtZW50O1xuICAgICAgICBpZiAobXlDb25maWcub3V0cHV0ID09PSBJbWdSZXNvbHV0aW9uLkRlZmF1bHQpIHtcbiAgICAgICAgICAgIHJlc2l6ZUNhbnZhcyhcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnUHJpbWFyeS53aWR0aCxcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWdQcmltYXJ5LmhlaWdodCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG91dHB1dCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKG91dHB1dC53aWR0aCAmJiBvdXRwdXQuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmVzaXplQ2FudmFzKHJlc3VsdCwgb3V0cHV0LndpZHRoLCBvdXRwdXQuaGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0LndpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gYXJlYS5oZWlnaHQgKiBvdXRwdXQud2lkdGggLyBhcmVhLndpZHRoO1xuICAgICAgICAgICAgICAgIHJlc2l6ZUNhbnZhcyhyZXN1bHQsIG91dHB1dC53aWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoID0gYXJlYS53aWR0aCAqIG91dHB1dC5oZWlnaHQgLyBhcmVhLmhlaWdodDtcbiAgICAgICAgICAgICAgICByZXNpemVDYW52YXMocmVzdWx0LCBuZXdXaWR0aCwgb3V0cHV0LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHlwZSA9IGN1cnJlbnRJbWFnZUxvYWRDb25maWcub3JpZ2luYWxEYXRhVVJMLnN0YXJ0c1dpdGgoXCJodHRwXCIpXG4gICAgICAgICAgICA/IGN1cnJlbnRJbWFnZUxvYWRDb25maWcudHlwZSB8fCBteUNvbmZpZy50eXBlXG4gICAgICAgICAgICA6IG15Q29uZmlnLnR5cGUgfHwgY3VycmVudEltYWdlTG9hZENvbmZpZy50eXBlO1xuICAgICAgICBjb25zdCBkYXRhVVJMID0gcmVzdWx0LnRvRGF0YVVSTCh0eXBlKTtcbiAgICAgICAgY29uc3QgY3JvcEV2ZW50OiBJbWdDcm9wcGVyRXZlbnQgPSB7XG4gICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG5hbWU6IGN1cnJlbnRJbWFnZUxvYWRDb25maWcubmFtZSxcbiAgICAgICAgICAgIGFyZWFXaWR0aDogdGhpcy5fcHJpbWFyeUFyZWFXaWR0aCxcbiAgICAgICAgICAgIGFyZWFIZWlnaHQ6IHRoaXMuX3ByaW1hcnlBcmVhSGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHJlc3VsdC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogcmVzdWx0LmhlaWdodCxcbiAgICAgICAgICAgIG9yaWdpbmFsRGF0YVVSTDogY3VycmVudEltYWdlTG9hZENvbmZpZy5vcmlnaW5hbERhdGFVUkwsXG4gICAgICAgICAgICBzY2FsZTogdGhpcy5fYWJzb2x1dGVTY2FsZSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLl9yb3RhdGlvbixcbiAgICAgICAgICAgIGxlZnQ6IChhcmVhUmVjdC5sZWZ0IC0gY2FudmFzUmVjdC5sZWZ0KSAvIHRoaXMuX3NjYWwzRml4LFxuICAgICAgICAgICAgdG9wOiAoYXJlYVJlY3QudG9wIC0gY2FudmFzUmVjdC50b3ApIC8gdGhpcy5fc2NhbDNGaXgsXG4gICAgICAgICAgICBzaXplOiBjdXJyZW50SW1hZ2VMb2FkQ29uZmlnLnNpemUsXG4gICAgICAgICAgICB4T3JpZ2luOiB0aGlzLl9pbWdSZWN0LnhjLFxuICAgICAgICAgICAgeU9yaWdpbjogdGhpcy5faW1nUmVjdC55YyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5faW1nUmVjdC54YyxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLl9pbWdSZWN0LnljXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5pc0Nyb3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNyb3BwZWQuZW1pdChjcm9wRXZlbnQpO1xuICAgICAgICByZXR1cm4gY3JvcEV2ZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBfcm9vdFJlY3QoKTogRE9NUmVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgYXMgRE9NUmVjdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgX2FyZWFDcm9wcGVyUmVjdCgpOiBET01SZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FyZWFSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBhcyBET01SZWN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBfY2FudmFzUmVjdCgpOiBET01SZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuXG4gICAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBsaWZ0ZWQgdGhlaXIgcG9pbnRlci4gKi9cbiAgICBwcml2YXRlIF9wb2ludGVyVXAgPSAoZXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVHbG9iYWxFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRQb2ludGVyRXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fY3JvcElmQXV0b0Nyb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgd2luZG93IGhhcyBsb3N0IGZvY3VzLiAqL1xuICAgIHByaXZhdGUgX3dpbmRvd0JsdXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgYmx1cnJlZCB3aGlsZSBkcmFnZ2luZyB3ZSBuZWVkIHRvIHN0b3AgZHJhZ2dpbmcgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gYnJvd3NlciB3b24ndCBkaXNwYXRjaCB0aGUgYG1vdXNldXBgIGFuZCBgdG91Y2hlbmRgIGV2ZW50cyBhbnltb3JlLlxuICAgICAgICBpZiAodGhpcy5fbGFzdFBvaW50ZXJFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fcG9pbnRlclVwKHRoaXMuX2xhc3RQb2ludGVyRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYmluZEdsb2JhbEV2ZW50cyh0cmlnZ2VyRXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaXNUb3VjaCA9IGlzVG91Y2hFdmVudCh0cmlnZ2VyRXZlbnQpO1xuICAgICAgICBjb25zdCBtb3ZlRXZlbnROYW1lID0gaXNUb3VjaCA/IFwidG91Y2htb3ZlXCIgOiBcIm1vdXNlbW92ZVwiO1xuICAgICAgICBjb25zdCBlbmRFdmVudE5hbWUgPSBpc1RvdWNoID8gXCJ0b3VjaGVuZFwiIDogXCJtb3VzZXVwXCI7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtb3ZlRXZlbnROYW1lLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50TmFtZSwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChpc1RvdWNoKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLl93aW5kb3dCbHVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZW1vdmVzIGFueSBnbG9iYWwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2UgbWF5IGhhdmUgYWRkZWQuICovXG4gICAgcHJpdmF0ZSBfcmVtb3ZlR2xvYmFsRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQ7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93KSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy5fd2luZG93Qmx1cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVXNlIGRlZmF1bHRWaWV3IG9mIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgd2luZG93IHJlZmVyZW5jZSAqL1xuICAgIHByaXZhdGUgX2dldFdpbmRvdygpOiBXaW5kb3cge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIH1cblxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBkZWdyZWVzIGZvciBjcm9wcGVyIHJvdGF0aW9uXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbm9ybWFsaXplRGVncmVlcyhuOiBudW1iZXIpIHtcbiAgICBjb25zdCBkZSA9IG4gJSAzNjA7XG4gICAgaWYgKGRlICUgOTApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMeUNyb3BwZXI6IEludmFsaWQgXFxgJHtufVxcYCBkZWdyZWUsIG9ubHkgYWNjZXB0ZWQgdmFsdWVzOiAwLCA5MCwgMTgwLCAyNzAgJiAzNjAuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZTtcbn1cblxuLyoqXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhc0ltZyhpbWc6IEhUTUxDYW52YXNFbGVtZW50IHwgSFRNTEltYWdlRWxlbWVudCkge1xuXG4gICAgLy8gY3JlYXRlIGEgbmV3IGNhbnZhc1xuICAgIGNvbnN0IG5ld0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY29uc3QgY29udGV4dCA9IG5ld0NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgICAvLyBzZXQgZGltZW5zaW9uc1xuICAgIG5ld0NhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICBuZXdDYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgIC8vIGFwcGx5IHRoZSBvbGQgY2FudmFzIHRvIHRoZSBuZXcgb25lXG4gICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcblxuICAgIC8vIHJldHVybiB0aGUgbmV3IGNhbnZhc1xuICAgIHJldHVybiBuZXdDYW52YXM7XG59XG5cblxuY29uc3QgREFUQV9JTUFHRV9TVkdfUFJFRklYID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFwiO1xuXG5mdW5jdGlvbiBub3JtYWxpemVTVkcoZGF0YVVSTDogc3RyaW5nKSB7XG4gICAgaWYgKHdpbmRvdy5hdG9iICYmIGlzU3ZnSW1hZ2UoZGF0YVVSTCkpIHtcbiAgICAgICAgY29uc3QgbGVuID0gZGF0YVVSTC5sZW5ndGggLyA1O1xuICAgICAgICBjb25zdCB0ZXh0ID0gd2luZG93LmF0b2IoZGF0YVVSTC5yZXBsYWNlKERBVEFfSU1BR0VfU1ZHX1BSRUZJWCwgXCJcIikpO1xuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4uaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgY29uc3Qgc3ZnID0gc3Bhbi5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpO1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpub25lXCIpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShzdmcpLndpZHRoKSB8fCAxO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoc3ZnKS5oZWlnaHQpIHx8IDE7XG4gICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHtsZW4gLyAod2lkdGggLyBtYXgpfXB4YCk7XG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7bGVuIC8gKGhlaWdodCAvIG1heCl9cHhgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gREFUQV9JTUFHRV9TVkdfUFJFRklYICsgd2luZG93LmJ0b2Eoc3Bhbi5pbm5lckhUTUwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gZGF0YVVSTDtcbn1cblxuZnVuY3Rpb24gaXNTdmdJbWFnZShkYXRhVXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGF0YVVybC5zdGFydHNXaXRoKERBVEFfSU1BR0VfU1ZHX1BSRUZJWCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxJbWcoc3JjOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuY3Jvc3NPcmlnaW4gPSBcImFub255bW91c1wiO1xuICAgIGltZy5zcmMgPSBzcmM7XG4gICAgcmV0dXJuIGltZztcbn1cblxuXG5mdW5jdGlvbiBnZXRHZXN0dXJlUG9pbnRGcm9tRXZlbnQoZXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSB7XG5cbiAgICAvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLlxuICAgIGNvbnN0IHBvaW50ID0gaXNUb3VjaEV2ZW50KGV2ZW50KVxuICAgICAgICA/IChldmVudC50b3VjaGVzWzBdIHx8IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKVxuICAgICAgICA6IGV2ZW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9pbnQuY2xpZW50WCxcbiAgICAgICAgeTogcG9pbnQuY2xpZW50WVxuICAgIH07XG59XG5cbi8qKiBSZXR1cm5zIHdoZXRoZXIgYW4gZXZlbnQgaXMgYSB0b3VjaCBldmVudC4gKi9cbmZ1bmN0aW9uIGlzVG91Y2hFdmVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBldmVudCBpcyBUb3VjaEV2ZW50IHtcbiAgICByZXR1cm4gZXZlbnQudHlwZVswXSA9PT0gXCJ0XCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChuOiBudW1iZXIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChuKTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IGNoZWNrLlxuICogQHBhcmFtIGl0ZW1cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QoaXRlbSkge1xuICAgIHJldHVybiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCwgVT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiBUICYgVTtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCwgVSwgVj4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogVCAmIFUgJiBWO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcDxULCBVLCBWLCBXPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYsIHNvdXJjZTM6IFcpOiBUICYgVSAmIFYgJiBXO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IG9iamVjdCwgLi4uc291cmNlczogYW55W10pOiBhbnk7XG5cbi8qKlxuICogRGVlcCBtZXJnZSB0d28gb2JqZWN0cy5cbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSAuLi5zb3VyY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBhbnksIC4uLnNvdXJjZXM6IGFueVtdKSB7XG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkgeyByZXR1cm4gdGFyZ2V0OyB9XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTsgfVxuICAgICAgICAgICAgICAgIG1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5cblxuLyoqXG4gKiBXZSBoYXZlIHRoZSBjcm9wcGVyIGFyZWEgaW4gdGhlIHNhbWUgZmlsZSB0byBmaXggdGhlIGJ1aWxkXG4gKi9cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibmljZS1jcm9wcGVyLWFyZWFcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2ltYWdlLWNyb3BwZXItYXJlYS50ZW1wbGF0ZS5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL2ltYWdlLWNyb3BwZXItYXJlYS5zdHlsZS5zY3NzXCJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTmljZUNyb3BwZXJBcmVhQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKFwicmVzaXplclwiKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Jlc2l6ZXI/OiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMga2VlcEFzcGVjdFJhdGlvOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzcy5yb3VuZFwiKVxuICAgIHB1YmxpYyByb3VuZDogYm9vbGVhbjtcblxuICAgIC8qKiBVc2VkIHRvIHN1YnNjcmliZSB0byBnbG9iYWwgbW92ZSBhbmQgZW5kIGV2ZW50cyAqL1xuICAgIHByb3RlY3RlZCBfZG9jdW1lbnQ6IERvY3VtZW50O1xuICAgIHByaXZhdGUgX2lzU2xpZGluZzogYm9vbGVhbjtcblxuICAgIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgbGFzdCBwb2ludGVyIGV2ZW50IHRoYXQgd2FzIGNhcHR1cmVkIGJ5IHRoZSBjcm9wIGFyZWEuICovXG4gICAgcHJpdmF0ZSBfbGFzdFBvaW50ZXJFdmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQgfCBudWxsO1xuICAgIHByaXZhdGUgX3N0YXJ0UG9pbnRlckV2ZW50OiB7XG4gICAgICAgIHg6IG51bWJlclxuICAgICAgICB5OiBudW1iZXJcbiAgICB9IHwgbnVsbDtcbiAgICBwcml2YXRlIF9jdXJyZW50V2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jdXJyZW50SGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfc3RhcnRBcmVhUmVjdDogRE9NUmVjdDtcbiAgICBwcml2YXRlIF9zdGFydEltZ1JlY3Q6IERPTVJlY3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgX2RvY3VtZW50OiBhbnksXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nyb3BwZXI6IE5pY2VJbWFnZUNyb3BwZXJDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX25nWm9uZTogTmdab25lLFxuICAgICkge1xuICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNpemFibGVBcmVhOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc2l6YWJsZUFyZWEodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWwgIT09IHRoaXMuX3Jlc2l6YWJsZUFyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6YWJsZUFyZWEgPSB2YWw7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVSZXNpemFibGVBcmVhKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFJlc2l6YWJsZUFyZWEoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVSZXNpemFibGVBcmVhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGdldCByZXNpemFibGVBcmVhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzaXphYmxlQXJlYTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVJlc2l6YWJsZUFyZWEoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRSZXNpemFibGVBcmVhKCkge1xuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX3Jlc2l6ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbW92ZVJlc2l6YWJsZUFyZWEoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9yZXNpemVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVHbG9iYWxFdmVudHMoKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb2ludGVyRG93biA9IChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlXG4gICAgICAgIC8vIHVzZXIgaXMgdXNpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgbWFpbiBtb3VzZSBidXR0b24uXG4gICAgICAgIGlmICh0aGlzLl9pc1NsaWRpbmcgfHwgKCFpc1RvdWNoRXZlbnQoZXZlbnQpICYmIGV2ZW50LmJ1dHRvbiAhPT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRQb2ludGVyRXZlbnQgPSBnZXRHZXN0dXJlUG9pbnRGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRBcmVhUmVjdCA9IHRoaXMuX2Nyb3BwZXIuX2FyZWFDcm9wcGVyUmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRJbWdSZWN0ID0gdGhpcy5fY3JvcHBlci5fY2FudmFzUmVjdCgpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRHbG9iYWxFdmVudHMoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb2ludGVyTW92ZSA9IChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RQb2ludGVyRXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHR9ID0gdGhpcy5fY3JvcHBlci5jb25maWc7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IGdldEdlc3R1cmVQb2ludEZyb21FdmVudChldmVudCk7XG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBwb2ludC54IC0gdGhpcy5fc3RhcnRQb2ludGVyRXZlbnQueDtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IHBvaW50LnkgLSB0aGlzLl9zdGFydFBvaW50ZXJFdmVudC55O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRBcmVhUmVjdCA9IHRoaXMuX3N0YXJ0QXJlYVJlY3Q7XG4gICAgICAgICAgICBjb25zdCBzdGFydEltZ1JlY3QgPSB0aGlzLl9zdGFydEltZ1JlY3Q7XG4gICAgICAgICAgICBjb25zdCBpc1JvdW5kID0gdGhpcy5yb3VuZDtcbiAgICAgICAgICAgIGNvbnN0IGtlZXBBc3BlY3RSYXRpbyA9IHRoaXMuX2Nyb3BwZXIuY29uZmlnLmtlZXBBc3BlY3RSYXRpbyB8fCBldmVudC5zaGlmdEtleTtcbiAgICAgICAgICAgIGxldCBuZXdXaWR0aCA9IDA7XG4gICAgICAgICAgICBsZXQgbmV3SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5fY3JvcHBlci5fcm9vdFJlY3QoKTtcblxuICAgICAgICAgICAgaWYgKGlzUm91bmQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBjcm9wcGVyIGFyZWEgdG8gdGhlIHBvaW50ZXJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5YID0gKCh3aWR0aCAvIDIgLyBNYXRoLnNxcnQoMikpICsgZGVsdGFYKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5ZID0gKChoZWlnaHQgLyAyIC8gTWF0aC5zcXJ0KDIpKSArIGRlbHRhWSk7XG5cbiAgICAgICAgICAgICAgICAvLyBMZWdcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRlID0gTWF0aC5zcXJ0KG9yaWdpblggKiogMiArIG9yaWdpblkgKiogMik7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBuZXdIZWlnaHQgPSBzaWRlICogMjtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZWVwQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHdpZHRoICsgZGVsdGFYICogMjtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgKyBkZWx0YVkgKiAyO1xuICAgICAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gaGVpZ2h0IC8gKHdpZHRoIC8gbmV3V2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlaWdodCA+IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHdpZHRoIC8gKGhlaWdodCAvIG5ld0hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IG5ld0hlaWdodCA9IE1hdGgubWF4KG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSB3aWR0aCArIGRlbHRhWCAqIDI7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gaGVpZ2h0ICsgZGVsdGFZICogMjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVG8gbWluIHdpZHRoXG4gICAgICAgICAgICBpZiAobmV3V2lkdGggPCBtaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gbWluV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBtaW4gaGVpZ2h0XG4gICAgICAgICAgICBpZiAobmV3SGVpZ2h0IDwgbWluSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gbWluSGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEbyBub3Qgb3ZlcmZsb3cgdGhlIGNyb3BwZXIgYXJlYVxuICAgICAgICAgICAgY29uc3QgY2VudGVyWCA9IHN0YXJ0QXJlYVJlY3QueCArIHN0YXJ0QXJlYVJlY3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyWSA9IHN0YXJ0QXJlYVJlY3QueSArIHN0YXJ0QXJlYVJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHRvcE92ZXJmbG93ID0gc3RhcnRJbWdSZWN0LnkgPiBjZW50ZXJZIC0gKG5ld0hlaWdodCAvIDIpO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tT3ZlcmZsb3cgPSBjZW50ZXJZICsgKG5ld0hlaWdodCAvIDIpID4gc3RhcnRJbWdSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodE9uT3ZlcmZsb3cgPSBNYXRoLm1pbigoY2VudGVyWSAtIHN0YXJ0SW1nUmVjdC55KSAqIDIsIChzdGFydEltZ1JlY3QuYm90dG9tIC0gY2VudGVyWSkgKiAyKTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRPdmVyZmxvdyA9IHN0YXJ0SW1nUmVjdC54ID4gY2VudGVyWCAtIChuZXdXaWR0aCAvIDIpO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRPdmVyZmxvdyA9IGNlbnRlclggKyAobmV3V2lkdGggLyAyKSA+IHN0YXJ0SW1nUmVjdC5yaWdodDtcbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoT25PdmVyZmxvdyA9IE1hdGgubWluKChjZW50ZXJYIC0gc3RhcnRJbWdSZWN0LngpICogMiwgKHN0YXJ0SW1nUmVjdC5yaWdodCAtIGNlbnRlclgpICogMik7XG4gICAgICAgICAgICBjb25zdCBtaW5Pbk92ZXJmbG93ID0gTWF0aC5taW4obWluV2lkdGhPbk92ZXJmbG93LCBtaW5IZWlnaHRPbk92ZXJmbG93KTtcbiAgICAgICAgICAgIGlmIChyb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICh0b3BPdmVyZmxvdyB8fCBib3R0b21PdmVyZmxvdyB8fCBsZWZ0T3ZlcmZsb3cgfHwgcmlnaHRPdmVyZmxvdykge1xuICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBuZXdXaWR0aCA9IG1pbk9uT3ZlcmZsb3c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZWVwQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOZXdXaWR0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOZXdIZWlnaHQ6IG51bWJlcltdID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCh0b3BPdmVyZmxvdyB8fCBib3R0b21PdmVyZmxvdykgJiYgTWF0aC5taW4oKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBtaW5IZWlnaHRPbk92ZXJmbG93O1xuICAgICAgICAgICAgICAgICAgICBuZXdOZXdIZWlnaHQucHVzaChuZXdIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHdpZHRoIC8gKGhlaWdodCAvIG1pbkhlaWdodE9uT3ZlcmZsb3cpO1xuICAgICAgICAgICAgICAgICAgICBuZXdOZXdXaWR0aC5wdXNoKG5ld1dpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZWZ0T3ZlcmZsb3cgfHwgcmlnaHRPdmVyZmxvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3V2lkdGggPSBtaW5XaWR0aE9uT3ZlcmZsb3c7XG4gICAgICAgICAgICAgICAgICAgIG5ld05ld1dpZHRoLnB1c2gobmV3V2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgLyAod2lkdGggLyBtaW5XaWR0aE9uT3ZlcmZsb3cpO1xuICAgICAgICAgICAgICAgICAgICBuZXdOZXdIZWlnaHQucHVzaChuZXdIZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV3TmV3V2lkdGgubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5taW4oLi4ubmV3TmV3V2lkdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV3TmV3SGVpZ2h0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBNYXRoLm1pbiguLi5uZXdOZXdIZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcE92ZXJmbG93IHx8IGJvdHRvbU92ZXJmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IG1pbkhlaWdodE9uT3ZlcmZsb3c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0T3ZlcmZsb3cgfHwgcmlnaHRPdmVyZmxvdykge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IG1pbldpZHRoT25PdmVyZmxvdztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERvIG5vdCBvdmVyZmxvdyB0aGUgY29udGFpbmVyXG4gICAgICAgICAgICBpZiAocm91bmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihyb290UmVjdC53aWR0aCwgcm9vdFJlY3QuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAobmV3V2lkdGggPiBtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3V2lkdGggPSBuZXdIZWlnaHQgPSBtaW47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdIZWlnaHQgPiBtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3V2lkdGggPSBuZXdIZWlnaHQgPSBtaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZWVwQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3V2lkdGggPiByb290UmVjdC53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHJvb3RSZWN0LndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgLyAod2lkdGggLyByb290UmVjdC53aWR0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdIZWlnaHQgPiByb290UmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3V2lkdGggPSB3aWR0aCAvIChoZWlnaHQgLyByb290UmVjdC5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSByb290UmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3V2lkdGggPiByb290UmVjdC53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHJvb3RSZWN0LndpZHRoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3SGVpZ2h0ID4gcm9vdFJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHJvb3RSZWN0LmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gcm91bmQgdmFsdWVzXG4gICAgICAgICAgICBuZXdXaWR0aCA9IE1hdGgucm91bmQobmV3V2lkdGgpO1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChuZXdIZWlnaHQpO1xuXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFdpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50SGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBsaWZ0ZWQgdGhlaXIgcG9pbnRlci4gKi9cbiAgICBwcml2YXRlIF9wb2ludGVyVXAgPSAoZXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVHbG9iYWxFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuX2Nyb3BwZXIuX3ByaW1hcnlBcmVhV2lkdGggPSB0aGlzLl9jcm9wcGVyLmNvbmZpZy53aWR0aCA9IHRoaXMuX2N1cnJlbnRXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2Nyb3BwZXIuX3ByaW1hcnlBcmVhSGVpZ2h0ID0gdGhpcy5fY3JvcHBlci5jb25maWcuaGVpZ2h0ID0gdGhpcy5fY3VycmVudEhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuX2Nyb3BwZXIuY29uZmlnID0gdGhpcy5fY3JvcHBlci5jb25maWc7XG4gICAgICAgICAgICB0aGlzLl9jcm9wcGVyLl91cGRhdGVNaW5TY2FsZSgpO1xuICAgICAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9zdGFydFBvaW50ZXJFdmVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBoYXMgbG9zdCBmb2N1cy4gKi9cbiAgICBwcml2YXRlIF93aW5kb3dCbHVyID0gKCkgPT4ge1xuICAgICAgICAvLyBJZiB0aGUgd2luZG93IGlzIGJsdXJyZWQgd2hpbGUgZHJhZ2dpbmcgd2UgbmVlZCB0byBzdG9wIGRyYWdnaW5nIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGJyb3dzZXIgd29uJ3QgZGlzcGF0Y2ggdGhlIGBtb3VzZXVwYCBhbmQgYHRvdWNoZW5kYCBldmVudHMgYW55bW9yZS5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJVcCh0aGlzLl9sYXN0UG9pbnRlckV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2JpbmRHbG9iYWxFdmVudHModHJpZ2dlckV2ZW50OiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGlzVG91Y2ggPSBpc1RvdWNoRXZlbnQodHJpZ2dlckV2ZW50KTtcbiAgICAgICAgY29uc3QgbW92ZUV2ZW50TmFtZSA9IGlzVG91Y2ggPyBcInRvdWNobW92ZVwiIDogXCJtb3VzZW1vdmVcIjtcbiAgICAgICAgY29uc3QgZW5kRXZlbnROYW1lID0gaXNUb3VjaCA/IFwidG91Y2hlbmRcIiA6IFwibW91c2V1cFwiO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobW92ZUV2ZW50TmFtZSwgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudE5hbWUsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTtcblxuICAgICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hjYW5jZWxcIiwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93KSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy5fd2luZG93Qmx1cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmVtb3ZlcyBhbnkgZ2xvYmFsIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlIG1heSBoYXZlIGFkZGVkLiAqL1xuICAgIHByaXZhdGUgX3JlbW92ZUdsb2JhbEV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50O1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hjYW5jZWxcIiwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdykge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuX3dpbmRvd0JsdXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UgKi9cbiAgICBwcml2YXRlIF9nZXRXaW5kb3coKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB9XG59XG4iLCI8IS0tIChzZWxlY3RzdGFydCk6IE9uIFNhZmFyaSBzdGFydGluZyB0byBzbGlkZSB0ZW1wb3JhcmlseSB0cmlnZ2VycyB0ZXh0IHNlbGVjdGlvbiBtb2RlIHdoaWNoXG5zaG93IHRoZSB3cm9uZyBjdXJzb3IuIFdlIHByZXZlbnQgaXQgYnkgc3RvcHBpbmcgdGhlIGBzZWxlY3RzdGFydGAgZXZlbnQuIC0tPlxuPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiICNfaW1nQ29udGFpbmVyXG4gICAgIChzZWxlY3RzdGFydCk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4+XG4gICAgPGNhbnZhcyAjX2ltZ0NhbnZhcz48L2NhbnZhcz5cbjwvZGl2PlxuPG5pY2UtY3JvcHBlci1hcmVhXG4gICAgI19hcmVhXG4gICAgKm5nSWY9XCJfaXNMb2FkZWRJbWdcIlxuICAgIFtyb3VuZF09XCIhIWNvbmZpZy5yb3VuZFwiXG4gICAgW3Jlc2l6YWJsZUFyZWFdPVwiISFjb25maWcucmVzaXphYmxlQXJlYVwiXG4gICAgW2tlZXBBc3BlY3RSYXRpb109XCIhIWNvbmZpZy5rZWVwQXNwZWN0UmF0aW9cIlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgd2lkdGg6IGNvbmZpZy53aWR0aCArICdweCcsXG4gICAgICAgIGhlaWdodDogY29uZmlnLmhlaWdodCArICdweCdcbiAgICB9XCJcbj48L25pY2UtY3JvcHBlci1hcmVhPlxuPGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIl9pc0xvYWRlZEltZ1wiIChjbGljayk9XCJjbGVhbigpXCI+XG4gICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPlxuPC9idXR0b24+XG4iLCI8ZGl2IGNsYXNzPVwicmVzaXplclwiICNyZXNpemVyICpuZ0lmPVwicmVzaXphYmxlQXJlYVwiPjwvZGl2PlxuIl19
|
|
1269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uaWNlLXVpLWtpdC12Mi9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2UtY3JvcHBlci9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ltYWdlLWNyb3BwZXIudGVtcGxhdGUuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ltYWdlLWNyb3BwZXItYXJlYS50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFBRSxXQUFXLEVBQ3pCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7O0FBRS9DLE1BQU0sa0JBQWtC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QUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFFRCwrRkFBK0Y7SUFDdkYsVUFBVTtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO0lBQ2hELENBQUM7O3FIQWxTUSx3QkFBd0Isa0JBMkJyQixRQUFRO3lHQTNCWCx3QkFBd0IscVRFN3pDckMsa0VBQ0E7MkZGNHpDYSx3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0ksbUJBQW1CLGlCQUdkLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07OzBCQTZCMUMsTUFBTTsyQkFBQyxRQUFROytIQXpCSCxRQUFRO3NCQUR4QixTQUFTO3VCQUFDLFNBQVM7Z0JBSWIsZUFBZTtzQkFEckIsS0FBSztnQkFLQyxLQUFLO3NCQUZYLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsYUFBYTtnQkE4QmYsYUFBYTtzQkFEdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9BLWwteS1sLWUvQWx5bGUtVUkvdHJlZS8xMC41LjMvc3JjL2xpYi9pbWFnZS1jcm9wcGVyXG4gKi9cblxuaW1wb3J0IHsgbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyB9IGZyb20gXCJAYW5ndWxhci9jZGsvcGxhdGZvcm1cIjtcbmltcG9ydCB7IFZpZXdwb3J0UnVsZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgcmVzaXplQ2FudmFzIH0gZnJvbSBcIi4vcmVzaXplLWNhbnZhc1wiO1xuXG5jb25zdCBhY3RpdmVFdmVudE9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbi8qKiBJbWFnZSBDcm9wcGVyIENvbmZpZyAqL1xuZXhwb3J0IGNsYXNzIEltZ0Nyb3BwZXJDb25maWcge1xuICAgIC8qKiBDcm9wcGVyIGFyZWEgd2lkdGggKi9cbiAgICB3aWR0aCA9IDI1MDtcbiAgICAvKiogQ3JvcHBlciBhcmVhIGhlaWdodCAqL1xuICAgIGhlaWdodCA9IDIwMDtcbiAgICBtaW5XaWR0aCA9IDQwO1xuICAgIG1pbkhlaWdodCA9IDQwO1xuICAgIC8qKiBJZiB0aGlzIGlzIG5vdCBkZWZpbmVkLCB0aGUgbmV3IGltYWdlIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWZpbmVkLiAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqIEJhY2tncm91bmQgY29sb3IoIGRlZmF1bHQ6IG51bGwpLCBpZiBpcyBudWxsIGluIHBuZyBpcyB0cmFuc3BhcmVudCBidXQgbm90IGluIGpwZy4gKi9cbiAgICBmaWxsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZXQgYW50aS1hbGlhc2VkIChkZWZhdWx0OiB0cnVlKVxuICAgICAqIEBkZXByZWNhdGVkIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhcyB0aGUgY3JvcHBlciB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzaXplIHRoZSBpbWFnZVxuICAgICAqIHRvIHRoZSBiZXN0IHF1YWxpdHlcbiAgICAgKi9cbiAgICBhbnRpQWxpYXNlZCA9IHRydWU7XG4gICAgYXV0b0Nyb3A/OiBib29sZWFuO1xuICAgIG91dHB1dD86IEltZ091dHB1dCB8IEltZ1Jlc29sdXRpb24gPSBJbWdSZXNvbHV0aW9uLkRlZmF1bHQ7XG4gICAgLyoqXG4gICAgICogWm9vbSBvdXQgdW50aWwgdGhlIGVudGlyZSBpbWFnZSBmaXRzIGludG8gdGhlIGNyb3BwaW5nIGFyZWEuXG4gICAgICogZGVmYXVsdDogZmFsc2VcbiAgICAgKi9cbiAgICBleHRyYVpvb21PdXQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEVtaXQgZXZlbnQgYGVycm9yYCBpZiB0aGUgZmlsZSBzaXplIGluIGJ5dGVzIGZvciB0aGUgbGltaXQuXG4gICAgICogTm90ZTogSXQgb25seSB3b3JrcyB3aGVuIHRoZSBpbWFnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBgPGlucHV0PmAgZXZlbnQuXG4gICAgICovXG4gICAgbWF4RmlsZVNpemU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNyb3BwZXIgYXJlYSB3aWxsIGJlIHJvdW5kLlxuICAgICAqIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBjcm9wcGVyIGFyZWEgd2lsbCBtYWludGFpbiBpdHMgYXNwZWN0IHJhdGlvLlxuICAgICAqIGRlZmF1bHQ6IGZhbHNlXG4gICAgICovXG4gICAgcm91bmQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNyb3BwZXIgYXJlYSBpcyByZXNpemFibGUuXG4gICAgICogZGVmYXVsdDogZmFsc2VcbiAgICAgKi9cbiAgICByZXNpemFibGVBcmVhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBLZWVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBncm93aW5nIGFyZWEgdGhlIHNhbWUgYWNjb3JkaW5nXG4gICAgICogdG8gYEltZ0Nyb3BwZXJDb25maWcud2lkdGhgIGFuZCBgSW1nQ3JvcHBlckNvbmZpZy5oZWlnaHRgXG4gICAgICogZGVmYXVsdDogZmFsc2VcbiAgICAgKi9cbiAgICBrZWVwQXNwZWN0UmF0aW8/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNyb3BwZXIgYXJlYSBpcyByZXNwb25zaXZlLlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjcm9wcGVyIGFyZWEgaXMgZml4ZWQsXG4gICAgICogc28gY2FuIHVzZSB3aGVuIHRoZSBjcm9wcGVyIGFyZWEgaXMgbGFyZ2VyIHRoYW4gaXRzIGNvbnRhaW5lcixcbiAgICAgKiBvdGhlcndpc2UgdGhpcyB3aWxsIGJyaW5nIHByb2JsZW1zIHdoZW4gY3JvcHBpbmcuXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZUFyZWE/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBvdXRwdXQgaW1hZ2VcbiAqIFdpdGggdGhpcyBvcHRpb24geW91IGNhbiByZXNpemUgdGhlIG91dHB1dCBpbWFnZS5cbiAqIElmIGB3aWR0aGAgb3IgYGhlaWdodGAgYXJlIDAsIHRoaXMgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseS5cbiAqIEJvdGggY2Fubm90IGJlIDAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1nT3V0cHV0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY3JvcHBlZCBpbWFnZSB3aWxsIGJlIHJlc2l6ZWQgdG8gdGhpcyBgd2lkdGhgLlxuICAgICAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ3JvcHBlZCBpbWFnZSB3aWxsIGJlIHJlc2l6ZWQgdG8gdGhpcyBgaGVpZ2h0YC5cbiAgICAgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIEltYWdlIG91dHB1dCAqL1xuZXhwb3J0IGVudW0gSW1nUmVzb2x1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBpbWFnZSB3aWxsIGJlIGVxdWFsIHRvIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGNyb3BwZXIgYXJlYS5cbiAgICAgKi9cbiAgICBEZWZhdWx0LFxuICAgIC8qKiBKdXN0IGNyb3AgdGhlIGltYWdlIHdpdGhvdXQgcmVzaXppbmcgKi9cbiAgICBPcmlnaW5hbEltYWdlXG59XG5cbi8qKiBJbWFnZSBvdXRwdXQgKi9cbmV4cG9ydCBlbnVtIEltZ0Nyb3BwZXJFcnJvciB7XG4gICAgLyoqIFRoZSBsb2FkZWQgaW1hZ2UgZXhjZWVkcyB0aGUgc2l6ZSBsaW1pdCBzZXQuICovXG4gICAgU2l6ZSxcbiAgICAvKiogVGhlIGZpbGUgbG9hZGVkIGlzIG5vdCBpbWFnZS4gKi9cbiAgICBUeXBlLFxuICAgIC8qKiBXaGVuIHRoZSBpbWFnZSBoYXMgbm90IGJlZW4gbG9hZGVkLiAqL1xuICAgIE90aGVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1nQ3JvcHBlckV2ZW50IHtcbiAgICAvKiogQ3JvcHBlZCBpbWFnZSBkYXRhIFVSTCAqL1xuICAgIGRhdGFVUkw/OiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRmlsZXR5cGUgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKiBDcm9wcGVkIGFyZWEgd2lkdGggKi9cbiAgICBhcmVhV2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3JvcHBlZCBhcmVhIGhlaWdodCAqL1xuICAgIGFyZWFIZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogQ3JvcHBlZCBpbWFnZSB3aWR0aCAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIENyb3BwZWQgaW1hZ2UgaGVpZ2h0ICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqIE9yaWdpbmFsIEltYWdlIGRhdGEgVVJMICovXG4gICAgb3JpZ2luYWxEYXRhVVJMPzogc3RyaW5nO1xuICAgIHNjYWxlOiBudW1iZXI7XG4gICAgLyoqIEN1cnJlbnQgcm90YXRpb24gaW4gZGVncmVlcyAqL1xuICAgIHJvdGF0aW9uOiBudW1iZXI7XG4gICAgLyoqIFNpemUgb2YgdGhlIGltYWdlIGluIGJ5dGVzICovXG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8qKiBTY2FsZWQgb2Zmc2V0IGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW1hZ2UgKi9cbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgLyoqIFNjYWxlZCBvZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGltYWdlICovXG4gICAgdG9wOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU2NhbGVkIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGltYWdlIHRvIGNlbnRlciBvZiBhcmVhXG4gICAgICogQ2FuIGJlIHVzZWQgdG8gc2V0IGltYWdlIHBvc2l0aW9uXG4gICAgICovXG4gICAgeE9yaWdpbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNjYWxlZCBvZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGltYWdlIHRvIGNlbnRlciBvZiBhcmVhXG4gICAgICogQ2FuIGJlIHVzZWQgdG8gc2V0IGltYWdlIHBvc2l0aW9uXG4gICAgICovXG4gICAgeU9yaWdpbjogbnVtYmVyO1xuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHhPcmlnaW4gJiB5T3JpZ2luYCBpbnN0ZWFkLiAqL1xuICAgIHBvc2l0aW9uPzoge1xuICAgICAgICB4OiBudW1iZXJcbiAgICAgICAgeTogbnVtYmVyXG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWdDcm9wcGVyRXJyb3JFdmVudCB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKiogU2l6ZSBvZiB0aGUgaW1hZ2UgaW4gYnl0ZXMgKi9cbiAgICBzaXplOiBudW1iZXI7XG4gICAgLyoqIEZpbGV0eXBlICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKiBUeXBlIG9mIGVycm9yICovXG4gICAgZXJyb3I6IEltZ0Nyb3BwZXJFcnJvcjtcbiAgICBlcnJvck1zZz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEltZ1JlY3Qge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgeGM6IG51bWJlcjtcbiAgICB5YzogbnVtYmVyO1xuICAgIC8qKiB0cmFuc2Zvcm0gd2l0aCAqL1xuICAgIHd0OiBudW1iZXI7XG4gICAgaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWdDcm9wcGVyTG9hZGVyQ29uZmlnIHtcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRmlsZXR5cGUgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKiBDcm9wcGVkIGFyZWEgd2lkdGggKi9cbiAgICBhcmVhV2lkdGg/OiBudW1iZXI7XG4gICAgLyoqIENyb3BwZWQgYXJlYSBoZWlnaHQgKi9cbiAgICBhcmVhSGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBDcm9wcGVkIGltYWdlIHdpZHRoICovXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgLyoqIENyb3BwZWQgaW1hZ2UgaGVpZ2h0ICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBPcmlnaW5hbCBJbWFnZSBkYXRhIFVSTCAqL1xuICAgIG9yaWdpbmFsRGF0YVVSTDogc3RyaW5nO1xuICAgIHNjYWxlPzogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IHJvdGF0aW9uIGluIGRlZ3JlZXMgKi9cbiAgICByb3RhdGlvbj86IG51bWJlcjtcbiAgICAvKiogU2l6ZSBvZiB0aGUgaW1hZ2UgaW4gYnl0ZXMgKi9cbiAgICBzaXplPzogbnVtYmVyO1xuICAgIC8qKiBPZmZzZXQgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBpbWFnZSB0byBjZW50ZXIgb2YgYXJlYSAqL1xuICAgIHhPcmlnaW4/OiBudW1iZXI7XG4gICAgLyoqIE9mZnNldCBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGUgaW1hZ2UgdG8gY2VudGVyIG9mIGFyZWEgKi9cbiAgICB5T3JpZ2luPzogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogXCJuaWNlLWltZy1jcm9wcGVyLCBuaWNlLWltYWdlLWNyb3BwZXJcIixcbiAgICB0ZW1wbGF0ZVVybDogXCJpbWFnZS1jcm9wcGVyLnRlbXBsYXRlLmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcImltYWdlLWNyb3BwZXIuc3R5bGUuc2Nzc1wiXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE5pY2VJbWFnZUNyb3BwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIHJlYWRvbmx5INC4ID0gXCJOaWNlSW1hZ2VDcm9wcGVyXCI7XG5cbiAgICBwcml2YXRlIF9jdXJyZW50TG9hZENvbmZpZz86IEltZ0Nyb3BwZXJMb2FkZXJDb25maWc7XG5cbiAgICAvKiogT3JpZ2luYWwgaW1hZ2UgKi9cbiAgICBwcml2YXRlIF9pbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBvZmZzZXQ/OiB7XG4gICAgICAgIHg6IG51bWJlclxuICAgICAgICB5OiBudW1iZXJcbiAgICAgICAgbGVmdDogbnVtYmVyXG4gICAgICAgIHRvcDogbnVtYmVyXG4gICAgfTtcbiAgICBwcml2YXRlIF9zY2FsZT86IG51bWJlcjtcbiAgICBwcml2YXRlIF9zY2FsM0ZpeD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9taW5TY2FsZT86IG51bWJlcjtcbiAgICBwcml2YXRlIF9tYXhTY2FsZT86IG51bWJlcjtcbiAgICAvKiogSW5pdGlhbCBjb25maWcgKi9cbiAgICBwcml2YXRlIF9jb25maWdQcmltYXJ5OiBJbWdDcm9wcGVyQ29uZmlnO1xuICAgIHByaXZhdGUgX2NvbmZpZzogSW1nQ3JvcHBlckNvbmZpZztcbiAgICBwcml2YXRlIF9pbWdSZWN0OiBJbWdSZWN0ID0ge30gYXMgYW55O1xuICAgIHByaXZhdGUgX3JvdGF0aW9uID0gMDtcbiAgICAvLyBwcml2YXRlIF9zaXplSW5CeXRlczogbnVtYmVyIHwgbnVsbDtcbiAgICBwcml2YXRlIF9pc1NsaWRpbmc6IGJvb2xlYW47XG4gICAgLyoqIEtlZXBzIHRyYWNrIG9mIHRoZSBsYXN0IHBvaW50ZXIgZXZlbnQgdGhhdCB3YXMgY2FwdHVyZWQgYnkgdGhlIGNyb3AgYXJlYS4gKi9cbiAgICBwcml2YXRlIF9sYXN0UG9pbnRlckV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSBfc3RhcnRQb2ludGVyRXZlbnQ6IHtcbiAgICAgICAgeDogbnVtYmVyXG4gICAgICAgIHk6IG51bWJlclxuICAgIH0gfCBudWxsO1xuICAgIHB1YmxpYyBfcHJpbWFyeUFyZWFXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBfcHJpbWFyeUFyZWFIZWlnaHQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBfYWJzb2x1dGVTY2FsZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiBpcyBsb2FkZWQgaW1hZ2VcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX2lzTG9hZGVkSW1nOiBib29sZWFuO1xuXG4gICAgLyoqIFdoZW4gaXMgbG9hZGVkIGltYWdlICYgcmVhZHkgZm9yIGNyb3AgKi9cbiAgICBwdWJsaWMgaXNMb2FkZWQ6IGJvb2xlYW47XG4gICAgLyoqIFdoZW4gdGhlIGNyb3BwZXIgaXMgcmVhZHkgdG8gYmUgaW50ZXJhY3RlZCAgKi9cbiAgICBwdWJsaWMgaXNSZWFkeTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaXNDcm9wcGVkOiBib29sZWFuO1xuXG4gICAgQFZpZXdDaGlsZChcIl9pbWdDb250YWluZXJcIiwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIF9pbWdDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKFwiX2FyZWFcIiwgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBfYXJlYVJlZjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKFwiX2ltZ0NhbnZhc1wiLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgX2ltZ0NhbnZhczogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgY29uZmlnKHZhbDogSW1nQ3JvcHBlckNvbmZpZykge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBtZXJnZURlZXAoe30sIG5ldyBJbWdDcm9wcGVyQ29uZmlnKCksIHZhbCk7XG4gICAgICAgIHRoaXMuX2NvbmZpZ1ByaW1hcnkgPSBtZXJnZURlZXAoe30sIHRoaXMuX2NvbmZpZyk7XG4gICAgICAgIHRoaXMuX3ByaW1hcnlBcmVhV2lkdGggPSB0aGlzLmNvbmZpZy53aWR0aDtcbiAgICAgICAgdGhpcy5fcHJpbWFyeUFyZWFIZWlnaHQgPSB0aGlzLmNvbmZpZy5oZWlnaHQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5yb3VuZFxuICAgICAgICAgICAgJiYgdGhpcy5jb25maWcud2lkdGggIT09IHRoaXMuY29uZmlnLmhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtOaWNlSW1hZ2VDcm9wcGVyQ29tcG9uZW50LtC4fTogQm90aCB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgZXF1YWwgd2hlbiB1c2luZyBcXGBJbWdDcm9wcGVyQ29uZmlnLnJvdW5kID0gdHJ1ZVxcYGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5fY29uZmlnLm1heEZpbGVTaXplO1xuICAgICAgICBpZiAobWF4RmlsZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMubWF4RmlsZVNpemUgPSBtYXhGaWxlU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBJbWdDcm9wcGVyQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgLyoqIFNldCBzY2FsZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzY2FsZSh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNldFNjYWxlKHZhbCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgc2NhbGUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgZXZlbnQgYGVycm9yYCBpZiB0aGUgZmlsZSBzaXplIGZvciB0aGUgbGltaXQuXG4gICAgICogTm90ZTogSXQgb25seSB3b3JrcyB3aGVuIHRoZSBpbWFnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBgPGlucHV0PmAgZXZlbnQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4RmlsZVNpemU6IG51bWJlcjtcblxuICAgIC8qKiBHZXQgbWluIHNjYWxlICovXG4gICAgcHVibGljIGdldCBtaW5TY2FsZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluU2NhbGU7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqIEVtaXRzIG1pbmltdW0gc3VwcG9ydGVkIGltYWdlIHNjYWxlICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1yZW5hbWVcbiAgICBAT3V0cHV0KFwibWluU2NhbGVcIilcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1pblNjYWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKiogRW1pdHMgbWF4aW11bSBzdXBwb3J0ZWQgaW1hZ2Ugc2NhbGUgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LXJlbmFtZVxuICAgIEBPdXRwdXQoXCJtYXhTY2FsZVwiKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4U2NhbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSBpbWFnZSBpcyBsb2FkZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltYWdlTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJbWdDcm9wcGVyRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgY3JvcHBlciBpcyByZWFkeSB0byBiZSBpbnRlcmFjdGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1nQ3JvcHBlckV2ZW50PigpO1xuXG4gICAgLyoqIE9uIGNyb3AgbmV3IGltYWdlICovXG4gICAgQE91dHB1dCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcm9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJbWdDcm9wcGVyRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgY3JvcHBlciBpcyBjbGVhbmVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGVhbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXQgYW4gZXJyb3Igd2hlbiB0aGUgbG9hZGVkIGltYWdlIGlzIG5vdCB2YWxpZCAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICAgIEBPdXRwdXQoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPEltZ0Nyb3BwZXJFcnJvckV2ZW50PigpO1xuXG4gICAgcHJpdmF0ZSBfY3VycmVudElucHV0RWxlbWVudD86IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICAvKiogRW1pdHMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogVXNlZCB0byBzdWJzY3JpYmUgdG8gZ2xvYmFsIG1vdmUgYW5kIGVuZCBldmVudHMgKi9cbiAgICBwcm90ZWN0ZWQgX2RvY3VtZW50OiBEb2N1bWVudDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgX2RvY3VtZW50OiBhbnksXG4gICAgICAgIHZpZXdQb3J0UnVsZXI6IFZpZXdwb3J0UnVsZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7XG4gICAgICAgIHZpZXdQb3J0UnVsZXIuY2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMudXBkYXRlQ3JvcHBlclBvc2l0aW9uKCkpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9pbWdDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kuY29tcGxldGUoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2ltZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsRXZlbnRzKCk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKiogTG9hZCBpbWFnZSB3aXRoIGNhbnZhcyAqL1xuICAgIHByaXZhdGUgX2ltZ0xvYWRlZChpbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChpbWdFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pbWcgPSBpbWdFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWdFbGVtZW50LndpZHRoO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZ0VsZW1lbnQuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgaW1nRWxlbWVudC53aWR0aCwgaW1nRWxlbWVudC5oZWlnaHQpO1xuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWdFbGVtZW50LCAwLCAwKTtcblxuICAgICAgICAgICAgLyoqIHNldCBtaW4gc2NhbGUgKi9cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1pblNjYWxlKGNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhTY2FsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0U3R5bGVzRm9yQ29udEltZyh2YWx1ZXM6IHsgeD86IG51bWJlciwgeT86IG51bWJlciB9KSB7XG4gICAgICAgIGNvbnN0IG5ld1N0eWxlcyA9IHsgfSBhcyBhbnk7XG4gICAgICAgIGlmICh2YWx1ZXMueCAhPSBudWxsICYmIHZhbHVlcy55ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5fcm9vdFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHggPSByb290UmVjdC53aWR0aCAvIDIgLSAodmFsdWVzLngpO1xuICAgICAgICAgICAgY29uc3QgeSA9IHJvb3RSZWN0LmhlaWdodCAvIDIgLSAodmFsdWVzLnkpO1xuXG4gICAgICAgICAgICB0aGlzLl9pbWdSZWN0LnggPSAodmFsdWVzLngpO1xuICAgICAgICAgICAgdGhpcy5faW1nUmVjdC55ID0gKHZhbHVlcy55KTtcbiAgICAgICAgICAgIHRoaXMuX2ltZ1JlY3QueGMgPSAoeCk7XG4gICAgICAgICAgICB0aGlzLl9pbWdSZWN0LnljID0gKHkpO1xuXG4gICAgICAgIH1cbiAgICAgICAgbmV3U3R5bGVzLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgkeyh0aGlzLl9pbWdSZWN0LngpfXB4LCR7KHRoaXMuX2ltZ1JlY3QueSl9cHgsIDApYDtcbiAgICAgICAgbmV3U3R5bGVzLnRyYW5zZm9ybSArPSBgc2NhbGUoJHt0aGlzLl9zY2FsM0ZpeH0pYDtcbiAgICAgICAgbmV3U3R5bGVzLnRyYW5zZm9ybU9yaWdpbiA9IGAke3RoaXMuX2ltZ1JlY3QueGN9cHggJHt0aGlzLl9pbWdSZWN0LnljfXB4IDBgO1xuICAgICAgICBuZXdTdHlsZXNbXCItd2Via2l0LXRyYW5zZm9ybVwiXSA9IG5ld1N0eWxlcy50cmFuc2Zvcm07XG4gICAgICAgIG5ld1N0eWxlc1tcIi13ZWJraXQtdHJhbnNmb3JtLW9yaWdpblwiXSA9IG5ld1N0eWxlcy50cmFuc2Zvcm1PcmlnaW47XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1N0eWxlcykge1xuICAgICAgICAgICAgaWYgKG5ld1N0eWxlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhpcy5faW1nQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIGtleSwgbmV3U3R5bGVzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhcmVhIGFuZCBpbWFnZSBwb3NpdGlvbiBvbmx5IGlmIG5lZWRlZCxcbiAgICAgKiB0aGlzIGlzIHVzZWQgd2hlbiB3aW5kb3cgcmVzaXplXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNyb3BwZXJQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFyZWFJZk5lZWRlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIExvYWQgSW1hZ2UgZnJvbSBpbnB1dCBldmVudCAqL1xuICAgIHB1YmxpYyBzZWxlY3RJbnB1dEV2ZW50KGltZzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudElucHV0RWxlbWVudCA9IGltZy50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgX2ltZyA9IGltZy50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgaWYgKF9pbWcuZmlsZXMgJiYgX2ltZy5maWxlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlU2l6ZSA9IF9pbWcuZmlsZXNbMF0uc2l6ZTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBfaW1nLnZhbHVlLnJlcGxhY2UoLy4qKFxcL3xcXFxcKS8sIFwiXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLm1heEZpbGVTaXplICYmIGZpbGVTaXplID4gdGhpcy5tYXhGaWxlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgY3JvcEV2ZW50OiBJbWdDcm9wcGVyRXJyb3JFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBfaW1nLmZpbGVzWzBdLnR5cGUsXG4gICAgICAgICAgICAgICAgc2l6ZTogZmlsZVNpemUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IEltZ0Nyb3BwZXJFcnJvci5TaXplXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGNyb3BFdmVudCBhcyBJbWdDcm9wcGVyRXJyb3JFdmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBuZXcgT2JzZXJ2YWJsZTxQcm9ncmVzc0V2ZW50PihvYnNlcnZlciA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyID0+IG9ic2VydmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZWFkZXIub25hYm9ydCA9IGVyciA9PiBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChldikgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChldik7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChfaW1nLmZpbGVzWzBdKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKGxvYWRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGFVUkwgPSAobG9hZEV2ZW50LnRhcmdldCBhcyBGaWxlUmVhZGVyKS5yZXN1bHQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZEltYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogX2ltZy5maWxlc1swXS5zaXplLCAvLyBzaXplIGluIGJ5dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNvbmZpZy50eXBlIHx8IF9pbWcuZmlsZXNbMF0udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRGF0YVVSTFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcm9wRXZlbnQ6IEltZ0Nyb3BwZXJFcnJvckV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBJbWdDcm9wcGVyRXJyb3IuT3RoZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1zZzogXCJUaGUgRmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogX2ltZy5maWxlc1swXS50eXBlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGNyb3BFdmVudCBhcyBJbWdDcm9wcGVyRXJyb3JFdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgIH1cblxuICAgIC8qKiBTZXQgdGhlIHNpemUgb2YgdGhlIGltYWdlLCB0aGUgdmFsdWVzIGNhbiBiZSAwIGJldHdlZW4gMSwgd2hlcmUgMSBpcyB0aGUgb3JpZ2luYWwgc2l6ZSAqL1xuICAgIHB1YmxpYyBzZXRTY2FsZShzaXplPzogbnVtYmVyLCBub0F1dG9Dcm9wPzogYm9vbGVhbikge1xuICAgICAgICAvLyBmaXggbWluIHNjYWxlXG4gICAgICAgIGNvbnN0IG5ld1NpemUgPSBzaXplID49IHRoaXMubWluU2NhbGUgJiYgc2l6ZSA8PSAxID8gc2l6ZSA6IHRoaXMubWluU2NhbGU7XG5cbiAgICAgICAgLy8gY2hlY2tcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHNpemUgIT0gbnVsbCAmJiBzaXplICE9PSB0aGlzLnNjYWxlICYmIG5ld1NpemUgIT09IHRoaXMuc2NhbGU7XG4gICAgICAgIHRoaXMuX3NjYWxlID0gc2l6ZTtcbiAgICAgICAgaWYgKCFjaGFuZ2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2NhbDNGaXggPSBuZXdTaXplO1xuICAgICAgICB0aGlzLl91cGRhdGVBYnNvbHV0ZVNjYWxlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpblBvc2l0aW9uID0gey4uLnRoaXMuX2ltZ1JlY3R9O1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiBvcmlnaW5Qb3NpdGlvbi54LFxuICAgICAgICAgICAgICAgICAgICB5OiBvcmlnaW5Qb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBvcmlnaW5Qb3NpdGlvbi54YyxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBvcmlnaW5Qb3NpdGlvbi55Y1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0U3R5bGVzRm9yQ29udEltZyh7fSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2ltdWxhdGVQb2ludGVyTW92ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5taW5TY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0U3R5bGVzRm9yQ29udEltZyh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZ2V0Q2VudGVyUG9pbnRzKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2FsZUNoYW5nZS5lbWl0KHNpemUpO1xuICAgICAgICBpZiAoIW5vQXV0b0Nyb3ApIHtcbiAgICAgICAgICAgIHRoaXMuX2Nyb3BJZkF1dG9Dcm9wKCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENlbnRlclBvaW50cygpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaW1nID0gdGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHggPSAocm9vdC5vZmZzZXRXaWR0aCAtIChpbWcud2lkdGgpKSAvIDI7XG4gICAgICAgIGNvbnN0IHkgPSAocm9vdC5vZmZzZXRIZWlnaHQgLSAoaW1nLmhlaWdodCkpIC8gMjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRml0IHRvIHNjcmVlblxuICAgICAqL1xuICAgIHB1YmxpYyBmaXRUb1NjcmVlbigpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBtaW4gPSB7XG4gICAgICAgICAgICB3aWR0aDogY29udGFpbmVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXIub2Zmc2V0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5faW1nO1xuICAgICAgICBjb25zdCBtaW5TY2FsZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBtaW4ud2lkdGggLyB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogbWluLmhlaWdodCAvIGhlaWdodFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNYXRoLm1heChtaW5TY2FsZS53aWR0aCwgbWluU2NhbGUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5zZXRTY2FsZShyZXN1bHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0U2NhbGUodGhpcy5taW5TY2FsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcG9pbnRlckRvd24gPSAoZXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZVxuICAgICAgICAvLyB1c2VyIGlzIHVzaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIG1haW4gbW91c2UgYnV0dG9uLlxuICAgICAgICBpZiAodGhpcy5faXNTbGlkaW5nIHx8ICghaXNUb3VjaEV2ZW50KGV2ZW50KSAmJiBldmVudC5idXR0b24gIT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLl9pbWdSZWN0LngsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5faW1nUmVjdC55LFxuICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMuX2ltZ1JlY3QueGMsXG4gICAgICAgICAgICAgICAgdG9wOiB0aGlzLl9pbWdSZWN0LnljXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRQb2ludGVyRXZlbnQgPSBnZXRHZXN0dXJlUG9pbnRGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRHbG9iYWxFdmVudHMoZXZlbnQpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbXVsYXRlIHBvaW50ZXJNb3ZlIHdpdGggY2xpZW50WCA9IDAgYW5kIGNsaWVudFkgPSAwLFxuICAgICAqIHRoaXMgaXMgdXNlZCBieSBgc2V0U2NhbGVgIGFuZCBgcm90YXRlYFxuICAgICAqL1xuICAgIHByaXZhdGUgX3NpbXVsYXRlUG9pbnRlck1vdmUoKSB7XG4gICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9pbnRlckV2ZW50ID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcG9pbnRlck1vdmUoe1xuICAgICAgICAgICAgY2xpZW50WDogMCxcbiAgICAgICAgICAgIGNsaWVudFk6IDAsXG4gICAgICAgICAgICB0eXBlOiBcIm5cIixcbiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7fVxuICAgICAgICB9IGFzIE1vdXNlRXZlbnQpO1xuICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhcnRQb2ludGVyRXZlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBfbWFya0ZvckNoZWNrKCkge1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBtb3ZlZCB0aGVpciBwb2ludGVyIGFmdGVyXG4gICAgICogc3RhcnRpbmcgdG8gZHJhZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9wb2ludGVyTW92ZSA9IChldmVudDogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RQb2ludGVyRXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIGxldCB4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgeTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBzY2FsZUZpeCA9IHRoaXMuX3NjYWwzRml4O1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICAgICAgICBjb25zdCBzdGFydFAgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gZ2V0R2VzdHVyZVBvaW50RnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IHBvaW50LnggLSB0aGlzLl9zdGFydFBvaW50ZXJFdmVudC54O1xuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gcG9pbnQueSAtIHRoaXMuX3N0YXJ0UG9pbnRlckV2ZW50Lnk7XG4gICAgICAgICAgICBpZiAoIXNjYWxlRml4IHx8ICFzdGFydFApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzTWluU2NhbGVZID0gY2FudmFzLmhlaWdodCAqIHNjYWxlRml4IDwgY29uZmlnLmhlaWdodCAmJiBjb25maWcuZXh0cmFab29tT3V0O1xuICAgICAgICAgICAgY29uc3QgaXNNaW5TY2FsZVggPSBjYW52YXMud2lkdGggKiBzY2FsZUZpeCA8IGNvbmZpZy53aWR0aCAmJiBjb25maWcuZXh0cmFab29tT3V0O1xuXG4gICAgICAgICAgICBjb25zdCBsaW1pdExlZnQgPSAoY29uZmlnLndpZHRoIC8gMiAvIHNjYWxlRml4KSA+PSBzdGFydFAubGVmdCAtIChkZWx0YVggLyBzY2FsZUZpeCk7XG4gICAgICAgICAgICBjb25zdCBsaW1pdFJpZ2h0ID0gKGNvbmZpZy53aWR0aCAvIDIgLyBzY2FsZUZpeCkgK1xuICAgICAgICAgICAgICAgIChjYW52YXMud2lkdGgpIC0gKHN0YXJ0UC5sZWZ0IC0gKGRlbHRhWCAvIHNjYWxlRml4KSkgPD0gY29uZmlnLndpZHRoIC8gc2NhbGVGaXg7XG4gICAgICAgICAgICBjb25zdCBsaW1pdFRvcCA9ICgoY29uZmlnLmhlaWdodCAvIDIgLyBzY2FsZUZpeCkgPj0gKHN0YXJ0UC50b3AgLSAoZGVsdGFZIC8gc2NhbGVGaXgpKSk7XG4gICAgICAgICAgICBjb25zdCBsaW1pdEJvdHRvbSA9IChcbiAgICAgICAgICAgICAgICAoKGNvbmZpZy5oZWlnaHQgLyAyIC8gc2NhbGVGaXgpICsgKGNhbnZhcy5oZWlnaHQpIC0gKHN0YXJ0UC50b3AgLSAoZGVsdGFZIC8gc2NhbGVGaXgpKSkgPD0gKGNvbmZpZy5oZWlnaHQgLyBzY2FsZUZpeClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExpbWl0IGZvciBsZWZ0XG4gICAgICAgICAgICBpZiAoKGxpbWl0TGVmdCAmJiAhaXNNaW5TY2FsZVgpIHx8ICghbGltaXRMZWZ0ICYmIGlzTWluU2NhbGVYKSkge1xuICAgICAgICAgICAgICAgIHggPSBzdGFydFAueCArIChzdGFydFAubGVmdCkgLSAoY29uZmlnLndpZHRoIC8gMiAvIHNjYWxlRml4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTGltaXQgZm9yIHJpZ2h0XG4gICAgICAgICAgICBpZiAoKGxpbWl0UmlnaHQgJiYgIWlzTWluU2NhbGVYKSB8fCAoIWxpbWl0UmlnaHQgJiYgaXNNaW5TY2FsZVgpKSB7XG4gICAgICAgICAgICAgICAgeCA9IHN0YXJ0UC54ICsgKHN0YXJ0UC5sZWZ0KSArIChjb25maWcud2lkdGggLyAyIC8gc2NhbGVGaXgpIC0gY2FudmFzLndpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMaW1pdCBmb3IgdG9wXG4gICAgICAgICAgICBpZiAoKGxpbWl0VG9wICYmICFpc01pblNjYWxlWSkgfHwgKCFsaW1pdFRvcCAmJiBpc01pblNjYWxlWSkpIHtcbiAgICAgICAgICAgICAgICB5ID0gc3RhcnRQLnkgKyAoc3RhcnRQLnRvcCkgLSAoY29uZmlnLmhlaWdodCAvIDIgLyBzY2FsZUZpeCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpbWl0IGZvciBib3R0b21cbiAgICAgICAgICAgIGlmICgobGltaXRCb3R0b20gJiYgIWlzTWluU2NhbGVZKSB8fCAoIWxpbWl0Qm90dG9tICYmIGlzTWluU2NhbGVZKSkge1xuICAgICAgICAgICAgICAgIHkgPSBzdGFydFAueSArIChzdGFydFAudG9wKSArIChjb25maWcuaGVpZ2h0IC8gMiAvIHNjYWxlRml4KSAtIGNhbnZhcy5oZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gcHJlc3Mgc2hpZnRLZXksIGRlcHJlY2F0ZWRcbiAgICAgICAgICAgIC8vIGlmIChldmVudC5zcmNFdmVudCAmJiBldmVudC5zcmNFdmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgLy8gICBpZiAoTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA9PT0gTWF0aC5tYXgoTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSwgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSkpIHtcbiAgICAgICAgICAgIC8vICAgICB5ID0gdGhpcy5vZmZzZXQudG9wO1xuICAgICAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHggPSB0aGlzLm9mZnNldC5sZWZ0O1xuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmICh4ID09PSB2b2lkIDApIHsgeCA9IChkZWx0YVggLyBzY2FsZUZpeCkgKyAoc3RhcnRQLngpOyB9XG4gICAgICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSAoZGVsdGFZIC8gc2NhbGVGaXgpICsgKHN0YXJ0UC55KTsgfVxuICAgICAgICAgICAgdGhpcy5fc2V0U3R5bGVzRm9yQ29udEltZyh7XG4gICAgICAgICAgICAgICAgeCwgeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlUG9zaXRpb24oKTogdm9pZDtcbiAgICBwdWJsaWMgdXBkYXRlUG9zaXRpb24oeE9yaWdpbjogbnVtYmVyLCB5T3JpZ2luOiBudW1iZXIpOiB2b2lkO1xuICAgIHB1YmxpYyB1cGRhdGVQb3NpdGlvbih4T3JpZ2luPzogbnVtYmVyLCB5T3JpZ2luPzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5fcm9vdFJlY3QoKTtcbiAgICAgICAgY29uc3QgYXJlYVJlY3QgPSB0aGlzLl9hcmVhQ3JvcHBlclJlY3QoKTtcbiAgICAgICAgY29uc3QgYXJlYVdpZHRoID0gYXJlYVJlY3Qud2lkdGggPiBob3N0UmVjdC53aWR0aFxuICAgICAgICAgICAgPyBob3N0UmVjdC53aWR0aFxuICAgICAgICAgICAgOiBhcmVhUmVjdC53aWR0aDtcbiAgICAgICAgY29uc3QgYXJlYUhlaWdodCA9IGFyZWFSZWN0LmhlaWdodCA+IGhvc3RSZWN0LmhlaWdodFxuICAgICAgICAgICAgPyBob3N0UmVjdC5oZWlnaHRcbiAgICAgICAgICAgIDogYXJlYVJlY3QuaGVpZ2h0O1xuICAgICAgICBsZXQgeDogbnVtYmVyO1xuICAgICAgICBsZXQgeTogbnVtYmVyO1xuICAgICAgICBpZiAoeE9yaWdpbiA9PSBudWxsICYmIHlPcmlnaW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgeE9yaWdpbiA9IHRoaXMuX2ltZ1JlY3QueGM7XG4gICAgICAgICAgICB5T3JpZ2luID0gdGhpcy5faW1nUmVjdC55YztcbiAgICAgICAgfVxuICAgICAgICB4ID0gKGFyZWFSZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0KTtcbiAgICAgICAgeSA9IChhcmVhUmVjdC50b3AgLSBob3N0UmVjdC50b3ApO1xuICAgICAgICB4IC09ICh4T3JpZ2luIC0gKGFyZWFXaWR0aCAvIDIpKTtcbiAgICAgICAgeSAtPSAoeU9yaWdpbiAtIChhcmVhSGVpZ2h0IC8gMikpO1xuXG4gICAgICAgIHRoaXMuX3NldFN0eWxlc0ZvckNvbnRJbWcoe1xuICAgICAgICAgICAgeCwgeVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NsaWRlRW5kKCkge1xuICAgICAgICB0aGlzLl9jcm9wSWZBdXRvQ3JvcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Nyb3BJZkF1dG9Dcm9wKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuYXV0b0Nyb3ApIHtcbiAgICAgICAgICAgIHRoaXMuY3JvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICsgKi9cbiAgICBwdWJsaWMgem9vbUluKCkge1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWwzRml4ICsgLjA1O1xuICAgICAgICBpZiAoc2NhbGUgPiB0aGlzLm1pblNjYWxlICYmIHNjYWxlIDw9IHRoaXMuX21heFNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKHNjYWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2NhbGUodGhpcy5fbWF4U2NhbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENsZWFuIHRoZSBpbWcgY3JvcHBlciAqL1xuICAgIHB1YmxpYyBjbGVhbigpIHtcbiAgICAgICAgLy8gZml4IGNob29zaW5nIHRoZSBzYW1lIGltYWdlIGRvZXMgbm90IGxvYWRcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbnB1dEVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudElucHV0RWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ltZ1JlY3QgPSB7IH0gYXMgYW55O1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnNjYWxlID0gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgICAgICAgIHRoaXMuX3NjYWwzRml4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fcm90YXRpb24gPSAwO1xuICAgICAgICAgICAgdGhpcy5fbWluU2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9pc0xvYWRlZEltZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0Nyb3BwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRMb2FkQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9jb25maWdQcmltYXJ5O1xuICAgICAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLmNsZWFuZWQuZW1pdChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogLSAqL1xuICAgIHB1YmxpYyB6b29tT3V0KCkge1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWwzRml4IC0gLjA1O1xuICAgICAgICBpZiAoc2NhbGUgPiB0aGlzLm1pblNjYWxlICYmIHNjYWxlIDw9IHRoaXMuX21heFNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKHNjYWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZml0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGNlbnRlcigpIHtcbiAgICAgICAgY29uc3QgbmV3U3R5bGVzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fZ2V0Q2VudGVyUG9pbnRzKClcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc2V0U3R5bGVzRm9yQ29udEltZyhuZXdTdHlsZXMpO1xuICAgICAgICB0aGlzLl9jcm9wSWZBdXRvQ3JvcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBsb2FkIGFuIGltYWdlIGZyb20gYSBnaXZlbiBjb25maWd1cmF0aW9uLFxuICAgICAqIG9yIGZyb20gdGhlIHJlc3VsdCBvZiBhIGNyb3BwZWQgaW1hZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZEltYWdlKGNvbmZpZzogSW1nQ3JvcHBlckxvYWRlckNvbmZpZyB8IHN0cmluZywgZm4/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuY2xlYW4oKTtcbiAgICAgICAgY29uc3QgX2NvbmZpZyA9IHRoaXMuX2N1cnJlbnRMb2FkQ29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyB7IG9yaWdpbmFsRGF0YVVSTDogY29uZmlnIH1cbiAgICAgICAgICAgIDogeyAuLi5jb25maWcgfTtcbiAgICAgICAgbGV0IHNyYyA9IF9jb25maWcub3JpZ2luYWxEYXRhVVJMO1xuICAgICAgICB0aGlzLl9wcmltYXJ5QXJlYVdpZHRoID0gdGhpcy5fY29uZmlnUHJpbWFyeS53aWR0aDtcbiAgICAgICAgdGhpcy5fcHJpbWFyeUFyZWFIZWlnaHQgPSB0aGlzLl9jb25maWdQcmltYXJ5LmhlaWdodDtcbiAgICAgICAgaWYgKF9jb25maWcuYXJlYVdpZHRoICYmIF9jb25maWcuYXJlYUhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcud2lkdGggPSBfY29uZmlnLmFyZWFXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmhlaWdodCA9IF9jb25maWcuYXJlYUhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBzcmMgPSBub3JtYWxpemVTVkcoc3JjKTtcblxuICAgICAgICBjb25zdCBpbWcgPSBjcmVhdGVIdG1sSW1nKHNyYyk7XG5cbiAgICAgICAgY29uc3QgY3JvcEV2ZW50ID0geyAuLi5fY29uZmlnIH0gYXMgSW1nQ3JvcHBlckV2ZW50O1xuXG4gICAgICAgIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KG9ic2VydmVyID0+IHtcblxuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBlcnIgPT4gb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGltZy5vbmFib3J0ID0gZXJyID0+IG9ic2VydmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4gb2JzZXJ2ZXIubmV4dChudWxsKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbWdMb2FkZWQoaW1nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNMb2FkZWRJbWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlTG9hZGVkLmVtaXQoY3JvcEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vblN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fcG9zaXRpb25JbWcoY3JvcEV2ZW50LCBmbikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogSW1nQ3JvcHBlckVycm9yRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBfY29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogSW1nQ3JvcHBlckVycm9yLlR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBfY29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfY29uZmlnLnNpemVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUFyZWFJZk5lZWRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcucmVzcG9uc2l2ZUFyZWEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5fcm9vdFJlY3QoKTtcbiAgICAgICAgY29uc3QgYXJlYVJlY3QgPSB0aGlzLl9hcmVhQ3JvcHBlclJlY3QoKTtcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB0aGlzLmNvbmZpZy5taW5XaWR0aCB8fCAxO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLmNvbmZpZy5taW5IZWlnaHQgfHwgMTtcbiAgICAgICAgaWYgKCEoXG4gICAgICAgICAgICBhcmVhUmVjdC53aWR0aCA+IHJvb3RSZWN0LndpZHRoXG4gICAgICAgICAgICB8fCBhcmVhUmVjdC5oZWlnaHQgPiByb290UmVjdC5oZWlnaHRcbiAgICAgICAgICAgIHx8IGFyZWFSZWN0LndpZHRoIDwgdGhpcy5fcHJpbWFyeUFyZWFXaWR0aFxuICAgICAgICAgICAgfHwgYXJlYVJlY3QuaGVpZ2h0IDwgdGhpcy5fcHJpbWFyeUFyZWFIZWlnaHRcbiAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZWFXaWR0aENvbmYgPSBNYXRoLm1heCh0aGlzLmNvbmZpZy53aWR0aCwgbWluV2lkdGgpO1xuICAgICAgICBjb25zdCBhcmVhV2lkdGhNYXggPSBNYXRoLm1heChyb290UmVjdC53aWR0aCwgbWluV2lkdGgpO1xuICAgICAgICBjb25zdCBtaW5Ib3N0ID0gTWF0aC5taW4oXG4gICAgICAgICAgICBNYXRoLm1heChyb290UmVjdC53aWR0aCwgbWluV2lkdGgpLCBNYXRoLm1heChyb290UmVjdC5oZWlnaHQsIG1pbkhlaWdodClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY3VycmVudFNjYWxlID0gdGhpcy5fc2NhbDNGaXg7XG4gICAgICAgIGxldCBuZXdTY2FsZSA9IDA7XG4gICAgICAgIGNvbnN0IHJvdW5kQ29uZiA9IHRoaXMuY29uZmlnLnJvdW5kO1xuXG4gICAgICAgIGlmIChyb3VuZENvbmYpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLndpZHRoID0gdGhpcy5jb25maWcuaGVpZ2h0ID0gbWluSG9zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhcmVhV2lkdGhDb25mID09PSBhcmVhUmVjdC53aWR0aCkge1xuICAgICAgICAgICAgICAgIGlmIChhcmVhV2lkdGhNYXggPiB0aGlzLl9wcmltYXJ5QXJlYVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLndpZHRoID0gdGhpcy5fcHJpbWFyeUFyZWFXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaGVpZ2h0ID0gKHRoaXMuX3ByaW1hcnlBcmVhV2lkdGggKiBhcmVhUmVjdC5oZWlnaHQpIC8gYXJlYVJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gKGN1cnJlbnRTY2FsZSAqIHRoaXMuX3ByaW1hcnlBcmVhV2lkdGgpIC8gYXJlYVJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcud2lkdGggPSBhcmVhV2lkdGhNYXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmhlaWdodCA9IChhcmVhV2lkdGhNYXggKiBhcmVhUmVjdC5oZWlnaHQpIC8gYXJlYVJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gKGN1cnJlbnRTY2FsZSAqIGFyZWFXaWR0aE1heCkgLyBhcmVhUmVjdC53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWluU2NhbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhTY2FsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2NhbGUobmV3U2NhbGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlQWJzb2x1dGVTY2FsZSgpIHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLl9zY2FsM0ZpeCAvICh0aGlzLmNvbmZpZy53aWR0aCAvIHRoaXMuX3ByaW1hcnlBcmVhV2lkdGgpO1xuICAgICAgICB0aGlzLl9hYnNvbHV0ZVNjYWxlID0gc2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBJbWFnZSBmcm9tIFVSTFxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgbG9hZEltYWdlYCBpbnN0ZWFkIG9mIGBzZXRJbWFnZVVybGBcbiAgICAgKiBAcGFyYW0gc3JjIFVSTFxuICAgICAqIEBwYXJhbSBmbiBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBlbWl0IHRoZSBldmVudCBsb2FkZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW1hZ2VVcmwoc3JjOiBzdHJpbmcsIGZuPzogKCkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmxvYWRJbWFnZShzcmMsIGZuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvbkltZyhjcm9wRXZlbnQ6IEltZ0Nyb3BwZXJFdmVudCwgZm4/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGNvbnN0IGxvYWRDb25maWcgPSB0aGlzLl9jdXJyZW50TG9hZENvbmZpZztcbiAgICAgICAgdGhpcy5fdXBkYXRlTWluU2NhbGUodGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLl91cGRhdGVNYXhTY2FsZSgpO1xuICAgICAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsb2FkQ29uZmlnLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTY2FsZShsb2FkQ29uZmlnLnNjYWxlLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTY2FsZSh0aGlzLm1pblNjYWxlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm90YXRlKGxvYWRDb25maWcucm90YXRpb24gfHwgMCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVBcmVhSWZOZWVkZWQoKTtcbiAgICAgICAgICAgIHRoaXMuX21hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmVcbiAgICAgICAgICAgICAgICAgICAgLm9uU3RhYmxlXG4gICAgICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb25maWcueE9yaWdpbiAhPSBudWxsICYmIGxvYWRDb25maWcueU9yaWdpbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbihsb2FkQ29uZmlnLnhPcmlnaW4sIGxvYWRDb25maWcueU9yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcmVhSWZOZWVkZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JvcElmQXV0b0Nyb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZHkuZW1pdChjcm9wRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcm90YXRlKGRlZ3JlZXM6IG51bWJlcikge1xuICAgICAgICBsZXQgdmFsaWREZWdyZWVzID0gX25vcm1hbGl6ZURlZ3JlZXMoZGVncmVlcyk7XG4gICAgICAgIC8vIElmIG5lZ2F0aXZlIGNvbnZlcnQgdG8gcG9zaXRpdmVcbiAgICAgICAgaWYgKHZhbGlkRGVncmVlcyA8IDApIHtcbiAgICAgICAgICAgIHZhbGlkRGVncmVlcyArPSAzNjA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3Um90YXRpb24gPSBfbm9ybWFsaXplRGVncmVlcygodGhpcy5fcm90YXRpb24gfHwgMCkgKyB2YWxpZERlZ3JlZXMpO1xuICAgICAgICBpZiAobmV3Um90YXRpb24gPT09IHRoaXMuX3JvdGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVncmVlc1JhZCA9IHZhbGlkRGVncmVlcyAqIE1hdGguUEkgLyAxODA7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBjYW52YXNDbG9uID0gY3JlYXRlQ2FudmFzSW1nKGNhbnZhcyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uID0gbmV3Um90YXRpb247XG5cbiAgICAgICAgLy8gY2xlYXJcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXNDbG9uLndpZHRoLCBjYW52YXNDbG9uLmhlaWdodCk7XG5cbiAgICAgICAgLy8gcm90YXRlIGNhbnZhcyBpbWFnZVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBgcm90YXRlKCR7dmFsaWREZWdyZWVzfWRlZykgc2NhbGUoJHsxIC8gdGhpcy5fc2NhbDNGaXh9KWA7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybU9yaWdpbiA9IGAke3RoaXMuX2ltZ1JlY3QueGN9cHggJHt0aGlzLl9pbWdSZWN0LnljfXB4IDBgO1xuICAgICAgICBjYW52YXMuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXG4gICAgICAgIGNhbnZhcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIGNhbnZhcy5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSB0cmFuc2Zvcm1PcmlnaW47XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cbiAgICAgICAgY2FudmFzLnN0eWxlLndlYmtpdFRyYW5zZm9ybU9yaWdpbiA9IHRyYW5zZm9ybU9yaWdpbjtcblxuICAgICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGFzIERPTVJlY3Q7XG5cbiAgICAgICAgLy8gc2F2ZSByZWN0XG4gICAgICAgIGNvbnN0IGNhbnZhc1JlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHJvdGF0ZSBzdHlsZXNcbiAgICAgICAgY2FudmFzLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuXG4gICAgICAgIC8vIHNldCB3ICYgaFxuICAgICAgICBjb25zdCB3ID0gY2FudmFzUmVjdC53aWR0aDtcbiAgICAgICAgY29uc3QgaCA9IGNhbnZhc1JlY3QuaGVpZ2h0O1xuICAgICAgICBjdHguY2FudmFzLndpZHRoID0gdztcbiAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSBoO1xuXG4gICAgICAgIC8vIGNsZWFyXG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRlIGFuZCByb3RhdGVcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh3IC8gMiwgaCAvIDIpO1xuICAgICAgICBjdHgucm90YXRlKGRlZ3JlZXNSYWQpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKGNhbnZhc0Nsb24sIC1jYW52YXNDbG9uLndpZHRoIC8gMiwgLWNhbnZhc0Nsb24uaGVpZ2h0IC8gMik7XG5cbiAgICAgICAgLy8gVXBkYXRlIG1pbiBzY2FsZVxuICAgICAgICB0aGlzLl91cGRhdGVNaW5TY2FsZShjYW52YXMpO1xuICAgICAgICB0aGlzLl91cGRhdGVNYXhTY2FsZSgpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgbWluaW11bSBzY2FsZSwgb25seSBpZiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKHRoaXMuc2NhbGUgPCB0aGlzLm1pblNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKDAsIHRydWUpO1xuICAgICAgICB9IC8vICAgICAgICAgICAgICAgIOKGkSBubyBBdXRvQ3JvcFxuXG4gICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5fcm9vdFJlY3QoKTtcblxuICAgICAgICB0aGlzLl9zZXRTdHlsZXNGb3JDb250SW1nKHtcbiAgICAgICAgICAgIHg6IChsZWZ0IC0gcm9vdFJlY3QubGVmdCksXG4gICAgICAgICAgICB5OiAodG9wIC0gcm9vdFJlY3QudG9wKVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBrZWVwIGltYWdlIGluc2lkZSB0aGUgZnJhbWVcbiAgICAgICAgY29uc3Qgb3JpZ2luUG9zaXRpb24gPSB7Li4udGhpcy5faW1nUmVjdH07XG4gICAgICAgIHRoaXMub2Zmc2V0ID0ge1xuICAgICAgICAgICAgeDogb3JpZ2luUG9zaXRpb24ueCxcbiAgICAgICAgICAgIHk6IG9yaWdpblBvc2l0aW9uLnksXG4gICAgICAgICAgICBsZWZ0OiBvcmlnaW5Qb3NpdGlvbi54YyxcbiAgICAgICAgICAgIHRvcDogb3JpZ2luUG9zaXRpb24ueWNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc2V0U3R5bGVzRm9yQ29udEltZyh7fSk7XG4gICAgICAgIHRoaXMuX3NpbXVsYXRlUG9pbnRlck1vdmUoKTtcblxuICAgICAgICB0aGlzLl9jcm9wSWZBdXRvQ3JvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBfdXBkYXRlTWluU2NhbGUoY2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFjYW52YXMpIHtcbiAgICAgICAgICAgIGNhbnZhcyA9IHRoaXMuX2ltZ0NhbnZhcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgICBjb25zdCBtaW5TY2FsZSA9IChjb25maWcuZXh0cmFab29tT3V0ID8gTWF0aC5taW4gOiBNYXRoLm1heCkoXG4gICAgICAgICAgICBjb25maWcud2lkdGggLyBjYW52YXMud2lkdGgsXG4gICAgICAgICAgICBjb25maWcuaGVpZ2h0IC8gY2FudmFzLmhlaWdodCk7XG4gICAgICAgIHRoaXMuX21pblNjYWxlID0gbWluU2NhbGU7XG4gICAgICAgIHRoaXMubWluU2NhbGVDaGFuZ2UuZW1pdChtaW5TY2FsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlTWF4U2NhbGUoKSB7XG4gICAgICAgIGNvbnN0IG1heFNjYWxlID0gKHRoaXMuY29uZmlnLndpZHRoIC8gdGhpcy5fcHJpbWFyeUFyZWFXaWR0aCk7XG4gICAgICAgIHRoaXMuX21heFNjYWxlID0gbWF4U2NhbGU7XG4gICAgICAgIHRoaXMubWF4U2NhbGVDaGFuZ2UuZW1pdChtYXhTY2FsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplICYgY3JvcCBpbWFnZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcm9wKGNvbmZpZz86IEltZ0Nyb3BwZXJDb25maWcpOiBJbWdDcm9wcGVyRXZlbnQge1xuICAgICAgICBjb25zdCBuZXdDb25maWcgPSBjb25maWdcbiAgICAgICAgICAgID8gbWVyZ2VEZWVwKHsgfSwgdGhpcy5jb25maWcgfHwgbmV3IEltZ0Nyb3BwZXJDb25maWcoKSwgY29uZmlnKSA6IHRoaXMuY29uZmlnO1xuICAgICAgICBjb25zdCBjcm9wRXZlbnQgPSB0aGlzLl9pbWdDcm9wKG5ld0NvbmZpZyk7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybiBjcm9wRXZlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ltZ0Nyb3AobXlDb25maWc6IEltZ0Nyb3BwZXJDb25maWcpIHtcbiAgICAgICAgY29uc3QgY2FudmFzRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjb25zdCBhcmVhUmVjdCA9IHRoaXMuX2FyZWFDcm9wcGVyUmVjdCgpO1xuICAgICAgICBjb25zdCBjYW52YXNSZWN0ID0gdGhpcy5fY2FudmFzUmVjdCgpO1xuICAgICAgICBjb25zdCBzY2FsZUZpeCA9IHRoaXMuX3NjYWwzRml4O1xuICAgICAgICBjb25zdCBsZWZ0ID0gKGFyZWFSZWN0LmxlZnQgLSBjYW52YXNSZWN0LmxlZnQpIC8gc2NhbGVGaXg7XG4gICAgICAgIGNvbnN0IHRvcCA9IChhcmVhUmVjdC50b3AgLSBjYW52YXNSZWN0LnRvcCkgLyBzY2FsZUZpeDtcbiAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IG15Q29uZmlnO1xuICAgICAgICBjb25zdCBjdXJyZW50SW1hZ2VMb2FkQ29uZmlnID0gdGhpcy5fY3VycmVudExvYWRDb25maWc7XG4gICAgICAgIGNvbnN0IGFyZWEgPSB7XG4gICAgICAgICAgICB3aWR0aDogbXlDb25maWcud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IG15Q29uZmlnLmhlaWdodFxuICAgICAgICB9O1xuICAgICAgICBjYW52YXNFbGVtZW50LndpZHRoID0gYXJlYS53aWR0aCAvIHNjYWxlRml4O1xuICAgICAgICBjYW52YXNFbGVtZW50LmhlaWdodCA9IGFyZWEuaGVpZ2h0IC8gc2NhbGVGaXg7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICBpZiAobXlDb25maWcuZmlsbCkge1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG15Q29uZmlnLmZpbGw7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzRWxlbWVudC53aWR0aCwgY2FudmFzRWxlbWVudC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAtKGxlZnQpLCAtKHRvcCksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbnZhc0VsZW1lbnQ7XG4gICAgICAgIGlmIChteUNvbmZpZy5vdXRwdXQgPT09IEltZ1Jlc29sdXRpb24uRGVmYXVsdCkge1xuICAgICAgICAgICAgcmVzaXplQ2FudmFzKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWdQcmltYXJ5LndpZHRoLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ1ByaW1hcnkuaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3V0cHV0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAob3V0cHV0LndpZHRoICYmIG91dHB1dC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByZXNpemVDYW52YXMocmVzdWx0LCBvdXRwdXQud2lkdGgsIG91dHB1dC5oZWlnaHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXQud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBhcmVhLmhlaWdodCAqIG91dHB1dC53aWR0aCAvIGFyZWEud2lkdGg7XG4gICAgICAgICAgICAgICAgcmVzaXplQ2FudmFzKHJlc3VsdCwgb3V0cHV0LndpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXQuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3V2lkdGggPSBhcmVhLndpZHRoICogb3V0cHV0LmhlaWdodCAvIGFyZWEuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHJlc2l6ZUNhbnZhcyhyZXN1bHQsIG5ld1dpZHRoLCBvdXRwdXQuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gY3VycmVudEltYWdlTG9hZENvbmZpZy5vcmlnaW5hbERhdGFVUkwuc3RhcnRzV2l0aChcImh0dHBcIilcbiAgICAgICAgICAgID8gY3VycmVudEltYWdlTG9hZENvbmZpZy50eXBlIHx8IG15Q29uZmlnLnR5cGVcbiAgICAgICAgICAgIDogbXlDb25maWcudHlwZSB8fCBjdXJyZW50SW1hZ2VMb2FkQ29uZmlnLnR5cGU7XG4gICAgICAgIGNvbnN0IGRhdGFVUkwgPSByZXN1bHQudG9EYXRhVVJMKHR5cGUpO1xuICAgICAgICBjb25zdCBjcm9wRXZlbnQ6IEltZ0Nyb3BwZXJFdmVudCA9IHtcbiAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmFtZTogY3VycmVudEltYWdlTG9hZENvbmZpZy5uYW1lLFxuICAgICAgICAgICAgYXJlYVdpZHRoOiB0aGlzLl9wcmltYXJ5QXJlYVdpZHRoLFxuICAgICAgICAgICAgYXJlYUhlaWdodDogdGhpcy5fcHJpbWFyeUFyZWFIZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogcmVzdWx0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LFxuICAgICAgICAgICAgb3JpZ2luYWxEYXRhVVJMOiBjdXJyZW50SW1hZ2VMb2FkQ29uZmlnLm9yaWdpbmFsRGF0YVVSTCxcbiAgICAgICAgICAgIHNjYWxlOiB0aGlzLl9hYnNvbHV0ZVNjYWxlLFxuICAgICAgICAgICAgcm90YXRpb246IHRoaXMuX3JvdGF0aW9uLFxuICAgICAgICAgICAgbGVmdDogKGFyZWFSZWN0LmxlZnQgLSBjYW52YXNSZWN0LmxlZnQpIC8gdGhpcy5fc2NhbDNGaXgsXG4gICAgICAgICAgICB0b3A6IChhcmVhUmVjdC50b3AgLSBjYW52YXNSZWN0LnRvcCkgLyB0aGlzLl9zY2FsM0ZpeCxcbiAgICAgICAgICAgIHNpemU6IGN1cnJlbnRJbWFnZUxvYWRDb25maWcuc2l6ZSxcbiAgICAgICAgICAgIHhPcmlnaW46IHRoaXMuX2ltZ1JlY3QueGMsXG4gICAgICAgICAgICB5T3JpZ2luOiB0aGlzLl9pbWdSZWN0LnljLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLl9pbWdSZWN0LnhjLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuX2ltZ1JlY3QueWNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmlzQ3JvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY3JvcHBlZC5lbWl0KGNyb3BFdmVudCk7XG4gICAgICAgIHJldHVybiBjcm9wRXZlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIF9yb290UmVjdCgpOiBET01SZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBhcyBET01SZWN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBfYXJlYUNyb3BwZXJSZWN0KCk6IERPTVJlY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXJlYVJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGFzIERPTVJlY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIF9jYW52YXNSZWN0KCk6IERPTVJlY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1nQ2FudmFzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuXG5cbiAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGxpZnRlZCB0aGVpciBwb2ludGVyLiAqL1xuICAgIHByaXZhdGUgX3BvaW50ZXJVcCA9IChldmVudDogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUdsb2JhbEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9zdGFydFBvaW50ZXJFdmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jcm9wSWZBdXRvQ3JvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgaGFzIGxvc3QgZm9jdXMuICovXG4gICAgcHJpdmF0ZSBfd2luZG93Qmx1ciA9ICgpID0+IHtcbiAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBpcyBibHVycmVkIHdoaWxlIGRyYWdnaW5nIHdlIG5lZWQgdG8gc3RvcCBkcmFnZ2luZyBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBicm93c2VyIHdvbid0IGRpc3BhdGNoIHRoZSBgbW91c2V1cGAgYW5kIGB0b3VjaGVuZGAgZXZlbnRzIGFueW1vcmUuXG4gICAgICAgIGlmICh0aGlzLl9sYXN0UG9pbnRlckV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyVXAodGhpcy5fbGFzdFBvaW50ZXJFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9iaW5kR2xvYmFsRXZlbnRzKHRyaWdnZXJFdmVudDogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50O1xuICAgICAgICBjb25zdCBpc1RvdWNoID0gaXNUb3VjaEV2ZW50KHRyaWdnZXJFdmVudCk7XG4gICAgICAgIGNvbnN0IG1vdmVFdmVudE5hbWUgPSBpc1RvdWNoID8gXCJ0b3VjaG1vdmVcIiA6IFwibW91c2Vtb3ZlXCI7XG4gICAgICAgIGNvbnN0IGVuZEV2ZW50TmFtZSA9IGlzVG91Y2ggPyBcInRvdWNoZW5kXCIgOiBcIm1vdXNldXBcIjtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG1vdmVFdmVudE5hbWUsIHRoaXMuX3BvaW50ZXJNb3ZlLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZW5kRXZlbnROYW1lLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoY2FuY2VsXCIsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdykge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuX3dpbmRvd0JsdXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJlbW92ZXMgYW55IGdsb2JhbCBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZSBtYXkgaGF2ZSBhZGRlZC4gKi9cbiAgICBwcml2YXRlIF9yZW1vdmVHbG9iYWxFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudDtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuX3BvaW50ZXJNb3ZlLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRoaXMuX3BvaW50ZXJNb3ZlLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoY2FuY2VsXCIsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTtcblxuICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLl93aW5kb3dCbHVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBVc2UgZGVmYXVsdFZpZXcgb2YgaW5qZWN0ZWQgZG9jdW1lbnQgaWYgYXZhaWxhYmxlIG9yIGZhbGxiYWNrIHRvIGdsb2JhbCB3aW5kb3cgcmVmZXJlbmNlICovXG4gICAgcHJpdmF0ZSBfZ2V0V2luZG93KCk6IFdpbmRvdyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgfVxuXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGRlZ3JlZXMgZm9yIGNyb3BwZXIgcm90YXRpb25cbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9ub3JtYWxpemVEZWdyZWVzKG46IG51bWJlcikge1xuICAgIGNvbnN0IGRlID0gbiAlIDM2MDtcbiAgICBpZiAoZGUgJSA5MCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEx5Q3JvcHBlcjogSW52YWxpZCBcXGAke259XFxgIGRlZ3JlZSwgb25seSBhY2NlcHRlZCB2YWx1ZXM6IDAsIDkwLCAxODAsIDI3MCAmIDM2MC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlO1xufVxuXG4vKipcbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FudmFzSW1nKGltZzogSFRNTENhbnZhc0VsZW1lbnQgfCBIVE1MSW1hZ2VFbGVtZW50KSB7XG5cbiAgICAvLyBjcmVhdGUgYSBuZXcgY2FudmFzXG4gICAgY29uc3QgbmV3Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3Q2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgIC8vIHNldCBkaW1lbnNpb25zXG4gICAgbmV3Q2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXG4gICAgLy8gYXBwbHkgdGhlIG9sZCBjYW52YXMgdG8gdGhlIG5ldyBvbmVcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4gICAgLy8gcmV0dXJuIHRoZSBuZXcgY2FudmFzXG4gICAgcmV0dXJuIG5ld0NhbnZhcztcbn1cblxuXG5jb25zdCBEQVRBX0lNQUdFX1NWR19QUkVGSVggPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsXCI7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNWRyhkYXRhVVJMOiBzdHJpbmcpIHtcbiAgICBpZiAod2luZG93LmF0b2IgJiYgaXNTdmdJbWFnZShkYXRhVVJMKSkge1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhVVJMLmxlbmd0aCAvIDU7XG4gICAgICAgIGNvbnN0IHRleHQgPSB3aW5kb3cuYXRvYihkYXRhVVJMLnJlcGxhY2UoREFUQV9JTUFHRV9TVkdfUFJFRklYLCBcIlwiKSk7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi5pbm5lckhUTUwgPSB0ZXh0O1xuICAgICAgICBjb25zdCBzdmcgPSBzcGFuLnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJkaXNwbGF5Om5vbmVcIik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHN2Zykud2lkdGgpIHx8IDE7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShzdmcpLmhlaWdodCkgfHwgMTtcbiAgICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke2xlbiAvICh3aWR0aCAvIG1heCl9cHhgKTtcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtsZW4gLyAoaGVpZ2h0IC8gbWF4KX1weGApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBEQVRBX0lNQUdFX1NWR19QUkVGSVggKyB3aW5kb3cuYnRvYShzcGFuLmlubmVySFRNTCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkYXRhVVJMO1xufVxuXG5mdW5jdGlvbiBpc1N2Z0ltYWdlKGRhdGFVcmw6IHN0cmluZykge1xuICAgIHJldHVybiBkYXRhVXJsLnN0YXJ0c1dpdGgoREFUQV9JTUFHRV9TVkdfUFJFRklYKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHRtbEltZyhzcmM6IHN0cmluZykge1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5jcm9zc09yaWdpbiA9IFwiYW5vbnltb3VzXCI7XG4gICAgaW1nLnNyYyA9IHNyYztcbiAgICByZXR1cm4gaW1nO1xufVxuXG5cbmZ1bmN0aW9uIGdldEdlc3R1cmVQb2ludEZyb21FdmVudChldmVudDogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQpIHtcblxuICAgIC8vIGB0b3VjaGVzYCB3aWxsIGJlIGVtcHR5IGZvciBzdGFydC9lbmQgZXZlbnRzIHNvIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIGBjaGFuZ2VkVG91Y2hlc2AuXG4gICAgY29uc3QgcG9pbnQgPSBpc1RvdWNoRXZlbnQoZXZlbnQpXG4gICAgICAgID8gKGV2ZW50LnRvdWNoZXNbMF0gfHwgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0pXG4gICAgICAgIDogZXZlbnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBwb2ludC5jbGllbnRYLFxuICAgICAgICB5OiBwb2ludC5jbGllbnRZXG4gICAgfTtcbn1cblxuLyoqIFJldHVybnMgd2hldGhlciBhbiBldmVudCBpcyBhIHRvdWNoIGV2ZW50LiAqL1xuZnVuY3Rpb24gaXNUb3VjaEV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IGV2ZW50IGlzIFRvdWNoRXZlbnQge1xuICAgIHJldHVybiBldmVudC50eXBlWzBdID09PSBcInRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG46IG51bWJlcikge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG4pO1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgY2hlY2suXG4gKiBAcGFyYW0gaXRlbVxuICovXG5mdW5jdGlvbiBpc09iamVjdChpdGVtKSB7XG4gICAgcmV0dXJuIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcDxULCBVPih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IFQgJiBVO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcDxULCBVLCBWPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYpOiBUICYgVSAmIFY7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwPFQsIFUsIFYsIFc+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogViwgc291cmNlMzogVyk6IFQgJiBVICYgViAmIFc7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueTtcblxuLyoqXG4gKiBEZWVwIG1lcmdlIHR3byBvYmplY3RzLlxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIC4uLnNvdXJjZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pIHtcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7IHJldHVybiB0YXJnZXQ7IH1cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG5cbiAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSAmJiBpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0W2tleV0pIHsgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pOyB9XG4gICAgICAgICAgICAgICAgbWVyZ2VEZWVwKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cblxuXG4vKipcbiAqIFdlIGhhdmUgdGhlIGNyb3BwZXIgYXJlYSBpbiB0aGUgc2FtZSBmaWxlIHRvIGZpeCB0aGUgYnVpbGRcbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJuaWNlLWNyb3BwZXItYXJlYVwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vaW1hZ2UtY3JvcHBlci1hcmVhLnRlbXBsYXRlLmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vaW1hZ2UtY3JvcHBlci1hcmVhLnN0eWxlLnNjc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOaWNlQ3JvcHBlckFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoXCJyZXNpemVyXCIpXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVzaXplcj86IEVsZW1lbnRSZWY7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBrZWVwQXNwZWN0UmF0aW86IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLnJvdW5kXCIpXG4gICAgcHVibGljIHJvdW5kOiBib29sZWFuO1xuXG4gICAgLyoqIFVzZWQgdG8gc3Vic2NyaWJlIHRvIGdsb2JhbCBtb3ZlIGFuZCBlbmQgZXZlbnRzICovXG4gICAgcHJvdGVjdGVkIF9kb2N1bWVudDogRG9jdW1lbnQ7XG4gICAgcHJpdmF0ZSBfaXNTbGlkaW5nOiBib29sZWFuO1xuXG4gICAgLyoqIEtlZXBzIHRyYWNrIG9mIHRoZSBsYXN0IHBvaW50ZXIgZXZlbnQgdGhhdCB3YXMgY2FwdHVyZWQgYnkgdGhlIGNyb3AgYXJlYS4gKi9cbiAgICBwcml2YXRlIF9sYXN0UG9pbnRlckV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSBfc3RhcnRQb2ludGVyRXZlbnQ6IHtcbiAgICAgICAgeDogbnVtYmVyXG4gICAgICAgIHk6IG51bWJlclxuICAgIH0gfCBudWxsO1xuICAgIHByaXZhdGUgX2N1cnJlbnRXaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2N1cnJlbnRIZWlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF9zdGFydEFyZWFSZWN0OiBET01SZWN0O1xuICAgIHByaXZhdGUgX3N0YXJ0SW1nUmVjdDogRE9NUmVjdDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBfZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfY3JvcHBlcjogTmljZUltYWdlQ3JvcHBlckNvbXBvbmVudCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2l6YWJsZUFyZWE6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzaXphYmxlQXJlYSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5fcmVzaXphYmxlQXJlYSkge1xuICAgICAgICAgICAgdGhpcy5fcmVzaXphYmxlQXJlYSA9IHZhbDtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVJlc2l6YWJsZUFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkUmVzaXphYmxlQXJlYSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVJlc2l6YWJsZUFyZWEoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlc2l6YWJsZUFyZWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNpemFibGVBcmVhO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlUmVzaXphYmxlQXJlYSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZFJlc2l6YWJsZUFyZWEoKSB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcmVzaXplci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMuX3BvaW50ZXJEb3duLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlUmVzaXphYmxlQXJlYSgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX3Jlc2l6ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUdsb2JhbEV2ZW50cygpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMuX3BvaW50ZXJEb3duLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLl9wb2ludGVyRG93biwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVcbiAgICAgICAgLy8gdXNlciBpcyB1c2luZyBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSBtYWluIG1vdXNlIGJ1dHRvbi5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZyB8fCAoIWlzVG91Y2hFdmVudChldmVudCkgJiYgZXZlbnQuYnV0dG9uICE9PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICB0aGlzLl9zdGFydFBvaW50ZXJFdmVudCA9IGdldEdlc3R1cmVQb2ludEZyb21FdmVudChldmVudCk7XG4gICAgICAgICAgICB0aGlzLl9zdGFydEFyZWFSZWN0ID0gdGhpcy5fY3JvcHBlci5fYXJlYUNyb3BwZXJSZWN0KCk7XG4gICAgICAgICAgICB0aGlzLl9zdGFydEltZ1JlY3QgPSB0aGlzLl9jcm9wcGVyLl9jYW52YXNSZWN0KCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fYmluZEdsb2JhbEV2ZW50cyhldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BvaW50ZXJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgbWluV2lkdGgsIG1pbkhlaWdodH0gPSB0aGlzLl9jcm9wcGVyLmNvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gZ2V0R2VzdHVyZVBvaW50RnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IHBvaW50LnggLSB0aGlzLl9zdGFydFBvaW50ZXJFdmVudC54O1xuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gcG9pbnQueSAtIHRoaXMuX3N0YXJ0UG9pbnRlckV2ZW50Lnk7XG4gICAgICAgICAgICBjb25zdCBzdGFydEFyZWFSZWN0ID0gdGhpcy5fc3RhcnRBcmVhUmVjdDtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW1nUmVjdCA9IHRoaXMuX3N0YXJ0SW1nUmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGlzUm91bmQgPSB0aGlzLnJvdW5kO1xuICAgICAgICAgICAgY29uc3Qga2VlcEFzcGVjdFJhdGlvID0gdGhpcy5fY3JvcHBlci5jb25maWcua2VlcEFzcGVjdFJhdGlvIHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICAgICAgbGV0IG5ld1dpZHRoID0gMDtcbiAgICAgICAgICAgIGxldCBuZXdIZWlnaHQgPSAwO1xuICAgICAgICAgICAgY29uc3Qgcm9vdFJlY3QgPSB0aGlzLl9jcm9wcGVyLl9yb290UmVjdCgpO1xuXG4gICAgICAgICAgICBpZiAoaXNSb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGNyb3BwZXIgYXJlYSB0byB0aGUgcG9pbnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpblggPSAoKHdpZHRoIC8gMiAvIE1hdGguc3FydCgyKSkgKyBkZWx0YVgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpblkgPSAoKGhlaWdodCAvIDIgLyBNYXRoLnNxcnQoMikpICsgZGVsdGFZKTtcblxuICAgICAgICAgICAgICAgIC8vIExlZ1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpZGUgPSBNYXRoLnNxcnQob3JpZ2luWCAqKiAyICsgb3JpZ2luWSAqKiAyKTtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IG5ld0hlaWdodCA9IHNpZGUgKiAyO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtlZXBBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gd2lkdGggKyBkZWx0YVggKiAyO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IGhlaWdodCArIGRlbHRhWSAqIDI7XG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoICE9PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgLyAod2lkdGggLyBuZXdXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0ID4gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gd2lkdGggLyAoaGVpZ2h0IC8gbmV3SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gbmV3SGVpZ2h0ID0gTWF0aC5tYXgobmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHdpZHRoICsgZGVsdGFYICogMjtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgKyBkZWx0YVkgKiAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUbyBtaW4gd2lkdGhcbiAgICAgICAgICAgIGlmIChuZXdXaWR0aCA8IG1pbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBtaW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIG1pbiBoZWlnaHRcbiAgICAgICAgICAgIGlmIChuZXdIZWlnaHQgPCBtaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBtaW5IZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERvIG5vdCBvdmVyZmxvdyB0aGUgY3JvcHBlciBhcmVhXG4gICAgICAgICAgICBjb25zdCBjZW50ZXJYID0gc3RhcnRBcmVhUmVjdC54ICsgc3RhcnRBcmVhUmVjdC53aWR0aCAvIDI7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJZID0gc3RhcnRBcmVhUmVjdC55ICsgc3RhcnRBcmVhUmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICAgICAgY29uc3QgdG9wT3ZlcmZsb3cgPSBzdGFydEltZ1JlY3QueSA+IGNlbnRlclkgLSAobmV3SGVpZ2h0IC8gMik7XG4gICAgICAgICAgICBjb25zdCBib3R0b21PdmVyZmxvdyA9IGNlbnRlclkgKyAobmV3SGVpZ2h0IC8gMikgPiBzdGFydEltZ1JlY3QuYm90dG9tO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0T25PdmVyZmxvdyA9IE1hdGgubWluKChjZW50ZXJZIC0gc3RhcnRJbWdSZWN0LnkpICogMiwgKHN0YXJ0SW1nUmVjdC5ib3R0b20gLSBjZW50ZXJZKSAqIDIpO1xuICAgICAgICAgICAgY29uc3QgbGVmdE92ZXJmbG93ID0gc3RhcnRJbWdSZWN0LnggPiBjZW50ZXJYIC0gKG5ld1dpZHRoIC8gMik7XG4gICAgICAgICAgICBjb25zdCByaWdodE92ZXJmbG93ID0gY2VudGVyWCArIChuZXdXaWR0aCAvIDIpID4gc3RhcnRJbWdSZWN0LnJpZ2h0O1xuICAgICAgICAgICAgY29uc3QgbWluV2lkdGhPbk92ZXJmbG93ID0gTWF0aC5taW4oKGNlbnRlclggLSBzdGFydEltZ1JlY3QueCkgKiAyLCAoc3RhcnRJbWdSZWN0LnJpZ2h0IC0gY2VudGVyWCkgKiAyKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbk9uT3ZlcmZsb3cgPSBNYXRoLm1pbihtaW5XaWR0aE9uT3ZlcmZsb3csIG1pbkhlaWdodE9uT3ZlcmZsb3cpO1xuICAgICAgICAgICAgaWYgKHJvdW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcE92ZXJmbG93IHx8IGJvdHRvbU92ZXJmbG93IHx8IGxlZnRPdmVyZmxvdyB8fCByaWdodE92ZXJmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IG5ld1dpZHRoID0gbWluT25PdmVyZmxvdztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtlZXBBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05ld1dpZHRoOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05ld0hlaWdodDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoKHRvcE92ZXJmbG93IHx8IGJvdHRvbU92ZXJmbG93KSAmJiBNYXRoLm1pbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IG1pbkhlaWdodE9uT3ZlcmZsb3c7XG4gICAgICAgICAgICAgICAgICAgIG5ld05ld0hlaWdodC5wdXNoKG5ld0hlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gd2lkdGggLyAoaGVpZ2h0IC8gbWluSGVpZ2h0T25PdmVyZmxvdyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld05ld1dpZHRoLnB1c2gobmV3V2lkdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxlZnRPdmVyZmxvdyB8fCByaWdodE92ZXJmbG93KSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IG1pbldpZHRoT25PdmVyZmxvdztcbiAgICAgICAgICAgICAgICAgICAgbmV3TmV3V2lkdGgucHVzaChuZXdXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IGhlaWdodCAvICh3aWR0aCAvIG1pbldpZHRoT25PdmVyZmxvdyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld05ld0hlaWdodC5wdXNoKG5ld0hlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXdOZXdXaWR0aC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3V2lkdGggPSBNYXRoLm1pbiguLi5uZXdOZXdXaWR0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXdOZXdIZWlnaHQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKC4uLm5ld05ld0hlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wT3ZlcmZsb3cgfHwgYm90dG9tT3ZlcmZsb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gbWluSGVpZ2h0T25PdmVyZmxvdztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxlZnRPdmVyZmxvdyB8fCByaWdodE92ZXJmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gbWluV2lkdGhPbk92ZXJmbG93O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRG8gbm90IG92ZXJmbG93IHRoZSBjb250YWluZXJcbiAgICAgICAgICAgIGlmIChyb3VuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHJvb3RSZWN0LndpZHRoLCByb290UmVjdC5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IG1pbikge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IG5ld0hlaWdodCA9IG1pbjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0hlaWdodCA+IG1pbikge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IG5ld0hlaWdodCA9IG1pbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtlZXBBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IHJvb3RSZWN0LndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gcm9vdFJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IGhlaWdodCAvICh3aWR0aCAvIHJvb3RSZWN0LndpZHRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0hlaWdodCA+IHJvb3RSZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHdpZHRoIC8gKGhlaWdodCAvIHJvb3RSZWN0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHJvb3RSZWN0LmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IHJvb3RSZWN0LndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gcm9vdFJlY3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdIZWlnaHQgPiByb290UmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gcm9vdFJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyByb3VuZCB2YWx1ZXNcbiAgICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5yb3VuZChuZXdXaWR0aCk7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKG5ld0hlaWdodCk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtuZXdXaWR0aH1weGA7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50V2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGxpZnRlZCB0aGVpciBwb2ludGVyLiAqL1xuICAgIHByaXZhdGUgX3BvaW50ZXJVcCA9IChldmVudDogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUdsb2JhbEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5fY3JvcHBlci5fcHJpbWFyeUFyZWFXaWR0aCA9IHRoaXMuX2Nyb3BwZXIuY29uZmlnLndpZHRoID0gdGhpcy5fY3VycmVudFdpZHRoO1xuICAgICAgICAgICAgdGhpcy5fY3JvcHBlci5fcHJpbWFyeUFyZWFIZWlnaHQgPSB0aGlzLl9jcm9wcGVyLmNvbmZpZy5oZWlnaHQgPSB0aGlzLl9jdXJyZW50SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fY3JvcHBlci5jb25maWcgPSB0aGlzLl9jcm9wcGVyLmNvbmZpZztcbiAgICAgICAgICAgIHRoaXMuX2Nyb3BwZXIuX3VwZGF0ZU1pblNjYWxlKCk7XG4gICAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9pbnRlckV2ZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgd2luZG93IGhhcyBsb3N0IGZvY3VzLiAqL1xuICAgIHByaXZhdGUgX3dpbmRvd0JsdXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgYmx1cnJlZCB3aGlsZSBkcmFnZ2luZyB3ZSBuZWVkIHRvIHN0b3AgZHJhZ2dpbmcgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gYnJvd3NlciB3b24ndCBkaXNwYXRjaCB0aGUgYG1vdXNldXBgIGFuZCBgdG91Y2hlbmRgIGV2ZW50cyBhbnltb3JlLlxuICAgICAgICBpZiAodGhpcy5fbGFzdFBvaW50ZXJFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fcG9pbnRlclVwKHRoaXMuX2xhc3RQb2ludGVyRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYmluZEdsb2JhbEV2ZW50cyh0cmlnZ2VyRXZlbnQ6IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaXNUb3VjaCA9IGlzVG91Y2hFdmVudCh0cmlnZ2VyRXZlbnQpO1xuICAgICAgICBjb25zdCBtb3ZlRXZlbnROYW1lID0gaXNUb3VjaCA/IFwidG91Y2htb3ZlXCIgOiBcIm1vdXNlbW92ZVwiO1xuICAgICAgICBjb25zdCBlbmRFdmVudE5hbWUgPSBpc1RvdWNoID8gXCJ0b3VjaGVuZFwiIDogXCJtb3VzZXVwXCI7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtb3ZlRXZlbnROYW1lLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50TmFtZSwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChpc1RvdWNoKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLl93aW5kb3dCbHVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZW1vdmVzIGFueSBnbG9iYWwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2UgbWF5IGhhdmUgYWRkZWQuICovXG4gICAgcHJpdmF0ZSBfcmVtb3ZlR2xvYmFsRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQ7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLl9wb2ludGVyTW92ZSwgYWN0aXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLl9wb2ludGVyVXAsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93KSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy5fd2luZG93Qmx1cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVXNlIGRlZmF1bHRWaWV3IG9mIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgd2luZG93IHJlZmVyZW5jZSAqL1xuICAgIHByaXZhdGUgX2dldFdpbmRvdygpOiBXaW5kb3cge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIH1cbn1cbiIsIjwhLS0gKHNlbGVjdHN0YXJ0KTogT24gU2FmYXJpIHN0YXJ0aW5nIHRvIHNsaWRlIHRlbXBvcmFyaWx5IHRyaWdnZXJzIHRleHQgc2VsZWN0aW9uIG1vZGUgd2hpY2hcbnNob3cgdGhlIHdyb25nIGN1cnNvci4gV2UgcHJldmVudCBpdCBieSBzdG9wcGluZyB0aGUgYHNlbGVjdHN0YXJ0YCBldmVudC4gLS0+XG48ZGl2IGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyXCIgI19pbWdDb250YWluZXJcbiAgICAgKHNlbGVjdHN0YXJ0KT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbj5cbiAgICA8Y2FudmFzICNfaW1nQ2FudmFzPjwvY2FudmFzPlxuPC9kaXY+XG48bmljZS1jcm9wcGVyLWFyZWFcbiAgICAjX2FyZWFcbiAgICAqbmdJZj1cIl9pc0xvYWRlZEltZ1wiXG4gICAgW3JvdW5kXT1cIiEhY29uZmlnLnJvdW5kXCJcbiAgICBbcmVzaXphYmxlQXJlYV09XCIhIWNvbmZpZy5yZXNpemFibGVBcmVhXCJcbiAgICBba2VlcEFzcGVjdFJhdGlvXT1cIiEhY29uZmlnLmtlZXBBc3BlY3RSYXRpb1wiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgICB3aWR0aDogY29uZmlnLndpZHRoICsgJ3B4JyxcbiAgICAgICAgaGVpZ2h0OiBjb25maWcuaGVpZ2h0ICsgJ3B4J1xuICAgIH1cIlxuPjwvbmljZS1jcm9wcGVyLWFyZWE+XG48YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiX2lzTG9hZGVkSW1nXCIgKGNsaWNrKT1cImNsZWFuKClcIj5cbiAgICA8bWF0LWljb24+YXJyb3dfYmFjazwvbWF0LWljb24+XG48L2J1dHRvbj5cbiIsIjxkaXYgY2xhc3M9XCJyZXNpemVyXCIgI3Jlc2l6ZXIgKm5nSWY9XCJyZXNpemFibGVBcmVhXCI+PC9kaXY+XG4iXX0=
|