@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,591 @@
|
|
|
1
|
+
import { __awaiter, __decorate, __generator } 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
|
+
var Builder = /** @class */ (function () {
|
|
19
|
+
function Builder(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
|
+
Builder.prototype.buildModel = function (sku, instanceId, goodId) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
51
|
+
var promises, e_1;
|
|
52
|
+
return __generator(this, function (_a) {
|
|
53
|
+
switch (_a.label) {
|
|
54
|
+
case 0:
|
|
55
|
+
if (!this._scene) {
|
|
56
|
+
return [2 /*return*/];
|
|
57
|
+
}
|
|
58
|
+
_a.label = 1;
|
|
59
|
+
case 1:
|
|
60
|
+
_a.trys.push([1, 8, , 9]);
|
|
61
|
+
return [4 /*yield*/, this._setInstanceId(sku, instanceId, goodId)];
|
|
62
|
+
case 2:
|
|
63
|
+
_a.sent();
|
|
64
|
+
return [4 /*yield*/, this._prepareConfiguration(this._sku, this._goodId)];
|
|
65
|
+
case 3:
|
|
66
|
+
_a.sent();
|
|
67
|
+
if (!this._source) return [3 /*break*/, 6];
|
|
68
|
+
return [4 /*yield*/, this._configuratorService.setInstanceToConfigure(this._instanceId)];
|
|
69
|
+
case 4:
|
|
70
|
+
_a.sent();
|
|
71
|
+
promises = [];
|
|
72
|
+
promises.push(this.getQuestionAndAnswers());
|
|
73
|
+
promises.push(this._getSelections(this._instanceId));
|
|
74
|
+
promises.push(this._getDecos());
|
|
75
|
+
return [4 /*yield*/, Promise.all(promises)];
|
|
76
|
+
case 5:
|
|
77
|
+
_a.sent();
|
|
78
|
+
if (this._answers.length > 0) {
|
|
79
|
+
return [2 /*return*/];
|
|
80
|
+
}
|
|
81
|
+
this._linkSelectionsAndDecos();
|
|
82
|
+
return [2 /*return*/, this._build(this._instanceId)];
|
|
83
|
+
case 6: throw 'GLB source not found!';
|
|
84
|
+
case 7: return [3 /*break*/, 9];
|
|
85
|
+
case 8:
|
|
86
|
+
e_1 = _a.sent();
|
|
87
|
+
throw e_1;
|
|
88
|
+
case 9: return [2 /*return*/];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
Builder.prototype.initNodeInstance = function (goodId) {
|
|
94
|
+
return this._configuratorService.initNodeInstance(goodId);
|
|
95
|
+
};
|
|
96
|
+
Builder.prototype.destroy = function () {
|
|
97
|
+
this._threedUtils.clearCache();
|
|
98
|
+
this._variationHelper.clearCache();
|
|
99
|
+
};
|
|
100
|
+
Builder.prototype.selectSelection = function (selection) {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
102
|
+
return __generator(this, function (_a) {
|
|
103
|
+
switch (_a.label) {
|
|
104
|
+
case 0: return [4 /*yield*/, this._configuratorService.selectSelection(selection, false)];
|
|
105
|
+
case 1:
|
|
106
|
+
_a.sent();
|
|
107
|
+
this.getQuestionAndAnswers();
|
|
108
|
+
return [2 /*return*/];
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
Builder.prototype.getQuestionAndAnswers = function (publicationCode) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
115
|
+
var questionsAndAnswers;
|
|
116
|
+
return __generator(this, function (_a) {
|
|
117
|
+
switch (_a.label) {
|
|
118
|
+
case 0: return [4 /*yield*/, this._configuratorService.getQuestionAndAnswers(false, publicationCode)];
|
|
119
|
+
case 1:
|
|
120
|
+
questionsAndAnswers = _a.sent();
|
|
121
|
+
this._answers = questionsAndAnswers.answers;
|
|
122
|
+
this.answersReceived.next(questionsAndAnswers.answers);
|
|
123
|
+
return [2 /*return*/];
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
Builder.prototype.selectAnswer = function (answer) {
|
|
129
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
130
|
+
var _a, _b;
|
|
131
|
+
return __generator(this, function (_c) {
|
|
132
|
+
switch (_c.label) {
|
|
133
|
+
case 0: return [4 /*yield*/, this._configuratorService.selectAnswer(answer, false)];
|
|
134
|
+
case 1:
|
|
135
|
+
_c.sent();
|
|
136
|
+
_b = (_a = this.modelLoaded).next;
|
|
137
|
+
return [4 /*yield*/, this.buildModel()];
|
|
138
|
+
case 2:
|
|
139
|
+
_b.apply(_a, [_c.sent()]);
|
|
140
|
+
return [2 /*return*/];
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
Builder.prototype._setInstanceId = function (sku, instanceId, goodId) {
|
|
146
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
147
|
+
var result;
|
|
148
|
+
return __generator(this, function (_a) {
|
|
149
|
+
switch (_a.label) {
|
|
150
|
+
case 0:
|
|
151
|
+
if (!(!instanceId && !this._instanceId)) return [3 /*break*/, 4];
|
|
152
|
+
if (!!goodId) return [3 /*break*/, 2];
|
|
153
|
+
return [4 /*yield*/, this._getGoodIdFromSku(sku)];
|
|
154
|
+
case 1:
|
|
155
|
+
goodId = _a.sent();
|
|
156
|
+
_a.label = 2;
|
|
157
|
+
case 2:
|
|
158
|
+
this._goodId = goodId;
|
|
159
|
+
return [4 /*yield*/, this.initNodeInstance(this._goodId)];
|
|
160
|
+
case 3:
|
|
161
|
+
result = _a.sent();
|
|
162
|
+
if (result && result.resultObject) {
|
|
163
|
+
this._instanceId = result.resultObject;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
throw 'Failed to initialize node instance';
|
|
167
|
+
}
|
|
168
|
+
return [3 /*break*/, 5];
|
|
169
|
+
case 4:
|
|
170
|
+
if (!this._instanceId) {
|
|
171
|
+
this._instanceId = instanceId;
|
|
172
|
+
}
|
|
173
|
+
_a.label = 5;
|
|
174
|
+
case 5:
|
|
175
|
+
if (!this._sku) {
|
|
176
|
+
this._sku = sku;
|
|
177
|
+
}
|
|
178
|
+
return [2 /*return*/];
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
Builder.prototype._prepareConfiguration = function (sku, goodId) {
|
|
184
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
185
|
+
var article, _a;
|
|
186
|
+
return __generator(this, function (_b) {
|
|
187
|
+
switch (_b.label) {
|
|
188
|
+
case 0: return [4 /*yield*/, this._getArticle(sku, goodId)];
|
|
189
|
+
case 1:
|
|
190
|
+
article = _b.sent();
|
|
191
|
+
if (!(article && article.assetUrl)) return [3 /*break*/, 3];
|
|
192
|
+
_a = this;
|
|
193
|
+
return [4 /*yield*/, this._threedUtils.download3DSource(article.assetUrl)
|
|
194
|
+
.catch(function (error) {
|
|
195
|
+
throw error;
|
|
196
|
+
})];
|
|
197
|
+
case 2:
|
|
198
|
+
_a._source = _b.sent();
|
|
199
|
+
if (article.contentDeliveryUrl) {
|
|
200
|
+
this._variationHelper.assetPath =
|
|
201
|
+
article.contentDeliveryUrl +
|
|
202
|
+
(article.contentDeliveryUrl.endsWith('/') ? '' : '/') +
|
|
203
|
+
(article.distSchema ? article.distSchema : 'UP_DBA');
|
|
204
|
+
}
|
|
205
|
+
_b.label = 3;
|
|
206
|
+
case 3: return [2 /*return*/];
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
Builder.prototype._build = function (instanceId) {
|
|
212
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
213
|
+
var adjustables, obj, connected, i, len, adjustable, ii, lenii;
|
|
214
|
+
return __generator(this, function (_a) {
|
|
215
|
+
switch (_a.label) {
|
|
216
|
+
case 0:
|
|
217
|
+
this._reset();
|
|
218
|
+
adjustables = this._getAdjustables();
|
|
219
|
+
if (!(adjustables && adjustables.length > 0)) return [3 /*break*/, 2];
|
|
220
|
+
obj = new THREE.Object3D();
|
|
221
|
+
obj.visible = false; // no need to render visualy
|
|
222
|
+
this._scene.add(obj);
|
|
223
|
+
connected = false;
|
|
224
|
+
for (i = 0, len = adjustables.length; i < len; i++) {
|
|
225
|
+
adjustable = this._createAdjustable(obj, adjustables[i]);
|
|
226
|
+
if (adjustable) {
|
|
227
|
+
for (ii = 0, lenii = this._placedAdjustables.length; ii < lenii; ii++) {
|
|
228
|
+
if (SceneUtils.TrySelectorConnection(this._scene, obj, this._placedAdjustables[ii], adjustable)) {
|
|
229
|
+
this._placedAdjustables[ii].visible = true;
|
|
230
|
+
adjustable.visible = true;
|
|
231
|
+
connected = true;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
connected = false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (!connected && this._placedAdjustables.length > 1) {
|
|
238
|
+
console.warn('No connection found for: ', adjustable.name);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
this._placeAddables(obj);
|
|
242
|
+
this._updatePivot(obj);
|
|
243
|
+
return [4 /*yield*/, this._loadVariations(obj, instanceId)];
|
|
244
|
+
case 1:
|
|
245
|
+
_a.sent();
|
|
246
|
+
this._scene.remove(obj);
|
|
247
|
+
return [2 /*return*/, obj];
|
|
248
|
+
case 2: throw 'No adjustables found!';
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
};
|
|
253
|
+
Builder.prototype._prepareTheSelections = function () {
|
|
254
|
+
var _this = this;
|
|
255
|
+
// get generic variations
|
|
256
|
+
var globalVariations = this._selections
|
|
257
|
+
.filter(function (s) { return s.generic && s.decoNode.variation && !s.decoNode.type; })
|
|
258
|
+
.map(function (value, index, array) {
|
|
259
|
+
// find selection of variation
|
|
260
|
+
var sel = _this._selections.find(function (s) { return s.artNodeIdDeco === value.decoNode.variation.id; });
|
|
261
|
+
if (sel) {
|
|
262
|
+
value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
|
|
263
|
+
}
|
|
264
|
+
value.decoNode.variation.materialId = value.hdecoGameObject;
|
|
265
|
+
return value.decoNode.variation;
|
|
266
|
+
});
|
|
267
|
+
// const usedVariations: FurniturePartVariation[] = [];
|
|
268
|
+
var globalVariationsRewrite = true;
|
|
269
|
+
var len = this._selections.length;
|
|
270
|
+
var lastAdded;
|
|
271
|
+
var lastAdjustable;
|
|
272
|
+
var newPart = false;
|
|
273
|
+
var previousPresLevel = -1;
|
|
274
|
+
var positioning;
|
|
275
|
+
for (var i = 0; i < len; i++) {
|
|
276
|
+
var selection = this._selections[i];
|
|
277
|
+
if (selection.presentationLevel === 1) {
|
|
278
|
+
positioning = selection.hdecoPositioning;
|
|
279
|
+
}
|
|
280
|
+
if (selection.presentationLevel > previousPresLevel) {
|
|
281
|
+
selection.hdecoPositioning = selection.hdecoPositioning || positioning;
|
|
282
|
+
}
|
|
283
|
+
if (selection.decoNode) {
|
|
284
|
+
if (selection.decoNode.type === DecoNodeType.Variation) {
|
|
285
|
+
if (lastAdded) {
|
|
286
|
+
if (newPart) {
|
|
287
|
+
lastAdded.variations = [selection.decoNode];
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
lastAdded.variations.push(selection.decoNode);
|
|
291
|
+
}
|
|
292
|
+
newPart = false;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
if (globalVariationsRewrite) {
|
|
296
|
+
globalVariations.length = 0;
|
|
297
|
+
globalVariationsRewrite = false;
|
|
298
|
+
}
|
|
299
|
+
globalVariations.push(selection.decoNode);
|
|
300
|
+
}
|
|
301
|
+
// const variation: FurniturePartVariation = new FurniturePartVariation();
|
|
302
|
+
// variation.BrandId = selection.decoNode.brandId;
|
|
303
|
+
// variation.Description = selection.decoNode.gameObjectName;
|
|
304
|
+
// variation.MaterialId = (selection.decoNode as any).materialId;
|
|
305
|
+
// variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
|
|
306
|
+
// usedVariations.push(variation);
|
|
307
|
+
// this._upsertFurniture(this.activeInstance, {
|
|
308
|
+
// Variation: selection.decoNode.brandId,
|
|
309
|
+
// VariationDescription: selection.decoNode.gameObjectName,
|
|
310
|
+
// SupplierArticleNr: (selection.decoNode as any).supplierArticleNr
|
|
311
|
+
// });
|
|
312
|
+
}
|
|
313
|
+
else if (selection.decoNode.type === DecoNodeType.Part &&
|
|
314
|
+
typeof selection.decoNode.gameObjectName === 'string' &&
|
|
315
|
+
selection.decoNode.gameObjectName.length) {
|
|
316
|
+
if (selection.decoNode.kind === DecoNodeKind.Adjustable) {
|
|
317
|
+
selection.variations = globalVariations;
|
|
318
|
+
this._adjustables.push(selection);
|
|
319
|
+
if (!lastAdded || lastAdded.nodeId !== selection.nodeId) {
|
|
320
|
+
newPart = true;
|
|
321
|
+
}
|
|
322
|
+
lastAdded = selection;
|
|
323
|
+
lastAdjustable = selection;
|
|
324
|
+
}
|
|
325
|
+
else if (selection.decoNode.kind === DecoNodeKind.Addable) {
|
|
326
|
+
selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
|
|
327
|
+
if (lastAdjustable) {
|
|
328
|
+
lastAdjustable.addables.push(selection);
|
|
329
|
+
}
|
|
330
|
+
this._addables.push(selection);
|
|
331
|
+
if (!lastAdded || lastAdded.nodeId !== selection.nodeId) {
|
|
332
|
+
newPart = true;
|
|
333
|
+
}
|
|
334
|
+
lastAdded = selection;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
previousPresLevel = selection.presentationLevel;
|
|
339
|
+
}
|
|
340
|
+
// this._upsertFurniture(this.activeInstance,
|
|
341
|
+
// {Variations: usedVariations});
|
|
342
|
+
};
|
|
343
|
+
Builder.prototype._createAdjustable = function (parent, adj) {
|
|
344
|
+
var obj = this._source ? this._source.getObjectByName(adj.decoNode.gameObjectName) : null;
|
|
345
|
+
if (!obj) {
|
|
346
|
+
// in case of glb files, the importer removes dots from names
|
|
347
|
+
var name_1 = adj.decoNode.gameObjectName.replace(/[.]/g, '');
|
|
348
|
+
obj = this._source ? this._source.getObjectByName(name_1) : null;
|
|
349
|
+
if (!obj) {
|
|
350
|
+
// console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
var adjustable = obj.clone();
|
|
355
|
+
adjustable.name = this._createUniqueName(parent, obj);
|
|
356
|
+
adjustable.userData.selection = adj;
|
|
357
|
+
adjustable.position.set(0, 0, 0);
|
|
358
|
+
adjustable.visible = true;
|
|
359
|
+
parent.add(adjustable);
|
|
360
|
+
// the object being added to the customFloorGroup is being recreated so we loose the reference
|
|
361
|
+
// therefor we need to retrieve the created object again
|
|
362
|
+
// adjustable = parent.getObjectByName(adjustable.name);
|
|
363
|
+
this._placedAdjustables.push(adjustable);
|
|
364
|
+
return adjustable;
|
|
365
|
+
};
|
|
366
|
+
Builder.prototype._createAddable = function (parent, add, part2, part1) {
|
|
367
|
+
var obj = this._source.getObjectByName(add.decoNode.gameObjectName);
|
|
368
|
+
if (!obj) {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
// const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
|
|
372
|
+
var addable = obj.clone();
|
|
373
|
+
addable.name = this._createUniqueName(parent, obj);
|
|
374
|
+
addable.userData.selection = add;
|
|
375
|
+
addable.position.set(0, 0, 0);
|
|
376
|
+
addable.visible = true;
|
|
377
|
+
if (part1 && part2) {
|
|
378
|
+
parent.add(addable);
|
|
379
|
+
this._placedAddables.push(addable);
|
|
380
|
+
return addable;
|
|
381
|
+
}
|
|
382
|
+
return addable;
|
|
383
|
+
};
|
|
384
|
+
Builder.prototype._placeAddables = function (parent) {
|
|
385
|
+
var _this = this;
|
|
386
|
+
var len = this._placedAdjustables.length;
|
|
387
|
+
for (var i = 0; i < len; i++) {
|
|
388
|
+
if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
|
|
389
|
+
var adjustableSelection = this._placedAdjustables[i].userData.selection;
|
|
390
|
+
if (adjustableSelection) {
|
|
391
|
+
var lena = adjustableSelection.addables.length;
|
|
392
|
+
var conAddable = void 0;
|
|
393
|
+
for (var ia = 0; ia < lena; ia++) {
|
|
394
|
+
SceneUtils.TrySelectorConnection(this._scene, parent, this._placedAdjustables[i], adjustableSelection.addables[ia], function (add, part2, part1) { return _this._createAddable(parent, add, part2, part1); });
|
|
395
|
+
if (conAddable) {
|
|
396
|
+
SceneUtils.TrySelectorConnection(this._scene, parent, conAddable, adjustableSelection.addables[ia], function (add, part2, part1) { return _this._createAddable(parent, add, part2, part1); });
|
|
397
|
+
}
|
|
398
|
+
conAddable = this._placedAddables[this._placedAddables.length - 1];
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
Builder.prototype._createUniqueName = function (parent, obj) {
|
|
405
|
+
var iteration = 0;
|
|
406
|
+
var name = obj.name;
|
|
407
|
+
var existingObj = parent.getObjectByName(name);
|
|
408
|
+
while (existingObj) {
|
|
409
|
+
iteration++;
|
|
410
|
+
name = obj.name + (iteration !== 0 ? ('_' + iteration) : '');
|
|
411
|
+
existingObj = parent.getObjectByName(name);
|
|
412
|
+
}
|
|
413
|
+
return name;
|
|
414
|
+
};
|
|
415
|
+
Builder.prototype._getGoodIdFromSku = function (sku) {
|
|
416
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
417
|
+
var response;
|
|
418
|
+
return __generator(this, function (_a) {
|
|
419
|
+
switch (_a.label) {
|
|
420
|
+
case 0: return [4 /*yield*/, this._configuratorService.getGoodIdFromSku(sku, false)];
|
|
421
|
+
case 1:
|
|
422
|
+
response = _a.sent();
|
|
423
|
+
if (response.validationResult.success && response.resultObject) {
|
|
424
|
+
return [2 /*return*/, response.resultObject];
|
|
425
|
+
}
|
|
426
|
+
return [2 /*return*/];
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
};
|
|
431
|
+
Builder.prototype._getArticle = function (sku, goodId) {
|
|
432
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
433
|
+
var article, articleResponse, obj;
|
|
434
|
+
return __generator(this, function (_a) {
|
|
435
|
+
switch (_a.label) {
|
|
436
|
+
case 0:
|
|
437
|
+
if (this._articleCache.has(sku)) {
|
|
438
|
+
return [2 /*return*/, this._articleCache.get(sku)];
|
|
439
|
+
}
|
|
440
|
+
if (!!goodId) return [3 /*break*/, 2];
|
|
441
|
+
return [4 /*yield*/, this._getGoodIdFromSku(sku)
|
|
442
|
+
.catch(function (error) {
|
|
443
|
+
throw "Article with sku " + sku + " not found!";
|
|
444
|
+
})];
|
|
445
|
+
case 1:
|
|
446
|
+
goodId = _a.sent();
|
|
447
|
+
_a.label = 2;
|
|
448
|
+
case 2: return [4 /*yield*/, this._configuratorService.getArticleQuickSel(goodId, false)];
|
|
449
|
+
case 3:
|
|
450
|
+
articleResponse = _a.sent();
|
|
451
|
+
if (articleResponse.validationResult.success && articleResponse.resultObject) {
|
|
452
|
+
if (articleResponse.resultObject.hasOwnProperty('oArticle')) {
|
|
453
|
+
obj = Array.isArray(articleResponse.resultObject['oArticle']) ? articleResponse.resultObject['oArticle'][0] : articleResponse.resultObject['oArticle'];
|
|
454
|
+
article = this._boFactory.makeWithRawBackendData(Article, obj);
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
article = this._boFactory.makeWithRawBackendData(Article, articleResponse.resultObject);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
this._articleCache.set(sku, article);
|
|
461
|
+
return [2 /*return*/, article];
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
};
|
|
466
|
+
Builder.prototype._getSelections = function (instanceId, publicationCode) {
|
|
467
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
468
|
+
var selectionResponse;
|
|
469
|
+
return __generator(this, function (_a) {
|
|
470
|
+
switch (_a.label) {
|
|
471
|
+
case 0:
|
|
472
|
+
this._selections = [];
|
|
473
|
+
return [4 /*yield*/, this._configuratorService.getSelections(false, publicationCode)];
|
|
474
|
+
case 1:
|
|
475
|
+
selectionResponse = _a.sent();
|
|
476
|
+
if (selectionResponse.resultObjects && selectionResponse.resultObjects.length > 0) {
|
|
477
|
+
this._selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, selectionResponse.resultObjects);
|
|
478
|
+
this._selections.forEach(function (s) { return s.instanceId = instanceId; });
|
|
479
|
+
// const filtered: Selection[] = this._selections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
|
|
480
|
+
this.selectionsReceived.next(this._selections);
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
throw 'No selections found!';
|
|
484
|
+
}
|
|
485
|
+
return [2 /*return*/];
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
};
|
|
490
|
+
Builder.prototype._getDecos = function () {
|
|
491
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
492
|
+
var decosResponse;
|
|
493
|
+
return __generator(this, function (_a) {
|
|
494
|
+
switch (_a.label) {
|
|
495
|
+
case 0:
|
|
496
|
+
this._decos = [];
|
|
497
|
+
return [4 /*yield*/, this._configuratorService.getDecos(false)];
|
|
498
|
+
case 1:
|
|
499
|
+
decosResponse = _a.sent();
|
|
500
|
+
if (decosResponse.resultObjects && decosResponse.resultObjects.length > 0) {
|
|
501
|
+
this._decos = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, decosResponse.resultObjects);
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
throw 'No deconodes found!';
|
|
505
|
+
}
|
|
506
|
+
return [2 /*return*/];
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
};
|
|
511
|
+
Builder.prototype._linkSelectionsAndDecos = function () {
|
|
512
|
+
var _this = this;
|
|
513
|
+
var len = this._selections.length;
|
|
514
|
+
var _loop_1 = function (i) {
|
|
515
|
+
var id = this_1._selections[i].artNodeIdDeco;
|
|
516
|
+
// if (this._useNodeIdToLink) {
|
|
517
|
+
// id = `${this._selections[i].node}_${this._selections[i].artNodeIdDeco}`;
|
|
518
|
+
// }
|
|
519
|
+
var deco = this_1._decos.find(function (d) { return d.id === id; });
|
|
520
|
+
if (!deco) {
|
|
521
|
+
deco = new DecoNode();
|
|
522
|
+
}
|
|
523
|
+
var variation = this_1._getVariations().find(function (v) { return v.parentId === _this._selections[i].artNodeIdDeco; });
|
|
524
|
+
if (variation) {
|
|
525
|
+
deco.variation = variation;
|
|
526
|
+
}
|
|
527
|
+
this_1._selections[i].decoNode = deco;
|
|
528
|
+
};
|
|
529
|
+
var this_1 = this;
|
|
530
|
+
for (var i = 0; i < len; i++) {
|
|
531
|
+
_loop_1(i);
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
Builder.prototype._getVariations = function () {
|
|
535
|
+
return this._decos.filter(function (deco) {
|
|
536
|
+
return deco.type === DecoNodeType.Variation;
|
|
537
|
+
});
|
|
538
|
+
};
|
|
539
|
+
Builder.prototype._loadVariations = function (obj, instanceId) {
|
|
540
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
541
|
+
return __generator(this, function (_a) {
|
|
542
|
+
switch (_a.label) {
|
|
543
|
+
case 0: return [4 /*yield*/, this._variationHelper.loadPart(obj, this._adjustables, true)];
|
|
544
|
+
case 1:
|
|
545
|
+
_a.sent();
|
|
546
|
+
return [4 /*yield*/, this._variationHelper.loadVariation(instanceId, obj, this._adjustables, true)];
|
|
547
|
+
case 2:
|
|
548
|
+
_a.sent();
|
|
549
|
+
return [4 /*yield*/, this._variationHelper.loadVariation(instanceId, obj, this._addables, true)];
|
|
550
|
+
case 3:
|
|
551
|
+
_a.sent();
|
|
552
|
+
return [2 /*return*/];
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
};
|
|
557
|
+
Builder.prototype._getAdjustables = function () {
|
|
558
|
+
return this._selections.filter(function (s) {
|
|
559
|
+
var node = s.decoNode;
|
|
560
|
+
return node && node.gameObjectName && node.type === DecoNodeType.Part && node.kind === DecoNodeKind.Adjustable;
|
|
561
|
+
});
|
|
562
|
+
};
|
|
563
|
+
Builder.prototype._updatePivot = function (obj) {
|
|
564
|
+
var boundingBox = new THREE.Box3().setFromObject(obj);
|
|
565
|
+
var bbCenterPivot = new THREE.Vector3();
|
|
566
|
+
boundingBox.getCenter(bbCenterPivot);
|
|
567
|
+
var delta = new THREE.Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
|
|
568
|
+
obj.children.forEach(function (child) {
|
|
569
|
+
child.position.add(delta);
|
|
570
|
+
});
|
|
571
|
+
obj.updateWorldMatrix(false, true);
|
|
572
|
+
};
|
|
573
|
+
Builder.prototype._reset = function () {
|
|
574
|
+
this._placedAddables.length = 0;
|
|
575
|
+
this._placedAdjustables.length = 0;
|
|
576
|
+
this._adjustables.length = 0;
|
|
577
|
+
this._addables.length = 0;
|
|
578
|
+
this._prepareTheSelections();
|
|
579
|
+
};
|
|
580
|
+
Builder.ctorParameters = function () { return [
|
|
581
|
+
{ type: Scene },
|
|
582
|
+
{ type: Options },
|
|
583
|
+
{ type: Boolean }
|
|
584
|
+
]; };
|
|
585
|
+
Builder = __decorate([
|
|
586
|
+
Injectable()
|
|
587
|
+
], Builder);
|
|
588
|
+
return Builder;
|
|
589
|
+
}());
|
|
590
|
+
export { Builder };
|
|
591
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBRXBFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUNwRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDMUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUM1QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBSTFEO0lBeUJJLGlCQUFZLEtBQVksRUFBRSxPQUFnQixFQUFFLFlBQXFCO1FBdkIxRCx1QkFBa0IsR0FBaUMsSUFBSSxlQUFlLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDeEYsb0JBQWUsR0FBOEIsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFDL0UsZ0JBQVcsR0FBb0MsSUFBSSxlQUFlLENBQWlCLElBQUksQ0FBQyxDQUFDO1FBTXhGLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUM5QixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFdBQU0sR0FBZSxFQUFFLENBQUM7UUFDeEIsdUJBQWtCLEdBQVUsRUFBRSxDQUFDO1FBQy9CLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBQzVCLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLGNBQVMsR0FBVSxFQUFFLENBQUM7UUFNdEIsa0JBQWEsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUlwRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE1BQU0sMkJBQTJCLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsTUFBTSxpQ0FBaUMsQ0FBQztTQUMzQztRQUNELElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDaEY7YUFBTTtZQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRVksNEJBQVUsR0FBdkIsVUFBd0IsR0FBWSxFQUFFLFVBQW1CLEVBQUUsTUFBZTs7Ozs7O3dCQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDZCxzQkFBTzt5QkFDVjs7Ozt3QkFFRyxxQkFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUFsRCxTQUFrRCxDQUFDO3dCQUNuRCxxQkFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUE7O3dCQUF6RCxTQUF5RCxDQUFDOzZCQUN0RCxJQUFJLENBQUMsT0FBTyxFQUFaLHdCQUFZO3dCQUNaLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUE7O3dCQUF4RSxTQUF3RSxDQUFDO3dCQUNuRSxRQUFRLEdBQW1CLEVBQUUsQ0FBQzt3QkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO3dCQUM1QyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7d0JBQ2hDLHFCQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUEzQixTQUEyQixDQUFDO3dCQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDMUIsc0JBQU87eUJBQ1Y7d0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7d0JBQy9CLHNCQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFDOzRCQUVyQyxNQUFNLHVCQUF1QixDQUFDOzs7O3dCQUdsQyxNQUFNLEdBQUMsQ0FBQzs7Ozs7S0FFZjtJQUVNLGtDQUFnQixHQUF2QixVQUF3QixNQUFjO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSx5QkFBTyxHQUFkO1FBQ0ksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVZLGlDQUFlLEdBQTVCLFVBQTZCLFNBQW9COzs7OzRCQUM3QyxxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBQTs7d0JBQWpFLFNBQWlFLENBQUM7d0JBQ2xFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOzs7OztLQUNoQztJQUVZLHVDQUFxQixHQUFsQyxVQUFtQyxlQUF3Qjs7Ozs7NEJBQ1AscUJBQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBQTs7d0JBQXZILG1CQUFtQixHQUF1QixTQUE2RTt3QkFDN0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7d0JBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7OztLQUMxRDtJQUVZLDhCQUFZLEdBQXpCLFVBQTBCLE1BQWM7Ozs7OzRCQUNwQyxxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBQTs7d0JBQTNELFNBQTJELENBQUM7d0JBQzVELEtBQUEsQ0FBQSxLQUFBLElBQUksQ0FBQyxXQUFXLENBQUEsQ0FBQyxJQUFJLENBQUE7d0JBQUMscUJBQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFBOzt3QkFBN0MsY0FBc0IsU0FBdUIsRUFBQyxDQUFDOzs7OztLQUNsRDtJQUVhLGdDQUFjLEdBQTVCLFVBQTZCLEdBQVcsRUFBRSxVQUFtQixFQUFFLE1BQWU7Ozs7Ozs2QkFDdEUsQ0FBQSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUEsRUFBaEMsd0JBQWdDOzZCQUM1QixDQUFDLE1BQU0sRUFBUCx3QkFBTzt3QkFDRSxxQkFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUE7O3dCQUExQyxNQUFNLEdBQUcsU0FBaUMsQ0FBQzs7O3dCQUUvQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzt3QkFDa0IscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBQTs7d0JBQTNFLE1BQU0sR0FBNEIsU0FBeUM7d0JBQ2pGLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzt5QkFDMUM7NkJBQU07NEJBQ0gsTUFBTSxvQ0FBb0MsQ0FBQzt5QkFDOUM7Ozt3QkFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7eUJBQ2pDOzs7d0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7NEJBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7eUJBQ25COzs7OztLQUNKO0lBRWEsdUNBQXFCLEdBQW5DLFVBQW9DLEdBQVcsRUFBRSxNQUFlOzs7Ozs0QkFDbkMscUJBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUF0RCxPQUFPLEdBQVksU0FBbUM7NkJBQ3hELENBQUEsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUEsRUFBM0Isd0JBQTJCO3dCQUMzQixLQUFBLElBQUksQ0FBQTt3QkFBVyxxQkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7aUNBQ3BFLEtBQUssQ0FBQyxVQUFDLEtBQUs7Z0NBQ1QsTUFBTSxLQUFLLENBQUM7NEJBQ2hCLENBQUMsQ0FBQyxFQUFBOzt3QkFITixHQUFLLE9BQU8sR0FBRyxTQUdULENBQUM7d0JBQ1AsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUU7NEJBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTO2dDQUMzQixPQUFPLENBQUMsa0JBQWtCO29DQUMxQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29DQUNyRCxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUM1RDs7Ozs7O0tBRVI7SUFFYSx3QkFBTSxHQUFwQixVQUFxQixVQUFrQjs7Ozs7O3dCQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ1IsV0FBVyxHQUFnQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7NkJBQ3BELENBQUEsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBLEVBQXJDLHdCQUFxQzt3QkFDL0IsR0FBRyxHQUFtQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDakQsR0FBRyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyw0QkFBNEI7d0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUN0QixLQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFXLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDdEQsVUFBVSxHQUFtQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvRSxJQUFJLFVBQVUsRUFBRTtnQ0FDWixLQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtvQ0FDL0UsSUFBSSxVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDNUMsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTt3Q0FDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7d0NBQzNDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3dDQUMxQixTQUFTLEdBQUcsSUFBSSxDQUFDO3dDQUNqQixNQUFNO3FDQUNUO29DQUNELFNBQVMsR0FBRyxLQUFLLENBQUM7aUNBQ3JCOzZCQUNKOzRCQUNELElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUM5RDt5QkFDSjt3QkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN2QixxQkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBQTs7d0JBQTNDLFNBQTJDLENBQUM7d0JBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN4QixzQkFBTyxHQUFHLEVBQUM7NEJBRVgsTUFBTSx1QkFBdUIsQ0FBQzs7OztLQWFyQztJQUVPLHVDQUFxQixHQUE3QjtRQUFBLGlCQXNGQztRQXJGRyx5QkFBeUI7UUFDekIsSUFBTSxnQkFBZ0IsR0FBZSxJQUFJLENBQUMsV0FBVzthQUNoRCxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxJQUFLLENBQUMsQ0FBQyxRQUFnQixDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUE5RCxDQUE4RCxDQUFDO2FBQzNFLEdBQUcsQ0FBQyxVQUFDLEtBQWdCLEVBQUUsS0FBYSxFQUFFLEtBQWtCO1lBQ3JELDhCQUE4QjtZQUM5QixJQUFNLEdBQUcsR0FBYyxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxhQUFhLEtBQU0sS0FBSyxDQUFDLFFBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBeEQsQ0FBd0QsQ0FBQyxDQUFDO1lBQzVHLElBQUksR0FBRyxFQUFFO2dCQUNKLEtBQUssQ0FBQyxRQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUM7YUFDL0U7WUFDQSxLQUFLLENBQUMsUUFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDckUsT0FBUSxLQUFLLENBQUMsUUFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFUCx1REFBdUQ7UUFDdkQsSUFBSSx1QkFBdUIsR0FBWSxJQUFJLENBQUM7UUFFNUMsSUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxTQUFvQixDQUFDO1FBQ3pCLElBQUksY0FBeUIsQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7UUFDN0IsSUFBSSxpQkFBaUIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLFdBQWdCLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFNLFNBQVMsR0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksU0FBUyxDQUFDLGlCQUFpQixLQUFLLENBQUMsRUFBRTtnQkFDbkMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUM1QztZQUNELElBQUksU0FBUyxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixFQUFFO2dCQUNqRCxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQzthQUMxRTtZQUNELElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDcEIsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUNwRCxJQUFJLFNBQVMsRUFBRTt3QkFDWCxJQUFJLE9BQU8sRUFBRTs0QkFDVCxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUMvQzs2QkFBTTs0QkFDSCxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ2pEO3dCQUNELE9BQU8sR0FBRyxLQUFLLENBQUM7cUJBQ25CO3lCQUFNO3dCQUNILElBQUksdUJBQXVCLEVBQUU7NEJBQ3pCLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7NEJBQzVCLHVCQUF1QixHQUFHLEtBQUssQ0FBQzt5QkFDbkM7d0JBQ0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDN0M7b0JBQ0QsMEVBQTBFO29CQUMxRSxrREFBa0Q7b0JBQ2xELDZEQUE2RDtvQkFDN0QsaUVBQWlFO29CQUNqRSwrRUFBK0U7b0JBQy9FLGtDQUFrQztvQkFDbEMsK0NBQStDO29CQUMvQyw2Q0FBNkM7b0JBQzdDLCtEQUErRDtvQkFDL0QsdUVBQXVFO29CQUN2RSxNQUFNO2lCQUNUO3FCQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUk7b0JBQ3BELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssUUFBUTtvQkFDckQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO29CQUMxQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxVQUFVLEVBQUU7d0JBQ3JELFNBQVMsQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNsQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRTs0QkFDckQsT0FBTyxHQUFHLElBQUksQ0FBQzt5QkFDbEI7d0JBQ0QsU0FBUyxHQUFHLFNBQVMsQ0FBQzt3QkFDdEIsY0FBYyxHQUFHLFNBQVMsQ0FBQztxQkFDOUI7eUJBQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxFQUFFO3dCQUN6RCxTQUFTLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7d0JBQ3JGLElBQUksY0FBYyxFQUFFOzRCQUNoQixjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzt5QkFDM0M7d0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQy9CLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFOzRCQUNyRCxPQUFPLEdBQUcsSUFBSSxDQUFDO3lCQUNsQjt3QkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDO3FCQUN6QjtpQkFDSjthQUNKO1lBQ0QsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1NBQ25EO1FBQ0QsNkNBQTZDO1FBQzdDLG1DQUFtQztJQUN2QyxDQUFDO0lBRU8sbUNBQWlCLEdBQXpCLFVBQTBCLE1BQXNCLEVBQUUsR0FBYztRQUM1RCxJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0YsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLDZEQUE2RDtZQUM3RCxJQUFNLE1BQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdELEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQy9ELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ04sNkVBQTZFO2dCQUM3RSxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxJQUFJLFVBQVUsR0FBUSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNwQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkIsOEZBQThGO1FBQzlGLHdEQUF3RDtRQUN4RCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU8sZ0NBQWMsR0FBdEIsVUFBdUIsTUFBc0IsRUFBRSxHQUFjLEVBQUUsS0FBVyxFQUFFLEtBQVc7UUFDbkYsSUFBTSxHQUFHLEdBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ04sT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELDRFQUE0RTtRQUM1RSxJQUFNLE9BQU8sR0FBUSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLE9BQU8sT0FBTyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVPLGdDQUFjLEdBQXRCLFVBQXVCLE1BQXNCO1FBQTdDLGlCQXNCQztRQXJCRyxJQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDbEgsSUFBTSxtQkFBbUIsR0FBYyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDckYsSUFBSSxtQkFBbUIsRUFBRTtvQkFDckIsSUFBTSxJQUFJLEdBQVcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDekQsSUFBSSxVQUFVLFNBQUssQ0FBQztvQkFDcEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRTt3QkFDOUIsVUFBVSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUNwRSxVQUFDLEdBQUcsRUFBRSxLQUFNLEVBQUUsS0FBTSxJQUFLLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBOUMsQ0FBOEMsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLFVBQVUsRUFBRTs0QkFDWixVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDeEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ3BELFVBQUMsR0FBRyxFQUFFLEtBQU0sRUFBRSxLQUFNLElBQUssT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUE5QyxDQUE4QyxDQUFDLENBQUM7eUJBQ2hGO3dCQUNELFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUN0RTtpQkFDSjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU8sbUNBQWlCLEdBQXpCLFVBQTBCLE1BQXNCLEVBQUUsR0FBbUI7UUFDakUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxPQUFPLFdBQVcsRUFBRTtZQUNoQixTQUFTLEVBQUUsQ0FBQztZQUNaLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVhLG1DQUFpQixHQUEvQixVQUFnQyxHQUFXOzs7Ozs0QkFDRyxxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFBOzt3QkFBaEcsUUFBUSxHQUE0QixTQUE0RDt3QkFDdEcsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7NEJBQzVELHNCQUFPLFFBQVEsQ0FBQyxZQUFZLEVBQUM7eUJBQ2hDOzs7OztLQUNKO0lBRWEsNkJBQVcsR0FBekIsVUFBMEIsR0FBVyxFQUFFLE1BQWM7Ozs7Ozt3QkFDakQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDN0Isc0JBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7eUJBQ3RDOzZCQUNHLENBQUMsTUFBTSxFQUFQLHdCQUFPO3dCQUNFLHFCQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7aUNBQ3JDLEtBQUssQ0FBQyxVQUFDLEtBQUs7Z0NBQ1QsTUFBTSxzQkFBb0IsR0FBRyxnQkFBYSxDQUFDOzRCQUMvQyxDQUFDLENBQUMsRUFBQTs7d0JBSE4sTUFBTSxHQUFHLFNBR0gsQ0FBQzs7NEJBR3NDLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUE7O3dCQUE1RyxlQUFlLEdBQTRCLFNBQWlFO3dCQUNsSCxJQUFJLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLFlBQVksRUFBRTs0QkFDMUUsSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQ0FDbkQsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUM3SixPQUFPLEdBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7NkJBQzNFO2lDQUFNO2dDQUNILE9BQU8sR0FBWSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7NkJBQ3BHO3lCQUNKO3dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDckMsc0JBQU8sT0FBTyxFQUFDOzs7O0tBQ2xCO0lBRWEsZ0NBQWMsR0FBNUIsVUFBNkIsVUFBa0IsRUFBRSxlQUF3Qjs7Ozs7O3dCQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQzt3QkFDNkIscUJBQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O3dCQUFsSCxpQkFBaUIsR0FBNEIsU0FBcUU7d0JBQ3hILElBQUksaUJBQWlCLENBQUMsYUFBYSxJQUFJLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUMvRSxJQUFJLENBQUMsV0FBVyxHQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDL0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBekIsQ0FBeUIsQ0FBQyxDQUFDOzRCQUN6RCw0SEFBNEg7NEJBQzVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUNsRDs2QkFBTTs0QkFDSCxNQUFNLHNCQUFzQixDQUFDO3lCQUNoQzs7Ozs7S0FDSjtJQUVhLDJCQUFTLEdBQXZCOzs7Ozs7d0JBQ0ksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7d0JBQzhCLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUE7O3dCQUF4RixhQUFhLEdBQTRCLFNBQStDO3dCQUM5RixJQUFJLGFBQWEsQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUN2RSxJQUFJLENBQUMsTUFBTSxHQUFlLElBQUksQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQzt5QkFDdkg7NkJBQU07NEJBQ0gsTUFBTSxxQkFBcUIsQ0FBQzt5QkFDL0I7Ozs7O0tBQ0o7SUFFTyx5Q0FBdUIsR0FBL0I7UUFBQSxpQkFpQkM7UUFoQkcsSUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7Z0NBQ25DLENBQUM7WUFDTixJQUFJLEVBQUUsR0FBVyxPQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDbkQsK0JBQStCO1lBQy9CLCtFQUErRTtZQUMvRSxJQUFJO1lBQ0osSUFBSSxJQUFJLEdBQVEsT0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQVgsQ0FBVyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDUCxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQzthQUN6QjtZQUNELElBQU0sU0FBUyxHQUFRLE9BQUssY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsS0FBSyxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBaEQsQ0FBZ0QsQ0FBQyxDQUFDO1lBQ3pHLElBQUksU0FBUyxFQUFFO2dCQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQzlCO1lBQ0QsT0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7O1FBYnhDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO29CQUFuQixDQUFDO1NBY1Q7SUFDTCxDQUFDO0lBRU8sZ0NBQWMsR0FBdEI7UUFDSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUMsSUFBYztZQUNyQyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFYSxpQ0FBZSxHQUE3QixVQUE4QixHQUFtQixFQUFFLFVBQWtCOzs7OzRCQUNqRSxxQkFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFBOzt3QkFBbEUsU0FBa0UsQ0FBQzt3QkFDbkUscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUE7O3dCQUFuRixTQUFtRixDQUFDO3dCQUNwRixxQkFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBQTs7d0JBQWhGLFNBQWdGLENBQUM7Ozs7O0tBQ3BGO0lBRU8saUNBQWUsR0FBdkI7UUFDSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQztZQUM1QixJQUFNLElBQUksR0FBYSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNuSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyw4QkFBWSxHQUFwQixVQUFxQixHQUFtQjtRQUNwQyxJQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsSUFBTSxhQUFhLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyQyxJQUFNLEtBQUssR0FBa0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ILEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBVTtZQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLHdCQUFNLEdBQWQ7UUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztnQkFoYmtCLEtBQUs7Z0JBQVcsT0FBTzs7O0lBekJqQyxPQUFPO1FBRG5CLFVBQVUsRUFBRTtPQUNBLE9BQU8sQ0EwY25CO0lBQUQsY0FBQztDQUFBLEFBMWNELElBMGNDO1NBMWNZLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHtPcHRpb25zfSBmcm9tIFwiQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvb3B0aW9uc1wiO1xyXG5pbXBvcnQge0RhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhfSBmcm9tIFwiQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvZGF0YS1zZXJ2aWNlLXJlc3BvbnNlLWRhdGFcIjtcclxuaW1wb3J0IHtEZWNvTm9kZX0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZGVjby1ub2RlXCI7XHJcbmltcG9ydCB7QnVzaW5lc3NPYmplY3RGYWN0b3J5fSBmcm9tIFwiQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvc2VydmljZS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeVwiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uXCI7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2RlY28tbm9kZS10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtUaHJlZWRVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3RocmVlZC51dGlsc1wiO1xyXG5pbXBvcnQge0RlY29Ob2RlS2luZH0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUta2luZC5lbnVtXCI7XHJcbmltcG9ydCB7U2NlbmVVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3NjZW5lLXV0aWxzXCI7XHJcbmltcG9ydCB7VmFyaWF0aW9uSGVscGVyfSBmcm9tIFwiLi4vaGVscGVyL3ZhcmlhdGlvbi1oZWxwZXJcIjtcclxuaW1wb3J0IHtBcnRpY2xlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1NlcnZpY2VMb2NhdG9yfSBmcm9tICcuL3NlcnZpY2VzL2xvY2F0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJ1aWxkZXIge1xyXG5cclxuICAgIHB1YmxpYyBzZWxlY3Rpb25zUmVjZWl2ZWQ6IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbltdPihbXSk7XHJcbiAgICBwdWJsaWMgYW5zd2Vyc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8QW5zd2VyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBbnN3ZXJbXT4oW10pO1xyXG4gICAgcHVibGljIG1vZGVsTG9hZGVkOiBCZWhhdmlvclN1YmplY3Q8VEhSRUUuT2JqZWN0M0Q+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUSFJFRS5PYmplY3QzRD4obnVsbCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2NlbmU6IFRIUkVFLlNjZW5lO1xyXG4gICAgcHJpdmF0ZSBfaW5zdGFuY2VJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2t1OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9nb29kSWQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3NlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gW107XHJcbiAgICBwcml2YXRlIF9hbnN3ZXJzOiBBbnN3ZXJbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfZGVjb3M6IERlY29Ob2RlW10gPSBbXTtcclxuICAgIHByaXZhdGUgX3BsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcGxhY2VkQWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9hZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgX2FkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5O1xyXG4gICAgcHJpdmF0ZSBfc291cmNlOiBUSFJFRS5PYmplY3QzRDtcclxuICAgIHByaXZhdGUgX3RocmVlZFV0aWxzOiBUaHJlZWRVdGlscztcclxuICAgIHByaXZhdGUgX3ZhcmlhdGlvbkhlbHBlcjogVmFyaWF0aW9uSGVscGVyO1xyXG4gICAgcHJpdmF0ZSBfYXJ0aWNsZUNhY2hlOiBNYXA8c3RyaW5nLCBBcnRpY2xlPiA9IG5ldyBNYXAoKTtcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U6IENvbmZpZ3VyYXRvclNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2NlbmU6IFNjZW5lLCBvcHRpb25zOiBPcHRpb25zLCB1c2VJbkFuZ3VsYXI6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9ib0ZhY3RvcnkgPSBuZXcgQnVzaW5lc3NPYmplY3RGYWN0b3J5KCk7XHJcbiAgICAgICAgdGhpcy5fdGhyZWVkVXRpbHMgPSBuZXcgVGhyZWVkVXRpbHMoKTtcclxuICAgICAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIgPSBuZXcgVmFyaWF0aW9uSGVscGVyKCk7XHJcblxyXG4gICAgICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIHNjZW5lIG9iamVjdCBwcm92aWRlZCEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIGNvbm5lY3Rpb24gb3B0aW9ucyBwcm92aWRlZCEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlSW5Bbmd1bGFyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoQ29uZmlndXJhdG9yU2VydmljZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IG5ldyBDb25maWd1cmF0b3JTZXJ2aWNlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuaW5pdEFwaShvcHRpb25zKTtcclxuICAgICAgICB0aGlzLl9zY2VuZSA9IHNjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsKHNrdT86IHN0cmluZywgaW5zdGFuY2VJZD86IHN0cmluZywgZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2NlbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRJbnN0YW5jZUlkKHNrdSwgaW5zdGFuY2VJZCwgZ29vZElkKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNvbmZpZ3VyYXRpb24odGhpcy5fc2t1LCB0aGlzLl9nb29kSWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNldEluc3RhbmNlVG9Db25maWd1cmUodGhpcy5faW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoKSk7XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldFNlbGVjdGlvbnModGhpcy5faW5zdGFuY2VJZCkpO1xyXG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl9nZXREZWNvcygpKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGQodGhpcy5faW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyAnR0xCIHNvdXJjZSBub3QgZm91bmQhJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXROb2RlSW5zdGFuY2UoZ29vZElkOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UoZ29vZElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90aHJlZWRVdGlscy5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmNsZWFyQ2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKHB1YmxpY2F0aW9uQ29kZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uc0FuZEFuc3dlcnM6IFF1ZXN0aW9uQW5kQW5zd2VycyA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKGZhbHNlLCBwdWJsaWNhdGlvbkNvZGUpO1xyXG4gICAgICAgIHRoaXMuX2Fuc3dlcnMgPSBxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICAgICAgdGhpcy5hbnN3ZXJzUmVjZWl2ZWQubmV4dChxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzZWxlY3RBbnN3ZXIoYW5zd2VyOiBBbnN3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdEFuc3dlcihhbnN3ZXIsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGVkLm5leHQoYXdhaXQgdGhpcy5idWlsZE1vZGVsKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX3NldEluc3RhbmNlSWQoc2t1OiBzdHJpbmcsIGluc3RhbmNlSWQ/OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghaW5zdGFuY2VJZCAmJiAhdGhpcy5faW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICBpZiAoIWdvb2RJZCkge1xyXG4gICAgICAgICAgICAgICAgZ29vZElkID0gYXdhaXQgdGhpcy5fZ2V0R29vZElkRnJvbVNrdShza3UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2dvb2RJZCA9IGdvb2RJZDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuaW5pdE5vZGVJbnN0YW5jZSh0aGlzLl9nb29kSWQpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlSWQgPSByZXN1bHQucmVzdWx0T2JqZWN0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ0ZhaWxlZCB0byBpbml0aWFsaXplIG5vZGUgaW5zdGFuY2UnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5faW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9za3UpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2t1ID0gc2t1O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9wcmVwYXJlQ29uZmlndXJhdGlvbihza3U6IHN0cmluZywgZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgYXJ0aWNsZTogQXJ0aWNsZSA9IGF3YWl0IHRoaXMuX2dldEFydGljbGUoc2t1LCBnb29kSWQpO1xyXG4gICAgICAgIGlmIChhcnRpY2xlICYmIGFydGljbGUuYXNzZXRVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlID0gYXdhaXQgdGhpcy5fdGhyZWVkVXRpbHMuZG93bmxvYWQzRFNvdXJjZShhcnRpY2xlLmFzc2V0VXJsKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmFzc2V0UGF0aCA9XHJcbiAgICAgICAgICAgICAgICAgICAgYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwgK1xyXG4gICAgICAgICAgICAgICAgICAgIChhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICtcclxuICAgICAgICAgICAgICAgICAgICAoYXJ0aWNsZS5kaXN0U2NoZW1hID8gYXJ0aWNsZS5kaXN0U2NoZW1hIDogJ1VQX0RCQScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2J1aWxkKGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGFibGVzOiBTZWxlY3Rpb25bXSA9IHRoaXMuX2dldEFkanVzdGFibGVzKCk7XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGVzICYmIGFkanVzdGFibGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqOiBUSFJFRS5PYmplY3QzRCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgICAgICAgICBvYmoudmlzaWJsZSA9IGZhbHNlOyAvLyBubyBuZWVkIHRvIHJlbmRlciB2aXN1YWx5XHJcbiAgICAgICAgICAgIHRoaXMuX3NjZW5lLmFkZChvYmopO1xyXG4gICAgICAgICAgICBsZXQgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW46IG51bWJlciA9IGFkanVzdGFibGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RhYmxlOiBUSFJFRS5PYmplY3QzRCA9IHRoaXMuX2NyZWF0ZUFkanVzdGFibGUob2JqLCBhZGp1c3RhYmxlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWRqdXN0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gMCwgbGVuaWk6IG51bWJlciA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aDsgaWkgPCBsZW5paTsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmosIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2lpXSwgYWRqdXN0YWJsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2lpXS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWQgJiYgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gY29ubmVjdGlvbiBmb3VuZCBmb3I6ICcsIGFkanVzdGFibGUubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcGxhY2VBZGRhYmxlcyhvYmopO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVQaXZvdChvYmopO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkVmFyaWF0aW9ucyhvYmosIGluc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9zY2VuZS5yZW1vdmUob2JqKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gYWRqdXN0YWJsZXMgZm91bmQhJztcclxuICAgICAgICAgICAgLy8gdGhpcy5fYnVpbGRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TJywgZGVzY3JpcHRpb246ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob1NlbGVjdGlvbnN9KTtcclxuICAgICAgICAgICAgLy8gfSBlbHNlIGlmICh0aGlzLmRlY29zLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuX2Vycm9yU2VydmljZS5hZGRFcnJvcih0aGlzLmFjdGl2ZUluc3RhbmNlLCB7bWVzc2FnZTogJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCBkZXNjcmlwdGlvbjogJ05PX1NFTEVDVElPTlNfT1JfREVDT1NfSU5GTyd9KTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHtpbnN0YW5jZUlkOiB0aGlzLmFjdGl2ZUluc3RhbmNlLCByZXN1bHRUeXBlOiBSZXN1bHRUeXBlLk5vRGVjb05vZGVzfSk7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19BREpVU1RBQkxFUycsIGRlc2NyaXB0aW9uOiAnTk9fQURKVVNUQUJMRVNfSU5GTyd9KTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHtpbnN0YW5jZUlkOiB0aGlzLmFjdGl2ZUluc3RhbmNlLCByZXN1bHRUeXBlOiBSZXN1bHRUeXBlLk5vQWRqdXN0YWJsZXN9KTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcmVwYXJlVGhlU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICAgICAgY29uc3QgZ2xvYmFsVmFyaWF0aW9uczogRGVjb05vZGVbXSA9IHRoaXMuX3NlbGVjdGlvbnNcclxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHMuZ2VuZXJpYyAmJiAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbiAmJiAhcy5kZWNvTm9kZS50eXBlKVxyXG4gICAgICAgICAgICAubWFwKCh2YWx1ZTogU2VsZWN0aW9uLCBpbmRleDogbnVtYmVyLCBhcnJheTogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsOiBTZWxlY3Rpb24gPSB0aGlzLl9zZWxlY3Rpb25zLmZpbmQocyA9PiBzLmFydE5vZGVJZERlY28gPT09ICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yID0gc2VsLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB2YWx1ZS5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gY29uc3QgdXNlZFZhcmlhdGlvbnM6IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb25bXSA9IFtdO1xyXG4gICAgICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5fc2VsZWN0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGxhc3RBZGRlZDogU2VsZWN0aW9uO1xyXG4gICAgICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgICAgIGxldCBuZXdQYXJ0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzUHJlc0xldmVsOiBudW1iZXIgPSAtMTtcclxuICAgICAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25pbmcgPSBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmcgfHwgcG9zaXRpb25pbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RBZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEFkZGVkLnZhcmlhdGlvbnMgPSBbc2VsZWN0aW9uLmRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goc2VsZWN0aW9uLmRlY29Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChzZWxlY3Rpb24uZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB2YXJpYXRpb246IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24gPSBuZXcgRnVybml0dXJlUGFydFZhcmlhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5CcmFuZElkID0gc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWF0aW9uLkRlc2NyaXB0aW9uID0gc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5NYXRlcmlhbElkID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWF0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZWRWYXJpYXRpb25zLnB1c2godmFyaWF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBWYXJpYXRpb246IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBWYXJpYXRpb25EZXNjcmlwdGlvbjogc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBTdXBwbGllckFydGljbGVOcjogKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLnN1cHBsaWVyQXJ0aWNsZU5yXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuUGFydCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEFkZGVkIHx8IGxhc3RBZGRlZC5ub2RlSWQgIT09IHNlbGVjdGlvbi5ub2RlSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZCA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEFkanVzdGFibGUgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBsYXN0QWRqdXN0YWJsZSA/IGxhc3RBZGp1c3RhYmxlLnZhcmlhdGlvbnMgOiBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlLmFkZGFibGVzLnB1c2goc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEFkZGVkIHx8IGxhc3RBZGRlZC5ub2RlSWQgIT09IHNlbGVjdGlvbi5ub2RlSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZCA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJldmlvdXNQcmVzTGV2ZWwgPSBzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgICAgIC8vICAge1ZhcmlhdGlvbnM6IHVzZWRWYXJpYXRpb25zfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlQWRqdXN0YWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGo6IFNlbGVjdGlvbik6IFRIUkVFLk9iamVjdDNEIHtcclxuICAgICAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLl9zb3VyY2UgPyB0aGlzLl9zb3VyY2UuZ2V0T2JqZWN0QnlOYW1lKGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSkgOiBudWxsO1xyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZ2xiIGZpbGVzLCB0aGUgaW1wb3J0ZXIgcmVtb3ZlcyBkb3RzIGZyb20gbmFtZXNcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5yZXBsYWNlKC9bLl0vZywgJycpO1xyXG4gICAgICAgICAgICBvYmogPSB0aGlzLl9zb3VyY2UgPyB0aGlzLl9zb3VyY2UuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpIDogbnVsbDtcclxuICAgICAgICAgICAgaWYgKCFvYmopIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgTm8gb2JqZWN0IHdpdGggbmFtZSAke2Fkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZX0gZm91bmQhYCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYWRqdXN0YWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICAgICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICAgICAgYWRqdXN0YWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGo7XHJcbiAgICAgICAgYWRqdXN0YWJsZS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgYWRqdXN0YWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBwYXJlbnQuYWRkKGFkanVzdGFibGUpO1xyXG4gICAgICAgIC8vIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQgdG8gdGhlIGN1c3RvbUZsb29yR3JvdXAgaXMgYmVpbmcgcmVjcmVhdGVkIHNvIHdlIGxvb3NlIHRoZSByZWZlcmVuY2VcclxuICAgICAgICAvLyB0aGVyZWZvciB3ZSBuZWVkIHRvIHJldHJpZXZlIHRoZSBjcmVhdGVkIG9iamVjdCBhZ2FpblxyXG4gICAgICAgIC8vIGFkanVzdGFibGUgPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMucHVzaChhZGp1c3RhYmxlKTtcclxuICAgICAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVBZGRhYmxlKHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIGFkZDogU2VsZWN0aW9uLCBwYXJ0Mj86IGFueSwgcGFydDE/OiBhbnkpOiBUSFJFRS5PYmplY3QzRCB7XHJcbiAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLl9zb3VyY2UuZ2V0T2JqZWN0QnlOYW1lKGFkZC5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSk7XHJcbiAgICAgICAgaWYgKCFvYmopIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VsZWN0aW9uRnJvbUlkKGFkai5hcnROb2RlSWREZWNvKTtcclxuICAgICAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgICAgICBhZGRhYmxlLm5hbWUgPSB0aGlzLl9jcmVhdGVVbmlxdWVOYW1lKHBhcmVudCwgb2JqKTtcclxuICAgICAgICBhZGRhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkZDtcclxuICAgICAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgICAgICBhZGRhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIGlmIChwYXJ0MSAmJiBwYXJ0Mikge1xyXG4gICAgICAgICAgICBwYXJlbnQuYWRkKGFkZGFibGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5wdXNoKGFkZGFibGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWRkYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcGxhY2VBZGRhYmxlcyhwYXJlbnQ6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuaGFzT3duUHJvcGVydHkoJ3NlbGVjdGlvbicpICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0YWJsZVNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFkanVzdGFibGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5hOiBudW1iZXIgPSBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29uQWRkYWJsZTogYW55O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlhID0gMDsgaWEgPCBsZW5hOyBpYSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXSwgYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlc1tpYV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLl9jcmVhdGVBZGRhYmxlKHBhcmVudCwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25BZGRhYmxlID0gdGhpcy5fcGxhY2VkQWRkYWJsZXNbdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgb2JqOiBUSFJFRS5PYmplY3QzRCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IDA7XHJcbiAgICAgICAgbGV0IG5hbWUgPSBvYmoubmFtZTtcclxuICAgICAgICBsZXQgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgICAgIHdoaWxlIChleGlzdGluZ09iaikge1xyXG4gICAgICAgICAgICBpdGVyYXRpb24rKztcclxuICAgICAgICAgICAgbmFtZSA9IG9iai5uYW1lICsgKGl0ZXJhdGlvbiAhPT0gMCA/ICgnXycgKyBpdGVyYXRpb24pIDogJycpO1xyXG4gICAgICAgICAgICBleGlzdGluZ09iaiA9IHBhcmVudC5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2dldEdvb2RJZEZyb21Ta3Uoc2t1OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0R29vZElkRnJvbVNrdShza3UsIGZhbHNlKTtcclxuICAgICAgICBpZiAocmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzICYmIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRBcnRpY2xlKHNrdTogc3RyaW5nLCBnb29kSWQ6IG51bWJlcik6IFByb21pc2U8QXJ0aWNsZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9hcnRpY2xlQ2FjaGUuaGFzKHNrdSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FydGljbGVDYWNoZS5nZXQoc2t1KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFnb29kSWQpIHtcclxuICAgICAgICAgICAgZ29vZElkID0gYXdhaXQgdGhpcy5fZ2V0R29vZElkRnJvbVNrdShza3UpXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgYEFydGljbGUgd2l0aCBza3UgJHtza3V9IG5vdCBmb3VuZCFgO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhcnRpY2xlOiBBcnRpY2xlO1xyXG4gICAgICAgIGNvbnN0IGFydGljbGVSZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEFydGljbGVRdWlja1NlbChnb29kSWQsIGZhbHNlKTtcclxuICAgICAgICBpZiAoYXJ0aWNsZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmIChhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0Lmhhc093blByb3BlcnR5KCdvQXJ0aWNsZScpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBBcnJheS5pc0FycmF5KGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ10pID8gYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdFsnb0FydGljbGUnXVswXSA6IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ107XHJcbiAgICAgICAgICAgICAgICBhcnRpY2xlID0gPEFydGljbGU+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZSwgb2JqKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFydGljbGUgPSA8QXJ0aWNsZT50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hcnRpY2xlQ2FjaGUuc2V0KHNrdSwgYXJ0aWNsZSk7XHJcbiAgICAgICAgcmV0dXJuIGFydGljbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0U2VsZWN0aW9ucyhpbnN0YW5jZUlkOiBzdHJpbmcsIHB1YmxpY2F0aW9uQ29kZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25SZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnMoZmFsc2UsIHB1YmxpY2F0aW9uQ29kZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSA8U2VsZWN0aW9uW10+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU2VsZWN0aW9uLCBzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHMgPT4gcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IGZpbHRlcmVkOiBTZWxlY3Rpb25bXSA9IHRoaXMuX3NlbGVjdGlvbnMuZmlsdGVyKHMgPT4gcy5ub2RlVHlwZSAhPT0gTm9kZVR5cGUuQXJ0aWNsZSAmJiBzLnByZXNlbnRhdGlvbkxldmVsID09PSAxKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25zUmVjZWl2ZWQubmV4dCh0aGlzLl9zZWxlY3Rpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gc2VsZWN0aW9ucyBmb3VuZCEnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXREZWNvcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLl9kZWNvcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRlY29zUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXREZWNvcyhmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRlY29zUmVzcG9uc2UucmVzdWx0T2JqZWN0cyAmJiBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWNvcyA9IDxEZWNvTm9kZVtdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KERlY29Ob2RlLCBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93ICdObyBkZWNvbm9kZXMgZm91bmQhJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbGlua1NlbGVjdGlvbnNBbmREZWNvcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGlkOiBzdHJpbmcgPSB0aGlzLl9zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY287XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl91c2VOb2RlSWRUb0xpbmspIHtcclxuICAgICAgICAgICAgLy8gICAgIGlkID0gYCR7dGhpcy5fc2VsZWN0aW9uc1tpXS5ub2RlfV8ke3RoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjb31gO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIGxldCBkZWNvOiBhbnkgPSB0aGlzLl9kZWNvcy5maW5kKGQgPT4gZC5pZCA9PT0gaWQpO1xyXG4gICAgICAgICAgICBpZiAoIWRlY28pIHtcclxuICAgICAgICAgICAgICAgIGRlY28gPSBuZXcgRGVjb05vZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB2YXJpYXRpb246IGFueSA9IHRoaXMuX2dldFZhcmlhdGlvbnMoKS5maW5kKHYgPT4gdi5wYXJlbnRJZCA9PT0gdGhpcy5fc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvKTtcclxuICAgICAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldFZhcmlhdGlvbnMoKTogRGVjb05vZGVbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29zLmZpbHRlcigoZGVjbzogRGVjb05vZGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlY28udHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9sb2FkVmFyaWF0aW9ucyhvYmo6IFRIUkVFLk9iamVjdDNELCBpbnN0YW5jZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLl92YXJpYXRpb25IZWxwZXIubG9hZFBhcnQob2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24oaW5zdGFuY2VJZCwgb2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24oaW5zdGFuY2VJZCwgb2JqLCB0aGlzLl9hZGRhYmxlcywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0QWRqdXN0YWJsZXMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICAgICAgICByZXR1cm4gbm9kZSAmJiBub2RlLmdhbWVPYmplY3ROYW1lICYmIG5vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiYgbm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF91cGRhdGVQaXZvdChvYmo6IFRIUkVFLk9iamVjdDNEKSB7XHJcbiAgICAgICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqKTtcclxuICAgICAgICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgICBib3VuZGluZ0JveC5nZXRDZW50ZXIoYmJDZW50ZXJQaXZvdCk7XHJcbiAgICAgICAgY29uc3QgZGVsdGE6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpLnN1YihiYkNlbnRlclBpdm90KS5zZXRZKE1hdGguYWJzKE1hdGgubWluKGJvdW5kaW5nQm94Lm1pbi55LCAwKSkpO1xyXG5cclxuICAgICAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjaGlsZC5wb3NpdGlvbi5hZGQoZGVsdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9iai51cGRhdGVXb3JsZE1hdHJpeChmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fYWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlVGhlU2VsZWN0aW9ucygpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|