@colijnit/configurator 1.0.21 → 1.0.22
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/builder.d.ts +53 -0
- package/app/components/answers/answer/answer.component.d.ts +11 -0
- package/app/components/answers/answers.component.d.ts +8 -0
- package/app/components/answers/answers.module.d.ts +2 -0
- package/app/components/selections/selections.component.d.ts +22 -0
- package/app/components/selections/selections.module.d.ts +2 -0
- package/app/components/shared/loader/loader.component.d.ts +2 -0
- package/app/components/shared/shared.module.d.ts +2 -0
- package/app/directives/visibility-observer-master.directive.d.ts +9 -0
- package/app/directives/visibility-observer.directive.d.ts +13 -0
- package/app/services/configurator.service.d.ts +22 -0
- package/app/services/image-cache.service.d.ts +10 -0
- package/app/services/locator.service.d.ts +4 -0
- package/bundles/colijnit-configurator.umd.js +2745 -0
- package/bundles/colijnit-configurator.umd.js.map +1 -0
- package/bundles/colijnit-configurator.umd.min.js +17 -0
- package/bundles/colijnit-configurator.umd.min.js.map +1 -0
- package/colijnit-configurator.d.ts +10 -0
- package/colijnit-configurator.metadata.json +1 -0
- package/esm2015/app/builder.js +477 -0
- package/esm2015/app/components/answers/answer/answer.component.js +69 -0
- package/esm2015/app/components/answers/answers.component.js +43 -0
- package/esm2015/app/components/answers/answers.module.js +29 -0
- package/esm2015/app/components/selections/selections.component.js +134 -0
- package/esm2015/app/components/selections/selections.module.js +23 -0
- package/esm2015/app/components/shared/loader/loader.component.js +24 -0
- package/esm2015/app/components/shared/shared.module.js +21 -0
- package/esm2015/app/directives/visibility-observer-master.directive.js +51 -0
- package/esm2015/app/directives/visibility-observer.directive.js +57 -0
- package/esm2015/app/services/configurator.service.js +94 -0
- package/esm2015/app/services/image-cache.service.js +66 -0
- package/esm2015/app/services/locator.service.js +10 -0
- package/esm2015/colijnit-configurator.js +11 -0
- package/esm2015/helper/variation-helper.js +216 -0
- package/esm2015/model/material.js +11 -0
- package/esm2015/model/variation-settings.js +6 -0
- package/esm2015/model/variation.js +3 -0
- package/esm2015/public_api.js +7 -0
- package/esm2015/utils/asset.utils.js +74 -0
- package/esm2015/utils/file.utils.js +139 -0
- package/esm2015/utils/image.utils.js +52 -0
- package/esm2015/utils/object.utils.js +49 -0
- package/esm2015/utils/scene-utils.js +94 -0
- package/esm2015/utils/threed.utils.js +222 -0
- package/esm2015/utils/variation-utils.js +224 -0
- package/esm5/app/builder.js +591 -0
- package/esm5/app/components/answers/answer/answer.component.js +64 -0
- package/esm5/app/components/answers/answers.component.js +27 -0
- package/esm5/app/components/answers/answers.module.js +32 -0
- package/esm5/app/components/selections/selections.component.js +104 -0
- package/esm5/app/components/selections/selections.module.js +26 -0
- package/esm5/app/components/shared/loader/loader.component.js +16 -0
- package/esm5/app/components/shared/shared.module.js +24 -0
- package/esm5/app/directives/visibility-observer-master.directive.js +64 -0
- package/esm5/app/directives/visibility-observer.directive.js +59 -0
- package/esm5/app/services/configurator.service.js +160 -0
- package/esm5/app/services/image-cache.service.js +69 -0
- package/esm5/app/services/locator.service.js +13 -0
- package/esm5/colijnit-configurator.js +11 -0
- package/esm5/helper/variation-helper.js +268 -0
- package/esm5/model/material.js +13 -0
- package/esm5/model/variation-settings.js +8 -0
- package/esm5/model/variation.js +7 -0
- package/esm5/public_api.js +7 -0
- package/esm5/utils/asset.utils.js +106 -0
- package/esm5/utils/file.utils.js +151 -0
- package/esm5/utils/image.utils.js +56 -0
- package/esm5/utils/object.utils.js +56 -0
- package/esm5/utils/scene-utils.js +98 -0
- package/esm5/utils/threed.utils.js +279 -0
- package/esm5/utils/variation-utils.js +327 -0
- package/fesm2015/colijnit-configurator.js +2109 -0
- package/fesm2015/colijnit-configurator.js.map +1 -0
- package/fesm5/colijnit-configurator.js +2527 -0
- package/fesm5/colijnit-configurator.js.map +1 -0
- package/helper/variation-helper.d.ts +14 -0
- package/model/material.d.ts +17 -0
- package/model/variation-settings.d.ts +14 -0
- package/model/variation.d.ts +10 -0
- package/package.json +12 -45
- package/{src/public_api.ts → public_api.d.ts} +6 -6
- package/utils/asset.utils.d.ts +13 -0
- package/utils/file.utils.d.ts +27 -0
- package/utils/image.utils.d.ts +8 -0
- package/utils/object.utils.d.ts +7 -0
- package/utils/scene-utils.d.ts +7 -0
- package/utils/threed.utils.d.ts +16 -0
- package/utils/variation-utils.d.ts +12 -0
- package/.idea/Configurator.iml +0 -12
- package/.idea/codeStyles/Project.xml +0 -21
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/misc.xml +0 -9
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/angular.json +0 -193
- package/configurator.iml +0 -11
- package/dist/configurator/index.html +0 -14
- package/dist/configurator/main-es2015.js +0 -3129
- package/dist/configurator/main-es2015.js.map +0 -1
- package/dist/configurator/main-es5.js +0 -5482
- package/dist/configurator/main-es5.js.map +0 -1
- package/dist/configurator/polyfills-es2015.js +0 -4520
- package/dist/configurator/polyfills-es2015.js.map +0 -1
- package/dist/configurator/polyfills-es5.js +0 -18375
- package/dist/configurator/polyfills-es5.js.map +0 -1
- package/dist/configurator/runtime-es2015.js +0 -155
- package/dist/configurator/runtime-es2015.js.map +0 -1
- package/dist/configurator/runtime-es5.js +0 -155
- package/dist/configurator/runtime-es5.js.map +0 -1
- package/dist/configurator/styles-es2015.js +0 -450
- package/dist/configurator/styles-es2015.js.map +0 -1
- package/dist/configurator/styles-es5.js +0 -432
- package/dist/configurator/styles-es5.js.map +0 -1
- package/dist/configurator/vendor-es2015.js +0 -155551
- package/dist/configurator/vendor-es2015.js.map +0 -1
- package/dist/configurator/vendor-es5.js +0 -183588
- package/dist/configurator/vendor-es5.js.map +0 -1
- package/ng-package.json +0 -9
- package/src/app/app.component.ts +0 -222
- package/src/app/app.module.ts +0 -34
- package/src/app/builder.ts +0 -480
- package/src/app/components/answers/answer/answer.component.ts +0 -61
- package/src/app/components/answers/answers.component.ts +0 -41
- package/src/app/components/answers/answers.module.ts +0 -26
- package/src/app/components/selections/selections.component.ts +0 -131
- package/src/app/components/selections/selections.module.ts +0 -20
- package/src/app/components/shared/loader/loader.component.scss +0 -33
- package/src/app/components/shared/loader/loader.component.ts +0 -20
- package/src/app/components/shared/shared.module.ts +0 -16
- package/src/app/directives/visibility-observer-master.directive.ts +0 -71
- package/src/app/directives/visibility-observer.directive.ts +0 -74
- package/src/app/services/configurator.service.ts +0 -86
- package/src/app/services/image-cache.service.ts +0 -56
- package/src/app/services/locator.service.ts +0 -6
- package/src/environments/environment.prod.ts +0 -3
- package/src/environments/environment.ts +0 -8
- package/src/helper/variation-helper.ts +0 -220
- package/src/index.html +0 -14
- package/src/main.ts +0 -11
- package/src/model/material.ts +0 -22
- package/src/model/variation-settings.ts +0 -14
- package/src/model/variation.ts +0 -11
- package/src/polyfills.ts +0 -73
- package/src/style/shared.scss +0 -173
- package/src/style/styles.scss +0 -45
- package/src/tsconfig.app.json +0 -16
- package/src/tsconfig.spec.json +0 -19
- package/src/utils/asset.utils.ts +0 -88
- package/src/utils/file.utils.ts +0 -156
- package/src/utils/file.utils.unit.test.ts +0 -8
- package/src/utils/image.utils.ts +0 -54
- package/src/utils/object.utils.ts +0 -52
- package/src/utils/scene-utils.ts +0 -119
- package/src/utils/threed.utils.ts +0 -219
- package/src/utils/variation-utils.ts +0 -216
- package/tsconfig.json +0 -23
- package/tslint.json +0 -132
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
import { Options } from "@colijnit/ioneconnector/build/model/options";
|
|
4
|
+
import { DecoNode } from "@colijnit/configuratorapi/build/model/deco-node";
|
|
5
|
+
import { BusinessObjectFactory } from "@colijnit/ioneconnector/build/service/business-object-factory";
|
|
6
|
+
import { Selection } from "@colijnit/configuratorapi/build/model/selection";
|
|
7
|
+
import { DecoNodeType } from "@colijnit/configuratorapi/build/enum/deco-node-type.enum";
|
|
8
|
+
import { ThreedUtils } from "../utils/threed.utils";
|
|
9
|
+
import { DecoNodeKind } from "@colijnit/configuratorapi/build/enum/deco-node-kind.enum";
|
|
10
|
+
import { SceneUtils } from "../utils/scene-utils";
|
|
11
|
+
import { VariationHelper } from "../helper/variation-helper";
|
|
12
|
+
import { Article } from "@colijnit/configuratorapi/build/model/article";
|
|
13
|
+
import { ConfiguratorService } from './services/configurator.service';
|
|
14
|
+
import { Scene } from 'three';
|
|
15
|
+
import { Injectable } from '@angular/core';
|
|
16
|
+
import { BehaviorSubject } from 'rxjs';
|
|
17
|
+
import { ServiceLocator } from './services/locator.service';
|
|
18
|
+
let Builder = class Builder {
|
|
19
|
+
constructor(scene, options, useInAngular) {
|
|
20
|
+
this.selectionsReceived = new BehaviorSubject([]);
|
|
21
|
+
this.answersReceived = new BehaviorSubject([]);
|
|
22
|
+
this.modelLoaded = new BehaviorSubject(null);
|
|
23
|
+
this._selections = [];
|
|
24
|
+
this._answers = [];
|
|
25
|
+
this._decos = [];
|
|
26
|
+
this._placedAdjustables = [];
|
|
27
|
+
this._placedAddables = [];
|
|
28
|
+
this._adjustables = [];
|
|
29
|
+
this._addables = [];
|
|
30
|
+
this._articleCache = new Map();
|
|
31
|
+
this._boFactory = new BusinessObjectFactory();
|
|
32
|
+
this._threedUtils = new ThreedUtils();
|
|
33
|
+
this._variationHelper = new VariationHelper();
|
|
34
|
+
if (!scene) {
|
|
35
|
+
throw 'No scene object provided!';
|
|
36
|
+
}
|
|
37
|
+
if (!options) {
|
|
38
|
+
throw 'No connection options provided!';
|
|
39
|
+
}
|
|
40
|
+
if (useInAngular) {
|
|
41
|
+
this._configuratorService = ServiceLocator.injector.get(ConfiguratorService);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this._configuratorService = new ConfiguratorService(undefined);
|
|
45
|
+
}
|
|
46
|
+
this._configuratorService.initApi(options);
|
|
47
|
+
this._scene = scene;
|
|
48
|
+
}
|
|
49
|
+
buildModel(sku, instanceId, goodId) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
if (!this._scene) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
yield this._setInstanceId(sku, instanceId, goodId);
|
|
56
|
+
yield this._prepareConfiguration(this._sku, this._goodId);
|
|
57
|
+
if (this._source) {
|
|
58
|
+
yield this._configuratorService.setInstanceToConfigure(this._instanceId);
|
|
59
|
+
const promises = [];
|
|
60
|
+
promises.push(this.getQuestionAndAnswers());
|
|
61
|
+
promises.push(this._getSelections(this._instanceId));
|
|
62
|
+
promises.push(this._getDecos());
|
|
63
|
+
yield Promise.all(promises);
|
|
64
|
+
if (this._answers.length > 0) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this._linkSelectionsAndDecos();
|
|
68
|
+
return this._build(this._instanceId);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw 'GLB source not found!';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
initNodeInstance(goodId) {
|
|
80
|
+
return this._configuratorService.initNodeInstance(goodId);
|
|
81
|
+
}
|
|
82
|
+
destroy() {
|
|
83
|
+
this._threedUtils.clearCache();
|
|
84
|
+
this._variationHelper.clearCache();
|
|
85
|
+
}
|
|
86
|
+
selectSelection(selection) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
yield this._configuratorService.selectSelection(selection, false);
|
|
89
|
+
this.getQuestionAndAnswers();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
getQuestionAndAnswers(publicationCode) {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
const questionsAndAnswers = yield this._configuratorService.getQuestionAndAnswers(false, publicationCode);
|
|
95
|
+
this._answers = questionsAndAnswers.answers;
|
|
96
|
+
this.answersReceived.next(questionsAndAnswers.answers);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
selectAnswer(answer) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
yield this._configuratorService.selectAnswer(answer, false);
|
|
102
|
+
this.modelLoaded.next(yield this.buildModel());
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
_setInstanceId(sku, instanceId, goodId) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
if (!instanceId && !this._instanceId) {
|
|
108
|
+
if (!goodId) {
|
|
109
|
+
goodId = yield this._getGoodIdFromSku(sku);
|
|
110
|
+
}
|
|
111
|
+
this._goodId = goodId;
|
|
112
|
+
const result = yield this.initNodeInstance(this._goodId);
|
|
113
|
+
if (result && result.resultObject) {
|
|
114
|
+
this._instanceId = result.resultObject;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
throw 'Failed to initialize node instance';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (!this._instanceId) {
|
|
121
|
+
this._instanceId = instanceId;
|
|
122
|
+
}
|
|
123
|
+
if (!this._sku) {
|
|
124
|
+
this._sku = sku;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
_prepareConfiguration(sku, goodId) {
|
|
129
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
const article = yield this._getArticle(sku, goodId);
|
|
131
|
+
if (article && article.assetUrl) {
|
|
132
|
+
this._source = yield this._threedUtils.download3DSource(article.assetUrl)
|
|
133
|
+
.catch((error) => {
|
|
134
|
+
throw error;
|
|
135
|
+
});
|
|
136
|
+
if (article.contentDeliveryUrl) {
|
|
137
|
+
this._variationHelper.assetPath =
|
|
138
|
+
article.contentDeliveryUrl +
|
|
139
|
+
(article.contentDeliveryUrl.endsWith('/') ? '' : '/') +
|
|
140
|
+
(article.distSchema ? article.distSchema : 'UP_DBA');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
_build(instanceId) {
|
|
146
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
147
|
+
this._reset();
|
|
148
|
+
const adjustables = this._getAdjustables();
|
|
149
|
+
if (adjustables && adjustables.length > 0) {
|
|
150
|
+
const obj = new THREE.Object3D();
|
|
151
|
+
obj.visible = false; // no need to render visualy
|
|
152
|
+
this._scene.add(obj);
|
|
153
|
+
let connected = false;
|
|
154
|
+
for (let i = 0, len = adjustables.length; i < len; i++) {
|
|
155
|
+
const adjustable = this._createAdjustable(obj, adjustables[i]);
|
|
156
|
+
if (adjustable) {
|
|
157
|
+
for (let ii = 0, lenii = this._placedAdjustables.length; ii < lenii; ii++) {
|
|
158
|
+
if (SceneUtils.TrySelectorConnection(this._scene, obj, this._placedAdjustables[ii], adjustable)) {
|
|
159
|
+
this._placedAdjustables[ii].visible = true;
|
|
160
|
+
adjustable.visible = true;
|
|
161
|
+
connected = true;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
connected = false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (!connected && this._placedAdjustables.length > 1) {
|
|
168
|
+
console.warn('No connection found for: ', adjustable.name);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this._placeAddables(obj);
|
|
172
|
+
this._updatePivot(obj);
|
|
173
|
+
yield this._loadVariations(obj, instanceId);
|
|
174
|
+
this._scene.remove(obj);
|
|
175
|
+
return obj;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
throw 'No adjustables found!';
|
|
179
|
+
// this._building = false;
|
|
180
|
+
// if (this.selections.length < 2) {
|
|
181
|
+
// this._errorService.addError(this.activeInstance, {message: 'NO_SELECTIONS_OR_DECOS', description: 'NO_SELECTIONS_OR_DECOS_INFO'});
|
|
182
|
+
// this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoSelections});
|
|
183
|
+
// } else if (this.decos.size === 0) {
|
|
184
|
+
// this._errorService.addError(this.activeInstance, {message: 'NO_SELECTIONS_OR_DECOS', description: 'NO_SELECTIONS_OR_DECOS_INFO'});
|
|
185
|
+
// this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoDecoNodes});
|
|
186
|
+
// } else {
|
|
187
|
+
// this._errorService.addError(this.activeInstance, {message: 'NO_ADJUSTABLES', description: 'NO_ADJUSTABLES_INFO'});
|
|
188
|
+
// this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoAdjustables});
|
|
189
|
+
// }
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
_prepareTheSelections() {
|
|
194
|
+
// get generic variations
|
|
195
|
+
const globalVariations = this._selections
|
|
196
|
+
.filter(s => s.generic && s.decoNode.variation && !s.decoNode.type)
|
|
197
|
+
.map((value, index, array) => {
|
|
198
|
+
// find selection of variation
|
|
199
|
+
const sel = this._selections.find(s => s.artNodeIdDeco === value.decoNode.variation.id);
|
|
200
|
+
if (sel) {
|
|
201
|
+
value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
|
|
202
|
+
}
|
|
203
|
+
value.decoNode.variation.materialId = value.hdecoGameObject;
|
|
204
|
+
return value.decoNode.variation;
|
|
205
|
+
});
|
|
206
|
+
// const usedVariations: FurniturePartVariation[] = [];
|
|
207
|
+
let globalVariationsRewrite = true;
|
|
208
|
+
const len = this._selections.length;
|
|
209
|
+
let lastAdded;
|
|
210
|
+
let lastAdjustable;
|
|
211
|
+
let newPart = false;
|
|
212
|
+
let previousPresLevel = -1;
|
|
213
|
+
let positioning;
|
|
214
|
+
for (let i = 0; i < len; i++) {
|
|
215
|
+
const selection = this._selections[i];
|
|
216
|
+
if (selection.presentationLevel === 1) {
|
|
217
|
+
positioning = selection.hdecoPositioning;
|
|
218
|
+
}
|
|
219
|
+
if (selection.presentationLevel > previousPresLevel) {
|
|
220
|
+
selection.hdecoPositioning = selection.hdecoPositioning || positioning;
|
|
221
|
+
}
|
|
222
|
+
if (selection.decoNode) {
|
|
223
|
+
if (selection.decoNode.type === DecoNodeType.Variation) {
|
|
224
|
+
if (lastAdded) {
|
|
225
|
+
if (newPart) {
|
|
226
|
+
lastAdded.variations = [selection.decoNode];
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
lastAdded.variations.push(selection.decoNode);
|
|
230
|
+
}
|
|
231
|
+
newPart = false;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
if (globalVariationsRewrite) {
|
|
235
|
+
globalVariations.length = 0;
|
|
236
|
+
globalVariationsRewrite = false;
|
|
237
|
+
}
|
|
238
|
+
globalVariations.push(selection.decoNode);
|
|
239
|
+
}
|
|
240
|
+
// const variation: FurniturePartVariation = new FurniturePartVariation();
|
|
241
|
+
// variation.BrandId = selection.decoNode.brandId;
|
|
242
|
+
// variation.Description = selection.decoNode.gameObjectName;
|
|
243
|
+
// variation.MaterialId = (selection.decoNode as any).materialId;
|
|
244
|
+
// variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
|
|
245
|
+
// usedVariations.push(variation);
|
|
246
|
+
// this._upsertFurniture(this.activeInstance, {
|
|
247
|
+
// Variation: selection.decoNode.brandId,
|
|
248
|
+
// VariationDescription: selection.decoNode.gameObjectName,
|
|
249
|
+
// SupplierArticleNr: (selection.decoNode as any).supplierArticleNr
|
|
250
|
+
// });
|
|
251
|
+
}
|
|
252
|
+
else if (selection.decoNode.type === DecoNodeType.Part &&
|
|
253
|
+
typeof selection.decoNode.gameObjectName === 'string' &&
|
|
254
|
+
selection.decoNode.gameObjectName.length) {
|
|
255
|
+
if (selection.decoNode.kind === DecoNodeKind.Adjustable) {
|
|
256
|
+
selection.variations = globalVariations;
|
|
257
|
+
this._adjustables.push(selection);
|
|
258
|
+
if (!lastAdded || lastAdded.nodeId !== selection.nodeId) {
|
|
259
|
+
newPart = true;
|
|
260
|
+
}
|
|
261
|
+
lastAdded = selection;
|
|
262
|
+
lastAdjustable = selection;
|
|
263
|
+
}
|
|
264
|
+
else if (selection.decoNode.kind === DecoNodeKind.Addable) {
|
|
265
|
+
selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
|
|
266
|
+
if (lastAdjustable) {
|
|
267
|
+
lastAdjustable.addables.push(selection);
|
|
268
|
+
}
|
|
269
|
+
this._addables.push(selection);
|
|
270
|
+
if (!lastAdded || lastAdded.nodeId !== selection.nodeId) {
|
|
271
|
+
newPart = true;
|
|
272
|
+
}
|
|
273
|
+
lastAdded = selection;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
previousPresLevel = selection.presentationLevel;
|
|
278
|
+
}
|
|
279
|
+
// this._upsertFurniture(this.activeInstance,
|
|
280
|
+
// {Variations: usedVariations});
|
|
281
|
+
}
|
|
282
|
+
_createAdjustable(parent, adj) {
|
|
283
|
+
let obj = this._source ? this._source.getObjectByName(adj.decoNode.gameObjectName) : null;
|
|
284
|
+
if (!obj) {
|
|
285
|
+
// in case of glb files, the importer removes dots from names
|
|
286
|
+
const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
|
|
287
|
+
obj = this._source ? this._source.getObjectByName(name) : null;
|
|
288
|
+
if (!obj) {
|
|
289
|
+
// console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
let adjustable = obj.clone();
|
|
294
|
+
adjustable.name = this._createUniqueName(parent, obj);
|
|
295
|
+
adjustable.userData.selection = adj;
|
|
296
|
+
adjustable.position.set(0, 0, 0);
|
|
297
|
+
adjustable.visible = true;
|
|
298
|
+
parent.add(adjustable);
|
|
299
|
+
// the object being added to the customFloorGroup is being recreated so we loose the reference
|
|
300
|
+
// therefor we need to retrieve the created object again
|
|
301
|
+
// adjustable = parent.getObjectByName(adjustable.name);
|
|
302
|
+
this._placedAdjustables.push(adjustable);
|
|
303
|
+
return adjustable;
|
|
304
|
+
}
|
|
305
|
+
_createAddable(parent, add, part2, part1) {
|
|
306
|
+
const obj = this._source.getObjectByName(add.decoNode.gameObjectName);
|
|
307
|
+
if (!obj) {
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
// const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
|
|
311
|
+
const addable = obj.clone();
|
|
312
|
+
addable.name = this._createUniqueName(parent, obj);
|
|
313
|
+
addable.userData.selection = add;
|
|
314
|
+
addable.position.set(0, 0, 0);
|
|
315
|
+
addable.visible = true;
|
|
316
|
+
if (part1 && part2) {
|
|
317
|
+
parent.add(addable);
|
|
318
|
+
this._placedAddables.push(addable);
|
|
319
|
+
return addable;
|
|
320
|
+
}
|
|
321
|
+
return addable;
|
|
322
|
+
}
|
|
323
|
+
_placeAddables(parent) {
|
|
324
|
+
const len = this._placedAdjustables.length;
|
|
325
|
+
for (let i = 0; i < len; i++) {
|
|
326
|
+
if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
|
|
327
|
+
const adjustableSelection = this._placedAdjustables[i].userData.selection;
|
|
328
|
+
if (adjustableSelection) {
|
|
329
|
+
const lena = adjustableSelection.addables.length;
|
|
330
|
+
let conAddable;
|
|
331
|
+
for (let ia = 0; ia < lena; ia++) {
|
|
332
|
+
SceneUtils.TrySelectorConnection(this._scene, parent, this._placedAdjustables[i], adjustableSelection.addables[ia], (add, part2, part1) => this._createAddable(parent, add, part2, part1));
|
|
333
|
+
if (conAddable) {
|
|
334
|
+
SceneUtils.TrySelectorConnection(this._scene, parent, conAddable, adjustableSelection.addables[ia], (add, part2, part1) => this._createAddable(parent, add, part2, part1));
|
|
335
|
+
}
|
|
336
|
+
conAddable = this._placedAddables[this._placedAddables.length - 1];
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
_createUniqueName(parent, obj) {
|
|
343
|
+
let iteration = 0;
|
|
344
|
+
let name = obj.name;
|
|
345
|
+
let existingObj = parent.getObjectByName(name);
|
|
346
|
+
while (existingObj) {
|
|
347
|
+
iteration++;
|
|
348
|
+
name = obj.name + (iteration !== 0 ? ('_' + iteration) : '');
|
|
349
|
+
existingObj = parent.getObjectByName(name);
|
|
350
|
+
}
|
|
351
|
+
return name;
|
|
352
|
+
}
|
|
353
|
+
_getGoodIdFromSku(sku) {
|
|
354
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
355
|
+
const response = yield this._configuratorService.getGoodIdFromSku(sku, false);
|
|
356
|
+
if (response.validationResult.success && response.resultObject) {
|
|
357
|
+
return response.resultObject;
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
_getArticle(sku, goodId) {
|
|
362
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
363
|
+
if (this._articleCache.has(sku)) {
|
|
364
|
+
return this._articleCache.get(sku);
|
|
365
|
+
}
|
|
366
|
+
if (!goodId) {
|
|
367
|
+
goodId = yield this._getGoodIdFromSku(sku)
|
|
368
|
+
.catch((error) => {
|
|
369
|
+
throw `Article with sku ${sku} not found!`;
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
let article;
|
|
373
|
+
const articleResponse = yield this._configuratorService.getArticleQuickSel(goodId, false);
|
|
374
|
+
if (articleResponse.validationResult.success && articleResponse.resultObject) {
|
|
375
|
+
if (articleResponse.resultObject.hasOwnProperty('oArticle')) {
|
|
376
|
+
const obj = Array.isArray(articleResponse.resultObject['oArticle']) ? articleResponse.resultObject['oArticle'][0] : articleResponse.resultObject['oArticle'];
|
|
377
|
+
article = this._boFactory.makeWithRawBackendData(Article, obj);
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
article = this._boFactory.makeWithRawBackendData(Article, articleResponse.resultObject);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
this._articleCache.set(sku, article);
|
|
384
|
+
return article;
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
_getSelections(instanceId, publicationCode) {
|
|
388
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
389
|
+
this._selections = [];
|
|
390
|
+
const selectionResponse = yield this._configuratorService.getSelections(false, publicationCode);
|
|
391
|
+
if (selectionResponse.resultObjects && selectionResponse.resultObjects.length > 0) {
|
|
392
|
+
this._selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, selectionResponse.resultObjects);
|
|
393
|
+
this._selections.forEach(s => s.instanceId = instanceId);
|
|
394
|
+
// const filtered: Selection[] = this._selections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
|
|
395
|
+
this.selectionsReceived.next(this._selections);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
throw 'No selections found!';
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
_getDecos() {
|
|
403
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
404
|
+
this._decos = [];
|
|
405
|
+
const decosResponse = yield this._configuratorService.getDecos(false);
|
|
406
|
+
if (decosResponse.resultObjects && decosResponse.resultObjects.length > 0) {
|
|
407
|
+
this._decos = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, decosResponse.resultObjects);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
throw 'No deconodes found!';
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
_linkSelectionsAndDecos() {
|
|
415
|
+
const len = this._selections.length;
|
|
416
|
+
for (let i = 0; i < len; i++) {
|
|
417
|
+
let id = this._selections[i].artNodeIdDeco;
|
|
418
|
+
// if (this._useNodeIdToLink) {
|
|
419
|
+
// id = `${this._selections[i].node}_${this._selections[i].artNodeIdDeco}`;
|
|
420
|
+
// }
|
|
421
|
+
let deco = this._decos.find(d => d.id === id);
|
|
422
|
+
if (!deco) {
|
|
423
|
+
deco = new DecoNode();
|
|
424
|
+
}
|
|
425
|
+
const variation = this._getVariations().find(v => v.parentId === this._selections[i].artNodeIdDeco);
|
|
426
|
+
if (variation) {
|
|
427
|
+
deco.variation = variation;
|
|
428
|
+
}
|
|
429
|
+
this._selections[i].decoNode = deco;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
_getVariations() {
|
|
433
|
+
return this._decos.filter((deco) => {
|
|
434
|
+
return deco.type === DecoNodeType.Variation;
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
_loadVariations(obj, instanceId) {
|
|
438
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
439
|
+
yield this._variationHelper.loadPart(obj, this._adjustables, true);
|
|
440
|
+
yield this._variationHelper.loadVariation(instanceId, obj, this._adjustables, true);
|
|
441
|
+
yield this._variationHelper.loadVariation(instanceId, obj, this._addables, true);
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
_getAdjustables() {
|
|
445
|
+
return this._selections.filter(s => {
|
|
446
|
+
const node = s.decoNode;
|
|
447
|
+
return node && node.gameObjectName && node.type === DecoNodeType.Part && node.kind === DecoNodeKind.Adjustable;
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
_updatePivot(obj) {
|
|
451
|
+
const boundingBox = new THREE.Box3().setFromObject(obj);
|
|
452
|
+
const bbCenterPivot = new THREE.Vector3();
|
|
453
|
+
boundingBox.getCenter(bbCenterPivot);
|
|
454
|
+
const delta = new THREE.Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
|
|
455
|
+
obj.children.forEach((child) => {
|
|
456
|
+
child.position.add(delta);
|
|
457
|
+
});
|
|
458
|
+
obj.updateWorldMatrix(false, true);
|
|
459
|
+
}
|
|
460
|
+
_reset() {
|
|
461
|
+
this._placedAddables.length = 0;
|
|
462
|
+
this._placedAdjustables.length = 0;
|
|
463
|
+
this._adjustables.length = 0;
|
|
464
|
+
this._addables.length = 0;
|
|
465
|
+
this._prepareTheSelections();
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
Builder.ctorParameters = () => [
|
|
469
|
+
{ type: Scene },
|
|
470
|
+
{ type: Options },
|
|
471
|
+
{ type: Boolean }
|
|
472
|
+
];
|
|
473
|
+
Builder = __decorate([
|
|
474
|
+
Injectable()
|
|
475
|
+
], Builder);
|
|
476
|
+
export { Builder };
|
|
477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBRXBFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUNwRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDMUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUM1QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTFELElBQWEsT0FBTyxHQUFwQixNQUFhLE9BQU87SUF5QmhCLFlBQVksS0FBWSxFQUFFLE9BQWdCLEVBQUUsWUFBcUI7UUF2QjFELHVCQUFrQixHQUFpQyxJ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O0lBRU8sTUFBTTtRQUNWLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSixDQUFBOztZQWpic0IsS0FBSztZQUFXLE9BQU87OztBQXpCakMsT0FBTztJQURuQixVQUFVLEVBQUU7R0FDQSxPQUFPLENBMGNuQjtTQTFjWSxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7T3B0aW9uc30gZnJvbSBcIkBjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL29wdGlvbnNcIjtcclxuaW1wb3J0IHtEYXRhU2VydmljZVJlc3BvbnNlRGF0YX0gZnJvbSBcIkBjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhXCI7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZVwiO1xyXG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSBcIkBjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL3NlcnZpY2UvYnVzaW5lc3Mtb2JqZWN0LWZhY3RvcnlcIjtcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvblwiO1xyXG5pbXBvcnQge0RlY29Ob2RlVHlwZX0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUtdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7VGhyZWVkVXRpbHN9IGZyb20gXCIuLi91dGlscy90aHJlZWQudXRpbHNcIjtcclxuaW1wb3J0IHtEZWNvTm9kZUtpbmR9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLWtpbmQuZW51bVwiO1xyXG5pbXBvcnQge1NjZW5lVXRpbHN9IGZyb20gXCIuLi91dGlscy9zY2VuZS11dGlsc1wiO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkhlbHBlcn0gZnJvbSBcIi4uL2hlbHBlci92YXJpYXRpb24taGVscGVyXCI7XHJcbmltcG9ydCB7QXJ0aWNsZX0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZVwiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvclNlcnZpY2V9IGZyb20gJy4vc2VydmljZXMvY29uZmlndXJhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lfSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QW5zd2VyfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Fuc3dlcic7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0fSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtTZXJ2aWNlTG9jYXRvcn0gZnJvbSAnLi9zZXJ2aWNlcy9sb2NhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge1F1ZXN0aW9uQW5kQW5zd2Vyc30gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9xdWVzdGlvbi1hbmQtYW5zd2Vycyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0aW9uc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25bXT4oW10pO1xyXG4gICAgcHVibGljIGFuc3dlcnNSZWNlaXZlZDogQmVoYXZpb3JTdWJqZWN0PEFuc3dlcltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QW5zd2VyW10+KFtdKTtcclxuICAgIHB1YmxpYyBtb2RlbExvYWRlZDogQmVoYXZpb3JTdWJqZWN0PFRIUkVFLk9iamVjdDNEPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEhSRUUuT2JqZWN0M0Q+KG51bGwpO1xyXG5cclxuICAgIHByaXZhdGUgX3NjZW5lOiBUSFJFRS5TY2VuZTtcclxuICAgIHByaXZhdGUgX2luc3RhbmNlSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NrdTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfZ29vZElkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfYW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuICAgIHByaXZhdGUgX2RlY29zOiBEZWNvTm9kZVtdID0gW107XHJcbiAgICBwcml2YXRlIF9wbGFjZWRBZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgX3BsYWNlZEFkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfYWRqdXN0YWJsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9hZGRhYmxlczogYW55W10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIF9ib0ZhY3Rvcnk6IEJ1c2luZXNzT2JqZWN0RmFjdG9yeTtcclxuICAgIHByaXZhdGUgX3NvdXJjZTogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgICBwcml2YXRlIF90aHJlZWRVdGlsczogVGhyZWVkVXRpbHM7XHJcbiAgICBwcml2YXRlIF92YXJpYXRpb25IZWxwZXI6IFZhcmlhdGlvbkhlbHBlcjtcclxuICAgIHByaXZhdGUgX2FydGljbGVDYWNoZTogTWFwPHN0cmluZywgQXJ0aWNsZT4gPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIF9jb25maWd1cmF0b3JTZXJ2aWNlOiBDb25maWd1cmF0b3JTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNjZW5lOiBTY2VuZSwgb3B0aW9uczogT3B0aW9ucywgdXNlSW5Bbmd1bGFyOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fYm9GYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG4gICAgICAgIHRoaXMuX3RocmVlZFV0aWxzID0gbmV3IFRocmVlZFV0aWxzKCk7XHJcbiAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyID0gbmV3IFZhcmlhdGlvbkhlbHBlcigpO1xyXG5cclxuICAgICAgICBpZiAoIXNjZW5lKSB7XHJcbiAgICAgICAgICAgIHRocm93ICdObyBzY2VuZSBvYmplY3QgcHJvdmlkZWQhJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRocm93ICdObyBjb25uZWN0aW9uIG9wdGlvbnMgcHJvdmlkZWQhJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVzZUluQW5ndWxhcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlID0gU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KENvbmZpZ3VyYXRvclNlcnZpY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UgPSBuZXcgQ29uZmlndXJhdG9yU2VydmljZSh1bmRlZmluZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXRBcGkob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5fc2NlbmUgPSBzY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYnVpbGRNb2RlbChza3U/OiBzdHJpbmcsIGluc3RhbmNlSWQ/OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX3NjZW5lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0SW5zdGFuY2VJZChza3UsIGluc3RhbmNlSWQsIGdvb2RJZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVDb25maWd1cmF0aW9uKHRoaXMuX3NrdSwgdGhpcy5fZ29vZElkKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHRoaXMuX2luc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCkpO1xyXG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl9nZXRTZWxlY3Rpb25zKHRoaXMuX2luc3RhbmNlSWQpKTtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0RGVjb3MoKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYW5zd2Vycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkKHRoaXMuX2luc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ0dMQiBzb3VyY2Ugbm90IGZvdW5kISc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0Tm9kZUluc3RhbmNlKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5pbml0Tm9kZUluc3RhbmNlKGdvb2RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGhyZWVkVXRpbHMuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2Uuc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFF1ZXN0aW9uQW5kQW5zd2VycyhwdWJsaWNhdGlvbkNvZGU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBxdWVzdGlvbnNBbmRBbnN3ZXJzOiBRdWVzdGlvbkFuZEFuc3dlcnMgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFF1ZXN0aW9uQW5kQW5zd2VycyhmYWxzZSwgcHVibGljYXRpb25Db2RlKTtcclxuICAgICAgICB0aGlzLl9hbnN3ZXJzID0gcXVlc3Rpb25zQW5kQW5zd2Vycy5hbnN3ZXJzO1xyXG4gICAgICAgIHRoaXMuYW5zd2Vyc1JlY2VpdmVkLm5leHQocXVlc3Rpb25zQW5kQW5zd2Vycy5hbnN3ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5tb2RlbExvYWRlZC5uZXh0KGF3YWl0IHRoaXMuYnVpbGRNb2RlbCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9zZXRJbnN0YW5jZUlkKHNrdTogc3RyaW5nLCBpbnN0YW5jZUlkPzogc3RyaW5nLCBnb29kSWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoIWluc3RhbmNlSWQgJiYgIXRoaXMuX2luc3RhbmNlSWQpIHtcclxuICAgICAgICAgICAgaWYgKCFnb29kSWQpIHtcclxuICAgICAgICAgICAgICAgIGdvb2RJZCA9IGF3YWl0IHRoaXMuX2dldEdvb2RJZEZyb21Ta3Uoc2t1KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9nb29kSWQgPSBnb29kSWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmluaXROb2RlSW5zdGFuY2UodGhpcy5fZ29vZElkKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YW5jZUlkID0gcmVzdWx0LnJlc3VsdE9iamVjdDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93ICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBub2RlIGluc3RhbmNlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2luc3RhbmNlSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fc2t1KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NrdSA9IHNrdTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IGFydGljbGU6IEFydGljbGUgPSBhd2FpdCB0aGlzLl9nZXRBcnRpY2xlKHNrdSwgZ29vZElkKTtcclxuICAgICAgICBpZiAoYXJ0aWNsZSAmJiBhcnRpY2xlLmFzc2V0VXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZSA9IGF3YWl0IHRoaXMuX3RocmVlZFV0aWxzLmRvd25sb2FkM0RTb3VyY2UoYXJ0aWNsZS5hc3NldFVybClcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5hc3NldFBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsICtcclxuICAgICAgICAgICAgICAgICAgICAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwuZW5kc1dpdGgoJy8nKSA/ICcnIDogJy8nKSArXHJcbiAgICAgICAgICAgICAgICAgICAgKGFydGljbGUuZGlzdFNjaGVtYSA/IGFydGljbGUuZGlzdFNjaGVtYSA6ICdVUF9EQkEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9idWlsZChpbnN0YW5jZUlkOiBzdHJpbmcpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlczogU2VsZWN0aW9uW10gPSB0aGlzLl9nZXRBZGp1c3RhYmxlcygpO1xyXG4gICAgICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgICAgICAgICAgb2JqLnZpc2libGUgPSBmYWxzZTsgLy8gbm8gbmVlZCB0byByZW5kZXIgdmlzdWFseVxyXG4gICAgICAgICAgICB0aGlzLl9zY2VuZS5hZGQob2JqKTtcclxuICAgICAgICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSBhZGp1c3RhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0YWJsZTogVEhSRUUuT2JqZWN0M0QgPSB0aGlzLl9jcmVhdGVBZGp1c3RhYmxlKG9iaiwgYWRqdXN0YWJsZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpaSA9IDAsIGxlbmlpOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7IGlpIDwgbGVuaWk7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0sIGFkanVzdGFibGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY29ubmVjdGVkICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGNvbm5lY3Rpb24gZm91bmQgZm9yOiAnLCBhZGp1c3RhYmxlLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3BsYWNlQWRkYWJsZXMob2JqKTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGl2b3Qob2JqKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZFZhcmlhdGlvbnMob2JqLCBpbnN0YW5jZUlkKTtcclxuICAgICAgICAgICAgdGhpcy5fc2NlbmUucmVtb3ZlKG9iaik7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIGFkanVzdGFibGVzIGZvdW5kISc7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2J1aWxkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPUycsIGRlc2NyaXB0aW9uOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJ30pO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zfSk7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy5kZWNvcy5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TJywgZGVzY3JpcHRpb246ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob0RlY29Ob2Rlc30pO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fQURKVVNUQUJMRVMnLCBkZXNjcmlwdGlvbjogJ05PX0FESlVTVEFCTEVTX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob0FkanVzdGFibGVzfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gZ2V0IGdlbmVyaWMgdmFyaWF0aW9uc1xyXG4gICAgICAgIGNvbnN0IGdsb2JhbFZhcmlhdGlvbnM6IERlY29Ob2RlW10gPSB0aGlzLl9zZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmdlbmVyaWMgJiYgKHMuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24gJiYgIXMuZGVjb05vZGUudHlwZSlcclxuICAgICAgICAgICAgLm1hcCgodmFsdWU6IFNlbGVjdGlvbiwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uaWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5tYXRlcmlhbElkID0gdmFsdWUuaGRlY29HYW1lT2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgICAgICBsZXQgZ2xvYmFsVmFyaWF0aW9uc1Jld3JpdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgbGFzdEFkanVzdGFibGU6IFNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgbmV3UGFydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uaW5nOiBhbnk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3NlbGVjdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWwgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA+IHByZXZpb3VzUHJlc0xldmVsKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0QWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zID0gW3NlbGVjdGlvbi5kZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucy5wdXNoKHNlbGVjdGlvbi5kZWNvTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9uc1Jld3JpdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zLnB1c2goc2VsZWN0aW9uLmRlY29Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgdmFyaWF0aW9uOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24uQnJhbmRJZCA9IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5EZXNjcmlwdGlvbiA9IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24uTWF0ZXJpYWxJZCA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5TdXBwbGllckFydGljbGVOciA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICAgICAgICAvLyB1c2VkVmFyaWF0aW9ucy5wdXNoKHZhcmlhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdXBzZXJ0RnVybml0dXJlKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgVmFyaWF0aW9uOiBzZWxlY3Rpb24uZGVjb05vZGUuYnJhbmRJZCxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgVmFyaWF0aW9uRGVzY3JpcHRpb246IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgU3VwcGxpZXJBcnRpY2xlTnI6IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOclxyXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCBsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RBZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCBsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZpb3VzUHJlc0xldmVsID0gc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSxcclxuICAgICAgICAvLyAgIHtWYXJpYXRpb25zOiB1c2VkVmFyaWF0aW9uc30pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZUFkanVzdGFibGUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgYWRqOiBTZWxlY3Rpb24pOiBUSFJFRS5PYmplY3QzRCB7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpIDogbnVsbDtcclxuICAgICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgICAgICAgb2JqID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShuYW1lKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oYE5vIG9iamVjdCB3aXRoIG5hbWUgJHthZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWV9IGZvdW5kIWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgICAgIGFkanVzdGFibGUubmFtZSA9IHRoaXMuX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50LCBvYmopO1xyXG4gICAgICAgIGFkanVzdGFibGUudXNlckRhdGEuc2VsZWN0aW9uID0gYWRqO1xyXG4gICAgICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgcGFyZW50LmFkZChhZGp1c3RhYmxlKTtcclxuICAgICAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAgICAgLy8gdGhlcmVmb3Igd2UgbmVlZCB0byByZXRyaWV2ZSB0aGUgY3JlYXRlZCBvYmplY3QgYWdhaW5cclxuICAgICAgICAvLyBhZGp1c3RhYmxlID0gcGFyZW50LmdldE9iamVjdEJ5TmFtZShhZGp1c3RhYmxlLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICAgICAgcmV0dXJuIGFkanVzdGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlQWRkYWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGQ6IFNlbGVjdGlvbiwgcGFydDI/OiBhbnksIHBhcnQxPzogYW55KTogVEhSRUUuT2JqZWN0M0Qge1xyXG4gICAgICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgY29uc3QgYWRkYWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICAgICAgYWRkYWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICAgICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICAgICAgYWRkYWJsZS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgYWRkYWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgICAgICAgcGFyZW50LmFkZChhZGRhYmxlKTtcclxuICAgICAgICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMucHVzaChhZGRhYmxlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhZGRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3BsYWNlQWRkYWJsZXMocGFyZW50OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLmhhc093blByb3BlcnR5KCdzZWxlY3Rpb24nKSAmJiB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGFibGVTZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChhZGp1c3RhYmxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuYTogbnVtYmVyID0gYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbkFkZGFibGU6IGFueTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpYSA9IDA7IGlhIDwgbGVuYTsgaWErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0sIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUocGFyZW50LCBhZGQsIHBhcnQyLCBwYXJ0MSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uQWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBjb25BZGRhYmxlLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVVbmlxdWVOYW1lKHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIG9iajogVEhSRUUuT2JqZWN0M0QpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIGxldCBuYW1lID0gb2JqLm5hbWU7XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nT2JqID0gcGFyZW50LmdldE9iamVjdEJ5TmFtZShuYW1lKTtcclxuICAgICAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgICAgICAgIG5hbWUgPSBvYmoubmFtZSArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgICAgICAgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRHb29kSWRGcm9tU2t1KHNrdTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEdvb2RJZEZyb21Ta3Uoc2t1LCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0QXJ0aWNsZShza3U6IHN0cmluZywgZ29vZElkOiBudW1iZXIpOiBQcm9taXNlPEFydGljbGU+IHtcclxuICAgICAgICBpZiAodGhpcy5fYXJ0aWNsZUNhY2hlLmhhcyhza3UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlQ2FjaGUuZ2V0KHNrdSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZ29vZElkKSB7XHJcbiAgICAgICAgICAgIGdvb2RJZCA9IGF3YWl0IHRoaXMuX2dldEdvb2RJZEZyb21Ta3Uoc2t1KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGBBcnRpY2xlIHdpdGggc2t1ICR7c2t1fSBub3QgZm91bmQhYDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYXJ0aWNsZTogQXJ0aWNsZTtcclxuICAgICAgICBjb25zdCBhcnRpY2xlUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGFydGljbGVSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MgJiYgYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAoYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb0FydGljbGUnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gQXJyYXkuaXNBcnJheShhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddKSA/IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ11bMF0gOiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddO1xyXG4gICAgICAgICAgICAgICAgYXJ0aWNsZSA9IDxBcnRpY2xlPnRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGUsIG9iaik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcnRpY2xlID0gPEFydGljbGU+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZSwgYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYXJ0aWNsZUNhY2hlLnNldChza3UsIGFydGljbGUpO1xyXG4gICAgICAgIHJldHVybiBhcnRpY2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2dldFNlbGVjdGlvbnMoaW5zdGFuY2VJZDogc3RyaW5nLCBwdWJsaWNhdGlvbkNvZGU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25zID0gW107XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRTZWxlY3Rpb25zKGZhbHNlLCBwdWJsaWNhdGlvbkNvZGUpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzICYmIHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25zID0gPFNlbGVjdGlvbltdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KFNlbGVjdGlvbiwgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnMuZm9yRWFjaChzID0+IHMuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICAvLyBjb25zdCBmaWx0ZXJlZDogU2VsZWN0aW9uW10gPSB0aGlzLl9zZWxlY3Rpb25zLmZpbHRlcihzID0+IHMubm9kZVR5cGUgIT09IE5vZGVUeXBlLkFydGljbGUgJiYgcy5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uc1JlY2VpdmVkLm5leHQodGhpcy5fc2VsZWN0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIHNlbGVjdGlvbnMgZm91bmQhJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fZGVjb3MgPSBbXTtcclxuICAgICAgICBjb25zdCBkZWNvc1Jlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0RGVjb3MoZmFsc2UpO1xyXG4gICAgICAgIGlmIChkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgZGVjb3NSZXNwb25zZS5yZXN1bHRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVjb3MgPSA8RGVjb05vZGVbXT50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShEZWNvTm9kZSwgZGVjb3NSZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gZGVjb25vZGVzIGZvdW5kISc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xpbmtTZWxlY3Rpb25zQW5kRGVjb3MoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpZDogc3RyaW5nID0gdGhpcy5fc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvO1xyXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5fdXNlTm9kZUlkVG9MaW5rKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBpZCA9IGAke3RoaXMuX3NlbGVjdGlvbnNbaV0ubm9kZX1fJHt0aGlzLl9zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY299YDtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICBsZXQgZGVjbzogYW55ID0gdGhpcy5fZGVjb3MuZmluZChkID0+IGQuaWQgPT09IGlkKTtcclxuICAgICAgICAgICAgaWYgKCFkZWNvKSB7XHJcbiAgICAgICAgICAgICAgICBkZWNvID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSB0aGlzLl9nZXRWYXJpYXRpb25zKCkuZmluZCh2ID0+IHYucGFyZW50SWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGRlY28udmFyaWF0aW9uID0gdmFyaWF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnNbaV0uZGVjb05vZGUgPSBkZWNvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRWYXJpYXRpb25zKCk6IERlY29Ob2RlW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvcy5maWx0ZXIoKGRlY286IERlY29Ob2RlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWNvLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZFZhcmlhdGlvbnMob2JqOiBUSFJFRS5PYmplY3QzRCwgaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRQYXJ0KG9iaiwgdGhpcy5fYWRqdXN0YWJsZXMsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5sb2FkVmFyaWF0aW9uKGluc3RhbmNlSWQsIG9iaiwgdGhpcy5fYWRqdXN0YWJsZXMsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5sb2FkVmFyaWF0aW9uKGluc3RhbmNlSWQsIG9iaiwgdGhpcy5fYWRkYWJsZXMsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldEFkanVzdGFibGVzKCk6IFNlbGVjdGlvbltdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IERlY29Ob2RlID0gcy5kZWNvTm9kZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5nYW1lT2JqZWN0TmFtZSAmJiBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmIG5vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlUGl2b3Qob2JqOiBUSFJFRS5PYmplY3QzRCkge1xyXG4gICAgICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XHJcbiAgICAgICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xyXG4gICAgICAgIGNvbnN0IGRlbHRhOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5zdWIoYmJDZW50ZXJQaXZvdCkuc2V0WShNYXRoLmFicyhNYXRoLm1pbihib3VuZGluZ0JveC5taW4ueSwgMCkpKTtcclxuXHJcbiAgICAgICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQucG9zaXRpb24uYWRkKGRlbHRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBvYmoudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Jlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|