@colijnit/configurator 261.1.1 → 261.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19087 -18481
- package/fesm2022/colijnit-configurator.mjs.map +1 -0
- package/index.d.ts +3299 -0
- package/lib/components/answer-card/style/_layout.scss +3 -3
- package/lib/components/answers-slideout/style/_layout.scss +1 -0
- package/lib/style/configurator-globals.scss +1 -21
- package/package.json +24 -19
- package/bundles/colijnit-configurator.umd.js +0 -20167
- package/bundles/colijnit-configurator.umd.js.map +0 -1
- package/colijnit-configurator.d.ts +0 -5
- package/esm2015/colijnit-configurator.js +0 -5
- package/esm2015/lib/builder.js +0 -795
- package/esm2015/lib/components/answer-card/answer-card.component.js +0 -313
- package/esm2015/lib/components/answer-card/answer-card.module.js +0 -50
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +0 -182
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +0 -34
- package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +0 -490
- package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +0 -61
- package/esm2015/lib/components/color-filter/color-filter.component.js +0 -59
- package/esm2015/lib/components/color-filter/color-filter.module.js +0 -26
- package/esm2015/lib/components/configurator/configurator.component.js +0 -133
- package/esm2015/lib/components/configurator/configurator.module.js +0 -42
- package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +0 -222
- package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +0 -48
- package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +0 -82
- package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +0 -163
- package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +0 -49
- package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +0 -33
- package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +0 -60
- package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +0 -17
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +0 -46
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +0 -26
- package/esm2015/lib/components/element-buttons/element-buttons.component.js +0 -168
- package/esm2015/lib/components/element-buttons/element-buttons.module.js +0 -30
- package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +0 -186
- package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +0 -34
- package/esm2015/lib/components/image-zoom/image-zoom.component.js +0 -61
- package/esm2015/lib/components/image-zoom/image-zoom.module.js +0 -30
- package/esm2015/lib/components/lite-selector/lite-selector.component.js +0 -206
- package/esm2015/lib/components/lite-selector/lite-selector.module.js +0 -34
- package/esm2015/lib/components/product-configurator/product-configurator.component.js +0 -184
- package/esm2015/lib/components/product-configurator/product-configurator.module.js +0 -72
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +0 -237
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +0 -38
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +0 -284
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +0 -42
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +0 -72
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +0 -34
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +0 -82
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +0 -30
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +0 -80
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +0 -34
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +0 -93
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +0 -34
- package/esm2015/lib/components/progress-bar/progress-bar.component.js +0 -55
- package/esm2015/lib/components/progress-bar/progress-bar.module.js +0 -29
- package/esm2015/lib/components/scene-options/scene-options.component.js +0 -164
- package/esm2015/lib/components/scene-options/scene-options.module.js +0 -38
- package/esm2015/lib/components/selections-summary/selections-summary.component.js +0 -163
- package/esm2015/lib/components/selections-summary/selections-summary.module.js +0 -45
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +0 -171
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +0 -34
- package/esm2015/lib/components/slideout/slideout.component.js +0 -83
- package/esm2015/lib/components/slideout/slideout.module.js +0 -17
- package/esm2015/lib/components/summary-line/summary-line.component.js +0 -273
- package/esm2015/lib/components/summary-line/summary-line.module.js +0 -44
- package/esm2015/lib/components/tag-filter/tag-filter.component.js +0 -39
- package/esm2015/lib/components/tag-filter/tag-filter.module.js +0 -21
- package/esm2015/lib/components/threedselector/threedselector.component.js +0 -155
- package/esm2015/lib/components/threedselector/threedselector.module.js +0 -34
- package/esm2015/lib/core/helper/variation-helper.js +0 -553
- package/esm2015/lib/core/shader/floor-fade.shader.js +0 -33
- package/esm2015/lib/core/textures/depth-data-texture.js +0 -19
- package/esm2015/lib/directives/directives.module.js +0 -26
- package/esm2015/lib/directives/visibility-observer-master.directive.js +0 -53
- package/esm2015/lib/directives/visibility-observer.directive.js +0 -54
- package/esm2015/lib/enum/ar-feature.enum.js +0 -14
- package/esm2015/lib/enum/configuration-key.enum.js +0 -41
- package/esm2015/lib/enum/configuration-template.enum.js +0 -6
- package/esm2015/lib/enum/device-size-type.js +0 -7
- package/esm2015/lib/enum/device-tier.enum.js +0 -7
- package/esm2015/lib/enum/icon.enum.js +0 -113
- package/esm2015/lib/enum/item-type.enum.js +0 -23
- package/esm2015/lib/enum/light.enum.js +0 -9
- package/esm2015/lib/enum/navigator-type.enum.js +0 -6
- package/esm2015/lib/enum/output-encoding.enum.js +0 -9
- package/esm2015/lib/enum/result-type.enum.js +0 -21
- package/esm2015/lib/enum/scene-event.enum.js +0 -12
- package/esm2015/lib/enum/shadow-map-type.enum.js +0 -8
- package/esm2015/lib/enum/texture-type.js +0 -9
- package/esm2015/lib/enum/tone-mapping-local.enum.js +0 -12
- package/esm2015/lib/enum/view-mode.enum.js +0 -7
- package/esm2015/lib/enum/xr-mode.enum.js +0 -6
- package/esm2015/lib/environments/environment.js +0 -8
- package/esm2015/lib/interfaces/aa-options.interface.js +0 -2
- package/esm2015/lib/interfaces/adjustable-element.interface.js +0 -2
- package/esm2015/lib/interfaces/ao-options.interface.js +0 -2
- package/esm2015/lib/interfaces/changes.interface.js +0 -2
- package/esm2015/lib/interfaces/configuration-data.interface.js +0 -2
- package/esm2015/lib/interfaces/light-preset.interface.js +0 -2
- package/esm2015/lib/interfaces/post-processing-setting.interface.js +0 -2
- package/esm2015/lib/interfaces/scene-option-button.interface.js +0 -6
- package/esm2015/lib/interfaces/screen-size-info.js +0 -2
- package/esm2015/lib/interfaces/setting.interface.js +0 -2
- package/esm2015/lib/interfaces/texture.interface.js +0 -2
- package/esm2015/lib/interfaces/vignette-options.interface.js +0 -2
- package/esm2015/lib/model/ar-position-indicator.js +0 -18
- package/esm2015/lib/model/camera-settings.js +0 -14
- package/esm2015/lib/model/configuration-result-object.js +0 -6
- package/esm2015/lib/model/configurator-error-message.js +0 -9
- package/esm2015/lib/model/configurator-settings.js +0 -25
- package/esm2015/lib/model/custom-button.js +0 -16
- package/esm2015/lib/model/factory.js +0 -28
- package/esm2015/lib/model/icon.js +0 -112
- package/esm2015/lib/model/intersected-objects.js +0 -7
- package/esm2015/lib/model/light-preset.js +0 -73
- package/esm2015/lib/model/light-properties.js +0 -45
- package/esm2015/lib/model/material.js +0 -11
- package/esm2015/lib/model/metadata.js +0 -2
- package/esm2015/lib/model/render-parameters.js +0 -16
- package/esm2015/lib/model/setting-options.js +0 -71
- package/esm2015/lib/model/settings.js +0 -16
- package/esm2015/lib/model/shadow-properties.js +0 -10
- package/esm2015/lib/model/skin.js +0 -3
- package/esm2015/lib/model/texture.js +0 -76
- package/esm2015/lib/model/variation-settings.js +0 -54
- package/esm2015/lib/model/variation.js +0 -3
- package/esm2015/lib/model/xr-reticle.js +0 -79
- package/esm2015/lib/modules/render/enum/scene-type.enum.js +0 -6
- package/esm2015/lib/modules/render/model/ar-parameters.js +0 -12
- package/esm2015/lib/modules/render/model/scene-setting.js +0 -6
- package/esm2015/lib/modules/render/model/scene-settings.js +0 -3
- package/esm2015/lib/pipes/append.pipe.js +0 -21
- package/esm2015/lib/pipes/google-translate.pipe.js +0 -21
- package/esm2015/lib/pipes/localize.pipe.js +0 -28
- package/esm2015/lib/pipes/pipes.module.js +0 -41
- package/esm2015/lib/pipes/prepend.pipe.js +0 -21
- package/esm2015/lib/pipes/strip-html.pipe.js +0 -17
- package/esm2015/lib/services/app-event.service.js +0 -36
- package/esm2015/lib/services/app-initializer.service.js +0 -27
- package/esm2015/lib/services/ar.service.js +0 -844
- package/esm2015/lib/services/build-furniture-base.service.js +0 -1181
- package/esm2015/lib/services/build-furniture-without-scene.service.js +0 -86
- package/esm2015/lib/services/build-furniture.service.js +0 -169
- package/esm2015/lib/services/bundle-initialzer.service.js +0 -113
- package/esm2015/lib/services/camera.service.js +0 -123
- package/esm2015/lib/services/configuration.service.js +0 -79
- package/esm2015/lib/services/configurator-connector.service.js +0 -830
- package/esm2015/lib/services/configurator.service.js +0 -285
- package/esm2015/lib/services/configuring.service.js +0 -119
- package/esm2015/lib/services/controls.js +0 -799
- package/esm2015/lib/services/debug.service.js +0 -43
- package/esm2015/lib/services/dictionary.service.js +0 -65
- package/esm2015/lib/services/dynamic-camera.service.js +0 -96
- package/esm2015/lib/services/floor-plane.service.js +0 -252
- package/esm2015/lib/services/font.service.js +0 -27
- package/esm2015/lib/services/google-translate.service.js +0 -79
- package/esm2015/lib/services/icon-cache.service.js +0 -44
- package/esm2015/lib/services/intersection.service.js +0 -47
- package/esm2015/lib/services/item.service.js +0 -75
- package/esm2015/lib/services/json-utils.service.js +0 -48
- package/esm2015/lib/services/light-creation.service.js +0 -35
- package/esm2015/lib/services/light-presets.service.js +0 -157
- package/esm2015/lib/services/lights.service.js +0 -146
- package/esm2015/lib/services/load-furniture-base.service.js +0 -164
- package/esm2015/lib/services/load-furniture-without-scene.service.js +0 -45
- package/esm2015/lib/services/load-furniture.service.js +0 -72
- package/esm2015/lib/services/loader.service.js +0 -32
- package/esm2015/lib/services/locator.service.js +0 -11
- package/esm2015/lib/services/message-board.service.js +0 -50
- package/esm2015/lib/services/post-processing.service.js +0 -378
- package/esm2015/lib/services/product-configurator.service.js +0 -16
- package/esm2015/lib/services/progress.service.js +0 -20
- package/esm2015/lib/services/scene-event.service.js +0 -246
- package/esm2015/lib/services/scene-options.service.js +0 -24
- package/esm2015/lib/services/scene.service.js +0 -313
- package/esm2015/lib/services/screen-size-analysis.service.js +0 -97
- package/esm2015/lib/services/settings.service.js +0 -142
- package/esm2015/lib/services/switch-build-furniture.service.js +0 -37
- package/esm2015/lib/services/switch-load-furniture.service.js +0 -35
- package/esm2015/lib/services/threedselector.service.js +0 -72
- package/esm2015/lib/services/utils.service.js +0 -207
- package/esm2015/lib/services/variation-cache.service.js +0 -143
- package/esm2015/lib/services/variation.service.js +0 -490
- package/esm2015/lib/services/view-mode.service.js +0 -37
- package/esm2015/lib/services/vr.service.js +0 -191
- package/esm2015/lib/services/xr.service.js +0 -294
- package/esm2015/lib/utils/asset.utils.js +0 -120
- package/esm2015/lib/utils/base-utils.js +0 -9
- package/esm2015/lib/utils/color.utils.js +0 -30
- package/esm2015/lib/utils/debug.utils.js +0 -9
- package/esm2015/lib/utils/device.utils.js +0 -25
- package/esm2015/lib/utils/file.utils.js +0 -167
- package/esm2015/lib/utils/image.utils.js +0 -61
- package/esm2015/lib/utils/json-parser.utils.js +0 -180
- package/esm2015/lib/utils/material.utils.js +0 -433
- package/esm2015/lib/utils/object.utils.js +0 -360
- package/esm2015/lib/utils/relative-position.utils.js +0 -75
- package/esm2015/lib/utils/rotation-helper.utils.js +0 -15
- package/esm2015/lib/utils/scene-3d.utils.js +0 -213
- package/esm2015/lib/utils/scene-utils.js +0 -191
- package/esm2015/lib/utils/text-utils.js +0 -68
- package/esm2015/lib/utils/threed.utils.js +0 -281
- package/esm2015/lib/utils/variation-utils.js +0 -459
- package/esm2015/public-api.js +0 -65
- package/fesm2015/colijnit-configurator.js.map +0 -1
- package/lib/builder.d.ts +0 -83
- package/lib/components/answer-card/answer-card.component.d.ts +0 -58
- package/lib/components/answer-card/answer-card.module.d.ts +0 -11
- package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +0 -38
- package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +0 -10
- package/lib/components/answers-slideout/answers-slideout.component.d.ts +0 -86
- package/lib/components/answers-slideout/answers-slideout.module.d.ts +0 -16
- package/lib/components/color-filter/color-filter.component.d.ts +0 -20
- package/lib/components/color-filter/color-filter.module.d.ts +0 -8
- package/lib/components/configurator/configurator.component.d.ts +0 -37
- package/lib/components/configurator/configurator.module.d.ts +0 -12
- package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +0 -30
- package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +0 -13
- package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +0 -16
- package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +0 -26
- package/lib/components/configurator-loader/configurator-loader.component.d.ts +0 -7
- package/lib/components/configurator-loader/configurator-loader.module.d.ts +0 -9
- package/lib/components/configurator-scene/configurator-scene.component.d.ts +0 -24
- package/lib/components/configurator-scene/configurator-scene.module.d.ts +0 -7
- package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +0 -7
- package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +0 -8
- package/lib/components/element-buttons/element-buttons.component.d.ts +0 -32
- package/lib/components/element-buttons/element-buttons.module.d.ts +0 -9
- package/lib/components/element-toolbar/element-toolbar.component.d.ts +0 -27
- package/lib/components/element-toolbar/element-toolbar.module.d.ts +0 -10
- package/lib/components/image-zoom/image-zoom.component.d.ts +0 -15
- package/lib/components/image-zoom/image-zoom.module.d.ts +0 -9
- package/lib/components/lite-selector/lite-selector.component.d.ts +0 -40
- package/lib/components/lite-selector/lite-selector.module.d.ts +0 -10
- package/lib/components/product-configurator/product-configurator.component.d.ts +0 -50
- package/lib/components/product-configurator/product-configurator.module.d.ts +0 -15
- package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +0 -35
- package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +0 -11
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +0 -31
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +0 -13
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +0 -20
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +0 -20
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +0 -21
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +0 -21
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +0 -10
- package/lib/components/progress-bar/progress-bar.component.d.ts +0 -10
- package/lib/components/progress-bar/progress-bar.module.d.ts +0 -8
- package/lib/components/scene-options/scene-options.component.d.ts +0 -24
- package/lib/components/scene-options/scene-options.module.d.ts +0 -11
- package/lib/components/selections-summary/selections-summary.component.d.ts +0 -38
- package/lib/components/selections-summary/selections-summary.module.d.ts +0 -12
- package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +0 -27
- package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +0 -10
- package/lib/components/slideout/slideout.component.d.ts +0 -22
- package/lib/components/slideout/slideout.module.d.ts +0 -7
- package/lib/components/summary-line/summary-line.component.d.ts +0 -50
- package/lib/components/summary-line/summary-line.module.d.ts +0 -11
- package/lib/components/tag-filter/tag-filter.component.d.ts +0 -9
- package/lib/components/tag-filter/tag-filter.module.d.ts +0 -7
- package/lib/components/threedselector/threedselector.component.d.ts +0 -38
- package/lib/components/threedselector/threedselector.module.d.ts +0 -10
- package/lib/core/helper/variation-helper.d.ts +0 -25
- package/lib/core/shader/floor-fade.shader.d.ts +0 -5
- package/lib/core/textures/depth-data-texture.d.ts +0 -5
- package/lib/directives/directives.module.d.ts +0 -8
- package/lib/directives/visibility-observer-master.directive.d.ts +0 -12
- package/lib/directives/visibility-observer.directive.d.ts +0 -16
- package/lib/enum/ar-feature.enum.d.ts +0 -12
- package/lib/enum/configuration-key.enum.d.ts +0 -39
- package/lib/enum/configuration-template.enum.d.ts +0 -4
- package/lib/enum/device-size-type.d.ts +0 -5
- package/lib/enum/device-tier.enum.d.ts +0 -5
- package/lib/enum/icon.enum.d.ts +0 -111
- package/lib/enum/item-type.enum.d.ts +0 -21
- package/lib/enum/light.enum.d.ts +0 -7
- package/lib/enum/navigator-type.enum.d.ts +0 -4
- package/lib/enum/output-encoding.enum.d.ts +0 -7
- package/lib/enum/result-type.enum.d.ts +0 -19
- package/lib/enum/scene-event.enum.d.ts +0 -10
- package/lib/enum/shadow-map-type.enum.d.ts +0 -6
- package/lib/enum/texture-type.d.ts +0 -7
- package/lib/enum/tone-mapping-local.enum.d.ts +0 -10
- package/lib/enum/view-mode.enum.d.ts +0 -5
- package/lib/enum/xr-mode.enum.d.ts +0 -4
- package/lib/environments/environment.d.ts +0 -4
- package/lib/interfaces/aa-options.interface.d.ts +0 -4
- package/lib/interfaces/adjustable-element.interface.d.ts +0 -5
- package/lib/interfaces/ao-options.interface.d.ts +0 -18
- package/lib/interfaces/changes.interface.d.ts +0 -9
- package/lib/interfaces/configuration-data.interface.d.ts +0 -40
- package/lib/interfaces/light-preset.interface.d.ts +0 -22
- package/lib/interfaces/post-processing-setting.interface.d.ts +0 -11
- package/lib/interfaces/scene-option-button.interface.d.ts +0 -19
- package/lib/interfaces/screen-size-info.d.ts +0 -10
- package/lib/interfaces/setting.interface.d.ts +0 -8
- package/lib/interfaces/texture.interface.d.ts +0 -44
- package/lib/interfaces/vignette-options.interface.d.ts +0 -4
- package/lib/model/ar-position-indicator.d.ts +0 -4
- package/lib/model/camera-settings.d.ts +0 -12
- package/lib/model/configuration-result-object.d.ts +0 -30
- package/lib/model/configurator-error-message.d.ts +0 -8
- package/lib/model/configurator-settings.d.ts +0 -62
- package/lib/model/custom-button.d.ts +0 -10
- package/lib/model/factory.d.ts +0 -5
- package/lib/model/icon.d.ts +0 -4
- package/lib/model/intersected-objects.d.ts +0 -6
- package/lib/model/light-preset.d.ts +0 -33
- package/lib/model/light-properties.d.ts +0 -25
- package/lib/model/material.d.ts +0 -41
- package/lib/model/metadata.d.ts +0 -78
- package/lib/model/render-parameters.d.ts +0 -12
- package/lib/model/setting-options.d.ts +0 -67
- package/lib/model/settings.d.ts +0 -10
- package/lib/model/shadow-properties.d.ts +0 -7
- package/lib/model/skin.d.ts +0 -15
- package/lib/model/texture.d.ts +0 -52
- package/lib/model/variation-settings.d.ts +0 -55
- package/lib/model/variation.d.ts +0 -11
- package/lib/model/xr-reticle.d.ts +0 -17
- package/lib/modules/render/enum/scene-type.enum.d.ts +0 -4
- package/lib/modules/render/model/ar-parameters.d.ts +0 -9
- package/lib/modules/render/model/scene-setting.d.ts +0 -13
- package/lib/modules/render/model/scene-settings.d.ts +0 -4
- package/lib/pipes/append.pipe.d.ts +0 -7
- package/lib/pipes/google-translate.pipe.d.ts +0 -11
- package/lib/pipes/localize.pipe.d.ts +0 -10
- package/lib/pipes/pipes.module.d.ts +0 -11
- package/lib/pipes/prepend.pipe.d.ts +0 -7
- package/lib/pipes/strip-html.pipe.d.ts +0 -7
- package/lib/services/app-event.service.d.ts +0 -32
- package/lib/services/app-initializer.service.d.ts +0 -14
- package/lib/services/ar.service.d.ts +0 -120
- package/lib/services/build-furniture-base.service.d.ts +0 -117
- package/lib/services/build-furniture-without-scene.service.d.ts +0 -14
- package/lib/services/build-furniture.service.d.ts +0 -14
- package/lib/services/bundle-initialzer.service.d.ts +0 -45
- package/lib/services/camera.service.d.ts +0 -44
- package/lib/services/configuration.service.d.ts +0 -18
- package/lib/services/configurator-connector.service.d.ts +0 -140
- package/lib/services/configurator.service.d.ts +0 -62
- package/lib/services/configuring.service.d.ts +0 -46
- package/lib/services/controls.d.ts +0 -11
- package/lib/services/debug.service.d.ts +0 -16
- package/lib/services/dictionary.service.d.ts +0 -15
- package/lib/services/dynamic-camera.service.d.ts +0 -21
- package/lib/services/floor-plane.service.d.ts +0 -47
- package/lib/services/font.service.d.ts +0 -10
- package/lib/services/google-translate.service.d.ts +0 -26
- package/lib/services/icon-cache.service.d.ts +0 -21
- package/lib/services/intersection.service.d.ts +0 -11
- package/lib/services/item.service.d.ts +0 -18
- package/lib/services/json-utils.service.d.ts +0 -7
- package/lib/services/light-creation.service.d.ts +0 -9
- package/lib/services/light-presets.service.d.ts +0 -34
- package/lib/services/lights.service.d.ts +0 -34
- package/lib/services/load-furniture-base.service.d.ts +0 -37
- package/lib/services/load-furniture-without-scene.service.d.ts +0 -9
- package/lib/services/load-furniture.service.d.ts +0 -9
- package/lib/services/loader.service.d.ts +0 -11
- package/lib/services/locator.service.d.ts +0 -7
- package/lib/services/message-board.service.d.ts +0 -18
- package/lib/services/post-processing.service.d.ts +0 -74
- package/lib/services/product-configurator.service.d.ts +0 -11
- package/lib/services/progress.service.d.ts +0 -9
- package/lib/services/scene-event.service.d.ts +0 -72
- package/lib/services/scene-options.service.d.ts +0 -11
- package/lib/services/scene.service.d.ts +0 -71
- package/lib/services/screen-size-analysis.service.d.ts +0 -32
- package/lib/services/settings.service.d.ts +0 -24
- package/lib/services/switch-build-furniture.service.d.ts +0 -21
- package/lib/services/switch-load-furniture.service.d.ts +0 -21
- package/lib/services/threedselector.service.d.ts +0 -17
- package/lib/services/utils.service.d.ts +0 -24
- package/lib/services/variation-cache.service.d.ts +0 -23
- package/lib/services/variation.service.d.ts +0 -26
- package/lib/services/view-mode.service.d.ts +0 -17
- package/lib/services/vr.service.d.ts +0 -42
- package/lib/services/xr.service.d.ts +0 -56
- package/lib/utils/asset.utils.d.ts +0 -19
- package/lib/utils/base-utils.d.ts +0 -4
- package/lib/utils/color.utils.d.ts +0 -8
- package/lib/utils/debug.utils.d.ts +0 -3
- package/lib/utils/device.utils.d.ts +0 -7
- package/lib/utils/file.utils.d.ts +0 -30
- package/lib/utils/image.utils.d.ts +0 -9
- package/lib/utils/json-parser.utils.d.ts +0 -9
- package/lib/utils/material.utils.d.ts +0 -34
- package/lib/utils/object.utils.d.ts +0 -32
- package/lib/utils/relative-position.utils.d.ts +0 -12
- package/lib/utils/rotation-helper.utils.d.ts +0 -6
- package/lib/utils/scene-3d.utils.d.ts +0 -8
- package/lib/utils/scene-utils.d.ts +0 -7
- package/lib/utils/text-utils.d.ts +0 -4
- package/lib/utils/threed.utils.d.ts +0 -20
- package/lib/utils/variation-utils.d.ts +0 -18
- package/public-api.d.ts +0 -60
- /package/lib/style/{template_variables.scss → _variables.scss} +0 -0
|
@@ -1,830 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Options } from '@colijnit/ioneconnector/build/model/options';
|
|
4
|
-
import { Article } from '@colijnit/configuratorapi/build/model/article';
|
|
5
|
-
import { BusinessObjectFactory } from '@colijnit/ioneconnector/build/service/business-object-factory';
|
|
6
|
-
import { Selection } from '@colijnit/configuratorapi/build/model/selection';
|
|
7
|
-
import { SelectorWithOptions } from '@colijnit/configuratorapi/build/model/selector-with-options';
|
|
8
|
-
import { AnswerPrice } from '@colijnit/configuratorapi/build/model/answer-price';
|
|
9
|
-
import { ImageContent } from '@colijnit/mainapi/build/model/image-content.bo';
|
|
10
|
-
import { ArticleText } from '@colijnit/configuratorapi/build/model/article-text.bo';
|
|
11
|
-
import { SkipButtonInfo } from '@colijnit/configuratorapi/build/model/skip-button-info';
|
|
12
|
-
import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
|
|
13
|
-
import { ResultType } from '../enum/result-type.enum';
|
|
14
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
15
|
-
import { ConfigurationResultObject } from '../model/configuration-result-object';
|
|
16
|
-
import { ConfigurationTemplate } from '../enum/configuration-template.enum';
|
|
17
|
-
import { TableName } from '@colijnit/mainapi/build/enum/table-name.enum';
|
|
18
|
-
import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
|
|
19
|
-
import { isNill } from '@colijnit/configuratorapi/build/utils/function/is-nill.function';
|
|
20
|
-
import { ConfiguratorStatisticsEnvironment } from '@colijnit/configuratorapi/build/model/configurator-statistics-environment';
|
|
21
|
-
import { ConfiguratorErrorMessage } from '../model/configurator-error-message';
|
|
22
|
-
import * as i0 from "@angular/core";
|
|
23
|
-
import * as i1 from "./configurator.service";
|
|
24
|
-
import * as i2 from "./app-event.service";
|
|
25
|
-
import * as i3 from "./settings.service";
|
|
26
|
-
import * as i4 from "./loader.service";
|
|
27
|
-
export class ConfiguratorConnectorService {
|
|
28
|
-
constructor(_configuratorService, _appEventService, _settingsService, _loaderService) {
|
|
29
|
-
this._configuratorService = _configuratorService;
|
|
30
|
-
this._appEventService = _appEventService;
|
|
31
|
-
this._settingsService = _settingsService;
|
|
32
|
-
this._loaderService = _loaderService;
|
|
33
|
-
this.controllerInitialized = new BehaviorSubject(false);
|
|
34
|
-
this.standAloneInstance = new BehaviorSubject(false);
|
|
35
|
-
this.connectionReset = new Subject();
|
|
36
|
-
this.selectionsToDisplay = [];
|
|
37
|
-
this.activeAnswers = [];
|
|
38
|
-
this._selections = [];
|
|
39
|
-
this._imageCache = new Map();
|
|
40
|
-
this._connectorOptions = new Options();
|
|
41
|
-
this._subs = [];
|
|
42
|
-
this._initializing = false;
|
|
43
|
-
this._initialized = false;
|
|
44
|
-
this._boFactory = new BusinessObjectFactory();
|
|
45
|
-
}
|
|
46
|
-
get article() {
|
|
47
|
-
return this._article;
|
|
48
|
-
}
|
|
49
|
-
set article(value) {
|
|
50
|
-
this._article = value;
|
|
51
|
-
}
|
|
52
|
-
get sku() {
|
|
53
|
-
return this._sku;
|
|
54
|
-
}
|
|
55
|
-
get objectResult() {
|
|
56
|
-
return this._objectResult;
|
|
57
|
-
}
|
|
58
|
-
set objectResult(value) {
|
|
59
|
-
this._objectResult = value;
|
|
60
|
-
}
|
|
61
|
-
get selections() {
|
|
62
|
-
return this._selections;
|
|
63
|
-
}
|
|
64
|
-
set selections(value) {
|
|
65
|
-
this._selections = value;
|
|
66
|
-
}
|
|
67
|
-
get decoNodes() {
|
|
68
|
-
return this._decoNodes;
|
|
69
|
-
}
|
|
70
|
-
set decoNodes(value) {
|
|
71
|
-
this._decoNodes = value;
|
|
72
|
-
}
|
|
73
|
-
get totalPrice() {
|
|
74
|
-
return this._totalPrice;
|
|
75
|
-
}
|
|
76
|
-
get currentSelections() {
|
|
77
|
-
return this._currentSelections;
|
|
78
|
-
}
|
|
79
|
-
get activeSelection() {
|
|
80
|
-
return this._activeSelection;
|
|
81
|
-
}
|
|
82
|
-
set activeSelection(value) {
|
|
83
|
-
this._activeSelection = value;
|
|
84
|
-
}
|
|
85
|
-
set selectionWithAnswers(value) {
|
|
86
|
-
this._selectionWithAnswers = value;
|
|
87
|
-
}
|
|
88
|
-
get selectionWithAnswers() {
|
|
89
|
-
return this._selectionWithAnswers;
|
|
90
|
-
}
|
|
91
|
-
get shouldShowLoader() {
|
|
92
|
-
return this._shouldShowLoader;
|
|
93
|
-
}
|
|
94
|
-
ngOnDestroy() {
|
|
95
|
-
this._imageCache.clear();
|
|
96
|
-
this._subs.forEach(sub => sub.unsubscribe());
|
|
97
|
-
}
|
|
98
|
-
initConnection(forceReload, standAlone = false) {
|
|
99
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
if ((this._initialized || this._initializing) && !forceReload) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
this._initializing = true;
|
|
104
|
-
try {
|
|
105
|
-
const settings = this._settingsService.settings;
|
|
106
|
-
if (!settings) {
|
|
107
|
-
throw Error('Settings are not defined!');
|
|
108
|
-
}
|
|
109
|
-
this._connectorOptions = Object.assign(new Options(), settings);
|
|
110
|
-
this._subs.push(this._configuratorService.showLoader.subscribe(showLoader => this.onShowLoaderChange(showLoader)), this._configuratorService.connectionReset.subscribe(() => this.onConnectionReset()));
|
|
111
|
-
yield this._configuratorService.initConnector(this._connectorOptions, forceReload);
|
|
112
|
-
yield this._settingsService.checkAdditionalParameters();
|
|
113
|
-
this.controllerInitialized.next(true);
|
|
114
|
-
this._initialized = true;
|
|
115
|
-
this._initializing = false;
|
|
116
|
-
}
|
|
117
|
-
catch (e) {
|
|
118
|
-
this._initializing = false;
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
onShowLoaderChange(showLoader) {
|
|
123
|
-
if (showLoader) {
|
|
124
|
-
}
|
|
125
|
-
this._loaderService.showLoader = showLoader;
|
|
126
|
-
}
|
|
127
|
-
onConnectionReset() {
|
|
128
|
-
this.connectionReset.next();
|
|
129
|
-
}
|
|
130
|
-
getGoodIdFromSku(sku, showLoader = false) {
|
|
131
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
132
|
-
const response = yield this._configuratorService.getGoodIdFromSku(sku, showLoader);
|
|
133
|
-
this._sku = sku;
|
|
134
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
135
|
-
return response.resultObject;
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
setSelections(selections) {
|
|
143
|
-
// this._selections = value;
|
|
144
|
-
this._prepareSelections(selections);
|
|
145
|
-
}
|
|
146
|
-
setDecoNodes(value) {
|
|
147
|
-
this._decoNodes = value;
|
|
148
|
-
}
|
|
149
|
-
getArticleQuickSel(goodId, showLoader = true) {
|
|
150
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
-
const response = yield this._configuratorService.getArticleQuickSel(Number(goodId), showLoader);
|
|
152
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
153
|
-
return this._boFactory.makeWithRawBackendData(Article, response.resultObject.oArticle[0]);
|
|
154
|
-
}
|
|
155
|
-
return null;
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
getArticleBySku(sku, branch) {
|
|
159
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
160
|
-
const goodId = yield this.getGoodIdFromSku(sku, true);
|
|
161
|
-
const article = yield this.getArticleQuickSel(goodId.toString()).catch(e => {
|
|
162
|
-
return Promise.reject(e);
|
|
163
|
-
});
|
|
164
|
-
this._appEventService.articleReceived.next(article);
|
|
165
|
-
this._article = article;
|
|
166
|
-
// Sometimes the sku is not returned in Article
|
|
167
|
-
this._article.sku = sku;
|
|
168
|
-
return article;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
initNodeInstance(goodId, showLoader = true) {
|
|
172
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
-
const response = yield this._configuratorService.initNodeInstance(Number(goodId), showLoader);
|
|
174
|
-
return this._handleInstanceResponse(response);
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
changeConnection(instanceId, oldConnection, newConnection, showLoader = true) {
|
|
178
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
-
const response = yield this._configuratorService.changeConnection(instanceId, oldConnection, newConnection, showLoader);
|
|
180
|
-
return response && response.validationResult && response.validationResult.success;
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
setInstance(instanceId, showLoader = false) {
|
|
184
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
-
const response = yield this._configuratorService.setInstanceToConfigure(instanceId, showLoader);
|
|
186
|
-
return this._handleInstanceResponse(response);
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
copyInstanceAndSaveOriginalConfiguration(instanceId, result) {
|
|
190
|
-
return this._copyInstance(instanceId, true, result);
|
|
191
|
-
}
|
|
192
|
-
copyInstanceAndLoseOriginalConfiguration(instanceId, result) {
|
|
193
|
-
return this._copyInstance(instanceId, false, result);
|
|
194
|
-
}
|
|
195
|
-
getQuestionAndAnswersAsync() {
|
|
196
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
197
|
-
const questionAndAnswers = yield this._configuratorService.getQuestionAndAnswersAsync();
|
|
198
|
-
// When using a full config template, we got some shit
|
|
199
|
-
// When we got a response with a question + answers, it means we got an option that got change by exceptions.
|
|
200
|
-
// Save the option for exception, update the selectorStructor and make sure the costumer knows which choice needs to be checked
|
|
201
|
-
if (questionAndAnswers.answers.length > 0 && this.article && this.article.showFullConfiguration) {
|
|
202
|
-
this._exceptionQuestionChanged = questionAndAnswers.question; // TODO we should change this
|
|
203
|
-
yield this.getSelectionsAsync();
|
|
204
|
-
}
|
|
205
|
-
questionAndAnswers.answers = questionAndAnswers.answers.filter(a => this._isAnswerPublished(a));
|
|
206
|
-
this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
|
|
207
|
-
if (questionAndAnswers.answers.length === 0) {
|
|
208
|
-
this.emptyAnswersAndQuestion();
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
this.activeQuestion = questionAndAnswers.question;
|
|
212
|
-
this.activeAnswers = questionAndAnswers.answers;
|
|
213
|
-
}
|
|
214
|
-
this.handleAnswersReceived();
|
|
215
|
-
return questionAndAnswers;
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
emptyAnswersAndQuestion() {
|
|
219
|
-
this.activeAnswers.length = 0;
|
|
220
|
-
this.activeQuestion = undefined;
|
|
221
|
-
}
|
|
222
|
-
handleAnswersReceived() {
|
|
223
|
-
this._preloadCachedImages(this.activeAnswers);
|
|
224
|
-
if (this.activeAnswers && this.activeAnswers.length > 0) {
|
|
225
|
-
this._loadPricesOfActiveAnswers();
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
getSelectionsAndDecos() {
|
|
229
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
230
|
-
const selectionsAndDecoPromise = [];
|
|
231
|
-
selectionsAndDecoPromise.push(this.getSelectionsAsync(), this.getDecosAsync());
|
|
232
|
-
yield Promise.all(selectionsAndDecoPromise);
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
getSelectionsAsync() {
|
|
236
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
237
|
-
let selections = [];
|
|
238
|
-
this.selections.length = 0;
|
|
239
|
-
const response = yield this._configuratorService.getSelectionsAsync();
|
|
240
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
241
|
-
selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, response.resultObjects);
|
|
242
|
-
}
|
|
243
|
-
if (this.article.showFullConfiguration) {
|
|
244
|
-
this._appEventService.configurationTemplateChange.next(ConfigurationTemplate.showFullConfiguration);
|
|
245
|
-
yield this._createSelectorFullConfiguration(selections);
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
this._appEventService.configurationTemplateChange.next(ConfigurationTemplate.default);
|
|
249
|
-
this._prepareSelections(selections);
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
getDecosAsync() {
|
|
254
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
255
|
-
const response = yield this._configuratorService.getDecosAsync();
|
|
256
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
257
|
-
this._decoNodes = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, response.resultObjects);
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
selectAnswer(answer, input) {
|
|
262
|
-
return this._configuratorService.selectAnswer(answer, false, input);
|
|
263
|
-
}
|
|
264
|
-
selectAnswerBySelection(selection, input) {
|
|
265
|
-
return this._configuratorService.selectAnswerBySelection(selection, input);
|
|
266
|
-
}
|
|
267
|
-
navigateTo(choseValue, showLoader = false) {
|
|
268
|
-
return this._configuratorService.navigateTo(choseValue, showLoader);
|
|
269
|
-
}
|
|
270
|
-
cancelAnswer(getAnswersAndQuestion = true) {
|
|
271
|
-
return this._configuratorService.cancelAnswer();
|
|
272
|
-
}
|
|
273
|
-
selectSelection(selection, forceBackToNode, after, connector) {
|
|
274
|
-
this._activeSelection = selection;
|
|
275
|
-
return this._configuratorService.selectSelection(selection, forceBackToNode, after, connector);
|
|
276
|
-
}
|
|
277
|
-
deleteSelection(selection) {
|
|
278
|
-
return this._configuratorService.deleteSelection(selection);
|
|
279
|
-
}
|
|
280
|
-
replaceSelection(selection) {
|
|
281
|
-
return this._configuratorService.replaceSelection(selection);
|
|
282
|
-
}
|
|
283
|
-
getAnswerPrices() {
|
|
284
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
285
|
-
try {
|
|
286
|
-
const response = yield this._configuratorService.getAnswersPrices();
|
|
287
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
288
|
-
if (response.resultObjects) {
|
|
289
|
-
return this._boFactory.makeBOArrayFromRawBackendDataArray(AnswerPrice, response.resultObjects);
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
return this._boFactory.makeBOArrayFromRawBackendDataArray(AnswerPrice, response.resultObject['activeNodesPr']);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
return [];
|
|
296
|
-
}
|
|
297
|
-
catch (e) {
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
extendWithAnswerTextAndImage(answer, showLoader = true) {
|
|
302
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
303
|
-
if (answer.nodeId) {
|
|
304
|
-
if (!this._imageCache.has(answer.nodeId)) {
|
|
305
|
-
this.getImageForAnswerOrSelection(answer, 4, true, showLoader).then((imageData) => {
|
|
306
|
-
this._handleImageReceived(answer, imageData);
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
answer.imageData = this._imageCache.get(answer.nodeId);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
const textAndImage = yield this.getSkipButtonImageAndText(answer.goodId);
|
|
315
|
-
answer.answer = textAndImage.oText;
|
|
316
|
-
answer.commercialAnswer = textAndImage.oText;
|
|
317
|
-
const image = textAndImage.oImage;
|
|
318
|
-
const imageData = yield this._configuratorService.getImage(image.key, 4, true, TableName.InternalParam);
|
|
319
|
-
answer.imageData = this._handleImageResponse(imageData);
|
|
320
|
-
// this.getSkipButtonImageAndText(answer.goodId).then((textAndImage) => {
|
|
321
|
-
// answer.answer = textAndImage.oText;
|
|
322
|
-
// answer.commercialAnswer = textAndImage.oText;
|
|
323
|
-
// const image: CoDocument = textAndImage.oImage;
|
|
324
|
-
//
|
|
325
|
-
// const imageBody: string = ImageUtils.getDocBodyWithMimeTypeDefinition(image.fileName, image.documentBody);
|
|
326
|
-
// answer.imageData = imageBody;
|
|
327
|
-
// });
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
getSkipButtonImageAndText(goodId) {
|
|
332
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
333
|
-
const response = yield this._configuratorService.getSkipButtonImageAndText(goodId, false);
|
|
334
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
335
|
-
return this._boFactory.makeWithRawBackendData(SkipButtonInfo, response.resultObject);
|
|
336
|
-
}
|
|
337
|
-
return null;
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
extendWithSelectionImage(selection, showLoader = true) {
|
|
341
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
342
|
-
if (selection.nodeId) {
|
|
343
|
-
if (!this._imageCache.has(selection.nodeId)) {
|
|
344
|
-
this.getImageForAnswerOrSelection(selection, 4, true, showLoader).then((imageData) => {
|
|
345
|
-
this._handleImageReceived(selection, imageData);
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
selection.imageData = this._imageCache.get(selection.nodeId);
|
|
350
|
-
}
|
|
351
|
-
this._prepareSelectionsToDisplayImages();
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
getImageForAnswerOrSelection(answerOrSelection, publication, thumbNail = true, showLoader = true) {
|
|
356
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
357
|
-
try {
|
|
358
|
-
const response = yield this._configuratorService.getImage(answerOrSelection.nodeId, publication, thumbNail);
|
|
359
|
-
return this._handleImageResponse(response);
|
|
360
|
-
}
|
|
361
|
-
catch (e) {
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
getMoodImageForInfoDialog(answerOrSelection, thumbNail = false) {
|
|
366
|
-
return this.getImageForAnswerOrSelection(answerOrSelection, 32, thumbNail);
|
|
367
|
-
}
|
|
368
|
-
getAnswerInfo(answer) {
|
|
369
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
370
|
-
const response = yield this._configuratorService.getAnswerTexts(answer.nodeId, false);
|
|
371
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
372
|
-
return this._boFactory.makeBOArrayFromRawBackendDataArray(ArticleText, response.resultObject);
|
|
373
|
-
}
|
|
374
|
-
return [];
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
getStructureInfo(answer) {
|
|
378
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
379
|
-
const response = yield this._configuratorService.getAnswerTexts(answer.artNodeId, false);
|
|
380
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
381
|
-
return this._boFactory.makeBOArrayFromRawBackendDataArray(ArticleText, response.resultObject);
|
|
382
|
-
}
|
|
383
|
-
return [];
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
getInternalParameter(parameter) {
|
|
387
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
388
|
-
try {
|
|
389
|
-
const response = yield this._configuratorService.getInternalParameterValue(parameter);
|
|
390
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
391
|
-
return response.resultObject;
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
return '';
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
catch (e) {
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
emptySelections() {
|
|
402
|
-
if (this.selections && this.selections.length > 0) {
|
|
403
|
-
this.selections.length = 0;
|
|
404
|
-
}
|
|
405
|
-
if (this.selectionsToDisplay && this.selectionsToDisplay.length > 0) {
|
|
406
|
-
this.selectionsToDisplay.length = 0;
|
|
407
|
-
}
|
|
408
|
-
if (this.decoNodes && this.decoNodes.length > 0) {
|
|
409
|
-
this.decoNodes.length = 0;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
saveConfigurations() {
|
|
413
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
414
|
-
const success = yield this._configuratorService.saveConfigurations();
|
|
415
|
-
if (!success) {
|
|
416
|
-
console.error('error saving configurations');
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
getDefaultLanguage(upId) {
|
|
421
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
422
|
-
return yield this._configuratorService.getDefaultLanguage(upId);
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
googleTranslateEnabled() {
|
|
426
|
-
return this._configuratorService.googleTranslateEnabled();
|
|
427
|
-
}
|
|
428
|
-
getGoogleTranslation(sourceLang, targetLang, list) {
|
|
429
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
430
|
-
return yield this._configuratorService.getGoogleTranslation(sourceLang, targetLang, list);
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
getImageForAnswer(selectedOption, showLoader = true) {
|
|
434
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
435
|
-
if (selectedOption.artNodeId) {
|
|
436
|
-
if (!this._imageCache.has(selectedOption.artNodeId)) {
|
|
437
|
-
this._configuratorService.getImageForSelectorStructure(selectedOption, 4, true, showLoader).then((imageData) => {
|
|
438
|
-
this._handleImageReceivedForSelectorStructure(selectedOption, imageData);
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
selectedOption.imageData = this._imageCache.get(selectedOption.artNodeId);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
else {
|
|
446
|
-
const textAndImage = yield this.getSkipButtonImageAndText(selectedOption.artId);
|
|
447
|
-
selectedOption.optionText = textAndImage.oText;
|
|
448
|
-
selectedOption.optionText = textAndImage.oText;
|
|
449
|
-
const image = textAndImage.oImage;
|
|
450
|
-
const imageData = yield this._configuratorService.getImage(image.key, 4, true, TableName.InternalParam);
|
|
451
|
-
selectedOption.imageData = this._handleImageResponse(imageData);
|
|
452
|
-
}
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
addToCart(goodId, goodType, quantity, instanceId, externalSource) {
|
|
456
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
457
|
-
let json;
|
|
458
|
-
const statistics = new ConfiguratorStatisticsEnvironment();
|
|
459
|
-
statistics.userType = 'Homedecorator';
|
|
460
|
-
statistics.transactionType = 'Sales';
|
|
461
|
-
statistics.actionDomain = 'Homedecorator';
|
|
462
|
-
statistics.sessionId = this._settingsService.settings.session ? this._settingsService.settings.session.sessionId : 'unknown';
|
|
463
|
-
statistics.webHost = window.location.host;
|
|
464
|
-
statistics.bundleHost = window.location.host;
|
|
465
|
-
json = yield this.getJsonConfiguredArticles(goodId, goodType, quantity, externalSource, true, instanceId, statistics);
|
|
466
|
-
const frozenArticle = JSON.parse(json);
|
|
467
|
-
// TODO
|
|
468
|
-
// this._googleTagManager.sendEvent(GoogleTagManagerEvent.AddToCart, {
|
|
469
|
-
// 'articleNr': frozenArticle.articleNr,
|
|
470
|
-
// 'product': frozenArticle.articleName,
|
|
471
|
-
// 'composition': frozenArticle instanceof FrozenArticle ? frozenArticle.compositions : frozenArticle.configurationText
|
|
472
|
-
// });
|
|
473
|
-
// this._messageService.emit(MessageType.ArticleCreated, json);
|
|
474
|
-
return json;
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
getJsonConfiguredArticles(goodId, goodType, quantity, externalSource = false, showLoader = true, instanceId, configuratorStatistics) {
|
|
478
|
-
return this._configuratorService.getJsonConfiguredArticles(goodId, goodType, quantity, externalSource, showLoader, instanceId, configuratorStatistics);
|
|
479
|
-
}
|
|
480
|
-
isSelectionPublished(selection) {
|
|
481
|
-
return this._getPublicationCode() === 2 ||
|
|
482
|
-
// tslint:disable-next-line:max-line-length
|
|
483
|
-
((isNill(selection.hierarchicalPublicationCode) || ((selection.hierarchicalPublicationCode & this._getPublicationCode()) > 0)) &&
|
|
484
|
-
((selection.nodeType === NodeType.Question && (((selection.questionPublicationCode & this._getPublicationCode()) > 0) ||
|
|
485
|
-
isNill(selection.questionPublicationCode))) ||
|
|
486
|
-
(selection.nodeType === NodeType.Answer && (((selection.answerPublicationCode & this._getPublicationCode()) > 0) ||
|
|
487
|
-
isNill(selection.answerPublicationCode)))));
|
|
488
|
-
}
|
|
489
|
-
_prepareSelections(selections) {
|
|
490
|
-
this._selections = selections.slice(0);
|
|
491
|
-
this._prepareSelectionsToDisplay();
|
|
492
|
-
let totalPrice = 0;
|
|
493
|
-
if (this._selections) {
|
|
494
|
-
this._selections.forEach(selection => {
|
|
495
|
-
totalPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
this._totalPrice = Math.round((totalPrice + Number.EPSILON) * 100) / 100;
|
|
499
|
-
this._currentSelections = this.selections.slice();
|
|
500
|
-
}
|
|
501
|
-
_prepareSelectionsToDisplay() {
|
|
502
|
-
this._prepareAnswersAndImages(this.selections);
|
|
503
|
-
const allSelections = this.selections.filter(s => this._isAllSelectionPublished(s));
|
|
504
|
-
this.selectionsToDisplay = allSelections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
|
|
505
|
-
this._appEventService.selectionsReceived.next(this.selections);
|
|
506
|
-
}
|
|
507
|
-
_prepareAnswersAndImages(selections) {
|
|
508
|
-
for (let i = 0; i < selections.length; i++) {
|
|
509
|
-
const selection = selections[i];
|
|
510
|
-
if (selection.presentationLevel === 1) {
|
|
511
|
-
this._handleSelectionAnswers(selection, selections);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
this._preloadCachedImages(this.selections);
|
|
515
|
-
}
|
|
516
|
-
_handleSelectionAnswers(selection, selections) {
|
|
517
|
-
const allAnswersFromSelection = selections.filter(s => s.parentArtNodeIdDeco && selection.nodeId && s.parentArtNodeIdDeco.toString() === selection.nodeId.toString());
|
|
518
|
-
const answersFromSelection = this._getUniqueAnswers(allAnswersFromSelection);
|
|
519
|
-
this._prepareSelectionsNextOptionValues(answersFromSelection);
|
|
520
|
-
selection.lastAnswer = (answersFromSelection.length > 0) && answersFromSelection[answersFromSelection.length - 1].answer ?
|
|
521
|
-
answersFromSelection[answersFromSelection.length - 1].answer.trim() :
|
|
522
|
-
'';
|
|
523
|
-
selection.lastAnswerNodeId = answersFromSelection.length > 0 ? answersFromSelection[answersFromSelection.length - 1].nodeId : undefined;
|
|
524
|
-
let answerTree;
|
|
525
|
-
let answerTreeString;
|
|
526
|
-
if (answersFromSelection.length > 0) {
|
|
527
|
-
answerTree = answersFromSelection
|
|
528
|
-
.filter(s => this._isAllSelectionPublished(s) || s.userInput)
|
|
529
|
-
.map((s, idx, arr) => {
|
|
530
|
-
return {
|
|
531
|
-
title: s.userInput ? (s.answer ? s.answer.trim() : '') : (s.question ? s.question.trim() : ''),
|
|
532
|
-
description: s.userInput ? (s.userInputValue ? s.userInputValue.trim() : '') : (s.answer ? s.answer.trim() : ''),
|
|
533
|
-
price: s.artRetailPrice
|
|
534
|
-
};
|
|
535
|
-
});
|
|
536
|
-
answerTreeString = answersFromSelection
|
|
537
|
-
.filter(s => this._isAllSelectionPublished(s) || s.userInput)
|
|
538
|
-
.map((s, idx, arr) => {
|
|
539
|
-
return s.userInput ? (s.userInputValue ? s.userInputValue.trim() : '') : (s.answer ? s.answer.trim() : '');
|
|
540
|
-
}).join(' - ');
|
|
541
|
-
}
|
|
542
|
-
selection.answerTreeString = answerTreeString;
|
|
543
|
-
if (answerTree) {
|
|
544
|
-
selection.answerTree = JSON.stringify(answerTree);
|
|
545
|
-
}
|
|
546
|
-
else {
|
|
547
|
-
selection.answerTree = JSON.stringify([{
|
|
548
|
-
title: selection.userInput ? (selection.answer ? selection.answer.trim() : '') : (selection.question ? selection.question.trim() : ''),
|
|
549
|
-
description: selection.userInput ? (selection.userInputValue ? selection.userInputValue.trim() : '') : (selection.answer ? selection.answer.trim() : ''),
|
|
550
|
-
price: selection.artRetailPrice
|
|
551
|
-
}]);
|
|
552
|
-
}
|
|
553
|
-
let totalPrice = 0; // temp fix until backend is ready
|
|
554
|
-
answersFromSelection.forEach((s) => {
|
|
555
|
-
totalPrice += s.artRetailPrice ? s.artRetailPrice : 0; // temp fix until backend is ready
|
|
556
|
-
});
|
|
557
|
-
selection.totalPrice = totalPrice; // temp fix until backend is ready
|
|
558
|
-
}
|
|
559
|
-
_isSelectionPublished(s) {
|
|
560
|
-
return (s.nodeType === NodeType.Question && (((s.optionShowOn & 2097152) > 0) || isNill(s.optionShowOn))) ||
|
|
561
|
-
(s.nodeType === NodeType.Answer && (((s.nodeShowOn & 2097152) > 0) || isNill(s.nodeShowOn)));
|
|
562
|
-
}
|
|
563
|
-
_isAllSelectionPublished(s) {
|
|
564
|
-
return (s.nodeType === NodeType.Question && (((s.optionShowOn & 2097152) > 0) || isNill(s.optionShowOn))) ||
|
|
565
|
-
(s.nodeType === NodeType.NextOptionValue && (((s.nodeShowOn & 2097152) > 0) || isNill(s.nodeShowOn))) ||
|
|
566
|
-
(s.nodeType === NodeType.Answer && (((s.nodeShowOn & 2097152) > 0) || isNill(s.nodeShowOn)));
|
|
567
|
-
}
|
|
568
|
-
_isAnswerPublished(a) {
|
|
569
|
-
return (isNill(a.hierarchicalPublicationCode) || ((a.hierarchicalPublicationCode & this._getPublicationCode()) > 0)) /* &&
|
|
570
|
-
(
|
|
571
|
-
(a.type === NodeType.Question && (((a.optionShowOn & 2097152) > 0) || isNill(a.optionShowOn))) ||
|
|
572
|
-
(a.type === NodeType.Answer && (((a.nodeShowOn & 2097152) > 0) || isNill(a.nodeShowOn)))
|
|
573
|
-
)*/;
|
|
574
|
-
}
|
|
575
|
-
_getPublicationCode() {
|
|
576
|
-
return this._configuratorService.getPublicationCodeBasedOnLogin();
|
|
577
|
-
}
|
|
578
|
-
_getUniqueAnswers(selections) {
|
|
579
|
-
if (!selections || selections.length === 0) {
|
|
580
|
-
return [];
|
|
581
|
-
}
|
|
582
|
-
const uniqueAnswers = new Map();
|
|
583
|
-
selections.forEach(selection => {
|
|
584
|
-
if (!uniqueAnswers.has(selection.nodeId)) {
|
|
585
|
-
uniqueAnswers.set(selection.nodeId, selection);
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
const existingSelection = uniqueAnswers.get(selection.nodeId);
|
|
589
|
-
existingSelection.artRetailPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
|
|
590
|
-
}
|
|
591
|
-
});
|
|
592
|
-
return Array.from(uniqueAnswers.values());
|
|
593
|
-
}
|
|
594
|
-
_preloadCachedImages(answersOrSelections) {
|
|
595
|
-
answersOrSelections.forEach((answerOrSelection) => {
|
|
596
|
-
if (answerOrSelection.nodeId) {
|
|
597
|
-
if (this._imageCache.has(answerOrSelection.nodeId)) {
|
|
598
|
-
answerOrSelection.imageData = this._imageCache.get(answerOrSelection.nodeId);
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
_handleInstanceResponse(response) {
|
|
604
|
-
if (response && response.validationResult && response.validationResult.success) {
|
|
605
|
-
this._appEventService.instanceSet.next(response.resultObject);
|
|
606
|
-
}
|
|
607
|
-
return response;
|
|
608
|
-
}
|
|
609
|
-
_prepareSelectionsNextOptionValues(selections) {
|
|
610
|
-
const len = selections.length - 1;
|
|
611
|
-
let novText = '';
|
|
612
|
-
for (let i = len; i >= 0; i--) {
|
|
613
|
-
const selection = selections[i];
|
|
614
|
-
if (selection.nodeType === NodeType.NextOptionValue) {
|
|
615
|
-
novText = selection.answer + (novText ? ` - ${novText}` : '');
|
|
616
|
-
}
|
|
617
|
-
else {
|
|
618
|
-
if (novText) {
|
|
619
|
-
selection.answerTreeString = `${selection.answer} - ${novText}`;
|
|
620
|
-
}
|
|
621
|
-
novText = '';
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
/*
|
|
626
|
-
*
|
|
627
|
-
* Show full config stuff
|
|
628
|
-
*
|
|
629
|
-
* */
|
|
630
|
-
_createSelectorFullConfiguration(selections) {
|
|
631
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
632
|
-
this._selections = selections.slice(0);
|
|
633
|
-
this._prepareSelectionsToDisplay();
|
|
634
|
-
let struct = [];
|
|
635
|
-
let totalPrice = 0;
|
|
636
|
-
if (this._selections) {
|
|
637
|
-
this._selections.forEach(selection => {
|
|
638
|
-
totalPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
this._totalPrice = Math.round((totalPrice + Number.EPSILON) * 100) / 100;
|
|
642
|
-
let selectorStructureList = [];
|
|
643
|
-
const selectorStructure = yield this._configuratorService.getSelectorStructure();
|
|
644
|
-
if (selectorStructure.validationResult.success) {
|
|
645
|
-
if (selectorStructure.resultObjects) {
|
|
646
|
-
selectorStructureList = selectorStructure.resultObjects;
|
|
647
|
-
}
|
|
648
|
-
else {
|
|
649
|
-
selectorStructureList = selectorStructure.resultObject['structures'];
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
const filteredList = selectorStructureList.filter(s => this._isStructurePublished(s));
|
|
653
|
-
struct = this._buildStructureThree(filteredList);
|
|
654
|
-
this._markLastNodeWithChildren(struct);
|
|
655
|
-
if (this._exceptionQuestionChanged) {
|
|
656
|
-
struct = this._linkExceptionToOption(this._exceptionQuestionChanged, struct);
|
|
657
|
-
}
|
|
658
|
-
this.selectionWithAnswers = struct;
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
_buildStructureThree(items) {
|
|
662
|
-
const map = {};
|
|
663
|
-
const structuredList = [];
|
|
664
|
-
items.forEach(item => {
|
|
665
|
-
const option = new SelectorWithOptions();
|
|
666
|
-
option.selector = item;
|
|
667
|
-
option.selectorOptions = [];
|
|
668
|
-
map[item.id] = option;
|
|
669
|
-
});
|
|
670
|
-
items.forEach(item => {
|
|
671
|
-
if (map[item.parentId]) {
|
|
672
|
-
map[item.parentId].selectorOptions.push(map[item.id]);
|
|
673
|
-
}
|
|
674
|
-
else {
|
|
675
|
-
structuredList.push(map[item.id]);
|
|
676
|
-
}
|
|
677
|
-
});
|
|
678
|
-
return structuredList;
|
|
679
|
-
}
|
|
680
|
-
_markLastNodeWithChildren(nodes) {
|
|
681
|
-
nodes.forEach(node => {
|
|
682
|
-
if (node.selectorOptions.length > 0) {
|
|
683
|
-
this._markLastNodeWithChildren(node.selectorOptions);
|
|
684
|
-
const lastElementWithChildren = node.selectorOptions.every(child => child.selectorOptions.length === 0);
|
|
685
|
-
if (lastElementWithChildren) {
|
|
686
|
-
node.lastNodeWithChildren = true;
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
});
|
|
690
|
-
}
|
|
691
|
-
_isStructurePublished(s) {
|
|
692
|
-
return (isNill(s.hierarchicalPublicationCode) || ((s.hierarchicalPublicationCode & this._getPublicationCode()) > 0));
|
|
693
|
-
}
|
|
694
|
-
// POSTCONDITION: current activeAnswers have price values.
|
|
695
|
-
_loadPricesOfActiveAnswers() {
|
|
696
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
697
|
-
const answerPrices = yield this.getAnswerPrices();
|
|
698
|
-
if (answerPrices) {
|
|
699
|
-
answerPrices.forEach(answerPrice => {
|
|
700
|
-
const answerMatch = this.activeAnswers.find(ans => ans.node === answerPrice.selId);
|
|
701
|
-
if (answerMatch) {
|
|
702
|
-
answerMatch.price = answerPrice.addRetailPrice;
|
|
703
|
-
this._appEventService.extraAnswerDataLoaded.next();
|
|
704
|
-
}
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
});
|
|
708
|
-
}
|
|
709
|
-
_cacheImage(id, imageDataOrUrl) {
|
|
710
|
-
this._imageCache.set(id, imageDataOrUrl);
|
|
711
|
-
}
|
|
712
|
-
_handleImageReceived(answerOrSelection, imageData) {
|
|
713
|
-
let imageDataOrUrl;
|
|
714
|
-
if (imageData) {
|
|
715
|
-
if (imageData.match(/data:image/) || imageData.startsWith('http') || imageData.startsWith('www')) {
|
|
716
|
-
imageDataOrUrl = imageData;
|
|
717
|
-
}
|
|
718
|
-
else {
|
|
719
|
-
if (this.assetPath && !this.assetPath.endsWith('/')) {
|
|
720
|
-
this.assetPath += '/';
|
|
721
|
-
}
|
|
722
|
-
if (imageData.startsWith('/')) {
|
|
723
|
-
imageData = imageData.substr(1, imageData.length);
|
|
724
|
-
}
|
|
725
|
-
imageDataOrUrl = (this.assetPath ? this.assetPath : '') + imageData;
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
answerOrSelection.imageData = imageDataOrUrl === undefined ? '' : imageDataOrUrl;
|
|
729
|
-
this._cacheImage(answerOrSelection.nodeId, imageDataOrUrl ? imageDataOrUrl : '');
|
|
730
|
-
}
|
|
731
|
-
_prepareSelectionsToDisplayImages() {
|
|
732
|
-
if (this.selectionsToDisplay && this.selectionsToDisplay.length > 0) {
|
|
733
|
-
for (let i = 0; i < this.selectionsToDisplay.length; i++) {
|
|
734
|
-
const selection = this.selectionsToDisplay[i];
|
|
735
|
-
const lastAnswerSelection = this._selections.find(s => s.nodeId === selection.lastAnswerNodeId);
|
|
736
|
-
if (lastAnswerSelection && (selection.generic || selection.grouped)) {
|
|
737
|
-
if (!lastAnswerSelection.imageData) {
|
|
738
|
-
this.getImageForAnswerOrSelection(lastAnswerSelection, 4, true, false).then((imageData) => {
|
|
739
|
-
this._handleImageReceived(lastAnswerSelection, imageData);
|
|
740
|
-
selection.imageDataLastAnswer = lastAnswerSelection.imageData;
|
|
741
|
-
});
|
|
742
|
-
}
|
|
743
|
-
else {
|
|
744
|
-
selection.imageDataLastAnswer = lastAnswerSelection.imageData;
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
_copyInstance(originalInstanceId, shouldSaveCurrentInstanceId, result) {
|
|
751
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
752
|
-
if (!result) {
|
|
753
|
-
result = new ConfigurationResultObject();
|
|
754
|
-
}
|
|
755
|
-
const copyInstanceResponse = yield this._configuratorService.copyInstance(originalInstanceId, shouldSaveCurrentInstanceId).catch((e) => {
|
|
756
|
-
if (e === 'ECONNABORTED' || e === undefined) {
|
|
757
|
-
result.resultType = ResultType.Timeout;
|
|
758
|
-
return Promise.reject(result);
|
|
759
|
-
}
|
|
760
|
-
result.resultType = ResultType.Unknown;
|
|
761
|
-
result.errorMessages.push(new ConfiguratorErrorMessage(copyInstanceResponse.resultObject.data));
|
|
762
|
-
return Promise.reject(result);
|
|
763
|
-
});
|
|
764
|
-
if (copyInstanceResponse.validationResult && !copyInstanceResponse.validationResult.success) {
|
|
765
|
-
if (copyInstanceResponse.validationResult.messages.map((m) => m.messageType === 'E') !== undefined) {
|
|
766
|
-
result.resultType = ResultType.ConfigurationNotFixed;
|
|
767
|
-
copyInstanceResponse.validationResult.messages.forEach(m => {
|
|
768
|
-
result.errorMessages.push(new ConfiguratorErrorMessage(m.message));
|
|
769
|
-
});
|
|
770
|
-
return Promise.reject(result);
|
|
771
|
-
}
|
|
772
|
-
else {
|
|
773
|
-
result.resultType = ResultType.ConfigurationPartiallyFixed;
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
const newInstanceId = copyInstanceResponse.resultObject;
|
|
777
|
-
this._handleInstanceResponse(copyInstanceResponse);
|
|
778
|
-
return Promise.resolve(newInstanceId);
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
_handleImageReceivedForSelectorStructure(option, imageData) {
|
|
782
|
-
let imageDataOrUrl;
|
|
783
|
-
if (imageData) {
|
|
784
|
-
if (imageData.match(/data:image/) || imageData.startsWith('http') || imageData.startsWith('www')) {
|
|
785
|
-
imageDataOrUrl = imageData;
|
|
786
|
-
}
|
|
787
|
-
else {
|
|
788
|
-
if (this.assetPath && !this.assetPath.endsWith('/')) {
|
|
789
|
-
this.assetPath += '/';
|
|
790
|
-
}
|
|
791
|
-
if (imageData.startsWith('/')) {
|
|
792
|
-
imageData = imageData.substr(1, imageData.length);
|
|
793
|
-
}
|
|
794
|
-
imageDataOrUrl = (this.assetPath ? this.assetPath : '') + imageData;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
option.imageData = imageDataOrUrl === undefined ? '' : imageDataOrUrl;
|
|
798
|
-
this._cacheImage(option.artNodeId, imageDataOrUrl ? imageDataOrUrl : '');
|
|
799
|
-
}
|
|
800
|
-
_handleImageResponse(response) {
|
|
801
|
-
if (response && response.validationResult && response.validationResult.success && response.resultObject) {
|
|
802
|
-
const imageContent = this._boFactory.makeWithRawBackendData(ImageContent, response.resultObject);
|
|
803
|
-
if (imageContent.image !== null && imageContent.image !== undefined && imageContent.image !== '') {
|
|
804
|
-
return imageContent.image;
|
|
805
|
-
}
|
|
806
|
-
else {
|
|
807
|
-
return '';
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
else {
|
|
811
|
-
return '';
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
_linkExceptionToOption(exceptionQuestion, struct) {
|
|
815
|
-
struct.forEach(struct => {
|
|
816
|
-
if (struct.selector.optId === exceptionQuestion.optionId) {
|
|
817
|
-
struct.markForExceptionNotification = true;
|
|
818
|
-
}
|
|
819
|
-
});
|
|
820
|
-
this._exceptionQuestionChanged = undefined; // reset
|
|
821
|
-
return struct;
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
ConfiguratorConnectorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ConfiguratorConnectorService, deps: [{ token: i1.ConfiguratorService }, { token: i2.AppEventService }, { token: i3.SettingsService }, { token: i4.LoaderService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
825
|
-
ConfiguratorConnectorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ConfiguratorConnectorService, providedIn: 'root' });
|
|
826
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ConfiguratorConnectorService, decorators: [{
|
|
827
|
-
type: Injectable,
|
|
828
|
-
args: [{ providedIn: 'root' }]
|
|
829
|
-
}], ctorParameters: function () { return [{ type: i1.ConfiguratorService }, { type: i2.AppEventService }, { type: i3.SettingsService }, { type: i4.LoaderService }]; } });
|
|
830
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29uZmlndXJhdG9yL3NyYy9saWIvc2VydmljZXMvY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBR3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUVwRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0RBQStELENBQUM7QUFDcEcsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBSzFFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDZEQUE2RCxDQUFDO0FBRWhHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUUvRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDNUUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx3REFBd0QsQ0FBQztBQUV0RixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDekUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXBELE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztB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ZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JTZXJ2aWNlfSBmcm9tICcuL2NvbmZpZ3VyYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtEYXRhU2VydmljZVJlc3BvbnNlRGF0YX0gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvZGF0YS1zZXJ2aWNlLXJlc3BvbnNlLWRhdGEnO1xyXG5pbXBvcnQge09wdGlvbnN9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL29wdGlvbnMnO1xyXG5pbXBvcnQge0FwcEV2ZW50U2VydmljZX0gZnJvbSAnLi9hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7QXJ0aWNsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlJztcclxuaW1wb3J0IHtCdXNpbmVzc09iamVjdEZhY3Rvcnl9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL3NlcnZpY2UvYnVzaW5lc3Mtb2JqZWN0LWZhY3RvcnknO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5cclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuXHJcbmltcG9ydCB7U2VsZWN0b3JTdHJ1Y3R1cmV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0b3Itc3RydWN0dXJlLmJvJztcclxuaW1wb3J0IHtTZWxlY3RvcldpdGhPcHRpb25zfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdG9yLXdpdGgtb3B0aW9ucyc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuaW1wb3J0IHtBbnN3ZXJQcmljZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXItcHJpY2UnO1xyXG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uJztcclxuaW1wb3J0IHtJbWFnZUNvbnRlbnR9IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpL2J1aWxkL21vZGVsL2ltYWdlLWNvbnRlbnQuYm8nO1xyXG5pbXBvcnQge0FydGljbGVUZXh0fSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2FydGljbGUtdGV4dC5ibyc7XHJcbmltcG9ydCB7U2tpcEJ1dHRvbkluZm99IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2tpcC1idXR0b24taW5mbyc7XHJcbmltcG9ydCB7SW50ZXJuYWxQYXJhbX0gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9pbnRlcm5hbC1wYXJhbS5lbnVtJztcclxuaW1wb3J0IHtEZWNvTm9kZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9kZWNvLW5vZGUnO1xyXG5pbXBvcnQge1Jlc3VsdFR5cGV9IGZyb20gJy4uL2VudW0vcmVzdWx0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7Q29Eb2N1bWVudH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9jby1kb2N1bWVudCc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRpb24tcmVzdWx0LW9iamVjdCc7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvblRlbXBsYXRlfSBmcm9tICcuLi9lbnVtL2NvbmZpZ3VyYXRpb24tdGVtcGxhdGUuZW51bSc7XHJcbmltcG9ydCB7VGFibGVOYW1lfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL3RhYmxlLW5hbWUuZW51bSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2V0dGluZ3N9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRvci1zZXR0aW5ncyc7XHJcbmltcG9ydCB7U2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL3NldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRlclNlcnZpY2V9IGZyb20gJy4vbG9hZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vbm9kZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvY29uZmlndXJhdG9yLXN0YXRpc3RpY3MtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge0Zyb3plbkFydGljbGVTaW1wbGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZnJvemVuLWFydGljbGUtc2ltcGxlJztcclxuaW1wb3J0IHtGcm96ZW5BcnRpY2xlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Zyb3plbi1hcnRpY2xlJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JFcnJvck1lc3NhZ2V9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRvci1lcnJvci1tZXNzYWdlJztcclxuXHJcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBnZXQgYXJ0aWNsZSgpOiBBcnRpY2xlIHtcclxuICAgIHJldHVybiB0aGlzLl9hcnRpY2xlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhcnRpY2xlKHZhbHVlOiBBcnRpY2xlKSB7XHJcbiAgICB0aGlzLl9hcnRpY2xlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGdldCBza3UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9za3U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9iamVjdFJlc3VsdCgpOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9vYmplY3RSZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9iamVjdFJlc3VsdCh2YWx1ZTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCkge1xyXG4gICAgdGhpcy5fb2JqZWN0UmVzdWx0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNlbGVjdGlvbnModmFsdWU6IFNlbGVjdGlvbltdKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlY29Ob2RlcygpOiBEZWNvTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvTm9kZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlY29Ob2Rlcyh2YWx1ZTogRGVjb05vZGVbXSkge1xyXG4gICAgdGhpcy5fZGVjb05vZGVzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRvdGFsUHJpY2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90b3RhbFByaWNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50U2VsZWN0aW9ucygpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFjdGl2ZVNlbGVjdGlvbigpOiBTZWxlY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYWN0aXZlU2VsZWN0aW9uKHZhbHVlOiBTZWxlY3Rpb24pIHtcclxuICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzZWxlY3Rpb25XaXRoQW5zd2Vycyh2YWx1ZTogU2VsZWN0b3JXaXRoT3B0aW9uc1tdKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25XaXRoQW5zd2VycyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3Rpb25XaXRoQW5zd2VycygpOiBTZWxlY3RvcldpdGhPcHRpb25zW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbldpdGhBbnN3ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzaG91bGRTaG93TG9hZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZFNob3dMb2FkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29udHJvbGxlckluaXRpYWxpemVkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgc3RhbmRBbG9uZUluc3RhbmNlOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgY29ubmVjdGlvblJlc2V0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHNlbGVjdGlvbnNUb0Rpc3BsYXk6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHVibGljIGFjdGl2ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICBwdWJsaWMgYWN0aXZlQW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuICBwdWJsaWMgYXNzZXRQYXRoOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudFNlbGVjdGlvbnM6IFNlbGVjdGlvbltdO1xyXG4gIHByaXZhdGUgX2FjdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uO1xyXG4gIHByaXZhdGUgX3NlbGVjdGlvbldpdGhBbnN3ZXJzOiBTZWxlY3RvcldpdGhPcHRpb25zW107XHJcbiAgcHJpdmF0ZSBfZGVjb05vZGVzOiBEZWNvTm9kZVtdO1xyXG4gIHByaXZhdGUgX2FydGljbGU6IEFydGljbGU7XHJcbiAgcHJpdmF0ZSBfc2t1OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfb2JqZWN0UmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0O1xyXG4gIHByaXZhdGUgX3RvdGFsUHJpY2U6IG51bWJlcjtcclxuICBwcml2YXRlIF9pbWFnZUNhY2hlOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwcml2YXRlIF9leGNlcHRpb25RdWVzdGlvbkNoYW5nZWQ6IEFuc3dlcjtcclxuXHJcbiAgcHJpdmF0ZSBfc2hvdWxkU2hvd0xvYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIF9jb25uZWN0b3JPcHRpb25zOiBPcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U6IENvbmZpZ3VyYXRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBFdmVudFNlcnZpY2U6IEFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbG9hZGVyU2VydmljZTogTG9hZGVyU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCk7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0Q29ubmVjdGlvbihmb3JjZVJlbG9hZD86IGJvb2xlYW4sIHN0YW5kQWxvbmU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCh0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9pbml0aWFsaXppbmcpICYmICFmb3JjZVJlbG9hZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsaXppbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2V0dGluZ3M6IENvbmZpZ3VyYXRvclNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzO1xyXG4gICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1NldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9jb25uZWN0b3JPcHRpb25zID0gT2JqZWN0LmFzc2lnbihuZXcgT3B0aW9ucygpLCBzZXR0aW5ncyk7XHJcblxyXG4gICAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zaG93TG9hZGVyLnN1YnNjcmliZShzaG93TG9hZGVyID0+IHRoaXMub25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXIpKSxcclxuICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmNvbm5lY3Rpb25SZXNldC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkNvbm5lY3Rpb25SZXNldCgpKVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXRDb25uZWN0b3IodGhpcy5fY29ubmVjdG9yT3B0aW9ucywgZm9yY2VSZWxvYWQpO1xyXG4gICAgICBhd2FpdCB0aGlzLl9zZXR0aW5nc1NlcnZpY2UuY2hlY2tBZGRpdGlvbmFsUGFyYW1ldGVycygpO1xyXG5cclxuICAgICAgdGhpcy5jb250cm9sbGVySW5pdGlhbGl6ZWQubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9pbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChzaG93TG9hZGVyKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sb2FkZXJTZXJ2aWNlLnNob3dMb2FkZXIgPSBzaG93TG9hZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29ubmVjdGlvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25uZWN0aW9uUmVzZXQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdvb2RJZEZyb21Ta3Uoc2t1OiBzdHJpbmcsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEdvb2RJZEZyb21Ta3Uoc2t1LCBzaG93TG9hZGVyKTtcclxuICAgIHRoaXMuX3NrdSA9IHNrdTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSkge1xyXG4gICAgLy8gdGhpcy5fc2VsZWN0aW9ucyA9IHZhbHVlO1xyXG4gICAgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVjb05vZGVzKHZhbHVlOiBEZWNvTm9kZVtdKSB7XHJcbiAgICB0aGlzLl9kZWNvTm9kZXMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkOiBzdHJpbmcsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEFydGljbGVRdWlja1NlbChOdW1iZXIoZ29vZElkKSwgc2hvd0xvYWRlcik7XHJcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGUsIHJlc3BvbnNlLnJlc3VsdE9iamVjdC5vQXJ0aWNsZVswXSkgYXMgQXJ0aWNsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVCeVNrdShza3U6IHN0cmluZywgYnJhbmNoOiBzdHJpbmcpOiBQcm9taXNlPEFydGljbGU+IHtcclxuICAgIGNvbnN0IGdvb2RJZDogbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRHb29kSWRGcm9tU2t1KHNrdSwgdHJ1ZSk7XHJcbiAgICBjb25zdCBhcnRpY2xlOiBBcnRpY2xlID0gYXdhaXQgdGhpcy5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLnRvU3RyaW5nKCkpLmNhdGNoKGUgPT4ge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hcnRpY2xlUmVjZWl2ZWQubmV4dChhcnRpY2xlKTtcclxuICAgIHRoaXMuX2FydGljbGUgPSBhcnRpY2xlO1xyXG4gICAgLy8gU29tZXRpbWVzIHRoZSBza3UgaXMgbm90IHJldHVybmVkIGluIEFydGljbGVcclxuICAgIHRoaXMuX2FydGljbGUuc2t1ID0gc2t1O1xyXG4gICAgcmV0dXJuIGFydGljbGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdE5vZGVJbnN0YW5jZShnb29kSWQ6IHN0cmluZywgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UoTnVtYmVyKGdvb2RJZCksIHNob3dMb2FkZXIpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZDogc3RyaW5nLCBvbGRDb25uZWN0aW9uOiBzdHJpbmcsIG5ld0Nvbm5lY3Rpb246IHN0cmluZywgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuY2hhbmdlQ29ubmVjdGlvbihpbnN0YW5jZUlkLCBvbGRDb25uZWN0aW9uLCBuZXdDb25uZWN0aW9uLCBzaG93TG9hZGVyKTtcclxuICAgIHJldHVybiByZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRJbnN0YW5jZShpbnN0YW5jZUlkOiBzdHJpbmcsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2Uuc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShpbnN0YW5jZUlkLCBzaG93TG9hZGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9oYW5kbGVJbnN0YW5jZVJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5SW5zdGFuY2VBbmRTYXZlT3JpZ2luYWxDb25maWd1cmF0aW9uKGluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb3B5SW5zdGFuY2UoaW5zdGFuY2VJZCwgdHJ1ZSwgcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5SW5zdGFuY2VBbmRMb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uKGluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb3B5SW5zdGFuY2UoaW5zdGFuY2VJZCwgZmFsc2UsIHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzQXN5bmMoKTogUHJvbWlzZTxRdWVzdGlvbkFuZEFuc3dlcnM+IHtcclxuICAgIGNvbnN0IHF1ZXN0aW9uQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRRdWVzdGlvbkFuZEFuc3dlcnNBc3luYygpO1xyXG5cclxuICAgIC8vIFdoZW4gdXNpbmcgYSBmdWxsIGNvbmZpZyB0ZW1wbGF0ZSwgd2UgZ290IHNvbWUgc2hpdFxyXG4gICAgLy8gV2hlbiB3ZSBnb3QgYSByZXNwb25zZSB3aXRoIGEgcXVlc3Rpb24gKyBhbnN3ZXJzLCBpdCBtZWFucyB3ZSBnb3QgYW4gb3B0aW9uIHRoYXQgZ290IGNoYW5nZSBieSBleGNlcHRpb25zLlxyXG4gICAgLy8gU2F2ZSB0aGUgb3B0aW9uIGZvciBleGNlcHRpb24sIHVwZGF0ZSB0aGUgc2VsZWN0b3JTdHJ1Y3RvciBhbmQgbWFrZSBzdXJlIHRoZSBjb3N0dW1lciBrbm93cyB3aGljaCBjaG9pY2UgbmVlZHMgdG8gYmUgY2hlY2tlZFxyXG4gICAgaWYgKHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5hcnRpY2xlICYmIHRoaXMuYXJ0aWNsZS5zaG93RnVsbENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5fZXhjZXB0aW9uUXVlc3Rpb25DaGFuZ2VkID0gcXVlc3Rpb25BbmRBbnN3ZXJzLnF1ZXN0aW9uIGFzIGFueTsgLy8gVE9ETyB3ZSBzaG91bGQgY2hhbmdlIHRoaXNcclxuICAgICAgYXdhaXQgdGhpcy5nZXRTZWxlY3Rpb25zQXN5bmMoKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2VycyA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzLmZpbHRlcihhID0+IHRoaXMuX2lzQW5zd2VyUHVibGlzaGVkKGEpKTtcclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5lbXB0eUFuc3dlcnNBbmRRdWVzdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVRdWVzdGlvbiA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbjtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gcXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhbmRsZUFuc3dlcnNSZWNlaXZlZCgpO1xyXG5cclxuICAgIHJldHVybiBxdWVzdGlvbkFuZEFuc3dlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlBbnN3ZXJzQW5kUXVlc3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUFuc3dlcnMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuYWN0aXZlUXVlc3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJlbG9hZENhY2hlZEltYWdlcyh0aGlzLmFjdGl2ZUFuc3dlcnMpO1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlQW5zd2VycyAmJiB0aGlzLmFjdGl2ZUFuc3dlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9sb2FkUHJpY2VzT2ZBY3RpdmVBbnN3ZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTZWxlY3Rpb25zQW5kRGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2U6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICBzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2UucHVzaCh0aGlzLmdldFNlbGVjdGlvbnNBc3luYygpLCB0aGlzLmdldERlY29zQXN5bmMoKSk7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNlbGVjdGlvbnNBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9IDA7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnNBc3luYygpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHNlbGVjdGlvbnMgPSB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShTZWxlY3Rpb24sIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIFNlbGVjdGlvbltdO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXJ0aWNsZS5zaG93RnVsbENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmNvbmZpZ3VyYXRpb25UZW1wbGF0ZUNoYW5nZS5uZXh0KENvbmZpZ3VyYXRpb25UZW1wbGF0ZS5zaG93RnVsbENvbmZpZ3VyYXRpb24pO1xyXG4gICAgICBhd2FpdCB0aGlzLl9jcmVhdGVTZWxlY3RvckZ1bGxDb25maWd1cmF0aW9uKHNlbGVjdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmNvbmZpZ3VyYXRpb25UZW1wbGF0ZUNoYW5nZS5uZXh0KENvbmZpZ3VyYXRpb25UZW1wbGF0ZS5kZWZhdWx0KTtcclxuICAgICAgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGVjb3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0RGVjb3NBc3luYygpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHRoaXMuX2RlY29Ob2RlcyA9IHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KERlY29Ob2RlLCByZXNwb25zZS5yZXN1bHRPYmplY3RzKSBhcyBEZWNvTm9kZVtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdEFuc3dlcihhbnN3ZXI6IEFuc3dlciwgaW5wdXQ/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBmYWxzZSwgaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdEFuc3dlckJ5U2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBpbnB1dD86IHN0cmluZyk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdEFuc3dlckJ5U2VsZWN0aW9uKHNlbGVjdGlvbiwgaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5hdmlnYXRlVG8oY2hvc2VWYWx1ZTogU2VsZWN0b3JTdHJ1Y3R1cmUsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLm5hdmlnYXRlVG8oY2hvc2VWYWx1ZSwgc2hvd0xvYWRlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsQW5zd2VyKGdldEFuc3dlcnNBbmRRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5jYW5jZWxBbnN3ZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbixcclxuICAgIGZvcmNlQmFja1RvTm9kZT86IGJvb2xlYW4sXHJcbiAgICBhZnRlcj86IGJvb2xlYW4sXHJcbiAgICBjb25uZWN0b3I/OiBzdHJpbmdcclxuICApOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RTZWxlY3Rpb24oc2VsZWN0aW9uLCBmb3JjZUJhY2tUb05vZGUsIGFmdGVyLCBjb25uZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmRlbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5yZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QW5zd2VyUHJpY2VzKCk6IFByb21pc2U8QW5zd2VyUHJpY2VbXT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBbnN3ZXJzUHJpY2VzKCk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRPYmplY3RzKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoQW5zd2VyUHJpY2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIEFuc3dlclByaWNlW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShBbnN3ZXJQcmljZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0WydhY3RpdmVOb2Rlc1ByJ10pIGFzIEFuc3dlclByaWNlW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleHRlbmRXaXRoQW5zd2VyVGV4dEFuZEltYWdlKGFuc3dlcjogQW5zd2VyLCBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGFuc3dlci5ub2RlSWQpIHtcclxuICAgICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhhbnN3ZXIubm9kZUlkKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihhbnN3ZXIsIDQsIHRydWUsIHNob3dMb2FkZXIpLnRoZW4oKGltYWdlRGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVJbWFnZVJlY2VpdmVkKGFuc3dlciwgaW1hZ2VEYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQoYW5zd2VyLm5vZGVJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRleHRBbmRJbWFnZTogU2tpcEJ1dHRvbkluZm8gPSBhd2FpdCB0aGlzLmdldFNraXBCdXR0b25JbWFnZUFuZFRleHQoYW5zd2VyLmdvb2RJZCk7XHJcbiAgICAgIGFuc3dlci5hbnN3ZXIgPSB0ZXh0QW5kSW1hZ2Uub1RleHQ7XHJcbiAgICAgIGFuc3dlci5jb21tZXJjaWFsQW5zd2VyID0gdGV4dEFuZEltYWdlLm9UZXh0O1xyXG4gICAgICBjb25zdCBpbWFnZTogQ29Eb2N1bWVudCA9IHRleHRBbmRJbWFnZS5vSW1hZ2U7XHJcbiAgICAgIGNvbnN0IGltYWdlRGF0YTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEltYWdlKGltYWdlLmtleSwgNCwgdHJ1ZSwgVGFibGVOYW1lLkludGVybmFsUGFyYW0pO1xyXG4gICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGhpcy5faGFuZGxlSW1hZ2VSZXNwb25zZShpbWFnZURhdGEpO1xyXG5cclxuICAgICAgLy8gdGhpcy5nZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KGFuc3dlci5nb29kSWQpLnRoZW4oKHRleHRBbmRJbWFnZSkgPT4ge1xyXG4gICAgICAvLyAgIGFuc3dlci5hbnN3ZXIgPSB0ZXh0QW5kSW1hZ2Uub1RleHQ7XHJcbiAgICAgIC8vICAgYW5zd2VyLmNvbW1lcmNpYWxBbnN3ZXIgPSB0ZXh0QW5kSW1hZ2Uub1RleHQ7XHJcbiAgICAgIC8vICAgY29uc3QgaW1hZ2U6IENvRG9jdW1lbnQgPSB0ZXh0QW5kSW1hZ2Uub0ltYWdlO1xyXG4gICAgICAvL1xyXG4gICAgICAvLyAgIGNvbnN0IGltYWdlQm9keTogc3RyaW5nID0gSW1hZ2VVdGlscy5nZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihpbWFnZS5maWxlTmFtZSwgaW1hZ2UuZG9jdW1lbnRCb2R5KTtcclxuICAgICAgLy8gICBhbnN3ZXIuaW1hZ2VEYXRhID0gaW1hZ2VCb2R5O1xyXG4gICAgICAvLyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8U2tpcEJ1dHRvbkluZm8+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0U2tpcEJ1dHRvbkltYWdlQW5kVGV4dChnb29kSWQsIGZhbHNlKTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoU2tpcEJ1dHRvbkluZm8sIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkgYXMgU2tpcEJ1dHRvbkluZm87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleHRlbmRXaXRoU2VsZWN0aW9uSW1hZ2Uoc2VsZWN0aW9uOiBTZWxlY3Rpb24sIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2VsZWN0aW9uLm5vZGVJZCkge1xyXG4gICAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHNlbGVjdGlvbi5ub2RlSWQpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRJbWFnZUZvckFuc3dlck9yU2VsZWN0aW9uKHNlbGVjdGlvbiwgNCwgdHJ1ZSwgc2hvd0xvYWRlcikudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWQoc2VsZWN0aW9uLCBpbWFnZURhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbi5pbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChzZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheUltYWdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oXHJcbiAgICBhbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyIHwgU2VsZWN0aW9uLFxyXG4gICAgcHVibGljYXRpb246IG51bWJlcixcclxuICAgIHRodW1iTmFpbDogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZVxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEltYWdlKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCwgcHVibGljYXRpb24sIHRodW1iTmFpbCk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVJbWFnZVJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb29kSW1hZ2VGb3JJbmZvRGlhbG9nKGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24sIHRodW1iTmFpbDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oYW5zd2VyT3JTZWxlY3Rpb24sIDMyLCB0aHVtYk5haWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFuc3dlckluZm8oYW5zd2VyOiBBbnN3ZXIpOiBQcm9taXNlPEFydGljbGVUZXh0W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0QW5zd2VyVGV4dHMoYW5zd2VyLm5vZGVJZCwgZmFsc2UpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShBcnRpY2xlVGV4dCwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KSBhcyBBcnRpY2xlVGV4dFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFN0cnVjdHVyZUluZm8oYW5zd2VyOiBTZWxlY3RvclN0cnVjdHVyZSk6IFByb21pc2U8QXJ0aWNsZVRleHRbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBbnN3ZXJUZXh0cyhhbnN3ZXIuYXJ0Tm9kZUlkLCBmYWxzZSk7XHJcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KEFydGljbGVUZXh0LCByZXNwb25zZS5yZXN1bHRPYmplY3QpIGFzIEFydGljbGVUZXh0W107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0SW50ZXJuYWxQYXJhbWV0ZXIocGFyYW1ldGVyOiBJbnRlcm5hbFBhcmFtKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0SW50ZXJuYWxQYXJhbWV0ZXJWYWx1ZShwYXJhbWV0ZXIpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVtcHR5U2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMgJiYgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5ICYmIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGVjb05vZGVzICYmIHRoaXMuZGVjb05vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kZWNvTm9kZXMubGVuZ3RoID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzYXZlQ29uZmlndXJhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zYXZlQ29uZmlndXJhdGlvbnMoKTtcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBzYXZpbmcgY29uZmlndXJhdGlvbnMnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWZhdWx0TGFuZ3VhZ2UodXBJZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldERlZmF1bHRMYW5ndWFnZSh1cElkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnb29nbGVUcmFuc2xhdGVFbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ29vZ2xlVHJhbnNsYXRlRW5hYmxlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdvb2dsZVRyYW5zbGF0aW9uKHNvdXJjZUxhbmc6IHN0cmluZywgdGFyZ2V0TGFuZzogc3RyaW5nLCBsaXN0OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRHb29nbGVUcmFuc2xhdGlvbihzb3VyY2VMYW5nLCB0YXJnZXRMYW5nLCBsaXN0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbWFnZUZvckFuc3dlcihzZWxlY3RlZE9wdGlvbjogU2VsZWN0b3JTdHJ1Y3R1cmUsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24uYXJ0Tm9kZUlkKSB7XHJcbiAgICAgIGlmICghdGhpcy5faW1hZ2VDYWNoZS5oYXMoc2VsZWN0ZWRPcHRpb24uYXJ0Tm9kZUlkKSkge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0SW1hZ2VGb3JTZWxlY3RvclN0cnVjdHVyZShzZWxlY3RlZE9wdGlvbiwgNCwgdHJ1ZSwgc2hvd0xvYWRlcikudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWRGb3JTZWxlY3RvclN0cnVjdHVyZShzZWxlY3RlZE9wdGlvbiwgaW1hZ2VEYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RlZE9wdGlvbi5pbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChzZWxlY3RlZE9wdGlvbi5hcnROb2RlSWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0ZXh0QW5kSW1hZ2U6IFNraXBCdXR0b25JbmZvID0gYXdhaXQgdGhpcy5nZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KHNlbGVjdGVkT3B0aW9uLmFydElkKTtcclxuICAgICAgc2VsZWN0ZWRPcHRpb24ub3B0aW9uVGV4dCA9IHRleHRBbmRJbWFnZS5vVGV4dDtcclxuICAgICAgc2VsZWN0ZWRPcHRpb24ub3B0aW9uVGV4dCA9IHRleHRBbmRJbWFnZS5vVGV4dDtcclxuICAgICAgY29uc3QgaW1hZ2U6IENvRG9jdW1lbnQgPSB0ZXh0QW5kSW1hZ2Uub0ltYWdlO1xyXG4gICAgICBjb25zdCBpbWFnZURhdGE6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRJbWFnZShpbWFnZS5rZXksIDQsIHRydWUsIFRhYmxlTmFtZS5JbnRlcm5hbFBhcmFtKTtcclxuICAgICAgc2VsZWN0ZWRPcHRpb24uaW1hZ2VEYXRhID0gdGhpcy5faGFuZGxlSW1hZ2VSZXNwb25zZShpbWFnZURhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFkZFRvQ2FydChnb29kSWQ6IG51bWJlciwgZ29vZFR5cGU6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciwgaW5zdGFuY2VJZDogc3RyaW5nLCBleHRlcm5hbFNvdXJjZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQganNvbjogc3RyaW5nO1xyXG4gICAgY29uc3Qgc3RhdGlzdGljczogQ29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50ID0gbmV3IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCgpO1xyXG4gICAgc3RhdGlzdGljcy51c2VyVHlwZSA9ICdIb21lZGVjb3JhdG9yJztcclxuICAgIHN0YXRpc3RpY3MudHJhbnNhY3Rpb25UeXBlID0gJ1NhbGVzJztcclxuICAgIHN0YXRpc3RpY3MuYWN0aW9uRG9tYWluID0gJ0hvbWVkZWNvcmF0b3InO1xyXG4gICAgc3RhdGlzdGljcy5zZXNzaW9uSWQgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2Vzc2lvbiA/IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zZXNzaW9uLnNlc3Npb25JZCA6ICd1bmtub3duJztcclxuICAgIHN0YXRpc3RpY3Mud2ViSG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xyXG4gICAgc3RhdGlzdGljcy5idW5kbGVIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgICBqc29uID0gYXdhaXQgdGhpcy5nZXRKc29uQ29uZmlndXJlZEFydGljbGVzKGdvb2RJZCwgZ29vZFR5cGUsIHF1YW50aXR5LCBleHRlcm5hbFNvdXJjZSwgdHJ1ZSwgaW5zdGFuY2VJZCwgc3RhdGlzdGljcyk7XHJcbiAgICBjb25zdCBmcm96ZW5BcnRpY2xlOiBGcm96ZW5BcnRpY2xlU2ltcGxlIHwgRnJvemVuQXJ0aWNsZSA9IEpTT04ucGFyc2UoanNvbik7XHJcblxyXG4gICAgLy8gVE9ET1xyXG4gICAgLy8gdGhpcy5fZ29vZ2xlVGFnTWFuYWdlci5zZW5kRXZlbnQoR29vZ2xlVGFnTWFuYWdlckV2ZW50LkFkZFRvQ2FydCwge1xyXG4gICAgLy8gICAnYXJ0aWNsZU5yJzogZnJvemVuQXJ0aWNsZS5hcnRpY2xlTnIsXHJcbiAgICAvLyAgICdwcm9kdWN0JzogZnJvemVuQXJ0aWNsZS5hcnRpY2xlTmFtZSxcclxuICAgIC8vICAgJ2NvbXBvc2l0aW9uJzogZnJvemVuQXJ0aWNsZSBpbnN0YW5jZW9mIEZyb3plbkFydGljbGUgPyBmcm96ZW5BcnRpY2xlLmNvbXBvc2l0aW9ucyA6IGZyb3plbkFydGljbGUuY29uZmlndXJhdGlvblRleHRcclxuICAgIC8vIH0pO1xyXG5cclxuICAgIC8vIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQXJ0aWNsZUNyZWF0ZWQsIGpzb24pO1xyXG4gICAgcmV0dXJuIGpzb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhcclxuICAgIGdvb2RJZDogbnVtYmVyLFxyXG4gICAgZ29vZFR5cGU6IHN0cmluZyxcclxuICAgIHF1YW50aXR5OiBudW1iZXIsXHJcbiAgICBleHRlcm5hbFNvdXJjZTogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBpbnN0YW5jZUlkPzogc3RyaW5nLFxyXG4gICAgY29uZmlndXJhdG9yU3RhdGlzdGljcz86IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRKc29uQ29uZmlndXJlZEFydGljbGVzKFxyXG4gICAgICBnb29kSWQsXHJcbiAgICAgIGdvb2RUeXBlLFxyXG4gICAgICBxdWFudGl0eSxcclxuICAgICAgZXh0ZXJuYWxTb3VyY2UsXHJcbiAgICAgIHNob3dMb2FkZXIsXHJcbiAgICAgIGluc3RhbmNlSWQsXHJcbiAgICAgIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3NcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRQdWJsaWNhdGlvbkNvZGUoKSA9PT0gMiB8fFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIChcclxuICAgICAgICAoaXNOaWxsKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUpIHx8ICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKSAmJlxyXG4gICAgICAgIChcclxuICAgICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHNlbGVjdGlvbi5xdWVzdGlvblB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApIHx8XHJcbiAgICAgICAgICAgIGlzTmlsbChzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUpKSkgfHxcclxuICAgICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJiAoKChzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlICYgdGhpcy5fZ2V0UHVibGljYXRpb25Db2RlKCkpID4gMCkgfHxcclxuICAgICAgICAgICAgaXNOaWxsKHNlbGVjdGlvbi5hbnN3ZXJQdWJsaWNhdGlvbkNvZGUpKSlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0aW9ucyA9IHNlbGVjdGlvbnMuc2xpY2UoMCk7XHJcbiAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheSgpO1xyXG4gICAgbGV0IHRvdGFsUHJpY2UgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbnMpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgdG90YWxQcmljZSArPSBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgPyBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgOiAwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3RvdGFsUHJpY2UgPSBNYXRoLnJvdW5kKCh0b3RhbFByaWNlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcclxuICAgIHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25zID0gdGhpcy5zZWxlY3Rpb25zLnNsaWNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXBhcmVBbnN3ZXJzQW5kSW1hZ2VzKHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCBhbGxTZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IHRoaXMuc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB0aGlzLl9pc0FsbFNlbGVjdGlvblB1Ymxpc2hlZChzKSk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXkgPSBhbGxTZWxlY3Rpb25zLmZpbHRlcihzID0+IHMubm9kZVR5cGUgIT09IE5vZGVUeXBlLkFydGljbGUgJiYgcy5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSk7XHJcbiAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2Uuc2VsZWN0aW9uc1JlY2VpdmVkLm5leHQodGhpcy5zZWxlY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVBbnN3ZXJzQW5kSW1hZ2VzKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0aW9uQW5zd2VycyhzZWxlY3Rpb24sIHNlbGVjdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmVsb2FkQ2FjaGVkSW1hZ2VzKHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVTZWxlY3Rpb25BbnN3ZXJzKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgY29uc3QgYWxsQW5zd2Vyc0Zyb21TZWxlY3Rpb246IFNlbGVjdGlvbltdID0gc2VsZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgIHMgPT4gcy5wYXJlbnRBcnROb2RlSWREZWNvICYmIHNlbGVjdGlvbi5ub2RlSWQgJiYgcy5wYXJlbnRBcnROb2RlSWREZWNvLnRvU3RyaW5nKCkgPT09IHNlbGVjdGlvbi5ub2RlSWQudG9TdHJpbmcoKSk7XHJcbiAgICBjb25zdCBhbnN3ZXJzRnJvbVNlbGVjdGlvbjogU2VsZWN0aW9uW10gPSB0aGlzLl9nZXRVbmlxdWVBbnN3ZXJzKGFsbEFuc3dlcnNGcm9tU2VsZWN0aW9uKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zTmV4dE9wdGlvblZhbHVlcyhhbnN3ZXJzRnJvbVNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubGFzdEFuc3dlciA9IChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSAmJiBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIgP1xyXG4gICAgICBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIudHJpbSgpIDpcclxuICAgICAgJyc7XHJcbiAgICBzZWxlY3Rpb24ubGFzdEFuc3dlck5vZGVJZCA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uLmxlbmd0aCA+IDAgPyBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5ub2RlSWQgOiB1bmRlZmluZWQ7XHJcbiAgICBsZXQgYW5zd2VyVHJlZTogYW55O1xyXG4gICAgbGV0IGFuc3dlclRyZWVTdHJpbmc6IHN0cmluZztcclxuICAgIGlmIChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFuc3dlclRyZWUgPSBhbnN3ZXJzRnJvbVNlbGVjdGlvblxyXG4gICAgICAgIC5maWx0ZXIocyA9PiB0aGlzLl9pc0FsbFNlbGVjdGlvblB1Ymxpc2hlZChzKSB8fCBzLnVzZXJJbnB1dClcclxuICAgICAgICAubWFwKChzOiBTZWxlY3Rpb24sIGlkeDogbnVtYmVyLCBhcnI6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aXRsZTogcy51c2VySW5wdXQgPyAocy5hbnN3ZXIgPyBzLmFuc3dlci50cmltKCkgOiAnJykgOiAocy5xdWVzdGlvbiA/IHMucXVlc3Rpb24udHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcy51c2VySW5wdXQgPyAocy51c2VySW5wdXRWYWx1ZSA/IHMudXNlcklucHV0VmFsdWUudHJpbSgpIDogJycpIDogKHMuYW5zd2VyID8gcy5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICBwcmljZTogcy5hcnRSZXRhaWxQcmljZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uXHJcbiAgICAgICAgLmZpbHRlcihzID0+IHRoaXMuX2lzQWxsU2VsZWN0aW9uUHVibGlzaGVkKHMpIHx8IHMudXNlcklucHV0KVxyXG4gICAgICAgIC5tYXAoKHM6IFNlbGVjdGlvbiwgaWR4OiBudW1iZXIsIGFycjogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAgIHJldHVybiBzLnVzZXJJbnB1dCA/IChzLnVzZXJJbnB1dFZhbHVlID8gcy51c2VySW5wdXRWYWx1ZS50cmltKCkgOiAnJykgOiAocy5hbnN3ZXIgPyBzLmFuc3dlci50cmltKCkgOiAnJyk7XHJcbiAgICAgICAgfSkuam9pbignIC0gJyk7XHJcbiAgICB9XHJcbiAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlclRyZWVTdHJpbmc7XHJcbiAgICBpZiAoYW5zd2VyVHJlZSkge1xyXG4gICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZSA9IEpTT04uc3RyaW5naWZ5KGFuc3dlclRyZWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9uLmFuc3dlclRyZWUgPSBKU09OLnN0cmluZ2lmeShbe1xyXG4gICAgICAgIHRpdGxlOiBzZWxlY3Rpb24udXNlcklucHV0ID8gKHNlbGVjdGlvbi5hbnN3ZXIgPyBzZWxlY3Rpb24uYW5zd2VyLnRyaW0oKSA6ICcnKSA6IChzZWxlY3Rpb24ucXVlc3Rpb24gPyBzZWxlY3Rpb24ucXVlc3Rpb24udHJpbSgpIDogJycpLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzZWxlY3Rpb24udXNlcklucHV0ID8gKHNlbGVjdGlvbi51c2VySW5wdXRWYWx1ZSA/IHNlbGVjdGlvbi51c2VySW5wdXRWYWx1ZS50cmltKCkgOiAnJykgOiAoc2VsZWN0aW9uLmFuc3dlciA/IHNlbGVjdGlvbi5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgIHByaWNlOiBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2VcclxuICAgICAgfV0pO1xyXG4gICAgfVxyXG4gICAgbGV0IHRvdGFsUHJpY2U6IG51bWJlciA9IDA7IC8vIHRlbXAgZml4IHVudGlsIGJhY2tlbmQgaXMgcmVhZHlcclxuICAgIGFuc3dlcnNGcm9tU2VsZWN0aW9uLmZvckVhY2goKHM6IFNlbGVjdGlvbikgPT4ge1xyXG4gICAgICB0b3RhbFByaWNlICs9IHMuYXJ0UmV0YWlsUHJpY2UgPyBzLmFydFJldGFpbFByaWNlIDogMDsgLy8gdGVtcCBmaXggdW50aWwgYmFja2VuZCBpcyByZWFkeVxyXG4gICAgfSk7XHJcbiAgICAoc2VsZWN0aW9uIGFzIGFueSkudG90YWxQcmljZSA9IHRvdGFsUHJpY2U7IC8vIHRlbXAgZml4IHVudGlsIGJhY2tlbmQgaXMgcmVhZHlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzU2VsZWN0aW9uUHVibGlzaGVkKHM6IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJiAoKChzLm9wdGlvblNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKHMub3B0aW9uU2hvd09uKSkpIHx8XHJcbiAgICAgIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIgJiYgKCgocy5ub2RlU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5ub2RlU2hvd09uKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNBbGxTZWxlY3Rpb25QdWJsaXNoZWQoczogU2VsZWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHMub3B0aW9uU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5vcHRpb25TaG93T24pKSkgfHxcclxuICAgICAgKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLk5leHRPcHRpb25WYWx1ZSAmJiAoKChzLm5vZGVTaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChzLm5vZGVTaG93T24pKSkgfHxcclxuICAgICAgKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJiAoKChzLm5vZGVTaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChzLm5vZGVTaG93T24pKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0Fuc3dlclB1Ymxpc2hlZChhOiBBbnN3ZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoaXNOaWxsKGEuaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlKSB8fCAoKGEuaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlICYgdGhpcy5fZ2V0UHVibGljYXRpb25Db2RlKCkpID4gMCkpLyogJiZcclxuICAgICAgICAoXHJcbiAgICAgICAgICAgIChhLnR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKGEub3B0aW9uU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwoYS5vcHRpb25TaG93T24pKSkgfHxcclxuICAgICAgICAgICAgKGEudHlwZSA9PT0gTm9kZVR5cGUuQW5zd2VyICYmICgoKGEubm9kZVNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKGEubm9kZVNob3dPbikpKVxyXG4gICAgICAgICkqLztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFB1YmxpY2F0aW9uQ29kZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0UHVibGljYXRpb25Db2RlQmFzZWRPbkxvZ2luKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRVbmlxdWVBbnN3ZXJzKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogU2VsZWN0aW9uW10ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb25zIHx8IHNlbGVjdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHVuaXF1ZUFuc3dlcnM6IE1hcDxudW1iZXIsIFNlbGVjdGlvbj4gPSBuZXcgTWFwPG51bWJlciwgU2VsZWN0aW9uPigpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgIGlmICghdW5pcXVlQW5zd2Vycy5oYXMoc2VsZWN0aW9uLm5vZGVJZCkpIHtcclxuICAgICAgICB1bmlxdWVBbnN3ZXJzLnNldChzZWxlY3Rpb24ubm9kZUlkLCBzZWxlY3Rpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB1bmlxdWVBbnN3ZXJzLmdldChzZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICBleGlzdGluZ1NlbGVjdGlvbi5hcnRSZXRhaWxQcmljZSArPSBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgPyBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgOiAwO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUFuc3dlcnMudmFsdWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlbG9hZENhY2hlZEltYWdlcyhhbnN3ZXJzT3JTZWxlY3Rpb25zOiBBbnN3ZXJbXSB8IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICBhbnN3ZXJzT3JTZWxlY3Rpb25zLmZvckVhY2goKGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24pID0+IHtcclxuICAgICAgaWYgKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhhbnN3ZXJPclNlbGVjdGlvbi5ub2RlSWQpKSB7XHJcbiAgICAgICAgICBhbnN3ZXJPclNlbGVjdGlvbi5pbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChhbnN3ZXJPclNlbGVjdGlvbi5ub2RlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVJbnN0YW5jZVJlc3BvbnNlKHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkge1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5pbnN0YW5jZVNldC5uZXh0KHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9uc05leHRPcHRpb25WYWx1ZXMoc2VsZWN0aW9uczogU2VsZWN0aW9uW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gc2VsZWN0aW9ucy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IG5vdlRleHQ6IHN0cmluZyA9ICcnO1xyXG4gICAgZm9yIChsZXQgaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5OZXh0T3B0aW9uVmFsdWUpIHtcclxuICAgICAgICBub3ZUZXh0ID0gc2VsZWN0aW9uLmFuc3dlciArIChub3ZUZXh0ID8gYCAtICR7bm92VGV4dH1gIDogJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChub3ZUZXh0KSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZVN0cmluZyA9IGAke3NlbGVjdGlvbi5hbnN3ZXJ9IC0gJHtub3ZUZXh0fWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vdlRleHQgPSAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAqXHJcbiAgKiBTaG93IGZ1bGwgY29uZmlnIHN0dWZmXHJcbiAgKlxyXG4gICogKi9cclxuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVTZWxlY3RvckZ1bGxDb25maWd1cmF0aW9uKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zID0gc2VsZWN0aW9ucy5zbGljZSgwKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zVG9EaXNwbGF5KCk7XHJcblxyXG4gICAgbGV0IHN0cnVjdDogU2VsZWN0b3JXaXRoT3B0aW9uc1tdID0gW107XHJcblxyXG4gICAgbGV0IHRvdGFsUHJpY2UgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbnMpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgdG90YWxQcmljZSArPSBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgPyBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgOiAwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3RvdGFsUHJpY2UgPSBNYXRoLnJvdW5kKCh0b3RhbFByaWNlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICBsZXQgc2VsZWN0b3JTdHJ1Y3R1cmVMaXN0OiBTZWxlY3RvclN0cnVjdHVyZVtdID0gW107XHJcbiAgICBjb25zdCBzZWxlY3RvclN0cnVjdHVyZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFNlbGVjdG9yU3RydWN0dXJlKCk7XHJcbiAgICBpZiAoc2VsZWN0b3JTdHJ1Y3R1cmUudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIGlmIChzZWxlY3RvclN0cnVjdHVyZS5yZXN1bHRPYmplY3RzKSB7XHJcbiAgICAgICAgc2VsZWN0b3JTdHJ1Y3R1cmVMaXN0ID0gc2VsZWN0b3JTdHJ1Y3R1cmUucmVzdWx0T2JqZWN0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RvclN0cnVjdHVyZUxpc3QgPSBzZWxlY3RvclN0cnVjdHVyZS5yZXN1bHRPYmplY3RbJ3N0cnVjdHVyZXMnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkTGlzdDogU2VsZWN0b3JTdHJ1Y3R1cmVbXSA9IHNlbGVjdG9yU3RydWN0dXJlTGlzdC5maWx0ZXIocyA9PiB0aGlzLl9pc1N0cnVjdHVyZVB1Ymxpc2hlZChzKSk7XHJcbiAgICBzdHJ1Y3QgPSB0aGlzLl9idWlsZFN0cnVjdHVyZVRocmVlKGZpbHRlcmVkTGlzdCk7XHJcbiAgICB0aGlzLl9tYXJrTGFzdE5vZGVXaXRoQ2hpbGRyZW4oc3RydWN0KTtcclxuXHJcbiAgICBpZiAodGhpcy5fZXhjZXB0aW9uUXVlc3Rpb25DaGFuZ2VkKSB7XHJcbiAgICAgIHN0cnVjdCA9IHRoaXMuX2xpbmtFeGNlcHRpb25Ub09wdGlvbih0aGlzLl9leGNlcHRpb25RdWVzdGlvbkNoYW5nZWQsIHN0cnVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25XaXRoQW5zd2VycyA9IHN0cnVjdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkU3RydWN0dXJlVGhyZWUoaXRlbXM6IGFueSk6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSB7XHJcbiAgICBjb25zdCBtYXA6IHsgW2tleTogbnVtYmVyXTogU2VsZWN0b3JXaXRoT3B0aW9ucyB9ID0ge307XHJcbiAgICBjb25zdCBzdHJ1Y3R1cmVkTGlzdDogU2VsZWN0b3JXaXRoT3B0aW9uc1tdID0gW107XHJcblxyXG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9uID0gbmV3IFNlbGVjdG9yV2l0aE9wdGlvbnMoKTtcclxuICAgICAgb3B0aW9uLnNlbGVjdG9yID0gaXRlbTtcclxuICAgICAgb3B0aW9uLnNlbGVjdG9yT3B0aW9ucyA9IFtdO1xyXG4gICAgICBtYXBbaXRlbS5pZF0gPSBvcHRpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAobWFwW2l0ZW0ucGFyZW50SWRdKSB7XHJcbiAgICAgICAgbWFwW2l0ZW0ucGFyZW50SWRdLnNlbGVjdG9yT3B0aW9ucy5wdXNoKG1hcFtpdGVtLmlkXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3RydWN0dXJlZExpc3QucHVzaChtYXBbaXRlbS5pZF0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzdHJ1Y3R1cmVkTGlzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcmtMYXN0Tm9kZVdpdGhDaGlsZHJlbihub2RlczogU2VsZWN0b3JXaXRoT3B0aW9uc1tdKTogdm9pZCB7XHJcbiAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICBpZiAobm9kZS5zZWxlY3Rvck9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtMYXN0Tm9kZVdpdGhDaGlsZHJlbihub2RlLnNlbGVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgbGFzdEVsZW1lbnRXaXRoQ2hpbGRyZW4gPSBub2RlLnNlbGVjdG9yT3B0aW9ucy5ldmVyeShcclxuICAgICAgICAgIGNoaWxkID0+IGNoaWxkLnNlbGVjdG9yT3B0aW9ucy5sZW5ndGggPT09IDBcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChsYXN0RWxlbWVudFdpdGhDaGlsZHJlbikge1xyXG4gICAgICAgICAgbm9kZS5sYXN0Tm9kZVdpdGhDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzU3RydWN0dXJlUHVibGlzaGVkKHM6IFNlbGVjdG9yU3RydWN0dXJlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKGlzTmlsbChzLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSkgfHwgKChzLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKTtcclxuICB9XHJcblxyXG4gIC8vIFBPU1RDT05ESVRJT046IGN1cnJlbnQgYWN0aXZlQW5zd2VycyBoYXZlIHByaWNlIHZhbHVlcy5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkUHJpY2VzT2ZBY3RpdmVBbnN3ZXJzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYW5zd2VyUHJpY2VzOiBBbnN3ZXJQcmljZVtdID0gYXdhaXQgdGhpcy5nZXRBbnN3ZXJQcmljZXMoKTtcclxuICAgIGlmIChhbnN3ZXJQcmljZXMpIHtcclxuICAgICAgYW5zd2VyUHJpY2VzLmZvckVhY2goYW5zd2VyUHJpY2UgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFuc3dlck1hdGNoOiBBbnN3ZXIgPSB0aGlzLmFjdGl2ZUFuc3dlcnMuZmluZChhbnMgPT4gYW5zLm5vZGUgPT09IGFuc3dlclByaWNlLnNlbElkKTtcclxuICAgICAgICBpZiAoYW5zd2VyTWF0Y2gpIHtcclxuICAgICAgICAgICg8YW55PmFuc3dlck1hdGNoKS5wcmljZSA9IGFuc3dlclByaWNlLmFkZFJldGFpbFByaWNlO1xyXG4gICAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmV4dHJhQW5zd2VyRGF0YUxvYWRlZC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhY2hlSW1hZ2UoaWQ6IG51bWJlciwgaW1hZ2VEYXRhT3JVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faW1hZ2VDYWNoZS5zZXQoaWQsIGltYWdlRGF0YU9yVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVjZWl2ZWQoYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbiwgaW1hZ2VEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbWFnZURhdGFPclVybDogc3RyaW5nO1xyXG4gICAgaWYgKGltYWdlRGF0YSkge1xyXG4gICAgICBpZiAoaW1hZ2VEYXRhLm1hdGNoKC9kYXRhOmltYWdlLykgfHwgaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCBpbWFnZURhdGEuc3RhcnRzV2l0aCgnd3d3JykpIHtcclxuICAgICAgICBpbWFnZURhdGFPclVybCA9IGltYWdlRGF0YTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5hc3NldFBhdGggJiYgIXRoaXMuYXNzZXRQYXRoLmVuZHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgIHRoaXMuYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGltYWdlRGF0YS5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgIGltYWdlRGF0YSA9IGltYWdlRGF0YS5zdWJzdHIoMSwgaW1hZ2VEYXRhLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGltYWdlRGF0YU9yVXJsID0gKHRoaXMuYXNzZXRQYXRoID8gdGhpcy5hc3NldFBhdGggOiAnJykgKyBpbWFnZURhdGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICg8YW55PmFuc3dlck9yU2VsZWN0aW9uKS5pbWFnZURhdGEgPSBpbWFnZURhdGFPclVybCA9PT0gdW5kZWZpbmVkID8gJycgOiBpbWFnZURhdGFPclVybDtcclxuICAgIHRoaXMuX2NhY2hlSW1hZ2UoYW5zd2VyT3JTZWxlY3Rpb24ubm9kZUlkLCBpbWFnZURhdGFPclVybCA/IGltYWdlRGF0YU9yVXJsIDogJycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZVNlbGVjdGlvbnNUb0Rpc3BsYXlJbWFnZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5ICYmIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXlbaV07XHJcbiAgICAgICAgY29uc3QgbGFzdEFuc3dlclNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlSWQgPT09IHNlbGVjdGlvbi5sYXN0QW5zd2VyTm9kZUlkKTtcclxuICAgICAgICBpZiAobGFzdEFuc3dlclNlbGVjdGlvbiAmJiAoc2VsZWN0aW9uLmdlbmVyaWMgfHwgc2VsZWN0aW9uLmdyb3VwZWQpKSB7XHJcbiAgICAgICAgICBpZiAoIWxhc3RBbnN3ZXJTZWxlY3Rpb24uaW1hZ2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihsYXN0QW5zd2VyU2VsZWN0aW9uLCA0LCB0cnVlLCBmYWxzZSkudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVJbWFnZVJlY2VpdmVkKGxhc3RBbnN3ZXJTZWxlY3Rpb24sIGltYWdlRGF0YSk7XHJcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSBsYXN0QW5zd2VyU2VsZWN0aW9uLmltYWdlRGF0YTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24uaW1hZ2VEYXRhTGFzdEFuc3dlciA9IGxhc3RBbnN3ZXJTZWxlY3Rpb24uaW1hZ2VEYXRhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29weUluc3RhbmNlKFxyXG4gICAgb3JpZ2luYWxJbnN0YW5jZUlkOiBzdHJpbmcsXHJcbiAgICBzaG91bGRTYXZlQ3VycmVudEluc3RhbmNlSWQ6IGJvb2xlYW4sXHJcbiAgICByZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3RcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvcHlJbnN0YW5jZVJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuY29weUluc3RhbmNlKG9yaWdpbmFsSW5zdGFuY2VJZCwgc2hvdWxkU2F2ZUN1cnJlbnRJbnN0YW5jZUlkKS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlID09PSAnRUNPTk5BQk9SVEVEJyB8fCBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5UaW1lb3V0O1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Vbmtub3duO1xyXG4gICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IENvbmZpZ3VyYXRvckVycm9yTWVzc2FnZShjb3B5SW5zdGFuY2VSZXNwb25zZS5yZXN1bHRPYmplY3QuZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIGlmIChjb3B5SW5zdGFuY2VSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmICFjb3B5SW5zdGFuY2VSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgaWYgKGNvcHlJbnN0YW5jZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQubWVzc2FnZXMubWFwKChtOiBhbnkpID0+IG0ubWVzc2FnZVR5cGUgPT09ICdFJykgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uTm90Rml4ZWQ7XHJcbiAgICAgICAgY29weUluc3RhbmNlUmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5tZXNzYWdlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKG0ubWVzc2FnZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uUGFydGlhbGx5Rml4ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0luc3RhbmNlSWQ6IHN0cmluZyA9IGNvcHlJbnN0YW5jZVJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UoY29weUluc3RhbmNlUmVzcG9uc2UpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdJbnN0YW5jZUlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVjZWl2ZWRGb3JTZWxlY3RvclN0cnVjdHVyZShvcHRpb246IFNlbGVjdG9yU3RydWN0dXJlLCBpbWFnZURhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGltYWdlRGF0YU9yVXJsOiBzdHJpbmc7XHJcbiAgICBpZiAoaW1hZ2VEYXRhKSB7XHJcbiAgICAgIGlmIChpbWFnZURhdGEubWF0Y2goL2RhdGE6aW1hZ2UvKSB8fCBpbWFnZURhdGEuc3RhcnRzV2l0aCgnaHR0cCcpIHx8IGltYWdlRGF0YS5zdGFydHNXaXRoKCd3d3cnKSkge1xyXG4gICAgICAgIGltYWdlRGF0YU9yVXJsID0gaW1hZ2VEYXRhO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmFzc2V0UGF0aCAmJiAhdGhpcy5hc3NldFBhdGguZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgdGhpcy5hc3NldFBhdGggKz0gJy8nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgaW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnN1YnN0cigxLCBpbWFnZURhdGEubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW1hZ2VEYXRhT3JVcmwgPSAodGhpcy5hc3NldFBhdGggPyB0aGlzLmFzc2V0UGF0aCA6ICcnKSArIGltYWdlRGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKDxhbnk+b3B0aW9uKS5pbWFnZURhdGEgPSBpbWFnZURhdGFPclVybCA9PT0gdW5kZWZpbmVkID8gJycgOiBpbWFnZURhdGFPclVybDtcclxuICAgIHRoaXMuX2NhY2hlSW1hZ2Uob3B0aW9uLmFydE5vZGVJZCwgaW1hZ2VEYXRhT3JVcmwgPyBpbWFnZURhdGFPclVybCA6ICcnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVzcG9uc2UocmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKTogc3RyaW5nIHtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgY29uc3QgaW1hZ2VDb250ZW50OiBJbWFnZUNvbnRlbnQgPVxyXG4gICAgICAgIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEltYWdlQ29udGVudCwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KSBhcyB1bmtub3duIGFzIEltYWdlQ29udGVudDtcclxuICAgICAgaWYgKGltYWdlQ29udGVudC5pbWFnZSAhPT0gbnVsbCAmJiBpbWFnZUNvbnRlbnQuaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiBpbWFnZUNvbnRlbnQuaW1hZ2UgIT09ICcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGltYWdlQ29udGVudC5pbWFnZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpbmtFeGNlcHRpb25Ub09wdGlvbihleGNlcHRpb25RdWVzdGlvbjogQW5zd2VyLCBzdHJ1Y3Q6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSk6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSB7XHJcbiAgICBzdHJ1Y3QuZm9yRWFjaChzdHJ1Y3QgPT4ge1xyXG4gICAgICBpZiAoc3RydWN0LnNlbGVjdG9yLm9wdElkID09PSBleGNlcHRpb25RdWVzdGlvbi5vcHRpb25JZCkge1xyXG4gICAgICAgIHN0cnVjdC5tYXJrRm9yRXhjZXB0aW9uTm90aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fZXhjZXB0aW9uUXVlc3Rpb25DaGFuZ2VkID0gdW5kZWZpbmVkOyAvLyByZXNldFxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxuICB9XHJcbn1cclxuIl19
|