@colijnit/homedecorator 258.1.1 → 258.1.2
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/app/core/enum/icon.enum.d.ts +1 -0
- package/app/core/enum/message-type.enum.d.ts +2 -1
- package/app/core/interface/message-with-payload.interface.d.ts +1 -0
- package/app/core/model/homedecorator-settings-options.d.ts +1 -1
- package/app/core/model/homedecorator-settings.d.ts +3 -0
- package/app/core/service/3dm-api.d.ts +2 -2
- package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +9 -1
- package/app/core/service/homedecorator-connector.service.d.ts +15 -2
- package/app/core/service/utils.service.d.ts +1 -1
- package/app/core/utils/object.utils.d.ts +2 -0
- package/app/homedecorator.module.d.ts +2 -1
- package/app/plugins/core3d/service/wall-measurements.service.d.ts +2 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +3 -0
- package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +2 -0
- package/app/plugins/product-configurator/product-configurator-selector-list-of-values.component.scss +28 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-button.component.d.ts +19 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-button.component.scss +38 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.d.ts +20 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.scss +0 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.d.ts +19 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-tile.component.scss +56 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.d.ts +20 -0
- package/app/plugins/product-configurator/product-configurator-selector.component.d.ts +26 -0
- package/app/plugins/product-configurator/product-configurator-selector.component.scss +46 -0
- package/app/plugins/product-configurator/product-configurator.component.d.ts +38 -0
- package/app/plugins/product-configurator/product-configurator.component.scss +35 -0
- package/app/plugins/product-configurator/product-configurator.module.d.ts +18 -0
- package/app/plugins/product-configurator/template_variables.scss +13 -0
- package/app/plugins/render/model/blender-render-settings.d.ts +10 -0
- package/app/plugins/render/model/blender-scene-settings.d.ts +18 -0
- package/app/plugins/render/render-controls/render-controls.component.d.ts +19 -7
- package/app/plugins/render/service/new-render.service.d.ts +21 -4
- package/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.scss +1 -1
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +5 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +4 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.scss +17 -0
- package/app/plugins/threedselector/threedselector.module.d.ts +2 -1
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
- package/assets/icons/circle_regular.svg +0 -0
- package/bundles/colijnit-homedecorator.umd.js +1986 -835
- package/bundles/colijnit-homedecorator.umd.js.map +1 -1
- package/esm2015/app/app.version.js +3 -3
- package/esm2015/app/core/enum/icon.enum.js +2 -1
- package/esm2015/app/core/enum/message-type.enum.js +2 -1
- package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
- package/esm2015/app/core/model/homedecorator-settings-options.js +2 -2
- package/esm2015/app/core/model/homedecorator-settings.js +3 -1
- package/esm2015/app/core/model/icon.js +2 -1
- package/esm2015/app/core/service/3dm-api.js +15 -22
- package/esm2015/app/core/service/homedecorator-app-event.service.js +3 -2
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +65 -7
- package/esm2015/app/core/service/homedecorator-connector.service.js +150 -6
- package/esm2015/app/core/service/homedecorator-settings.service.js +8 -1
- package/esm2015/app/core/service/utils.service.js +116 -93
- package/esm2015/app/core/utils/object.utils.js +13 -1
- package/esm2015/app/homedecorator.component.js +1 -2
- package/esm2015/app/homedecorator.module.js +8 -4
- package/esm2015/app/plugins/core3d/core3d/core3d.component.js +2 -2
- package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +7 -1
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +98 -50
- package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +4 -4
- package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +21 -11
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-button.component.js +67 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.js +57 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.js +75 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.js +90 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector.component.js +253 -0
- package/esm2015/app/plugins/product-configurator/product-configurator.component.js +151 -0
- package/esm2015/app/plugins/product-configurator/product-configurator.module.js +115 -0
- package/esm2015/app/plugins/render/model/blender-render-settings.js +3 -0
- package/esm2015/app/plugins/render/model/blender-scene-settings.js +10 -0
- package/esm2015/app/plugins/render/model/render-parameters.js +3 -3
- package/esm2015/app/plugins/render/render-controls/render-controls.component.js +532 -446
- package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +6 -40
- package/esm2015/app/plugins/render/service/new-render.service.js +212 -44
- package/esm2015/app/plugins/render/service/render.service.js +6 -9
- package/esm2015/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.js +1 -1
- package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +1 -1
- package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +12 -10
- package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +2 -2
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +55 -1
- package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +3 -3
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +64 -15
- package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +1 -1
- package/esm2015/app/plugins/threedselector/threedselector.module.js +8 -4
- package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +1 -1
- package/esm2015/app/shared/category-library/category-library.component.js +1 -1
- package/fesm2015/colijnit-homedecorator.js +2522 -1149
- package/fesm2015/colijnit-homedecorator.js.map +1 -1
- package/package.json +4 -4
- package/styles.scss +1 -1
|
@@ -7,15 +7,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { Injectable } from '@angular/core';
|
|
10
|
+
import { EventEmitter, Injectable } from '@angular/core';
|
|
11
11
|
import axios from 'axios';
|
|
12
12
|
import { BehaviorSubject } from 'rxjs';
|
|
13
|
-
import { Light } from 'three';
|
|
13
|
+
import { Light, Vector3 } from 'three';
|
|
14
14
|
import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';
|
|
15
15
|
import { RenderQueueItem } from '../model/render-queue-item';
|
|
16
16
|
import { RenderStatus } from '../enum/render-status';
|
|
17
17
|
import { MessageType } from '../../../core/enum/message-type.enum';
|
|
18
18
|
import { SceneSettings } from '../../../core/service/3dm-api';
|
|
19
|
+
import { BlenderSceneSetting, BlenderSceneType } from '../model/blender-scene-settings';
|
|
19
20
|
import * as i0 from "@angular/core";
|
|
20
21
|
import * as i1 from "../../../core/service/message-bus.service";
|
|
21
22
|
import * as i2 from "../../../core/service/homedecorator-settings.service";
|
|
@@ -31,8 +32,11 @@ import * as i11 from "../../room-planner/components/floorplanner/service/room.se
|
|
|
31
32
|
import * as i12 from "../../core3d/service/floor.service";
|
|
32
33
|
import * as i13 from "../../threedselector/threedselector/service/load-furniture.service";
|
|
33
34
|
import * as i14 from "../../../core/service/utils.service";
|
|
35
|
+
import * as i15 from "../../../core/service/presets.service";
|
|
36
|
+
import * as i16 from "../../../core/service/3dm-api";
|
|
37
|
+
import * as i17 from "../../../core/service/homedecorator-app-event.service";
|
|
34
38
|
export class NewRenderService {
|
|
35
|
-
constructor(messageService, _settingsService, _buildFurnitureService, _cameraService, _sceneService, _ione, _ioneConnectorAdapter, _threedSelectorService, _toastService, _messageBusService, _googleTagManager, _roomService, _floorService, _loadFurnitureService, _utilsService) {
|
|
39
|
+
constructor(messageService, _settingsService, _buildFurnitureService, _cameraService, _sceneService, _ione, _ioneConnectorAdapter, _threedSelectorService, _toastService, _messageBusService, _googleTagManager, _roomService, _floorService, _loadFurnitureService, _utilsService, _presetService, _apiServiceModule, _appEventService) {
|
|
36
40
|
this.messageService = messageService;
|
|
37
41
|
this._settingsService = _settingsService;
|
|
38
42
|
this._buildFurnitureService = _buildFurnitureService;
|
|
@@ -48,7 +52,11 @@ export class NewRenderService {
|
|
|
48
52
|
this._floorService = _floorService;
|
|
49
53
|
this._loadFurnitureService = _loadFurnitureService;
|
|
50
54
|
this._utilsService = _utilsService;
|
|
55
|
+
this._presetService = _presetService;
|
|
56
|
+
this._apiServiceModule = _apiServiceModule;
|
|
57
|
+
this._appEventService = _appEventService;
|
|
51
58
|
this.renderImageChanged = new BehaviorSubject('');
|
|
59
|
+
this.blenderRenderStarted = new EventEmitter();
|
|
52
60
|
this.renderUpdateImageChanged = new BehaviorSubject(undefined);
|
|
53
61
|
this.renderRoomImageChanged = new BehaviorSubject('');
|
|
54
62
|
this.currentQueueRenderItem = new RenderQueueItem();
|
|
@@ -62,11 +70,21 @@ export class NewRenderService {
|
|
|
62
70
|
procesRenderFile(file) {
|
|
63
71
|
this.renderImageChanged.next(file);
|
|
64
72
|
}
|
|
65
|
-
forceRenderImage() {
|
|
66
|
-
this.
|
|
73
|
+
forceRenderImage(optionalRenderParameters) {
|
|
74
|
+
if (this._settingsService.settings.blendFilesRender) {
|
|
75
|
+
this._createRenderFromJson(true);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this._getNewRenderImage(true, optionalRenderParameters);
|
|
79
|
+
}
|
|
67
80
|
}
|
|
68
|
-
renderImage() {
|
|
69
|
-
this.
|
|
81
|
+
renderImage(optionalRenderParameters) {
|
|
82
|
+
if (this._settingsService.settings.blendFilesRender) {
|
|
83
|
+
this._createRenderFromJson();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this._getNewRenderImage(false, optionalRenderParameters);
|
|
87
|
+
}
|
|
70
88
|
}
|
|
71
89
|
renderRoom(size) {
|
|
72
90
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -80,6 +98,10 @@ export class NewRenderService {
|
|
|
80
98
|
}
|
|
81
99
|
});
|
|
82
100
|
}
|
|
101
|
+
getNewGlbFromServer() {
|
|
102
|
+
const data = this._getDataForRender();
|
|
103
|
+
this._handleAjaxGlb(data);
|
|
104
|
+
}
|
|
83
105
|
_exportToGlb() {
|
|
84
106
|
return __awaiter(this, void 0, void 0, function* () {
|
|
85
107
|
// The ground plane looks odd in renders.
|
|
@@ -121,32 +143,89 @@ export class NewRenderService {
|
|
|
121
143
|
}
|
|
122
144
|
});
|
|
123
145
|
}
|
|
124
|
-
_getNewRenderImage(force = false) {
|
|
146
|
+
_getNewRenderImage(force = false, optionalRenderParameters) {
|
|
125
147
|
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// this.messageService.emit(MessageType.ShowLoadingIndicator, {title: 'Rendering...'});
|
|
130
|
-
const renderInput = {
|
|
131
|
-
'height': 800,
|
|
132
|
-
'width': 1200,
|
|
133
|
-
'sceneAssetId': this._settingsService.settings.productRenderSceneAssetId
|
|
134
|
-
};
|
|
135
|
-
yield this._utilsService.prepRoomForRender(true, renderInput);
|
|
148
|
+
const data = this._getDataForRender(force, optionalRenderParameters);
|
|
149
|
+
if (this._settingsService.settings.options.useRenderWebsocket) {
|
|
150
|
+
this._handleWebSocketRender(data);
|
|
136
151
|
}
|
|
137
152
|
else {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
153
|
+
this._handleAjaxRender(data);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
_createRenderFromJson(force = false) {
|
|
158
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
if (this._settingsService.settings.blendFilesRender) {
|
|
160
|
+
const data = this._getDataForJsonRender(force);
|
|
161
|
+
yield this._apiServiceModule.getRenderFromJson(data);
|
|
145
162
|
}
|
|
146
163
|
});
|
|
147
164
|
}
|
|
165
|
+
_getDataForJsonRender(force) {
|
|
166
|
+
let multisceneRender = false;
|
|
167
|
+
const selections = this._ione.selections.map(s => Object.assign({}, s));
|
|
168
|
+
selections.forEach(s => {
|
|
169
|
+
s.imageData = undefined;
|
|
170
|
+
s.imageDataLastAnswer = undefined;
|
|
171
|
+
});
|
|
172
|
+
let configurable = false;
|
|
173
|
+
if (this._ione.decoNodes && this._ione.decoNodes.length !== 0) {
|
|
174
|
+
configurable = true;
|
|
175
|
+
}
|
|
176
|
+
const camera = this._apiServiceModule.getCameraProperties(this._cameraService.camera);
|
|
177
|
+
let position;
|
|
178
|
+
let rotation;
|
|
179
|
+
if (this._buildFurnitureService.currentCustomFloorGroup !== undefined) {
|
|
180
|
+
position = new Vector3(this._buildFurnitureService.currentCustomFloorGroup.position.x, 0, this._buildFurnitureService.currentCustomFloorGroup.position.z);
|
|
181
|
+
rotation = new Vector3(this._buildFurnitureService.currentCustomFloorGroup.rotation.x, this._buildFurnitureService.currentCustomFloorGroup.rotation.y, this._buildFurnitureService.currentCustomFloorGroup.rotation.z);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
position = new Vector3(0, 0, 0);
|
|
185
|
+
rotation = new Vector3(0, 0, 0);
|
|
186
|
+
}
|
|
187
|
+
const furniture = {
|
|
188
|
+
model_url: this._loadFurnitureService.article.assetUrl,
|
|
189
|
+
item_schema: this._loadFurnitureService.article.distSchema || 'UP_DBA',
|
|
190
|
+
item_assetPath: this._loadFurnitureService.article.contentDeliveryUrl,
|
|
191
|
+
item_identifier: this._loadFurnitureService.article.id,
|
|
192
|
+
configurable: configurable,
|
|
193
|
+
selections: selections,
|
|
194
|
+
decos: this._ione.decoNodes,
|
|
195
|
+
objectPosition: position,
|
|
196
|
+
objectRotation: rotation
|
|
197
|
+
};
|
|
198
|
+
if (this._settingsService.settings.productRenderSceneAssetId.toLowerCase().indexOf('multiscene') !== -1) {
|
|
199
|
+
multisceneRender = true;
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
action: 'prepareRenderRequest',
|
|
203
|
+
multisceneCompositing: multisceneRender,
|
|
204
|
+
furniture: [furniture],
|
|
205
|
+
camera: camera,
|
|
206
|
+
force: force
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// private async _handleAjaxBlenderRender(data: any): Promise<void> {
|
|
210
|
+
// const result = await axios({
|
|
211
|
+
// headers: {
|
|
212
|
+
// 'Content-Type': 'application/json'
|
|
213
|
+
// },
|
|
214
|
+
// method: 'POST',
|
|
215
|
+
// data: JSON.stringify(data),
|
|
216
|
+
// url: `${this._settingsService.settings.newRenderParameters.host}:${this._settingsService.settings.newRenderParameters.port}/getBlenderRenderFromData`,
|
|
217
|
+
// responseType: 'json'
|
|
218
|
+
// });
|
|
219
|
+
// if (result.status === 200) {
|
|
220
|
+
// // const image = `data:${result.data.fileType};base64,${result.data.image}`;
|
|
221
|
+
// // this._showPreviewImage(result.data.image);
|
|
222
|
+
// // console.log(image);
|
|
223
|
+
// this.renderImageChanged.next(result.data.image);
|
|
224
|
+
// }
|
|
225
|
+
// }
|
|
148
226
|
_handleAjaxRender(data) {
|
|
149
227
|
return __awaiter(this, void 0, void 0, function* () {
|
|
228
|
+
this.blenderRenderStarted.emit();
|
|
150
229
|
const result = yield axios({
|
|
151
230
|
headers: {
|
|
152
231
|
'Content-Type': 'application/json'
|
|
@@ -164,6 +243,25 @@ export class NewRenderService {
|
|
|
164
243
|
}
|
|
165
244
|
});
|
|
166
245
|
}
|
|
246
|
+
_handleAjaxGlb(data) {
|
|
247
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
+
const result = yield axios({
|
|
249
|
+
headers: {
|
|
250
|
+
'Content-Type': 'application/json'
|
|
251
|
+
},
|
|
252
|
+
method: 'POST',
|
|
253
|
+
data: JSON.stringify(data),
|
|
254
|
+
url: `${this._settingsService.settings.renderParameters.host}/getGlbFromData`,
|
|
255
|
+
responseType: 'json'
|
|
256
|
+
});
|
|
257
|
+
if (result.status === 200) {
|
|
258
|
+
// const image = `data:${result.data.fileType};base64,${result.data.image}`;
|
|
259
|
+
// this._showPreviewImage(result.data.image);
|
|
260
|
+
// console.log(image);
|
|
261
|
+
this._appEventService.glbCreated.next(result.data.url);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
167
265
|
_handleWebSocketRender(data) {
|
|
168
266
|
const webSocketConnection = this._settingsService.settings.renderParameters.websocket;
|
|
169
267
|
const webSocket = new WebSocket(webSocketConnection);
|
|
@@ -221,17 +319,31 @@ export class NewRenderService {
|
|
|
221
319
|
}
|
|
222
320
|
img.src = src;
|
|
223
321
|
}
|
|
224
|
-
_getDataForRender(force = false) {
|
|
322
|
+
_getDataForRender(force = false, optionalRenderParameters) {
|
|
323
|
+
const objectRotation = new Vector3(0, 0, 0);
|
|
324
|
+
if (optionalRenderParameters && optionalRenderParameters.objectRotation) {
|
|
325
|
+
objectRotation.x = optionalRenderParameters.objectRotation.x;
|
|
326
|
+
objectRotation.y = optionalRenderParameters.objectRotation.y;
|
|
327
|
+
objectRotation.z = optionalRenderParameters.objectRotation.z;
|
|
328
|
+
}
|
|
329
|
+
const blenderVector = new Vector3(objectRotation.x, -objectRotation.z, objectRotation.y);
|
|
330
|
+
let autoFrameMargin = 15;
|
|
331
|
+
if (optionalRenderParameters && optionalRenderParameters.margin) {
|
|
332
|
+
autoFrameMargin = optionalRenderParameters.margin;
|
|
333
|
+
}
|
|
225
334
|
this._cameraService.camera.updateMatrixWorld(true);
|
|
226
|
-
|
|
335
|
+
const dirtyCam = [1, 0, 0, 0, 0, 0.9778094194368627, -0.20949639438554873, 0, 0, 0.20949639438554873, 0.9778094194368627,
|
|
336
|
+
0, 0, 1.025180918990023, 2.8709751177021667, 1];
|
|
337
|
+
const sceneSettings = this._getSceneRenderSettings(this._settingsService.settings.productRenderSceneAssetId);
|
|
227
338
|
const options = {
|
|
228
|
-
width: this.
|
|
229
|
-
height: this.
|
|
230
|
-
sceneSettings:
|
|
339
|
+
width: this._getRenderWidth(),
|
|
340
|
+
height: this._getRenderHeight(),
|
|
341
|
+
sceneSettings: sceneSettings,
|
|
342
|
+
transparency: this._useTransparency(sceneSettings),
|
|
231
343
|
// max_samples: this._settingsService.settings.renderParameters.iterations,
|
|
232
344
|
cameraOptions: {
|
|
233
345
|
fov: this._cameraService.camera.fov,
|
|
234
|
-
matrix: Array.from(this._cameraService.camera.matrixWorld.elements)
|
|
346
|
+
matrix: dirtyCam, // this.standAloneCameraFixedMatrix, //Array.from(this._cameraService.camera.matrixWorld.elements)
|
|
235
347
|
},
|
|
236
348
|
environmentOptions: {
|
|
237
349
|
hdri: this._settingsService.settings.renderParameters.hdri,
|
|
@@ -248,7 +360,9 @@ export class NewRenderService {
|
|
|
248
360
|
y: this._buildFurnitureService.currentCustomFloorGroup.rotation.y,
|
|
249
361
|
z: this._buildFurnitureService.currentCustomFloorGroup.rotation.z
|
|
250
362
|
}
|
|
251
|
-
}
|
|
363
|
+
},
|
|
364
|
+
autoFrameMargin: autoFrameMargin,
|
|
365
|
+
objectRenderTransform: blenderVector
|
|
252
366
|
};
|
|
253
367
|
const selections = this._ione.selections.map(s => Object.assign({}, s));
|
|
254
368
|
selections.forEach(s => {
|
|
@@ -265,19 +379,53 @@ export class NewRenderService {
|
|
|
265
379
|
};
|
|
266
380
|
return data;
|
|
267
381
|
}
|
|
268
|
-
_getSceneRenderSettings() {
|
|
382
|
+
_getSceneRenderSettings(assetId) {
|
|
383
|
+
// Get the asset information from the BlenderRenderSettings
|
|
384
|
+
let renderScenes = [];
|
|
385
|
+
if (this._settingsService.settings.blenderSceneSettings && this._settingsService.settings.blenderSceneSettings.scenes) {
|
|
386
|
+
renderScenes = this._settingsService.settings.blenderSceneSettings.scenes.filter(scene => scene.sceneType === BlenderSceneType.Product
|
|
387
|
+
&& scene.name === assetId);
|
|
388
|
+
}
|
|
389
|
+
let renderScene;
|
|
390
|
+
// this should be a length of 1, so if it's > 0, we can safely take the first one
|
|
391
|
+
if (renderScenes.length > 0) {
|
|
392
|
+
renderScene = renderScenes[0];
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// fallback scene
|
|
396
|
+
const fallback = new BlenderSceneSetting();
|
|
397
|
+
fallback.name = 'cycles_scene_studio';
|
|
398
|
+
fallback.multiSceneRender = false;
|
|
399
|
+
fallback.primarySceneName = 'cycles_scene_studio';
|
|
400
|
+
fallback.hdriIntensity = 1;
|
|
401
|
+
fallback.hdriRotation = 0;
|
|
402
|
+
fallback.lightingExposure = 1;
|
|
403
|
+
fallback.sceneType = BlenderSceneType.Product;
|
|
404
|
+
renderScene = fallback;
|
|
405
|
+
}
|
|
406
|
+
let scenes = [];
|
|
407
|
+
// Primary scene
|
|
269
408
|
const compositeScene = new SceneSettings();
|
|
270
|
-
compositeScene.sceneAssetId =
|
|
409
|
+
compositeScene.sceneAssetId = renderScene.primarySceneName;
|
|
271
410
|
compositeScene.activeCameraId = 1;
|
|
272
411
|
compositeScene.default = true;
|
|
412
|
+
compositeScene.hdriRotation = this._apiServiceModule.degreesToVector3(renderScene.hdriRotation);
|
|
413
|
+
compositeScene.hdriIntensity = renderScene.hdriIntensity;
|
|
273
414
|
compositeScene.id = 600;
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
415
|
+
if (renderScene.multiSceneRender) {
|
|
416
|
+
const additionalScene = new SceneSettings();
|
|
417
|
+
additionalScene.sceneAssetId = renderScene.secondarySceneName;
|
|
418
|
+
additionalScene.activeCameraId = 1;
|
|
419
|
+
additionalScene.default = false;
|
|
420
|
+
additionalScene.hdriRotation = this._apiServiceModule.degreesToVector3(renderScene.hdriRotation);
|
|
421
|
+
additionalScene.hdriIntensity = renderScene.hdriIntensity;
|
|
422
|
+
additionalScene.id = 601;
|
|
423
|
+
scenes = [compositeScene, additionalScene];
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
scenes = [compositeScene];
|
|
427
|
+
}
|
|
428
|
+
return scenes;
|
|
281
429
|
}
|
|
282
430
|
_getDataForRoomRender(size) {
|
|
283
431
|
this._cameraService.camera.updateMatrixWorld(true);
|
|
@@ -311,10 +459,30 @@ export class NewRenderService {
|
|
|
311
459
|
}
|
|
312
460
|
return window.btoa(binary);
|
|
313
461
|
}
|
|
462
|
+
_getRenderWidth() {
|
|
463
|
+
if (this._settingsService.settings.renderParameters.imageWidth === 0 || this._settingsService.settings.renderParameters.imageWidth === null) {
|
|
464
|
+
return this.clientWidth;
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
return this._settingsService.settings.renderParameters.imageWidth;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
_getRenderHeight() {
|
|
471
|
+
if (this._settingsService.settings.renderParameters.imageHeight === 0 || this._settingsService.settings.renderParameters.imageHeight === null) {
|
|
472
|
+
return this.clientHeight;
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
return this._settingsService.settings.renderParameters.imageHeight;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
_useTransparency(sceneSettings) {
|
|
479
|
+
// ONLY when we are using multiscene compositing, we need to use transparency
|
|
480
|
+
return sceneSettings.length > 1;
|
|
481
|
+
}
|
|
314
482
|
}
|
|
315
|
-
NewRenderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService, deps: [{ token: i1.MessageBusService }, { token: i2.HomedecoratorSettingsService }, { token: i3.BuildFurnitureService }, { token: i4.CameraService }, { token: i5.SceneService }, { token: i6.HomedecoratorConnectorService }, { token: i7.HomedecoratorConnectorAdapterService }, { token: i8.ThreedselectorService }, { token: i9.ToastService }, { token: i1.MessageBusService }, { token: i10.GoogleTagManagerService }, { token: i11.RoomService }, { token: i12.FloorService }, { token: i13.LoadFurnitureService }, { token: i14.UtilsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
483
|
+
NewRenderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService, deps: [{ token: i1.MessageBusService }, { token: i2.HomedecoratorSettingsService }, { token: i3.BuildFurnitureService }, { token: i4.CameraService }, { token: i5.SceneService }, { token: i6.HomedecoratorConnectorService }, { token: i7.HomedecoratorConnectorAdapterService }, { token: i8.ThreedselectorService }, { token: i9.ToastService }, { token: i1.MessageBusService }, { token: i10.GoogleTagManagerService }, { token: i11.RoomService }, { token: i12.FloorService }, { token: i13.LoadFurnitureService }, { token: i14.UtilsService }, { token: i15.PresetsService }, { token: i16.ApiServiceModule }, { token: i17.HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
316
484
|
NewRenderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService });
|
|
317
485
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NewRenderService, decorators: [{
|
|
318
486
|
type: Injectable
|
|
319
|
-
}], ctorParameters: function () { return [{ type: i1.MessageBusService }, { type: i2.HomedecoratorSettingsService }, { type: i3.BuildFurnitureService }, { type: i4.CameraService }, { type: i5.SceneService }, { type: i6.HomedecoratorConnectorService }, { type: i7.HomedecoratorConnectorAdapterService }, { type: i8.ThreedselectorService }, { type: i9.ToastService }, { type: i1.MessageBusService }, { type: i10.GoogleTagManagerService }, { type: i11.RoomService }, { type: i12.FloorService }, { type: i13.LoadFurnitureService }, { type: i14.UtilsService }]; } });
|
|
320
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9yZW5kZXIvc2VydmljZS9uZXctcmVuZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLGVBQWUsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUVuRCxPQUFPLEVBQUMsS0FBSyxFQUFXLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFjM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHNUQsTUFBTSxPQUFPLGdCQUFnQjtJQVkzQixZQUNTLGNBQWlDLEVBQ2hDLGdCQUE4QyxFQUM5QyxzQkFBNkMsRUFDN0MsY0FBNkIsRUFDN0IsYUFBMkIsRUFDM0IsS0FBb0MsRUFDcEMscUJBQTJELEVBQzNELHNCQUE2QyxFQUM3QyxhQUEyQixFQUMzQixrQkFBcUMsRUFDckMsaUJBQTBDLEVBQzFDLFlBQXlCLEVBQ3pCLGFBQTJCLEVBQzNCLHFCQUEyQyxFQUMzQyxhQUEyQjtRQWQ1QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE4QjtRQUM5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxD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UUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUk7Z0JBQzFELGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7YUFDN0U7U0FDRixDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUc7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTO1lBQ2xELE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGVBQWU7WUFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUM3QyxPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBbUI7UUFDOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDOzs4R0F4U1UsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlL3NyYy9zY2VuZXMvU2NlbmUnO1xyXG5pbXBvcnQge0xpZ2h0LCBPYmplY3QzRH0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0dMVEZFeHBvcnRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXInO1xyXG5pbXBvcnQge1JlbmRlclF1ZXVlSXRlbX0gZnJvbSAnLi4vbW9kZWwvcmVuZGVyLXF1ZXVlLWl0ZW0nO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0J1aWxkRnVybml0dXJlU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS9idWlsZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RocmVlZHNlbGVjdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS90aHJlZWRzZWxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtUb2FzdFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS90b2FzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2dvb2dsZS10YWctbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtSb29tU2VydmljZX0gZnJvbSAnLi4vLi4vcm9vbS1wbGFubmVyL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2Uvcm9vbS5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2Zsb29yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRGdXJuaXR1cmVTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci9zZXJ2aWNlL2xvYWQtZnVybml0dXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1JlbmRlclN0YXR1c30gZnJvbSAnLi4vZW51bS9yZW5kZXItc3RhdHVzJztcclxuaW1wb3J0IHtVdGlsc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtTY2VuZVNldHRpbmdzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvM2RtLWFwaSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZXdSZW5kZXJTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgcHVibGljIHJlbmRlckltYWdlQ2hhbmdlZDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcclxuICBwdWJsaWMgcmVuZGVyVXBkYXRlSW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8eyBpbWFnZTogc3RyaW5nLCBwcm9ncmVzczogbnVtYmVyLCBmaW5pc2hlZDogYm9vbGVhbiB9PiA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcclxuICBwdWJsaWMgcmVuZGVyUm9vbUltYWdlQ2hhbmdlZDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcclxuXHJcbiAgcHVibGljIHN0YW5kQWxvbmVDYW1lcmFNYXRyaXg6IG51bWJlcltdO1xyXG4gIHB1YmxpYyBjdXJyZW50UXVldWVSZW5kZXJJdGVtOiBSZW5kZXJRdWV1ZUl0ZW0gPSBuZXcgUmVuZGVyUXVldWVJdGVtKCk7XHJcbiAgcHVibGljIHJlbmRlcmVkUm9vbUltYWdlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYnVpbGRGdXJuaXR1cmVTZXJ2aWNlOiBCdWlsZEZ1cm5pdHVyZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jYW1lcmFTZXJ2aWNlOiBDYW1lcmFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2NlbmVTZXJ2aWNlOiBTY2VuZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pb25lOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2lvbmVDb25uZWN0b3JBZGFwdGVyOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aHJlZWRTZWxlY3RvclNlcnZpY2U6IFRocmVlZHNlbGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1c1NlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZ29vZ2xlVGFnTWFuYWdlcjogR29vZ2xlVGFnTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xvYWRGdXJuaXR1cmVTZXJ2aWNlOiBMb2FkRnVybml0dXJlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3V0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkJsZW5kZXJSZW5kZXJGaWxlUmVhZHksIChmaWxlKSA9PiB0aGlzLnByb2Nlc1JlbmRlckZpbGUoZmlsZSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByb2Nlc1JlbmRlckZpbGUoZmlsZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcmNlUmVuZGVySW1hZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9nZXROZXdSZW5kZXJJbWFnZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXJJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2dldE5ld1JlbmRlckltYWdlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVuZGVyUm9vbShzaXplOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNjZW5lRGF0YTogYW55ID0gYXdhaXQgdGhpcy5fZXhwb3J0VG9HbGIoKTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUm9vbVJlbmRlcihzaXplKTtcclxuICAgIGRhdGEuZmlsZXMgPSB7XHJcbiAgICAgIGdsYkRhdGE6IHRoaXMuX2FycmF5QnVmZmVyVG9CYXNlNjQoc2NlbmVEYXRhKVxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy51c2VSZW5kZXJXZWJzb2NrZXQpIHtcclxuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0Um9vbVJlbmRlcihkYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2V4cG9ydFRvR2xiKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAvLyBUaGUgZ3JvdW5kIHBsYW5lIGxvb2tzIG9kZCBpbiByZW5kZXJzLlxyXG4gICAgLy8gVGhlIGh1ZC1yaW5nIGFuZCBodWQtY2lyY2xlIGFyZSB0aGUgd2Fsa3Rocm91Z2ggbW9kZSBtYXJrZXIsXHJcbiAgICAvLyB3aGljaCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICBjb25zdCBlbGVtZW50c1RvUmVtb3ZlID0gWydncm91bmQtcGxhbmUnLCAnaHVkLXJpbmcnLCAnaHVkLWNpcmNsZSddO1xyXG5cclxuICAgIGxldCBzY2VuZTogU2NlbmU7XHJcbiAgICB0cnkge1xyXG4gICAgICBzY2VuZSA9IHRoaXMuX3NjZW5lU2VydmljZS5zY2VuZS5jbG9uZSgpO1xyXG5cclxuICAgICAgc2NlbmUuY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcclxuICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIExpZ2h0KSB7XHJcbiAgICAgICAgICBzY2VuZS5yZW1vdmUoYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGVsZW1lbnRzVG9SZW1vdmUuZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPYmplY3Q6IE9iamVjdDNEID0gc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgICAgICBzY2VuZS5yZW1vdmUoc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICB0cnM6IGZhbHNlLFxyXG4gICAgICAgIG9ubHlWaXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRydW5jYXRlRHJhd1JhbmdlOiB0cnVlLFxyXG4gICAgICAgIGJpbmFyeTogdHJ1ZSxcclxuICAgICAgICBmb3JjZUluZGljZXM6IGZhbHNlLFxyXG4gICAgICAgIGZvcmNlUG93ZXJPZlR3b1RleHR1cmVzOiBmYWxzZSxcclxuICAgICAgICAvLyBtYXhUZXh0dXJlU2l6ZTogNTAwLFxyXG4gICAgICAgIGVtYmVkSW1hZ2VzOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgZXhwb3J0ZXI6IEdMVEZFeHBvcnRlciA9IG5ldyBHTFRGRXhwb3J0ZXIoKTtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICAgIGV4cG9ydGVyLnBhcnNlKHNjZW5lLCBhc3luYyAoZXhwb3J0ZWRTY2VuZTogQXJyYXlCdWZmZXIpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoZXhwb3J0ZWRTY2VuZSk7XHJcbiAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhyb3cgKGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TmV3UmVuZGVySW1hZ2UoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5ibGVuZEZpbGVzUmVuZGVyKSB7XHJcbiAgICAgIC8vIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUmVuZGVyKGZvcmNlKTtcclxuICAgICAgLy8gdGhpcy5faGFuZGxlQWpheEJsZW5kZXJSZW5kZXIoZGF0YSk7XHJcbiAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TaG93TG9hZGluZ0luZGljYXRvciwge3RpdGxlOiAnUmVuZGVyaW5nLi4uJ30pO1xyXG4gICAgICBjb25zdCByZW5kZXJJbnB1dCA9IHtcclxuICAgICAgICAnaGVpZ2h0JzogODAwLFxyXG4gICAgICAgICd3aWR0aCc6IDEyMDAsXHJcbiAgICAgICAgJ3NjZW5lQXNzZXRJZCc6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5wcm9kdWN0UmVuZGVyU2NlbmVBc3NldElkXHJcbiAgICAgIH07XHJcbiAgICAgIGF3YWl0IHRoaXMuX3V0aWxzU2VydmljZS5wcmVwUm9vbUZvclJlbmRlcih0cnVlLCByZW5kZXJJbnB1dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5fZ2V0RGF0YUZvclJlbmRlcihmb3JjZSk7XHJcbiAgICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy51c2VSZW5kZXJXZWJzb2NrZXQpIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRSZW5kZXIoZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlQWpheFJlbmRlcihkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlQWpheFJlbmRlcihkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zKHtcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgICAgfSxcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB1cmw6IGAke3RoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhvc3R9L2dldEJsZW5kZXJSZW5kZXJGcm9tRGF0YWAsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nXHJcbiAgICB9KTtcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgLy8gY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5kYXRhLmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuZGF0YS5pbWFnZX1gO1xyXG4gICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coaW1hZ2UpO1xyXG4gICAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZVdlYlNvY2tldFJlbmRlcihkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdlYlNvY2tldENvbm5lY3Rpb246IHN0cmluZyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLndlYnNvY2tldDtcclxuICAgIGNvbnN0IHdlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQod2ViU29ja2V0Q29ubmVjdGlvbik7XHJcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICB3ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9O1xyXG4gICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5maWxlVHlwZX07YmFzZTY0LCR7cmVzdWx0LmltYWdlfWA7XHJcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSByZXN1bHQucmVuZGVyZWQ7XHJcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSByZXN1bHQuZmluaXNoZWQ7XHJcbiAgICAgICAgLy8gdGhpcy5fc2hvd1ByZXZpZXdJbWFnZShpbWFnZSk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0LnJlbmRlcmVkKTtcclxuICAgICAgICB0aGlzLnJlbmRlclVwZGF0ZUltYWdlQ2hhbmdlZC5uZXh0KHtpbWFnZTogaW1hZ2UsIHByb2dyZXNzOiBwcm9ncmVzcywgZmluaXNoZWQ6IGZpbmlzaGVkfSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maW5pc2hlZCkge1xyXG4gICAgICAgICAgd2ViU29ja2V0LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlV2ViU29ja2V0Um9vbVJlbmRlcihkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdlYlNvY2tldENvbm5lY3Rpb246IHN0cmluZyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLndlYnNvY2tldDtcclxuICAgIGNvbnN0IHdlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQod2ViU29ja2V0Q29ubmVjdGlvbik7XHJcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICB3ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9O1xyXG4gICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5maWxlVHlwZX07YmFzZTY0LCR7cmVzdWx0LmltYWdlfWA7XHJcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSByZXN1bHQucmVuZGVyZWQ7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UXVldWVSZW5kZXJJdGVtLnJlbmRlclByb2dyZXNzID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJSb29tSW1hZ2VDaGFuZ2VkLm5leHQoaW1hZ2UpO1xyXG4gICAgICAgIGlmIChyZXN1bHQuZmluaXNoZWQpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyZWRSb29tSW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50UXVldWVSZW5kZXJJdGVtLnJlbmRlclN0YXR1cyA9IFJlbmRlclN0YXR1cy5Jc1N1Y2Nlc3M7XHJcbiAgICAgICAgICB3ZWJTb2NrZXQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93UHJldmlld0ltYWdlKHNyYzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgaW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXdfaW1nJyk7XHJcbiAgICBpZiAoIWltZykge1xyXG4gICAgICBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgaW1nLmlkID0gJ3ByZXZpZXdfaW1nJztcclxuICAgICAgZG9jdW1lbnQuYm9keS5wcmVwZW5kKGltZyk7XHJcbiAgICAgIGltZy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgIGltZy5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgIGltZy5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAvLyBpbWcuc3R5bGUud2lkdGggPSAnODAwcHgnO1xyXG4gICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gJzYwMHB4JztcclxuICAgICAgaW1nLnN0eWxlLnpJbmRleCA9ICcxMCc7XHJcbiAgICB9XHJcbiAgICAoaW1nIGFzIGFueSkuc3JjID0gc3JjO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0RGF0YUZvclJlbmRlcihmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgLy8gVE9ETyBjaGFuZ2UgdGhlIGhhcmRjb2RlZCB2YWx1ZXMgaHR0cHM6Ly9jb2xpam4taXQuYXRsYXNzaWFuLm5ldC9icm93c2UvSU9ORS0zOTM0N1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgd2lkdGg6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlV2lkdGgsXHJcbiAgICAgIGhlaWdodDogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaW1hZ2VIZWlnaHQsXHJcbiAgICAgIHNjZW5lU2V0dGluZ3M6IHRoaXMuX2dldFNjZW5lUmVuZGVyU2V0dGluZ3MoKSxcclxuICAgICAgLy8gbWF4X3NhbXBsZXM6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLml0ZXJhdGlvbnMsXHJcbiAgICAgIGNhbWVyYU9wdGlvbnM6IHtcclxuICAgICAgICBmb3Y6IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmZvdixcclxuICAgICAgICBtYXRyaXg6IEFycmF5LmZyb20odGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEubWF0cml4V29ybGQuZWxlbWVudHMpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVudmlyb25tZW50T3B0aW9uczoge1xyXG4gICAgICAgIGhkcmk6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhkcmksXHJcbiAgICAgICAgaGRyaUludGVuc2l0eTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaGRyaUludGVuc2l0eVxyXG4gICAgICB9LFxyXG4gICAgICBvYmplY3RPcHRpb25zOiB7XHJcbiAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgIHg6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgeTogMCxcclxuICAgICAgICAgIHo6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5wb3NpdGlvbi56XHJcbiAgICAgICAgfSxcclxuICAgICAgICByb3RhdGlvbjoge1xyXG4gICAgICAgICAgeDogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnJvdGF0aW9uLngsXHJcbiAgICAgICAgICB5OiB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEN1c3RvbUZsb29yR3JvdXAucm90YXRpb24ueSxcclxuICAgICAgICAgIHo6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi56XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuX2lvbmUuc2VsZWN0aW9ucy5tYXAocyA9PiBPYmplY3QuYXNzaWduKHt9LCBzKSk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIHNlbGVjdGlvbnM6IHNlbGVjdGlvbnMsXHJcbiAgICAgIGRlY29zOiB0aGlzLl9pb25lLmRlY29Ob2RlcyxcclxuICAgICAgYXNzZXRVcmw6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuYXNzZXRVcmwsXHJcbiAgICAgIGNkblVybDogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5kaXN0U2NoZW1hIHx8ICdVUF9EQkEnLFxyXG4gICAgICBvcHRpb25zOiBvcHRpb25zXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRTY2VuZVJlbmRlclNldHRpbmdzKCk6IFNjZW5lU2V0dGluZ3NbXSB7XHJcbiAgICBjb25zdCBjb21wb3NpdGVTY2VuZTogU2NlbmVTZXR0aW5ncyA9IG5ldyBTY2VuZVNldHRpbmdzKCk7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5zY2VuZUFzc2V0SWQgPSAnc2NlbmVfc3R1ZGlvX3JlZmxlY3RpdmVfZWV2ZWUnO1xyXG4gICAgY29tcG9zaXRlU2NlbmUuYWN0aXZlQ2FtZXJhSWQgPSAxO1xyXG4gICAgY29tcG9zaXRlU2NlbmUuZGVmYXVsdCA9IHRydWU7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5pZCA9IDYwMDtcclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBhZGRpdGlvbmFsU2NlbmU6IFNjZW5lU2V0dGluZ3MgPSBuZXcgU2NlbmVTZXR0aW5ncygpO1xyXG4gICAgLy8gYWRkaXRpb25hbFNjZW5lLnNjZW5lQXNzZXRJZCA9ICdTY2VuZV9Hcm91bmQnO1xyXG4gICAgLy8gYWRkaXRpb25hbFNjZW5lLmFjdGl2ZUNhbWVyYUlkID0gMTtcclxuICAgIC8vIGFkZGl0aW9uYWxTY2VuZS5kZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAvLyBhZGRpdGlvbmFsU2NlbmUuaWQgPSA2MDE7XHJcblxyXG4gICAgcmV0dXJuIFtjb21wb3NpdGVTY2VuZS8qLCBhZGRpdGlvbmFsU2NlbmUqL107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXREYXRhRm9yUm9vbVJlbmRlcihzaXplOiBhbnkpOiBhbnkge1xyXG4gICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICB3aWR0aDogc2l6ZS53aWR0aCxcclxuICAgICAgaGVpZ2h0OiBzaXplLmhlaWdodCxcclxuICAgICAgbWF4X3NhbXBsZXM6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLml0ZXJhdGlvbnMsXHJcbiAgICAgIGNhbWVyYU9wdGlvbnM6IHtcclxuICAgICAgICBmb3Y6IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmZvdixcclxuICAgICAgICBtYXRyaXg6IEFycmF5LmZyb20odGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmVsZW1lbnRzKVxyXG4gICAgICB9LFxyXG4gICAgICBlbnZpcm9ubWVudE9wdGlvbnM6IHtcclxuICAgICAgICBoZHJpOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5oZHJpLFxyXG4gICAgICAgIGhkcmlJbnRlbnNpdHk6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhkcmlJbnRlbnNpdHlcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIGFzc2V0VXJsOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoLFxyXG4gICAgICBjZG5Vcmw6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy50aHJlZURBc3NldFBhdGgsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNjaGVtYSxcclxuICAgICAgb3B0aW9uczogb3B0aW9uc1xyXG4gICAgfTtcclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBiaW5hcnkgPSAnJztcclxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcclxuICAgIH1cclxuICAgIHJldHVybiB3aW5kb3cuYnRvYShiaW5hcnkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
487
|
+
}], ctorParameters: function () { return [{ type: i1.MessageBusService }, { type: i2.HomedecoratorSettingsService }, { type: i3.BuildFurnitureService }, { type: i4.CameraService }, { type: i5.SceneService }, { type: i6.HomedecoratorConnectorService }, { type: i7.HomedecoratorConnectorAdapterService }, { type: i8.ThreedselectorService }, { type: i9.ToastService }, { type: i1.MessageBusService }, { type: i10.GoogleTagManagerService }, { type: i11.RoomService }, { type: i12.FloorService }, { type: i13.LoadFurnitureService }, { type: i14.UtilsService }, { type: i15.PresetsService }, { type: i16.ApiServiceModule }, { type: i17.HomedecoratorAppEventService }]; } });
|
|
488
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9yZW5kZXIvc2VydmljZS9uZXctcmVuZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxlQUFlLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFDLEtBQUssRUFBWSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDL0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQWMzRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBbUIsYUFBYSxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFHOUUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGdCQUFnQixFQUFDLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHdEYsTUFBTSxPQUFPLGdCQUFnQjtJQXFCM0IsWUFDUyxjQUFpQyxFQUNoQyxnQkFBOEMsRUFDOUMsc0JBQTZDLEVBQzdDLGNBQTZCLEVBQzdCLGFBQTJCLEVBQzNCLEtBQW9DLEVBQ3BDLHFCQUEyRCxFQUMzRCxzQkFBNkMsRUFDN0MsYUFBMkIsRUFDM0Isa0JBQXFDLEVBQ3JDLGlCQUEwQyxFQUMxQyxZQUF5QixFQUN6QixhQUEyQixFQUMzQixxQkFBMkMsRUFDM0MsYUFBMkIsRUFDM0IsY0FBOEIsRUFDOUIsaUJBQW1DLEVBQ25DLGdC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SSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtZQUM3SSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsYUFBOEI7UUFDckQsNkVBQTZFO1FBQzdFLE9BQU8sYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7OEdBdmVVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlL3NyYy9zY2VuZXMvU2NlbmUnO1xyXG5pbXBvcnQge0xpZ2h0LCBPYmplY3QzRCwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0dMVEZFeHBvcnRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9HTFRGRXhwb3J0ZXInO1xyXG5pbXBvcnQge1JlbmRlclF1ZXVlSXRlbX0gZnJvbSAnLi4vbW9kZWwvcmVuZGVyLXF1ZXVlLWl0ZW0nO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0J1aWxkRnVybml0dXJlU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS9idWlsZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1RocmVlZHNlbGVjdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdGhyZWVkc2VsZWN0b3IvdGhyZWVkc2VsZWN0b3Ivc2VydmljZS90aHJlZWRzZWxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtUb2FzdFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS90b2FzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2dvb2dsZS10YWctbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtSb29tU2VydmljZX0gZnJvbSAnLi4vLi4vcm9vbS1wbGFubmVyL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2Uvcm9vbS5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2Zsb29yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRGdXJuaXR1cmVTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci9zZXJ2aWNlL2xvYWQtZnVybml0dXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1JlbmRlclN0YXR1c30gZnJvbSAnLi4vZW51bS9yZW5kZXItc3RhdHVzJztcclxuaW1wb3J0IHtVdGlsc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtBcGlTZXJ2aWNlTW9kdWxlLCBTY2VuZVNldHRpbmdzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvM2RtLWFwaSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWFwcC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtCbGVuZGVyU2NlbmVTZXR0aW5nLCBCbGVuZGVyU2NlbmVUeXBlfSBmcm9tICcuLi9tb2RlbC9ibGVuZGVyLXNjZW5lLXNldHRpbmdzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5ld1JlbmRlclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBwdWJsaWMgcmVuZGVySW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xyXG4gIHB1YmxpYyBibGVuZGVyUmVuZGVyU3RhcnRlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBwdWJsaWMgcmVuZGVyVXBkYXRlSW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8e1xyXG4gICAgaW1hZ2U6IHN0cmluZyxcclxuICAgIHByb2dyZXNzOiBudW1iZXIsXHJcbiAgICBmaW5pc2hlZDogYm9vbGVhblxyXG4gIH0+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xyXG4gIHB1YmxpYyByZW5kZXJSb29tSW1hZ2VDaGFuZ2VkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xyXG5cclxuICBwdWJsaWMgc3RhbmRBbG9uZUNhbWVyYU1hdHJpeDogbnVtYmVyW107XHJcbiAgcHVibGljIHN0YW5kQWxvbmVDYW1lcmFGaXhlZE1hdHJpeDogbnVtYmVyW107XHJcbiAgcHVibGljIGN1cnJlbnRRdWV1ZVJlbmRlckl0ZW06IFJlbmRlclF1ZXVlSXRlbSA9IG5ldyBSZW5kZXJRdWV1ZUl0ZW0oKTtcclxuICBwdWJsaWMgcmVuZGVyZWRSb29tSW1hZ2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgY2xpZW50V2lkdGg6IG51bWJlcjtcclxuICBwdWJsaWMgY2xpZW50SGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2J1aWxkRnVybml0dXJlU2VydmljZTogQnVpbGRGdXJuaXR1cmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU2VydmljZTogQ2FtZXJhU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW9uZTogSG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pb25lQ29ubmVjdG9yQWRhcHRlcjogSG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdGhyZWVkU2VsZWN0b3JTZXJ2aWNlOiBUaHJlZWRzZWxlY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCdXNTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2dvb2dsZVRhZ01hbmFnZXI6IEdvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcm9vbVNlcnZpY2U6IFJvb21TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZmxvb3JTZXJ2aWNlOiBGbG9vclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9sb2FkRnVybml0dXJlU2VydmljZTogTG9hZEZ1cm5pdHVyZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF91dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByZXNldFNlcnZpY2U6IFByZXNldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXBpU2VydmljZU1vZHVsZTogQXBpU2VydmljZU1vZHVsZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuQmxlbmRlclJlbmRlckZpbGVSZWFkeSwgKGZpbGUpID0+IHRoaXMucHJvY2VzUmVuZGVyRmlsZShmaWxlKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuX3N1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJvY2VzUmVuZGVyRmlsZShmaWxlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVySW1hZ2VDaGFuZ2VkLm5leHQoZmlsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9yY2VSZW5kZXJJbWFnZShvcHRpb25hbFJlbmRlclBhcmFtZXRlcnM/OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYmxlbmRGaWxlc1JlbmRlcikge1xyXG4gICAgICB0aGlzLl9jcmVhdGVSZW5kZXJGcm9tSnNvbih0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2dldE5ld1JlbmRlckltYWdlKHRydWUsIG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVySW1hZ2Uob3B0aW9uYWxSZW5kZXJQYXJhbWV0ZXJzPzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmJsZW5kRmlsZXNSZW5kZXIpIHtcclxuICAgICAgdGhpcy5fY3JlYXRlUmVuZGVyRnJvbUpzb24oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2dldE5ld1JlbmRlckltYWdlKGZhbHNlLCBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHJlbmRlclJvb20oc2l6ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzY2VuZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuX2V4cG9ydFRvR2xiKCk7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZ2V0RGF0YUZvclJvb21SZW5kZXIoc2l6ZSk7XHJcbiAgICBkYXRhLmZpbGVzID0ge1xyXG4gICAgICBnbGJEYXRhOiB0aGlzLl9hcnJheUJ1ZmZlclRvQmFzZTY0KHNjZW5lRGF0YSlcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlUmVuZGVyV2Vic29ja2V0KSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldFJvb21SZW5kZXIoZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmV3R2xiRnJvbVNlcnZlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUmVuZGVyKCk7XHJcbiAgICB0aGlzLl9oYW5kbGVBamF4R2xiKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZXhwb3J0VG9HbGIoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIFRoZSBncm91bmQgcGxhbmUgbG9va3Mgb2RkIGluIHJlbmRlcnMuXHJcbiAgICAvLyBUaGUgaHVkLXJpbmcgYW5kIGh1ZC1jaXJjbGUgYXJlIHRoZSB3YWxrdGhyb3VnaCBtb2RlIG1hcmtlcixcclxuICAgIC8vIHdoaWNoIGlzIG5vdCBzdXBwb3NlZCB0byBiZSByZW5kZXJlZC5cclxuICAgIGNvbnN0IGVsZW1lbnRzVG9SZW1vdmUgPSBbJ2dyb3VuZC1wbGFuZScsICdodWQtcmluZycsICdodWQtY2lyY2xlJ107XHJcblxyXG4gICAgbGV0IHNjZW5lOiBTY2VuZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHNjZW5lID0gdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lLmNsb25lKCk7XHJcblxyXG4gICAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICAgIHNjZW5lLnJlbW92ZShjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZWxlbWVudHNUb1JlbW92ZS5mb3JFYWNoKGVsZW1lbnROYW1lID0+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZE9iamVjdDogT2JqZWN0M0QgPSBzY2VuZS5nZXRPYmplY3RCeU5hbWUoZWxlbWVudE5hbWUpO1xyXG4gICAgICAgIHNjZW5lLnJlbW92ZShzZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgIHRyczogZmFsc2UsXHJcbiAgICAgICAgb25seVZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdHJ1bmNhdGVEcmF3UmFuZ2U6IHRydWUsXHJcbiAgICAgICAgYmluYXJ5OiB0cnVlLFxyXG4gICAgICAgIGZvcmNlSW5kaWNlczogZmFsc2UsXHJcbiAgICAgICAgZm9yY2VQb3dlck9mVHdvVGV4dHVyZXM6IGZhbHNlLFxyXG4gICAgICAgIC8vIG1heFRleHR1cmVTaXplOiA1MDAsXHJcbiAgICAgICAgZW1iZWRJbWFnZXM6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBleHBvcnRlcjogR0xURkV4cG9ydGVyID0gbmV3IEdMVEZFeHBvcnRlcigpO1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgICAgZXhwb3J0ZXIucGFyc2Uoc2NlbmUsIGFzeW5jIChleHBvcnRlZFNjZW5lOiBBcnJheUJ1ZmZlcikgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShleHBvcnRlZFNjZW5lKTtcclxuICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgfSwgb3B0aW9ucyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aHJvdyAoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9nZXROZXdSZW5kZXJJbWFnZShmb3JjZTogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9yUmVuZGVyKGZvcmNlLCBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMpO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVJlbmRlcldlYnNvY2tldCkge1xyXG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRSZW5kZXIoZGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9oYW5kbGVBamF4UmVuZGVyKGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlUmVuZGVyRnJvbUpzb24oZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5ibGVuZEZpbGVzUmVuZGVyKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXREYXRhRm9ySnNvblJlbmRlcihmb3JjZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2FwaVNlcnZpY2VNb2R1bGUuZ2V0UmVuZGVyRnJvbUpzb24oZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0RGF0YUZvckpzb25SZW5kZXIoZm9yY2U6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgbGV0IG11bHRpc2NlbmVSZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLl9pb25lLnNlbGVjdGlvbnMubWFwKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcykpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICBzLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgcy5pbWFnZURhdGFMYXN0QW5zd2VyID0gdW5kZWZpbmVkO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGNvbmZpZ3VyYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2lvbmUuZGVjb05vZGVzICYmIHRoaXMuX2lvbmUuZGVjb05vZGVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBjb25maWd1cmFibGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhbWVyYTogYW55ID0gdGhpcy5fYXBpU2VydmljZU1vZHVsZS5nZXRDYW1lcmFQcm9wZXJ0aWVzKHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhKTtcclxuXHJcbiAgICBsZXQgcG9zaXRpb246IFZlY3RvcjM7XHJcbiAgICBsZXQgcm90YXRpb246IFZlY3RvcjM7XHJcblxyXG4gICAgaWYgKHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoXHJcbiAgICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uLngsXHJcbiAgICAgICAgMCxcclxuICAgICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEN1c3RvbUZsb29yR3JvdXAucG9zaXRpb24ueik7XHJcblxyXG4gICAgICByb3RhdGlvbiA9IG5ldyBWZWN0b3IzKFxyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi54LFxyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi55LFxyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi56KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgIHJvdGF0aW9uID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZnVybml0dXJlOiBhbnkgPSB7XHJcbiAgICAgIG1vZGVsX3VybDogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5hc3NldFVybCxcclxuICAgICAgaXRlbV9zY2hlbWE6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuZGlzdFNjaGVtYSB8fCAnVVBfREJBJyxcclxuICAgICAgaXRlbV9hc3NldFBhdGg6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsLFxyXG4gICAgICBpdGVtX2lkZW50aWZpZXI6IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFydGljbGUuaWQsXHJcbiAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlndXJhYmxlLFxyXG4gICAgICBzZWxlY3Rpb25zOiBzZWxlY3Rpb25zLFxyXG4gICAgICBkZWNvczogdGhpcy5faW9uZS5kZWNvTm9kZXMsXHJcbiAgICAgIG9iamVjdFBvc2l0aW9uOiBwb3NpdGlvbixcclxuICAgICAgb2JqZWN0Um90YXRpb246IHJvdGF0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucHJvZHVjdFJlbmRlclNjZW5lQXNzZXRJZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ211bHRpc2NlbmUnKSAhPT0gLTEpIHtcclxuICAgICAgbXVsdGlzY2VuZVJlbmRlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aW9uOiAncHJlcGFyZVJlbmRlclJlcXVlc3QnLFxyXG4gICAgICBtdWx0aXNjZW5lQ29tcG9zaXRpbmc6IG11bHRpc2NlbmVSZW5kZXIsXHJcbiAgICAgIGZ1cm5pdHVyZTogW2Z1cm5pdHVyZV0sXHJcbiAgICAgIGNhbWVyYTogY2FtZXJhLFxyXG4gICAgICBmb3JjZTogZm9yY2VcclxuICAgIH07XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gcHJpdmF0ZSBhc3luYyBfaGFuZGxlQWpheEJsZW5kZXJSZW5kZXIoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICBjb25zdCByZXN1bHQgPSBhd2FpdCBheGlvcyh7XHJcbiAgLy8gICAgIGhlYWRlcnM6IHtcclxuICAvLyAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gIC8vICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuICAvLyAgICAgdXJsOiBgJHt0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MubmV3UmVuZGVyUGFyYW1ldGVycy5ob3N0fToke3RoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5uZXdSZW5kZXJQYXJhbWV0ZXJzLnBvcnR9L2dldEJsZW5kZXJSZW5kZXJGcm9tRGF0YWAsXHJcbiAgLy8gICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nXHJcbiAgLy8gICB9KTtcclxuICAvLyAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcclxuICAvLyAgICAgLy8gY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5kYXRhLmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuZGF0YS5pbWFnZX1gO1xyXG4gIC8vICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAvLyAgICAgLy8gY29uc29sZS5sb2coaW1hZ2UpO1xyXG4gIC8vICAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUFqYXhSZW5kZXIoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmJsZW5kZXJSZW5kZXJTdGFydGVkLmVtaXQoKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zKHtcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgICAgfSxcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB1cmw6IGAke3RoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhvc3R9L2dldEJsZW5kZXJSZW5kZXJGcm9tRGF0YWAsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nXHJcbiAgICB9KTtcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgLy8gY29uc3QgaW1hZ2UgPSBgZGF0YToke3Jlc3VsdC5kYXRhLmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuZGF0YS5pbWFnZX1gO1xyXG4gICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKHJlc3VsdC5kYXRhLmltYWdlKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coaW1hZ2UpO1xyXG4gICAgICB0aGlzLnJlbmRlckltYWdlQ2hhbmdlZC5uZXh0KHJlc3VsdC5kYXRhLmltYWdlKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVBamF4R2xiKGRhdGE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXhpb3Moe1xyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICB9LFxyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgIHVybDogYCR7dGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaG9zdH0vZ2V0R2xiRnJvbURhdGFgLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJ1xyXG4gICAgfSk7XHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgIC8vIGNvbnN0IGltYWdlID0gYGRhdGE6JHtyZXN1bHQuZGF0YS5maWxlVHlwZX07YmFzZTY0LCR7cmVzdWx0LmRhdGEuaW1hZ2V9YDtcclxuICAgICAgLy8gdGhpcy5fc2hvd1ByZXZpZXdJbWFnZShyZXN1bHQuZGF0YS5pbWFnZSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGltYWdlKTtcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmdsYkNyZWF0ZWQubmV4dChyZXN1bHQuZGF0YS51cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlV2ViU29ja2V0UmVuZGVyKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2ViU29ja2V0Q29ubmVjdGlvbjogc3RyaW5nID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMud2Vic29ja2V0O1xyXG4gICAgY29uc3Qgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh3ZWJTb2NrZXRDb25uZWN0aW9uKTtcclxuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XHJcbiAgICAgIHdlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH07XHJcbiAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBpbWFnZSA9IGBkYXRhOiR7cmVzdWx0LmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuaW1hZ2V9YDtcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHJlc3VsdC5yZW5kZXJlZDtcclxuICAgICAgICBjb25zdCBmaW5pc2hlZCA9IHJlc3VsdC5maW5pc2hlZDtcclxuICAgICAgICAvLyB0aGlzLl9zaG93UHJldmlld0ltYWdlKGltYWdlKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQucmVuZGVyZWQpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyVXBkYXRlSW1hZ2VDaGFuZ2VkLm5leHQoe2ltYWdlOiBpbWFnZSwgcHJvZ3Jlc3M6IHByb2dyZXNzLCBmaW5pc2hlZDogZmluaXNoZWR9KTtcclxuICAgICAgICBpZiAocmVzdWx0LmZpbmlzaGVkKSB7XHJcbiAgICAgICAgICB3ZWJTb2NrZXQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVXZWJTb2NrZXRSb29tUmVuZGVyKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2ViU29ja2V0Q29ubmVjdGlvbjogc3RyaW5nID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMud2Vic29ja2V0O1xyXG4gICAgY29uc3Qgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh3ZWJTb2NrZXRDb25uZWN0aW9uKTtcclxuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XHJcbiAgICAgIHdlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH07XHJcbiAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBpbWFnZSA9IGBkYXRhOiR7cmVzdWx0LmZpbGVUeXBlfTtiYXNlNjQsJHtyZXN1bHQuaW1hZ2V9YDtcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHJlc3VsdC5yZW5kZXJlZDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRRdWV1ZVJlbmRlckl0ZW0ucmVuZGVyUHJvZ3Jlc3MgPSBwcm9ncmVzcztcclxuICAgICAgICB0aGlzLnJlbmRlclJvb21JbWFnZUNoYW5nZWQubmV4dChpbWFnZSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maW5pc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlZFJvb21JbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRRdWV1ZVJlbmRlckl0ZW0ucmVuZGVyU3RhdHVzID0gUmVuZGVyU3RhdHVzLklzU3VjY2VzcztcclxuICAgICAgICAgIHdlYlNvY2tldC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3dQcmV2aWV3SW1hZ2Uoc3JjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlld19pbWcnKTtcclxuICAgIGlmICghaW1nKSB7XHJcbiAgICAgIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICBpbWcuaWQgPSAncHJldmlld19pbWcnO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnByZXBlbmQoaW1nKTtcclxuICAgICAgaW1nLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgaW1nLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgaW1nLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgIC8vIGltZy5zdHlsZS53aWR0aCA9ICc4MDBweCc7XHJcbiAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnNjAwcHgnO1xyXG4gICAgICBpbWcuc3R5bGUuekluZGV4ID0gJzEwJztcclxuICAgIH1cclxuICAgIChpbWcgYXMgYW55KS5zcmMgPSBzcmM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXREYXRhRm9yUmVuZGVyKGZvcmNlOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycz86IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBvYmplY3RSb3RhdGlvbjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG4gICAgaWYgKG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycyAmJiBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMub2JqZWN0Um90YXRpb24pIHtcclxuICAgICAgb2JqZWN0Um90YXRpb24ueCA9IG9wdGlvbmFsUmVuZGVyUGFyYW1ldGVycy5vYmplY3RSb3RhdGlvbi54O1xyXG4gICAgICBvYmplY3RSb3RhdGlvbi55ID0gb3B0aW9uYWxSZW5kZXJQYXJhbWV0ZXJzLm9iamVjdFJvdGF0aW9uLnk7XHJcbiAgICAgIG9iamVjdFJvdGF0aW9uLnogPSBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMub2JqZWN0Um90YXRpb24uejtcclxuICAgIH1cclxuICAgIGNvbnN0IGJsZW5kZXJWZWN0b3I6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMyhvYmplY3RSb3RhdGlvbi54LCAtb2JqZWN0Um90YXRpb24ueiwgb2JqZWN0Um90YXRpb24ueSk7XHJcbiAgICBsZXQgYXV0b0ZyYW1lTWFyZ2luOiBudW1iZXIgPSAxNTtcclxuICAgIGlmIChvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMgJiYgb3B0aW9uYWxSZW5kZXJQYXJhbWV0ZXJzLm1hcmdpbikge1xyXG4gICAgICBhdXRvRnJhbWVNYXJnaW4gPSBvcHRpb25hbFJlbmRlclBhcmFtZXRlcnMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgY29uc3QgZGlydHlDYW06IG51bWJlcltdID0gWzEsIDAsIDAsIDAsIDAsIDAuOTc3ODA5NDE5NDM2ODYyNywgLTAuMjA5NDk2Mzk0Mzg1NTQ4NzMsIDAsIDAsIDAuMjA5NDk2Mzk0Mzg1NTQ4NzMsIDAuOTc3ODA5NDE5NDM2ODYyNyxcclxuICAgICAgMCwgMCwgMS4wMjUxODA5MTg5OTAwMjMsIDIuODcwOTc1MTE3NzAyMTY2NywgMV07XHJcbiAgICBjb25zdCBzY2VuZVNldHRpbmdzOiBTY2VuZVNldHRpbmdzW10gPSB0aGlzLl9nZXRTY2VuZVJlbmRlclNldHRpbmdzKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5wcm9kdWN0UmVuZGVyU2NlbmVBc3NldElkKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHdpZHRoOiB0aGlzLl9nZXRSZW5kZXJXaWR0aCgpLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuX2dldFJlbmRlckhlaWdodCgpLFxyXG4gICAgICBzY2VuZVNldHRpbmdzOiBzY2VuZVNldHRpbmdzLFxyXG4gICAgICB0cmFuc3BhcmVuY3k6IHRoaXMuX3VzZVRyYW5zcGFyZW5jeShzY2VuZVNldHRpbmdzKSxcclxuICAgICAgLy8gbWF4X3NhbXBsZXM6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLml0ZXJhdGlvbnMsXHJcbiAgICAgIGNhbWVyYU9wdGlvbnM6IHtcclxuICAgICAgICBmb3Y6IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmZvdixcclxuICAgICAgICBtYXRyaXg6IGRpcnR5Q2FtLCAvLyB0aGlzLnN0YW5kQWxvbmVDYW1lcmFGaXhlZE1hdHJpeCwgIC8vQXJyYXkuZnJvbSh0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS5tYXRyaXhXb3JsZC5lbGVtZW50cylcclxuICAgICAgfSxcclxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XHJcbiAgICAgICAgaGRyaTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaGRyaSxcclxuICAgICAgICBoZHJpSW50ZW5zaXR5OiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5oZHJpSW50ZW5zaXR5XHJcbiAgICAgIH0sXHJcbiAgICAgIG9iamVjdE9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgeDogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uLngsXHJcbiAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgejogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uLnpcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJvdGF0aW9uOiB7XHJcbiAgICAgICAgICB4OiB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEN1c3RvbUZsb29yR3JvdXAucm90YXRpb24ueCxcclxuICAgICAgICAgIHk6IHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5yb3RhdGlvbi55LFxyXG4gICAgICAgICAgejogdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnJvdGF0aW9uLnpcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGF1dG9GcmFtZU1hcmdpbjogYXV0b0ZyYW1lTWFyZ2luLFxyXG4gICAgICBvYmplY3RSZW5kZXJUcmFuc2Zvcm06IGJsZW5kZXJWZWN0b3JcclxuICAgIH07XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5faW9uZS5zZWxlY3Rpb25zLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMpKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgc2VsZWN0aW9uczogc2VsZWN0aW9ucyxcclxuICAgICAgZGVjb3M6IHRoaXMuX2lvbmUuZGVjb05vZGVzLFxyXG4gICAgICBhc3NldFVybDogdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYXJ0aWNsZS5hc3NldFVybCxcclxuICAgICAgY2RuVXJsOiB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybCxcclxuICAgICAgc2NoZW1hOiB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hcnRpY2xlLmRpc3RTY2hlbWEgfHwgJ1VQX0RCQScsXHJcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNcclxuICAgIH07XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFNjZW5lUmVuZGVyU2V0dGluZ3MoYXNzZXRJZDogc3RyaW5nKTogU2NlbmVTZXR0aW5nc1tdIHtcclxuICAgIC8vIEdldCB0aGUgYXNzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQmxlbmRlclJlbmRlclNldHRpbmdzXHJcbiAgICBsZXQgcmVuZGVyU2NlbmVzOiBCbGVuZGVyU2NlbmVTZXR0aW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYmxlbmRlclNjZW5lU2V0dGluZ3MgJiYgdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmJsZW5kZXJTY2VuZVNldHRpbmdzLnNjZW5lcykge1xyXG4gICAgICByZW5kZXJTY2VuZXMgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYmxlbmRlclNjZW5lU2V0dGluZ3Muc2NlbmVzLmZpbHRlcihcclxuICAgICAgICBzY2VuZSA9PiBzY2VuZS5zY2VuZVR5cGUgPT09IEJsZW5kZXJTY2VuZVR5cGUuUHJvZHVjdFxyXG4gICAgICAgICAgJiYgc2NlbmUubmFtZSA9PT0gYXNzZXRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlbmRlclNjZW5lOiBCbGVuZGVyU2NlbmVTZXR0aW5nO1xyXG4gICAgLy8gdGhpcyBzaG91bGQgYmUgYSBsZW5ndGggb2YgMSwgc28gaWYgaXQncyA+IDAsIHdlIGNhbiBzYWZlbHkgdGFrZSB0aGUgZmlyc3Qgb25lXHJcbiAgICBpZiAocmVuZGVyU2NlbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmVuZGVyU2NlbmUgPSByZW5kZXJTY2VuZXNbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBmYWxsYmFjayBzY2VuZVxyXG4gICAgICBjb25zdCBmYWxsYmFjazogQmxlbmRlclNjZW5lU2V0dGluZyA9IG5ldyBCbGVuZGVyU2NlbmVTZXR0aW5nKCk7XHJcbiAgICAgIGZhbGxiYWNrLm5hbWUgPSAnY3ljbGVzX3NjZW5lX3N0dWRpbyc7XHJcbiAgICAgIGZhbGxiYWNrLm11bHRpU2NlbmVSZW5kZXIgPSBmYWxzZTtcclxuICAgICAgZmFsbGJhY2sucHJpbWFyeVNjZW5lTmFtZSA9ICdjeWNsZXNfc2NlbmVfc3R1ZGlvJztcclxuICAgICAgZmFsbGJhY2suaGRyaUludGVuc2l0eSA9IDE7XHJcbiAgICAgIGZhbGxiYWNrLmhkcmlSb3RhdGlvbiA9IDA7XHJcbiAgICAgIGZhbGxiYWNrLmxpZ2h0aW5nRXhwb3N1cmUgPSAxO1xyXG4gICAgICBmYWxsYmFjay5zY2VuZVR5cGUgPSBCbGVuZGVyU2NlbmVUeXBlLlByb2R1Y3Q7XHJcbiAgICAgIHJlbmRlclNjZW5lID0gZmFsbGJhY2s7XHJcbiAgICB9XHJcbiAgICBsZXQgc2NlbmVzOiBTY2VuZVNldHRpbmdzW10gPSBbXTtcclxuICAgIC8vIFByaW1hcnkgc2NlbmVcclxuICAgIGNvbnN0IGNvbXBvc2l0ZVNjZW5lOiBTY2VuZVNldHRpbmdzID0gbmV3IFNjZW5lU2V0dGluZ3MoKTtcclxuICAgIGNvbXBvc2l0ZVNjZW5lLnNjZW5lQXNzZXRJZCA9IHJlbmRlclNjZW5lLnByaW1hcnlTY2VuZU5hbWU7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5hY3RpdmVDYW1lcmFJZCA9IDE7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5kZWZhdWx0ID0gdHJ1ZTtcclxuICAgIGNvbXBvc2l0ZVNjZW5lLmhkcmlSb3RhdGlvbiA9IHRoaXMuX2FwaVNlcnZpY2VNb2R1bGUuZGVncmVlc1RvVmVjdG9yMyhyZW5kZXJTY2VuZS5oZHJpUm90YXRpb24pO1xyXG4gICAgY29tcG9zaXRlU2NlbmUuaGRyaUludGVuc2l0eSA9IHJlbmRlclNjZW5lLmhkcmlJbnRlbnNpdHk7XHJcbiAgICBjb21wb3NpdGVTY2VuZS5pZCA9IDYwMDtcclxuXHJcbiAgICBpZiAocmVuZGVyU2NlbmUubXVsdGlTY2VuZVJlbmRlcikge1xyXG4gICAgICBjb25zdCBhZGRpdGlvbmFsU2NlbmU6IFNjZW5lU2V0dGluZ3MgPSBuZXcgU2NlbmVTZXR0aW5ncygpO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuc2NlbmVBc3NldElkID0gcmVuZGVyU2NlbmUuc2Vjb25kYXJ5U2NlbmVOYW1lO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuYWN0aXZlQ2FtZXJhSWQgPSAxO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuZGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICBhZGRpdGlvbmFsU2NlbmUuaGRyaVJvdGF0aW9uID0gdGhpcy5fYXBpU2VydmljZU1vZHVsZS5kZWdyZWVzVG9WZWN0b3IzKHJlbmRlclNjZW5lLmhkcmlSb3RhdGlvbik7XHJcbiAgICAgIGFkZGl0aW9uYWxTY2VuZS5oZHJpSW50ZW5zaXR5ID0gcmVuZGVyU2NlbmUuaGRyaUludGVuc2l0eTtcclxuICAgICAgYWRkaXRpb25hbFNjZW5lLmlkID0gNjAxO1xyXG4gICAgICBzY2VuZXMgPSBbY29tcG9zaXRlU2NlbmUsIGFkZGl0aW9uYWxTY2VuZV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzY2VuZXMgPSBbY29tcG9zaXRlU2NlbmVdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNjZW5lcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldERhdGFGb3JSb29tUmVuZGVyKHNpemU6IGFueSk6IGFueSB7XHJcbiAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIHdpZHRoOiBzaXplLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxyXG4gICAgICBtYXhfc2FtcGxlczogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaXRlcmF0aW9ucyxcclxuICAgICAgY2FtZXJhT3B0aW9uczoge1xyXG4gICAgICAgIGZvdjogdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEuZm92LFxyXG4gICAgICAgIG1hdHJpeDogQXJyYXkuZnJvbSh0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZWxlbWVudHMpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVudmlyb25tZW50T3B0aW9uczoge1xyXG4gICAgICAgIGhkcmk6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmhkcmksXHJcbiAgICAgICAgaGRyaUludGVuc2l0eTogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaGRyaUludGVuc2l0eVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgYXNzZXRVcmw6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgsXHJcbiAgICAgIGNkblVybDogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnRocmVlREFzc2V0UGF0aCxcclxuICAgICAgc2NoZW1hOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2NoZW1hLFxyXG4gICAgICBvcHRpb25zOiBvcHRpb25zXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJpbmFyeSA9ICcnO1xyXG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgY29uc3QgbGVuID0gYnl0ZXMuYnl0ZUxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyV2lkdGgoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5pbWFnZVdpZHRoID09PSAwIHx8IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlV2lkdGggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2xpZW50V2lkdGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnJlbmRlclBhcmFtZXRlcnMuaW1hZ2VXaWR0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFJlbmRlckhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlSGVpZ2h0ID09PSAwIHx8IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5yZW5kZXJQYXJhbWV0ZXJzLmltYWdlSGVpZ2h0ID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNsaWVudEhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MucmVuZGVyUGFyYW1ldGVycy5pbWFnZUhlaWdodDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZVRyYW5zcGFyZW5jeShzY2VuZVNldHRpbmdzOiBTY2VuZVNldHRpbmdzW10pOiBib29sZWFuIHtcclxuICAgIC8vIE9OTFkgd2hlbiB3ZSBhcmUgdXNpbmcgbXVsdGlzY2VuZSBjb21wb3NpdGluZywgd2UgbmVlZCB0byB1c2UgdHJhbnNwYXJlbmN5XHJcbiAgICByZXR1cm4gc2NlbmVTZXR0aW5ncy5sZW5ndGggPiAxO1xyXG4gIH1cclxufVxyXG4iXX0=
|