@colijnit/configurator 260.1.2 → 261.1.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/bundles/colijnit-configurator.umd.js +18067 -1889
- package/bundles/colijnit-configurator.umd.js.map +1 -1
- package/colijnit-configurator.d.ts +2 -6
- package/esm2015/colijnit-configurator.js +2 -7
- package/esm2015/lib/builder.js +795 -0
- package/esm2015/lib/components/answer-card/answer-card.component.js +313 -0
- package/esm2015/lib/components/answer-card/answer-card.module.js +50 -0
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +182 -0
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +34 -0
- package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +490 -0
- package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +61 -0
- package/esm2015/lib/components/color-filter/color-filter.component.js +59 -0
- package/esm2015/lib/components/color-filter/color-filter.module.js +26 -0
- package/esm2015/lib/components/configurator/configurator.component.js +133 -0
- package/esm2015/lib/components/configurator/configurator.module.js +42 -0
- package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +222 -0
- package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +48 -0
- package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +82 -0
- package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +163 -0
- package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +49 -0
- package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +33 -0
- package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +60 -0
- package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +17 -0
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +46 -0
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +26 -0
- package/esm2015/lib/components/element-buttons/element-buttons.component.js +168 -0
- package/esm2015/lib/components/element-buttons/element-buttons.module.js +30 -0
- package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +186 -0
- package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +34 -0
- package/esm2015/lib/components/image-zoom/image-zoom.component.js +61 -0
- package/esm2015/lib/components/image-zoom/image-zoom.module.js +30 -0
- package/esm2015/lib/components/lite-selector/lite-selector.component.js +206 -0
- package/esm2015/lib/components/lite-selector/lite-selector.module.js +34 -0
- package/esm2015/lib/components/product-configurator/product-configurator.component.js +184 -0
- package/esm2015/lib/components/product-configurator/product-configurator.module.js +72 -0
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +237 -0
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +38 -0
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +284 -0
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +42 -0
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +72 -0
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +34 -0
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +82 -0
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +30 -0
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +80 -0
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +34 -0
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +93 -0
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +34 -0
- package/esm2015/lib/components/progress-bar/progress-bar.component.js +55 -0
- package/esm2015/lib/components/progress-bar/progress-bar.module.js +29 -0
- package/esm2015/lib/components/scene-options/scene-options.component.js +164 -0
- package/esm2015/lib/components/scene-options/scene-options.module.js +38 -0
- package/esm2015/lib/components/selections-summary/selections-summary.component.js +163 -0
- package/esm2015/lib/components/selections-summary/selections-summary.module.js +45 -0
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +171 -0
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +34 -0
- package/esm2015/lib/components/slideout/slideout.component.js +83 -0
- package/esm2015/lib/components/slideout/slideout.module.js +17 -0
- package/esm2015/lib/components/summary-line/summary-line.component.js +273 -0
- package/esm2015/lib/components/summary-line/summary-line.module.js +44 -0
- package/esm2015/lib/components/tag-filter/tag-filter.component.js +39 -0
- package/esm2015/lib/components/tag-filter/tag-filter.module.js +21 -0
- package/esm2015/lib/components/threedselector/threedselector.component.js +155 -0
- package/esm2015/lib/components/threedselector/threedselector.module.js +34 -0
- package/esm2015/lib/core/helper/variation-helper.js +553 -0
- package/esm2015/lib/core/shader/floor-fade.shader.js +33 -0
- package/esm2015/lib/core/textures/depth-data-texture.js +19 -0
- package/esm2015/lib/directives/directives.module.js +26 -0
- package/esm2015/lib/directives/visibility-observer-master.directive.js +53 -0
- package/esm2015/lib/directives/visibility-observer.directive.js +54 -0
- package/esm2015/lib/enum/ar-feature.enum.js +14 -0
- package/esm2015/lib/enum/configuration-key.enum.js +41 -0
- package/esm2015/lib/enum/configuration-template.enum.js +6 -0
- package/esm2015/lib/enum/device-size-type.js +7 -0
- package/esm2015/lib/enum/device-tier.enum.js +7 -0
- package/esm2015/lib/enum/icon.enum.js +113 -0
- package/esm2015/lib/enum/item-type.enum.js +23 -0
- package/esm2015/lib/enum/light.enum.js +9 -0
- package/esm2015/lib/enum/navigator-type.enum.js +6 -0
- package/esm2015/lib/enum/output-encoding.enum.js +9 -0
- package/esm2015/lib/enum/result-type.enum.js +21 -0
- package/esm2015/lib/enum/scene-event.enum.js +12 -0
- package/esm2015/lib/enum/shadow-map-type.enum.js +8 -0
- package/esm2015/lib/enum/texture-type.js +9 -0
- package/esm2015/lib/enum/tone-mapping-local.enum.js +12 -0
- package/esm2015/lib/enum/view-mode.enum.js +7 -0
- package/esm2015/lib/enum/xr-mode.enum.js +6 -0
- package/esm2015/lib/environments/environment.js +8 -0
- package/esm2015/lib/interfaces/aa-options.interface.js +2 -0
- package/esm2015/lib/interfaces/adjustable-element.interface.js +2 -0
- package/esm2015/lib/interfaces/ao-options.interface.js +2 -0
- package/esm2015/lib/interfaces/changes.interface.js +2 -0
- package/esm2015/lib/interfaces/configuration-data.interface.js +2 -0
- package/esm2015/lib/interfaces/light-preset.interface.js +2 -0
- package/esm2015/lib/interfaces/post-processing-setting.interface.js +2 -0
- package/esm2015/lib/interfaces/scene-option-button.interface.js +6 -0
- package/esm2015/lib/interfaces/screen-size-info.js +2 -0
- package/esm2015/lib/interfaces/setting.interface.js +2 -0
- package/esm2015/lib/interfaces/texture.interface.js +2 -0
- package/esm2015/lib/interfaces/vignette-options.interface.js +2 -0
- package/esm2015/lib/model/ar-position-indicator.js +18 -0
- package/esm2015/lib/model/camera-settings.js +14 -0
- package/esm2015/lib/model/configuration-result-object.js +6 -0
- package/esm2015/lib/model/configurator-error-message.js +9 -0
- package/esm2015/lib/model/configurator-settings.js +25 -0
- package/esm2015/lib/model/custom-button.js +16 -0
- package/esm2015/lib/model/factory.js +28 -0
- package/esm2015/lib/model/icon.js +112 -0
- package/esm2015/lib/model/intersected-objects.js +7 -0
- package/esm2015/lib/model/light-preset.js +73 -0
- package/esm2015/lib/model/light-properties.js +45 -0
- package/esm2015/lib/model/material.js +11 -0
- package/esm2015/lib/model/metadata.js +2 -0
- package/esm2015/lib/model/render-parameters.js +16 -0
- package/esm2015/lib/model/setting-options.js +71 -0
- package/esm2015/lib/model/settings.js +16 -0
- package/esm2015/lib/model/shadow-properties.js +10 -0
- package/esm2015/lib/model/skin.js +3 -0
- package/esm2015/lib/model/texture.js +76 -0
- package/esm2015/lib/model/variation-settings.js +54 -0
- package/esm2015/lib/model/variation.js +3 -0
- package/esm2015/lib/model/xr-reticle.js +79 -0
- package/esm2015/lib/modules/render/enum/scene-type.enum.js +6 -0
- package/esm2015/lib/modules/render/model/ar-parameters.js +12 -0
- package/esm2015/lib/modules/render/model/scene-setting.js +6 -0
- package/esm2015/lib/modules/render/model/scene-settings.js +3 -0
- package/esm2015/lib/pipes/append.pipe.js +21 -0
- package/esm2015/lib/pipes/google-translate.pipe.js +21 -0
- package/esm2015/lib/pipes/localize.pipe.js +28 -0
- package/esm2015/lib/pipes/pipes.module.js +41 -0
- package/esm2015/lib/pipes/prepend.pipe.js +21 -0
- package/esm2015/lib/pipes/strip-html.pipe.js +17 -0
- package/esm2015/lib/services/app-event.service.js +36 -0
- package/esm2015/lib/services/app-initializer.service.js +27 -0
- package/esm2015/lib/services/ar.service.js +844 -0
- package/esm2015/lib/services/build-furniture-base.service.js +1181 -0
- package/esm2015/lib/services/build-furniture-without-scene.service.js +86 -0
- package/esm2015/lib/services/build-furniture.service.js +169 -0
- package/esm2015/lib/services/bundle-initialzer.service.js +113 -0
- package/esm2015/lib/services/camera.service.js +123 -0
- package/esm2015/lib/services/configuration.service.js +79 -0
- package/esm2015/lib/services/configurator-connector.service.js +830 -0
- package/esm2015/lib/services/configurator.service.js +285 -0
- package/esm2015/lib/services/configuring.service.js +119 -0
- package/esm2015/lib/services/controls.js +799 -0
- package/esm2015/lib/services/debug.service.js +43 -0
- package/esm2015/lib/services/dictionary.service.js +65 -0
- package/esm2015/lib/services/dynamic-camera.service.js +96 -0
- package/esm2015/lib/services/floor-plane.service.js +252 -0
- package/esm2015/lib/services/font.service.js +27 -0
- package/esm2015/lib/services/google-translate.service.js +79 -0
- package/esm2015/lib/services/icon-cache.service.js +44 -0
- package/esm2015/lib/services/intersection.service.js +47 -0
- package/esm2015/lib/services/item.service.js +75 -0
- package/esm2015/lib/services/json-utils.service.js +48 -0
- package/esm2015/lib/services/light-creation.service.js +35 -0
- package/esm2015/lib/services/light-presets.service.js +157 -0
- package/esm2015/lib/services/lights.service.js +146 -0
- package/esm2015/lib/services/load-furniture-base.service.js +164 -0
- package/esm2015/lib/services/load-furniture-without-scene.service.js +45 -0
- package/esm2015/lib/services/load-furniture.service.js +72 -0
- package/esm2015/lib/services/loader.service.js +32 -0
- package/esm2015/lib/services/locator.service.js +11 -0
- package/esm2015/lib/services/message-board.service.js +50 -0
- package/esm2015/lib/services/post-processing.service.js +378 -0
- package/esm2015/lib/services/product-configurator.service.js +16 -0
- package/esm2015/lib/services/progress.service.js +20 -0
- package/esm2015/lib/services/scene-event.service.js +246 -0
- package/esm2015/lib/services/scene-options.service.js +24 -0
- package/esm2015/lib/services/scene.service.js +313 -0
- package/esm2015/lib/services/screen-size-analysis.service.js +97 -0
- package/esm2015/lib/services/settings.service.js +142 -0
- package/esm2015/lib/services/switch-build-furniture.service.js +37 -0
- package/esm2015/lib/services/switch-load-furniture.service.js +35 -0
- package/esm2015/lib/services/threedselector.service.js +72 -0
- package/esm2015/lib/services/utils.service.js +207 -0
- package/esm2015/lib/services/variation-cache.service.js +143 -0
- package/esm2015/lib/services/variation.service.js +490 -0
- package/esm2015/lib/services/view-mode.service.js +37 -0
- package/esm2015/lib/services/vr.service.js +191 -0
- package/esm2015/lib/services/xr.service.js +294 -0
- package/esm2015/lib/utils/asset.utils.js +120 -0
- package/esm2015/lib/utils/base-utils.js +9 -0
- package/esm2015/lib/utils/color.utils.js +30 -0
- package/esm2015/lib/utils/debug.utils.js +9 -0
- package/esm2015/lib/utils/device.utils.js +25 -0
- package/esm2015/lib/utils/file.utils.js +167 -0
- package/esm2015/lib/utils/image.utils.js +61 -0
- package/esm2015/lib/utils/json-parser.utils.js +180 -0
- package/esm2015/lib/utils/material.utils.js +433 -0
- package/esm2015/lib/utils/object.utils.js +360 -0
- package/esm2015/lib/utils/relative-position.utils.js +75 -0
- package/esm2015/lib/utils/rotation-helper.utils.js +15 -0
- package/esm2015/lib/utils/scene-3d.utils.js +213 -0
- package/esm2015/lib/utils/scene-utils.js +191 -0
- package/esm2015/lib/utils/text-utils.js +68 -0
- package/esm2015/lib/utils/threed.utils.js +281 -0
- package/esm2015/lib/utils/variation-utils.js +459 -0
- package/esm2015/public-api.js +65 -0
- package/fesm2015/colijnit-configurator.js +17538 -1477
- package/fesm2015/colijnit-configurator.js.map +1 -1
- package/{app → lib}/builder.d.ts +9 -1
- package/lib/components/answer-card/answer-card.component.d.ts +58 -0
- package/lib/components/answer-card/answer-card.module.d.ts +11 -0
- package/lib/components/answer-card/style/_layout.scss +88 -0
- package/lib/components/answer-card/style/_material-definition.scss +3 -0
- package/lib/components/answer-card/style/_theme.scss +67 -0
- package/lib/components/answer-card/style/material.scss +2 -0
- package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +38 -0
- package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +10 -0
- package/lib/components/answer-info-dialog/style/_layout.scss +88 -0
- package/lib/components/answer-info-dialog/style/_material-definition.scss +3 -0
- package/lib/components/answer-info-dialog/style/_theme.scss +44 -0
- package/lib/components/answer-info-dialog/style/material.scss +3 -0
- package/lib/components/answers-slideout/answers-slideout.component.d.ts +86 -0
- package/lib/components/answers-slideout/answers-slideout.module.d.ts +16 -0
- package/lib/components/answers-slideout/style/_layout.scss +198 -0
- package/lib/components/answers-slideout/style/_material-definition.scss +3 -0
- package/lib/components/answers-slideout/style/_theme.scss +54 -0
- package/lib/components/answers-slideout/style/material.scss +3 -0
- package/lib/components/color-filter/color-filter.component.d.ts +20 -0
- package/lib/components/color-filter/color-filter.module.d.ts +8 -0
- package/lib/components/color-filter/style/_layout.scss +41 -0
- package/lib/components/color-filter/style/_material-definition.scss +3 -0
- package/lib/components/color-filter/style/_theme.scss +7 -0
- package/lib/components/color-filter/style/material.scss +3 -0
- package/lib/components/configurator/configurator.component.d.ts +37 -0
- package/lib/components/configurator/configurator.module.d.ts +12 -0
- package/lib/components/configurator/style/_layout.scss +7 -0
- package/lib/components/configurator/style/_material-definition.scss +3 -0
- package/lib/components/configurator/style/_theme.scss +7 -0
- package/lib/components/configurator/style/material.scss +3 -0
- package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +30 -0
- package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +13 -0
- package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +16 -0
- package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +26 -0
- package/lib/components/configurator-dialog/style/_layout.scss +129 -0
- package/lib/components/configurator-dialog/style/_material-definition.scss +4 -0
- package/lib/components/configurator-dialog/style/_theme.scss +89 -0
- package/lib/components/configurator-dialog/style/material.scss +3 -0
- package/lib/components/configurator-loader/configurator-loader.component.d.ts +7 -0
- package/lib/components/configurator-loader/configurator-loader.module.d.ts +9 -0
- package/lib/components/configurator-loader/style/_layout.scss +72 -0
- package/lib/components/configurator-loader/style/_material-definition.scss +5 -0
- package/lib/components/configurator-loader/style/_theme.scss +26 -0
- package/lib/components/configurator-loader/style/material.scss +14 -0
- package/lib/components/configurator-scene/configurator-scene.component.d.ts +24 -0
- package/lib/components/configurator-scene/configurator-scene.module.d.ts +7 -0
- package/lib/components/configurator-scene/style/_layout.scss +22 -0
- package/lib/components/configurator-scene/style/_material-definition.scss +3 -0
- package/lib/components/configurator-scene/style/_theme.scss +7 -0
- package/lib/components/configurator-scene/style/material.scss +3 -0
- package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +7 -0
- package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +8 -0
- package/lib/components/configurator-scene-loader/style/_layout.scss +72 -0
- package/lib/components/configurator-scene-loader/style/_material-definition.scss +5 -0
- package/lib/components/configurator-scene-loader/style/_theme.scss +26 -0
- package/lib/components/configurator-scene-loader/style/material.scss +14 -0
- package/lib/components/element-buttons/element-buttons.component.d.ts +32 -0
- package/lib/components/element-buttons/element-buttons.module.d.ts +9 -0
- package/lib/components/element-buttons/style/_layout.scss +52 -0
- package/lib/components/element-buttons/style/_material-definition.scss +3 -0
- package/lib/components/element-buttons/style/_theme.scss +23 -0
- package/lib/components/element-buttons/style/material.scss +3 -0
- package/lib/components/element-toolbar/element-toolbar.component.d.ts +27 -0
- package/lib/components/element-toolbar/element-toolbar.component.scss +59 -0
- package/lib/components/element-toolbar/element-toolbar.module.d.ts +10 -0
- package/lib/components/element-toolbar/style/_layout.scss +107 -0
- package/lib/components/element-toolbar/style/_material-definition.scss +3 -0
- package/lib/components/element-toolbar/style/_theme.scss +47 -0
- package/lib/components/element-toolbar/style/material.scss +3 -0
- package/lib/components/image-zoom/image-zoom.component.d.ts +15 -0
- package/lib/components/image-zoom/image-zoom.module.d.ts +9 -0
- package/lib/components/image-zoom/style/_layout.scss +51 -0
- package/lib/components/image-zoom/style/_material-definition.scss +3 -0
- package/lib/components/image-zoom/style/_theme.scss +17 -0
- package/lib/components/image-zoom/style/material.scss +3 -0
- package/lib/components/lite-selector/lite-selector.component.d.ts +40 -0
- package/lib/components/lite-selector/lite-selector.module.d.ts +10 -0
- package/lib/components/lite-selector/style/_layout.scss +21 -0
- package/lib/components/lite-selector/style/_material-definition.scss +3 -0
- package/lib/components/lite-selector/style/_theme.scss +7 -0
- package/lib/components/lite-selector/style/material.scss +3 -0
- package/lib/components/product-configurator/product-configurator.component.d.ts +50 -0
- package/lib/components/product-configurator/product-configurator.module.d.ts +15 -0
- package/lib/components/product-configurator/style/_layout.scss +46 -0
- package/lib/components/product-configurator/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator/style/_theme.scss +22 -0
- package/lib/components/product-configurator/style/material.scss +3 -0
- package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +35 -0
- package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +11 -0
- package/lib/components/product-configurator-selector/style/_layout.scss +145 -0
- package/lib/components/product-configurator-selector/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector/style/_theme.scss +57 -0
- package/lib/components/product-configurator-selector/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +31 -0
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +13 -0
- package/lib/components/product-configurator-selector-option/style/_layout.scss +7 -0
- package/lib/components/product-configurator-selector-option/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option/style/_theme.scss +7 -0
- package/lib/components/product-configurator-selector-option/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +20 -0
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-button/style/_layout.scss +28 -0
- package/lib/components/product-configurator-selector-option-button/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-button/style/_theme.scss +33 -0
- package/lib/components/product-configurator-selector-option-button/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +20 -0
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_layout.scss +28 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +27 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +21 -0
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_layout.scss +34 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +28 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +21 -0
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +58 -0
- package/lib/components/product-configurator-selector-option-tile/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +56 -0
- package/lib/components/product-configurator-selector-option-tile/style/material.scss +3 -0
- package/lib/components/progress-bar/progress-bar.component.d.ts +10 -0
- package/lib/components/progress-bar/progress-bar.component.scss +14 -0
- package/lib/components/progress-bar/progress-bar.module.d.ts +8 -0
- package/lib/components/progress-bar/style/_layout.scss +18 -0
- package/lib/components/progress-bar/style/_material-definition.scss +3 -0
- package/lib/components/progress-bar/style/_theme.scss +10 -0
- package/lib/components/progress-bar/style/material.scss +3 -0
- package/lib/components/scene-options/scene-options.component.d.ts +24 -0
- package/lib/components/scene-options/scene-options.module.d.ts +11 -0
- package/lib/components/scene-options/style/_layout.scss +52 -0
- package/lib/components/scene-options/style/_material-definition.scss +3 -0
- package/lib/components/scene-options/style/_theme.scss +7 -0
- package/lib/components/scene-options/style/material.scss +3 -0
- package/lib/components/selections-summary/selections-summary.component.d.ts +38 -0
- package/lib/components/selections-summary/selections-summary.module.d.ts +12 -0
- package/lib/components/selections-summary/style/_layout.scss +87 -0
- package/lib/components/selections-summary/style/_material-definition.scss +5 -0
- package/lib/components/selections-summary/style/_theme.scss +13 -0
- package/lib/components/selections-summary/style/material.scss +3 -0
- package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +27 -0
- package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +10 -0
- package/lib/components/selections-summary-line/style/_layout.scss +12 -0
- package/lib/components/selections-summary-line/style/_material-definition.scss +4 -0
- package/lib/components/selections-summary-line/style/_theme.scss +12 -0
- package/lib/components/selections-summary-line/style/material.scss +3 -0
- package/lib/components/slideout/slideout.component.d.ts +22 -0
- package/lib/components/slideout/slideout.module.d.ts +7 -0
- package/lib/components/slideout/style/_layout.scss +27 -0
- package/lib/components/slideout/style/_material-definition.scss +3 -0
- package/lib/components/slideout/style/_theme.scss +5 -0
- package/lib/components/slideout/style/material.scss +3 -0
- package/lib/components/summary-line/style/_layout.scss +137 -0
- package/lib/components/summary-line/style/_material-definition.scss +4 -0
- package/lib/components/summary-line/style/_theme.scss +56 -0
- package/lib/components/summary-line/style/material.scss +3 -0
- package/lib/components/summary-line/summary-line.component.d.ts +50 -0
- package/lib/components/summary-line/summary-line.module.d.ts +11 -0
- package/lib/components/tag-filter/style/_layout.scss +14 -0
- package/lib/components/tag-filter/style/_material-definition.scss +3 -0
- package/lib/components/tag-filter/style/_theme.scss +7 -0
- package/lib/components/tag-filter/style/material.scss +3 -0
- package/lib/components/tag-filter/tag-filter.component.d.ts +9 -0
- package/lib/components/tag-filter/tag-filter.module.d.ts +7 -0
- package/lib/components/threedselector/style/_layout.scss +32 -0
- package/lib/components/threedselector/style/_material-definition.scss +3 -0
- package/lib/components/threedselector/style/_theme.scss +7 -0
- package/lib/components/threedselector/style/material.scss +9 -0
- package/lib/components/threedselector/threedselector.component.d.ts +38 -0
- package/lib/components/threedselector/threedselector.module.d.ts +10 -0
- package/{helper → lib/core/helper}/variation-helper.d.ts +2 -2
- package/lib/core/shader/floor-fade.shader.d.ts +5 -0
- package/lib/core/textures/depth-data-texture.d.ts +5 -0
- package/lib/directives/directives.module.d.ts +8 -0
- package/{app → lib}/directives/visibility-observer-master.directive.d.ts +3 -0
- package/{app → lib}/directives/visibility-observer.directive.d.ts +3 -0
- package/lib/enum/ar-feature.enum.d.ts +12 -0
- package/lib/enum/configuration-key.enum.d.ts +39 -0
- package/lib/enum/configuration-template.enum.d.ts +4 -0
- package/lib/enum/device-size-type.d.ts +5 -0
- package/lib/enum/device-tier.enum.d.ts +5 -0
- package/lib/enum/icon.enum.d.ts +111 -0
- package/lib/enum/item-type.enum.d.ts +21 -0
- package/lib/enum/light.enum.d.ts +7 -0
- package/lib/enum/navigator-type.enum.d.ts +4 -0
- package/lib/enum/output-encoding.enum.d.ts +7 -0
- package/lib/enum/result-type.enum.d.ts +19 -0
- package/lib/enum/scene-event.enum.d.ts +10 -0
- package/lib/enum/shadow-map-type.enum.d.ts +6 -0
- package/lib/enum/texture-type.d.ts +7 -0
- package/lib/enum/tone-mapping-local.enum.d.ts +10 -0
- package/lib/enum/view-mode.enum.d.ts +5 -0
- package/lib/enum/xr-mode.enum.d.ts +4 -0
- package/lib/environments/environment.d.ts +4 -0
- package/lib/interfaces/aa-options.interface.d.ts +4 -0
- package/lib/interfaces/adjustable-element.interface.d.ts +5 -0
- package/lib/interfaces/ao-options.interface.d.ts +18 -0
- package/lib/interfaces/changes.interface.d.ts +9 -0
- package/lib/interfaces/configuration-data.interface.d.ts +40 -0
- package/lib/interfaces/light-preset.interface.d.ts +22 -0
- package/lib/interfaces/post-processing-setting.interface.d.ts +11 -0
- package/lib/interfaces/scene-option-button.interface.d.ts +19 -0
- package/lib/interfaces/screen-size-info.d.ts +10 -0
- package/lib/interfaces/setting.interface.d.ts +8 -0
- package/lib/interfaces/texture.interface.d.ts +44 -0
- package/lib/interfaces/vignette-options.interface.d.ts +4 -0
- package/lib/model/ar-position-indicator.d.ts +4 -0
- package/lib/model/camera-settings.d.ts +12 -0
- package/lib/model/configuration-result-object.d.ts +30 -0
- package/lib/model/configurator-error-message.d.ts +8 -0
- package/lib/model/configurator-settings.d.ts +62 -0
- package/lib/model/custom-button.d.ts +10 -0
- package/lib/model/factory.d.ts +5 -0
- package/lib/model/icon.d.ts +4 -0
- package/lib/model/intersected-objects.d.ts +6 -0
- package/lib/model/light-preset.d.ts +33 -0
- package/lib/model/light-properties.d.ts +25 -0
- package/lib/model/material.d.ts +41 -0
- package/lib/model/metadata.d.ts +78 -0
- package/lib/model/render-parameters.d.ts +12 -0
- package/lib/model/setting-options.d.ts +67 -0
- package/lib/model/settings.d.ts +10 -0
- package/lib/model/shadow-properties.d.ts +7 -0
- package/lib/model/skin.d.ts +15 -0
- package/lib/model/texture.d.ts +52 -0
- package/{model → lib/model}/variation-settings.d.ts +9 -8
- package/{model → lib/model}/variation.d.ts +2 -1
- package/lib/model/xr-reticle.d.ts +17 -0
- package/lib/modules/render/enum/scene-type.enum.d.ts +4 -0
- package/lib/modules/render/model/ar-parameters.d.ts +9 -0
- package/lib/modules/render/model/scene-setting.d.ts +13 -0
- package/lib/modules/render/model/scene-settings.d.ts +4 -0
- package/lib/pipes/append.pipe.d.ts +7 -0
- package/lib/pipes/google-translate.pipe.d.ts +11 -0
- package/lib/pipes/localize.pipe.d.ts +10 -0
- package/lib/pipes/pipes.module.d.ts +11 -0
- package/lib/pipes/prepend.pipe.d.ts +7 -0
- package/lib/pipes/strip-html.pipe.d.ts +7 -0
- package/lib/services/app-event.service.d.ts +32 -0
- package/lib/services/app-initializer.service.d.ts +14 -0
- package/lib/services/ar.service.d.ts +120 -0
- package/lib/services/build-furniture-base.service.d.ts +117 -0
- package/lib/services/build-furniture-without-scene.service.d.ts +14 -0
- package/lib/services/build-furniture.service.d.ts +14 -0
- package/lib/services/bundle-initialzer.service.d.ts +45 -0
- package/lib/services/camera.service.d.ts +44 -0
- package/lib/services/configuration.service.d.ts +18 -0
- package/lib/services/configurator-connector.service.d.ts +140 -0
- package/lib/services/configurator.service.d.ts +62 -0
- package/lib/services/configuring.service.d.ts +46 -0
- package/lib/services/controls.d.ts +11 -0
- package/lib/services/debug.service.d.ts +16 -0
- package/lib/services/dictionary.service.d.ts +15 -0
- package/lib/services/dynamic-camera.service.d.ts +21 -0
- package/lib/services/floor-plane.service.d.ts +47 -0
- package/lib/services/font.service.d.ts +10 -0
- package/lib/services/google-translate.service.d.ts +26 -0
- package/lib/services/icon-cache.service.d.ts +21 -0
- package/lib/services/intersection.service.d.ts +11 -0
- package/lib/services/item.service.d.ts +18 -0
- package/lib/services/json-utils.service.d.ts +7 -0
- package/lib/services/light-creation.service.d.ts +9 -0
- package/lib/services/light-presets.service.d.ts +34 -0
- package/lib/services/lights.service.d.ts +34 -0
- package/lib/services/load-furniture-base.service.d.ts +37 -0
- package/lib/services/load-furniture-without-scene.service.d.ts +9 -0
- package/lib/services/load-furniture.service.d.ts +9 -0
- package/lib/services/loader.service.d.ts +11 -0
- package/lib/services/locator.service.d.ts +7 -0
- package/lib/services/message-board.service.d.ts +18 -0
- package/lib/services/post-processing.service.d.ts +74 -0
- package/lib/services/product-configurator.service.d.ts +11 -0
- package/lib/services/progress.service.d.ts +9 -0
- package/lib/services/scene-event.service.d.ts +72 -0
- package/lib/services/scene-options.service.d.ts +11 -0
- package/lib/services/scene.service.d.ts +71 -0
- package/lib/services/screen-size-analysis.service.d.ts +32 -0
- package/lib/services/settings.service.d.ts +24 -0
- package/lib/services/switch-build-furniture.service.d.ts +21 -0
- package/lib/services/switch-load-furniture.service.d.ts +21 -0
- package/lib/services/threedselector.service.d.ts +17 -0
- package/lib/services/utils.service.d.ts +24 -0
- package/lib/services/variation-cache.service.d.ts +23 -0
- package/lib/services/variation.service.d.ts +26 -0
- package/lib/services/view-mode.service.d.ts +17 -0
- package/lib/services/vr.service.d.ts +42 -0
- package/lib/services/xr.service.d.ts +56 -0
- package/lib/style/_mixin.scss +9 -0
- package/lib/style/configurator-globals.scss +21 -0
- package/lib/style/template_variables.scss +37 -0
- package/lib/utils/color.utils.d.ts +8 -0
- package/lib/utils/debug.utils.d.ts +3 -0
- package/lib/utils/device.utils.d.ts +7 -0
- package/{utils → lib/utils}/file.utils.d.ts +3 -0
- package/{utils → lib/utils}/image.utils.d.ts +2 -3
- package/lib/utils/json-parser.utils.d.ts +9 -0
- package/lib/utils/material.utils.d.ts +34 -0
- package/lib/utils/object.utils.d.ts +32 -0
- package/lib/utils/relative-position.utils.d.ts +12 -0
- package/lib/utils/rotation-helper.utils.d.ts +6 -0
- package/lib/utils/scene-3d.utils.d.ts +8 -0
- package/lib/utils/text-utils.d.ts +4 -0
- package/{utils → lib/utils}/threed.utils.d.ts +7 -3
- package/{utils → lib/utils}/variation-utils.d.ts +4 -2
- package/package.json +17 -30
- package/public-api.d.ts +60 -0
- package/README.md +0 -28
- package/app/components/answers/answer/answer.component.d.ts +0 -11
- package/app/components/answers/answers.component.d.ts +0 -8
- package/app/components/answers/answers.module.d.ts +0 -2
- package/app/components/selections/selections.component.d.ts +0 -21
- package/app/components/selections/selections.module.d.ts +0 -2
- package/app/components/shared/loader/loader.component.d.ts +0 -2
- package/app/components/shared/shared.module.d.ts +0 -2
- package/app/services/configurator.service.d.ts +0 -19
- package/app/services/image-cache.service.d.ts +0 -10
- package/app/utils/object.utils.d.ts +0 -7
- package/colijnit-configurator.metadata.json +0 -1
- package/esm2015/app/builder.js +0 -706
- package/esm2015/app/components/answers/answer/answer.component.js +0 -66
- package/esm2015/app/components/answers/answers.component.js +0 -38
- package/esm2015/app/components/answers/answers.module.js +0 -27
- package/esm2015/app/components/selections/selections.component.js +0 -129
- package/esm2015/app/components/selections/selections.module.js +0 -21
- package/esm2015/app/components/shared/loader/loader.component.js +0 -22
- package/esm2015/app/components/shared/shared.module.js +0 -19
- package/esm2015/app/directives/visibility-observer-master.directive.js +0 -50
- package/esm2015/app/directives/visibility-observer.directive.js +0 -55
- package/esm2015/app/services/configurator.service.js +0 -79
- package/esm2015/app/services/image-cache.service.js +0 -63
- package/esm2015/app/utils/object.utils.js +0 -51
- package/esm2015/helper/variation-helper.js +0 -553
- package/esm2015/model/material.js +0 -11
- package/esm2015/model/variation-settings.js +0 -54
- package/esm2015/model/variation.js +0 -3
- package/esm2015/public_api.js +0 -7
- package/esm2015/utils/asset.utils.js +0 -124
- package/esm2015/utils/base-utils.js +0 -9
- package/esm2015/utils/file.utils.js +0 -142
- package/esm2015/utils/image.utils.js +0 -66
- package/esm2015/utils/object.utils.js +0 -49
- package/esm2015/utils/scene-utils.js +0 -187
- package/esm2015/utils/threed.utils.js +0 -226
- package/esm2015/utils/variation-utils.js +0 -388
- package/model/material.d.ts +0 -40
- package/public_api.d.ts +0 -6
- package/utils/object.utils.d.ts +0 -7
- /package/{utils → lib/utils}/asset.utils.d.ts +0 -0
- /package/{utils → lib/utils}/base-utils.d.ts +0 -0
- /package/{utils → lib/utils}/scene-utils.d.ts +0 -0
|
@@ -0,0 +1,795 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
import { Injectable } from '@angular/core';
|
|
5
|
+
import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
|
|
6
|
+
import { Selection } from '@colijnit/configuratorapi/build/model/selection';
|
|
7
|
+
import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
|
|
8
|
+
import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
|
|
9
|
+
import { Article } from '@colijnit/configuratorapi/build/model/article';
|
|
10
|
+
import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
|
|
11
|
+
import { BusinessObjectFactory } from '@colijnit/ioneconnector/build/service/business-object-factory';
|
|
12
|
+
import { ThreedUtils } from './utils/threed.utils';
|
|
13
|
+
import { VariationHelper } from './core/helper/variation-helper';
|
|
14
|
+
import { SwitchBuildFurnitureService } from './services/switch-build-furniture.service';
|
|
15
|
+
import { SwitchLoadFurnitureService } from './services/switch-load-furniture.service';
|
|
16
|
+
import { ConfiguratorService } from './services/configurator.service';
|
|
17
|
+
import { ConfiguratorConnectorService } from './services/configurator-connector.service';
|
|
18
|
+
import { ConfigurationResultObject } from './model/configuration-result-object';
|
|
19
|
+
import { ImageUtils } from './utils/image.utils';
|
|
20
|
+
import { SceneUtils } from './utils/scene-utils';
|
|
21
|
+
import { ObjectUtils } from './utils/object.utils';
|
|
22
|
+
import { ServiceLocator } from './services/locator.service';
|
|
23
|
+
import * as i0 from "@angular/core";
|
|
24
|
+
export class Builder {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.selectionsReceived = new BehaviorSubject([]);
|
|
27
|
+
this.articleLoaded = new BehaviorSubject(undefined);
|
|
28
|
+
this.decosReceived = new BehaviorSubject([]);
|
|
29
|
+
this.answersReceived = new BehaviorSubject([]);
|
|
30
|
+
this.modelLoaded = new BehaviorSubject(null);
|
|
31
|
+
this._selections = [];
|
|
32
|
+
this._answers = [];
|
|
33
|
+
this._decos = [];
|
|
34
|
+
this._placedAdjustables = [];
|
|
35
|
+
this._placedAddables = [];
|
|
36
|
+
this._adjustables = [];
|
|
37
|
+
this._addables = [];
|
|
38
|
+
this._imageCache = new Map();
|
|
39
|
+
this._articleCache = new Map();
|
|
40
|
+
this._configuratorService = ServiceLocator.injector.get(ConfiguratorService);
|
|
41
|
+
this._buildFurnitureService = ServiceLocator.injector.get(SwitchBuildFurnitureService);
|
|
42
|
+
this._loadFurnitureService = ServiceLocator.injector.get(SwitchLoadFurnitureService);
|
|
43
|
+
this._configuratorConnectorService = ServiceLocator.injector.get(ConfiguratorConnectorService);
|
|
44
|
+
}
|
|
45
|
+
set debug(value) {
|
|
46
|
+
if (value) {
|
|
47
|
+
this._debug = value;
|
|
48
|
+
if (this._variationHelper) {
|
|
49
|
+
this._variationHelper.debug = this._debug;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
get debug() {
|
|
54
|
+
return this._debug;
|
|
55
|
+
}
|
|
56
|
+
initNewBuild(scene, options, sku, instanceId, goodId) {
|
|
57
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
+
if (options) {
|
|
59
|
+
yield this._configuratorService.initConnector(options, true);
|
|
60
|
+
}
|
|
61
|
+
this._buildFurnitureService.currentActiveService.scene = scene;
|
|
62
|
+
if (sku) {
|
|
63
|
+
try {
|
|
64
|
+
const furnitureData = new ConfigurationResultObject();
|
|
65
|
+
furnitureData.sku = sku;
|
|
66
|
+
furnitureData.instanceId = instanceId;
|
|
67
|
+
const resultObject = yield this._loadFurnitureService.currentActiveService.loadFurniture(furnitureData, false, true, false, false, false, false);
|
|
68
|
+
return resultObject.object;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error('Error loading furniture configuration:', error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
buildWithData(options, selections, decos, assetUrl, cdnUrl, schema) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
if (!this._scene) {
|
|
80
|
+
reject('no scene provided!');
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
this._log('start build', true);
|
|
84
|
+
yield this._downloadAsset(assetUrl, cdnUrl, schema, selections && selections.length > 1 && decos && decos.length > 0);
|
|
85
|
+
try {
|
|
86
|
+
if (this._source) {
|
|
87
|
+
try {
|
|
88
|
+
if (selections && selections.length > 1 && decos && decos.length > 0) {
|
|
89
|
+
this._reset();
|
|
90
|
+
// Set the scene.
|
|
91
|
+
this._buildFurnitureService.currentActiveService.scene = this._scene;
|
|
92
|
+
const result = new ConfigurationResultObject();
|
|
93
|
+
this._configuratorConnectorService.selections = selections;
|
|
94
|
+
this._configuratorConnectorService.decoNodes = decos;
|
|
95
|
+
// this._linkSelectionsAndDecos();
|
|
96
|
+
this._buildFurnitureService.currentActiveService.linkSelectionsAndDecos();
|
|
97
|
+
// this._prepareTheSelections();
|
|
98
|
+
this._buildFurnitureService.currentActiveService.prepareTheSelections();
|
|
99
|
+
// this._preloadMaterials();
|
|
100
|
+
this._buildFurnitureService.currentActiveService.preloadMaterials(options.schema);
|
|
101
|
+
// const build = await this._build();
|
|
102
|
+
const build = yield this._buildFurnitureService.currentActiveService.build(result);
|
|
103
|
+
resolve(build.object);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
resolve(this._source); // just return the source for simplicity
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
reject(e.message);
|
|
111
|
+
}
|
|
112
|
+
{
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (assetUrl) {
|
|
117
|
+
reject(`Error downloading source: ${assetUrl}`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
reject('No 3D source provided!');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
this._cleanUp();
|
|
126
|
+
this._log('finish build', true);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
reject(e);
|
|
131
|
+
}
|
|
132
|
+
}));
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
init(scene, options) {
|
|
136
|
+
this._boFactory = new BusinessObjectFactory();
|
|
137
|
+
this._threedUtils = new ThreedUtils();
|
|
138
|
+
this._variationHelper = new VariationHelper();
|
|
139
|
+
this._variationHelper.debug = this._debug;
|
|
140
|
+
if (!scene) {
|
|
141
|
+
throw 'No scene object provided!';
|
|
142
|
+
}
|
|
143
|
+
this._configuratorService = new ConfiguratorService();
|
|
144
|
+
// this._imageCacheService = new ImageCacheService();
|
|
145
|
+
if (options) {
|
|
146
|
+
this._configuratorService.initApi(options);
|
|
147
|
+
}
|
|
148
|
+
this._scene = scene;
|
|
149
|
+
}
|
|
150
|
+
buildModel(sku, instanceId, goodId) {
|
|
151
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
+
if (!this._scene) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
yield this._setInstanceId(sku, instanceId, goodId);
|
|
157
|
+
yield this._prepareConfiguration(this._sku, this._goodId);
|
|
158
|
+
if (this._source) {
|
|
159
|
+
yield this._configuratorService.setInstanceToConfigure(this._instanceId);
|
|
160
|
+
const promises = [];
|
|
161
|
+
this._reset();
|
|
162
|
+
promises.push(this.getQuestionAndAnswers());
|
|
163
|
+
promises.push(this._getSelections(this._instanceId));
|
|
164
|
+
promises.push(this._getDecos());
|
|
165
|
+
yield Promise.all(promises);
|
|
166
|
+
if (this._answers.length > 0) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this._linkSelectionsAndDecos();
|
|
170
|
+
this._prepareTheSelections();
|
|
171
|
+
this._preloadMaterials();
|
|
172
|
+
const build = yield this._build();
|
|
173
|
+
return build;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
throw 'GLB source not found!';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
throw e;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
buildModelFromData(selections, decos, assetUrl, cdnUrl, schema) {
|
|
185
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
if (!this._scene) {
|
|
188
|
+
reject('no scene provided!');
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
this._log('start build', true);
|
|
192
|
+
yield this._downloadAsset(assetUrl, cdnUrl, schema, selections && selections.length > 1 && decos && decos.length > 0);
|
|
193
|
+
try {
|
|
194
|
+
if (this._source) {
|
|
195
|
+
try {
|
|
196
|
+
if (selections && selections.length > 1 && decos && decos.length > 0) {
|
|
197
|
+
this._reset();
|
|
198
|
+
this._selections = selections;
|
|
199
|
+
this._decos = decos;
|
|
200
|
+
this._linkSelectionsAndDecos();
|
|
201
|
+
this._prepareTheSelections();
|
|
202
|
+
this._preloadMaterials();
|
|
203
|
+
const build = yield this._build();
|
|
204
|
+
resolve(build);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
resolve(this._source); // just return the source for simplicity
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
reject(e.message);
|
|
212
|
+
}
|
|
213
|
+
{
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
if (assetUrl) {
|
|
218
|
+
reject(`Error downloading source: ${assetUrl}`);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
reject('No 3D source provided!');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
this._cleanUp();
|
|
227
|
+
this._log('finish build', true);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
reject(e);
|
|
232
|
+
}
|
|
233
|
+
}));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
initNodeInstance(goodId) {
|
|
237
|
+
return this._configuratorService.initNodeInstance(goodId, false);
|
|
238
|
+
}
|
|
239
|
+
destroy() {
|
|
240
|
+
this._threedUtils.clearCache();
|
|
241
|
+
this._variationHelper.clearCache();
|
|
242
|
+
}
|
|
243
|
+
selectSelection(selection) {
|
|
244
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
245
|
+
yield this._configuratorService.selectSelection(selection, false);
|
|
246
|
+
yield this.getQuestionAndAnswers();
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
getQuestionAndAnswers(publicationCode) {
|
|
250
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
251
|
+
const questionsAndAnswers = yield this._configuratorService.getQuestionAndAnswers(false, publicationCode);
|
|
252
|
+
this._answers = questionsAndAnswers && questionsAndAnswers.answers ? questionsAndAnswers.answers : [];
|
|
253
|
+
this.answersReceived.next(this._answers);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
selectAnswer(answer) {
|
|
257
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
258
|
+
yield this._configuratorService.selectAnswer(answer, false);
|
|
259
|
+
yield this.getQuestionAndAnswers();
|
|
260
|
+
if (this._answers && this._answers.length === 0) {
|
|
261
|
+
this._build();
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
getImageForSelectionOrAnswer(object) {
|
|
266
|
+
const includeMimeType = true, thumb = true;
|
|
267
|
+
return new Promise((resolve, reject) => {
|
|
268
|
+
if (object && object.nodeId) {
|
|
269
|
+
if (!this._imageCache.has(object.nodeId)) {
|
|
270
|
+
return this._configuratorService.getSingleImage(object.nodeId, 4, includeMimeType, thumb, true)
|
|
271
|
+
.then((responseData) => {
|
|
272
|
+
const base64 = this._handleResponseData(includeMimeType, thumb, responseData);
|
|
273
|
+
this._imageCache.set(object.nodeId, base64);
|
|
274
|
+
resolve(base64);
|
|
275
|
+
}).catch(() => {
|
|
276
|
+
reject();
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
resolve(this._imageCache.get(object.nodeId));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
reject();
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
_cleanUp() {
|
|
289
|
+
this._sku = undefined;
|
|
290
|
+
this._goodId = undefined;
|
|
291
|
+
this._instanceId = undefined;
|
|
292
|
+
this._variationHelper.clearCache();
|
|
293
|
+
}
|
|
294
|
+
_handleResponseData(includeMimetype, thumb, responseData) {
|
|
295
|
+
if (responseData && responseData.resultObject) {
|
|
296
|
+
if (responseData.resultObject.filePath !== null && responseData.resultObject.filePath !== '') {
|
|
297
|
+
return ImageUtils.getFixedImageFilepathUrl(responseData.resultObject.filePath);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
if (includeMimetype) {
|
|
301
|
+
return ImageUtils.getDocBodyWithMimeTypeDefinition(responseData.resultObject.fileName, thumb ? responseData.resultObject.thumbnailBody : responseData.resultObject.documentBody);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
return thumb ? responseData.resultObject.thumbnailBody : responseData.resultObject.documentBody;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
return '';
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
_preloadMaterials() {
|
|
313
|
+
if (this._decos && this._decos.length) {
|
|
314
|
+
const materials = [...new Set(this._decos
|
|
315
|
+
.filter(d => (d.gameObjectName || d.materialUrl) && d.type === DecoNodeType.Variation)
|
|
316
|
+
.map(d => d))];
|
|
317
|
+
this._variationHelper.preloadVariations(materials);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
_setInstanceId(sku, instanceId, goodId) {
|
|
321
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
322
|
+
if (!instanceId && !this._instanceId) {
|
|
323
|
+
if (!goodId) {
|
|
324
|
+
goodId = yield this._getGoodIdFromSku(sku);
|
|
325
|
+
}
|
|
326
|
+
this._goodId = goodId;
|
|
327
|
+
const result = yield this.initNodeInstance(this._goodId);
|
|
328
|
+
if (result && result.resultObject) {
|
|
329
|
+
this._instanceId = result.resultObject;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
throw 'Failed to initialize node instance';
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
else if (!this._instanceId) {
|
|
336
|
+
this._instanceId = instanceId;
|
|
337
|
+
}
|
|
338
|
+
if (!this._sku) {
|
|
339
|
+
this._sku = sku;
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
_prepareConfiguration(sku, goodId) {
|
|
344
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
345
|
+
const article = yield this._getArticle(sku, goodId);
|
|
346
|
+
if (article && article.assetUrl) {
|
|
347
|
+
if (article.contentDeliveryUrl) {
|
|
348
|
+
this._variationHelper.assetPath =
|
|
349
|
+
article.contentDeliveryUrl +
|
|
350
|
+
(article.contentDeliveryUrl.endsWith('/') ? '' : '/') +
|
|
351
|
+
(article.distSchema ? article.distSchema : 'UP_DBA');
|
|
352
|
+
}
|
|
353
|
+
yield this._downloadAsset(article.assetUrl, article.contentDeliveryUrl, article.distSchema);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
_downloadAsset(assetUrl, cdnUrl, schema, setVisibleFalse = true) {
|
|
358
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
359
|
+
this._source = yield this._threedUtils.download3DSource(assetUrl, setVisibleFalse)
|
|
360
|
+
.catch((error) => {
|
|
361
|
+
throw error;
|
|
362
|
+
});
|
|
363
|
+
if (cdnUrl) {
|
|
364
|
+
this._variationHelper.assetPath =
|
|
365
|
+
cdnUrl +
|
|
366
|
+
(cdnUrl.endsWith('/') ? '' : '/') +
|
|
367
|
+
(schema ? schema : 'UP_DBA');
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
_build() {
|
|
372
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
373
|
+
const adjustables = this._getAdjustables();
|
|
374
|
+
if (adjustables && adjustables.length === 0 && this._selections && this._selections.length > 0) { // check if article has a gameObject
|
|
375
|
+
if (this._selections[0].nodeType === NodeType.Article && this._selections[0].gameObject) {
|
|
376
|
+
adjustables.push(this._selections[0]);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (adjustables && adjustables.length > 0) {
|
|
380
|
+
const obj = new THREE.Object3D();
|
|
381
|
+
obj.visible = false; // no need to render visualy
|
|
382
|
+
this._scene.add(obj);
|
|
383
|
+
let connected = false;
|
|
384
|
+
this._log('build main model');
|
|
385
|
+
for (let i = 0, len = adjustables.length; i < len; i++) {
|
|
386
|
+
const adjustable = this._createAdjustable(obj, adjustables[i]);
|
|
387
|
+
if (adjustable) {
|
|
388
|
+
for (let ii = this._placedAdjustables.length - 1; ii >= 0; ii--) {
|
|
389
|
+
if (SceneUtils.TrySelectorConnection(this._scene, obj, this._placedAdjustables[ii], adjustable, i === 1)) {
|
|
390
|
+
this._placedAdjustables[ii].visible = true;
|
|
391
|
+
adjustable.visible = true;
|
|
392
|
+
connected = true;
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
connected = false;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (!connected && this._placedAdjustables.length > 1) {
|
|
399
|
+
console.warn('No connection found for: ', adjustable.name);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
this._log('place addables');
|
|
403
|
+
this._placeAddables(obj);
|
|
404
|
+
this._log('update pivot');
|
|
405
|
+
this._updatePivot(obj);
|
|
406
|
+
this._log('load variations');
|
|
407
|
+
yield this._loadVariations(obj);
|
|
408
|
+
// this._variationHelper.clearCache();
|
|
409
|
+
this._log('remove from scene');
|
|
410
|
+
this._scene.remove(obj);
|
|
411
|
+
ObjectUtils.DisposeObject(this._source);
|
|
412
|
+
// this._cleanUp();
|
|
413
|
+
this._log('ready!');
|
|
414
|
+
this.modelLoaded.next(obj);
|
|
415
|
+
return obj;
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
throw 'No adjustables found!';
|
|
419
|
+
// this._building = false;
|
|
420
|
+
// if (this.selections.length < 2) {
|
|
421
|
+
// this._errorService.addError(this.activeInstance, {message: 'NO_SELECTIONS_OR_DECOS', description: 'NO_SELECTIONS_OR_DECOS_INFO'});
|
|
422
|
+
// this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoSelections});
|
|
423
|
+
// } else if (this.decos.size === 0) {
|
|
424
|
+
// this._errorService.addError(this.activeInstance, {message: 'NO_SELECTIONS_OR_DECOS', description: 'NO_SELECTIONS_OR_DECOS_INFO'});
|
|
425
|
+
// this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoDecoNodes});
|
|
426
|
+
// } else {
|
|
427
|
+
// this._errorService.addError(this.activeInstance, {message: 'NO_ADJUSTABLES', description: 'NO_ADJUSTABLES_INFO'});
|
|
428
|
+
// this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoAdjustables});
|
|
429
|
+
// }
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
_prepareTheSelections() {
|
|
434
|
+
if (!this._selections || !this._selections.length) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
const selections = this._selections.slice();
|
|
438
|
+
const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
|
|
439
|
+
const adjustableSelections = selections.filter(s => s.addAdjust === '2');
|
|
440
|
+
const isArticleWithMaterial = adjustableSelections.length === 0 &&
|
|
441
|
+
selectionOfArticle.gameObject &&
|
|
442
|
+
selectionOfArticle.gameObject.length > 0;
|
|
443
|
+
// get generic variations
|
|
444
|
+
const globalVariations = this._selections
|
|
445
|
+
.filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && !s.decoNode.type)
|
|
446
|
+
.map((value, index, array) => {
|
|
447
|
+
// find selection of variation
|
|
448
|
+
const sel = this._selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
|
|
449
|
+
if (sel) {
|
|
450
|
+
value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
|
|
451
|
+
}
|
|
452
|
+
value.decoNode.variation.materialId = this._getMaterialIdFromParent(value.node);
|
|
453
|
+
return value.decoNode.variation;
|
|
454
|
+
});
|
|
455
|
+
// commented out for the moment
|
|
456
|
+
// globalVariations.forEach(g => {
|
|
457
|
+
// const parentIdx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.parentId);
|
|
458
|
+
// if (parentIdx) { // remove parent selection
|
|
459
|
+
// selections.splice(parentIdx, 1);
|
|
460
|
+
// }
|
|
461
|
+
// const idx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.id);
|
|
462
|
+
// if (idx) { // move generic variations to top
|
|
463
|
+
// const selection = selections[idx];
|
|
464
|
+
// selections.splice(idx, 1);
|
|
465
|
+
// selections.unshift(selection);
|
|
466
|
+
// }
|
|
467
|
+
// });
|
|
468
|
+
// const usedVariations: FurniturePartVariation[] = [];
|
|
469
|
+
let globalVariationsRewrite = true;
|
|
470
|
+
const len = selections.length;
|
|
471
|
+
let lastAdded;
|
|
472
|
+
let lastAdjustable;
|
|
473
|
+
let newPart = false;
|
|
474
|
+
let previousPresLevel = -1;
|
|
475
|
+
let positioning;
|
|
476
|
+
let optionText;
|
|
477
|
+
for (let i = 0; i < len; i++) {
|
|
478
|
+
const selection = selections[i];
|
|
479
|
+
if (selection.presentationLevel === 1) {
|
|
480
|
+
positioning = selection.hdecoPositioning;
|
|
481
|
+
optionText = selection.question;
|
|
482
|
+
}
|
|
483
|
+
if (selection.presentationLevel > previousPresLevel) {
|
|
484
|
+
selection.hdecoPositioning = selection.hdecoPositioning || positioning;
|
|
485
|
+
}
|
|
486
|
+
if (selection.decoNode) {
|
|
487
|
+
if (selection.decoNode.type === DecoNodeType.Variation) {
|
|
488
|
+
const decoNode = selection.decoNode;
|
|
489
|
+
decoNode.optionText = optionText;
|
|
490
|
+
// find selection of variation and set materialId in case of multimaterial
|
|
491
|
+
decoNode.materialId = this._getMaterialIdFromParent(decoNode.nodeId);
|
|
492
|
+
if (lastAdded) {
|
|
493
|
+
if (newPart) {
|
|
494
|
+
if (decoNode.materialId) {
|
|
495
|
+
lastAdded.variations.push(decoNode);
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
lastAdded.variations = [decoNode];
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
lastAdded.variations.push(decoNode);
|
|
503
|
+
}
|
|
504
|
+
newPart = false;
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
if (globalVariationsRewrite) {
|
|
508
|
+
globalVariations.length = 0;
|
|
509
|
+
globalVariationsRewrite = false;
|
|
510
|
+
}
|
|
511
|
+
if (!globalVariations.find(v => v.id === decoNode.id)) {
|
|
512
|
+
globalVariations.push(decoNode);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// const variation: FurniturePartVariation = new FurniturePartVariation();
|
|
516
|
+
// variation.BrandId = selection.decoNode.brandId;
|
|
517
|
+
// variation.Description = selection.decoNode.gameObjectName;
|
|
518
|
+
// variation.MaterialId = (selection.decoNode as any).materialId;
|
|
519
|
+
// variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
|
|
520
|
+
// usedVariations.push(variation);
|
|
521
|
+
}
|
|
522
|
+
else if ((selection.decoNode.type === DecoNodeType.Part &&
|
|
523
|
+
typeof selection.decoNode.gameObjectName === 'string' &&
|
|
524
|
+
selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
|
|
525
|
+
if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
|
|
526
|
+
selection.variations = globalVariations;
|
|
527
|
+
this._adjustables.push(selection);
|
|
528
|
+
if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
|
|
529
|
+
newPart = true;
|
|
530
|
+
}
|
|
531
|
+
lastAdded = selection;
|
|
532
|
+
lastAdjustable = selection;
|
|
533
|
+
}
|
|
534
|
+
else if (selection.decoNode.kind === DecoNodeKind.Addable) {
|
|
535
|
+
selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
|
|
536
|
+
if (lastAdjustable) {
|
|
537
|
+
lastAdjustable.addables.push(selection);
|
|
538
|
+
}
|
|
539
|
+
this._addables.push(selection);
|
|
540
|
+
if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
|
|
541
|
+
newPart = true;
|
|
542
|
+
}
|
|
543
|
+
lastAdded = selection;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
previousPresLevel = selection.presentationLevel;
|
|
548
|
+
}
|
|
549
|
+
// this._upsertFurniture(this.activeInstance,
|
|
550
|
+
// {Variations: usedVariations});
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Returns the materialId of the parent up the tree until presentionlevel 1 is reached
|
|
554
|
+
* @param id
|
|
555
|
+
* @private
|
|
556
|
+
*/
|
|
557
|
+
_getMaterialIdFromParent(id) {
|
|
558
|
+
if (this._selections) {
|
|
559
|
+
const idx = this._selections.findIndex(s => s.node === id);
|
|
560
|
+
let currentLevel = 999;
|
|
561
|
+
if (idx > -1) {
|
|
562
|
+
for (let i = idx; i > 0; i--) {
|
|
563
|
+
const selection = this._selections[i];
|
|
564
|
+
if (selection.presentationLevel >= currentLevel) {
|
|
565
|
+
break;
|
|
566
|
+
}
|
|
567
|
+
currentLevel = selection.presentationLevel;
|
|
568
|
+
if (selection.hdecoGameObject) {
|
|
569
|
+
return selection.hdecoGameObject;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
_createAdjustable(parent, adj) {
|
|
577
|
+
let obj = this._source ? this._source.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
|
|
578
|
+
if (!obj) {
|
|
579
|
+
// in case of glb files, the importer removes dots from names
|
|
580
|
+
const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
|
|
581
|
+
obj = this._source ? this._source.getObjectByName(name) : null;
|
|
582
|
+
if (!obj) {
|
|
583
|
+
console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
|
|
584
|
+
return null;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
let adjustable = obj.clone();
|
|
588
|
+
adjustable.name = this._createUniqueName(parent, obj);
|
|
589
|
+
adjustable.userData.selection = adj;
|
|
590
|
+
adjustable.position.set(0, 0, 0);
|
|
591
|
+
adjustable.traverse(c => {
|
|
592
|
+
c.visible = !c.name.toLowerCase().startsWith('c_');
|
|
593
|
+
});
|
|
594
|
+
parent.add(adjustable);
|
|
595
|
+
// the object being added to the customFloorGroup is being recreated so we loose the reference
|
|
596
|
+
// therefor we need to retrieve the created object again
|
|
597
|
+
adjustable = parent.getObjectByName(adjustable.name);
|
|
598
|
+
this._placedAdjustables.push(adjustable);
|
|
599
|
+
return adjustable;
|
|
600
|
+
}
|
|
601
|
+
_createAddable(parent, add, part2, part1) {
|
|
602
|
+
const obj = this._source.getObjectByName(add.decoNode.gameObjectName);
|
|
603
|
+
if (!obj) {
|
|
604
|
+
return null;
|
|
605
|
+
}
|
|
606
|
+
// const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
|
|
607
|
+
const addable = obj.clone();
|
|
608
|
+
addable.name = this._createUniqueName(parent, obj);
|
|
609
|
+
addable.userData.selection = add;
|
|
610
|
+
addable.position.set(0, 0, 0);
|
|
611
|
+
addable.visible = true;
|
|
612
|
+
if (part1 && part2) {
|
|
613
|
+
parent.add(addable);
|
|
614
|
+
this._placedAddables.push(addable);
|
|
615
|
+
return addable;
|
|
616
|
+
}
|
|
617
|
+
return addable;
|
|
618
|
+
}
|
|
619
|
+
_placeAddables(parent) {
|
|
620
|
+
const len = this._placedAdjustables.length;
|
|
621
|
+
for (let i = 0; i < len; i++) {
|
|
622
|
+
if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
|
|
623
|
+
const adjustableSelection = this._placedAdjustables[i].userData.selection;
|
|
624
|
+
if (adjustableSelection) {
|
|
625
|
+
const lena = adjustableSelection.addables.length;
|
|
626
|
+
let conAddable;
|
|
627
|
+
for (let ia = 0; ia < lena; ia++) {
|
|
628
|
+
SceneUtils.TrySelectorConnection(this._scene, parent, this._placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(parent, add, part2, part1));
|
|
629
|
+
if (conAddable) {
|
|
630
|
+
SceneUtils.TrySelectorConnection(this._scene, parent, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(parent, add, part2, part1));
|
|
631
|
+
}
|
|
632
|
+
conAddable = this._placedAddables[this._placedAddables.length - 1];
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
_createUniqueName(parent, obj) {
|
|
639
|
+
let iteration = 0;
|
|
640
|
+
let name = obj.name;
|
|
641
|
+
let existingObj = parent.getObjectByName(name);
|
|
642
|
+
while (existingObj) {
|
|
643
|
+
iteration++;
|
|
644
|
+
name = obj.name + (iteration !== 0 ? ('_' + iteration) : '');
|
|
645
|
+
existingObj = parent.getObjectByName(name);
|
|
646
|
+
}
|
|
647
|
+
return name;
|
|
648
|
+
}
|
|
649
|
+
_getGoodIdFromSku(sku) {
|
|
650
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
651
|
+
const response = yield this._configuratorService.getGoodIdFromSku(sku, false);
|
|
652
|
+
if (response && response.validationResult && response.validationResult.success && response.resultObject) {
|
|
653
|
+
return response.resultObject;
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
_getArticle(sku, goodId) {
|
|
658
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
659
|
+
if (this._articleCache.has(sku)) {
|
|
660
|
+
this.articleLoaded.next(this._articleCache.get(sku));
|
|
661
|
+
return this._articleCache.get(sku);
|
|
662
|
+
}
|
|
663
|
+
if (!goodId) {
|
|
664
|
+
goodId = yield this._getGoodIdFromSku(sku)
|
|
665
|
+
.catch((error) => {
|
|
666
|
+
throw `Article with sku ${sku} not found!`;
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
let article;
|
|
670
|
+
const articleResponse = yield this._configuratorService.getArticleQuickSel(goodId, false);
|
|
671
|
+
if (articleResponse && articleResponse.validationResult && articleResponse.validationResult.success && articleResponse.resultObject) {
|
|
672
|
+
if (articleResponse.resultObject.hasOwnProperty('oArticle')) {
|
|
673
|
+
const obj = Array.isArray(articleResponse.resultObject['oArticle']) ? articleResponse.resultObject['oArticle'][0] : articleResponse.resultObject['oArticle'];
|
|
674
|
+
article = this._boFactory.makeWithRawBackendData(Article, obj);
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
article = this._boFactory.makeWithRawBackendData(Article, articleResponse.resultObject);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
this._articleCache.set(sku, article);
|
|
681
|
+
this.articleLoaded.next(article);
|
|
682
|
+
return article;
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
_getSelections(instanceId, publicationCode) {
|
|
686
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
687
|
+
this._selections = [];
|
|
688
|
+
const selectionResponse = yield this._configuratorService.getSelections(false, publicationCode);
|
|
689
|
+
if (selectionResponse && selectionResponse.resultObjects && selectionResponse.resultObjects.length > 0) {
|
|
690
|
+
this._selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, selectionResponse.resultObjects);
|
|
691
|
+
this._selections.forEach(s => s.instanceId = instanceId);
|
|
692
|
+
// const filtered: Selection[] = this._selections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
|
|
693
|
+
this.selectionsReceived.next(this._selections);
|
|
694
|
+
}
|
|
695
|
+
else {
|
|
696
|
+
throw 'No selections found!';
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
_getDecos() {
|
|
701
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
702
|
+
this._decos = [];
|
|
703
|
+
const decosResponse = yield this._configuratorService.getDecos(false);
|
|
704
|
+
if (decosResponse && decosResponse.resultObjects && decosResponse.resultObjects.length > 0) {
|
|
705
|
+
this._decos = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, decosResponse.resultObjects);
|
|
706
|
+
this.decosReceived.next(this._decos);
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
throw 'No deconodes found!';
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
_linkSelectionsAndDecos() {
|
|
714
|
+
if (!this._selections || !this._selections.length) {
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
const len = this._selections.length;
|
|
718
|
+
for (let i = 0; i < len; i++) {
|
|
719
|
+
// const id: string = this.selections[i].artNodeIdDeco;
|
|
720
|
+
let deco = this._decos.find(d => d.nodeId === this._selections[i].node);
|
|
721
|
+
if (!deco) {
|
|
722
|
+
deco = new DecoNode();
|
|
723
|
+
}
|
|
724
|
+
if (deco.type !== DecoNodeType.Variation) {
|
|
725
|
+
const variation = this._getVariations().find(v => v.parentId === this._selections[i].artNodeIdDeco);
|
|
726
|
+
if (variation) {
|
|
727
|
+
deco.variation = variation;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
this._selections[i].decoNode = deco;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
_getVariations() {
|
|
734
|
+
if (this._decos && this._decos.length) {
|
|
735
|
+
return this._decos.filter((deco) => {
|
|
736
|
+
return deco.type === DecoNodeType.Variation;
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
return [];
|
|
740
|
+
}
|
|
741
|
+
_loadVariations(obj) {
|
|
742
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
743
|
+
this._log('load variation for parts');
|
|
744
|
+
yield this._variationHelper.loadPart(obj, this._adjustables, true);
|
|
745
|
+
this._log('load variation for adjustables');
|
|
746
|
+
yield this._variationHelper.loadVariation(obj, this._adjustables, true);
|
|
747
|
+
this._log('load variation for addables');
|
|
748
|
+
yield this._variationHelper.loadVariation(obj, this._addables, true);
|
|
749
|
+
this._log('load variation clear cache');
|
|
750
|
+
this._variationHelper.clearCache();
|
|
751
|
+
this._log('load variations done');
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
_getAdjustables() {
|
|
755
|
+
if (!this._selections || !this._selections.length) {
|
|
756
|
+
return [];
|
|
757
|
+
}
|
|
758
|
+
return this._selections.filter(s => {
|
|
759
|
+
const node = s.decoNode;
|
|
760
|
+
return node && node.gameObjectName && node.type === DecoNodeType.Part && node.kind === DecoNodeKind.Adjustable;
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
_updatePivot(obj) {
|
|
764
|
+
const boundingBox = new THREE.Box3().setFromObject(obj);
|
|
765
|
+
const bbCenterPivot = new THREE.Vector3();
|
|
766
|
+
boundingBox.getCenter(bbCenterPivot);
|
|
767
|
+
const delta = new THREE.Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
|
|
768
|
+
obj.children.forEach((child) => {
|
|
769
|
+
child.position.add(delta);
|
|
770
|
+
});
|
|
771
|
+
obj.updateWorldMatrix(false, true);
|
|
772
|
+
}
|
|
773
|
+
_reset() {
|
|
774
|
+
this._placedAddables.length = 0;
|
|
775
|
+
this._placedAdjustables.length = 0;
|
|
776
|
+
this._adjustables.length = 0;
|
|
777
|
+
this._addables.length = 0;
|
|
778
|
+
// this._prepareTheSelections();
|
|
779
|
+
}
|
|
780
|
+
_log(message, force = false) {
|
|
781
|
+
if (this.debug) {
|
|
782
|
+
this.debug(message);
|
|
783
|
+
console.log(new Date(), message);
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
Builder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Builder, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
788
|
+
Builder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Builder, providedIn: 'root' });
|
|
789
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Builder, decorators: [{
|
|
790
|
+
type: Injectable,
|
|
791
|
+
args: [{
|
|
792
|
+
providedIn: 'root'
|
|
793
|
+
}]
|
|
794
|
+
}], ctorParameters: function () { return []; } });
|
|
795
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDekUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQzFFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBR3RFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM3RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUdwRyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RGLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFB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O1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUIsZ0NBQWdDO0lBQ2xDLENBQUM7SUFFTyxJQUFJLENBQUMsT0FBZSxFQUFFLFFBQWlCLEtBQUs7UUFDbEQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDOztxR0ExeEJVLE9BQU87eUdBQVAsT0FBTyxjQUZOLE1BQU07NEZBRVAsT0FBTztrQkFIbkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvbic7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7RGVjb05vZGVLaW5kfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLWtpbmQuZW51bSc7XHJcbmltcG9ydCB7QXJ0aWNsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtRdWVzdGlvbkFuZEFuc3dlcnN9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24tYW5kLWFuc3dlcnMnO1xyXG5pbXBvcnQge05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vbm9kZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvc2VydmljZS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeSc7XHJcbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvb3B0aW9ucyc7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhJztcclxuaW1wb3J0IHtUaHJlZWRVdGlsc30gZnJvbSAnLi91dGlscy90aHJlZWQudXRpbHMnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkhlbHBlcn0gZnJvbSAnLi9jb3JlL2hlbHBlci92YXJpYXRpb24taGVscGVyJztcclxuaW1wb3J0IHtTd2l0Y2hCdWlsZEZ1cm5pdHVyZVNlcnZpY2V9IGZyb20gJy4vc2VydmljZXMvc3dpdGNoLWJ1aWxkLWZ1cm5pdHVyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtTd2l0Y2hMb2FkRnVybml0dXJlU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9zd2l0Y2gtbG9hZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3ItY29ubmVjdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4vbW9kZWwvY29uZmlndXJhdGlvbi1yZXN1bHQtb2JqZWN0JztcclxuaW1wb3J0IHtJbWFnZVV0aWxzfSBmcm9tICcuL3V0aWxzL2ltYWdlLnV0aWxzJztcclxuaW1wb3J0IHtTY2VuZVV0aWxzfSBmcm9tICcuL3V0aWxzL3NjZW5lLXV0aWxzJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi91dGlscy9vYmplY3QudXRpbHMnO1xyXG5pbXBvcnQge1NlcnZpY2VMb2NhdG9yfSBmcm9tICcuL3NlcnZpY2VzL2xvY2F0b3Iuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcclxuXHJcbiAgcHVibGljIHNlbGVjdGlvbnNSZWNlaXZlZDogQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uW10+KFtdKTtcclxuICBwdWJsaWMgYXJ0aWNsZUxvYWRlZDogQmVoYXZpb3JTdWJqZWN0PEFydGljbGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnRpY2xlPih1bmRlZmluZWQpO1xyXG4gIHB1YmxpYyBkZWNvc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8RGVjb05vZGVbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERlY29Ob2RlW10+KFtdKTtcclxuICBwdWJsaWMgYW5zd2Vyc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8QW5zd2VyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBbnN3ZXJbXT4oW10pO1xyXG4gIHB1YmxpYyBtb2RlbExvYWRlZDogQmVoYXZpb3JTdWJqZWN0PFRIUkVFLk9iamVjdDNEPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEhSRUUuT2JqZWN0M0Q+KG51bGwpO1xyXG5cclxuICBwdWJsaWMgc2V0IGRlYnVnKHZhbHVlOiBGdW5jdGlvbikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2RlYnVnID0gdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLl92YXJpYXRpb25IZWxwZXIpIHtcclxuICAgICAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIuZGVidWcgPSB0aGlzLl9kZWJ1ZztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZWJ1ZygpOiBGdW5jdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVidWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zY2VuZTogVEhSRUUuU2NlbmU7XHJcbiAgcHJpdmF0ZSBfaW5zdGFuY2VJZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3NrdTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2dvb2RJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3NlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfYW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9kZWNvczogRGVjb05vZGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3BsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3BsYWNlZEFkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9kZWJ1ZzogRnVuY3Rpb247XHJcblxyXG4gIHByaXZhdGUgX2ltYWdlQ2FjaGU6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5O1xyXG4gIHByaXZhdGUgX3NvdXJjZTogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgcHJpdmF0ZSBfdGhyZWVkVXRpbHM6IFRocmVlZFV0aWxzO1xyXG4gIHByaXZhdGUgX3ZhcmlhdGlvbkhlbHBlcjogVmFyaWF0aW9uSGVscGVyO1xyXG4gIHByaXZhdGUgX2FydGljbGVDYWNoZTogTWFwPHN0cmluZywgQXJ0aWNsZT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U6IENvbmZpZ3VyYXRvclNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBfYnVpbGRGdXJuaXR1cmVTZXJ2aWNlOiBTd2l0Y2hCdWlsZEZ1cm5pdHVyZVNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBfbG9hZEZ1cm5pdHVyZVNlcnZpY2U6IFN3aXRjaExvYWRGdXJuaXR1cmVTZXJ2aWNlO1xyXG4gIHByaXZhdGUgX2NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2U6IENvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChDb25maWd1cmF0b3JTZXJ2aWNlKTtcclxuICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChTd2l0Y2hCdWlsZEZ1cm5pdHVyZVNlcnZpY2UpO1xyXG4gICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoU3dpdGNoTG9hZEZ1cm5pdHVyZVNlcnZpY2UpO1xyXG4gICAgdGhpcy5fY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChDb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0TmV3QnVpbGQoXHJcbiAgICBzY2VuZTogU2NlbmUsXHJcbiAgICBvcHRpb25zPzogT3B0aW9ucyxcclxuICAgIHNrdT86IHN0cmluZyxcclxuICAgIGluc3RhbmNlSWQ/OiBzdHJpbmcsXHJcbiAgICBnb29kSWQ/OiBudW1iZXJcclxuICApOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXRDb25uZWN0b3Iob3B0aW9ucywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZVNlcnZpY2Uuc2NlbmUgPSBzY2VuZTtcclxuICAgIGlmIChza3UpIHtcclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgY29uc3QgZnVybml0dXJlRGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCA9IG5ldyBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KCk7XHJcbiAgICAgICAgZnVybml0dXJlRGF0YS5za3UgPSBza3U7XHJcbiAgICAgICAgZnVybml0dXJlRGF0YS5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0T2JqZWN0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID1cclxuICAgICAgICAgIGF3YWl0IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVTZXJ2aWNlLmxvYWRGdXJuaXR1cmUoXHJcbiAgICAgICAgICAgIGZ1cm5pdHVyZURhdGEsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2JqZWN0Lm9iamVjdDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGZ1cm5pdHVyZSBjb25maWd1cmF0aW9uOicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGJ1aWxkV2l0aERhdGEoXHJcbiAgICBvcHRpb25zPzogT3B0aW9ucyxcclxuICAgIHNlbGVjdGlvbnM/OiBTZWxlY3Rpb25bXSxcclxuICAgIGRlY29zPzogRGVjb05vZGVbXSxcclxuICAgIGFzc2V0VXJsPzogc3RyaW5nLFxyXG4gICAgY2RuVXJsPzogc3RyaW5nLFxyXG4gICAgc2NoZW1hPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcclxuICAgICAgaWYgKCF0aGlzLl9zY2VuZSkge1xyXG4gICAgICAgIHJlamVjdCgnbm8gc2NlbmUgcHJvdmlkZWQhJyk7XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9sb2coJ3N0YXJ0IGJ1aWxkJywgdHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZG93bmxvYWRBc3NldChhc3NldFVybCwgY2RuVXJsLCBzY2hlbWEsIHNlbGVjdGlvbnMgJiYgc2VsZWN0aW9ucy5sZW5ndGggPiAxICYmIGRlY29zICYmIGRlY29zLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbnMgJiYgc2VsZWN0aW9ucy5sZW5ndGggPiAxICYmIGRlY29zICYmIGRlY29zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHNjZW5lLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVTZXJ2aWNlLnNjZW5lID0gdGhpcy5fc2NlbmU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QgPSBuZXcgQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zID0gc2VsZWN0aW9ucztcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzID0gZGVjb3M7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZVNlcnZpY2UubGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50QWN0aXZlU2VydmljZS5wcmVwYXJlVGhlU2VsZWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fcHJlbG9hZE1hdGVyaWFscygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVTZXJ2aWNlLnByZWxvYWRNYXRlcmlhbHMob3B0aW9ucy5zY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgYnVpbGQgPSBhd2FpdCB0aGlzLl9idWlsZCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYnVpbGQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QgPSBhd2FpdCB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZVNlcnZpY2UuYnVpbGQocmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGJ1aWxkLm9iamVjdCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5fc291cmNlKTsgLy8ganVzdCByZXR1cm4gdGhlIHNvdXJjZSBmb3Igc2ltcGxpY2l0eVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFzc2V0VXJsKSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGBFcnJvciBkb3dubG9hZGluZyBzb3VyY2U6ICR7YXNzZXRVcmx9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdObyAzRCBzb3VyY2UgcHJvdmlkZWQhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgdGhpcy5fY2xlYW5VcCgpO1xyXG4gICAgICAgICAgdGhpcy5fbG9nKCdmaW5pc2ggYnVpbGQnLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoc2NlbmU6IFNjZW5lLCBvcHRpb25zPzogT3B0aW9ucykge1xyXG4gICAgdGhpcy5fYm9GYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG4gICAgdGhpcy5fdGhyZWVkVXRpbHMgPSBuZXcgVGhyZWVkVXRpbHMoKTtcclxuICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlciA9IG5ldyBWYXJpYXRpb25IZWxwZXIoKTtcclxuICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5kZWJ1ZyA9IHRoaXMuX2RlYnVnO1xyXG5cclxuICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgdGhyb3cgJ05vIHNjZW5lIG9iamVjdCBwcm92aWRlZCEnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IG5ldyBDb25maWd1cmF0b3JTZXJ2aWNlKCk7XHJcbiAgICAvLyB0aGlzLl9pbWFnZUNhY2hlU2VydmljZSA9IG5ldyBJbWFnZUNhY2hlU2VydmljZSgpO1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5pbml0QXBpKG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NlbmUgPSBzY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsKHNrdT86IHN0cmluZywgaW5zdGFuY2VJZD86IHN0cmluZywgZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG4gICAgaWYgKCF0aGlzLl9zY2VuZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9zZXRJbnN0YW5jZUlkKHNrdSwgaW5zdGFuY2VJZCwgZ29vZElkKTtcclxuICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNvbmZpZ3VyYXRpb24odGhpcy5fc2t1LCB0aGlzLl9nb29kSWQpO1xyXG4gICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHRoaXMuX2luc3RhbmNlSWQpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmdldFF1ZXN0aW9uQW5kQW5zd2VycygpKTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldFNlbGVjdGlvbnModGhpcy5faW5zdGFuY2VJZCkpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0RGVjb3MoKSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9hbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVUaGVTZWxlY3Rpb25zKCk7XHJcbiAgICAgICAgdGhpcy5fcHJlbG9hZE1hdGVyaWFscygpO1xyXG4gICAgICAgIGNvbnN0IGJ1aWxkID0gYXdhaXQgdGhpcy5fYnVpbGQoKTtcclxuICAgICAgICByZXR1cm4gYnVpbGQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgJ0dMQiBzb3VyY2Ugbm90IGZvdW5kISc7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsRnJvbURhdGEoc2VsZWN0aW9uczogU2VsZWN0aW9uW10sIGRlY29zOiBEZWNvTm9kZVtdLCBhc3NldFVybDogc3RyaW5nLCBjZG5Vcmw6IHN0cmluZywgc2NoZW1hOiBzdHJpbmcpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5fc2NlbmUpIHtcclxuICAgICAgICByZWplY3QoJ25vIHNjZW5lIHByb3ZpZGVkIScpO1xyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5fbG9nKCdzdGFydCBidWlsZCcsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2Rvd25sb2FkQXNzZXQoYXNzZXRVcmwsIGNkblVybCwgc2NoZW1hLCBzZWxlY3Rpb25zICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMSAmJiBkZWNvcyAmJiBkZWNvcy5sZW5ndGggPiAwKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25zICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMSAmJiBkZWNvcyAmJiBkZWNvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucyA9IHNlbGVjdGlvbnM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWNvcyA9IGRlY29zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ByZWxvYWRNYXRlcmlhbHMoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1aWxkID0gYXdhaXQgdGhpcy5fYnVpbGQoKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoYnVpbGQpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuX3NvdXJjZSk7IC8vIGp1c3QgcmV0dXJuIHRoZSBzb3VyY2UgZm9yIHNpbXBsaWNpdHlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICByZWplY3QoZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhc3NldFVybCkge1xyXG4gICAgICAgICAgICAgIHJlamVjdChgRXJyb3IgZG93bmxvYWRpbmcgc291cmNlOiAke2Fzc2V0VXJsfWApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJlamVjdCgnTm8gM0Qgc291cmNlIHByb3ZpZGVkIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIHRoaXMuX2NsZWFuVXAoKTtcclxuICAgICAgICAgIHRoaXMuX2xvZygnZmluaXNoIGJ1aWxkJywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0Tm9kZUluc3RhbmNlKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UoZ29vZElkLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RocmVlZFV0aWxzLmNsZWFyQ2FjaGUoKTtcclxuICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKHB1YmxpY2F0aW9uQ29kZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcXVlc3Rpb25zQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoZmFsc2UsIHB1YmxpY2F0aW9uQ29kZSk7XHJcbiAgICB0aGlzLl9hbnN3ZXJzID0gcXVlc3Rpb25zQW5kQW5zd2VycyAmJiBxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnMgPyBxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnMgOiBbXTtcclxuICAgIHRoaXMuYW5zd2Vyc1JlY2VpdmVkLm5leHQodGhpcy5fYW5zd2Vycyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdEFuc3dlcihhbnN3ZXIsIGZhbHNlKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgICBpZiAodGhpcy5fYW5zd2VycyAmJiB0aGlzLl9hbnN3ZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLl9idWlsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEltYWdlRm9yU2VsZWN0aW9uT3JBbnN3ZXIob2JqZWN0OiBTZWxlY3Rpb24gfCBBbnN3ZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgaW5jbHVkZU1pbWVUeXBlOiBib29sZWFuID0gdHJ1ZSwgdGh1bWI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5ub2RlSWQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKG9iamVjdC5ub2RlSWQpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRTaW5nbGVJbWFnZShvYmplY3Qubm9kZUlkLCA0LCBpbmNsdWRlTWltZVR5cGUsIHRodW1iLCB0cnVlKVxyXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VEYXRhOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJhc2U2NDogc3RyaW5nID0gdGhpcy5faGFuZGxlUmVzcG9uc2VEYXRhKGluY2x1ZGVNaW1lVHlwZSwgdGh1bWIsIHJlc3BvbnNlRGF0YSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5faW1hZ2VDYWNoZS5zZXQob2JqZWN0Lm5vZGVJZCwgYmFzZTY0KTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGJhc2U2NCk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUodGhpcy5faW1hZ2VDYWNoZS5nZXQob2JqZWN0Lm5vZGVJZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWplY3QoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2NsZWFuVXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9za3UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9nb29kSWQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9pbnN0YW5jZUlkID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmNsZWFyQ2FjaGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZVJlc3BvbnNlRGF0YShpbmNsdWRlTWltZXR5cGU6IGJvb2xlYW4sIHRodW1iOiBib29sZWFuLCByZXNwb25zZURhdGE6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKTogc3RyaW5nIHtcclxuICAgIGlmIChyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICBpZiAocmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdC5maWxlUGF0aCAhPT0gbnVsbCAmJiByZXNwb25zZURhdGEucmVzdWx0T2JqZWN0LmZpbGVQYXRoICE9PSAnJykge1xyXG4gICAgICAgIHJldHVybiBJbWFnZVV0aWxzLmdldEZpeGVkSW1hZ2VGaWxlcGF0aFVybChyZXNwb25zZURhdGEucmVzdWx0T2JqZWN0LmZpbGVQYXRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoaW5jbHVkZU1pbWV0eXBlKSB7XHJcbiAgICAgICAgICByZXR1cm4gSW1hZ2VVdGlscy5nZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihyZXNwb25zZURhdGEucmVzdWx0T2JqZWN0LmZpbGVOYW1lLFxyXG4gICAgICAgICAgICB0aHVtYiA/IHJlc3BvbnNlRGF0YS5yZXN1bHRPYmplY3QudGh1bWJuYWlsQm9keSA6IHJlc3BvbnNlRGF0YS5yZXN1bHRPYmplY3QuZG9jdW1lbnRCb2R5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRodW1iID8gcmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdC50aHVtYm5haWxCb2R5IDogcmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdC5kb2N1bWVudEJvZHk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVsb2FkTWF0ZXJpYWxzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RlY29zICYmIHRoaXMuX2RlY29zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBtYXRlcmlhbHM6IERlY29Ob2RlW10gPSBbLi4ubmV3IFNldChcclxuICAgICAgICB0aGlzLl9kZWNvc1xyXG4gICAgICAgICAgLmZpbHRlcihkID0+IChkLmdhbWVPYmplY3ROYW1lIHx8IGQubWF0ZXJpYWxVcmwpICYmIGQudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbilcclxuICAgICAgICAgIC5tYXAoZCA9PiBkKVxyXG4gICAgICApXTtcclxuICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLnByZWxvYWRWYXJpYXRpb25zKG1hdGVyaWFscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9zZXRJbnN0YW5jZUlkKHNrdTogc3RyaW5nLCBpbnN0YW5jZUlkPzogc3RyaW5nLCBnb29kSWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghaW5zdGFuY2VJZCAmJiAhdGhpcy5faW5zdGFuY2VJZCkge1xyXG4gICAgICBpZiAoIWdvb2RJZCkge1xyXG4gICAgICAgIGdvb2RJZCA9IGF3YWl0IHRoaXMuX2dldEdvb2RJZEZyb21Ta3Uoc2t1KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9nb29kSWQgPSBnb29kSWQ7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmluaXROb2RlSW5zdGFuY2UodGhpcy5fZ29vZElkKTtcclxuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5faW5zdGFuY2VJZCA9IHJlc3VsdC5yZXN1bHRPYmplY3Q7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgJ0ZhaWxlZCB0byBpbml0aWFsaXplIG5vZGUgaW5zdGFuY2UnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9pbnN0YW5jZUlkKSB7XHJcbiAgICAgIHRoaXMuX2luc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLl9za3UpIHtcclxuICAgICAgdGhpcy5fc2t1ID0gc2t1O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYXJ0aWNsZTogQXJ0aWNsZSA9IGF3YWl0IHRoaXMuX2dldEFydGljbGUoc2t1LCBnb29kSWQpO1xyXG4gICAgaWYgKGFydGljbGUgJiYgYXJ0aWNsZS5hc3NldFVybCkge1xyXG4gICAgICBpZiAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwpIHtcclxuICAgICAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIuYXNzZXRQYXRoID1cclxuICAgICAgICAgIGFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsICtcclxuICAgICAgICAgIChhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICtcclxuICAgICAgICAgIChhcnRpY2xlLmRpc3RTY2hlbWEgPyBhcnRpY2xlLmRpc3RTY2hlbWEgOiAnVVBfREJBJyk7XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy5fZG93bmxvYWRBc3NldChhcnRpY2xlLmFzc2V0VXJsLCBhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybCwgYXJ0aWNsZS5kaXN0U2NoZW1hKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2Rvd25sb2FkQXNzZXQoYXNzZXRVcmw6IHN0cmluZywgY2RuVXJsOiBzdHJpbmcsIHNjaGVtYTogc3RyaW5nLCBzZXRWaXNpYmxlRmFsc2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zb3VyY2UgPSBhd2FpdCB0aGlzLl90aHJlZWRVdGlscy5kb3dubG9hZDNEU291cmNlKGFzc2V0VXJsLCBzZXRWaXNpYmxlRmFsc2UpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgfSk7XHJcbiAgICBpZiAoY2RuVXJsKSB7XHJcbiAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5hc3NldFBhdGggPVxyXG4gICAgICAgIGNkblVybCArXHJcbiAgICAgICAgKGNkblVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICtcclxuICAgICAgICAoc2NoZW1hID8gc2NoZW1hIDogJ1VQX0RCQScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYnVpbGQoKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG4gICAgY29uc3QgYWRqdXN0YWJsZXM6IFNlbGVjdGlvbltdID0gdGhpcy5fZ2V0QWRqdXN0YWJsZXMoKTtcclxuICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPT09IDAgJiYgdGhpcy5fc2VsZWN0aW9ucyAmJiB0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aCA+IDApIHsgLy8gY2hlY2sgaWYgYXJ0aWNsZSBoYXMgYSBnYW1lT2JqZWN0XHJcbiAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25zWzBdLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BcnRpY2xlICYmIHRoaXMuX3NlbGVjdGlvbnNbMF0uZ2FtZU9iamVjdCkge1xyXG4gICAgICAgIGFkanVzdGFibGVzLnB1c2godGhpcy5fc2VsZWN0aW9uc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgICAgb2JqLnZpc2libGUgPSBmYWxzZTsgLy8gbm8gbmVlZCB0byByZW5kZXIgdmlzdWFseVxyXG4gICAgICB0aGlzLl9zY2VuZS5hZGQob2JqKTtcclxuICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9sb2coJ2J1aWxkIG1haW4gbW9kZWwnKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbjogbnVtYmVyID0gYWRqdXN0YWJsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlOiBUSFJFRS5PYmplY3QzRCA9IHRoaXMuX2NyZWF0ZUFkanVzdGFibGUob2JqLCBhZGp1c3RhYmxlc1tpXSk7XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgIGZvciAobGV0IGlpID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoIC0gMTsgaWkgPj0gMDsgaWktLSkge1xyXG4gICAgICAgICAgICBpZiAoU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgb2JqLCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0sIGFkanVzdGFibGUsIGkgPT09IDEpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaWldLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb25uZWN0ZWQgJiYgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdObyBjb25uZWN0aW9uIGZvdW5kIGZvcjogJywgYWRqdXN0YWJsZS5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbG9nKCdwbGFjZSBhZGRhYmxlcycpO1xyXG4gICAgICB0aGlzLl9wbGFjZUFkZGFibGVzKG9iaik7XHJcbiAgICAgIHRoaXMuX2xvZygndXBkYXRlIHBpdm90Jyk7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZVBpdm90KG9iaik7XHJcbiAgICAgIHRoaXMuX2xvZygnbG9hZCB2YXJpYXRpb25zJyk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRWYXJpYXRpb25zKG9iaik7XHJcbiAgICAgIC8vIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgICAgIHRoaXMuX2xvZygncmVtb3ZlIGZyb20gc2NlbmUnKTtcclxuICAgICAgdGhpcy5fc2NlbmUucmVtb3ZlKG9iaik7XHJcbiAgICAgIE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QodGhpcy5fc291cmNlKTtcclxuICAgICAgLy8gdGhpcy5fY2xlYW5VcCgpO1xyXG4gICAgICB0aGlzLl9sb2coJ3JlYWR5IScpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGVkLm5leHQob2JqKTtcclxuICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93ICdObyBhZGp1c3RhYmxlcyBmb3VuZCEnO1xyXG4gICAgICAvLyB0aGlzLl9idWlsZGluZyA9IGZhbHNlO1xyXG4gICAgICAvLyBpZiAodGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgLy8gICAgIHRoaXMuX2Vycm9yU2VydmljZS5hZGRFcnJvcih0aGlzLmFjdGl2ZUluc3RhbmNlLCB7bWVzc2FnZTogJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCBkZXNjcmlwdGlvbjogJ05PX1NFTEVDVElPTlNfT1JfREVDT1NfSU5GTyd9KTtcclxuICAgICAgLy8gICAgIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHtpbnN0YW5jZUlkOiB0aGlzLmFjdGl2ZUluc3RhbmNlLCByZXN1bHRUeXBlOiBSZXN1bHRUeXBlLk5vU2VsZWN0aW9uc30pO1xyXG4gICAgICAvLyB9IGVsc2UgaWYgKHRoaXMuZGVjb3Muc2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPUycsIGRlc2NyaXB0aW9uOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJ30pO1xyXG4gICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9EZWNvTm9kZXN9KTtcclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICAgIHRoaXMuX2Vycm9yU2VydmljZS5hZGRFcnJvcih0aGlzLmFjdGl2ZUluc3RhbmNlLCB7bWVzc2FnZTogJ05PX0FESlVTVEFCTEVTJywgZGVzY3JpcHRpb246ICdOT19BREpVU1RBQkxFU19JTkZPJ30pO1xyXG4gICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9BZGp1c3RhYmxlc30pO1xyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlVGhlU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fc2VsZWN0aW9ucyB8fCAhdGhpcy5fc2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuX3NlbGVjdGlvbnMuc2xpY2UoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbk9mQXJ0aWNsZTogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQXJ0aWNsZSk7XHJcbiAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBzZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuYWRkQWRqdXN0ID09PSAnMicpO1xyXG4gICAgY29uc3QgaXNBcnRpY2xlV2l0aE1hdGVyaWFsOiBib29sZWFuID1cclxuICAgICAgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0ICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0Lmxlbmd0aCA+IDA7XHJcbiAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICBjb25zdCBnbG9iYWxWYXJpYXRpb25zOiBEZWNvTm9kZVtdID0gdGhpcy5fc2VsZWN0aW9uc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gKHMuZ2VuZXJpYyB8fCBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDEpICYmIChzLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uICYmICFzLmRlY29Ob2RlLnR5cGUpXHJcbiAgICAgIC5tYXAoKHZhbHVlOiBTZWxlY3Rpb24sIGluZGV4OiBudW1iZXIsIGFycmF5OiBTZWxlY3Rpb25bXSkgPT4ge1xyXG4gICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLl9nZXRNYXRlcmlhbElkRnJvbVBhcmVudCh2YWx1ZS5ub2RlKTtcclxuICAgICAgICByZXR1cm4gKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uO1xyXG4gICAgICB9KTtcclxuICAgIC8vIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBtb21lbnRcclxuICAgIC8vIGdsb2JhbFZhcmlhdGlvbnMuZm9yRWFjaChnID0+IHtcclxuICAgIC8vICAgY29uc3QgcGFyZW50SWR4ID0gc2VsZWN0aW9ucy5maW5kSW5kZXgocyA9PiBzLmRlY29Ob2RlICYmIHMuZGVjb05vZGUuaWQgPT09IGcucGFyZW50SWQpO1xyXG4gICAgLy8gICBpZiAocGFyZW50SWR4KSB7IC8vIHJlbW92ZSBwYXJlbnQgc2VsZWN0aW9uXHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy5zcGxpY2UocGFyZW50SWR4LCAxKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBjb25zdCBpZHggPSBzZWxlY3Rpb25zLmZpbmRJbmRleChzID0+IHMuZGVjb05vZGUgJiYgcy5kZWNvTm9kZS5pZCA9PT0gZy5pZCk7XHJcbiAgICAvLyAgIGlmIChpZHgpIHsgLy8gbW92ZSBnZW5lcmljIHZhcmlhdGlvbnMgdG8gdG9wXHJcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpZHhdO1xyXG4gICAgLy8gICAgIHNlbGVjdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy51bnNoaWZ0KHNlbGVjdGlvbik7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZCA9IHRoaXMuX2dldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZ2xvYmFsVmFyaWF0aW9ucy5maW5kKHYgPT4gdi5pZCA9PT0gZGVjb05vZGUuaWQpKSB7XHJcbiAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9ucy5wdXNoKGRlY29Ob2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gY29uc3QgdmFyaWF0aW9uOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5CcmFuZElkID0gc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uRGVzY3JpcHRpb24gPSBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uTWF0ZXJpYWxJZCA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgICAgLy8gdXNlZFZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb24pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKHNlbGVjdGlvbi5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuUGFydCAmJlxyXG4gICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSA9PT0gJ3N0cmluZycgJiZcclxuICAgICAgICAgIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5sZW5ndGgpIHx8IChpc0FydGljbGVXaXRoTWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlIHx8IChpc0FydGljbGVXaXRoTWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICBsYXN0QWRqdXN0YWJsZSA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgaWYgKGxhc3RBZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgbGFzdEFkanVzdGFibGUuYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FkZGFibGVzLnB1c2goc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgaWYgKCFsYXN0QWRkZWQgfHwgKGxhc3RBZGRlZC5ub2RlSWQgIT09IHNlbGVjdGlvbi5ub2RlSWQgfHwgbGFzdEFkZGVkLm5vZGUgIT09IHNlbGVjdGlvbi5ub2RlKSkge1xyXG4gICAgICAgICAgICAgIG5ld1BhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxhc3RBZGRlZCA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNQcmVzTGV2ZWwgPSBzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWw7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSxcclxuICAgIC8vICAge1ZhcmlhdGlvbnM6IHVzZWRWYXJpYXRpb25zfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtYXRlcmlhbElkIG9mIHRoZSBwYXJlbnQgdXAgdGhlIHRyZWUgdW50aWwgcHJlc2VudGlvbmxldmVsIDEgaXMgcmVhY2hlZFxyXG4gICAqIEBwYXJhbSBpZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0TWF0ZXJpYWxJZEZyb21QYXJlbnQoaWQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9ucykge1xyXG4gICAgICBjb25zdCBpZHg6IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMuZmluZEluZGV4KHMgPT4gcy5ub2RlID09PSBpZCk7XHJcbiAgICAgIGxldCBjdXJyZW50TGV2ZWw6IG51bWJlciA9IDk5OTtcclxuICAgICAgaWYgKGlkeCA+IC0xKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGlkeDsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICAgIGlmIChzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWwgPj0gY3VycmVudExldmVsKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3VycmVudExldmVsID0gc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsO1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlQWRqdXN0YWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGo6IFNlbGVjdGlvbik6IFRIUkVFLk9iamVjdDNEIHtcclxuICAgIGxldCBvYmo6IGFueSA9IHRoaXMuX3NvdXJjZSA/IHRoaXMuX3NvdXJjZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgb2JqID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShuYW1lKSA6IG51bGw7XHJcbiAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBObyBvYmplY3Qgd2l0aCBuYW1lICR7YWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lfSBmb3VuZCFgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIHBhcmVudC5hZGQoYWRqdXN0YWJsZSk7XHJcbiAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAvLyB0aGVyZWZvciB3ZSBuZWVkIHRvIHJldHJpZXZlIHRoZSBjcmVhdGVkIG9iamVjdCBhZ2FpblxyXG4gICAgYWRqdXN0YWJsZSA9IHBhcmVudC5nZXRPYmplY3RCeU5hbWUoYWRqdXN0YWJsZS5uYW1lKTtcclxuICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUFkZGFibGUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgYWRkOiBTZWxlY3Rpb24sIHBhcnQyPzogYW55LCBwYXJ0MT86IGFueSk6IFRIUkVFLk9iamVjdDNEIHtcclxuICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgIGFkZGFibGUubmFtZSA9IHRoaXMuX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50LCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcGFyZW50LmFkZChhZGRhYmxlKTtcclxuICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMucHVzaChhZGRhYmxlKTtcclxuICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWRkYWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3BsYWNlQWRkYWJsZXMocGFyZW50OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0aW9uJykgJiYgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0YWJsZVNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuc2VsZWN0aW9uO1xyXG4gICAgICAgIGlmIChhZGp1c3RhYmxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBjb25zdCBsZW5hOiBudW1iZXIgPSBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzLmxlbmd0aDtcclxuICAgICAgICAgIGxldCBjb25BZGRhYmxlOiBhbnk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpYSA9IDA7IGlhIDwgbGVuYTsgaWErKykge1xyXG4gICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICBwYXJlbnQsIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUocGFyZW50LCBhZGQsIHBhcnQyLCBwYXJ0MSkpO1xyXG4gICAgICAgICAgICBpZiAoY29uQWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgIFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgcGFyZW50LCBjb25BZGRhYmxlLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBvYmo6IFRIUkVFLk9iamVjdDNEKTogc3RyaW5nIHtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IG5hbWUgPSBvYmoubmFtZTtcclxuICAgIGxldCBleGlzdGluZ09iaiA9IHBhcmVudC5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgIG5hbWUgPSBvYmoubmFtZSArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9nZXRHb29kSWRGcm9tU2t1KHNrdTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0R29vZElkRnJvbVNrdShza3UsIGZhbHNlKTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2dldEFydGljbGUoc2t1OiBzdHJpbmcsIGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICBpZiAodGhpcy5fYXJ0aWNsZUNhY2hlLmhhcyhza3UpKSB7XHJcbiAgICAgIHRoaXMuYXJ0aWNsZUxvYWRlZC5uZXh0KHRoaXMuX2FydGljbGVDYWNoZS5nZXQoc2t1KSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlQ2FjaGUuZ2V0KHNrdSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdvb2RJZCkge1xyXG4gICAgICBnb29kSWQgPSBhd2FpdCB0aGlzLl9nZXRHb29kSWRGcm9tU2t1KHNrdSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBgQXJ0aWNsZSB3aXRoIHNrdSAke3NrdX0gbm90IGZvdW5kIWA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgYXJ0aWNsZTogQXJ0aWNsZTtcclxuICAgIGNvbnN0IGFydGljbGVSZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEFydGljbGVRdWlja1NlbChnb29kSWQsIGZhbHNlKTtcclxuICAgIGlmIChhcnRpY2xlUmVzcG9uc2UgJiYgYXJ0aWNsZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgYXJ0aWNsZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgIGlmIChhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0Lmhhc093blByb3BlcnR5KCdvQXJ0aWNsZScpKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gQXJyYXkuaXNBcnJheShhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddKSA/IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ11bMF0gOiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddO1xyXG4gICAgICAgIGFydGljbGUgPSA8QXJ0aWNsZT50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCBvYmopO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFydGljbGUgPSA8QXJ0aWNsZT50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fYXJ0aWNsZUNhY2hlLnNldChza3UsIGFydGljbGUpO1xyXG4gICAgdGhpcy5hcnRpY2xlTG9hZGVkLm5leHQoYXJ0aWNsZSk7XHJcbiAgICByZXR1cm4gYXJ0aWNsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2dldFNlbGVjdGlvbnMoaW5zdGFuY2VJZDogc3RyaW5nLCBwdWJsaWNhdGlvbkNvZGU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NlbGVjdGlvbnMgPSBbXTtcclxuICAgIGNvbnN0IHNlbGVjdGlvblJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0U2VsZWN0aW9ucyhmYWxzZSwgcHVibGljYXRpb25Db2RlKTtcclxuICAgIGlmIChzZWxlY3Rpb25SZXNwb25zZSAmJiBzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzICYmIHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25zID0gPFNlbGVjdGlvbltdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KFNlbGVjdGlvbiwgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cyk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGlvbnMuZm9yRWFjaChzID0+IHMuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQpO1xyXG4gICAgICAvLyBjb25zdCBmaWx0ZXJlZDogU2VsZWN0aW9uW10gPSB0aGlzLl9zZWxlY3Rpb25zLmZpbHRlcihzID0+IHMubm9kZVR5cGUgIT09IE5vZGVUeXBlLkFydGljbGUgJiYgcy5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1JlY2VpdmVkLm5leHQodGhpcy5fc2VsZWN0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyAnTm8gc2VsZWN0aW9ucyBmb3VuZCEnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9kZWNvcyA9IFtdO1xyXG4gICAgY29uc3QgZGVjb3NSZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldERlY29zKGZhbHNlKTtcclxuICAgIGlmIChkZWNvc1Jlc3BvbnNlICYmIGRlY29zUmVzcG9uc2UucmVzdWx0T2JqZWN0cyAmJiBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9kZWNvcyA9IDxEZWNvTm9kZVtdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KERlY29Ob2RlLCBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMpO1xyXG4gICAgICB0aGlzLmRlY29zUmVjZWl2ZWQubmV4dCh0aGlzLl9kZWNvcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyAnTm8gZGVjb25vZGVzIGZvdW5kISc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rpb25zIHx8ICF0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAvLyBjb25zdCBpZDogc3RyaW5nID0gdGhpcy5zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY287XHJcbiAgICAgIGxldCBkZWNvOiBhbnkgPSB0aGlzLl9kZWNvcy5maW5kKGQgPT4gZC5ub2RlSWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0ubm9kZSk7XHJcbiAgICAgIGlmICghZGVjbykge1xyXG4gICAgICAgIGRlY28gPSBuZXcgRGVjb05vZGUoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGVjby50eXBlICE9PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSB0aGlzLl9nZXRWYXJpYXRpb25zKCkuZmluZCh2ID0+IHYucGFyZW50SWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3NlbGVjdGlvbnNbaV0uZGVjb05vZGUgPSBkZWNvO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VmFyaWF0aW9ucygpOiBEZWNvTm9kZVtdIHtcclxuICAgIGlmICh0aGlzLl9kZWNvcyAmJiB0aGlzLl9kZWNvcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2RlY29zLmZpbHRlcigoZGVjbzogRGVjb05vZGUpID0+IHtcclxuICAgICAgICByZXR1cm4gZGVjby50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2xvYWRWYXJpYXRpb25zKG9iajogVEhSRUUuT2JqZWN0M0QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2xvZygnbG9hZCB2YXJpYXRpb24gZm9yIHBhcnRzJyk7XHJcbiAgICBhd2FpdCB0aGlzLl92YXJpYXRpb25IZWxwZXIubG9hZFBhcnQob2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICB0aGlzLl9sb2coJ2xvYWQgdmFyaWF0aW9uIGZvciBhZGp1c3RhYmxlcycpO1xyXG4gICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24ob2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICB0aGlzLl9sb2coJ2xvYWQgdmFyaWF0aW9uIGZvciBhZGRhYmxlcycpO1xyXG4gICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24ob2JqLCB0aGlzLl9hZGRhYmxlcywgdHJ1ZSk7XHJcbiAgICB0aGlzLl9sb2coJ2xvYWQgdmFyaWF0aW9uIGNsZWFyIGNhY2hlJyk7XHJcbiAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIuY2xlYXJDYWNoZSgpO1xyXG4gICAgdGhpcy5fbG9nKCdsb2FkIHZhcmlhdGlvbnMgZG9uZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0QWRqdXN0YWJsZXMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rpb25zIHx8ICF0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB7XHJcbiAgICAgIGNvbnN0IG5vZGU6IERlY29Ob2RlID0gcy5kZWNvTm9kZTtcclxuICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5nYW1lT2JqZWN0TmFtZSAmJiBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmIG5vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVBpdm90KG9iajogVEhSRUUuT2JqZWN0M0QpIHtcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XHJcbiAgICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGJvdW5kaW5nQm94LmdldENlbnRlcihiYkNlbnRlclBpdm90KTtcclxuICAgIGNvbnN0IGRlbHRhOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5zdWIoYmJDZW50ZXJQaXZvdCkuc2V0WShNYXRoLmFicyhNYXRoLm1pbihib3VuZGluZ0JveC5taW4ueSwgMCkpKTtcclxuXHJcbiAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjaGlsZC5wb3NpdGlvbi5hZGQoZGVsdGEpO1xyXG4gICAgfSk7XHJcbiAgICBvYmoudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvZyhtZXNzYWdlOiBzdHJpbmcsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIHRoaXMuZGVidWcobWVzc2FnZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKG5ldyBEYXRlKCksIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|