@colijnit/configurator 261.1.1 → 261.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19092 -18478
- package/fesm2022/colijnit-configurator.mjs.map +1 -0
- package/index.d.ts +3301 -0
- package/lib/components/answer-card/style/_layout.scss +3 -3
- package/lib/components/answers-slideout/style/_layout.scss +1 -0
- package/package.json +17 -13
- 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
|
@@ -1,553 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
|
|
3
|
-
import { VariationSettings } from '../../model/variation-settings';
|
|
4
|
-
import { Variation } from '../../model/variation';
|
|
5
|
-
import { VariationUtils } from '../../utils/variation-utils';
|
|
6
|
-
import { Color, DoubleSide, EquirectangularReflectionMapping, Mesh, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, NearestFilter } from 'three';
|
|
7
|
-
import { filter, take } from 'rxjs/operators';
|
|
8
|
-
import { Material } from '../../model/material';
|
|
9
|
-
import { BaseUtils } from '../../utils/base-utils';
|
|
10
|
-
import { ImageUtils } from '../../utils/image.utils';
|
|
11
|
-
import { AssetUtils } from '../../utils/asset.utils';
|
|
12
|
-
export class VariationHelper extends BaseUtils {
|
|
13
|
-
constructor() {
|
|
14
|
-
super(...arguments);
|
|
15
|
-
this._variations = [];
|
|
16
|
-
this._lastKnownVariations = new Map();
|
|
17
|
-
}
|
|
18
|
-
clearCache() {
|
|
19
|
-
const variationMap = Array.from(this._lastKnownVariations.values());
|
|
20
|
-
variationMap.forEach((variations) => {
|
|
21
|
-
variations.forEach((variation) => {
|
|
22
|
-
try {
|
|
23
|
-
if (variation.material) {
|
|
24
|
-
if (variation.material.texture) {
|
|
25
|
-
variation.material.texture.dispose();
|
|
26
|
-
}
|
|
27
|
-
if (variation.material.normal) {
|
|
28
|
-
variation.material.normal.dispose();
|
|
29
|
-
}
|
|
30
|
-
if (variation.material.metalness) {
|
|
31
|
-
variation.material.metalness.dispose();
|
|
32
|
-
}
|
|
33
|
-
if (variation.material.roughness) {
|
|
34
|
-
variation.material.roughness.dispose();
|
|
35
|
-
}
|
|
36
|
-
if (variation.material.ao) {
|
|
37
|
-
variation.material.ao.dispose();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
VariationUtils.ClearCache();
|
|
46
|
-
ImageUtils.ClearCache();
|
|
47
|
-
}
|
|
48
|
-
loadPart(obj, parts, usePbr = false) {
|
|
49
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
try {
|
|
51
|
-
const len = parts.length;
|
|
52
|
-
for (let i = 0; i < len; i++) {
|
|
53
|
-
let partSettings;
|
|
54
|
-
if (parts[i].decoNode && parts[i].decoNode.materialUrl && parts[i].decoNode.type === DecoNodeType.Part) {
|
|
55
|
-
partSettings = yield VariationUtils.LoadVariationByUrl(parts[i].decoNode.materialCode, parts[i].decoNode.materialUrl);
|
|
56
|
-
}
|
|
57
|
-
if (parts[i].decoNode && parts[i].decoNode.gameObjectName && parts[i].decoNode.type === DecoNodeType.Part) {
|
|
58
|
-
partSettings = yield VariationUtils.LoadVariation(this.assetPath, this.assetPath, parts[i].decoNode.gameObjectName || parts[i].decoId);
|
|
59
|
-
}
|
|
60
|
-
if (partSettings) {
|
|
61
|
-
const partVariation = new Variation();
|
|
62
|
-
partVariation.decoId = parseFloat(parts[i].decoNode.id);
|
|
63
|
-
partVariation.brandId = parts[i].decoNode.brandId;
|
|
64
|
-
partVariation.gameObjectName = parts[i].decoNode.gameObjectName;
|
|
65
|
-
partVariation.material = yield AssetUtils.CreateMaterialFromAsset(partSettings);
|
|
66
|
-
this._applyMaterialPart(obj, partVariation, parts[i].node, usePbr);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch (e) {
|
|
71
|
-
console.error(e);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
loadVariation(obj, parts, usePbr = false) {
|
|
76
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
-
try {
|
|
78
|
-
const len = parts.length;
|
|
79
|
-
for (let i = 0; i < len; i++) {
|
|
80
|
-
const variations = parts[i].variations;
|
|
81
|
-
if (!variations || variations.length === 0) {
|
|
82
|
-
if (this._getLastKnownVariations(parts[i].nodeId)) {
|
|
83
|
-
parts[i].variations = this._getLastKnownVariations(parts[i].nodeId);
|
|
84
|
-
this._applyVariations(obj, parts[i], usePbr);
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const lastKnownVariations = [];
|
|
92
|
-
const variationPromise = [];
|
|
93
|
-
for (let j = 0; j < variations.length; j++) {
|
|
94
|
-
let variationsName = '';
|
|
95
|
-
if (variations[j].materialCode && variations[j].materialUrl) {
|
|
96
|
-
variationsName = variations[j].materialCode;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
variationsName = variations[j].gameObjectName || parts[i].decoId;
|
|
100
|
-
}
|
|
101
|
-
variationPromise.push(this.loadTheVariation(variationsName).then((variationSettings) => {
|
|
102
|
-
const newVariation = new Variation();
|
|
103
|
-
newVariation.decoId = variations[j].constructor.name === 'Variation' ? variations[j].decoId : parseFloat(variations[j].id);
|
|
104
|
-
newVariation.node = variations[j].constructor.name === 'Variation' ? variations[j].node : variations[j].nodeId;
|
|
105
|
-
newVariation.brandId = variations[j].brandId;
|
|
106
|
-
newVariation.optionText = variations[j].optionText;
|
|
107
|
-
newVariation.gameObjectName = variations[j].gameObjectName;
|
|
108
|
-
newVariation.supplierArticleNr = variations[j].supplierArticleNr;
|
|
109
|
-
newVariation.materialId = variations[j].materialId;
|
|
110
|
-
newVariation.material = variationSettings ? variationSettings.material : null;
|
|
111
|
-
lastKnownVariations.push(newVariation);
|
|
112
|
-
}));
|
|
113
|
-
}
|
|
114
|
-
yield Promise.all(variationPromise);
|
|
115
|
-
this._setLastKnownVariations(`${parts[i].nodeId}_${parts[i].node}`, lastKnownVariations);
|
|
116
|
-
parts[i].variations = lastKnownVariations;
|
|
117
|
-
this._applyVariations(obj, parts[i], usePbr);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
catch (e) {
|
|
121
|
-
this.log(e.message);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
get(id) {
|
|
126
|
-
const len = this._variations.length;
|
|
127
|
-
for (let i = 0; i < len; i++) {
|
|
128
|
-
if (this._variations[i].id && this._variations[i].id === id) {
|
|
129
|
-
return this._variations[i];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
set(variations) {
|
|
134
|
-
const idx = this._variations.findIndex(v => v.id === variations.id);
|
|
135
|
-
if (idx > -1) {
|
|
136
|
-
this._variations[idx] = variations;
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
this._variations.push(variations);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
preloadVariations(fileNames) {
|
|
143
|
-
fileNames.forEach((node) => {
|
|
144
|
-
if (node.materialUrl) {
|
|
145
|
-
if (node.materialCode && !this.get(node.materialCode)) {
|
|
146
|
-
const settings = new VariationSettings();
|
|
147
|
-
settings.id = node.materialCode;
|
|
148
|
-
settings.loading = true;
|
|
149
|
-
this._variations.push(settings);
|
|
150
|
-
VariationUtils.LoadVariationByUrl(node.materialCode, node.materialUrl).then((variationSettings) => {
|
|
151
|
-
settings.loading = false;
|
|
152
|
-
if (variationSettings) {
|
|
153
|
-
settings.copyFrom(variationSettings);
|
|
154
|
-
}
|
|
155
|
-
settings.loaded.next(settings);
|
|
156
|
-
}).catch((err) => {
|
|
157
|
-
console.error(`Error loading variation ${node.materialCode}:`, err);
|
|
158
|
-
settings.loading = false;
|
|
159
|
-
settings.loaded.next(null);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
else if (node.gameObjectName) {
|
|
164
|
-
if (!this.get(node.gameObjectName)) {
|
|
165
|
-
const settings = new VariationSettings();
|
|
166
|
-
settings.id = node.gameObjectName;
|
|
167
|
-
settings.loading = true;
|
|
168
|
-
this._variations.push(settings);
|
|
169
|
-
VariationUtils.LoadVariation(this.assetPath, node.gameObjectName).then((variationSettings) => {
|
|
170
|
-
settings.loading = false;
|
|
171
|
-
if (variationSettings) {
|
|
172
|
-
settings.copyFrom(variationSettings);
|
|
173
|
-
}
|
|
174
|
-
settings.loaded.next(settings);
|
|
175
|
-
}).catch((err) => {
|
|
176
|
-
console.error(`Error loading variation ${node.gameObjectName}:`, err);
|
|
177
|
-
settings.loading = false;
|
|
178
|
-
settings.loaded.next(null);
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
loadTheVariation(fileName) {
|
|
185
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
-
if (!fileName) {
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
const settings = this.get(fileName);
|
|
190
|
-
if (!settings) {
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
if (settings.loading) {
|
|
194
|
-
const sett = yield this._waitForVariationToLoad(settings);
|
|
195
|
-
yield this._loadMaterialFromSettings(sett);
|
|
196
|
-
return sett;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
yield this._loadMaterialFromSettings(settings);
|
|
200
|
-
return settings;
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
_loadMaterialFromSettings(settings) {
|
|
205
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
206
|
-
if (settings) {
|
|
207
|
-
if (!settings.material) {
|
|
208
|
-
settings.material = yield AssetUtils.CreateMaterialFromAsset(settings);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
_waitForVariationToLoad(settings) {
|
|
214
|
-
return new Promise((resolve) => {
|
|
215
|
-
settings.loaded.pipe(filter((value) => value !== undefined), take(1)).subscribe((value) => {
|
|
216
|
-
resolve(value);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
_getChildrenFilterByProp(obj, userDataObjectProp, prop, value) {
|
|
221
|
-
return obj.children.filter((child) => {
|
|
222
|
-
return child.userData &&
|
|
223
|
-
child.userData.hasOwnProperty(userDataObjectProp) &&
|
|
224
|
-
child.userData[userDataObjectProp].hasOwnProperty(prop) &&
|
|
225
|
-
child.userData[userDataObjectProp][prop] === value;
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
_applyMaterialPart(obj, partMaterial, nodeId, usePbr = false) {
|
|
229
|
-
const children = this._getChildrenFilterByProp(obj, 'selection', 'node', nodeId);
|
|
230
|
-
const len = children.length;
|
|
231
|
-
for (let i = 0; i < len; i++) {
|
|
232
|
-
const child = children[i];
|
|
233
|
-
if (child !== null && child !== undefined) {
|
|
234
|
-
child.traverse((mesh) => {
|
|
235
|
-
if ((mesh instanceof Mesh || mesh.constructor.name === 'Mesh') && partMaterial) {
|
|
236
|
-
if (Array.isArray(mesh.material)) { // multimaterial support
|
|
237
|
-
for (let j = 0, jlen = mesh.material.length; j < jlen; j++) {
|
|
238
|
-
if (mesh.material[j].name.toLowerCase().indexOf('fixed_frame') !== -1) {
|
|
239
|
-
mesh.material[j] = this._setMeshMaterialFromVariation(mesh.material[j].name, partMaterial, usePbr);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
if (mesh.material.name && mesh.material.name.toLowerCase().indexOf('fixed_frame') !== -1) {
|
|
245
|
-
mesh.material = this._setMeshMaterialFromVariation(mesh.material.name, partMaterial, usePbr);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
_applyVariations(obj, part, usePbr = false) {
|
|
254
|
-
const children = this._getChildrenFilterByProp(obj, 'selection', 'node', part.node);
|
|
255
|
-
const len = children.length;
|
|
256
|
-
for (let i = 0; i < len; i++) {
|
|
257
|
-
const child = children[i];
|
|
258
|
-
if (child !== null && child !== undefined) {
|
|
259
|
-
child.traverse((mesh) => {
|
|
260
|
-
if ((mesh instanceof Mesh || mesh.constructor.name === 'Mesh') && part.variations && part.variations.length > 0 && mesh.name.toLowerCase().indexOf('c_')) {
|
|
261
|
-
for (let j = 0; j < part.variations.length; j++) {
|
|
262
|
-
const variation = part.variations[j];
|
|
263
|
-
if (variation.material) {
|
|
264
|
-
const materialToSearch = !!variation.materialId ? variation.materialId.toLowerCase() : 'default';
|
|
265
|
-
if (Array.isArray(mesh.material)) { // multimaterial support
|
|
266
|
-
for (let m = 0, mlen = mesh.material.length; m < mlen; m++) {
|
|
267
|
-
if (mesh.material[m].name.toLowerCase().indexOf(materialToSearch) !== -1) {
|
|
268
|
-
// TODO Remove this ts-ignore and fix the error
|
|
269
|
-
// @ts-ignore
|
|
270
|
-
if ((variation.material instanceof Material || variation.material.constructor.name === 'Material') && variation.material.isMaterial) {
|
|
271
|
-
// it's a THREE.Material
|
|
272
|
-
mesh.material[m] = variation.material;
|
|
273
|
-
if (mesh.material[m].name && (mesh.material[m].name === 'Fixed_Glass' || mesh.material[m].name === 'Default_Glass')) {
|
|
274
|
-
mesh.castShadow = false;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
mesh.material[m] = this._setMeshMaterialFromVariation(mesh.material[m].name, variation, usePbr);
|
|
279
|
-
if (mesh.material[m].name && (mesh.material[m].name === 'Fixed_Glass' || mesh.material[m].name === 'Default_Glass')) {
|
|
280
|
-
mesh.castShadow = false;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
if (mesh.material.name && mesh.material.name.toLowerCase().indexOf(materialToSearch) !== -1) {
|
|
288
|
-
// TODO Remove this ts-ignore and fix the error
|
|
289
|
-
// @ts-ignore
|
|
290
|
-
if ((variation.material instanceof Material || variation.material.constructor.name === 'Material') && variation.material.isMaterial) {
|
|
291
|
-
// it's a THREE.Material
|
|
292
|
-
mesh.material = variation.material;
|
|
293
|
-
if (mesh.material.name === 'Fixed_Glass' || mesh.material.name === 'Default_Glass') {
|
|
294
|
-
mesh.castShadow = false;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
mesh.material = this._setMeshMaterialFromVariation(mesh.material.name, variation, usePbr);
|
|
299
|
-
if (mesh.material.name === 'Fixed_Glass' || mesh.material.name === 'Default_Glass') {
|
|
300
|
-
mesh.castShadow = false;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
_setMeshMaterialFromVariation(name, variation, usePbr = false) {
|
|
313
|
-
const material = variation.material;
|
|
314
|
-
if (material.texture) {
|
|
315
|
-
material.texture.needsUpdate = true;
|
|
316
|
-
material.texture.mapping = EquirectangularReflectionMapping;
|
|
317
|
-
}
|
|
318
|
-
if (!usePbr) {
|
|
319
|
-
const newMaterial = new MeshPhongMaterial({
|
|
320
|
-
name: name,
|
|
321
|
-
shininess: material.shininess,
|
|
322
|
-
specular: material.specular,
|
|
323
|
-
map: material.texture,
|
|
324
|
-
normalMap: material.normal
|
|
325
|
-
});
|
|
326
|
-
newMaterial.color.setRGB(0.8, 0.8, 0.8);
|
|
327
|
-
newMaterial.needsUpdate = true;
|
|
328
|
-
return newMaterial;
|
|
329
|
-
}
|
|
330
|
-
if (material.sheen || material.sheenColor || material.reflectivity || material.transmission) { // TODO: Proper check for all unique physical material properties
|
|
331
|
-
const params = {
|
|
332
|
-
// side: material.side ? material.side : FrontSide,
|
|
333
|
-
name: name,
|
|
334
|
-
roughness: material.roughnessValue !== undefined && material.roughnessValue !== null ? material.roughnessValue : 1,
|
|
335
|
-
metalness: material.metalnessValue !== undefined && material.metalnessValue !== null ? material.metalnessValue : 0,
|
|
336
|
-
envMapIntensity: material.envMapIntensity ? material.envMapIntensity : 0.01,
|
|
337
|
-
clearcoatMap: material.clearcoatMap ? material.clearcoatMap : null,
|
|
338
|
-
clearcoatRoughnessMap: material.clearcoatRoughnessMap ? material.clearcoatRoughnessMap : null,
|
|
339
|
-
attenuationDistance: Infinity
|
|
340
|
-
// wireframe: true,
|
|
341
|
-
// opacity: 0.3,
|
|
342
|
-
// transparent: true,
|
|
343
|
-
};
|
|
344
|
-
if (material.displacementValue) {
|
|
345
|
-
params.displacementScale = material.displacementValue;
|
|
346
|
-
}
|
|
347
|
-
if (material.opacity) {
|
|
348
|
-
params.opacity = material.opacity;
|
|
349
|
-
}
|
|
350
|
-
if (material.transparent) {
|
|
351
|
-
params.transparent = material.transparent;
|
|
352
|
-
}
|
|
353
|
-
if (material.emissiveValue) {
|
|
354
|
-
params.emissive = material.emissiveValue;
|
|
355
|
-
}
|
|
356
|
-
if (material.emissiveIntensityValue) {
|
|
357
|
-
params.emissiveIntensity = material.emissiveIntensityValue;
|
|
358
|
-
}
|
|
359
|
-
if (material.texture) {
|
|
360
|
-
params.map = material.texture;
|
|
361
|
-
params.map.needsUpdate = true;
|
|
362
|
-
}
|
|
363
|
-
if (material.ao) {
|
|
364
|
-
params.aoMap = material.ao;
|
|
365
|
-
params.aoMap.needsUpdate = true;
|
|
366
|
-
}
|
|
367
|
-
if (material.roughness) {
|
|
368
|
-
params.roughnessMap = material.roughness;
|
|
369
|
-
params.roughnessMap.needsUpdate = true;
|
|
370
|
-
// material.roughness.magFilter = NearestFilter;
|
|
371
|
-
}
|
|
372
|
-
if (material.metalness) {
|
|
373
|
-
params.metalnessMap = material.metalness;
|
|
374
|
-
params.metalnessMap.needsUpdate = true;
|
|
375
|
-
}
|
|
376
|
-
if (material.normal) {
|
|
377
|
-
params.normalMap = material.normal;
|
|
378
|
-
params.normalMap.needsUpdate = true;
|
|
379
|
-
}
|
|
380
|
-
if (material.displacement) {
|
|
381
|
-
params.displacementMap = material.displacement;
|
|
382
|
-
params.displacementMap.needsUpdate = true;
|
|
383
|
-
}
|
|
384
|
-
if (material.emissive) {
|
|
385
|
-
params.emissiveMap = material.emissive;
|
|
386
|
-
params.emissiveMap.needsUpdate = true;
|
|
387
|
-
}
|
|
388
|
-
if (material.envMap) {
|
|
389
|
-
if (material.envMapIntensity != null || 0) {
|
|
390
|
-
params.envMap = material.envMap;
|
|
391
|
-
params.envMap.needsUpdate = true;
|
|
392
|
-
material.envMap.mapping = EquirectangularReflectionMapping;
|
|
393
|
-
material.envMap.minFilter = NearestFilter;
|
|
394
|
-
material.envMap.magFilter = NearestFilter;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
if (material.reflectivity) {
|
|
398
|
-
params.reflectivity = material.reflectivity;
|
|
399
|
-
}
|
|
400
|
-
if (material.side) {
|
|
401
|
-
params.side = material.side;
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
params.side = DoubleSide;
|
|
405
|
-
}
|
|
406
|
-
const newMaterial = new MeshPhysicalMaterial(params);
|
|
407
|
-
newMaterial.color.setRGB(1, 1, 1);
|
|
408
|
-
if (material.sheen) {
|
|
409
|
-
newMaterial.sheen = material.sheen;
|
|
410
|
-
}
|
|
411
|
-
if (material.sheenColor) {
|
|
412
|
-
newMaterial.sheenColor = this._createValidColor(material.sheenColor);
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
// Add fallback for blender render
|
|
416
|
-
newMaterial.sheenColor = new Color(1, 1, 1);
|
|
417
|
-
}
|
|
418
|
-
if (material.sheenRoughness) {
|
|
419
|
-
newMaterial.sheenRoughness = material.sheenRoughness;
|
|
420
|
-
}
|
|
421
|
-
if (material.sheenColorMap) {
|
|
422
|
-
newMaterial.sheenColorMap = material.sheenColorMap;
|
|
423
|
-
newMaterial.sheenColorMap.needsUpdate = true;
|
|
424
|
-
}
|
|
425
|
-
if (material.sheenRoughnessMap) {
|
|
426
|
-
newMaterial.sheenRoughnessMap = material.sheenRoughnessMap;
|
|
427
|
-
newMaterial.sheenRoughnessMap.needsUpdate = true;
|
|
428
|
-
}
|
|
429
|
-
if (material.transmission) {
|
|
430
|
-
newMaterial.transmission = material.transmission;
|
|
431
|
-
}
|
|
432
|
-
if (material.ior !== undefined && material.ior !== null) {
|
|
433
|
-
newMaterial.ior = material.ior;
|
|
434
|
-
}
|
|
435
|
-
if (material.thickness !== undefined && material.thickness !== null) {
|
|
436
|
-
newMaterial.thickness = material.thickness;
|
|
437
|
-
}
|
|
438
|
-
if (material.specularIntensity !== undefined && material.specularIntensity !== null) {
|
|
439
|
-
newMaterial.specularIntensity = material.specularIntensity;
|
|
440
|
-
}
|
|
441
|
-
if (material.transmissionMap) {
|
|
442
|
-
newMaterial.transmissionMap = material.transmissionMap;
|
|
443
|
-
newMaterial.transmissionMap.needsUpdate = true;
|
|
444
|
-
}
|
|
445
|
-
newMaterial.needsUpdate = true;
|
|
446
|
-
return newMaterial;
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
const params = {
|
|
450
|
-
// side: material.side ? material.side : FrontSide,
|
|
451
|
-
name: name,
|
|
452
|
-
roughness: material.roughnessValue !== undefined && material.roughnessValue !== null ? material.roughnessValue : 1,
|
|
453
|
-
metalness: material.metalnessValue !== undefined && material.metalnessValue !== null ? material.metalnessValue : 0,
|
|
454
|
-
envMapIntensity: material.envMapIntensity ? material.envMapIntensity : 0.01
|
|
455
|
-
// wireframe: true,
|
|
456
|
-
// opacity: 0.3,
|
|
457
|
-
// transparent: true,
|
|
458
|
-
};
|
|
459
|
-
if (material.displacementValue) {
|
|
460
|
-
params.displacementScale = material.displacementValue;
|
|
461
|
-
}
|
|
462
|
-
if (material.opacity) {
|
|
463
|
-
params.opacity = material.opacity;
|
|
464
|
-
}
|
|
465
|
-
if (material.transparent) {
|
|
466
|
-
params.transparent = material.transparent;
|
|
467
|
-
}
|
|
468
|
-
if (material.emissiveValue) {
|
|
469
|
-
params.emissive = material.emissiveValue;
|
|
470
|
-
}
|
|
471
|
-
if (material.emissiveIntensityValue) {
|
|
472
|
-
params.emissiveIntensity = material.emissiveIntensityValue;
|
|
473
|
-
}
|
|
474
|
-
if (material.texture) {
|
|
475
|
-
params.map = material.texture;
|
|
476
|
-
params.map.needsUpdate = true;
|
|
477
|
-
}
|
|
478
|
-
if (material.ao) {
|
|
479
|
-
params.aoMap = material.ao;
|
|
480
|
-
params.aoMap.needsUpdate = true;
|
|
481
|
-
}
|
|
482
|
-
if (material.roughness) {
|
|
483
|
-
params.roughnessMap = material.roughness;
|
|
484
|
-
params.roughnessMap.needsUpdate = true;
|
|
485
|
-
// material.roughness.magFilter = NearestFilter;
|
|
486
|
-
}
|
|
487
|
-
if (material.metalness) {
|
|
488
|
-
params.metalnessMap = material.metalness;
|
|
489
|
-
params.metalnessMap.needsUpdate = true;
|
|
490
|
-
}
|
|
491
|
-
if (material.normal) {
|
|
492
|
-
params.normalMap = material.normal;
|
|
493
|
-
params.normalMap.needsUpdate = true;
|
|
494
|
-
}
|
|
495
|
-
if (material.displacement) {
|
|
496
|
-
params.displacementMap = material.displacement;
|
|
497
|
-
params.displacementMap.needsUpdate = true;
|
|
498
|
-
}
|
|
499
|
-
if (material.emissive) {
|
|
500
|
-
params.emissiveMap = material.emissive;
|
|
501
|
-
params.emissiveMap.needsUpdate = true;
|
|
502
|
-
}
|
|
503
|
-
if (material.envMap) {
|
|
504
|
-
if (material.envMapIntensity != null || 0) {
|
|
505
|
-
params.envMap = material.envMap;
|
|
506
|
-
params.envMap.needsUpdate = true;
|
|
507
|
-
material.envMap.mapping = EquirectangularReflectionMapping;
|
|
508
|
-
material.envMap.minFilter = NearestFilter;
|
|
509
|
-
material.envMap.magFilter = NearestFilter;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
if (material.side) {
|
|
513
|
-
params.side = material.side;
|
|
514
|
-
}
|
|
515
|
-
else {
|
|
516
|
-
params.side = DoubleSide;
|
|
517
|
-
}
|
|
518
|
-
const newMaterial = new MeshStandardMaterial(params);
|
|
519
|
-
newMaterial.color.setRGB(1, 1, 1);
|
|
520
|
-
newMaterial.needsUpdate = true;
|
|
521
|
-
return newMaterial;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
_setLastKnownVariations(id, variation) {
|
|
525
|
-
this._lastKnownVariations.set(id, variation);
|
|
526
|
-
}
|
|
527
|
-
_getLastKnownVariations(id) {
|
|
528
|
-
if (this._lastKnownVariations.has(id)) {
|
|
529
|
-
return this._lastKnownVariations.get(id);
|
|
530
|
-
}
|
|
531
|
-
return null;
|
|
532
|
-
}
|
|
533
|
-
_createValidColor(color) {
|
|
534
|
-
if (typeof color === 'string') {
|
|
535
|
-
if (/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) {
|
|
536
|
-
return new Color(`#${color.replace('#', '')}`);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
else if (color instanceof Color || color.constructor.name === 'Color') {
|
|
540
|
-
return color;
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
try {
|
|
544
|
-
return new Color(color);
|
|
545
|
-
}
|
|
546
|
-
catch (e) {
|
|
547
|
-
return new Color();
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
return new Color();
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWF0aW9uLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL2NvcmUvaGVscGVyL3ZhcmlhdGlvbi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLGdDQUFnQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBa0Msb0JBQW9CLEVBQWtDLGFBQWEsRUFBVyxNQUFNLE9BQU8sQ0FBQztBQUN4TyxPQUFPLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxTQUFTO0lBQTlDOztRQUlVLGdCQUFXLEdBQXdCLEVBQUUsQ0FBQztRQUV0Qyx5QkFBb0IsR0FBNkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQXFoQnJFLENBQUM7SUFuaEJRLFVBQVU7UUFDZixNQUFNLFlBQVksR0FBa0IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENB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SyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7YUFBTSxJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1lBQ3ZFLE9BQU8sS0FBYyxDQUFDO1NBQ3ZCO2FBQU07WUFDTCxJQUFJO2dCQUNGLE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7YUFDcEI7U0FDRjtRQUVELE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlY29Ob2RlVHlwZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2RlY28tbm9kZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge1ZhcmlhdGlvblNldHRpbmdzfSBmcm9tICcuLi8uLi9tb2RlbC92YXJpYXRpb24tc2V0dGluZ3MnO1xyXG5pbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7VmFyaWF0aW9ufSBmcm9tICcuLi8uLi9tb2RlbC92YXJpYXRpb24nO1xyXG5pbXBvcnQge1ZhcmlhdGlvblV0aWxzfSBmcm9tICcuLi8uLi91dGlscy92YXJpYXRpb24tdXRpbHMnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7Q29sb3IsIERvdWJsZVNpZGUsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBNZXNoLCBNZXNoUGhvbmdNYXRlcmlhbCwgTWVzaFBoeXNpY2FsTWF0ZXJpYWwsIE1lc2hQaHlzaWNhbE1hdGVyaWFsUGFyYW1ldGVycywgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsIE1lc2hTdGFuZGFyZE1hdGVyaWFsUGFyYW1ldGVycywgTmVhcmVzdEZpbHRlciwgT2JqZWN0M0R9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtmaWx0ZXIsIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtNYXRlcmlhbH0gZnJvbSAnLi4vLi4vbW9kZWwvbWF0ZXJpYWwnO1xyXG5pbXBvcnQge0Jhc2VVdGlsc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZS11dGlscyc7XHJcbmltcG9ydCB7SW1hZ2VVdGlsc30gZnJvbSAnLi4vLi4vdXRpbHMvaW1hZ2UudXRpbHMnO1xyXG5pbXBvcnQge0Fzc2V0VXRpbHN9IGZyb20gJy4uLy4uL3V0aWxzL2Fzc2V0LnV0aWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBWYXJpYXRpb25IZWxwZXIgZXh0ZW5kcyBCYXNlVXRpbHMge1xyXG5cclxuICBwdWJsaWMgYXNzZXRQYXRoOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgX3ZhcmlhdGlvbnM6IFZhcmlhdGlvblNldHRpbmdzW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfbGFzdEtub3duVmFyaWF0aW9uczogTWFwPHN0cmluZywgVmFyaWF0aW9uW10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhcmlhdGlvbk1hcDogVmFyaWF0aW9uW11bXSA9IEFycmF5LmZyb20odGhpcy5fbGFzdEtub3duVmFyaWF0aW9ucy52YWx1ZXMoKSk7XHJcbiAgICB2YXJpYXRpb25NYXAuZm9yRWFjaCgodmFyaWF0aW9ucykgPT4ge1xyXG4gICAgICB2YXJpYXRpb25zLmZvckVhY2goKHZhcmlhdGlvbikgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAodmFyaWF0aW9uLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb24ubWF0ZXJpYWwudGV4dHVyZSkge1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvbi5tYXRlcmlhbC50ZXh0dXJlLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFyaWF0aW9uLm1hdGVyaWFsLm5vcm1hbCkge1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvbi5tYXRlcmlhbC5ub3JtYWwuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb24ubWF0ZXJpYWwubWV0YWxuZXNzKSB7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uLm1hdGVyaWFsLm1ldGFsbmVzcy5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbC5yb3VnaG5lc3MpIHtcclxuICAgICAgICAgICAgICB2YXJpYXRpb24ubWF0ZXJpYWwucm91Z2huZXNzLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFyaWF0aW9uLm1hdGVyaWFsLmFvKSB7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uLm1hdGVyaWFsLmFvLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBWYXJpYXRpb25VdGlscy5DbGVhckNhY2hlKCk7XHJcbiAgICBJbWFnZVV0aWxzLkNsZWFyQ2FjaGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkUGFydChvYmo6IE9iamVjdDNELCBwYXJ0czogYW55W10sIHVzZVBicjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBsZW46IG51bWJlciA9IHBhcnRzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGxldCBwYXJ0U2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzO1xyXG4gICAgICAgIGlmIChwYXJ0c1tpXS5kZWNvTm9kZSAmJiBwYXJ0c1tpXS5kZWNvTm9kZS5tYXRlcmlhbFVybCAmJiBwYXJ0c1tpXS5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuUGFydCkge1xyXG4gICAgICAgICAgcGFydFNldHRpbmdzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZFZhcmlhdGlvbkJ5VXJsKHBhcnRzW2ldLmRlY29Ob2RlLm1hdGVyaWFsQ29kZSwgcGFydHNbaV0uZGVjb05vZGUubWF0ZXJpYWxVcmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFydHNbaV0uZGVjb05vZGUgJiYgcGFydHNbaV0uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgJiYgcGFydHNbaV0uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQpIHtcclxuICAgICAgICAgIHBhcnRTZXR0aW5ncyA9IGF3YWl0IFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb24odGhpcy5hc3NldFBhdGgsIHRoaXMuYXNzZXRQYXRoLCBwYXJ0c1tpXS5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSB8fCBwYXJ0c1tpXS5kZWNvSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFydFNldHRpbmdzKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJ0VmFyaWF0aW9uOiBWYXJpYXRpb24gPSBuZXcgVmFyaWF0aW9uKCk7XHJcbiAgICAgICAgICBwYXJ0VmFyaWF0aW9uLmRlY29JZCA9IHBhcnNlRmxvYXQocGFydHNbaV0uZGVjb05vZGUuaWQpO1xyXG4gICAgICAgICAgcGFydFZhcmlhdGlvbi5icmFuZElkID0gcGFydHNbaV0uZGVjb05vZGUuYnJhbmRJZDtcclxuICAgICAgICAgIHBhcnRWYXJpYXRpb24uZ2FtZU9iamVjdE5hbWUgPSBwYXJ0c1tpXS5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZTtcclxuICAgICAgICAgIHBhcnRWYXJpYXRpb24ubWF0ZXJpYWwgPSBhd2FpdCBBc3NldFV0aWxzLkNyZWF0ZU1hdGVyaWFsRnJvbUFzc2V0KHBhcnRTZXR0aW5ncyk7XHJcbiAgICAgICAgICB0aGlzLl9hcHBseU1hdGVyaWFsUGFydChvYmosIHBhcnRWYXJpYXRpb24sIHBhcnRzW2ldLm5vZGUsIHVzZVBicik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZFZhcmlhdGlvbihvYmo6IE9iamVjdDNELCBwYXJ0czogYW55W10sIHVzZVBicjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBsZW46IG51bWJlciA9IHBhcnRzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbnM6IERlY29Ob2RlW10gPSBwYXJ0c1tpXS52YXJpYXRpb25zO1xyXG4gICAgICAgIGlmICghdmFyaWF0aW9ucyB8fCB2YXJpYXRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2dldExhc3RLbm93blZhcmlhdGlvbnMocGFydHNbaV0ubm9kZUlkKSkge1xyXG4gICAgICAgICAgICBwYXJ0c1tpXS52YXJpYXRpb25zID0gdGhpcy5fZ2V0TGFzdEtub3duVmFyaWF0aW9ucyhwYXJ0c1tpXS5ub2RlSWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBseVZhcmlhdGlvbnMob2JqLCBwYXJ0c1tpXSwgdXNlUGJyKTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGFzdEtub3duVmFyaWF0aW9uczogVmFyaWF0aW9uW10gPSBbXTtcclxuICAgICAgICBjb25zdCB2YXJpYXRpb25Qcm9taXNlOiBQcm9taXNlPGFueT5bXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFyaWF0aW9ucy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgbGV0IHZhcmlhdGlvbnNOYW1lOiBzdHJpbmcgPSAnJztcclxuICAgICAgICAgIGlmICh2YXJpYXRpb25zW2pdLm1hdGVyaWFsQ29kZSAmJiB2YXJpYXRpb25zW2pdLm1hdGVyaWFsVXJsKSB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvbnNOYW1lID0gdmFyaWF0aW9uc1tqXS5tYXRlcmlhbENvZGU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25zTmFtZSA9IHZhcmlhdGlvbnNbal0uZ2FtZU9iamVjdE5hbWUgfHwgcGFydHNbaV0uZGVjb0lkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyaWF0aW9uUHJvbWlzZS5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLmxvYWRUaGVWYXJpYXRpb24odmFyaWF0aW9uc05hbWUpLnRoZW4oKHZhcmlhdGlvblNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1ZhcmlhdGlvbjogVmFyaWF0aW9uID0gbmV3IFZhcmlhdGlvbigpO1xyXG4gICAgICAgICAgICAgIG5ld1ZhcmlhdGlvbi5kZWNvSWQgPSB2YXJpYXRpb25zW2pdLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdWYXJpYXRpb24nID8gKHZhcmlhdGlvbnNbal0gYXMgdW5rbm93biBhcyBWYXJpYXRpb24pLmRlY29JZCA6IHBhcnNlRmxvYXQodmFyaWF0aW9uc1tqXS5pZCk7XHJcbiAgICAgICAgICAgICAgbmV3VmFyaWF0aW9uLm5vZGUgPSB2YXJpYXRpb25zW2pdLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdWYXJpYXRpb24nID8gKHZhcmlhdGlvbnNbal0gYXMgdW5rbm93biBhcyBWYXJpYXRpb24pLm5vZGUgOiB2YXJpYXRpb25zW2pdLm5vZGVJZDtcclxuICAgICAgICAgICAgICBuZXdWYXJpYXRpb24uYnJhbmRJZCA9IHZhcmlhdGlvbnNbal0uYnJhbmRJZDtcclxuICAgICAgICAgICAgICBuZXdWYXJpYXRpb24ub3B0aW9uVGV4dCA9ICh2YXJpYXRpb25zW2pdIGFzIGFueSkub3B0aW9uVGV4dDtcclxuICAgICAgICAgICAgICBuZXdWYXJpYXRpb24uZ2FtZU9iamVjdE5hbWUgPSB2YXJpYXRpb25zW2pdLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgICAgIG5ld1ZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9ICh2YXJpYXRpb25zW2pdIGFzIGFueSkuc3VwcGxpZXJBcnRpY2xlTnI7XHJcbiAgICAgICAgICAgICAgbmV3VmFyaWF0aW9uLm1hdGVyaWFsSWQgPSAodmFyaWF0aW9uc1tqXSBhcyBhbnkpLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAgICAgbmV3VmFyaWF0aW9uLm1hdGVyaWFsID0gdmFyaWF0aW9uU2V0dGluZ3MgPyB2YXJpYXRpb25TZXR0aW5ncy5tYXRlcmlhbCA6IG51bGw7XHJcbiAgICAgICAgICAgICAgbGFzdEtub3duVmFyaWF0aW9ucy5wdXNoKG5ld1ZhcmlhdGlvbik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh2YXJpYXRpb25Qcm9taXNlKTtcclxuICAgICAgICB0aGlzLl9zZXRMYXN0S25vd25WYXJpYXRpb25zKGAke3BhcnRzW2ldLm5vZGVJZH1fJHtwYXJ0c1tpXS5ub2RlfWAsIGxhc3RLbm93blZhcmlhdGlvbnMpO1xyXG4gICAgICAgIHBhcnRzW2ldLnZhcmlhdGlvbnMgPSBsYXN0S25vd25WYXJpYXRpb25zO1xyXG4gICAgICAgIHRoaXMuX2FwcGx5VmFyaWF0aW9ucyhvYmosIHBhcnRzW2ldLCB1c2VQYnIpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMubG9nKGUubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpOiBWYXJpYXRpb25TZXR0aW5ncyB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3ZhcmlhdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5fdmFyaWF0aW9uc1tpXS5pZCAmJiB0aGlzLl92YXJpYXRpb25zW2ldLmlkID09PSBpZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YXJpYXRpb25zW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0KHZhcmlhdGlvbnM6IFZhcmlhdGlvblNldHRpbmdzKTogdm9pZCB7XHJcbiAgICBjb25zdCBpZHg6IG51bWJlciA9IHRoaXMuX3ZhcmlhdGlvbnMuZmluZEluZGV4KHYgPT4gdi5pZCA9PT0gdmFyaWF0aW9ucy5pZCk7XHJcbiAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgdGhpcy5fdmFyaWF0aW9uc1tpZHhdID0gdmFyaWF0aW9ucztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3ZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb25zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmVsb2FkVmFyaWF0aW9ucyhmaWxlTmFtZXM6IERlY29Ob2RlW10pOiB2b2lkIHtcclxuICAgIGZpbGVOYW1lcy5mb3JFYWNoKChub2RlOiBEZWNvTm9kZSkgPT4ge1xyXG4gICAgICBpZiAobm9kZS5tYXRlcmlhbFVybCkge1xyXG4gICAgICAgIGlmIChub2RlLm1hdGVyaWFsQ29kZSAmJiAhdGhpcy5nZXQobm9kZS5tYXRlcmlhbENvZGUpKSB7XHJcbiAgICAgICAgICBjb25zdCBzZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MgPSBuZXcgVmFyaWF0aW9uU2V0dGluZ3MoKTtcclxuICAgICAgICAgIHNldHRpbmdzLmlkID0gbm9kZS5tYXRlcmlhbENvZGU7XHJcbiAgICAgICAgICBzZXR0aW5ncy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvbnMucHVzaChzZXR0aW5ncyk7XHJcbiAgICAgICAgICBWYXJpYXRpb25VdGlscy5Mb2FkVmFyaWF0aW9uQnlVcmwobm9kZS5tYXRlcmlhbENvZGUsIG5vZGUubWF0ZXJpYWxVcmwpLnRoZW4oKHZhcmlhdGlvblNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncykgPT4ge1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb25TZXR0aW5ncykge1xyXG4gICAgICAgICAgICAgIHNldHRpbmdzLmNvcHlGcm9tKHZhcmlhdGlvblNldHRpbmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXR0aW5ncy5sb2FkZWQubmV4dChzZXR0aW5ncyk7XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgdmFyaWF0aW9uICR7bm9kZS5tYXRlcmlhbENvZGV9OmAsIGVycik7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0dGluZ3MubG9hZGVkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5nYW1lT2JqZWN0TmFtZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5nZXQobm9kZS5nYW1lT2JqZWN0TmFtZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdzOiBWYXJpYXRpb25TZXR0aW5ncyA9IG5ldyBWYXJpYXRpb25TZXR0aW5ncygpO1xyXG4gICAgICAgICAgc2V0dGluZ3MuaWQgPSBub2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgc2V0dGluZ3MubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLl92YXJpYXRpb25zLnB1c2goc2V0dGluZ3MpO1xyXG4gICAgICAgICAgVmFyaWF0aW9uVXRpbHMuTG9hZFZhcmlhdGlvbih0aGlzLmFzc2V0UGF0aCwgbm9kZS5nYW1lT2JqZWN0TmFtZSkudGhlbigodmFyaWF0aW9uU2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvblNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgc2V0dGluZ3MuY29weUZyb20odmFyaWF0aW9uU2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRlZC5uZXh0KHNldHRpbmdzKTtcclxuICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyB2YXJpYXRpb24gJHtub2RlLmdhbWVPYmplY3ROYW1lfTpgLCBlcnIpO1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWRlZC5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkVGhlVmFyaWF0aW9uKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFZhcmlhdGlvblNldHRpbmdzPiB7XHJcbiAgICBpZiAoIWZpbGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzID0gdGhpcy5nZXQoZmlsZU5hbWUpO1xyXG4gICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChzZXR0aW5ncy5sb2FkaW5nKSB7XHJcbiAgICAgIGNvbnN0IHNldHQgPSBhd2FpdCB0aGlzLl93YWl0Rm9yVmFyaWF0aW9uVG9Mb2FkKHNldHRpbmdzKTtcclxuICAgICAgYXdhaXQgdGhpcy5fbG9hZE1hdGVyaWFsRnJvbVNldHRpbmdzKHNldHQpO1xyXG4gICAgICByZXR1cm4gc2V0dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRNYXRlcmlhbEZyb21TZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgICAgIHJldHVybiBzZXR0aW5ncztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2xvYWRNYXRlcmlhbEZyb21TZXR0aW5ncyhzZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChzZXR0aW5ncykge1xyXG4gICAgICBpZiAoIXNldHRpbmdzLm1hdGVyaWFsKSB7XHJcbiAgICAgICAgc2V0dGluZ3MubWF0ZXJpYWwgPSBhd2FpdCBBc3NldFV0aWxzLkNyZWF0ZU1hdGVyaWFsRnJvbUFzc2V0KHNldHRpbmdzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfd2FpdEZvclZhcmlhdGlvblRvTG9hZChzZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MpOiBQcm9taXNlPFZhcmlhdGlvblNldHRpbmdzPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIHNldHRpbmdzLmxvYWRlZC5waXBlKGZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBWYXJpYXRpb25TZXR0aW5ncyA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSwgdGFrZSgxKSkuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q2hpbGRyZW5GaWx0ZXJCeVByb3Aob2JqOiBPYmplY3QzRCwgdXNlckRhdGFPYmplY3RQcm9wOiBzdHJpbmcsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSk6IE9iamVjdDNEW10ge1xyXG4gICAgcmV0dXJuIG9iai5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiB7XHJcbiAgICAgIHJldHVybiBjaGlsZC51c2VyRGF0YSAmJlxyXG4gICAgICAgIGNoaWxkLnVzZXJEYXRhLmhhc093blByb3BlcnR5KHVzZXJEYXRhT2JqZWN0UHJvcCkgJiZcclxuICAgICAgICBjaGlsZC51c2VyRGF0YVt1c2VyRGF0YU9iamVjdFByb3BdLmhhc093blByb3BlcnR5KHByb3ApICYmXHJcbiAgICAgICAgY2hpbGQudXNlckRhdGFbdXNlckRhdGFPYmplY3RQcm9wXVtwcm9wXSA9PT0gdmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FwcGx5TWF0ZXJpYWxQYXJ0KG9iajogT2JqZWN0M0QsIHBhcnRNYXRlcmlhbDogYW55LCBub2RlSWQ6IGFueSwgdXNlUGJyOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW5GaWx0ZXJCeVByb3Aob2JqLCAnc2VsZWN0aW9uJywgJ25vZGUnLCBub2RlSWQpO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBjaGlsZHJlbi5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIGNoaWxkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjaGlsZC50cmF2ZXJzZSgobWVzaDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoKG1lc2ggaW5zdGFuY2VvZiBNZXNoIHx8IG1lc2guY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnKSAmJiBwYXJ0TWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkpIHsgLy8gbXVsdGltYXRlcmlhbCBzdXBwb3J0XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpsZW46IG51bWJlciA9IG1lc2gubWF0ZXJpYWwubGVuZ3RoOyBqIDwgamxlbjsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbFtqXS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZml4ZWRfZnJhbWUnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbFtqXSA9IHRoaXMuX3NldE1lc2hNYXRlcmlhbEZyb21WYXJpYXRpb24obWVzaC5tYXRlcmlhbFtqXS5uYW1lLCBwYXJ0TWF0ZXJpYWwsIHVzZVBicik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsLm5hbWUgJiYgbWVzaC5tYXRlcmlhbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZml4ZWRfZnJhbWUnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwgPSB0aGlzLl9zZXRNZXNoTWF0ZXJpYWxGcm9tVmFyaWF0aW9uKG1lc2gubWF0ZXJpYWwubmFtZSwgcGFydE1hdGVyaWFsLCB1c2VQYnIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hcHBseVZhcmlhdGlvbnMob2JqOiBPYmplY3QzRCwgcGFydDogYW55LCB1c2VQYnI6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbkZpbHRlckJ5UHJvcChvYmosICdzZWxlY3Rpb24nLCAnbm9kZScsIHBhcnQubm9kZSk7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IGNoaWxkcmVuLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgY2hpbGQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNoaWxkLnRyYXZlcnNlKChtZXNoOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICgobWVzaCBpbnN0YW5jZW9mIE1lc2ggfHwgbWVzaC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcpICYmIHBhcnQudmFyaWF0aW9ucyAmJiBwYXJ0LnZhcmlhdGlvbnMubGVuZ3RoID4gMCAmJiBtZXNoLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjXycpKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFydC52YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBWYXJpYXRpb24gPSBwYXJ0LnZhcmlhdGlvbnNbal07XHJcbiAgICAgICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWxUb1NlYXJjaDogc3RyaW5nID0gISF2YXJpYXRpb24ubWF0ZXJpYWxJZCA/IHZhcmlhdGlvbi5tYXRlcmlhbElkLnRvTG93ZXJDYXNlKCkgOiAnZGVmYXVsdCc7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSkgeyAvLyBtdWx0aW1hdGVyaWFsIHN1cHBvcnRcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbSA9IDAsIG1sZW46IG51bWJlciA9IG1lc2gubWF0ZXJpYWwubGVuZ3RoOyBtIDwgbWxlbjsgbSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWxbbV0ubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobWF0ZXJpYWxUb1NlYXJjaCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIFJlbW92ZSB0aGlzIHRzLWlnbm9yZSBhbmQgZml4IHRoZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YXJpYXRpb24ubWF0ZXJpYWwgaW5zdGFuY2VvZiBNYXRlcmlhbCB8fCB2YXJpYXRpb24ubWF0ZXJpYWwuY29uc3RydWN0b3IubmFtZSA9PT0gJ01hdGVyaWFsJykgJiYgdmFyaWF0aW9uLm1hdGVyaWFsLmlzTWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBhIFRIUkVFLk1hdGVyaWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWxbbV0gPSB2YXJpYXRpb24ubWF0ZXJpYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsW21dLm5hbWUgJiYgKG1lc2gubWF0ZXJpYWxbbV0ubmFtZSA9PT0gJ0ZpeGVkX0dsYXNzJyB8fCBtZXNoLm1hdGVyaWFsW21dLm5hbWUgPT09ICdEZWZhdWx0X0dsYXNzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbFttXSA9IHRoaXMuX3NldE1lc2hNYXRlcmlhbEZyb21WYXJpYXRpb24obWVzaC5tYXRlcmlhbFttXS5uYW1lLCB2YXJpYXRpb24sIHVzZVBicik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsW21dLm5hbWUgJiYgKG1lc2gubWF0ZXJpYWxbbV0ubmFtZSA9PT0gJ0ZpeGVkX0dsYXNzJyB8fCBtZXNoLm1hdGVyaWFsW21dLm5hbWUgPT09ICdEZWZhdWx0X0dsYXNzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWwubmFtZSAmJiBtZXNoLm1hdGVyaWFsLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG1hdGVyaWFsVG9TZWFyY2gpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gUmVtb3ZlIHRoaXMgdHMtaWdub3JlIGFuZCBmaXggdGhlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgodmFyaWF0aW9uLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwgfHwgdmFyaWF0aW9uLm1hdGVyaWFsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNYXRlcmlhbCcpICYmIHZhcmlhdGlvbi5tYXRlcmlhbC5pc01hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGEgVEhSRUUuTWF0ZXJpYWxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwgPSB2YXJpYXRpb24ubWF0ZXJpYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbC5uYW1lID09PSAnRml4ZWRfR2xhc3MnIHx8IG1lc2gubWF0ZXJpYWwubmFtZSA9PT0gJ0RlZmF1bHRfR2xhc3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsID0gdGhpcy5fc2V0TWVzaE1hdGVyaWFsRnJvbVZhcmlhdGlvbihtZXNoLm1hdGVyaWFsLm5hbWUsIHZhcmlhdGlvbiwgdXNlUGJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsLm5hbWUgPT09ICdGaXhlZF9HbGFzcycgfHwgbWVzaC5tYXRlcmlhbC5uYW1lID09PSAnRGVmYXVsdF9HbGFzcycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE1lc2hNYXRlcmlhbEZyb21WYXJpYXRpb24obmFtZTogc3RyaW5nLCB2YXJpYXRpb246IFZhcmlhdGlvbiwgdXNlUGJyOiBib29sZWFuID0gZmFsc2UpOiBUSFJFRS5NYXRlcmlhbCB7XHJcbiAgICBjb25zdCBtYXRlcmlhbCA9IHZhcmlhdGlvbi5tYXRlcmlhbDtcclxuICAgIGlmIChtYXRlcmlhbC50ZXh0dXJlKSB7XHJcbiAgICAgIG1hdGVyaWFsLnRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICBtYXRlcmlhbC50ZXh0dXJlLm1hcHBpbmcgPSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZztcclxuICAgIH1cclxuICAgIGlmICghdXNlUGJyKSB7XHJcbiAgICAgIGNvbnN0IG5ld01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCA9IG5ldyBNZXNoUGhvbmdNYXRlcmlhbCh7XHJcbiAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICBzaGluaW5lc3M6IG1hdGVyaWFsLnNoaW5pbmVzcyxcclxuICAgICAgICBzcGVjdWxhcjogbWF0ZXJpYWwuc3BlY3VsYXIsXHJcbiAgICAgICAgbWFwOiBtYXRlcmlhbC50ZXh0dXJlLFxyXG4gICAgICAgIG5vcm1hbE1hcDogbWF0ZXJpYWwubm9ybWFsXHJcbiAgICAgIH0pO1xyXG4gICAgICBuZXdNYXRlcmlhbC5jb2xvci5zZXRSR0IoMC44LCAwLjgsIDAuOCk7XHJcbiAgICAgIG5ld01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIG5ld01hdGVyaWFsO1xyXG4gICAgfVxyXG4gICAgaWYgKG1hdGVyaWFsLnNoZWVuIHx8IG1hdGVyaWFsLnNoZWVuQ29sb3IgfHwgbWF0ZXJpYWwucmVmbGVjdGl2aXR5IHx8IG1hdGVyaWFsLnRyYW5zbWlzc2lvbikgeyAvLyBUT0RPOiBQcm9wZXIgY2hlY2sgZm9yIGFsbCB1bmlxdWUgcGh5c2ljYWwgbWF0ZXJpYWwgcHJvcGVydGllc1xyXG4gICAgICBjb25zdCBwYXJhbXM6IE1lc2hQaHlzaWNhbE1hdGVyaWFsUGFyYW1ldGVycyA9IHtcclxuICAgICAgICAvLyBzaWRlOiBtYXRlcmlhbC5zaWRlID8gbWF0ZXJpYWwuc2lkZSA6IEZyb250U2lkZSxcclxuICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgIHJvdWdobmVzczogbWF0ZXJpYWwucm91Z2huZXNzVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5yb3VnaG5lc3NWYWx1ZSAhPT0gbnVsbCA/IG1hdGVyaWFsLnJvdWdobmVzc1ZhbHVlIDogMSxcclxuICAgICAgICBtZXRhbG5lc3M6IG1hdGVyaWFsLm1ldGFsbmVzc1ZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwubWV0YWxuZXNzVmFsdWUgIT09IG51bGwgPyBtYXRlcmlhbC5tZXRhbG5lc3NWYWx1ZSA6IDAsXHJcbiAgICAgICAgZW52TWFwSW50ZW5zaXR5OiBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgPyBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgOiAwLjAxLFxyXG4gICAgICAgIGNsZWFyY29hdE1hcDogbWF0ZXJpYWwuY2xlYXJjb2F0TWFwID8gbWF0ZXJpYWwuY2xlYXJjb2F0TWFwIDogbnVsbCxcclxuICAgICAgICBjbGVhcmNvYXRSb3VnaG5lc3NNYXA6IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCA/IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCA6IG51bGwsXHJcbiAgICAgICAgYXR0ZW51YXRpb25EaXN0YW5jZTogSW5maW5pdHlcclxuICAgICAgICAvLyB3aXJlZnJhbWU6IHRydWUsXHJcbiAgICAgICAgLy8gb3BhY2l0eTogMC4zLFxyXG4gICAgICAgIC8vIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAobWF0ZXJpYWwuZGlzcGxhY2VtZW50VmFsdWUpIHtcclxuICAgICAgICBwYXJhbXMuZGlzcGxhY2VtZW50U2NhbGUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwub3BhY2l0eSkge1xyXG4gICAgICAgIHBhcmFtcy5vcGFjaXR5ID0gbWF0ZXJpYWwub3BhY2l0eTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwudHJhbnNwYXJlbnQpIHtcclxuICAgICAgICBwYXJhbXMudHJhbnNwYXJlbnQgPSBtYXRlcmlhbC50cmFuc3BhcmVudDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZW1pc3NpdmVWYWx1ZSkge1xyXG4gICAgICAgIHBhcmFtcy5lbWlzc2l2ZSA9IG1hdGVyaWFsLmVtaXNzaXZlVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5VmFsdWUpIHtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eVZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC50ZXh0dXJlKSB7XHJcbiAgICAgICAgcGFyYW1zLm1hcCA9IG1hdGVyaWFsLnRleHR1cmU7XHJcbiAgICAgICAgcGFyYW1zLm1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmFvKSB7XHJcbiAgICAgICAgcGFyYW1zLmFvTWFwID0gbWF0ZXJpYWwuYW87XHJcbiAgICAgICAgcGFyYW1zLmFvTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwucm91Z2huZXNzKSB7XHJcbiAgICAgICAgcGFyYW1zLnJvdWdobmVzc01hcCA9IG1hdGVyaWFsLnJvdWdobmVzcztcclxuICAgICAgICBwYXJhbXMucm91Z2huZXNzTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAvLyBtYXRlcmlhbC5yb3VnaG5lc3MubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwubWV0YWxuZXNzKSB7XHJcbiAgICAgICAgcGFyYW1zLm1ldGFsbmVzc01hcCA9IG1hdGVyaWFsLm1ldGFsbmVzcztcclxuICAgICAgICBwYXJhbXMubWV0YWxuZXNzTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwubm9ybWFsKSB7XHJcbiAgICAgICAgcGFyYW1zLm5vcm1hbE1hcCA9IG1hdGVyaWFsLm5vcm1hbDtcclxuICAgICAgICBwYXJhbXMubm9ybWFsTWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZGlzcGxhY2VtZW50KSB7XHJcbiAgICAgICAgcGFyYW1zLmRpc3BsYWNlbWVudE1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudDtcclxuICAgICAgICBwYXJhbXMuZGlzcGxhY2VtZW50TWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZW1pc3NpdmUpIHtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2ZTtcclxuICAgICAgICBwYXJhbXMuZW1pc3NpdmVNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5lbnZNYXApIHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5ICE9IG51bGwgfHwgMCkge1xyXG4gICAgICAgICAgcGFyYW1zLmVudk1hcCA9IG1hdGVyaWFsLmVudk1hcDtcclxuICAgICAgICAgIHBhcmFtcy5lbnZNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZztcclxuICAgICAgICAgIG1hdGVyaWFsLmVudk1hcC5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG4gICAgICAgICAgbWF0ZXJpYWwuZW52TWFwLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5yZWZsZWN0aXZpdHkpIHtcclxuICAgICAgICBwYXJhbXMucmVmbGVjdGl2aXR5ID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5zaWRlKSB7XHJcbiAgICAgICAgcGFyYW1zLnNpZGUgPSBtYXRlcmlhbC5zaWRlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtcy5zaWRlID0gRG91YmxlU2lkZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbmV3TWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsID0gbmV3IE1lc2hQaHlzaWNhbE1hdGVyaWFsKHBhcmFtcyk7XHJcbiAgICAgIG5ld01hdGVyaWFsLmNvbG9yLnNldFJHQigxLCAxLCAxKTtcclxuICAgICAgaWYgKG1hdGVyaWFsLnNoZWVuKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwuc2hlZW4gPSBtYXRlcmlhbC5zaGVlbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG1hdGVyaWFsLnNoZWVuQ29sb3IpIHtcclxuICAgICAgICBuZXdNYXRlcmlhbC5zaGVlbkNvbG9yID0gdGhpcy5fY3JlYXRlVmFsaWRDb2xvcihtYXRlcmlhbC5zaGVlbkNvbG9yKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBBZGQgZmFsbGJhY2sgZm9yIGJsZW5kZXIgcmVuZGVyXHJcbiAgICAgICAgbmV3TWF0ZXJpYWwuc2hlZW5Db2xvciA9IG5ldyBDb2xvcigxLCAxLCAxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgPSBtYXRlcmlhbC5zaGVlblJvdWdobmVzcztcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuc2hlZW5Db2xvck1hcCkge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuQ29sb3JNYXAgPSBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwO1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuQ29sb3JNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcCkge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwID0gbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXA7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC50cmFuc21pc3Npb24pIHtcclxuICAgICAgICBuZXdNYXRlcmlhbC50cmFuc21pc3Npb24gPSBtYXRlcmlhbC50cmFuc21pc3Npb247XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmlvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmlvciAhPT0gbnVsbCkge1xyXG4gICAgICAgIG5ld01hdGVyaWFsLmlvciA9IG1hdGVyaWFsLmlvcjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwudGhpY2tuZXNzICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwudGhpY2tuZXNzICE9PSBudWxsKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwudGhpY2tuZXNzID0gbWF0ZXJpYWwudGhpY2tuZXNzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eSAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHkgPSBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwKSB7XHJcbiAgICAgICAgbmV3TWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwO1xyXG4gICAgICAgIG5ld01hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG5ld01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIG5ld01hdGVyaWFsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcGFyYW1zOiBNZXNoU3RhbmRhcmRNYXRlcmlhbFBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgLy8gc2lkZTogbWF0ZXJpYWwuc2lkZSA/IG1hdGVyaWFsLnNpZGUgOiBGcm9udFNpZGUsXHJcbiAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICByb3VnaG5lc3M6IG1hdGVyaWFsLnJvdWdobmVzc1ZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwucm91Z2huZXNzVmFsdWUgIT09IG51bGwgPyBtYXRlcmlhbC5yb3VnaG5lc3NWYWx1ZSA6IDEsXHJcbiAgICAgICAgbWV0YWxuZXNzOiBtYXRlcmlhbC5tZXRhbG5lc3NWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLm1ldGFsbmVzc1ZhbHVlICE9PSBudWxsID8gbWF0ZXJpYWwubWV0YWxuZXNzVmFsdWUgOiAwLFxyXG4gICAgICAgIGVudk1hcEludGVuc2l0eTogbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5ID8gbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5IDogMC4wMVxyXG4gICAgICAgIC8vIHdpcmVmcmFtZTogdHJ1ZSxcclxuICAgICAgICAvLyBvcGFjaXR5OiAwLjMsXHJcbiAgICAgICAgLy8gdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICAgIGlmIChtYXRlcmlhbC5kaXNwbGFjZW1lbnRWYWx1ZSkge1xyXG4gICAgICAgIHBhcmFtcy5kaXNwbGFjZW1lbnRTY2FsZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5vcGFjaXR5KSB7XHJcbiAgICAgICAgcGFyYW1zLm9wYWNpdHkgPSBtYXRlcmlhbC5vcGFjaXR5O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC50cmFuc3BhcmVudCkge1xyXG4gICAgICAgIHBhcmFtcy50cmFuc3BhcmVudCA9IG1hdGVyaWFsLnRyYW5zcGFyZW50O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5lbWlzc2l2ZVZhbHVlKSB7XHJcbiAgICAgICAgcGFyYW1zLmVtaXNzaXZlID0gbWF0ZXJpYWwuZW1pc3NpdmVWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHlWYWx1ZSkge1xyXG4gICAgICAgIHBhcmFtcy5lbWlzc2l2ZUludGVuc2l0eSA9IG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5VmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnRleHR1cmUpIHtcclxuICAgICAgICBwYXJhbXMubWFwID0gbWF0ZXJpYWwudGV4dHVyZTtcclxuICAgICAgICBwYXJhbXMubWFwLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0ZXJpYWwuYW8pIHtcclxuICAgICAgICBwYXJhbXMuYW9NYXAgPSBtYXRlcmlhbC5hbztcclxuICAgICAgICBwYXJhbXMuYW9NYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5yb3VnaG5lc3MpIHtcclxuICAgICAgICBwYXJhbXMucm91Z2huZXNzTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzO1xyXG4gICAgICAgIHBhcmFtcy5yb3VnaG5lc3NNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIG1hdGVyaWFsLnJvdWdobmVzcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5tZXRhbG5lc3MpIHtcclxuICAgICAgICBwYXJhbXMubWV0YWxuZXNzTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xyXG4gICAgICAgIHBhcmFtcy5tZXRhbG5lc3NNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5ub3JtYWwpIHtcclxuICAgICAgICBwYXJhbXMubm9ybWFsTWFwID0gbWF0ZXJpYWwubm9ybWFsO1xyXG4gICAgICAgIHBhcmFtcy5ub3JtYWxNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5kaXNwbGFjZW1lbnQpIHtcclxuICAgICAgICBwYXJhbXMuZGlzcGxhY2VtZW50TWFwID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50O1xyXG4gICAgICAgIHBhcmFtcy5kaXNwbGFjZW1lbnRNYXAubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRlcmlhbC5lbWlzc2l2ZSkge1xyXG4gICAgICAgIHBhcmFtcy5lbWlzc2l2ZU1hcCA9IG1hdGVyaWFsLmVtaXNzaXZlO1xyXG4gICAgICAgIHBhcmFtcy5lbWlzc2l2ZU1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLmVudk1hcCkge1xyXG4gICAgICAgIGlmIChtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgIT0gbnVsbCB8fCAwKSB7XHJcbiAgICAgICAgICBwYXJhbXMuZW52TWFwID0gbWF0ZXJpYWwuZW52TWFwO1xyXG4gICAgICAgICAgcGFyYW1zLmVudk1hcC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nO1xyXG4gICAgICAgICAgbWF0ZXJpYWwuZW52TWFwLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcbiAgICAgICAgICBtYXRlcmlhbC5lbnZNYXAubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdGVyaWFsLnNpZGUpIHtcclxuICAgICAgICBwYXJhbXMuc2lkZSA9IG1hdGVyaWFsLnNpZGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFyYW1zLnNpZGUgPSBEb3VibGVTaWRlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZXdNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSBuZXcgTWVzaFN0YW5kYXJkTWF0ZXJpYWwocGFyYW1zKTtcclxuICAgICAgbmV3TWF0ZXJpYWwuY29sb3Iuc2V0UkdCKDEsIDEsIDEpO1xyXG4gICAgICBuZXdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICByZXR1cm4gbmV3TWF0ZXJpYWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRMYXN0S25vd25WYXJpYXRpb25zKGlkOiBzdHJpbmcsIHZhcmlhdGlvbjogVmFyaWF0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuX2xhc3RLbm93blZhcmlhdGlvbnMuc2V0KGlkLCB2YXJpYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0TGFzdEtub3duVmFyaWF0aW9ucyhpZDogc3RyaW5nKTogVmFyaWF0aW9uW10ge1xyXG4gICAgaWYgKHRoaXMuX2xhc3RLbm93blZhcmlhdGlvbnMuaGFzKGlkKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFzdEtub3duVmFyaWF0aW9ucy5nZXQoaWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVWYWxpZENvbG9yKGNvbG9yOiBDb2xvciB8IHN0cmluZyB8IG51bWJlcik6IENvbG9yIHtcclxuICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGlmICgvXiM/KFswLTlhLWZBLUZdezN9fFswLTlhLWZBLUZdezZ9KSQvLnRlc3QoY29sb3IpKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihgIyR7Y29sb3IucmVwbGFjZSgnIycsICcnKX1gKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChjb2xvciBpbnN0YW5jZW9mIENvbG9yIHx8IGNvbG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdDb2xvcicpIHtcclxuICAgICAgcmV0dXJuIGNvbG9yIGFzIENvbG9yO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gbmV3IENvbG9yKGNvbG9yKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgQ29sb3IoKTtcclxuICB9XHJcbn1cclxuIl19
|