babylonjs-addons 8.13.0 → 8.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babylonjs.addons.js +2 -2828
- package/package.json +4 -4
- package/webpack.config.js +2 -1
package/babylonjs.addons.js
CHANGED
@@ -1,2828 +1,2 @@
|
|
1
|
-
(function webpackUniversalModuleDefinition(root, factory) {
|
2
|
-
|
3
|
-
module.exports = factory(require("babylonjs"));
|
4
|
-
else if(typeof define === 'function' && define.amd)
|
5
|
-
define("babylonjs-addons", ["babylonjs"], factory);
|
6
|
-
else if(typeof exports === 'object')
|
7
|
-
exports["babylonjs-addons"] = factory(require("babylonjs"));
|
8
|
-
else
|
9
|
-
root["ADDONS"] = factory(root["BABYLON"]);
|
10
|
-
})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (__WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math__) => {
|
11
|
-
return /******/ (() => { // webpackBootstrap
|
12
|
-
/******/ "use strict";
|
13
|
-
/******/ var __webpack_modules__ = ({
|
14
|
-
|
15
|
-
/***/ "../../../../node_modules/tslib/tslib.es6.mjs":
|
16
|
-
/*!****************************************************!*\
|
17
|
-
!*** ../../../../node_modules/tslib/tslib.es6.mjs ***!
|
18
|
-
\****************************************************/
|
19
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
20
|
-
|
21
|
-
__webpack_require__.r(__webpack_exports__);
|
22
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
23
|
-
/* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
|
24
|
-
/* harmony export */ __assign: () => (/* binding */ __assign),
|
25
|
-
/* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
|
26
|
-
/* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
|
27
|
-
/* harmony export */ __asyncValues: () => (/* binding */ __asyncValues),
|
28
|
-
/* harmony export */ __await: () => (/* binding */ __await),
|
29
|
-
/* harmony export */ __awaiter: () => (/* binding */ __awaiter),
|
30
|
-
/* harmony export */ __classPrivateFieldGet: () => (/* binding */ __classPrivateFieldGet),
|
31
|
-
/* harmony export */ __classPrivateFieldIn: () => (/* binding */ __classPrivateFieldIn),
|
32
|
-
/* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
|
33
|
-
/* harmony export */ __createBinding: () => (/* binding */ __createBinding),
|
34
|
-
/* harmony export */ __decorate: () => (/* binding */ __decorate),
|
35
|
-
/* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
|
36
|
-
/* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
|
37
|
-
/* harmony export */ __exportStar: () => (/* binding */ __exportStar),
|
38
|
-
/* harmony export */ __extends: () => (/* binding */ __extends),
|
39
|
-
/* harmony export */ __generator: () => (/* binding */ __generator),
|
40
|
-
/* harmony export */ __importDefault: () => (/* binding */ __importDefault),
|
41
|
-
/* harmony export */ __importStar: () => (/* binding */ __importStar),
|
42
|
-
/* harmony export */ __makeTemplateObject: () => (/* binding */ __makeTemplateObject),
|
43
|
-
/* harmony export */ __metadata: () => (/* binding */ __metadata),
|
44
|
-
/* harmony export */ __param: () => (/* binding */ __param),
|
45
|
-
/* harmony export */ __propKey: () => (/* binding */ __propKey),
|
46
|
-
/* harmony export */ __read: () => (/* binding */ __read),
|
47
|
-
/* harmony export */ __rest: () => (/* binding */ __rest),
|
48
|
-
/* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
|
49
|
-
/* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
|
50
|
-
/* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
|
51
|
-
/* harmony export */ __spread: () => (/* binding */ __spread),
|
52
|
-
/* harmony export */ __spreadArray: () => (/* binding */ __spreadArray),
|
53
|
-
/* harmony export */ __spreadArrays: () => (/* binding */ __spreadArrays),
|
54
|
-
/* harmony export */ __values: () => (/* binding */ __values),
|
55
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
56
|
-
/* harmony export */ });
|
57
|
-
/******************************************************************************
|
58
|
-
Copyright (c) Microsoft Corporation.
|
59
|
-
|
60
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
61
|
-
purpose with or without fee is hereby granted.
|
62
|
-
|
63
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
64
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
65
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
66
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
67
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
68
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
69
|
-
PERFORMANCE OF THIS SOFTWARE.
|
70
|
-
***************************************************************************** */
|
71
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
72
|
-
|
73
|
-
var extendStatics = function(d, b) {
|
74
|
-
extendStatics = Object.setPrototypeOf ||
|
75
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
76
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
77
|
-
return extendStatics(d, b);
|
78
|
-
};
|
79
|
-
|
80
|
-
function __extends(d, b) {
|
81
|
-
if (typeof b !== "function" && b !== null)
|
82
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
83
|
-
extendStatics(d, b);
|
84
|
-
function __() { this.constructor = d; }
|
85
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
86
|
-
}
|
87
|
-
|
88
|
-
var __assign = function() {
|
89
|
-
__assign = Object.assign || function __assign(t) {
|
90
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
91
|
-
s = arguments[i];
|
92
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
93
|
-
}
|
94
|
-
return t;
|
95
|
-
}
|
96
|
-
return __assign.apply(this, arguments);
|
97
|
-
}
|
98
|
-
|
99
|
-
function __rest(s, e) {
|
100
|
-
var t = {};
|
101
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
102
|
-
t[p] = s[p];
|
103
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
104
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
105
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
106
|
-
t[p[i]] = s[p[i]];
|
107
|
-
}
|
108
|
-
return t;
|
109
|
-
}
|
110
|
-
|
111
|
-
function __decorate(decorators, target, key, desc) {
|
112
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
113
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
114
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
115
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
116
|
-
}
|
117
|
-
|
118
|
-
function __param(paramIndex, decorator) {
|
119
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
120
|
-
}
|
121
|
-
|
122
|
-
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
123
|
-
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
124
|
-
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
125
|
-
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
126
|
-
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
127
|
-
var _, done = false;
|
128
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
129
|
-
var context = {};
|
130
|
-
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
131
|
-
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
132
|
-
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
133
|
-
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
134
|
-
if (kind === "accessor") {
|
135
|
-
if (result === void 0) continue;
|
136
|
-
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
137
|
-
if (_ = accept(result.get)) descriptor.get = _;
|
138
|
-
if (_ = accept(result.set)) descriptor.set = _;
|
139
|
-
if (_ = accept(result.init)) initializers.unshift(_);
|
140
|
-
}
|
141
|
-
else if (_ = accept(result)) {
|
142
|
-
if (kind === "field") initializers.unshift(_);
|
143
|
-
else descriptor[key] = _;
|
144
|
-
}
|
145
|
-
}
|
146
|
-
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
147
|
-
done = true;
|
148
|
-
};
|
149
|
-
|
150
|
-
function __runInitializers(thisArg, initializers, value) {
|
151
|
-
var useValue = arguments.length > 2;
|
152
|
-
for (var i = 0; i < initializers.length; i++) {
|
153
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
154
|
-
}
|
155
|
-
return useValue ? value : void 0;
|
156
|
-
};
|
157
|
-
|
158
|
-
function __propKey(x) {
|
159
|
-
return typeof x === "symbol" ? x : "".concat(x);
|
160
|
-
};
|
161
|
-
|
162
|
-
function __setFunctionName(f, name, prefix) {
|
163
|
-
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
|
164
|
-
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
|
165
|
-
};
|
166
|
-
|
167
|
-
function __metadata(metadataKey, metadataValue) {
|
168
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
169
|
-
}
|
170
|
-
|
171
|
-
function __awaiter(thisArg, _arguments, P, generator) {
|
172
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
173
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
174
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
175
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
176
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
177
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
178
|
-
});
|
179
|
-
}
|
180
|
-
|
181
|
-
function __generator(thisArg, body) {
|
182
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
183
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
184
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
185
|
-
function step(op) {
|
186
|
-
if (f) throw new TypeError("Generator is already executing.");
|
187
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
188
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
189
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
190
|
-
switch (op[0]) {
|
191
|
-
case 0: case 1: t = op; break;
|
192
|
-
case 4: _.label++; return { value: op[1], done: false };
|
193
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
194
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
195
|
-
default:
|
196
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
197
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
198
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
199
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
200
|
-
if (t[2]) _.ops.pop();
|
201
|
-
_.trys.pop(); continue;
|
202
|
-
}
|
203
|
-
op = body.call(thisArg, _);
|
204
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
205
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
206
|
-
}
|
207
|
-
}
|
208
|
-
|
209
|
-
var __createBinding = Object.create ? (function(o, m, k, k2) {
|
210
|
-
if (k2 === undefined) k2 = k;
|
211
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
212
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
213
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
214
|
-
}
|
215
|
-
Object.defineProperty(o, k2, desc);
|
216
|
-
}) : (function(o, m, k, k2) {
|
217
|
-
if (k2 === undefined) k2 = k;
|
218
|
-
o[k2] = m[k];
|
219
|
-
});
|
220
|
-
|
221
|
-
function __exportStar(m, o) {
|
222
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
|
223
|
-
}
|
224
|
-
|
225
|
-
function __values(o) {
|
226
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
227
|
-
if (m) return m.call(o);
|
228
|
-
if (o && typeof o.length === "number") return {
|
229
|
-
next: function () {
|
230
|
-
if (o && i >= o.length) o = void 0;
|
231
|
-
return { value: o && o[i++], done: !o };
|
232
|
-
}
|
233
|
-
};
|
234
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
235
|
-
}
|
236
|
-
|
237
|
-
function __read(o, n) {
|
238
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
239
|
-
if (!m) return o;
|
240
|
-
var i = m.call(o), r, ar = [], e;
|
241
|
-
try {
|
242
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
243
|
-
}
|
244
|
-
catch (error) { e = { error: error }; }
|
245
|
-
finally {
|
246
|
-
try {
|
247
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
248
|
-
}
|
249
|
-
finally { if (e) throw e.error; }
|
250
|
-
}
|
251
|
-
return ar;
|
252
|
-
}
|
253
|
-
|
254
|
-
/** @deprecated */
|
255
|
-
function __spread() {
|
256
|
-
for (var ar = [], i = 0; i < arguments.length; i++)
|
257
|
-
ar = ar.concat(__read(arguments[i]));
|
258
|
-
return ar;
|
259
|
-
}
|
260
|
-
|
261
|
-
/** @deprecated */
|
262
|
-
function __spreadArrays() {
|
263
|
-
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
264
|
-
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
265
|
-
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
266
|
-
r[k] = a[j];
|
267
|
-
return r;
|
268
|
-
}
|
269
|
-
|
270
|
-
function __spreadArray(to, from, pack) {
|
271
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
272
|
-
if (ar || !(i in from)) {
|
273
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
274
|
-
ar[i] = from[i];
|
275
|
-
}
|
276
|
-
}
|
277
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
278
|
-
}
|
279
|
-
|
280
|
-
function __await(v) {
|
281
|
-
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
282
|
-
}
|
283
|
-
|
284
|
-
function __asyncGenerator(thisArg, _arguments, generator) {
|
285
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
286
|
-
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
287
|
-
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
288
|
-
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
289
|
-
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
290
|
-
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
291
|
-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
292
|
-
function fulfill(value) { resume("next", value); }
|
293
|
-
function reject(value) { resume("throw", value); }
|
294
|
-
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
295
|
-
}
|
296
|
-
|
297
|
-
function __asyncDelegator(o) {
|
298
|
-
var i, p;
|
299
|
-
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
300
|
-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
|
301
|
-
}
|
302
|
-
|
303
|
-
function __asyncValues(o) {
|
304
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
305
|
-
var m = o[Symbol.asyncIterator], i;
|
306
|
-
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
307
|
-
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
308
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
309
|
-
}
|
310
|
-
|
311
|
-
function __makeTemplateObject(cooked, raw) {
|
312
|
-
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
313
|
-
return cooked;
|
314
|
-
};
|
315
|
-
|
316
|
-
var __setModuleDefault = Object.create ? (function(o, v) {
|
317
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
318
|
-
}) : function(o, v) {
|
319
|
-
o["default"] = v;
|
320
|
-
};
|
321
|
-
|
322
|
-
var ownKeys = function(o) {
|
323
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
324
|
-
var ar = [];
|
325
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
326
|
-
return ar;
|
327
|
-
};
|
328
|
-
return ownKeys(o);
|
329
|
-
};
|
330
|
-
|
331
|
-
function __importStar(mod) {
|
332
|
-
if (mod && mod.__esModule) return mod;
|
333
|
-
var result = {};
|
334
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
335
|
-
__setModuleDefault(result, mod);
|
336
|
-
return result;
|
337
|
-
}
|
338
|
-
|
339
|
-
function __importDefault(mod) {
|
340
|
-
return (mod && mod.__esModule) ? mod : { default: mod };
|
341
|
-
}
|
342
|
-
|
343
|
-
function __classPrivateFieldGet(receiver, state, kind, f) {
|
344
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
345
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
346
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
347
|
-
}
|
348
|
-
|
349
|
-
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
350
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
351
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
352
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
353
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
354
|
-
}
|
355
|
-
|
356
|
-
function __classPrivateFieldIn(state, receiver) {
|
357
|
-
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
|
358
|
-
return typeof state === "function" ? receiver === state : state.has(receiver);
|
359
|
-
}
|
360
|
-
|
361
|
-
function __addDisposableResource(env, value, async) {
|
362
|
-
if (value !== null && value !== void 0) {
|
363
|
-
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
364
|
-
var dispose, inner;
|
365
|
-
if (async) {
|
366
|
-
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
367
|
-
dispose = value[Symbol.asyncDispose];
|
368
|
-
}
|
369
|
-
if (dispose === void 0) {
|
370
|
-
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
371
|
-
dispose = value[Symbol.dispose];
|
372
|
-
if (async) inner = dispose;
|
373
|
-
}
|
374
|
-
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
375
|
-
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
376
|
-
env.stack.push({ value: value, dispose: dispose, async: async });
|
377
|
-
}
|
378
|
-
else if (async) {
|
379
|
-
env.stack.push({ async: true });
|
380
|
-
}
|
381
|
-
return value;
|
382
|
-
}
|
383
|
-
|
384
|
-
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
385
|
-
var e = new Error(message);
|
386
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
387
|
-
};
|
388
|
-
|
389
|
-
function __disposeResources(env) {
|
390
|
-
function fail(e) {
|
391
|
-
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
392
|
-
env.hasError = true;
|
393
|
-
}
|
394
|
-
var r, s = 0;
|
395
|
-
function next() {
|
396
|
-
while (r = env.stack.pop()) {
|
397
|
-
try {
|
398
|
-
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
399
|
-
if (r.dispose) {
|
400
|
-
var result = r.dispose.call(r.value);
|
401
|
-
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
402
|
-
}
|
403
|
-
else s |= 1;
|
404
|
-
}
|
405
|
-
catch (e) {
|
406
|
-
fail(e);
|
407
|
-
}
|
408
|
-
}
|
409
|
-
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
410
|
-
if (env.hasError) throw env.error;
|
411
|
-
}
|
412
|
-
return next();
|
413
|
-
}
|
414
|
-
|
415
|
-
function __rewriteRelativeImportExtension(path, preserveJsx) {
|
416
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
417
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
418
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
419
|
-
});
|
420
|
-
}
|
421
|
-
return path;
|
422
|
-
}
|
423
|
-
|
424
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
425
|
-
__extends,
|
426
|
-
__assign,
|
427
|
-
__rest,
|
428
|
-
__decorate,
|
429
|
-
__param,
|
430
|
-
__esDecorate,
|
431
|
-
__runInitializers,
|
432
|
-
__propKey,
|
433
|
-
__setFunctionName,
|
434
|
-
__metadata,
|
435
|
-
__awaiter,
|
436
|
-
__generator,
|
437
|
-
__createBinding,
|
438
|
-
__exportStar,
|
439
|
-
__values,
|
440
|
-
__read,
|
441
|
-
__spread,
|
442
|
-
__spreadArrays,
|
443
|
-
__spreadArray,
|
444
|
-
__await,
|
445
|
-
__asyncGenerator,
|
446
|
-
__asyncDelegator,
|
447
|
-
__asyncValues,
|
448
|
-
__makeTemplateObject,
|
449
|
-
__importStar,
|
450
|
-
__importDefault,
|
451
|
-
__classPrivateFieldGet,
|
452
|
-
__classPrivateFieldSet,
|
453
|
-
__classPrivateFieldIn,
|
454
|
-
__addDisposableResource,
|
455
|
-
__disposeResources,
|
456
|
-
__rewriteRelativeImportExtension,
|
457
|
-
});
|
458
|
-
|
459
|
-
|
460
|
-
/***/ }),
|
461
|
-
|
462
|
-
/***/ "../../../dev/addons/src/htmlMesh/fitStrategy.ts":
|
463
|
-
/*!*******************************************************!*\
|
464
|
-
!*** ../../../dev/addons/src/htmlMesh/fitStrategy.ts ***!
|
465
|
-
\*******************************************************/
|
466
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
467
|
-
|
468
|
-
__webpack_require__.r(__webpack_exports__);
|
469
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
470
|
-
/* harmony export */ FitStrategy: () => (/* binding */ FitStrategy)
|
471
|
-
/* harmony export */ });
|
472
|
-
var FitStrategyContain = {
|
473
|
-
wrapElement: function (element) {
|
474
|
-
var sizingElement = document.createElement("div");
|
475
|
-
sizingElement.style.display = "flex";
|
476
|
-
sizingElement.style.justifyContent = "center";
|
477
|
-
sizingElement.style.alignItems = "center";
|
478
|
-
var scalingElement = document.createElement("div");
|
479
|
-
scalingElement.style.visibility = "hidden";
|
480
|
-
scalingElement.appendChild(element);
|
481
|
-
sizingElement.appendChild(scalingElement);
|
482
|
-
return sizingElement;
|
483
|
-
},
|
484
|
-
updateSize: function (sizingElement, width, height) {
|
485
|
-
var scalingElement = sizingElement.firstElementChild;
|
486
|
-
sizingElement.style.width = "".concat(width, "px");
|
487
|
-
sizingElement.style.height = "".concat(height, "px");
|
488
|
-
var _a = [scalingElement.offsetWidth, scalingElement.offsetHeight], childWidth = _a[0], childHeight = _a[1];
|
489
|
-
var scale = Math.min(width / childWidth, height / childHeight);
|
490
|
-
scalingElement.style.transform = "scale(".concat(scale, ")");
|
491
|
-
scalingElement.style.visibility = "visible";
|
492
|
-
},
|
493
|
-
};
|
494
|
-
var FitStrategyCover = {
|
495
|
-
wrapElement: function (element) {
|
496
|
-
var sizingElement = document.createElement("div");
|
497
|
-
sizingElement.style.display = "flex";
|
498
|
-
sizingElement.style.justifyContent = "center";
|
499
|
-
sizingElement.style.alignItems = "center";
|
500
|
-
sizingElement.style.overflow = "hidden";
|
501
|
-
var scalingElement = document.createElement("div");
|
502
|
-
scalingElement.style.visibility = "hidden";
|
503
|
-
scalingElement.appendChild(element);
|
504
|
-
sizingElement.appendChild(scalingElement);
|
505
|
-
return sizingElement;
|
506
|
-
},
|
507
|
-
updateSize: function (sizingElement, width, height) {
|
508
|
-
var scalingElement = sizingElement.firstElementChild;
|
509
|
-
sizingElement.style.width = "".concat(width, "px");
|
510
|
-
sizingElement.style.height = "".concat(height, "px");
|
511
|
-
var _a = [scalingElement.offsetWidth, scalingElement.offsetHeight], childWidth = _a[0], childHeight = _a[1];
|
512
|
-
var scale = Math.max(width / childWidth, height / childHeight);
|
513
|
-
scalingElement.style.transform = "scale(".concat(scale, ")");
|
514
|
-
scalingElement.style.visibility = "visible";
|
515
|
-
},
|
516
|
-
};
|
517
|
-
var FitStrategyStretch = {
|
518
|
-
wrapElement: function (element) {
|
519
|
-
var sizingElement = document.createElement("div");
|
520
|
-
sizingElement.style.display = "flex";
|
521
|
-
sizingElement.style.justifyContent = "center";
|
522
|
-
sizingElement.style.alignItems = "center";
|
523
|
-
var scalingElement = document.createElement("div");
|
524
|
-
scalingElement.style.visibility = "hidden";
|
525
|
-
scalingElement.appendChild(element);
|
526
|
-
sizingElement.appendChild(scalingElement);
|
527
|
-
return sizingElement;
|
528
|
-
},
|
529
|
-
updateSize: function (sizingElement, width, height) {
|
530
|
-
var scalingElement = sizingElement.firstElementChild;
|
531
|
-
sizingElement.style.width = "".concat(width, "px");
|
532
|
-
sizingElement.style.height = "".concat(height, "px");
|
533
|
-
var _a = [scalingElement.offsetWidth, scalingElement.offsetHeight], childWidth = _a[0], childHeight = _a[1];
|
534
|
-
scalingElement.style.transform = "scale(".concat(width / childWidth, ", ").concat(height / childHeight, ")");
|
535
|
-
scalingElement.style.visibility = "visible";
|
536
|
-
},
|
537
|
-
};
|
538
|
-
var FitStrategyNone = {
|
539
|
-
wrapElement: function (element) {
|
540
|
-
return element;
|
541
|
-
},
|
542
|
-
updateSize: function (sizingElement, width, height) {
|
543
|
-
if (sizingElement) {
|
544
|
-
sizingElement.style.width = "".concat(width, "px");
|
545
|
-
sizingElement.style.height = "".concat(height, "px");
|
546
|
-
}
|
547
|
-
},
|
548
|
-
};
|
549
|
-
var FitStrategy = {
|
550
|
-
CONTAIN: FitStrategyContain,
|
551
|
-
COVER: FitStrategyCover,
|
552
|
-
STRETCH: FitStrategyStretch,
|
553
|
-
NONE: FitStrategyNone,
|
554
|
-
};
|
555
|
-
|
556
|
-
|
557
|
-
/***/ }),
|
558
|
-
|
559
|
-
/***/ "../../../dev/addons/src/htmlMesh/htmlMesh.ts":
|
560
|
-
/*!****************************************************!*\
|
561
|
-
!*** ../../../dev/addons/src/htmlMesh/htmlMesh.ts ***!
|
562
|
-
\****************************************************/
|
563
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
564
|
-
|
565
|
-
__webpack_require__.r(__webpack_exports__);
|
566
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
567
|
-
/* harmony export */ HtmlMesh: () => (/* binding */ HtmlMesh)
|
568
|
-
/* harmony export */ });
|
569
|
-
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
570
|
-
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
|
571
|
-
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__);
|
572
|
-
/* harmony import */ var _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCaptureBehavior */ "../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts");
|
573
|
-
/* harmony import */ var _fitStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fitStrategy */ "../../../dev/addons/src/htmlMesh/fitStrategy.ts");
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
/**
|
583
|
-
* This class represents HTML content that we want to render as though it is part of the scene. The HTML content is actually
|
584
|
-
* rendered below the canvas, but a depth mask is created by this class that writes to the depth buffer but does not
|
585
|
-
* write to the color buffer, effectively punching a hole in the canvas. CSS transforms are used to scale, translate, and rotate
|
586
|
-
* the HTML content so that it matches the camera and mesh orientation. The class supports interactions in editable and non-editable mode.
|
587
|
-
* In non-editable mode (the default), events are passed to the HTML content when the pointer is over the mask (and not occluded by other meshes
|
588
|
-
* in the scene).
|
589
|
-
* @see https://playground.babylonjs.com/#HVHYJC#5
|
590
|
-
* @see https://playground.babylonjs.com/#B17TC7#112
|
591
|
-
*/
|
592
|
-
var HtmlMesh = /** @class */ (function (_super) {
|
593
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_3__.__extends)(HtmlMesh, _super);
|
594
|
-
/**
|
595
|
-
* Contruct an instance of HtmlMesh
|
596
|
-
* @param scene
|
597
|
-
* @param id The id of the mesh. Will be used as the id of the HTML element as well.
|
598
|
-
* @param options object with optional parameters
|
599
|
-
*/
|
600
|
-
function HtmlMesh(scene, id, _a) {
|
601
|
-
var _b = _a === void 0 ? {} : _a, _c = _b.captureOnPointerEnter, captureOnPointerEnter = _c === void 0 ? true : _c, _d = _b.isCanvasOverlay, isCanvasOverlay = _d === void 0 ? false : _d, _e = _b.fitStrategy, fitStrategy = _e === void 0 ? _fitStrategy__WEBPACK_IMPORTED_MODULE_2__.FitStrategy.NONE : _e;
|
602
|
-
var _this = _super.call(this, id, scene) || this;
|
603
|
-
// Override the super class's _isEnabled property so we can control when the mesh
|
604
|
-
// is enabled. I.e., we don't want to render the mesh until there is content to show.
|
605
|
-
_this._enabled = false;
|
606
|
-
// The mesh is ready when content has been set and the content size has been set
|
607
|
-
// The former is done by the user, the latter is done by the renderer.
|
608
|
-
_this._ready = false;
|
609
|
-
/**
|
610
|
-
* @internal
|
611
|
-
*/
|
612
|
-
_this._isCanvasOverlay = false;
|
613
|
-
_this._requiresUpdate = true;
|
614
|
-
_this._inverseScaleMatrix = null;
|
615
|
-
_this._captureOnPointerEnter = true;
|
616
|
-
_this._pointerEventCaptureBehavior = null;
|
617
|
-
_this._sourceWidth = null;
|
618
|
-
_this._sourceHeight = null;
|
619
|
-
_this._fitStrategy = _fitStrategy__WEBPACK_IMPORTED_MODULE_2__.FitStrategy.NONE;
|
620
|
-
// Requires a browser to work. Bail if we aren't running in a browser
|
621
|
-
if (typeof document === "undefined") {
|
622
|
-
babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__.Logger.Warn("Creating an instance of an HtmlMesh with id ".concat(id, " outside of a browser. The mesh will not be visible."));
|
623
|
-
return _this;
|
624
|
-
}
|
625
|
-
_this._fitStrategy = fitStrategy;
|
626
|
-
_this._isCanvasOverlay = isCanvasOverlay;
|
627
|
-
_this._createMask();
|
628
|
-
_this._element = _this._createElement();
|
629
|
-
// Set enabled by default, so this will show as soon as it's ready
|
630
|
-
_this.setEnabled(true);
|
631
|
-
_this._captureOnPointerEnter = captureOnPointerEnter;
|
632
|
-
// Create a behavior to capture pointer events
|
633
|
-
_this._pointerEventCaptureBehavior = new _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_1__.PointerEventsCaptureBehavior(_this.capturePointerEvents.bind(_this), _this.releasePointerEvents.bind(_this), {
|
634
|
-
captureOnPointerEnter: _this._captureOnPointerEnter,
|
635
|
-
});
|
636
|
-
_this.addBehavior(_this._pointerEventCaptureBehavior);
|
637
|
-
return _this;
|
638
|
-
}
|
639
|
-
Object.defineProperty(HtmlMesh.prototype, "isHtmlMesh", {
|
640
|
-
/**
|
641
|
-
* Helps identifying a html mesh from a regular mesh
|
642
|
-
*/
|
643
|
-
get: function () {
|
644
|
-
return true;
|
645
|
-
},
|
646
|
-
enumerable: false,
|
647
|
-
configurable: true
|
648
|
-
});
|
649
|
-
Object.defineProperty(HtmlMesh.prototype, "sourceWidth", {
|
650
|
-
/**
|
651
|
-
* Return the source width of the content in pixels
|
652
|
-
*/
|
653
|
-
get: function () {
|
654
|
-
return this._sourceWidth;
|
655
|
-
},
|
656
|
-
enumerable: false,
|
657
|
-
configurable: true
|
658
|
-
});
|
659
|
-
Object.defineProperty(HtmlMesh.prototype, "sourceHeight", {
|
660
|
-
/**
|
661
|
-
* Return the source height of the content in pixels
|
662
|
-
*/
|
663
|
-
get: function () {
|
664
|
-
return this._sourceHeight;
|
665
|
-
},
|
666
|
-
enumerable: false,
|
667
|
-
configurable: true
|
668
|
-
});
|
669
|
-
Object.defineProperty(HtmlMesh.prototype, "width", {
|
670
|
-
/**
|
671
|
-
* The width of the content in pixels
|
672
|
-
*/
|
673
|
-
get: function () {
|
674
|
-
return this._width;
|
675
|
-
},
|
676
|
-
enumerable: false,
|
677
|
-
configurable: true
|
678
|
-
});
|
679
|
-
Object.defineProperty(HtmlMesh.prototype, "height", {
|
680
|
-
/**
|
681
|
-
* The height of the content in pixels
|
682
|
-
*/
|
683
|
-
get: function () {
|
684
|
-
return this._height;
|
685
|
-
},
|
686
|
-
enumerable: false,
|
687
|
-
configurable: true
|
688
|
-
});
|
689
|
-
Object.defineProperty(HtmlMesh.prototype, "element", {
|
690
|
-
/**
|
691
|
-
* The HTML element that is being rendered as a mesh
|
692
|
-
*/
|
693
|
-
get: function () {
|
694
|
-
return this._element;
|
695
|
-
},
|
696
|
-
enumerable: false,
|
697
|
-
configurable: true
|
698
|
-
});
|
699
|
-
Object.defineProperty(HtmlMesh.prototype, "requiresUpdate", {
|
700
|
-
/**
|
701
|
-
* True if the mesh has been moved, rotated, or scaled since the last time this
|
702
|
-
* property was read. This property is reset to false after reading.
|
703
|
-
*/
|
704
|
-
get: function () {
|
705
|
-
return this._requiresUpdate;
|
706
|
-
},
|
707
|
-
enumerable: false,
|
708
|
-
configurable: true
|
709
|
-
});
|
710
|
-
Object.defineProperty(HtmlMesh.prototype, "captureOnPointerEnter", {
|
711
|
-
/**
|
712
|
-
* Enable capture for the pointer when entering the mesh area
|
713
|
-
*/
|
714
|
-
set: function (captureOnPointerEnter) {
|
715
|
-
this._captureOnPointerEnter = captureOnPointerEnter;
|
716
|
-
if (this._pointerEventCaptureBehavior) {
|
717
|
-
this._pointerEventCaptureBehavior.captureOnPointerEnter = captureOnPointerEnter;
|
718
|
-
}
|
719
|
-
},
|
720
|
-
enumerable: false,
|
721
|
-
configurable: true
|
722
|
-
});
|
723
|
-
/**
|
724
|
-
* Disposes of the mesh and the HTML element
|
725
|
-
*/
|
726
|
-
HtmlMesh.prototype.dispose = function () {
|
727
|
-
var _a;
|
728
|
-
_super.prototype.dispose.call(this);
|
729
|
-
(_a = this._element) === null || _a === void 0 ? void 0 : _a.remove();
|
730
|
-
this._element = undefined;
|
731
|
-
if (this._pointerEventCaptureBehavior) {
|
732
|
-
this._pointerEventCaptureBehavior.dispose();
|
733
|
-
this._pointerEventCaptureBehavior = null;
|
734
|
-
}
|
735
|
-
};
|
736
|
-
/**
|
737
|
-
* @internal
|
738
|
-
*/
|
739
|
-
HtmlMesh.prototype._markAsUpdated = function () {
|
740
|
-
this._requiresUpdate = false;
|
741
|
-
};
|
742
|
-
/**
|
743
|
-
* Sets the content of the element to the specified content adjusting the mesh scale to match and making it visible.
|
744
|
-
* If the the specified content is undefined, then it will make the mesh invisible. In either case it will clear the
|
745
|
-
* element content first.
|
746
|
-
* @param element The element to render as a mesh
|
747
|
-
* @param width The width of the mesh in Babylon units
|
748
|
-
* @param height The height of the mesh in Babylon units
|
749
|
-
*/
|
750
|
-
HtmlMesh.prototype.setContent = function (element, width, height) {
|
751
|
-
// If content is changed, we are no longer ready
|
752
|
-
this._setAsReady(false);
|
753
|
-
// Also invalidate the source width and height
|
754
|
-
this._sourceWidth = null;
|
755
|
-
this._sourceHeight = null;
|
756
|
-
if (!this._element) {
|
757
|
-
return;
|
758
|
-
}
|
759
|
-
this._width = width;
|
760
|
-
this._height = height;
|
761
|
-
this._requiresUpdate = true;
|
762
|
-
this.scaling.setAll(1);
|
763
|
-
if (element) {
|
764
|
-
this._element.appendChild(this._fitStrategy.wrapElement(element));
|
765
|
-
this._updateScaleIfNecessary();
|
766
|
-
}
|
767
|
-
if (this.sourceWidth && this.sourceHeight) {
|
768
|
-
this._setAsReady(true);
|
769
|
-
}
|
770
|
-
};
|
771
|
-
// Overides BABYLON.Mesh.setEnabled
|
772
|
-
HtmlMesh.prototype.setEnabled = function (enabled) {
|
773
|
-
// Capture requested enabled state
|
774
|
-
this._enabled = enabled;
|
775
|
-
// If disabling or enabling and we are ready
|
776
|
-
if (!enabled || this._ready) {
|
777
|
-
this._doSetEnabled(enabled);
|
778
|
-
}
|
779
|
-
};
|
780
|
-
/**
|
781
|
-
* Sets the content size in pixels
|
782
|
-
* @param width width of the source
|
783
|
-
* @param height height of the source
|
784
|
-
*/
|
785
|
-
HtmlMesh.prototype.setContentSizePx = function (width, height) {
|
786
|
-
this._sourceWidth = width;
|
787
|
-
this._sourceHeight = height;
|
788
|
-
if (!this._element || !this._element.firstElementChild) {
|
789
|
-
return;
|
790
|
-
}
|
791
|
-
this._fitStrategy.updateSize(this._element.firstElementChild, width, height);
|
792
|
-
this._updateScaleIfNecessary();
|
793
|
-
if (this.width && this.height) {
|
794
|
-
this._setAsReady(true);
|
795
|
-
}
|
796
|
-
};
|
797
|
-
HtmlMesh.prototype._setAsReady = function (ready) {
|
798
|
-
this._ready = ready;
|
799
|
-
if (ready) {
|
800
|
-
this._doSetEnabled(this._enabled);
|
801
|
-
}
|
802
|
-
else {
|
803
|
-
this._doSetEnabled(false);
|
804
|
-
}
|
805
|
-
};
|
806
|
-
HtmlMesh.prototype._doSetEnabled = function (enabled) {
|
807
|
-
var _this = this;
|
808
|
-
var _a;
|
809
|
-
if (!this._element) {
|
810
|
-
return;
|
811
|
-
}
|
812
|
-
//if enabled, then start listening for changes to the
|
813
|
-
// scaling, rotation, and position. otherwise stop listening
|
814
|
-
if (enabled && !this._worldMatrixUpdateObserver) {
|
815
|
-
this._worldMatrixUpdateObserver = this.onAfterWorldMatrixUpdateObservable.add(function () {
|
816
|
-
_this._requiresUpdate = true;
|
817
|
-
});
|
818
|
-
}
|
819
|
-
else if (!enabled) {
|
820
|
-
(_a = this._worldMatrixUpdateObserver) === null || _a === void 0 ? void 0 : _a.remove();
|
821
|
-
this._worldMatrixUpdateObserver = null;
|
822
|
-
}
|
823
|
-
// If enabled, then revert the content element display
|
824
|
-
// otherwise hide it
|
825
|
-
this._element.style.display = enabled ? "" : "none";
|
826
|
-
// Capture the content z index
|
827
|
-
this._setElementzIndex(this.position.z * -10000);
|
828
|
-
_super.prototype.setEnabled.call(this, enabled);
|
829
|
-
};
|
830
|
-
HtmlMesh.prototype._updateScaleIfNecessary = function () {
|
831
|
-
// If we have setContent before, the content scale is baked into the mesh. If we don't reset the vertices to
|
832
|
-
// the original size, then we will multiply the scale when we bake the scale below. By applying the inverse, we back out
|
833
|
-
// the scaling that has been done so we are starting from the same point.
|
834
|
-
// First reset the scale to 1
|
835
|
-
this.scaling.setAll(1);
|
836
|
-
// Then back out the original vertices changes to match the content scale
|
837
|
-
if (this._inverseScaleMatrix) {
|
838
|
-
this.bakeTransformIntoVertices(this._inverseScaleMatrix);
|
839
|
-
// Clear out the matrix so it doesn't get applied again unless we scale
|
840
|
-
this._inverseScaleMatrix = null;
|
841
|
-
}
|
842
|
-
// Set scale to match content. Note we can't just scale the mesh, because that will scale the content as well
|
843
|
-
// What we need to do is compute a scale matrix and then bake that into the mesh vertices. This will leave the
|
844
|
-
// mesh scale at 1, so our content will stay it's original width and height until we scale the mesh.
|
845
|
-
var scaleX = this._width || 1;
|
846
|
-
var scaleY = this._height || 1;
|
847
|
-
var scaleMatrix = babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__.Matrix.Scaling(scaleX, scaleY, 1);
|
848
|
-
this.bakeTransformIntoVertices(scaleMatrix);
|
849
|
-
// Get an inverse of the scale matrix that we can use to back out the scale changes we have made so
|
850
|
-
// we don't multiply the scale.
|
851
|
-
this._inverseScaleMatrix = new babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__.Matrix();
|
852
|
-
scaleMatrix.invertToRef(this._inverseScaleMatrix);
|
853
|
-
};
|
854
|
-
HtmlMesh.prototype._createMask = function () {
|
855
|
-
var vertexData = (0,babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__.CreatePlaneVertexData)({ width: 1, height: 1 });
|
856
|
-
vertexData.applyToMesh(this);
|
857
|
-
var scene = this.getScene();
|
858
|
-
this.checkCollisions = true;
|
859
|
-
var depthMask = new babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__.StandardMaterial("".concat(this.id, "-mat"), scene);
|
860
|
-
if (!this._isCanvasOverlay) {
|
861
|
-
depthMask.backFaceCulling = false;
|
862
|
-
depthMask.disableColorWrite = true;
|
863
|
-
depthMask.disableLighting = true;
|
864
|
-
}
|
865
|
-
this.material = depthMask;
|
866
|
-
// Optimization - Freeze material since it never needs to change
|
867
|
-
this.material.freeze();
|
868
|
-
};
|
869
|
-
HtmlMesh.prototype._setElementzIndex = function (zIndex) {
|
870
|
-
if (this._element) {
|
871
|
-
this._element.style.zIndex = "".concat(zIndex);
|
872
|
-
}
|
873
|
-
};
|
874
|
-
/**
|
875
|
-
* Callback used by the PointerEventsCaptureBehavior to capture pointer events
|
876
|
-
*/
|
877
|
-
HtmlMesh.prototype.capturePointerEvents = function () {
|
878
|
-
if (!this._element) {
|
879
|
-
return;
|
880
|
-
}
|
881
|
-
// Enable dom content to capture pointer events
|
882
|
-
this._element.style.pointerEvents = "auto";
|
883
|
-
// Supress events outside of the dom content
|
884
|
-
document.getElementsByTagName("body")[0].style.pointerEvents = "none";
|
885
|
-
};
|
886
|
-
/**
|
887
|
-
* Callback used by the PointerEventsCaptureBehavior to release pointer events
|
888
|
-
*/
|
889
|
-
HtmlMesh.prototype.releasePointerEvents = function () {
|
890
|
-
if (!this._element) {
|
891
|
-
return;
|
892
|
-
}
|
893
|
-
// Enable pointer events on canvas
|
894
|
-
document.getElementsByTagName("body")[0].style.pointerEvents = "auto";
|
895
|
-
// Disable pointer events on dom content
|
896
|
-
this._element.style.pointerEvents = "none";
|
897
|
-
};
|
898
|
-
HtmlMesh.prototype._createElement = function () {
|
899
|
-
// Requires a browser to work. Bail if we aren't running in a browser
|
900
|
-
if (typeof document === "undefined") {
|
901
|
-
return;
|
902
|
-
}
|
903
|
-
var div = document.createElement("div");
|
904
|
-
div.id = this.id;
|
905
|
-
div.style.backgroundColor = this._isCanvasOverlay ? "transparent" : "#000";
|
906
|
-
div.style.zIndex = "1";
|
907
|
-
div.style.position = "absolute";
|
908
|
-
div.style.pointerEvents = "none";
|
909
|
-
div.style.backfaceVisibility = "hidden";
|
910
|
-
return div;
|
911
|
-
};
|
912
|
-
return HtmlMesh;
|
913
|
-
}(babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__.Mesh));
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
/***/ }),
|
918
|
-
|
919
|
-
/***/ "../../../dev/addons/src/htmlMesh/htmlMeshRenderer.ts":
|
920
|
-
/*!************************************************************!*\
|
921
|
-
!*** ../../../dev/addons/src/htmlMesh/htmlMeshRenderer.ts ***!
|
922
|
-
\************************************************************/
|
923
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
924
|
-
|
925
|
-
__webpack_require__.r(__webpack_exports__);
|
926
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
927
|
-
/* harmony export */ HtmlMeshRenderer: () => (/* binding */ HtmlMeshRenderer)
|
928
|
-
/* harmony export */ });
|
929
|
-
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
|
930
|
-
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__);
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
var PositionUpdateFailMessage = "Failed to update html mesh renderer position due to failure to get canvas rect. HtmlMesh instances may not render correctly";
|
936
|
-
var BabylonUnitsToPixels = 100;
|
937
|
-
// Returns a function that ensures that HtmlMeshes are rendered before all other meshes.
|
938
|
-
// Note this will only be applied to group 0.
|
939
|
-
// If neither mesh is an HtmlMesh, then the default render order is used
|
940
|
-
// This prevents HtmlMeshes from appearing in front of other meshes when they are behind them
|
941
|
-
var RenderOrderFunc = function (defaultRenderOrder) {
|
942
|
-
return function (subMeshA, subMeshB) {
|
943
|
-
var meshA = subMeshA.getMesh();
|
944
|
-
var meshB = subMeshB.getMesh();
|
945
|
-
// Use property check instead of instanceof since it is less expensive and
|
946
|
-
// this will be called many times per frame
|
947
|
-
var meshIsHtmlMeshA = meshA["isHtmlMesh"];
|
948
|
-
var meshIsHtmlMeshB = meshB["isHtmlMesh"];
|
949
|
-
if (meshIsHtmlMeshA) {
|
950
|
-
return meshIsHtmlMeshB ? (meshA.absolutePosition.z <= meshB.absolutePosition.z ? 1 : -1) : -1;
|
951
|
-
}
|
952
|
-
else {
|
953
|
-
return meshIsHtmlMeshB ? 1 : defaultRenderOrder(subMeshA, subMeshB);
|
954
|
-
}
|
955
|
-
};
|
956
|
-
};
|
957
|
-
/**
|
958
|
-
* An instance of this is required to render HtmlMeshes in the scene.
|
959
|
-
* if using HtmlMeshes, you must not set render order for group 0 using
|
960
|
-
* scene.setRenderingOrder. You must instead pass the compare functions
|
961
|
-
* to the HtmlMeshRenderer constructor. If you do not, then your render
|
962
|
-
* order will be overwritten if the HtmlMeshRenderer is created after and
|
963
|
-
* the HtmlMeshes will not render correctly (they will appear in front of
|
964
|
-
* meshes that are actually in front of them) if the HtmlMeshRenderer is
|
965
|
-
* created before.
|
966
|
-
*/
|
967
|
-
var HtmlMeshRenderer = /** @class */ (function () {
|
968
|
-
/**
|
969
|
-
* Contruct an instance of HtmlMeshRenderer
|
970
|
-
* @param scene
|
971
|
-
* @param options object containing the following optional properties:
|
972
|
-
* @returns
|
973
|
-
*/
|
974
|
-
function HtmlMeshRenderer(scene, _a) {
|
975
|
-
var _b = _a === void 0 ? {} : _a, _c = _b.parentContainerId, parentContainerId = _c === void 0 ? null : _c, _d = _b._containerId, _containerId = _d === void 0 ? "css-container" : _d, _e = _b.enableOverlayRender, enableOverlayRender = _e === void 0 ? true : _e, _f = _b.defaultOpaqueRenderOrder, defaultOpaqueRenderOrder = _f === void 0 ? babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.RenderingGroup.PainterSortCompare : _f, _g = _b.defaultAlphaTestRenderOrder, defaultAlphaTestRenderOrder = _g === void 0 ? babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.RenderingGroup.PainterSortCompare : _g, _h = _b.defaultTransparentRenderOrder, defaultTransparentRenderOrder = _h === void 0 ? babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.RenderingGroup.defaultTransparentSortCompare : _h;
|
976
|
-
var _this = this;
|
977
|
-
this._cache = {
|
978
|
-
cameraData: { fov: 0, position: new babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Vector3(), style: "" },
|
979
|
-
htmlMeshData: new WeakMap(),
|
980
|
-
};
|
981
|
-
this._width = 0;
|
982
|
-
this._height = 0;
|
983
|
-
this._heightHalf = 0;
|
984
|
-
// Create some refs to avoid creating new objects every frame
|
985
|
-
this._temp = {
|
986
|
-
scaleTransform: new babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Vector3(),
|
987
|
-
rotationTransform: new babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion(),
|
988
|
-
positionTransform: new babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Vector3(),
|
989
|
-
objectMatrix: babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Matrix.Identity(),
|
990
|
-
cameraWorldMatrix: babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Matrix.Identity(),
|
991
|
-
cameraRotationMatrix: babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Matrix.Identity(),
|
992
|
-
cameraWorldMatrixAsArray: new Array(16),
|
993
|
-
};
|
994
|
-
// Keep track of DPR so we can resize if DPR changes
|
995
|
-
// Otherwise the DOM content will scale, but the mesh won't
|
996
|
-
this._lastDevicePixelRatio = window.devicePixelRatio;
|
997
|
-
// Keep track of camera matrix changes so we only update the
|
998
|
-
// DOM element styles when necessary
|
999
|
-
this._cameraMatrixUpdated = true;
|
1000
|
-
// Keep track of position changes so we only update the DOM element
|
1001
|
-
// styles when necessary
|
1002
|
-
this._previousCanvasDocumentPosition = {
|
1003
|
-
top: 0,
|
1004
|
-
left: 0,
|
1005
|
-
};
|
1006
|
-
this._renderObserver = null;
|
1007
|
-
this._onCameraMatrixChanged = function (camera) {
|
1008
|
-
_this._cameraWorldMatrix = camera.getWorldMatrix();
|
1009
|
-
_this._cameraMatrixUpdated = true;
|
1010
|
-
};
|
1011
|
-
// Requires a browser to work. Only init if we are in a browser
|
1012
|
-
if (typeof document === "undefined") {
|
1013
|
-
return;
|
1014
|
-
}
|
1015
|
-
this._containerId = _containerId;
|
1016
|
-
this._init(scene, parentContainerId, enableOverlayRender, defaultOpaqueRenderOrder, defaultAlphaTestRenderOrder, defaultTransparentRenderOrder);
|
1017
|
-
}
|
1018
|
-
/**
|
1019
|
-
* Dispose of the HtmlMeshRenderer
|
1020
|
-
*/
|
1021
|
-
HtmlMeshRenderer.prototype.dispose = function () {
|
1022
|
-
var _a, _b;
|
1023
|
-
if (this._renderObserver) {
|
1024
|
-
this._renderObserver.remove();
|
1025
|
-
this._renderObserver = null;
|
1026
|
-
}
|
1027
|
-
(_a = this._overlayElements) === null || _a === void 0 ? void 0 : _a.container.remove();
|
1028
|
-
this._overlayElements = null;
|
1029
|
-
(_b = this._inSceneElements) === null || _b === void 0 ? void 0 : _b.container.remove();
|
1030
|
-
this._inSceneElements = null;
|
1031
|
-
};
|
1032
|
-
HtmlMeshRenderer.prototype._init = function (scene, parentContainerId, enableOverlayRender, defaultOpaqueRenderOrder, defaultAlphaTestRenderOrder, defaultTransparentRenderOrder) {
|
1033
|
-
var _this = this;
|
1034
|
-
var _a;
|
1035
|
-
// Requires a browser to work. Only init if we are in a browser
|
1036
|
-
if (typeof document === "undefined") {
|
1037
|
-
return;
|
1038
|
-
}
|
1039
|
-
// Create the DOM containers
|
1040
|
-
var parentContainer = parentContainerId ? document.getElementById(parentContainerId) : document.body;
|
1041
|
-
if (!parentContainer) {
|
1042
|
-
parentContainer = document.body;
|
1043
|
-
}
|
1044
|
-
// if the container already exists, then remove it
|
1045
|
-
var inSceneContainerId = "".concat(this._containerId, "_in_scene");
|
1046
|
-
this._inSceneElements = this._createRenderLayerElements(inSceneContainerId);
|
1047
|
-
parentContainer.insertBefore(this._inSceneElements.container, parentContainer.firstChild);
|
1048
|
-
if (enableOverlayRender) {
|
1049
|
-
var overlayContainerId = "".concat(this._containerId, "_overlay");
|
1050
|
-
this._overlayElements = this._createRenderLayerElements(overlayContainerId);
|
1051
|
-
var zIndex = +((_a = scene.getEngine().getRenderingCanvas().style.zIndex) !== null && _a !== void 0 ? _a : "0") + 1;
|
1052
|
-
this._overlayElements.container.style.zIndex = "".concat(zIndex);
|
1053
|
-
this._overlayElements.container.style.pointerEvents = "none";
|
1054
|
-
parentContainer.insertBefore(this._overlayElements.container, parentContainer.firstChild);
|
1055
|
-
}
|
1056
|
-
this._engine = scene.getEngine();
|
1057
|
-
var clientRect = this._engine.getRenderingCanvasClientRect();
|
1058
|
-
if (!clientRect) {
|
1059
|
-
throw new Error("Failed to get client rect for rendering canvas");
|
1060
|
-
}
|
1061
|
-
// Set the size and resize behavior
|
1062
|
-
this._setSize(clientRect.width, clientRect.height);
|
1063
|
-
this._engine.onResizeObservable.add(function () {
|
1064
|
-
var clientRect = _this._engine.getRenderingCanvasClientRect();
|
1065
|
-
if (clientRect) {
|
1066
|
-
_this._setSize(clientRect.width, clientRect.height);
|
1067
|
-
}
|
1068
|
-
});
|
1069
|
-
var projectionObs;
|
1070
|
-
var matrixObs;
|
1071
|
-
var observeCamera = function () {
|
1072
|
-
var camera = scene.activeCamera;
|
1073
|
-
if (camera) {
|
1074
|
-
projectionObs = camera.onProjectionMatrixChangedObservable.add(function () {
|
1075
|
-
_this._onCameraMatrixChanged(camera);
|
1076
|
-
});
|
1077
|
-
matrixObs = camera.onViewMatrixChangedObservable.add(function () {
|
1078
|
-
_this._onCameraMatrixChanged(camera);
|
1079
|
-
});
|
1080
|
-
}
|
1081
|
-
};
|
1082
|
-
observeCamera();
|
1083
|
-
scene.onActiveCameraChanged.add(function () {
|
1084
|
-
var _a, _b;
|
1085
|
-
if (projectionObs) {
|
1086
|
-
(_a = scene.activeCamera) === null || _a === void 0 ? void 0 : _a.onProjectionMatrixChangedObservable.remove(projectionObs);
|
1087
|
-
}
|
1088
|
-
if (matrixObs) {
|
1089
|
-
(_b = scene.activeCamera) === null || _b === void 0 ? void 0 : _b.onViewMatrixChangedObservable.remove(matrixObs);
|
1090
|
-
}
|
1091
|
-
observeCamera();
|
1092
|
-
});
|
1093
|
-
// We need to make sure that HtmlMeshes are rendered before all other meshes
|
1094
|
-
// so that they don't appear in front of meshes that are actually in front of them
|
1095
|
-
// Updating the render order isn't ideal, but it is the only way to acheive this
|
1096
|
-
// The implication is that an app using the HtmlMeshRendered must set the scene render order
|
1097
|
-
// via the HtmlMeshRendered constructor
|
1098
|
-
var opaqueRenderOrder = RenderOrderFunc(defaultOpaqueRenderOrder);
|
1099
|
-
var alphaTestRenderOrder = RenderOrderFunc(defaultAlphaTestRenderOrder);
|
1100
|
-
var transparentRenderOrder = RenderOrderFunc(defaultTransparentRenderOrder);
|
1101
|
-
scene.setRenderingOrder(0, opaqueRenderOrder, alphaTestRenderOrder, transparentRenderOrder);
|
1102
|
-
this._renderObserver = scene.onBeforeRenderObservable.add(function () {
|
1103
|
-
_this._render(scene, scene.activeCamera);
|
1104
|
-
});
|
1105
|
-
};
|
1106
|
-
HtmlMeshRenderer.prototype._createRenderLayerElements = function (containerId) {
|
1107
|
-
var existingContainer = document.getElementById(containerId);
|
1108
|
-
if (existingContainer) {
|
1109
|
-
existingContainer.remove();
|
1110
|
-
}
|
1111
|
-
var container = document.createElement("div");
|
1112
|
-
container.id = containerId;
|
1113
|
-
container.style.position = "absolute";
|
1114
|
-
container.style.width = "100%";
|
1115
|
-
container.style.height = "100%";
|
1116
|
-
container.style.zIndex = "-1";
|
1117
|
-
var domElement = document.createElement("div");
|
1118
|
-
domElement.style.overflow = "hidden";
|
1119
|
-
var cameraElement = document.createElement("div");
|
1120
|
-
cameraElement.style.webkitTransformStyle = "preserve-3d";
|
1121
|
-
cameraElement.style.transformStyle = "preserve-3d";
|
1122
|
-
cameraElement.style.pointerEvents = "none";
|
1123
|
-
domElement.appendChild(cameraElement);
|
1124
|
-
container.appendChild(domElement);
|
1125
|
-
return {
|
1126
|
-
container: container,
|
1127
|
-
domElement: domElement,
|
1128
|
-
cameraElement: cameraElement,
|
1129
|
-
};
|
1130
|
-
};
|
1131
|
-
HtmlMeshRenderer.prototype._getSize = function () {
|
1132
|
-
return {
|
1133
|
-
width: this._width,
|
1134
|
-
height: this._height,
|
1135
|
-
};
|
1136
|
-
};
|
1137
|
-
HtmlMeshRenderer.prototype._setSize = function (width, height) {
|
1138
|
-
this._width = width;
|
1139
|
-
this._height = height;
|
1140
|
-
this._heightHalf = this._height / 2;
|
1141
|
-
if (!this._inSceneElements || !this._overlayElements) {
|
1142
|
-
return;
|
1143
|
-
}
|
1144
|
-
var domElements = [this._inSceneElements.domElement, this._overlayElements.domElement, this._inSceneElements.cameraElement, this._overlayElements.cameraElement];
|
1145
|
-
for (var _i = 0, domElements_1 = domElements; _i < domElements_1.length; _i++) {
|
1146
|
-
var dom = domElements_1[_i];
|
1147
|
-
if (dom) {
|
1148
|
-
dom.style.width = "".concat(width, "px");
|
1149
|
-
dom.style.height = "".concat(height, "px");
|
1150
|
-
}
|
1151
|
-
}
|
1152
|
-
};
|
1153
|
-
// prettier-ignore
|
1154
|
-
HtmlMeshRenderer.prototype._getCameraCssMatrix = function (matrix) {
|
1155
|
-
var elements = matrix.m;
|
1156
|
-
return "matrix3d(".concat(this._epsilon(elements[0]), ",").concat(this._epsilon(-elements[1]), ",").concat(this._epsilon(elements[2]), ",").concat(this._epsilon(elements[3]), ",").concat(this._epsilon(elements[4]), ",").concat(this._epsilon(-elements[5]), ",").concat(this._epsilon(elements[6]), ",").concat(this._epsilon(elements[7]), ",").concat(this._epsilon(elements[8]), ",").concat(this._epsilon(-elements[9]), ",").concat(this._epsilon(elements[10]), ",").concat(this._epsilon(elements[11]), ",").concat(this._epsilon(elements[12]), ",").concat(this._epsilon(-elements[13]), ",").concat(this._epsilon(elements[14]), ",").concat(this._epsilon(elements[15]), ")");
|
1157
|
-
};
|
1158
|
-
// Convert a Babylon world matrix to a CSS matrix
|
1159
|
-
// This also handles conversion from BJS left handed coords
|
1160
|
-
// to CSS right handed coords
|
1161
|
-
// prettier-ignore
|
1162
|
-
HtmlMeshRenderer.prototype._getHtmlContentCssMatrix = function (matrix, useRightHandedSystem) {
|
1163
|
-
var elements = matrix.m;
|
1164
|
-
// In a right handed coordinate system, the elements 11 to 14 have to change their direction
|
1165
|
-
var direction = useRightHandedSystem ? -1 : 1;
|
1166
|
-
var matrix3d = "matrix3d(".concat(this._epsilon(elements[0]), ",").concat(this._epsilon(elements[1]), ",").concat(this._epsilon(elements[2] * -direction), ",").concat(this._epsilon(elements[3]), ",").concat(this._epsilon(-elements[4]), ",").concat(this._epsilon(-elements[5]), ",").concat(this._epsilon(elements[6] * direction), ",").concat(this._epsilon(-elements[7]), ",").concat(this._epsilon(elements[8] * -direction), ",").concat(this._epsilon(elements[9] * -direction), ",").concat(this._epsilon(elements[10]), ",").concat(this._epsilon(elements[11] * direction), ",").concat(this._epsilon(elements[12] * direction), ",").concat(this._epsilon(elements[13] * direction), ",").concat(this._epsilon(elements[14] * direction), ",").concat(this._epsilon(elements[15]), ")");
|
1167
|
-
return matrix3d;
|
1168
|
-
};
|
1169
|
-
HtmlMeshRenderer.prototype._getTransformationMatrix = function (htmlMesh, useRightHandedSystem) {
|
1170
|
-
var _a;
|
1171
|
-
// Get the camera world matrix
|
1172
|
-
// Make sure the camera world matrix is up to date
|
1173
|
-
if (!this._cameraWorldMatrix) {
|
1174
|
-
this._cameraWorldMatrix = (_a = htmlMesh.getScene().activeCamera) === null || _a === void 0 ? void 0 : _a.getWorldMatrix();
|
1175
|
-
}
|
1176
|
-
if (!this._cameraWorldMatrix) {
|
1177
|
-
return babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Matrix.Identity();
|
1178
|
-
}
|
1179
|
-
var objectWorldMatrix = htmlMesh.getWorldMatrix();
|
1180
|
-
// Scale the object matrix by the base scale factor for the mesh
|
1181
|
-
// which is the ratio of the mesh width/height to the renderer
|
1182
|
-
// width/height divided by the babylon units to pixels ratio
|
1183
|
-
var widthScaleFactor = 1;
|
1184
|
-
var heightScaleFactor = 1;
|
1185
|
-
if (htmlMesh.sourceWidth && htmlMesh.sourceHeight) {
|
1186
|
-
widthScaleFactor = htmlMesh.width / (htmlMesh.sourceWidth / BabylonUnitsToPixels);
|
1187
|
-
heightScaleFactor = htmlMesh.height / (htmlMesh.sourceHeight / BabylonUnitsToPixels);
|
1188
|
-
}
|
1189
|
-
// Apply the scale to the object's world matrix. Note we aren't scaling
|
1190
|
-
// the object, just getting a matrix as though it were scaled, so we can
|
1191
|
-
// scale the content
|
1192
|
-
var scaleTransform = this._temp.scaleTransform;
|
1193
|
-
var rotationTransform = this._temp.rotationTransform;
|
1194
|
-
var positionTransform = this._temp.positionTransform;
|
1195
|
-
var scaledAndTranslatedObjectMatrix = this._temp.objectMatrix;
|
1196
|
-
objectWorldMatrix.decompose(scaleTransform, rotationTransform, positionTransform);
|
1197
|
-
scaleTransform.x *= widthScaleFactor;
|
1198
|
-
scaleTransform.y *= heightScaleFactor;
|
1199
|
-
babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Matrix.ComposeToRef(scaleTransform, rotationTransform, positionTransform, scaledAndTranslatedObjectMatrix);
|
1200
|
-
// Adjust direction of 12 and 13 of the transformation matrix based on the handedness of the system
|
1201
|
-
var direction = useRightHandedSystem ? -1 : 1;
|
1202
|
-
// Adjust translation values to be from camera vs world origin
|
1203
|
-
// Note that we are also adjusting these values to be pixels vs Babylon units
|
1204
|
-
var position = htmlMesh.getAbsolutePosition();
|
1205
|
-
scaledAndTranslatedObjectMatrix.setRowFromFloats(3, (-this._cameraWorldMatrix.m[12] + position.x) * BabylonUnitsToPixels * direction, (-this._cameraWorldMatrix.m[13] + position.y) * BabylonUnitsToPixels * direction, (this._cameraWorldMatrix.m[14] - position.z) * BabylonUnitsToPixels, this._cameraWorldMatrix.m[15] * 0.00001 * BabylonUnitsToPixels);
|
1206
|
-
// Adjust other values to be pixels vs Babylon units
|
1207
|
-
scaledAndTranslatedObjectMatrix.multiplyAtIndex(3, BabylonUnitsToPixels);
|
1208
|
-
scaledAndTranslatedObjectMatrix.multiplyAtIndex(7, BabylonUnitsToPixels);
|
1209
|
-
scaledAndTranslatedObjectMatrix.multiplyAtIndex(11, BabylonUnitsToPixels);
|
1210
|
-
return scaledAndTranslatedObjectMatrix;
|
1211
|
-
};
|
1212
|
-
HtmlMeshRenderer.prototype._renderHtmlMesh = function (htmlMesh, useRightHandedSystem) {
|
1213
|
-
var _a, _b;
|
1214
|
-
if (!htmlMesh.element || !htmlMesh.element.firstElementChild) {
|
1215
|
-
// nothing to render, so bail
|
1216
|
-
return;
|
1217
|
-
}
|
1218
|
-
// We need to ensure html mesh data is initialized before
|
1219
|
-
// computing the base scale factor
|
1220
|
-
var htmlMeshData = this._cache.htmlMeshData.get(htmlMesh);
|
1221
|
-
if (!htmlMeshData) {
|
1222
|
-
htmlMeshData = { style: "" };
|
1223
|
-
this._cache.htmlMeshData.set(htmlMesh, htmlMeshData);
|
1224
|
-
}
|
1225
|
-
var cameraElement = htmlMesh._isCanvasOverlay ? (_a = this._overlayElements) === null || _a === void 0 ? void 0 : _a.cameraElement : (_b = this._inSceneElements) === null || _b === void 0 ? void 0 : _b.cameraElement;
|
1226
|
-
if (htmlMesh.element.parentNode !== cameraElement) {
|
1227
|
-
cameraElement.appendChild(htmlMesh.element);
|
1228
|
-
}
|
1229
|
-
// If the htmlMesh content has changed, update the base scale factor
|
1230
|
-
if (htmlMesh.requiresUpdate) {
|
1231
|
-
this._updateBaseScaleFactor(htmlMesh);
|
1232
|
-
}
|
1233
|
-
// Get the transformation matrix for the html mesh
|
1234
|
-
var scaledAndTranslatedObjectMatrix = this._getTransformationMatrix(htmlMesh, useRightHandedSystem);
|
1235
|
-
var style = "translate(-50%, -50%) ".concat(this._getHtmlContentCssMatrix(scaledAndTranslatedObjectMatrix, useRightHandedSystem));
|
1236
|
-
// In a right handed system, screens are on the wrong side of the mesh, so we have to rotate by Math.PI which results in the matrix3d seen below
|
1237
|
-
style += "".concat(useRightHandedSystem ? "matrix3d(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1)" : "");
|
1238
|
-
if (htmlMeshData.style !== style) {
|
1239
|
-
htmlMesh.element.style.webkitTransform = style;
|
1240
|
-
htmlMesh.element.style.transform = style;
|
1241
|
-
}
|
1242
|
-
htmlMesh._markAsUpdated();
|
1243
|
-
};
|
1244
|
-
HtmlMeshRenderer.prototype._render = function (scene, camera) {
|
1245
|
-
var _a, _b, _c, _d;
|
1246
|
-
var needsUpdate = false;
|
1247
|
-
var useRightHandedSystem = scene.useRightHandedSystem;
|
1248
|
-
// Update the container position and size if necessary
|
1249
|
-
this._updateContainerPositionIfNeeded();
|
1250
|
-
// Check for a camera change
|
1251
|
-
if (this._cameraMatrixUpdated) {
|
1252
|
-
this._cameraMatrixUpdated = false;
|
1253
|
-
needsUpdate = true;
|
1254
|
-
}
|
1255
|
-
// If the camera position has changed, then we also need to update
|
1256
|
-
if (camera.position.x !== this._cache.cameraData.position.x ||
|
1257
|
-
camera.position.y !== this._cache.cameraData.position.y ||
|
1258
|
-
camera.position.z !== this._cache.cameraData.position.z) {
|
1259
|
-
this._cache.cameraData.position.copyFrom(camera.position);
|
1260
|
-
needsUpdate = true;
|
1261
|
-
}
|
1262
|
-
// Check for a dpr change
|
1263
|
-
if (window.devicePixelRatio !== this._lastDevicePixelRatio) {
|
1264
|
-
this._lastDevicePixelRatio = window.devicePixelRatio;
|
1265
|
-
babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Logger.Log("In render - dpr changed: ", this._lastDevicePixelRatio);
|
1266
|
-
needsUpdate = true;
|
1267
|
-
}
|
1268
|
-
// Check if any meshes need to be updated
|
1269
|
-
var meshesNeedingUpdate = scene.meshes.filter(function (mesh) { return mesh["isHtmlMesh"] && (needsUpdate || mesh.requiresUpdate); });
|
1270
|
-
needsUpdate = needsUpdate || meshesNeedingUpdate.length > 0;
|
1271
|
-
if (!needsUpdate) {
|
1272
|
-
return;
|
1273
|
-
}
|
1274
|
-
// Get a projection matrix for the camera
|
1275
|
-
var projectionMatrix = camera.getProjectionMatrix();
|
1276
|
-
var fov = projectionMatrix.m[5] * this._heightHalf;
|
1277
|
-
if (this._cache.cameraData.fov !== fov) {
|
1278
|
-
var source = [(_a = this._overlayElements) === null || _a === void 0 ? void 0 : _a.domElement, (_b = this._inSceneElements) === null || _b === void 0 ? void 0 : _b.domElement];
|
1279
|
-
if (camera.mode == babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Camera.PERSPECTIVE_CAMERA) {
|
1280
|
-
for (var _i = 0, source_1 = source; _i < source_1.length; _i++) {
|
1281
|
-
var el = source_1[_i];
|
1282
|
-
if (el) {
|
1283
|
-
el.style.webkitPerspective = fov + "px";
|
1284
|
-
el.style.perspective = fov + "px";
|
1285
|
-
}
|
1286
|
-
}
|
1287
|
-
}
|
1288
|
-
else {
|
1289
|
-
for (var _e = 0, source_2 = source; _e < source_2.length; _e++) {
|
1290
|
-
var el = source_2[_e];
|
1291
|
-
if (el) {
|
1292
|
-
el.style.webkitPerspective = "";
|
1293
|
-
el.style.perspective = "";
|
1294
|
-
}
|
1295
|
-
}
|
1296
|
-
}
|
1297
|
-
this._cache.cameraData.fov = fov;
|
1298
|
-
}
|
1299
|
-
// Get the CSS matrix for the camera (which will include any camera rotation)
|
1300
|
-
if (camera.parent === null) {
|
1301
|
-
camera.computeWorldMatrix();
|
1302
|
-
}
|
1303
|
-
var cameraMatrixWorld = this._temp.cameraWorldMatrix;
|
1304
|
-
cameraMatrixWorld.copyFrom(camera.getWorldMatrix());
|
1305
|
-
var cameraRotationMatrix = this._temp.cameraRotationMatrix;
|
1306
|
-
cameraMatrixWorld.getRotationMatrix().transposeToRef(cameraRotationMatrix);
|
1307
|
-
var cameraMatrixWorldAsArray = this._temp.cameraWorldMatrixAsArray;
|
1308
|
-
cameraMatrixWorld.copyToArray(cameraMatrixWorldAsArray);
|
1309
|
-
// For a few values, we have to adjust the direction based on the handedness of the system
|
1310
|
-
var direction = useRightHandedSystem ? 1 : -1;
|
1311
|
-
cameraMatrixWorldAsArray[1] = cameraRotationMatrix.m[1];
|
1312
|
-
cameraMatrixWorldAsArray[2] = cameraRotationMatrix.m[2] * direction;
|
1313
|
-
cameraMatrixWorldAsArray[4] = cameraRotationMatrix.m[4] * direction;
|
1314
|
-
cameraMatrixWorldAsArray[6] = cameraRotationMatrix.m[6] * direction;
|
1315
|
-
cameraMatrixWorldAsArray[8] = cameraRotationMatrix.m[8] * direction;
|
1316
|
-
cameraMatrixWorldAsArray[9] = cameraRotationMatrix.m[9] * direction;
|
1317
|
-
babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Matrix.FromArrayToRef(cameraMatrixWorldAsArray, 0, cameraMatrixWorld);
|
1318
|
-
var cameraCSSMatrix = this._getCameraCssMatrix(cameraMatrixWorld);
|
1319
|
-
var style = cameraCSSMatrix;
|
1320
|
-
if (this._cache.cameraData.style !== style) {
|
1321
|
-
var source = [(_c = this._inSceneElements) === null || _c === void 0 ? void 0 : _c.cameraElement, (_d = this._overlayElements) === null || _d === void 0 ? void 0 : _d.cameraElement];
|
1322
|
-
for (var _f = 0, source_3 = source; _f < source_3.length; _f++) {
|
1323
|
-
var el = source_3[_f];
|
1324
|
-
if (el) {
|
1325
|
-
el.style.webkitTransform = style;
|
1326
|
-
el.style.transform = style;
|
1327
|
-
}
|
1328
|
-
}
|
1329
|
-
this._cache.cameraData.style = style;
|
1330
|
-
}
|
1331
|
-
// _Render objects if necessary
|
1332
|
-
for (var _g = 0, meshesNeedingUpdate_1 = meshesNeedingUpdate; _g < meshesNeedingUpdate_1.length; _g++) {
|
1333
|
-
var mesh = meshesNeedingUpdate_1[_g];
|
1334
|
-
this._renderHtmlMesh(mesh, useRightHandedSystem);
|
1335
|
-
}
|
1336
|
-
};
|
1337
|
-
HtmlMeshRenderer.prototype._updateBaseScaleFactor = function (htmlMesh) {
|
1338
|
-
// Get screen width and height
|
1339
|
-
var screenWidth = this._width;
|
1340
|
-
var screenHeight = this._height;
|
1341
|
-
// Calculate aspect ratios
|
1342
|
-
var htmlMeshAspectRatio = (htmlMesh.width || 1) / (htmlMesh.height || 1);
|
1343
|
-
var screenAspectRatio = screenWidth / screenHeight;
|
1344
|
-
// Adjust screen dimensions based on aspect ratios
|
1345
|
-
if (htmlMeshAspectRatio > screenAspectRatio) {
|
1346
|
-
// If the HTML mesh is wider relative to its height than the screen, adjust the screen width
|
1347
|
-
screenWidth = screenHeight * htmlMeshAspectRatio;
|
1348
|
-
}
|
1349
|
-
else {
|
1350
|
-
// If the HTML mesh is taller relative to its width than the screen, adjust the screen height
|
1351
|
-
screenHeight = screenWidth / htmlMeshAspectRatio;
|
1352
|
-
}
|
1353
|
-
// Set content to fill screen so we get max resolution when it is shrunk to fit the mesh
|
1354
|
-
htmlMesh.setContentSizePx(screenWidth, screenHeight);
|
1355
|
-
};
|
1356
|
-
HtmlMeshRenderer.prototype._updateContainerPositionIfNeeded = function () {
|
1357
|
-
var _a, _b;
|
1358
|
-
// Determine if the canvas has moved on the screen
|
1359
|
-
var canvasRect = this._engine.getRenderingCanvasClientRect();
|
1360
|
-
// canvas rect may be null if layout not complete
|
1361
|
-
if (!canvasRect) {
|
1362
|
-
babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Logger.Warn(PositionUpdateFailMessage);
|
1363
|
-
return;
|
1364
|
-
}
|
1365
|
-
var scrollTop = window.scrollY;
|
1366
|
-
var scrollLeft = window.scrollX;
|
1367
|
-
var canvasDocumentTop = canvasRect.top + scrollTop;
|
1368
|
-
var canvasDocumentLeft = canvasRect.left + scrollLeft;
|
1369
|
-
if (this._previousCanvasDocumentPosition.top !== canvasDocumentTop || this._previousCanvasDocumentPosition.left !== canvasDocumentLeft) {
|
1370
|
-
this._previousCanvasDocumentPosition.top = canvasDocumentTop;
|
1371
|
-
this._previousCanvasDocumentPosition.left = canvasDocumentLeft;
|
1372
|
-
var source = [(_a = this._inSceneElements) === null || _a === void 0 ? void 0 : _a.container, (_b = this._overlayElements) === null || _b === void 0 ? void 0 : _b.container];
|
1373
|
-
for (var _i = 0, source_4 = source; _i < source_4.length; _i++) {
|
1374
|
-
var container = source_4[_i];
|
1375
|
-
if (!container) {
|
1376
|
-
continue;
|
1377
|
-
}
|
1378
|
-
// set the top and left of the css container to match the canvas
|
1379
|
-
var containerParent = container.offsetParent;
|
1380
|
-
var parentRect = containerParent.getBoundingClientRect();
|
1381
|
-
var parentDocumentTop = parentRect.top + scrollTop;
|
1382
|
-
var parentDocumentLeft = parentRect.left + scrollLeft;
|
1383
|
-
var ancestorMarginsAndPadding = this._getAncestorMarginsAndPadding(containerParent);
|
1384
|
-
// Add the body margin
|
1385
|
-
var bodyStyle = window.getComputedStyle(document.body);
|
1386
|
-
var bodyMarginTop = parseInt(bodyStyle.marginTop, 10);
|
1387
|
-
var bodyMarginLeft = parseInt(bodyStyle.marginLeft, 10);
|
1388
|
-
container.style.top = "".concat(canvasDocumentTop - parentDocumentTop - ancestorMarginsAndPadding.marginTop + ancestorMarginsAndPadding.paddingTop + bodyMarginTop, "px");
|
1389
|
-
container.style.left = "".concat(canvasDocumentLeft - parentDocumentLeft - ancestorMarginsAndPadding.marginLeft + ancestorMarginsAndPadding.paddingLeft + bodyMarginLeft, "px");
|
1390
|
-
}
|
1391
|
-
}
|
1392
|
-
};
|
1393
|
-
HtmlMeshRenderer.prototype._epsilon = function (value) {
|
1394
|
-
return Math.abs(value) < 1e-10 ? 0 : value;
|
1395
|
-
};
|
1396
|
-
// Get total margins and padding for an element, excluding the body and document margins
|
1397
|
-
HtmlMeshRenderer.prototype._getAncestorMarginsAndPadding = function (element) {
|
1398
|
-
var marginTop = 0;
|
1399
|
-
var marginLeft = 0;
|
1400
|
-
var paddingTop = 0;
|
1401
|
-
var paddingLeft = 0;
|
1402
|
-
while (element && element !== document.body && element !== document.documentElement) {
|
1403
|
-
var style = window.getComputedStyle(element);
|
1404
|
-
marginTop += parseInt(style.marginTop, 10);
|
1405
|
-
marginLeft += parseInt(style.marginLeft, 10);
|
1406
|
-
paddingTop += parseInt(style.paddingTop, 10);
|
1407
|
-
paddingLeft += parseInt(style.paddingLeft, 10);
|
1408
|
-
element = element.offsetParent;
|
1409
|
-
}
|
1410
|
-
return { marginTop: marginTop, marginLeft: marginLeft, paddingTop: paddingTop, paddingLeft: paddingLeft };
|
1411
|
-
};
|
1412
|
-
return HtmlMeshRenderer;
|
1413
|
-
}());
|
1414
|
-
|
1415
|
-
|
1416
|
-
|
1417
|
-
/***/ }),
|
1418
|
-
|
1419
|
-
/***/ "../../../dev/addons/src/htmlMesh/index.ts":
|
1420
|
-
/*!*************************************************!*\
|
1421
|
-
!*** ../../../dev/addons/src/htmlMesh/index.ts ***!
|
1422
|
-
\*************************************************/
|
1423
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
1424
|
-
|
1425
|
-
__webpack_require__.r(__webpack_exports__);
|
1426
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1427
|
-
/* harmony export */ FitStrategy: () => (/* reexport safe */ _fitStrategy__WEBPACK_IMPORTED_MODULE_3__.FitStrategy),
|
1428
|
-
/* harmony export */ HtmlMesh: () => (/* reexport safe */ _htmlMesh__WEBPACK_IMPORTED_MODULE_1__.HtmlMesh),
|
1429
|
-
/* harmony export */ HtmlMeshRenderer: () => (/* reexport safe */ _htmlMeshRenderer__WEBPACK_IMPORTED_MODULE_0__.HtmlMeshRenderer),
|
1430
|
-
/* harmony export */ PointerEventsCaptureBehavior: () => (/* reexport safe */ _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_2__.PointerEventsCaptureBehavior)
|
1431
|
-
/* harmony export */ });
|
1432
|
-
/* harmony import */ var _htmlMeshRenderer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./htmlMeshRenderer */ "../../../dev/addons/src/htmlMesh/htmlMeshRenderer.ts");
|
1433
|
-
/* harmony import */ var _htmlMesh__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./htmlMesh */ "../../../dev/addons/src/htmlMesh/htmlMesh.ts");
|
1434
|
-
/* harmony import */ var _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pointerEventsCaptureBehavior */ "../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts");
|
1435
|
-
/* harmony import */ var _fitStrategy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fitStrategy */ "../../../dev/addons/src/htmlMesh/fitStrategy.ts");
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
// Export public classes and functions
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
/***/ }),
|
1445
|
-
|
1446
|
-
/***/ "../../../dev/addons/src/htmlMesh/pointerEventsCapture.ts":
|
1447
|
-
/*!****************************************************************!*\
|
1448
|
-
!*** ../../../dev/addons/src/htmlMesh/pointerEventsCapture.ts ***!
|
1449
|
-
\****************************************************************/
|
1450
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
1451
|
-
|
1452
|
-
__webpack_require__.r(__webpack_exports__);
|
1453
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1454
|
-
/* harmony export */ getCapturingId: () => (/* binding */ getCapturingId),
|
1455
|
-
/* harmony export */ releaseCurrent: () => (/* binding */ releaseCurrent),
|
1456
|
-
/* harmony export */ requestCapture: () => (/* binding */ requestCapture),
|
1457
|
-
/* harmony export */ requestRelease: () => (/* binding */ requestRelease)
|
1458
|
-
/* harmony export */ });
|
1459
|
-
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math");
|
1460
|
-
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__);
|
1461
|
-
|
1462
|
-
var CaptureRequestQueue = [];
|
1463
|
-
// Key is request id, value is object with capture and release callbacks
|
1464
|
-
var PendingRequestCallbacks = new Map();
|
1465
|
-
// Keep track of release requests with no matching capture request
|
1466
|
-
// in case the release request arrived before the capture to avoid
|
1467
|
-
// the capture request never getting released.
|
1468
|
-
var UnmatchedReleaseRequests = [];
|
1469
|
-
var CurrentOwner = null; // Called on first capture or release request
|
1470
|
-
/**
|
1471
|
-
* Get the id of the object currently capturing pointer events
|
1472
|
-
* @returns The id of the object currently capturing pointer events
|
1473
|
-
* or null if no object is capturing pointer events
|
1474
|
-
*/
|
1475
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
1476
|
-
var getCapturingId = function () {
|
1477
|
-
return CurrentOwner;
|
1478
|
-
};
|
1479
|
-
/**
|
1480
|
-
* Request that the object with the given id capture pointer events. If there is no current
|
1481
|
-
* owner, then the request is granted immediately. If there is a current owner, then the request
|
1482
|
-
* is queued until the current owner releases pointer events.
|
1483
|
-
* @param requestId An id to identify the request. This id will be used to match the capture
|
1484
|
-
* request with the release request.
|
1485
|
-
* @param captureCallback The callback to call when the request is granted and the object is capturing
|
1486
|
-
* @param releaseCallback The callback to call when the object is no longer capturing pointer events
|
1487
|
-
*/
|
1488
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
1489
|
-
var requestCapture = function (requestId, captureCallback, releaseCallback) {
|
1490
|
-
DebugLog("In pointerEventsCapture.requestCapture - Pointer events capture requested for ".concat(requestId));
|
1491
|
-
// If there is a release for this request, then ignore the request
|
1492
|
-
if (RemoveUnmatchedRequest(requestId)) {
|
1493
|
-
DebugLog("In pointerEventsCapture.requestCapture - Capture request matched previous release request ".concat(requestId, ". Cancelling capture request"));
|
1494
|
-
return;
|
1495
|
-
}
|
1496
|
-
else if (requestId !== CurrentOwner) {
|
1497
|
-
// if the request is not already in the queue, add it to the queue
|
1498
|
-
EnqueueCaptureRequest(requestId, captureCallback, releaseCallback);
|
1499
|
-
}
|
1500
|
-
if (!CurrentOwner) {
|
1501
|
-
// If there is no current owner, go ahead and grant the request
|
1502
|
-
TransferPointerEventsOwnership();
|
1503
|
-
}
|
1504
|
-
// If the request id is the current owner, do nothing
|
1505
|
-
};
|
1506
|
-
/**
|
1507
|
-
* Release pointer events from the object with the given id. If the object is the current owner
|
1508
|
-
* then pointer events are released immediately. If the object is not the current owner, then the
|
1509
|
-
* associated capture request is removed from the queue. If there is no matching capture request
|
1510
|
-
* in the queue, then the release request is added to a list of unmatched release requests and will
|
1511
|
-
* negate the next capture request with the same id. This is to guard against the possibility that
|
1512
|
-
* the release request arrived before the capture request.
|
1513
|
-
* @param requestId The id which should match the id of the capture request
|
1514
|
-
*/
|
1515
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
1516
|
-
var requestRelease = function (requestId) {
|
1517
|
-
DebugLog("In pointerEventsCapture.requestRelease - Pointer events release requested for ".concat(requestId));
|
1518
|
-
// if the requestId is the current capture holder release it
|
1519
|
-
if (!requestId || requestId === CurrentOwner) {
|
1520
|
-
TransferPointerEventsOwnership();
|
1521
|
-
}
|
1522
|
-
else if (CancelRequest(requestId)) {
|
1523
|
-
// if the request is in the queue, but not the current capture holder, remove it and it's callbacks
|
1524
|
-
PendingRequestCallbacks.delete(requestId);
|
1525
|
-
}
|
1526
|
-
else {
|
1527
|
-
DebugLog("In pointerEventsCapture.requestRelease - Received release request ".concat(requestId, " but no matching capture request was received"));
|
1528
|
-
// request was not current and not in queue, likely because we received a release
|
1529
|
-
// request before the capture. Add it to the unmatched list to guard against this possibility
|
1530
|
-
if (!UnmatchedReleaseRequests.includes(requestId)) {
|
1531
|
-
UnmatchedReleaseRequests.push(requestId);
|
1532
|
-
}
|
1533
|
-
}
|
1534
|
-
};
|
1535
|
-
/**
|
1536
|
-
* Release pointer events from the current owner
|
1537
|
-
*/
|
1538
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
1539
|
-
var releaseCurrent = function () {
|
1540
|
-
requestRelease(CurrentOwner);
|
1541
|
-
};
|
1542
|
-
var EnqueueCaptureRequest = function (requestId, capture, release) {
|
1543
|
-
DebugLog("In pointerEventsCapture.enqueueCaptureRequest - Enqueueing capture request for ".concat(requestId));
|
1544
|
-
if (!CaptureRequestQueue.includes(requestId)) {
|
1545
|
-
CaptureRequestQueue.push(requestId);
|
1546
|
-
PendingRequestCallbacks.set(requestId, { capture: capture, release: release });
|
1547
|
-
}
|
1548
|
-
};
|
1549
|
-
// Removes the request from the queue if it exists. Returns true
|
1550
|
-
// if the request was found and removed, otherwise false
|
1551
|
-
var CancelRequest = function (requestId) {
|
1552
|
-
var removed = false;
|
1553
|
-
CaptureRequestQueue = CaptureRequestQueue.filter(function (id) {
|
1554
|
-
if (id !== requestId) {
|
1555
|
-
return true;
|
1556
|
-
}
|
1557
|
-
else {
|
1558
|
-
removed = true;
|
1559
|
-
DebugLog("In pointerEventsCapture.cancelRequest - Canceling pointer events capture request ".concat(requestId));
|
1560
|
-
return false;
|
1561
|
-
}
|
1562
|
-
});
|
1563
|
-
return removed;
|
1564
|
-
};
|
1565
|
-
var RemoveUnmatchedRequest = function (requestId) {
|
1566
|
-
var removed = false;
|
1567
|
-
UnmatchedReleaseRequests = UnmatchedReleaseRequests.filter(function (id) {
|
1568
|
-
if (id !== requestId) {
|
1569
|
-
return true;
|
1570
|
-
}
|
1571
|
-
else {
|
1572
|
-
removed = true;
|
1573
|
-
return false;
|
1574
|
-
}
|
1575
|
-
});
|
1576
|
-
return removed;
|
1577
|
-
};
|
1578
|
-
var TransferPointerEventsOwnership = function () {
|
1579
|
-
var newOwnerId = NextCaptureRequest();
|
1580
|
-
DebugLog("In pointerEventsCapture.transferPointerEventsOwnership - Transferrring pointer events from ".concat(CurrentOwner, " to ").concat(newOwnerId));
|
1581
|
-
// Release the current owner
|
1582
|
-
DoRelease();
|
1583
|
-
if (newOwnerId) {
|
1584
|
-
DoCapture(newOwnerId);
|
1585
|
-
}
|
1586
|
-
};
|
1587
|
-
var DoRelease = function () {
|
1588
|
-
var _a;
|
1589
|
-
DebugLog("In pointerEventsCapture.doRelease - Releasing pointer events from ".concat(CurrentOwner));
|
1590
|
-
if (CurrentOwner) {
|
1591
|
-
// call the release callback
|
1592
|
-
(_a = PendingRequestCallbacks.get(CurrentOwner)) === null || _a === void 0 ? void 0 : _a.release();
|
1593
|
-
// And remove the callbacks
|
1594
|
-
PendingRequestCallbacks.delete(CurrentOwner);
|
1595
|
-
CurrentOwner = null;
|
1596
|
-
}
|
1597
|
-
};
|
1598
|
-
var DoCapture = function (newOwnerId) {
|
1599
|
-
var _a;
|
1600
|
-
if (newOwnerId) {
|
1601
|
-
// call the capture callback
|
1602
|
-
(_a = PendingRequestCallbacks.get(newOwnerId)) === null || _a === void 0 ? void 0 : _a.capture();
|
1603
|
-
}
|
1604
|
-
CurrentOwner = newOwnerId;
|
1605
|
-
DebugLog("In pointerEventsCapture.doCapture - Pointer events now captured by ".concat(newOwnerId));
|
1606
|
-
};
|
1607
|
-
var NextCaptureRequest = function () {
|
1608
|
-
return CaptureRequestQueue.length > 0 ? CaptureRequestQueue.shift() : null;
|
1609
|
-
};
|
1610
|
-
var DebugLog = function (message) {
|
1611
|
-
// If we are runnning in a test runner (in node, so window is not defined)
|
1612
|
-
// or if the debug flag is set, then log the message
|
1613
|
-
if (typeof window === "undefined" || window["pointer-events-capture-debug"]) {
|
1614
|
-
babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__.Tools.Log("".concat(performance.now(), " - game.scene.pointerEvents - ").concat(message, "\ncurrentOwner: ").concat(CurrentOwner, "\nqueue: ").concat(CaptureRequestQueue, "\nunmatched: ").concat(UnmatchedReleaseRequests));
|
1615
|
-
}
|
1616
|
-
};
|
1617
|
-
// #endregion Debugging support
|
1618
|
-
|
1619
|
-
|
1620
|
-
/***/ }),
|
1621
|
-
|
1622
|
-
/***/ "../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts":
|
1623
|
-
/*!************************************************************************!*\
|
1624
|
-
!*** ../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts ***!
|
1625
|
-
\************************************************************************/
|
1626
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
1627
|
-
|
1628
|
-
__webpack_require__.r(__webpack_exports__);
|
1629
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1630
|
-
/* harmony export */ PointerEventsCaptureBehavior: () => (/* binding */ PointerEventsCaptureBehavior)
|
1631
|
-
/* harmony export */ });
|
1632
|
-
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
|
1633
|
-
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__);
|
1634
|
-
/* harmony import */ var _pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCapture */ "../../../dev/addons/src/htmlMesh/pointerEventsCapture.ts");
|
1635
|
-
|
1636
|
-
|
1637
|
-
// Module level variable for holding the current scene
|
1638
|
-
var LocalScene = null;
|
1639
|
-
// Module level variable to hold the count of behavior instances that are currently capturing pointer events
|
1640
|
-
// on entry. This is used to determine if we need to start or stop observing pointer movement.
|
1641
|
-
var CaptureOnEnterCount = 0;
|
1642
|
-
// Map used to store instance of the PointerEventsCaptureBehavior for a mesh
|
1643
|
-
// We do this because this gets checked on pointer move and we don't want to
|
1644
|
-
// use getBehaviorByName() because that is a linear search
|
1645
|
-
var MeshToBehaviorMap = new WeakMap();
|
1646
|
-
var StartCaptureOnEnter = function (scene) {
|
1647
|
-
// If we are not in a browser, do nothing
|
1648
|
-
if (typeof document === "undefined") {
|
1649
|
-
return;
|
1650
|
-
}
|
1651
|
-
if (CaptureOnEnterCount === 0) {
|
1652
|
-
document.addEventListener("pointermove", OnPointerMove);
|
1653
|
-
document.addEventListener("touchstart", OnPointerMove);
|
1654
|
-
LocalScene = LocalScene !== null && LocalScene !== void 0 ? LocalScene : scene;
|
1655
|
-
babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__.Logger.Log("PointerEventsCaptureBehavior: Starting observation of pointer move events.");
|
1656
|
-
LocalScene.onDisposeObservable.add(DoStopCaptureOnEnter);
|
1657
|
-
}
|
1658
|
-
CaptureOnEnterCount++;
|
1659
|
-
};
|
1660
|
-
var DoStopCaptureOnEnter = function () {
|
1661
|
-
document.removeEventListener("pointermove", OnPointerMove);
|
1662
|
-
document.removeEventListener("touchstart", OnPointerMove);
|
1663
|
-
LocalScene = null;
|
1664
|
-
babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__.Logger.Log("PointerEventsCaptureBehavior: Stopping observation of pointer move events.");
|
1665
|
-
CaptureOnEnterCount = 0;
|
1666
|
-
};
|
1667
|
-
var StopCaptureOnEnter = function () {
|
1668
|
-
// If we are not in a browser, do nothing
|
1669
|
-
if (typeof document === "undefined") {
|
1670
|
-
return;
|
1671
|
-
}
|
1672
|
-
// If we are not observing pointer movement, do nothing
|
1673
|
-
if (!LocalScene) {
|
1674
|
-
return;
|
1675
|
-
}
|
1676
|
-
CaptureOnEnterCount--;
|
1677
|
-
if (CaptureOnEnterCount <= 0) {
|
1678
|
-
DoStopCaptureOnEnter();
|
1679
|
-
}
|
1680
|
-
};
|
1681
|
-
// Module level function used to determine if an entered mesh should capture pointer events
|
1682
|
-
var OnPointerMove = function (evt) {
|
1683
|
-
if (!LocalScene) {
|
1684
|
-
return;
|
1685
|
-
}
|
1686
|
-
var canvasRect = LocalScene.getEngine().getRenderingCanvasClientRect();
|
1687
|
-
if (!canvasRect) {
|
1688
|
-
return;
|
1689
|
-
}
|
1690
|
-
// Get the object that contains the client X and Y from either the pointer event or from the
|
1691
|
-
// TouchEvent touch
|
1692
|
-
var _a = "touches" in evt ? evt.touches[0] : evt, clientX = _a.clientX, clientY = _a.clientY;
|
1693
|
-
// get the picked mesh, if any
|
1694
|
-
var pointerScreenX = clientX - canvasRect.left;
|
1695
|
-
var pointerScreenY = clientY - canvasRect.top;
|
1696
|
-
var pointerCaptureBehavior;
|
1697
|
-
var pickResult = LocalScene.pick(pointerScreenX, pointerScreenY, function (mesh) {
|
1698
|
-
// If the mesh has an instance of PointerEventsCaptureBehavior attached to it,
|
1699
|
-
// and capture on pointer enter is true, then we want to pick it
|
1700
|
-
var pointerCaptureBehavior = MeshToBehaviorMap.get(mesh);
|
1701
|
-
return mesh.isEnabled() && typeof pointerCaptureBehavior !== "undefined" && pointerCaptureBehavior._captureOnPointerEnter;
|
1702
|
-
});
|
1703
|
-
var pickedMesh;
|
1704
|
-
if (pickResult.hit) {
|
1705
|
-
pickedMesh = pickResult.pickedMesh;
|
1706
|
-
}
|
1707
|
-
else {
|
1708
|
-
pickedMesh = null;
|
1709
|
-
}
|
1710
|
-
var capturingIdAsInt = parseInt((0,_pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__.getCapturingId)() || "");
|
1711
|
-
// if the picked mesh is the current capturing mesh, do nothing
|
1712
|
-
if (pickedMesh && pickedMesh.uniqueId === capturingIdAsInt) {
|
1713
|
-
return;
|
1714
|
-
}
|
1715
|
-
// If there is a capturing mesh and it is not the current picked mesh, or no
|
1716
|
-
// mesh is picked, release the capturing mesh
|
1717
|
-
if (capturingIdAsInt && (!pickedMesh || pickedMesh.uniqueId !== capturingIdAsInt)) {
|
1718
|
-
(0,_pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__.releaseCurrent)();
|
1719
|
-
}
|
1720
|
-
// If there is a picked mesh and it is not the current capturing mesh, capture
|
1721
|
-
// the pointer events. Note that the current capturing mesh has already been
|
1722
|
-
// released above
|
1723
|
-
if (pickedMesh) {
|
1724
|
-
pointerCaptureBehavior = MeshToBehaviorMap.get(pickedMesh);
|
1725
|
-
pointerCaptureBehavior.capturePointerEvents();
|
1726
|
-
}
|
1727
|
-
};
|
1728
|
-
/**
|
1729
|
-
* Behavior for any content that can capture pointer events, i.e. bypass the Babylon pointer event handling
|
1730
|
-
* and receive pointer events directly. It will register the capture triggers and negotiate the capture and
|
1731
|
-
* release of pointer events. Curerntly this applies only to HtmlMesh
|
1732
|
-
*/
|
1733
|
-
var PointerEventsCaptureBehavior = /** @class */ (function () {
|
1734
|
-
function PointerEventsCaptureBehavior(_captureCallback, _releaseCallback, _a) {
|
1735
|
-
var _b = _a === void 0 ? {} : _a, _c = _b.captureOnPointerEnter, captureOnPointerEnter = _c === void 0 ? true : _c;
|
1736
|
-
this._captureCallback = _captureCallback;
|
1737
|
-
this._releaseCallback = _releaseCallback;
|
1738
|
-
/** gets or sets behavior's name */
|
1739
|
-
this.name = "PointerEventsCaptureBehavior";
|
1740
|
-
this._attachedMesh = null;
|
1741
|
-
this._captureOnPointerEnter = captureOnPointerEnter;
|
1742
|
-
// Warn if we are not in a browser
|
1743
|
-
if (typeof document === "undefined") {
|
1744
|
-
babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__.Logger.Warn("Creating an instance of PointerEventsCaptureBehavior outside of a browser. The behavior will not work.");
|
1745
|
-
}
|
1746
|
-
}
|
1747
|
-
Object.defineProperty(PointerEventsCaptureBehavior.prototype, "attachedMesh", {
|
1748
|
-
/**
|
1749
|
-
* Gets or sets the mesh that the behavior is attached to
|
1750
|
-
*/
|
1751
|
-
get: function () {
|
1752
|
-
return this._attachedMesh;
|
1753
|
-
},
|
1754
|
-
set: function (value) {
|
1755
|
-
this._attachedMesh = value;
|
1756
|
-
},
|
1757
|
-
enumerable: false,
|
1758
|
-
configurable: true
|
1759
|
-
});
|
1760
|
-
Object.defineProperty(PointerEventsCaptureBehavior.prototype, "captureOnPointerEnter", {
|
1761
|
-
/**
|
1762
|
-
* Set if the behavior should capture pointer events when the pointer enters the mesh
|
1763
|
-
*/
|
1764
|
-
set: function (captureOnPointerEnter) {
|
1765
|
-
if (this._captureOnPointerEnter === captureOnPointerEnter) {
|
1766
|
-
return;
|
1767
|
-
}
|
1768
|
-
this._captureOnPointerEnter = captureOnPointerEnter;
|
1769
|
-
if (this._attachedMesh) {
|
1770
|
-
if (this._captureOnPointerEnter) {
|
1771
|
-
StartCaptureOnEnter(this._attachedMesh.getScene());
|
1772
|
-
}
|
1773
|
-
else {
|
1774
|
-
StopCaptureOnEnter();
|
1775
|
-
}
|
1776
|
-
}
|
1777
|
-
},
|
1778
|
-
enumerable: false,
|
1779
|
-
configurable: true
|
1780
|
-
});
|
1781
|
-
/**
|
1782
|
-
* Function called when the behavior needs to be initialized (before attaching it to a target)
|
1783
|
-
*/
|
1784
|
-
PointerEventsCaptureBehavior.prototype.init = function () { };
|
1785
|
-
/**
|
1786
|
-
* Called when the behavior is attached to a target
|
1787
|
-
* @param mesh defines the target where the behavior is attached to
|
1788
|
-
*/
|
1789
|
-
PointerEventsCaptureBehavior.prototype.attach = function (mesh) {
|
1790
|
-
// Add a reference to this behavior on the mesh. We do this so we can get a
|
1791
|
-
// reference to the behavior in the onPointerMove function without relying on
|
1792
|
-
// getBehaviorByName(), which does a linear search of the behaviors array.
|
1793
|
-
this.attachedMesh = mesh;
|
1794
|
-
MeshToBehaviorMap.set(mesh, this);
|
1795
|
-
if (this._captureOnPointerEnter) {
|
1796
|
-
StartCaptureOnEnter(mesh.getScene());
|
1797
|
-
}
|
1798
|
-
};
|
1799
|
-
/**
|
1800
|
-
* Called when the behavior is detached from its target
|
1801
|
-
*/
|
1802
|
-
PointerEventsCaptureBehavior.prototype.detach = function () {
|
1803
|
-
if (!this.attachedMesh) {
|
1804
|
-
return;
|
1805
|
-
}
|
1806
|
-
// Remove the reference to this behavior from the mesh
|
1807
|
-
MeshToBehaviorMap.delete(this.attachedMesh);
|
1808
|
-
if (this._captureOnPointerEnter) {
|
1809
|
-
StopCaptureOnEnter();
|
1810
|
-
}
|
1811
|
-
this.attachedMesh = null;
|
1812
|
-
};
|
1813
|
-
/**
|
1814
|
-
* Dispose the behavior
|
1815
|
-
*/
|
1816
|
-
PointerEventsCaptureBehavior.prototype.dispose = function () {
|
1817
|
-
this.detach();
|
1818
|
-
};
|
1819
|
-
// Release pointer events
|
1820
|
-
PointerEventsCaptureBehavior.prototype.releasePointerEvents = function () {
|
1821
|
-
if (!this.attachedMesh) {
|
1822
|
-
return;
|
1823
|
-
}
|
1824
|
-
(0,_pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__.requestRelease)(this.attachedMesh.uniqueId.toString());
|
1825
|
-
};
|
1826
|
-
// Capture pointer events
|
1827
|
-
PointerEventsCaptureBehavior.prototype.capturePointerEvents = function () {
|
1828
|
-
if (!this.attachedMesh) {
|
1829
|
-
return;
|
1830
|
-
}
|
1831
|
-
(0,_pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__.requestCapture)(this.attachedMesh.uniqueId.toString(), this._captureCallback, this._releaseCallback);
|
1832
|
-
};
|
1833
|
-
return PointerEventsCaptureBehavior;
|
1834
|
-
}());
|
1835
|
-
|
1836
|
-
|
1837
|
-
|
1838
|
-
/***/ }),
|
1839
|
-
|
1840
|
-
/***/ "../../../dev/addons/src/index.ts":
|
1841
|
-
/*!****************************************!*\
|
1842
|
-
!*** ../../../dev/addons/src/index.ts ***!
|
1843
|
-
\****************************************/
|
1844
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
1845
|
-
|
1846
|
-
__webpack_require__.r(__webpack_exports__);
|
1847
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1848
|
-
/* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
|
1849
|
-
/* harmony export */ FitStrategy: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.FitStrategy),
|
1850
|
-
/* harmony export */ FontAsset: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.FontAsset),
|
1851
|
-
/* harmony export */ HtmlMesh: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.HtmlMesh),
|
1852
|
-
/* harmony export */ HtmlMeshRenderer: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.HtmlMeshRenderer),
|
1853
|
-
/* harmony export */ PointerEventsCaptureBehavior: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.PointerEventsCaptureBehavior),
|
1854
|
-
/* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.SdfTextParagraph),
|
1855
|
-
/* harmony export */ TextRenderer: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.TextRenderer),
|
1856
|
-
/* harmony export */ msdfPixelShader: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfPixelShader),
|
1857
|
-
/* harmony export */ msdfPixelShaderWGSL: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfPixelShaderWGSL),
|
1858
|
-
/* harmony export */ msdfVertexShader: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShader),
|
1859
|
-
/* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShaderWGSL)
|
1860
|
-
/* harmony export */ });
|
1861
|
-
/* harmony import */ var _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./htmlMesh/index */ "../../../dev/addons/src/htmlMesh/index.ts");
|
1862
|
-
/* harmony import */ var _msdfText_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./msdfText/index */ "../../../dev/addons/src/msdfText/index.ts");
|
1863
|
-
/* eslint-disable import/no-internal-modules */
|
1864
|
-
|
1865
|
-
|
1866
|
-
|
1867
|
-
|
1868
|
-
/***/ }),
|
1869
|
-
|
1870
|
-
/***/ "../../../dev/addons/src/msdfText/fontAsset.ts":
|
1871
|
-
/*!*****************************************************!*\
|
1872
|
-
!*** ../../../dev/addons/src/msdfText/fontAsset.ts ***!
|
1873
|
-
\*****************************************************/
|
1874
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
1875
|
-
|
1876
|
-
__webpack_require__.r(__webpack_exports__);
|
1877
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1878
|
-
/* harmony export */ FontAsset: () => (/* binding */ FontAsset)
|
1879
|
-
/* harmony export */ });
|
1880
|
-
/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Maths/math");
|
1881
|
-
/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__);
|
1882
|
-
|
1883
|
-
var CharCode;
|
1884
|
-
(function (CharCode) {
|
1885
|
-
CharCode[CharCode["SPACE"] = 32] = "SPACE";
|
1886
|
-
CharCode[CharCode["TOFU"] = 65532] = "TOFU";
|
1887
|
-
})(CharCode || (CharCode = {}));
|
1888
|
-
/**
|
1889
|
-
* Class representing a font asset for SDF (Signed Distance Field) rendering.
|
1890
|
-
*/
|
1891
|
-
var FontAsset = /** @class */ (function () {
|
1892
|
-
/**
|
1893
|
-
* Creates a new FontAsset instance.
|
1894
|
-
* @param definitionData defines the font data in JSON format.
|
1895
|
-
* @param textureUrl defines the url of the texture to use for the font.
|
1896
|
-
* @param scene defines the hosting scene.
|
1897
|
-
*/
|
1898
|
-
function FontAsset(definitionData, textureUrl, scene) {
|
1899
|
-
var _this = this;
|
1900
|
-
this._chars = new Map();
|
1901
|
-
this._kernings = new Map();
|
1902
|
-
this._font = JSON.parse(definitionData);
|
1903
|
-
// So far we only consider one page
|
1904
|
-
this._font.pages = [textureUrl];
|
1905
|
-
this._font.chars.forEach(function (char) { return _this._chars.set(char.id, char); });
|
1906
|
-
this._font.kernings.forEach(function (kerning) {
|
1907
|
-
var submap = _this._kernings.get(kerning.first);
|
1908
|
-
if (!submap) {
|
1909
|
-
submap = new Map();
|
1910
|
-
_this._kernings.set(kerning.first, submap);
|
1911
|
-
}
|
1912
|
-
submap.set(kerning.second, kerning.amount);
|
1913
|
-
});
|
1914
|
-
this._charsRegex = new RegExp("[".concat(this._font.chars.map(function (c) { return c.char.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }).join(""), "]"), "g");
|
1915
|
-
this._updateFallbacks();
|
1916
|
-
this.scale = 1 / this._font.info.size;
|
1917
|
-
this.textures = this._font.pages.map(function (page) {
|
1918
|
-
var texture = new babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__.Texture(page, scene, { noMipmap: false, invertY: false });
|
1919
|
-
texture.anisotropicFilteringLevel = 16;
|
1920
|
-
return texture;
|
1921
|
-
});
|
1922
|
-
}
|
1923
|
-
FontAsset.prototype.dispose = function () {
|
1924
|
-
for (var _i = 0, _a = this.textures; _i < _a.length; _i++) {
|
1925
|
-
var texture = _a[_i];
|
1926
|
-
texture.dispose();
|
1927
|
-
}
|
1928
|
-
this.textures.length = 0;
|
1929
|
-
};
|
1930
|
-
FontAsset.prototype._updateFallbacks = function () {
|
1931
|
-
if (!this._chars.has(CharCode.SPACE)) {
|
1932
|
-
this._chars.set(CharCode.SPACE, {
|
1933
|
-
id: CharCode.SPACE,
|
1934
|
-
x: 0,
|
1935
|
-
y: 0,
|
1936
|
-
width: 0,
|
1937
|
-
height: 0,
|
1938
|
-
xoffset: 0,
|
1939
|
-
yoffset: 0,
|
1940
|
-
xadvance: this._font.info.size * 0.5,
|
1941
|
-
page: -1,
|
1942
|
-
chnl: -1,
|
1943
|
-
index: -1,
|
1944
|
-
char: " ",
|
1945
|
-
});
|
1946
|
-
}
|
1947
|
-
if (!this._chars.has(CharCode.TOFU)) {
|
1948
|
-
this._chars.set(CharCode.TOFU, {
|
1949
|
-
id: CharCode.TOFU,
|
1950
|
-
x: 0,
|
1951
|
-
y: 0,
|
1952
|
-
width: this._font.info.size,
|
1953
|
-
height: this._font.info.size,
|
1954
|
-
xoffset: 0,
|
1955
|
-
yoffset: 0,
|
1956
|
-
xadvance: this._font.info.size * 0.5,
|
1957
|
-
page: -1,
|
1958
|
-
chnl: -1,
|
1959
|
-
index: -1,
|
1960
|
-
char: "",
|
1961
|
-
});
|
1962
|
-
}
|
1963
|
-
};
|
1964
|
-
/** @internal */
|
1965
|
-
FontAsset.prototype._getChar = function (charCode) {
|
1966
|
-
return this._chars.get(charCode) || this._chars.get(CharCode.TOFU);
|
1967
|
-
};
|
1968
|
-
/** @internal */
|
1969
|
-
FontAsset.prototype._getKerning = function (first, second) {
|
1970
|
-
var _a;
|
1971
|
-
return ((_a = this._kernings.get(first)) === null || _a === void 0 ? void 0 : _a.get(second)) || 0;
|
1972
|
-
};
|
1973
|
-
/** @internal */
|
1974
|
-
FontAsset.prototype._unsupportedChars = function (text) {
|
1975
|
-
return text.replace(this._charsRegex, "");
|
1976
|
-
};
|
1977
|
-
return FontAsset;
|
1978
|
-
}());
|
1979
|
-
|
1980
|
-
|
1981
|
-
|
1982
|
-
/***/ }),
|
1983
|
-
|
1984
|
-
/***/ "../../../dev/addons/src/msdfText/index.ts":
|
1985
|
-
/*!*************************************************!*\
|
1986
|
-
!*** ../../../dev/addons/src/msdfText/index.ts ***!
|
1987
|
-
\*************************************************/
|
1988
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
1989
|
-
|
1990
|
-
__webpack_require__.r(__webpack_exports__);
|
1991
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1992
|
-
/* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _paragraphOptions__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
|
1993
|
-
/* harmony export */ FontAsset: () => (/* reexport safe */ _fontAsset__WEBPACK_IMPORTED_MODULE_0__.FontAsset),
|
1994
|
-
/* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _sdf_index__WEBPACK_IMPORTED_MODULE_3__.SdfTextParagraph),
|
1995
|
-
/* harmony export */ TextRenderer: () => (/* reexport safe */ _textRenderer__WEBPACK_IMPORTED_MODULE_2__.TextRenderer),
|
1996
|
-
/* harmony export */ msdfPixelShader: () => (/* reexport safe */ _shaders_msdf_fragment__WEBPACK_IMPORTED_MODULE_5__.msdfPixelShader),
|
1997
|
-
/* harmony export */ msdfPixelShaderWGSL: () => (/* reexport safe */ _shadersWGSL_msdf_fragment__WEBPACK_IMPORTED_MODULE_7__.msdfPixelShaderWGSL),
|
1998
|
-
/* harmony export */ msdfVertexShader: () => (/* reexport safe */ _shaders_msdf_vertex__WEBPACK_IMPORTED_MODULE_4__.msdfVertexShader),
|
1999
|
-
/* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _shadersWGSL_msdf_vertex__WEBPACK_IMPORTED_MODULE_6__.msdfVertexShaderWGSL)
|
2000
|
-
/* harmony export */ });
|
2001
|
-
/* harmony import */ var _fontAsset__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fontAsset */ "../../../dev/addons/src/msdfText/fontAsset.ts");
|
2002
|
-
/* harmony import */ var _paragraphOptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./paragraphOptions */ "../../../dev/addons/src/msdfText/paragraphOptions.ts");
|
2003
|
-
/* harmony import */ var _textRenderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textRenderer */ "../../../dev/addons/src/msdfText/textRenderer.ts");
|
2004
|
-
/* harmony import */ var _sdf_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdf/index */ "../../../dev/addons/src/msdfText/sdf/index.ts");
|
2005
|
-
/* harmony import */ var _shaders_msdf_vertex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./shaders/msdf.vertex */ "../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts");
|
2006
|
-
/* harmony import */ var _shaders_msdf_fragment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./shaders/msdf.fragment */ "../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts");
|
2007
|
-
/* harmony import */ var _shadersWGSL_msdf_vertex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./shadersWGSL/msdf.vertex */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts");
|
2008
|
-
/* harmony import */ var _shadersWGSL_msdf_fragment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shadersWGSL/msdf.fragment */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts");
|
2009
|
-
/* eslint-disable import/no-internal-modules */
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
2017
|
-
|
2018
|
-
|
2019
|
-
|
2020
|
-
/***/ }),
|
2021
|
-
|
2022
|
-
/***/ "../../../dev/addons/src/msdfText/paragraphOptions.ts":
|
2023
|
-
/*!************************************************************!*\
|
2024
|
-
!*** ../../../dev/addons/src/msdfText/paragraphOptions.ts ***!
|
2025
|
-
\************************************************************/
|
2026
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2027
|
-
|
2028
|
-
__webpack_require__.r(__webpack_exports__);
|
2029
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2030
|
-
/* harmony export */ DefaultParagraphOptions: () => (/* binding */ DefaultParagraphOptions)
|
2031
|
-
/* harmony export */ });
|
2032
|
-
/* eslint-disable jsdoc/require-jsdoc */
|
2033
|
-
/** @internal */
|
2034
|
-
var DefaultParagraphOptions = {
|
2035
|
-
maxWidth: Infinity,
|
2036
|
-
lineHeight: 1,
|
2037
|
-
letterSpacing: 1,
|
2038
|
-
tabSize: 4,
|
2039
|
-
whiteSpace: "pre-line",
|
2040
|
-
textAlign: "center",
|
2041
|
-
translate: { x: -0.5, y: -0.5 },
|
2042
|
-
};
|
2043
|
-
|
2044
|
-
|
2045
|
-
/***/ }),
|
2046
|
-
|
2047
|
-
/***/ "../../../dev/addons/src/msdfText/sdf/bmFont.ts":
|
2048
|
-
/*!******************************************************!*\
|
2049
|
-
!*** ../../../dev/addons/src/msdfText/sdf/bmFont.ts ***!
|
2050
|
-
\******************************************************/
|
2051
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2052
|
-
|
2053
|
-
__webpack_require__.r(__webpack_exports__);
|
2054
|
-
|
2055
|
-
|
2056
|
-
|
2057
|
-
/***/ }),
|
2058
|
-
|
2059
|
-
/***/ "../../../dev/addons/src/msdfText/sdf/font.ts":
|
2060
|
-
/*!****************************************************!*\
|
2061
|
-
!*** ../../../dev/addons/src/msdfText/sdf/font.ts ***!
|
2062
|
-
\****************************************************/
|
2063
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2064
|
-
|
2065
|
-
__webpack_require__.r(__webpack_exports__);
|
2066
|
-
|
2067
|
-
|
2068
|
-
|
2069
|
-
/***/ }),
|
2070
|
-
|
2071
|
-
/***/ "../../../dev/addons/src/msdfText/sdf/glyph.ts":
|
2072
|
-
/*!*****************************************************!*\
|
2073
|
-
!*** ../../../dev/addons/src/msdfText/sdf/glyph.ts ***!
|
2074
|
-
\*****************************************************/
|
2075
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2076
|
-
|
2077
|
-
__webpack_require__.r(__webpack_exports__);
|
2078
|
-
|
2079
|
-
|
2080
|
-
|
2081
|
-
/***/ }),
|
2082
|
-
|
2083
|
-
/***/ "../../../dev/addons/src/msdfText/sdf/index.ts":
|
2084
|
-
/*!*****************************************************!*\
|
2085
|
-
!*** ../../../dev/addons/src/msdfText/sdf/index.ts ***!
|
2086
|
-
\*****************************************************/
|
2087
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2088
|
-
|
2089
|
-
__webpack_require__.r(__webpack_exports__);
|
2090
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2091
|
-
/* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _paragraph__WEBPACK_IMPORTED_MODULE_4__.SdfTextParagraph)
|
2092
|
-
/* harmony export */ });
|
2093
|
-
/* harmony import */ var _bmFont__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bmFont */ "../../../dev/addons/src/msdfText/sdf/bmFont.ts");
|
2094
|
-
/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "../../../dev/addons/src/msdfText/sdf/font.ts");
|
2095
|
-
/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "../../../dev/addons/src/msdfText/sdf/glyph.ts");
|
2096
|
-
/* harmony import */ var _line__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line */ "../../../dev/addons/src/msdfText/sdf/line.ts");
|
2097
|
-
/* harmony import */ var _paragraph__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./paragraph */ "../../../dev/addons/src/msdfText/sdf/paragraph.ts");
|
2098
|
-
|
2099
|
-
|
2100
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
2105
|
-
/***/ }),
|
2106
|
-
|
2107
|
-
/***/ "../../../dev/addons/src/msdfText/sdf/line.ts":
|
2108
|
-
/*!****************************************************!*\
|
2109
|
-
!*** ../../../dev/addons/src/msdfText/sdf/line.ts ***!
|
2110
|
-
\****************************************************/
|
2111
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2112
|
-
|
2113
|
-
__webpack_require__.r(__webpack_exports__);
|
2114
|
-
|
2115
|
-
|
2116
|
-
|
2117
|
-
/***/ }),
|
2118
|
-
|
2119
|
-
/***/ "../../../dev/addons/src/msdfText/sdf/paragraph.ts":
|
2120
|
-
/*!*********************************************************!*\
|
2121
|
-
!*** ../../../dev/addons/src/msdfText/sdf/paragraph.ts ***!
|
2122
|
-
\*********************************************************/
|
2123
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2124
|
-
|
2125
|
-
__webpack_require__.r(__webpack_exports__);
|
2126
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2127
|
-
/* harmony export */ SdfTextParagraph: () => (/* binding */ SdfTextParagraph)
|
2128
|
-
/* harmony export */ });
|
2129
|
-
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
2130
|
-
/* harmony import */ var _paragraphOptions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../paragraphOptions */ "../../../dev/addons/src/msdfText/paragraphOptions.ts");
|
2131
|
-
|
2132
|
-
|
2133
|
-
/** @internal */
|
2134
|
-
var SdfTextParagraph = /** @class */ (function () {
|
2135
|
-
function SdfTextParagraph(text, fontAsset, options) {
|
2136
|
-
this.text = text;
|
2137
|
-
this.fontAsset = fontAsset;
|
2138
|
-
this.options = (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__assign)((0,tslib__WEBPACK_IMPORTED_MODULE_1__.__assign)({}, _paragraphOptions__WEBPACK_IMPORTED_MODULE_0__.DefaultParagraphOptions), options);
|
2139
|
-
var _a = this._computeMetrics(text), paragraph = _a.paragraph, lines = _a.lines, glyphs = _a.glyphs, width = _a.width, height = _a.height;
|
2140
|
-
this.paragraph = paragraph;
|
2141
|
-
this.lines = lines;
|
2142
|
-
this.glyphs = glyphs;
|
2143
|
-
this.width = width;
|
2144
|
-
this.height = height;
|
2145
|
-
}
|
2146
|
-
Object.defineProperty(SdfTextParagraph.prototype, "lineHeight", {
|
2147
|
-
get: function () {
|
2148
|
-
return this.fontAsset._font.common.lineHeight * this.options.lineHeight;
|
2149
|
-
},
|
2150
|
-
enumerable: false,
|
2151
|
-
configurable: true
|
2152
|
-
});
|
2153
|
-
SdfTextParagraph.prototype._computeMetrics = function (text) {
|
2154
|
-
var _this = this;
|
2155
|
-
var collapsed = this._collapse(text);
|
2156
|
-
var breaked = this._breakLines(collapsed);
|
2157
|
-
var trimmed = breaked.map(function (line) { return line.trim(); });
|
2158
|
-
var lines = [];
|
2159
|
-
for (var _i = 0, trimmed_1 = trimmed; _i < trimmed_1.length; _i++) {
|
2160
|
-
var line = trimmed_1[_i];
|
2161
|
-
lines.push.apply(lines, this._wrap(line, lines.length));
|
2162
|
-
}
|
2163
|
-
var width = Math.max.apply(Math, lines.map(function (line) { return line.width; }));
|
2164
|
-
var height = this.lineHeight * lines.length;
|
2165
|
-
if (this.options.textAlign !== "left" || this.options.translate) {
|
2166
|
-
lines.forEach(function (line) {
|
2167
|
-
var anchor = (function () {
|
2168
|
-
switch (_this.options.textAlign) {
|
2169
|
-
case "right":
|
2170
|
-
return width - line.width;
|
2171
|
-
case "center":
|
2172
|
-
return (width - line.width) / 2;
|
2173
|
-
case "left":
|
2174
|
-
default:
|
2175
|
-
return 0;
|
2176
|
-
}
|
2177
|
-
})();
|
2178
|
-
var x = _this.options.translate ? _this.options.translate.x * width : 0;
|
2179
|
-
var y = _this.options.translate ? _this.options.translate.y * height : 0;
|
2180
|
-
for (var _i = 0, _a = line.glyphs; _i < _a.length; _i++) {
|
2181
|
-
var glyph = _a[_i];
|
2182
|
-
glyph.x += anchor;
|
2183
|
-
glyph.x += x;
|
2184
|
-
glyph.y += y;
|
2185
|
-
}
|
2186
|
-
});
|
2187
|
-
}
|
2188
|
-
var glyphs = lines.flatMap(function (line) { return line.glyphs; });
|
2189
|
-
return {
|
2190
|
-
paragraph: trimmed.join("\n"),
|
2191
|
-
lines: lines,
|
2192
|
-
glyphs: glyphs,
|
2193
|
-
width: width,
|
2194
|
-
height: height,
|
2195
|
-
};
|
2196
|
-
};
|
2197
|
-
SdfTextParagraph.prototype._breakLines = function (text) {
|
2198
|
-
return text.split("\n");
|
2199
|
-
};
|
2200
|
-
SdfTextParagraph.prototype._collapse = function (text) {
|
2201
|
-
return text.replace(/\t/g, " ".repeat(this.options.tabSize)).replace(/ +/g, " ");
|
2202
|
-
};
|
2203
|
-
SdfTextParagraph.prototype._wrap = function (text, lineOffset) {
|
2204
|
-
if (lineOffset === void 0) { lineOffset = 0; }
|
2205
|
-
var lines = new Array();
|
2206
|
-
var currentLine = lineOffset;
|
2207
|
-
var currentGlyphs = new Array();
|
2208
|
-
var currentCursor = 0;
|
2209
|
-
var currentWidth = 0;
|
2210
|
-
var lastChar;
|
2211
|
-
var start = 0;
|
2212
|
-
var end = start;
|
2213
|
-
var pushCurrentLine = function () {
|
2214
|
-
lines.push({
|
2215
|
-
text: text.slice(start, end),
|
2216
|
-
glyphs: currentGlyphs,
|
2217
|
-
start: start,
|
2218
|
-
end: end,
|
2219
|
-
width: currentWidth,
|
2220
|
-
});
|
2221
|
-
};
|
2222
|
-
while (end < text.length) {
|
2223
|
-
var i = end;
|
2224
|
-
var charCode = text.charCodeAt(i);
|
2225
|
-
var char = this.fontAsset._getChar(charCode);
|
2226
|
-
var charWidth = char.width;
|
2227
|
-
var kerning = lastChar ? this.fontAsset._getKerning(lastChar.id, char.id) : 0;
|
2228
|
-
currentCursor += kerning;
|
2229
|
-
var newWidth = currentCursor + charWidth;
|
2230
|
-
var cursorProgress = char.xadvance + this.options.letterSpacing;
|
2231
|
-
var nextPosition = currentCursor + cursorProgress;
|
2232
|
-
var shouldBreak = nextPosition > this.options.maxWidth || newWidth > this.options.maxWidth;
|
2233
|
-
if (shouldBreak) {
|
2234
|
-
pushCurrentLine();
|
2235
|
-
currentLine++;
|
2236
|
-
lastChar = undefined;
|
2237
|
-
currentCursor = 0;
|
2238
|
-
currentWidth = 0;
|
2239
|
-
start = end;
|
2240
|
-
end = start + 1;
|
2241
|
-
currentGlyphs = [];
|
2242
|
-
}
|
2243
|
-
var x = currentCursor;
|
2244
|
-
var y = currentLine * this.lineHeight;
|
2245
|
-
currentGlyphs.push({
|
2246
|
-
char: char,
|
2247
|
-
line: currentLine,
|
2248
|
-
position: currentGlyphs.length,
|
2249
|
-
x: x,
|
2250
|
-
y: y,
|
2251
|
-
});
|
2252
|
-
if (!shouldBreak) {
|
2253
|
-
lastChar = char;
|
2254
|
-
currentCursor = nextPosition;
|
2255
|
-
currentWidth = newWidth;
|
2256
|
-
end++;
|
2257
|
-
}
|
2258
|
-
else {
|
2259
|
-
currentCursor = cursorProgress;
|
2260
|
-
}
|
2261
|
-
}
|
2262
|
-
if (currentGlyphs.length > 0) {
|
2263
|
-
if (lastChar) {
|
2264
|
-
// currentWidth += lastChar.xadvance;
|
2265
|
-
}
|
2266
|
-
pushCurrentLine();
|
2267
|
-
}
|
2268
|
-
return lines;
|
2269
|
-
};
|
2270
|
-
return SdfTextParagraph;
|
2271
|
-
}());
|
2272
|
-
|
2273
|
-
|
2274
|
-
|
2275
|
-
/***/ }),
|
2276
|
-
|
2277
|
-
/***/ "../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts":
|
2278
|
-
/*!*****************************************************************!*\
|
2279
|
-
!*** ../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts ***!
|
2280
|
-
\*****************************************************************/
|
2281
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2282
|
-
|
2283
|
-
__webpack_require__.r(__webpack_exports__);
|
2284
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2285
|
-
/* harmony export */ msdfPixelShader: () => (/* binding */ msdfPixelShader)
|
2286
|
-
/* harmony export */ });
|
2287
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
|
2288
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
2289
|
-
// Do not edit.
|
2290
|
-
|
2291
|
-
var name = "msdfPixelShader";
|
2292
|
-
var shader = "#extension GL_OES_standard_derivatives : enable\nprecision highp float;uniform sampler2D fontAtlas;uniform vec4 uColor;uniform vec4 uStrokeColor;uniform float uStrokeInsetWidth;uniform float uStrokeOutsetWidth;uniform float thickness;varying vec2 atlasUV;float median(vec3 msdf) {return max(min(msdf.r,msdf.g),min(max(msdf.r,msdf.g),msdf.b));}\nvoid main(void)\n{vec3 s=texture2D(fontAtlas,atlasUV).rgb;float sigDist=median(s)-0.5+thickness;float alpha=clamp(sigDist/fwidth(sigDist)+0.5,0.0,1.0);float sigDistOutset=sigDist+uStrokeOutsetWidth*0.5;float sigDistInset=sigDist-uStrokeInsetWidth*0.5;float outset=clamp(sigDistOutset/fwidth(sigDistOutset)+0.5,0.0,1.0);float inset=1.0-clamp(sigDistInset/fwidth(sigDistInset)+0.5,0.0,1.0);float border=outset*inset;vec4 filledFragColor=vec4(uColor.rgb,alpha*uColor.a);vec4 strokedFragColor=vec4(uStrokeColor.rgb,border*uStrokeColor.a);gl_FragColor=mix(filledFragColor,strokedFragColor,border);}";
|
2293
|
-
// Sideeffect
|
2294
|
-
if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name]) {
|
2295
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
2296
|
-
}
|
2297
|
-
/** @internal */
|
2298
|
-
var msdfPixelShader = { name: name, shader: shader };
|
2299
|
-
|
2300
|
-
|
2301
|
-
/***/ }),
|
2302
|
-
|
2303
|
-
/***/ "../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts":
|
2304
|
-
/*!***************************************************************!*\
|
2305
|
-
!*** ../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts ***!
|
2306
|
-
\***************************************************************/
|
2307
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2308
|
-
|
2309
|
-
__webpack_require__.r(__webpack_exports__);
|
2310
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2311
|
-
/* harmony export */ msdfVertexShader: () => (/* binding */ msdfVertexShader)
|
2312
|
-
/* harmony export */ });
|
2313
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
|
2314
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
2315
|
-
// Do not edit.
|
2316
|
-
|
2317
|
-
var name = "msdfVertexShader";
|
2318
|
-
var shader = "#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\nattribute vec2 offsets;attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;attribute vec4 uvs;uniform mat4 transform;uniform mat4 parentWorld;uniform mat4 view;uniform mat4 projection;uniform vec3 center;uniform int mode;varying vec2 atlasUV;void main(void) {mat4 world=mat4(world0,world1,world2,world3);vec4 worldPos=transform*(world*vec4(offsets.xy-vec2(0.5,0.5),0.,1.0));if (mode>=BILLBOARD) {vec3 viewPos=(view*parentWorld*vec4(0.,0.,0.,1.0)).xyz; \nif (mode==BILLBOARDSCREENPROJECTED) {viewPos.x/=viewPos.z;viewPos.y/=viewPos.z;viewPos.z=1.0;}\ngl_Position=projection*vec4(viewPos+worldPos.xyz,1.0); } else {vec3 viewPos=(view*parentWorld*worldPos).xyz; \ngl_Position=projection*vec4(viewPos,1.0); }\natlasUV=vec2(uvs.x+offsets.x*uvs.z,uvs.y+(1.0-offsets.y)*uvs.w);}";
|
2319
|
-
// Sideeffect
|
2320
|
-
if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name]) {
|
2321
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
2322
|
-
}
|
2323
|
-
/** @internal */
|
2324
|
-
var msdfVertexShader = { name: name, shader: shader };
|
2325
|
-
|
2326
|
-
|
2327
|
-
/***/ }),
|
2328
|
-
|
2329
|
-
/***/ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts":
|
2330
|
-
/*!*********************************************************************!*\
|
2331
|
-
!*** ../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts ***!
|
2332
|
-
\*********************************************************************/
|
2333
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2334
|
-
|
2335
|
-
__webpack_require__.r(__webpack_exports__);
|
2336
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2337
|
-
/* harmony export */ msdfPixelShaderWGSL: () => (/* binding */ msdfPixelShaderWGSL)
|
2338
|
-
/* harmony export */ });
|
2339
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
|
2340
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
2341
|
-
// Do not edit.
|
2342
|
-
|
2343
|
-
var name = "msdfPixelShader";
|
2344
|
-
var shader = "var fontAtlas: texture_2d<f32>;var fontAtlasSampler: sampler;uniform uColor: vec4f;uniform thickness: f32;uniform uStrokeColor: vec4f;uniform uStrokeInsetWidth: f32;uniform uStrokeOutsetWidth: f32;varying atlasUV: vec2f;fn median(msdf: vec3<f32>)->f32 {let a=min(msdf.r,msdf.g);let b=max(msdf.r,msdf.g);return max(a,min(b,msdf.b));}\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {let s=textureSample(fontAtlas,fontAtlasSampler,input.atlasUV).rgb;let sigDist=median(s)-0.5+uniforms.thickness;let afwidth=length(vec2<f32>(dpdx(sigDist),dpdy(sigDist)));let alpha=clamp(sigDist/afwidth+0.5,0.0,1.0);let sigDistOutset=sigDist+uniforms.uStrokeOutsetWidth*0.5;let sigDistInset=sigDist-uniforms.uStrokeInsetWidth*0.5;let afwidthOutset=length(vec2<f32>(dpdx(sigDistOutset),dpdy(sigDistOutset)));let afwidthInset=length(vec2<f32>(dpdx(sigDistInset),dpdy(sigDistInset)));let outset=clamp(sigDistOutset/afwidthOutset+0.5,0.0,1.0);let inset=1.0-clamp(sigDistInset/afwidthInset+0.5,0.0,1.0);let border=outset*inset;let filledFragColor=vec4<f32>(uniforms.uColor.rgb,alpha*uniforms.uColor.a);let strokedFragColor=vec4<f32>(uniforms.uStrokeColor.rgb,border*uniforms.uStrokeColor.a);fragmentOutputs.color=mix(filledFragColor,strokedFragColor,border);}";
|
2345
|
-
// Sideeffect
|
2346
|
-
if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name]) {
|
2347
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name] = shader;
|
2348
|
-
}
|
2349
|
-
/** @internal */
|
2350
|
-
var msdfPixelShaderWGSL = { name: name, shader: shader };
|
2351
|
-
|
2352
|
-
|
2353
|
-
/***/ }),
|
2354
|
-
|
2355
|
-
/***/ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts":
|
2356
|
-
/*!*******************************************************************!*\
|
2357
|
-
!*** ../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts ***!
|
2358
|
-
\*******************************************************************/
|
2359
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2360
|
-
|
2361
|
-
__webpack_require__.r(__webpack_exports__);
|
2362
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2363
|
-
/* harmony export */ msdfVertexShaderWGSL: () => (/* binding */ msdfVertexShaderWGSL)
|
2364
|
-
/* harmony export */ });
|
2365
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Maths/math");
|
2366
|
-
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
2367
|
-
// Do not edit.
|
2368
|
-
|
2369
|
-
var name = "msdfVertexShader";
|
2370
|
-
var shader = "#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\nattribute offsets: vec2f;attribute world0: vec4f;attribute world1: vec4f;attribute world2: vec4f;attribute world3: vec4f;attribute uvs: vec4f;uniform transform: mat4x4f;uniform parentWorld: mat4x4f;uniform view: mat4x4f;uniform projection: mat4x4f;uniform mode: u32;varying atlasUV: vec2f;@vertex\nfn main(input: VertexInputs)->FragmentInputs {let world=mat4x4<f32>(input.world0,input.world1,input.world2,input.world3);let localOffset=vec4<f32>(input.offsets-vec2<f32>(0.5,0.5),0.0,1.0);let worldPos=uniforms.transform*world*localOffset;if (uniforms.mode>=BILLBOARD) { \nvar viewPos=(uniforms.view*uniforms.parentWorld*vec4f(0.,0.,0.,1.0)).xyz;if (uniforms.mode==BILLBOARDSCREENPROJECTED) {viewPos=vec3f(viewPos.x/viewPos.z,viewPos.y/viewPos.z,1.0);} \nvertexOutputs.position=uniforms.projection*vec4<f32>(viewPos+worldPos.xyz,1.0);} else { \nlet viewPos=(uniforms.view*uniforms.parentWorld*worldPos).xyz;vertexOutputs.position=uniforms.projection*vec4<f32>(viewPos,1.0);}\nvertexOutputs.atlasUV=vec2<f32>(\ninput.uvs.x+input.offsets.x*input.uvs.z,\ninput.uvs.y+(1.0-input.offsets.y)*input.uvs.w\n);}";
|
2371
|
-
// Sideeffect
|
2372
|
-
if (!babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name]) {
|
2373
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStoreWGSL[name] = shader;
|
2374
|
-
}
|
2375
|
-
/** @internal */
|
2376
|
-
var msdfVertexShaderWGSL = { name: name, shader: shader };
|
2377
|
-
|
2378
|
-
|
2379
|
-
/***/ }),
|
2380
|
-
|
2381
|
-
/***/ "../../../dev/addons/src/msdfText/textRenderer.ts":
|
2382
|
-
/*!********************************************************!*\
|
2383
|
-
!*** ../../../dev/addons/src/msdfText/textRenderer.ts ***!
|
2384
|
-
\********************************************************/
|
2385
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2386
|
-
|
2387
|
-
__webpack_require__.r(__webpack_exports__);
|
2388
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2389
|
-
/* harmony export */ TextRenderer: () => (/* binding */ TextRenderer)
|
2390
|
-
/* harmony export */ });
|
2391
|
-
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
2392
|
-
/* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/ThinMaths/thinMath.matrix.functions */ "babylonjs/Maths/math");
|
2393
|
-
/* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__);
|
2394
|
-
/* harmony import */ var _sdf_paragraph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdf/paragraph */ "../../../dev/addons/src/msdfText/sdf/paragraph.ts");
|
2395
|
-
|
2396
|
-
|
2397
|
-
|
2398
|
-
|
2399
|
-
|
2400
|
-
|
2401
|
-
|
2402
|
-
/**
|
2403
|
-
* Class used to render text using MSDF (Multi-channel Signed Distance Field) technique
|
2404
|
-
* Thanks a lot to the work of Bhushan_Wagh and zb_sj for their amazing work on MSDF for Babylon.js
|
2405
|
-
* #6RLCWP#16
|
2406
|
-
* Star wars scroller: #6RLCWP#29
|
2407
|
-
* With metrics: #6RLCWP#35
|
2408
|
-
* Thickness: #IABMEZ#3
|
2409
|
-
* Solar system: #9YCDYC#9
|
2410
|
-
* Stroke: #6RLCWP#37
|
2411
|
-
*/
|
2412
|
-
var TextRenderer = /** @class */ (function () {
|
2413
|
-
function TextRenderer(engine, shaderLanguage, font) {
|
2414
|
-
if (shaderLanguage === void 0) { shaderLanguage = 0 /* ShaderLanguage.GLSL */; }
|
2415
|
-
this._useVAO = false;
|
2416
|
-
this._vertexBuffers = {};
|
2417
|
-
this._charMatrices = new Array();
|
2418
|
-
this._charUvs = new Array();
|
2419
|
-
this._isDirty = true;
|
2420
|
-
this._baseLine = 0;
|
2421
|
-
// Cache
|
2422
|
-
this._scalingMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2423
|
-
this._fontScaleMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2424
|
-
this._offsetMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2425
|
-
this._translationMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2426
|
-
this._baseMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2427
|
-
this._scaledMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2428
|
-
this._localMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2429
|
-
this._finalMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2430
|
-
this._lineMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2431
|
-
this._parentWorldMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2432
|
-
/**
|
2433
|
-
* Gets or sets the color of the text
|
2434
|
-
*/
|
2435
|
-
this.color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
|
2436
|
-
/**
|
2437
|
-
* Gets or sets the color of the stroke around the text
|
2438
|
-
*/
|
2439
|
-
this.strokeColor = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
|
2440
|
-
/**
|
2441
|
-
* Gets or sets the width of the stroke around the text (inset)
|
2442
|
-
*/
|
2443
|
-
this.strokeInsetWidth = 0;
|
2444
|
-
/**
|
2445
|
-
* Gets or sets the width of the stroke around the text (outset)
|
2446
|
-
*/
|
2447
|
-
this.strokeOutsetWidth = 0;
|
2448
|
-
/**
|
2449
|
-
* Gets or sets the thickness of the text (0 means as defined in the font)
|
2450
|
-
* Value must be between -0.5 and 0.5
|
2451
|
-
*/
|
2452
|
-
this.thicknessControl = 0;
|
2453
|
-
this._parent = null;
|
2454
|
-
this._transformMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2455
|
-
/**
|
2456
|
-
* Gets or sets if the text is billboarded
|
2457
|
-
*/
|
2458
|
-
this.isBillboard = false;
|
2459
|
-
/**
|
2460
|
-
* Gets or sets if the text is screen projected
|
2461
|
-
* This will work only if the text is billboarded
|
2462
|
-
*/
|
2463
|
-
this.isBillboardScreenProjected = false;
|
2464
|
-
/**
|
2465
|
-
* Gets or sets if the text renderer should ignore the depth buffer
|
2466
|
-
* Default is false
|
2467
|
-
*/
|
2468
|
-
this.ignoreDepthBuffer = false;
|
2469
|
-
this._engine = engine;
|
2470
|
-
this._shaderLanguage = shaderLanguage;
|
2471
|
-
this._font = font;
|
2472
|
-
this._baseLine = font._font.common.lineHeight * font.scale;
|
2473
|
-
this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;
|
2474
|
-
// Main vertex buffer
|
2475
|
-
var spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);
|
2476
|
-
this._spriteBuffer = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer(engine, spriteData, false, 2);
|
2477
|
-
this._vertexBuffers["offsets"] = this._spriteBuffer.createVertexBuffer("offsets", 0, 2);
|
2478
|
-
// Instances
|
2479
|
-
this._resizeBuffers(128);
|
2480
|
-
}
|
2481
|
-
Object.defineProperty(TextRenderer.prototype, "parent", {
|
2482
|
-
/**
|
2483
|
-
* Gets or sets the parent of the text renderer
|
2484
|
-
*/
|
2485
|
-
get: function () {
|
2486
|
-
return this._parent;
|
2487
|
-
},
|
2488
|
-
set: function (value) {
|
2489
|
-
this._parent = value;
|
2490
|
-
},
|
2491
|
-
enumerable: false,
|
2492
|
-
configurable: true
|
2493
|
-
});
|
2494
|
-
Object.defineProperty(TextRenderer.prototype, "transformMatrix", {
|
2495
|
-
/**
|
2496
|
-
* Gets or sets the transform matrix of the text renderer
|
2497
|
-
* It will be applied in that order:
|
2498
|
-
* parent x transform x paragraph world
|
2499
|
-
*/
|
2500
|
-
get: function () {
|
2501
|
-
return this._transformMatrix;
|
2502
|
-
},
|
2503
|
-
set: function (value) {
|
2504
|
-
this._transformMatrix = value;
|
2505
|
-
},
|
2506
|
-
enumerable: false,
|
2507
|
-
configurable: true
|
2508
|
-
});
|
2509
|
-
Object.defineProperty(TextRenderer.prototype, "characterCount", {
|
2510
|
-
/**
|
2511
|
-
* Gets the number of characters in the text renderer
|
2512
|
-
*/
|
2513
|
-
get: function () {
|
2514
|
-
return this._charMatrices.length / 16;
|
2515
|
-
},
|
2516
|
-
enumerable: false,
|
2517
|
-
configurable: true
|
2518
|
-
});
|
2519
|
-
TextRenderer.prototype._resizeBuffers = function (capacity) {
|
2520
|
-
if (this._worldBuffer) {
|
2521
|
-
this._worldBuffer.dispose();
|
2522
|
-
this._worldBuffer = null;
|
2523
|
-
}
|
2524
|
-
if (this._uvBuffer) {
|
2525
|
-
this._uvBuffer.dispose();
|
2526
|
-
this._uvBuffer = null;
|
2527
|
-
}
|
2528
|
-
this._worldBuffer = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer(this._engine, new Float32Array(capacity * 16), true, 16);
|
2529
|
-
this._vertexBuffers["world0"] = this._worldBuffer.createVertexBuffer("world0", 0, 4, 16, true);
|
2530
|
-
this._vertexBuffers["world1"] = this._worldBuffer.createVertexBuffer("world1", 4, 4, 16, true);
|
2531
|
-
this._vertexBuffers["world2"] = this._worldBuffer.createVertexBuffer("world2", 8, 4, 16, true);
|
2532
|
-
this._vertexBuffers["world3"] = this._worldBuffer.createVertexBuffer("world3", 12, 4, 16, true);
|
2533
|
-
this._uvBuffer = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer(this._engine, new Float32Array(capacity * 4), true, 4);
|
2534
|
-
this._vertexBuffers["uvs"] = this._uvBuffer.createVertexBuffer("uvs", 0, 4, 4, true);
|
2535
|
-
};
|
2536
|
-
TextRenderer.prototype._setShaders = function (vertex, fragment) {
|
2537
|
-
var _a;
|
2538
|
-
(_a = this._drawWrapperBase) === null || _a === void 0 ? void 0 : _a.dispose();
|
2539
|
-
this._drawWrapperBase = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.DrawWrapper(this._engine);
|
2540
|
-
if (this._drawWrapperBase.drawContext) {
|
2541
|
-
this._drawWrapperBase.drawContext.useInstancing = true;
|
2542
|
-
}
|
2543
|
-
var defines = "";
|
2544
|
-
this._drawWrapperBase.effect = this._engine.createEffect({
|
2545
|
-
vertexSource: vertex,
|
2546
|
-
fragmentSource: fragment,
|
2547
|
-
}, ["offsets", "world0", "world1", "world2", "world3", "uvs"], ["parentWorld", "view", "projection", "uColor", "thickness", "uStrokeColor", "uStrokeInsetWidth", "uStrokeOutsetWidth", "mode", "transform"], ["fontAtlas"], defines, undefined, undefined, undefined, undefined, this._shaderLanguage);
|
2548
|
-
this._drawWrapperBase.effect._refCount++;
|
2549
|
-
};
|
2550
|
-
/**
|
2551
|
-
* Add a paragraph of text to the renderer
|
2552
|
-
* @param text define the text to add
|
2553
|
-
* @param options define the options to use for the paragraph (optional)
|
2554
|
-
* @param worldMatrix define the world matrix to use for the paragraph (optional)
|
2555
|
-
*/
|
2556
|
-
TextRenderer.prototype.addParagraph = function (text, options, worldMatrix) {
|
2557
|
-
var _this = this;
|
2558
|
-
var paragraph = new _sdf_paragraph__WEBPACK_IMPORTED_MODULE_1__.SdfTextParagraph(text, this._font, options);
|
2559
|
-
var fontScale = this._font.scale;
|
2560
|
-
var texWidth = this._font._font.common.scaleW;
|
2561
|
-
var texHeight = this._font._font.common.scaleH;
|
2562
|
-
var glyphs = paragraph.glyphs.filter(function (g) { return g.char.page >= 0; });
|
2563
|
-
var worldMatrixToUse = worldMatrix;
|
2564
|
-
if (!worldMatrixToUse) {
|
2565
|
-
var lineHeight = paragraph.lineHeight * fontScale;
|
2566
|
-
var lineOffset = (paragraph.lines.length * lineHeight) / 2;
|
2567
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.TranslationMatrixToRef)(0, this._baseLine - lineOffset, 0, this._lineMatrix);
|
2568
|
-
worldMatrixToUse = this._lineMatrix;
|
2569
|
-
}
|
2570
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ScalingMatrixToRef)(fontScale, fontScale, 1.0, this._fontScaleMatrix);
|
2571
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.TranslationMatrixToRef)(0.5, -0.5, 0, this._offsetMatrix);
|
2572
|
-
var charsUvsBase = this._charUvs.length;
|
2573
|
-
var matricesBase = this._charMatrices.length;
|
2574
|
-
glyphs.forEach(function (g, i) {
|
2575
|
-
_this._charUvs[charsUvsBase + i * 4 + 0] = g.char.x / texWidth;
|
2576
|
-
_this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;
|
2577
|
-
_this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;
|
2578
|
-
_this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;
|
2579
|
-
var x = g.x + g.char.xoffset;
|
2580
|
-
var y = 1.0 - (g.y + g.char.yoffset);
|
2581
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ScalingMatrixToRef)(g.char.width, g.char.height, 1.0, _this._scalingMatrix);
|
2582
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.MultiplyMatricesToRef)(_this._offsetMatrix, _this._scalingMatrix, _this._baseMatrix);
|
2583
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.TranslationMatrixToRef)(x * fontScale, y * fontScale, 0.0, _this._translationMatrix);
|
2584
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.MultiplyMatricesToRef)(_this._baseMatrix, _this._fontScaleMatrix, _this._scaledMatrix);
|
2585
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.MultiplyMatricesToRef)(_this._scaledMatrix, _this._translationMatrix, _this._localMatrix);
|
2586
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.MultiplyMatricesToRef)(_this._localMatrix, worldMatrixToUse, _this._finalMatrix);
|
2587
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToArray)(_this._finalMatrix, _this._charMatrices, matricesBase + i * 16);
|
2588
|
-
});
|
2589
|
-
this._isDirty = true;
|
2590
|
-
this._baseLine -= paragraph.lineHeight * fontScale * paragraph.lines.length;
|
2591
|
-
};
|
2592
|
-
/**
|
2593
|
-
* Render the text using the provided view and projection matrices
|
2594
|
-
* @param viewMatrix define the view matrix to use
|
2595
|
-
* @param projectionMatrix define the projection matrix to use
|
2596
|
-
*/
|
2597
|
-
TextRenderer.prototype.render = function (viewMatrix, projectionMatrix) {
|
2598
|
-
var drawWrapper = this._drawWrapperBase;
|
2599
|
-
var effect = drawWrapper.effect;
|
2600
|
-
// Check
|
2601
|
-
if (!effect.isReady()) {
|
2602
|
-
return;
|
2603
|
-
}
|
2604
|
-
var engine = this._engine;
|
2605
|
-
engine.setState(false);
|
2606
|
-
engine.enableEffect(drawWrapper);
|
2607
|
-
if (this.ignoreDepthBuffer) {
|
2608
|
-
engine.setDepthBuffer(false);
|
2609
|
-
}
|
2610
|
-
if (this._parent) {
|
2611
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToRef)(this._parent.getWorldMatrix(), this._parentWorldMatrix);
|
2612
|
-
}
|
2613
|
-
else {
|
2614
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrixToRef)(this._parentWorldMatrix);
|
2615
|
-
}
|
2616
|
-
effect.setInt("mode", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);
|
2617
|
-
effect.setMatrix("parentWorld", this._parentWorldMatrix);
|
2618
|
-
effect.setMatrix("view", viewMatrix);
|
2619
|
-
effect.setMatrix("projection", projectionMatrix);
|
2620
|
-
effect.setMatrix("transform", this.transformMatrix);
|
2621
|
-
// Texture
|
2622
|
-
effect.setTexture("fontAtlas", this._font.textures[0]);
|
2623
|
-
effect.setDirectColor4("uColor", this.color);
|
2624
|
-
effect.setDirectColor4("uStrokeColor", this.strokeColor);
|
2625
|
-
effect.setFloat("thickness", this.thicknessControl * 0.9);
|
2626
|
-
effect.setFloat("uStrokeInsetWidth", this.strokeInsetWidth);
|
2627
|
-
effect.setFloat("uStrokeOutsetWidth", this.strokeOutsetWidth);
|
2628
|
-
var instanceCount = this._charMatrices.length / 16;
|
2629
|
-
// Need update?
|
2630
|
-
if (this._isDirty) {
|
2631
|
-
this._isDirty = false;
|
2632
|
-
if (this._worldBuffer.getBuffer().capacity / 4 < instanceCount * 16) {
|
2633
|
-
this._resizeBuffers(instanceCount);
|
2634
|
-
}
|
2635
|
-
this._worldBuffer.update(this._charMatrices);
|
2636
|
-
this._uvBuffer.update(this._charUvs);
|
2637
|
-
}
|
2638
|
-
if (this._useVAO) {
|
2639
|
-
if (!this._vertexArrayObject) {
|
2640
|
-
this._vertexArrayObject = engine.recordVertexArrayObject(this._vertexBuffers, null, effect);
|
2641
|
-
}
|
2642
|
-
engine.bindVertexArrayObject(this._vertexArrayObject, null);
|
2643
|
-
}
|
2644
|
-
else {
|
2645
|
-
// VBOs
|
2646
|
-
engine.bindBuffers(this._vertexBuffers, null, effect);
|
2647
|
-
}
|
2648
|
-
engine.setAlphaMode(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.ALPHA_COMBINE);
|
2649
|
-
engine.drawArraysType(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);
|
2650
|
-
engine.unbindInstanceAttributes();
|
2651
|
-
engine.setAlphaMode(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.ALPHA_DISABLE);
|
2652
|
-
if (this.ignoreDepthBuffer) {
|
2653
|
-
engine.setDepthBuffer(true);
|
2654
|
-
}
|
2655
|
-
};
|
2656
|
-
/**
|
2657
|
-
* Release associated resources
|
2658
|
-
*/
|
2659
|
-
TextRenderer.prototype.dispose = function () {
|
2660
|
-
if (this._worldBuffer) {
|
2661
|
-
this._worldBuffer.dispose();
|
2662
|
-
this._worldBuffer = null;
|
2663
|
-
}
|
2664
|
-
if (this._uvBuffer) {
|
2665
|
-
this._uvBuffer.dispose();
|
2666
|
-
this._uvBuffer = null;
|
2667
|
-
}
|
2668
|
-
if (this._spriteBuffer) {
|
2669
|
-
this._spriteBuffer.dispose();
|
2670
|
-
this._spriteBuffer = null;
|
2671
|
-
}
|
2672
|
-
if (this._vertexArrayObject) {
|
2673
|
-
this._engine.releaseVertexArrayObject(this._vertexArrayObject);
|
2674
|
-
this._vertexArrayObject = null;
|
2675
|
-
}
|
2676
|
-
};
|
2677
|
-
/**
|
2678
|
-
* Creates a new TextRenderer instance asynchronously
|
2679
|
-
* @param font define the font asset to use
|
2680
|
-
* @param engine define the engine to use
|
2681
|
-
* @returns a promise that resolves to the created TextRenderer instance
|
2682
|
-
*/
|
2683
|
-
TextRenderer.CreateTextRendererAsync = function (font, engine) {
|
2684
|
-
return (0,tslib__WEBPACK_IMPORTED_MODULE_2__.__awaiter)(this, void 0, void 0, function () {
|
2685
|
-
var shaderLanguage, vertex, fragment, textRenderer;
|
2686
|
-
return (0,tslib__WEBPACK_IMPORTED_MODULE_2__.__generator)(this, function (_a) {
|
2687
|
-
switch (_a.label) {
|
2688
|
-
case 0:
|
2689
|
-
if (!engine.getCaps().instancedArrays || !engine._features.supportSpriteInstancing) {
|
2690
|
-
throw new Error("Instanced arrays are required for MSDF text rendering.");
|
2691
|
-
}
|
2692
|
-
shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
2693
|
-
vertex = "";
|
2694
|
-
fragment = "";
|
2695
|
-
if (!engine.isWebGPU) return [3 /*break*/, 3];
|
2696
|
-
shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
2697
|
-
return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shadersWGSL/msdf.vertex */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.vertex.ts"))];
|
2698
|
-
case 1:
|
2699
|
-
vertex = (_a.sent()).msdfVertexShaderWGSL.shader;
|
2700
|
-
return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shadersWGSL/msdf.fragment */ "../../../dev/addons/src/msdfText/shadersWGSL/msdf.fragment.ts"))];
|
2701
|
-
case 2:
|
2702
|
-
fragment = (_a.sent()).msdfPixelShaderWGSL.shader;
|
2703
|
-
return [3 /*break*/, 6];
|
2704
|
-
case 3: return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shaders/msdf.vertex */ "../../../dev/addons/src/msdfText/shaders/msdf.vertex.ts"))];
|
2705
|
-
case 4:
|
2706
|
-
vertex = (_a.sent()).msdfVertexShader.shader;
|
2707
|
-
return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./shaders/msdf.fragment */ "../../../dev/addons/src/msdfText/shaders/msdf.fragment.ts"))];
|
2708
|
-
case 5:
|
2709
|
-
fragment = (_a.sent()).msdfPixelShader.shader;
|
2710
|
-
_a.label = 6;
|
2711
|
-
case 6:
|
2712
|
-
textRenderer = new TextRenderer(engine, shaderLanguage, font);
|
2713
|
-
textRenderer._setShaders(vertex, fragment);
|
2714
|
-
return [2 /*return*/, textRenderer];
|
2715
|
-
}
|
2716
|
-
});
|
2717
|
-
});
|
2718
|
-
};
|
2719
|
-
return TextRenderer;
|
2720
|
-
}());
|
2721
|
-
|
2722
|
-
|
2723
|
-
|
2724
|
-
/***/ }),
|
2725
|
-
|
2726
|
-
/***/ "babylonjs/Maths/math":
|
2727
|
-
/*!****************************************************************************************************!*\
|
2728
|
-
!*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
|
2729
|
-
\****************************************************************************************************/
|
2730
|
-
/***/ ((module) => {
|
2731
|
-
|
2732
|
-
module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math__;
|
2733
|
-
|
2734
|
-
/***/ })
|
2735
|
-
|
2736
|
-
/******/ });
|
2737
|
-
/************************************************************************/
|
2738
|
-
/******/ // The module cache
|
2739
|
-
/******/ var __webpack_module_cache__ = {};
|
2740
|
-
/******/
|
2741
|
-
/******/ // The require function
|
2742
|
-
/******/ function __webpack_require__(moduleId) {
|
2743
|
-
/******/ // Check if module is in cache
|
2744
|
-
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
2745
|
-
/******/ if (cachedModule !== undefined) {
|
2746
|
-
/******/ return cachedModule.exports;
|
2747
|
-
/******/ }
|
2748
|
-
/******/ // Create a new module (and put it into the cache)
|
2749
|
-
/******/ var module = __webpack_module_cache__[moduleId] = {
|
2750
|
-
/******/ // no module.id needed
|
2751
|
-
/******/ // no module.loaded needed
|
2752
|
-
/******/ exports: {}
|
2753
|
-
/******/ };
|
2754
|
-
/******/
|
2755
|
-
/******/ // Execute the module function
|
2756
|
-
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
2757
|
-
/******/
|
2758
|
-
/******/ // Return the exports of the module
|
2759
|
-
/******/ return module.exports;
|
2760
|
-
/******/ }
|
2761
|
-
/******/
|
2762
|
-
/************************************************************************/
|
2763
|
-
/******/ /* webpack/runtime/compat get default export */
|
2764
|
-
/******/ (() => {
|
2765
|
-
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
2766
|
-
/******/ __webpack_require__.n = (module) => {
|
2767
|
-
/******/ var getter = module && module.__esModule ?
|
2768
|
-
/******/ () => (module['default']) :
|
2769
|
-
/******/ () => (module);
|
2770
|
-
/******/ __webpack_require__.d(getter, { a: getter });
|
2771
|
-
/******/ return getter;
|
2772
|
-
/******/ };
|
2773
|
-
/******/ })();
|
2774
|
-
/******/
|
2775
|
-
/******/ /* webpack/runtime/define property getters */
|
2776
|
-
/******/ (() => {
|
2777
|
-
/******/ // define getter functions for harmony exports
|
2778
|
-
/******/ __webpack_require__.d = (exports, definition) => {
|
2779
|
-
/******/ for(var key in definition) {
|
2780
|
-
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
2781
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
2782
|
-
/******/ }
|
2783
|
-
/******/ }
|
2784
|
-
/******/ };
|
2785
|
-
/******/ })();
|
2786
|
-
/******/
|
2787
|
-
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
2788
|
-
/******/ (() => {
|
2789
|
-
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
2790
|
-
/******/ })();
|
2791
|
-
/******/
|
2792
|
-
/******/ /* webpack/runtime/make namespace object */
|
2793
|
-
/******/ (() => {
|
2794
|
-
/******/ // define __esModule on exports
|
2795
|
-
/******/ __webpack_require__.r = (exports) => {
|
2796
|
-
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
2797
|
-
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
2798
|
-
/******/ }
|
2799
|
-
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
2800
|
-
/******/ };
|
2801
|
-
/******/ })();
|
2802
|
-
/******/
|
2803
|
-
/************************************************************************/
|
2804
|
-
var __webpack_exports__ = {};
|
2805
|
-
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
|
2806
|
-
(() => {
|
2807
|
-
/*!**********************!*\
|
2808
|
-
!*** ./src/index.ts ***!
|
2809
|
-
\**********************/
|
2810
|
-
__webpack_require__.r(__webpack_exports__);
|
2811
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2812
|
-
/* harmony export */ addons: () => (/* reexport module object */ addons_index__WEBPACK_IMPORTED_MODULE_0__),
|
2813
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
2814
|
-
/* harmony export */ });
|
2815
|
-
/* harmony import */ var addons_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! addons/index */ "../../../dev/addons/src/index.ts");
|
2816
|
-
// eslint-disable-next-line import/no-internal-modules
|
2817
|
-
|
2818
|
-
|
2819
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (addons_index__WEBPACK_IMPORTED_MODULE_0__);
|
2820
|
-
|
2821
|
-
})();
|
2822
|
-
|
2823
|
-
__webpack_exports__ = __webpack_exports__["default"];
|
2824
|
-
/******/ return __webpack_exports__;
|
2825
|
-
/******/ })()
|
2826
|
-
;
|
2827
|
-
});
|
2828
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFtQkE7QUFHQTtBQUZBO0FBQ0E7QUFwQkE7QUFDQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQXVCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xPQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQWtCQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUF2QkE7QUFFQTtBQXNCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNSQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBSXhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUVEQTtBQUtBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBQUE7QUFDQTtBQUNBOzs7QUFBQTtBQXdCQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzS0E7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYkE7QUFDQTtBQUVBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEJBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFFQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CQTtBQUVBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFpQkE7Ozs7Ozs7OztBQVNBO0FBQ0E7QUEwR0E7QUFBQTtBQXpHQTtBQUdBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBRUE7QUFhQTtBQWVBOztBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQVNBOzs7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBOURBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUpBO0FBYUE7QUFMQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQW9CQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBS0E7QUFDQTs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUFBO0FBQ0E7O0FBQUE7O0FBRUE7O0FBQUE7QUFDQTs7QUFBQTs7O0FBR0E7QUFDQTtBQUVBOzs7O0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7QUM5WUE7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9maXRTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvaHRtbE1lc2gudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9wb2ludGVyRXZlbnRzQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L2ZvbnRBc3NldC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3BhcmFncmFwaE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9ibUZvbnQudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9mb250LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9tc2RmVGV4dC9zZGYvZ2x5cGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9pbmRleC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2RmL2xpbmUudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9wYXJhZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NoYWRlcnMvbXNkZi5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2hhZGVycy9tc2RmLnZlcnRleC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2hhZGVyc1dHU0wvbXNkZi5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2hhZGVyc1dHU0wvbXNkZi52ZXJ0ZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3RleHRSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9BRERPTlMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQURET05TLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1hZGRvbnNcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1hZGRvbnNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkFERE9OU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGhzX21hdGhfXykgPT4ge1xucmV0dXJuICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIGFyID0gW107XG4gICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICByZXR1cm4gYXI7XG4gIH07XG4gIHJldHVybiBvd25LZXlzKG8pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsImV4cG9ydCB0eXBlIEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQ7XHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQ7XHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneUNvbnRhaW46IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IHNpemluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuYWxpZ25JdGVtcyA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoc2NhbGluZ0VsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBzaXppbmdFbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBzaXppbmdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkISBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgY29uc3QgW2NoaWxkV2lkdGgsIGNoaWxkSGVpZ2h0XSA9IFtzY2FsaW5nRWxlbWVudC5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQub2Zmc2V0SGVpZ2h0XTtcclxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoIC8gY2hpbGRXaWR0aCwgaGVpZ2h0IC8gY2hpbGRIZWlnaHQpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3NjYWxlfSlgO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneUNvdmVyOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQub2Zmc2V0V2lkdGgsIHNjYWxpbmdFbGVtZW50Lm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heCh3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lTdHJldGNoOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQub2Zmc2V0V2lkdGgsIHNjYWxpbmdFbGVtZW50Lm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7d2lkdGggLyBjaGlsZFdpZHRofSwgJHtoZWlnaHQgLyBjaGlsZEhlaWdodH0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lOb25lOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChzaXppbmdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEZpdFN0cmF0ZWd5ID0ge1xyXG4gICAgQ09OVEFJTjogRml0U3RyYXRlZ3lDb250YWluLFxyXG4gICAgQ09WRVI6IEZpdFN0cmF0ZWd5Q292ZXIsXHJcbiAgICBTVFJFVENIOiBGaXRTdHJhdGVneVN0cmV0Y2gsXHJcbiAgICBOT05FOiBGaXRTdHJhdGVneU5vbmUsXHJcbn07XHJcbiIsImltcG9ydCB7IE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvbWVzaFwiO1xyXG5pbXBvcnQgeyBDcmVhdGVQbGFuZVZlcnRleERhdGEgfSBmcm9tIFwiY29yZS9NZXNoZXMvQnVpbGRlcnMvcGxhbmVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFN0YW5kYXJkTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvc3RhbmRhcmRNYXRlcmlhbFwiO1xyXG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoXCI7XHJcbmltcG9ydCB7IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiY29yZS9NaXNjL2xvZ2dlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEZpdFN0cmF0ZWd5VHlwZSB9IGZyb20gXCIuL2ZpdFN0cmF0ZWd5XCI7XHJcbmltcG9ydCB7IEZpdFN0cmF0ZWd5IH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgSFRNTCBjb250ZW50IHRoYXQgd2Ugd2FudCB0byByZW5kZXIgYXMgdGhvdWdoIGl0IGlzIHBhcnQgb2YgdGhlIHNjZW5lLiAgVGhlIEhUTUwgY29udGVudCBpcyBhY3R1YWxseVxyXG4gKiByZW5kZXJlZCBiZWxvdyB0aGUgY2FudmFzLCBidXQgYSBkZXB0aCBtYXNrIGlzIGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyB0aGF0IHdyaXRlcyB0byB0aGUgZGVwdGggYnVmZmVyIGJ1dCBkb2VzIG5vdFxyXG4gKiB3cml0ZSB0byB0aGUgY29sb3IgYnVmZmVyLCBlZmZlY3RpdmVseSBwdW5jaGluZyBhIGhvbGUgaW4gdGhlIGNhbnZhcy4gIENTUyB0cmFuc2Zvcm1zIGFyZSB1c2VkIHRvIHNjYWxlLCB0cmFuc2xhdGUsIGFuZCByb3RhdGVcclxuICogdGhlIEhUTUwgY29udGVudCBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIGNhbWVyYSBhbmQgbWVzaCBvcmllbnRhdGlvbi4gIFRoZSBjbGFzcyBzdXBwb3J0cyBpbnRlcmFjdGlvbnMgaW4gZWRpdGFibGUgYW5kIG5vbi1lZGl0YWJsZSBtb2RlLlxyXG4gKiBJbiBub24tZWRpdGFibGUgbW9kZSAodGhlIGRlZmF1bHQpLCBldmVudHMgYXJlIHBhc3NlZCB0byB0aGUgSFRNTCBjb250ZW50IHdoZW4gdGhlIHBvaW50ZXIgaXMgb3ZlciB0aGUgbWFzayAoYW5kIG5vdCBvY2NsdWRlZCBieSBvdGhlciBtZXNoZXNcclxuICogaW4gdGhlIHNjZW5lKS5cclxuICogQHNlZSBodHRwczovL3BsYXlncm91bmQuYmFieWxvbmpzLmNvbS8jSFZIWUpDIzVcclxuICogQHNlZSBodHRwczovL3BsYXlncm91bmQuYmFieWxvbmpzLmNvbS8jQjE3VEM3IzExMlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEh0bWxNZXNoIGV4dGVuZHMgTWVzaCB7XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBzIGlkZW50aWZ5aW5nIGEgaHRtbCBtZXNoIGZyb20gYSByZWd1bGFyIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc0h0bWxNZXNoKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE92ZXJyaWRlIHRoZSBzdXBlciBjbGFzcydzIF9pc0VuYWJsZWQgcHJvcGVydHkgc28gd2UgY2FuIGNvbnRyb2wgd2hlbiB0aGUgbWVzaFxyXG4gICAgLy8gaXMgZW5hYmxlZC4gIEkuZS4sIHdlIGRvbid0IHdhbnQgdG8gcmVuZGVyIHRoZSBtZXNoIHVudGlsIHRoZXJlIGlzIGNvbnRlbnQgdG8gc2hvdy5cclxuICAgIHByaXZhdGUgX2VuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBUaGUgbWVzaCBpcyByZWFkeSB3aGVuIGNvbnRlbnQgaGFzIGJlZW4gc2V0IGFuZCB0aGUgY29udGVudCBzaXplIGhhcyBiZWVuIHNldFxyXG4gICAgLy8gVGhlIGZvcm1lciBpcyBkb25lIGJ5IHRoZSB1c2VyLCB0aGUgbGF0dGVyIGlzIGRvbmUgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgcHJpdmF0ZSBfcmVhZHkgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX2lzQ2FudmFzT3ZlcmxheSA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3JlcXVpcmVzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9lbGVtZW50PzogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF93aWR0aD86IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2hlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIF9pbnZlcnNlU2NhbGVNYXRyaXg6IE1hdHJpeCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgX2NhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3I6IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2VXaWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9zb3VyY2VIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBzb3VyY2Ugd2lkdGggb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc291cmNlV2lkdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSBzb3VyY2UgaGVpZ2h0IG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNvdXJjZUhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXI6IGFueTtcclxuXHJcbiAgICBwcml2YXRlIF9maXRTdHJhdGVneTogRml0U3RyYXRlZ3lUeXBlID0gRml0U3RyYXRlZ3kuTk9ORTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRydWN0IGFuIGluc3RhbmNlIG9mIEh0bWxNZXNoXHJcbiAgICAgKiBAcGFyYW0gc2NlbmVcclxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG1lc2guICBXaWxsIGJlIHVzZWQgYXMgdGhlIGlkIG9mIHRoZSBIVE1MIGVsZW1lbnQgYXMgd2VsbC5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Ioc2NlbmU6IFNjZW5lLCBpZDogc3RyaW5nLCB7IGNhcHR1cmVPblBvaW50ZXJFbnRlciA9IHRydWUsIGlzQ2FudmFzT3ZlcmxheSA9IGZhbHNlLCBmaXRTdHJhdGVneSA9IEZpdFN0cmF0ZWd5Lk5PTkUgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBCYWlsIGlmIHdlIGFyZW4ndCBydW5uaW5nIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oYENyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGFuIEh0bWxNZXNoIHdpdGggaWQgJHtpZH0gb3V0c2lkZSBvZiBhIGJyb3dzZXIuICBUaGUgbWVzaCB3aWxsIG5vdCBiZSB2aXNpYmxlLmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9maXRTdHJhdGVneSA9IGZpdFN0cmF0ZWd5O1xyXG4gICAgICAgIHRoaXMuX2lzQ2FudmFzT3ZlcmxheSA9IGlzQ2FudmFzT3ZlcmxheTtcclxuICAgICAgICB0aGlzLl9jcmVhdGVNYXNrKCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX2NyZWF0ZUVsZW1lbnQoKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhpcyB3aWxsIHNob3cgYXMgc29vbiBhcyBpdCdzIHJlYWR5XHJcbiAgICAgICAgdGhpcy5zZXRFbmFibGVkKHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGJlaGF2aW9yIHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IgPSBuZXcgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcih0aGlzLmNhcHR1cmVQb2ludGVyRXZlbnRzLmJpbmQodGhpcyksIHRoaXMucmVsZWFzZVBvaW50ZXJFdmVudHMuYmluZCh0aGlzKSwge1xyXG4gICAgICAgICAgICBjYXB0dXJlT25Qb2ludGVyRW50ZXI6IHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFkZEJlaGF2aW9yKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBIVE1MIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZW5kZXJlZCBhcyBhIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBlbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJ1ZSBpZiB0aGUgbWVzaCBoYXMgYmVlbiBtb3ZlZCwgcm90YXRlZCwgb3Igc2NhbGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpc1xyXG4gICAgICogcHJvcGVydHkgd2FzIHJlYWQuICBUaGlzIHByb3BlcnR5IGlzIHJlc2V0IHRvIGZhbHNlIGFmdGVyIHJlYWRpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZXNVcGRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVzVXBkYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIGNhcHR1cmUgZm9yIHRoZSBwb2ludGVyIHdoZW4gZW50ZXJpbmcgdGhlIG1lc2ggYXJlYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGNhcHR1cmVPblBvaW50ZXJFbnRlcihjYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IuY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2VzIG9mIHRoZSBtZXNoIGFuZCB0aGUgSFRNTCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNwb3NlKCkge1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50Py5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9tYXJrQXNVcGRhdGVkKCkge1xyXG4gICAgICAgIHRoaXMuX3JlcXVpcmVzVXBkYXRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgY29udGVudCBhZGp1c3RpbmcgdGhlIG1lc2ggc2NhbGUgdG8gbWF0Y2ggYW5kIG1ha2luZyBpdCB2aXNpYmxlLlxyXG4gICAgICogSWYgdGhlIHRoZSBzcGVjaWZpZWQgY29udGVudCBpcyB1bmRlZmluZWQsIHRoZW4gaXQgd2lsbCBtYWtlIHRoZSBtZXNoIGludmlzaWJsZS4gIEluIGVpdGhlciBjYXNlIGl0IHdpbGwgY2xlYXIgdGhlXHJcbiAgICAgKiBlbGVtZW50IGNvbnRlbnQgZmlyc3QuXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byByZW5kZXIgYXMgYSBtZXNoXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBtZXNoIGluIEJhYnlsb24gdW5pdHNcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbWVzaCBpbiBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgKi9cclxuICAgIHNldENvbnRlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gSWYgY29udGVudCBpcyBjaGFuZ2VkLCB3ZSBhcmUgbm8gbG9uZ2VyIHJlYWR5XHJcbiAgICAgICAgdGhpcy5fc2V0QXNSZWFkeShmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIEFsc28gaW52YWxpZGF0ZSB0aGUgc291cmNlIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAgICB0aGlzLl9zb3VyY2VXaWR0aCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSGVpZ2h0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX3JlcXVpcmVzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsaW5nLnNldEFsbCgxKTtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9maXRTdHJhdGVneS53cmFwRWxlbWVudChlbGVtZW50KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VXaWR0aCAmJiB0aGlzLnNvdXJjZUhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBPdmVyaWRlcyBCQUJZTE9OLk1lc2guc2V0RW5hYmxlZFxyXG4gICAgcHVibGljIG92ZXJyaWRlIHNldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIENhcHR1cmUgcmVxdWVzdGVkIGVuYWJsZWQgc3RhdGVcclxuICAgICAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgLy8gSWYgZGlzYWJsaW5nIG9yIGVuYWJsaW5nIGFuZCB3ZSBhcmUgcmVhZHlcclxuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgdGhpcy5fcmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGVuYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgc2l6ZSBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgc291cmNlXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDb250ZW50U2l6ZVB4KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCB8fCAhdGhpcy5fZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9maXRTdHJhdGVneS51cGRhdGVTaXplKHRoaXMuX2VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldEFzUmVhZHkodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0QXNSZWFkeShyZWFkeTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3JlYWR5ID0gcmVhZHk7XHJcbiAgICAgICAgaWYgKHJlYWR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvU2V0RW5hYmxlZCh0aGlzLl9lbmFibGVkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RvU2V0RW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgZW5hYmxlZCwgdGhlbiBzdGFydCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgdG8gdGhlXHJcbiAgICAgICAgLy8gc2NhbGluZywgcm90YXRpb24sIGFuZCBwb3NpdGlvbi4gIG90aGVyd2lzZSBzdG9wIGxpc3RlbmluZ1xyXG4gICAgICAgIGlmIChlbmFibGVkICYmICF0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIgPSB0aGlzLm9uQWZ0ZXJXb3JsZE1hdHJpeFVwZGF0ZU9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyPy5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBlbmFibGVkLCB0aGVuIHJldmVydCB0aGUgY29udGVudCBlbGVtZW50IGRpc3BsYXlcclxuICAgICAgICAvLyBvdGhlcndpc2UgaGlkZSBpdFxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGVuYWJsZWQgPyBcIlwiIDogXCJub25lXCI7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSB0aGUgY29udGVudCB6IGluZGV4XHJcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudHpJbmRleCh0aGlzLnBvc2l0aW9uLnogKiAtMTAwMDApO1xyXG4gICAgICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCkge1xyXG4gICAgICAgIC8vIElmIHdlIGhhdmUgc2V0Q29udGVudCBiZWZvcmUsIHRoZSBjb250ZW50IHNjYWxlIGlzIGJha2VkIGludG8gdGhlIG1lc2guICBJZiB3ZSBkb24ndCByZXNldCB0aGUgdmVydGljZXMgdG9cclxuICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc2l6ZSwgdGhlbiB3ZSB3aWxsIG11bHRpcGx5IHRoZSBzY2FsZSB3aGVuIHdlIGJha2UgdGhlIHNjYWxlIGJlbG93LiAgQnkgYXBwbHlpbmcgdGhlIGludmVyc2UsIHdlIGJhY2sgb3V0XHJcbiAgICAgICAgLy8gdGhlIHNjYWxpbmcgdGhhdCBoYXMgYmVlbiBkb25lIHNvIHdlIGFyZSBzdGFydGluZyBmcm9tIHRoZSBzYW1lIHBvaW50LlxyXG4gICAgICAgIC8vIEZpcnN0IHJlc2V0IHRoZSBzY2FsZSB0byAxXHJcbiAgICAgICAgdGhpcy5zY2FsaW5nLnNldEFsbCgxKTtcclxuICAgICAgICAvLyBUaGVuIGJhY2sgb3V0IHRoZSBvcmlnaW5hbCB2ZXJ0aWNlcyBjaGFuZ2VzIHRvIG1hdGNoIHRoZSBjb250ZW50IHNjYWxlXHJcbiAgICAgICAgaWYgKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCkge1xyXG4gICAgICAgICAgICB0aGlzLmJha2VUcmFuc2Zvcm1JbnRvVmVydGljZXModGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KTtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBtYXRyaXggc28gaXQgZG9lc24ndCBnZXQgYXBwbGllZCBhZ2FpbiB1bmxlc3Mgd2Ugc2NhbGVcclxuICAgICAgICAgICAgdGhpcy5faW52ZXJzZVNjYWxlTWF0cml4ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBzY2FsZSB0byBtYXRjaCBjb250ZW50LiAgTm90ZSB3ZSBjYW4ndCBqdXN0IHNjYWxlIHRoZSBtZXNoLCBiZWNhdXNlIHRoYXQgd2lsbCBzY2FsZSB0aGUgY29udGVudCBhcyB3ZWxsXHJcbiAgICAgICAgLy8gV2hhdCB3ZSBuZWVkIHRvIGRvIGlzIGNvbXB1dGUgYSBzY2FsZSBtYXRyaXggYW5kIHRoZW4gYmFrZSB0aGF0IGludG8gdGhlIG1lc2ggdmVydGljZXMuICBUaGlzIHdpbGwgbGVhdmUgdGhlXHJcbiAgICAgICAgLy8gbWVzaCBzY2FsZSBhdCAxLCBzbyBvdXIgY29udGVudCB3aWxsIHN0YXkgaXQncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IHVudGlsIHdlIHNjYWxlIHRoZSBtZXNoLlxyXG4gICAgICAgIGNvbnN0IHNjYWxlWCA9IHRoaXMuX3dpZHRoIHx8IDE7XHJcbiAgICAgICAgY29uc3Qgc2NhbGVZID0gdGhpcy5faGVpZ2h0IHx8IDE7XHJcbiAgICAgICAgY29uc3Qgc2NhbGVNYXRyaXggPSBNYXRyaXguU2NhbGluZyhzY2FsZVgsIHNjYWxlWSwgMSk7XHJcbiAgICAgICAgdGhpcy5iYWtlVHJhbnNmb3JtSW50b1ZlcnRpY2VzKHNjYWxlTWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gR2V0IGFuIGludmVyc2Ugb2YgdGhlIHNjYWxlIG1hdHJpeCB0aGF0IHdlIGNhbiB1c2UgdG8gYmFjayBvdXQgdGhlIHNjYWxlIGNoYW5nZXMgd2UgaGF2ZSBtYWRlIHNvXHJcbiAgICAgICAgLy8gd2UgZG9uJ3QgbXVsdGlwbHkgdGhlIHNjYWxlLlxyXG4gICAgICAgIHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcclxuICAgICAgICBzY2FsZU1hdHJpeC5pbnZlcnRUb1JlZih0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfY3JlYXRlTWFzaygpIHtcclxuICAgICAgICBjb25zdCB2ZXJ0ZXhEYXRhID0gQ3JlYXRlUGxhbmVWZXJ0ZXhEYXRhKHsgd2lkdGg6IDEsIGhlaWdodDogMSB9KTtcclxuICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGx5VG9NZXNoKHRoaXMpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29sbGlzaW9ucyA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlcHRoTWFzayA9IG5ldyBTdGFuZGFyZE1hdGVyaWFsKGAke3RoaXMuaWR9LW1hdGAsIHNjZW5lKTtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzQ2FudmFzT3ZlcmxheSkge1xyXG4gICAgICAgICAgICBkZXB0aE1hc2suYmFja0ZhY2VDdWxsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5kaXNhYmxlQ29sb3JXcml0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5kaXNhYmxlTGlnaHRpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGRlcHRoTWFzaztcclxuXHJcbiAgICAgICAgLy8gT3B0aW1pemF0aW9uIC0gRnJlZXplIG1hdGVyaWFsIHNpbmNlIGl0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZVxyXG4gICAgICAgIHRoaXMubWF0ZXJpYWwuZnJlZXplKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXRFbGVtZW50ekluZGV4KHpJbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS56SW5kZXggPSBgJHt6SW5kZXh9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAqL1xyXG4gICAgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSBkb20gY29udGVudCB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIFN1cHJlc3MgZXZlbnRzIG91dHNpZGUgb2YgdGhlIGRvbSBjb250ZW50XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHVzZWQgYnkgdGhlIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgdG8gcmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICovXHJcbiAgICByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHBvaW50ZXIgZXZlbnRzIG9uIGNhbnZhc1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIERpc2FibGUgcG9pbnRlciBldmVudHMgb24gZG9tIGNvbnRlbnRcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZUVsZW1lbnQoKSB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBCYWlsIGlmIHdlIGFyZW4ndCBydW5uaW5nIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5pZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuX2lzQ2FudmFzT3ZlcmxheSA/IFwidHJhbnNwYXJlbnRcIiA6IFwiIzAwMFwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS56SW5kZXggPSBcIjFcIjtcclxuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICBkaXYuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTWF0cml4LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aFwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IENhbWVyYSB9IGZyb20gXCJjb3JlL0NhbWVyYXMvY2FtZXJhXCI7XHJcbmltcG9ydCB0eXBlIHsgU3ViTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9zdWJNZXNoXCI7XHJcbmltcG9ydCB7IFJlbmRlcmluZ0dyb3VwIH0gZnJvbSBcImNvcmUvUmVuZGVyaW5nL3JlbmRlcmluZ0dyb3VwXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyIH0gZnJvbSBcImNvcmUvTWlzYy9vYnNlcnZhYmxlXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RFbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzXCI7XHJcblxyXG5jb25zdCBQb3NpdGlvblVwZGF0ZUZhaWxNZXNzYWdlID0gXCJGYWlsZWQgdG8gdXBkYXRlIGh0bWwgbWVzaCByZW5kZXJlciBwb3NpdGlvbiBkdWUgdG8gZmFpbHVyZSB0byBnZXQgY2FudmFzIHJlY3QuICBIdG1sTWVzaCBpbnN0YW5jZXMgbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5XCI7XHJcbmNvbnN0IEJhYnlsb25Vbml0c1RvUGl4ZWxzID0gMTAwO1xyXG5cclxuLyoqXHJcbiAqIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gc3VibWVzaGVzIGFuZCByZXR1cm5zIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2hcclxuICogc2hvdWxkIGJlIHJlbmRlcmVkIGZpcnN0LlxyXG4gKi9cclxudHlwZSBSZW5kZXJPcmRlckZ1bmN0aW9uID0gKHN1Yk1lc2hBOiBTdWJNZXNoLCBzdWJNZXNoQjogU3ViTWVzaCkgPT4gbnVtYmVyO1xyXG5cclxudHlwZSBSZW5kZXJMYXllckVsZW1lbnRzID0ge1xyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIGRvbUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgY2FtZXJhRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbn07XHJcblxyXG4vLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBlbnN1cmVzIHRoYXQgSHRtbE1lc2hlcyBhcmUgcmVuZGVyZWQgYmVmb3JlIGFsbCBvdGhlciBtZXNoZXMuXHJcbi8vIE5vdGUgdGhpcyB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBncm91cCAwLlxyXG4vLyBJZiBuZWl0aGVyIG1lc2ggaXMgYW4gSHRtbE1lc2gsIHRoZW4gdGhlIGRlZmF1bHQgcmVuZGVyIG9yZGVyIGlzIHVzZWRcclxuLy8gVGhpcyBwcmV2ZW50cyBIdG1sTWVzaGVzIGZyb20gYXBwZWFyaW5nIGluIGZyb250IG9mIG90aGVyIG1lc2hlcyB3aGVuIHRoZXkgYXJlIGJlaGluZCB0aGVtXHJcbmNvbnN0IFJlbmRlck9yZGVyRnVuYyA9IChkZWZhdWx0UmVuZGVyT3JkZXI6IFJlbmRlck9yZGVyRnVuY3Rpb24pOiBSZW5kZXJPcmRlckZ1bmN0aW9uID0+IHtcclxuICAgIHJldHVybiAoc3ViTWVzaEE6IFN1Yk1lc2gsIHN1Yk1lc2hCOiBTdWJNZXNoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWVzaEEgPSBzdWJNZXNoQS5nZXRNZXNoKCk7XHJcbiAgICAgICAgY29uc3QgbWVzaEIgPSBzdWJNZXNoQi5nZXRNZXNoKCk7XHJcblxyXG4gICAgICAgIC8vIFVzZSBwcm9wZXJ0eSBjaGVjayBpbnN0ZWFkIG9mIGluc3RhbmNlb2Ygc2luY2UgaXQgaXMgbGVzcyBleHBlbnNpdmUgYW5kXHJcbiAgICAgICAgLy8gdGhpcyB3aWxsIGJlIGNhbGxlZCBtYW55IHRpbWVzIHBlciBmcmFtZVxyXG4gICAgICAgIGNvbnN0IG1lc2hJc0h0bWxNZXNoQSA9IChtZXNoQSBhcyBhbnkpW1wiaXNIdG1sTWVzaFwiXTtcclxuICAgICAgICBjb25zdCBtZXNoSXNIdG1sTWVzaEIgPSAobWVzaEIgYXMgYW55KVtcImlzSHRtbE1lc2hcIl07XHJcbiAgICAgICAgaWYgKG1lc2hJc0h0bWxNZXNoQSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWVzaElzSHRtbE1lc2hCID8gKG1lc2hBLmFic29sdXRlUG9zaXRpb24ueiA8PSBtZXNoQi5hYnNvbHV0ZVBvc2l0aW9uLnogPyAxIDogLTEpIDogLTE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc2hJc0h0bWxNZXNoQiA/IDEgOiBkZWZhdWx0UmVuZGVyT3JkZXIoc3ViTWVzaEEsIHN1Yk1lc2hCKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgaXMgcmVxdWlyZWQgdG8gcmVuZGVyIEh0bWxNZXNoZXMgaW4gdGhlIHNjZW5lLlxyXG4gKiBpZiB1c2luZyBIdG1sTWVzaGVzLCB5b3UgbXVzdCBub3Qgc2V0IHJlbmRlciBvcmRlciBmb3IgZ3JvdXAgMCB1c2luZ1xyXG4gKiBzY2VuZS5zZXRSZW5kZXJpbmdPcmRlci4gIFlvdSBtdXN0IGluc3RlYWQgcGFzcyB0aGUgY29tcGFyZSBmdW5jdGlvbnNcclxuICogdG8gdGhlIEh0bWxNZXNoUmVuZGVyZXIgY29uc3RydWN0b3IuICBJZiB5b3UgZG8gbm90LCB0aGVuIHlvdXIgcmVuZGVyXHJcbiAqIG9yZGVyIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIEh0bWxNZXNoUmVuZGVyZXIgaXMgY3JlYXRlZCBhZnRlciBhbmRcclxuICogdGhlIEh0bWxNZXNoZXMgd2lsbCBub3QgcmVuZGVyIGNvcnJlY3RseSAodGhleSB3aWxsIGFwcGVhciBpbiBmcm9udCBvZlxyXG4gKiBtZXNoZXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gZnJvbnQgb2YgdGhlbSkgaWYgdGhlIEh0bWxNZXNoUmVuZGVyZXIgaXNcclxuICogY3JlYXRlZCBiZWZvcmUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSHRtbE1lc2hSZW5kZXJlciB7XHJcbiAgICBwcml2YXRlIF9jb250YWluZXJJZD86IHN0cmluZztcclxuICAgIHByaXZhdGUgX2luU2NlbmVFbGVtZW50cz86IFJlbmRlckxheWVyRWxlbWVudHMgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfb3ZlcmxheUVsZW1lbnRzPzogUmVuZGVyTGF5ZXJFbGVtZW50cyB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9lbmdpbmU6IEFic3RyYWN0RW5naW5lO1xyXG5cclxuICAgIHByaXZhdGUgX2NhY2hlID0ge1xyXG4gICAgICAgIGNhbWVyYURhdGE6IHsgZm92OiAwLCBwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSwgc3R5bGU6IFwiXCIgfSxcclxuICAgICAgICBodG1sTWVzaERhdGE6IG5ldyBXZWFrTWFwPG9iamVjdCwgeyBzdHlsZTogc3RyaW5nIH0+KCksXHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBfd2lkdGggPSAwO1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0ID0gMDtcclxuICAgIHByaXZhdGUgX2hlaWdodEhhbGYgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2NhbWVyYVdvcmxkTWF0cml4PzogTWF0cml4O1xyXG5cclxuICAgIC8vIENyZWF0ZSBzb21lIHJlZnMgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IG9iamVjdHMgZXZlcnkgZnJhbWVcclxuICAgIHByaXZhdGUgX3RlbXAgPSB7XHJcbiAgICAgICAgc2NhbGVUcmFuc2Zvcm06IG5ldyBWZWN0b3IzKCksXHJcbiAgICAgICAgcm90YXRpb25UcmFuc2Zvcm06IG5ldyBRdWF0ZXJuaW9uKCksXHJcbiAgICAgICAgcG9zaXRpb25UcmFuc2Zvcm06IG5ldyBWZWN0b3IzKCksXHJcbiAgICAgICAgb2JqZWN0TWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFXb3JsZE1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhUm90YXRpb25NYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVdvcmxkTWF0cml4QXNBcnJheTogbmV3IEFycmF5KDE2KSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gS2VlcCB0cmFjayBvZiBEUFIgc28gd2UgY2FuIHJlc2l6ZSBpZiBEUFIgY2hhbmdlc1xyXG4gICAgLy8gT3RoZXJ3aXNlIHRoZSBET00gY29udGVudCB3aWxsIHNjYWxlLCBidXQgdGhlIG1lc2ggd29uJ3RcclxuICAgIHByaXZhdGUgX2xhc3REZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcblxyXG4gICAgLy8gS2VlcCB0cmFjayBvZiBjYW1lcmEgbWF0cml4IGNoYW5nZXMgc28gd2Ugb25seSB1cGRhdGUgdGhlXHJcbiAgICAvLyBET00gZWxlbWVudCBzdHlsZXMgd2hlbiBuZWNlc3NhcnlcclxuICAgIHByaXZhdGUgX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgcG9zaXRpb24gY2hhbmdlcyBzbyB3ZSBvbmx5IHVwZGF0ZSB0aGUgRE9NIGVsZW1lbnRcclxuICAgIC8vIHN0eWxlcyB3aGVuIG5lY2Vzc2FyeVxyXG4gICAgcHJpdmF0ZSBfcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uID0ge1xyXG4gICAgICAgIHRvcDogMCxcclxuICAgICAgICBsZWZ0OiAwLFxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIF9yZW5kZXJPYnNlcnZlcjogT2JzZXJ2ZXI8U2NlbmU+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cnVjdCBhbiBpbnN0YW5jZSBvZiBIdG1sTWVzaFJlbmRlcmVyXHJcbiAgICAgKiBAcGFyYW0gc2NlbmVcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgcHJvcGVydGllczpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHNjZW5lOiBTY2VuZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lcklkID0gbnVsbCxcclxuICAgICAgICAgICAgX2NvbnRhaW5lcklkID0gXCJjc3MtY29udGFpbmVyXCIsXHJcbiAgICAgICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXIgPSB0cnVlLFxyXG4gICAgICAgICAgICBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5QYWludGVyU29ydENvbXBhcmUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlciA9IFJlbmRlcmluZ0dyb3VwLlBhaW50ZXJTb3J0Q29tcGFyZSxcclxuICAgICAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5kZWZhdWx0VHJhbnNwYXJlbnRTb3J0Q29tcGFyZSxcclxuICAgICAgICB9OiB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lcklkPzogc3RyaW5nIHwgbnVsbDtcclxuICAgICAgICAgICAgX2NvbnRhaW5lcklkPzogc3RyaW5nO1xyXG4gICAgICAgICAgICBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcj86IFJlbmRlck9yZGVyRnVuY3Rpb247XHJcbiAgICAgICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXI/OiBib29sZWFuO1xyXG4gICAgICAgIH0gPSB7fVxyXG4gICAgKSB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBPbmx5IGluaXQgaWYgd2UgYXJlIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb250YWluZXJJZCA9IF9jb250YWluZXJJZDtcclxuICAgICAgICB0aGlzLl9pbml0KHNjZW5lLCBwYXJlbnRDb250YWluZXJJZCwgZW5hYmxlT3ZlcmxheVJlbmRlciwgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyLCBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIsIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2Ugb2YgdGhlIEh0bWxNZXNoUmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlck9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlck9ic2VydmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLl9pblNjZW5lRWxlbWVudHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5pdChcclxuICAgICAgICBzY2VuZTogU2NlbmUsXHJcbiAgICAgICAgcGFyZW50Q29udGFpbmVySWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgZW5hYmxlT3ZlcmxheVJlbmRlcjogYm9vbGVhbixcclxuICAgICAgICBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXI6IFJlbmRlck9yZGVyRnVuY3Rpb24sXHJcbiAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uLFxyXG4gICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIE9ubHkgaW5pdCBpZiB3ZSBhcmUgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIERPTSBjb250YWluZXJzXHJcbiAgICAgICAgbGV0IHBhcmVudENvbnRhaW5lciA9IHBhcmVudENvbnRhaW5lcklkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyZW50Q29udGFpbmVySWQpIDogZG9jdW1lbnQuYm9keTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMsIHRoZW4gcmVtb3ZlIGl0XHJcbiAgICAgICAgY29uc3QgaW5TY2VuZUNvbnRhaW5lcklkID0gYCR7dGhpcy5fY29udGFpbmVySWR9X2luX3NjZW5lYDtcclxuICAgICAgICB0aGlzLl9pblNjZW5lRWxlbWVudHMgPSB0aGlzLl9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKGluU2NlbmVDb250YWluZXJJZCk7XHJcblxyXG4gICAgICAgIHBhcmVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5faW5TY2VuZUVsZW1lbnRzLmNvbnRhaW5lciwgcGFyZW50Q29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlT3ZlcmxheVJlbmRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBvdmVybGF5Q29udGFpbmVySWQgPSBgJHt0aGlzLl9jb250YWluZXJJZH1fb3ZlcmxheWA7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cyA9IHRoaXMuX2NyZWF0ZVJlbmRlckxheWVyRWxlbWVudHMob3ZlcmxheUNvbnRhaW5lcklkKTtcclxuICAgICAgICAgICAgY29uc3QgekluZGV4ID0gKyhzY2VuZS5nZXRFbmdpbmUoKS5nZXRSZW5kZXJpbmdDYW52YXMoKSEuc3R5bGUuekluZGV4ID8/IFwiMFwiKSArIDE7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gYCR7ekluZGV4fWA7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX292ZXJsYXlFbGVtZW50cy5jb250YWluZXIsIHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZW5naW5lID0gc2NlbmUuZ2V0RW5naW5lKCk7XHJcbiAgICAgICAgY29uc3QgY2xpZW50UmVjdCA9IHRoaXMuX2VuZ2luZS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKCFjbGllbnRSZWN0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBnZXQgY2xpZW50IHJlY3QgZm9yIHJlbmRlcmluZyBjYW52YXNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHNpemUgYW5kIHJlc2l6ZSBiZWhhdmlvclxyXG4gICAgICAgIHRoaXMuX3NldFNpemUoY2xpZW50UmVjdC53aWR0aCwgY2xpZW50UmVjdC5oZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbmdpbmUub25SZXNpemVPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBpZiAoY2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0U2l6ZShjbGllbnRSZWN0LndpZHRoLCBjbGllbnRSZWN0LmhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IHByb2plY3Rpb25PYnM6IE9ic2VydmVyPENhbWVyYT47XHJcbiAgICAgICAgbGV0IG1hdHJpeE9iczogT2JzZXJ2ZXI8Q2FtZXJhPjtcclxuXHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZUNhbWVyYSA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FtZXJhID0gc2NlbmUuYWN0aXZlQ2FtZXJhO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uT2JzID0gY2FtZXJhLm9uUHJvamVjdGlvbk1hdHJpeENoYW5nZWRPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DYW1lcmFNYXRyaXhDaGFuZ2VkKGNhbWVyYSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG1hdHJpeE9icyA9IGNhbWVyYS5vblZpZXdNYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FtZXJhTWF0cml4Q2hhbmdlZChjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBvYnNlcnZlQ2FtZXJhKCk7XHJcblxyXG4gICAgICAgIHNjZW5lLm9uQWN0aXZlQ2FtZXJhQ2hhbmdlZC5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocHJvamVjdGlvbk9icykge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuYWN0aXZlQ2FtZXJhPy5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5yZW1vdmUocHJvamVjdGlvbk9icyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1hdHJpeE9icykge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuYWN0aXZlQ2FtZXJhPy5vblZpZXdNYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5yZW1vdmUobWF0cml4T2JzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvYnNlcnZlQ2FtZXJhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgSHRtbE1lc2hlcyBhcmUgcmVuZGVyZWQgYmVmb3JlIGFsbCBvdGhlciBtZXNoZXNcclxuICAgICAgICAvLyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIGZyb250IG9mIG1lc2hlcyB0aGF0IGFyZSBhY3R1YWxseSBpbiBmcm9udCBvZiB0aGVtXHJcbiAgICAgICAgLy8gVXBkYXRpbmcgdGhlIHJlbmRlciBvcmRlciBpc24ndCBpZGVhbCwgYnV0IGl0IGlzIHRoZSBvbmx5IHdheSB0byBhY2hlaXZlIHRoaXNcclxuICAgICAgICAvLyBUaGUgaW1wbGljYXRpb24gaXMgdGhhdCBhbiBhcHAgdXNpbmcgdGhlIEh0bWxNZXNoUmVuZGVyZWQgbXVzdCBzZXQgdGhlIHNjZW5lIHJlbmRlciBvcmRlclxyXG4gICAgICAgIC8vIHZpYSB0aGUgSHRtbE1lc2hSZW5kZXJlZCBjb25zdHJ1Y3RvclxyXG4gICAgICAgIGNvbnN0IG9wYXF1ZVJlbmRlck9yZGVyID0gUmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgY29uc3QgYWxwaGFUZXN0UmVuZGVyT3JkZXIgPSBSZW5kZXJPcmRlckZ1bmMoZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyKTtcclxuICAgICAgICBjb25zdCB0cmFuc3BhcmVudFJlbmRlck9yZGVyID0gUmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuICAgICAgICBzY2VuZS5zZXRSZW5kZXJpbmdPcmRlcigwLCBvcGFxdWVSZW5kZXJPcmRlciwgYWxwaGFUZXN0UmVuZGVyT3JkZXIsIHRyYW5zcGFyZW50UmVuZGVyT3JkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlciA9IHNjZW5lLm9uQmVmb3JlUmVuZGVyT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoc2NlbmUsIHNjZW5lLmFjdGl2ZUNhbWVyYSBhcyBDYW1lcmEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZVJlbmRlckxheWVyRWxlbWVudHMoY29udGFpbmVySWQ6IHN0cmluZyk6IFJlbmRlckxheWVyRWxlbWVudHMge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBjb250YWluZXIuaWQgPSBjb250YWluZXJJZDtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBcIi0xXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRvbUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2Zvcm1TdHlsZSA9IFwicHJlc2VydmUtM2RcIjtcclxuICAgICAgICBjYW1lcmFFbGVtZW50LnN0eWxlLnRyYW5zZm9ybVN0eWxlID0gXCJwcmVzZXJ2ZS0zZFwiO1xyXG5cclxuICAgICAgICBjYW1lcmFFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuXHJcbiAgICAgICAgZG9tRWxlbWVudC5hcHBlbmRDaGlsZChjYW1lcmFFbGVtZW50KTtcclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZG9tRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY29udGFpbmVyLFxyXG4gICAgICAgICAgICBkb21FbGVtZW50LFxyXG4gICAgICAgICAgICBjYW1lcmFFbGVtZW50LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuX3dpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2hlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX2hlaWdodEhhbGYgPSB0aGlzLl9oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2luU2NlbmVFbGVtZW50cyB8fCAhdGhpcy5fb3ZlcmxheUVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gW3RoaXMuX2luU2NlbmVFbGVtZW50cy5kb21FbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHMuZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzLmNhbWVyYUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cy5jYW1lcmFFbGVtZW50XTtcclxuICAgICAgICBmb3IgKGNvbnN0IGRvbSBvZiBkb21FbGVtZW50cykge1xyXG4gICAgICAgICAgICBpZiAoZG9tKSB7XHJcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcclxuICAgIHByb3RlY3RlZCBfZ2V0Q2FtZXJhQ3NzTWF0cml4KG1hdHJpeDogTWF0cml4KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG1hdHJpeC5tO1xyXG4gICAgICAgIHJldHVybiBgbWF0cml4M2QoJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1sxXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1syXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1szXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s0XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzVdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzZdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzddIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzhdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbOV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzExXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1sxM10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE1XSApXHJcbiAgICAgICAgfSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnZlcnQgYSBCYWJ5bG9uIHdvcmxkIG1hdHJpeCB0byBhIENTUyBtYXRyaXhcclxuICAgIC8vIFRoaXMgYWxzbyBoYW5kbGVzIGNvbnZlcnNpb24gZnJvbSBCSlMgbGVmdCBoYW5kZWQgY29vcmRzXHJcbiAgICAvLyB0byBDU1MgcmlnaHQgaGFuZGVkIGNvb3Jkc1xyXG4gICAgLy8gcHJldHRpZXItaWdub3JlXHJcbiAgICBwcm90ZWN0ZWQgX2dldEh0bWxDb250ZW50Q3NzTWF0cml4KG1hdHJpeDogTWF0cml4LCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBtYXRyaXgubTtcclxuICAgICAgICAvLyBJbiBhIHJpZ2h0IGhhbmRlZCBjb29yZGluYXRlIHN5c3RlbSwgdGhlIGVsZW1lbnRzIDExIHRvIDE0IGhhdmUgdG8gY2hhbmdlIHRoZWlyIGRpcmVjdGlvblxyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID8gLTEgOiAxO1xyXG4gICAgICAgIGNvbnN0IG1hdHJpeDNkID0gYG1hdHJpeDNkKCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzJdICogLWRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1szXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNl0gICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbN10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOF0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzldICogLWRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTFdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEyXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxM10gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTRdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE1XSApXHJcbiAgICAgICAgfSlgO1xyXG4gICAgICAgIHJldHVybiBtYXRyaXgzZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldFRyYW5zZm9ybWF0aW9uTWF0cml4KGh0bWxNZXNoOiBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW06IGJvb2xlYW4pOiBNYXRyaXgge1xyXG4gICAgICAgIC8vIEdldCB0aGUgY2FtZXJhIHdvcmxkIG1hdHJpeFxyXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FtZXJhIHdvcmxkIG1hdHJpeCBpcyB1cCB0byBkYXRlXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCA9IGh0bWxNZXNoLmdldFNjZW5lKCkuYWN0aXZlQ2FtZXJhPy5nZXRXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRyaXguSWRlbnRpdHkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9iamVjdFdvcmxkTWF0cml4ID0gaHRtbE1lc2guZ2V0V29ybGRNYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLy8gU2NhbGUgdGhlIG9iamVjdCBtYXRyaXggYnkgdGhlIGJhc2Ugc2NhbGUgZmFjdG9yIGZvciB0aGUgbWVzaFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIHRoZSByYXRpbyBvZiB0aGUgbWVzaCB3aWR0aC9oZWlnaHQgdG8gdGhlIHJlbmRlcmVyXHJcbiAgICAgICAgLy8gd2lkdGgvaGVpZ2h0IGRpdmlkZWQgYnkgdGhlIGJhYnlsb24gdW5pdHMgdG8gcGl4ZWxzIHJhdGlvXHJcbiAgICAgICAgbGV0IHdpZHRoU2NhbGVGYWN0b3IgPSAxO1xyXG4gICAgICAgIGxldCBoZWlnaHRTY2FsZUZhY3RvciA9IDE7XHJcbiAgICAgICAgaWYgKGh0bWxNZXNoLnNvdXJjZVdpZHRoICYmIGh0bWxNZXNoLnNvdXJjZUhlaWdodCkge1xyXG4gICAgICAgICAgICB3aWR0aFNjYWxlRmFjdG9yID0gaHRtbE1lc2gud2lkdGghIC8gKGh0bWxNZXNoLnNvdXJjZVdpZHRoIC8gQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgICAgICBoZWlnaHRTY2FsZUZhY3RvciA9IGh0bWxNZXNoLmhlaWdodCEgLyAoaHRtbE1lc2guc291cmNlSGVpZ2h0IC8gQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIHNjYWxlIHRvIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXguICBOb3RlIHdlIGFyZW4ndCBzY2FsaW5nXHJcbiAgICAgICAgLy8gdGhlIG9iamVjdCwganVzdCBnZXR0aW5nIGEgbWF0cml4IGFzIHRob3VnaCBpdCB3ZXJlIHNjYWxlZCwgc28gd2UgY2FuXHJcbiAgICAgICAgLy8gc2NhbGUgdGhlIGNvbnRlbnRcclxuICAgICAgICBjb25zdCBzY2FsZVRyYW5zZm9ybSA9IHRoaXMuX3RlbXAuc2NhbGVUcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3Qgcm90YXRpb25UcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnJvdGF0aW9uVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5wb3NpdGlvblRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4ID0gdGhpcy5fdGVtcC5vYmplY3RNYXRyaXg7XHJcblxyXG4gICAgICAgIG9iamVjdFdvcmxkTWF0cml4LmRlY29tcG9zZShzY2FsZVRyYW5zZm9ybSwgcm90YXRpb25UcmFuc2Zvcm0sIHBvc2l0aW9uVHJhbnNmb3JtKTtcclxuICAgICAgICBzY2FsZVRyYW5zZm9ybS54ICo9IHdpZHRoU2NhbGVGYWN0b3I7XHJcbiAgICAgICAgc2NhbGVUcmFuc2Zvcm0ueSAqPSBoZWlnaHRTY2FsZUZhY3RvcjtcclxuXHJcbiAgICAgICAgTWF0cml4LkNvbXBvc2VUb1JlZihzY2FsZVRyYW5zZm9ybSwgcm90YXRpb25UcmFuc2Zvcm0sIHBvc2l0aW9uVHJhbnNmb3JtLCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IGRpcmVjdGlvbiBvZiAxMiBhbmQgMTMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBiYXNlZCBvbiB0aGUgaGFuZGVkbmVzcyBvZiB0aGUgc3lzdGVtXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAtMSA6IDE7XHJcbiAgICAgICAgLy8gQWRqdXN0IHRyYW5zbGF0aW9uIHZhbHVlcyB0byBiZSBmcm9tIGNhbWVyYSB2cyB3b3JsZCBvcmlnaW5cclxuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgYXJlIGFsc28gYWRqdXN0aW5nIHRoZXNlIHZhbHVlcyB0byBiZSBwaXhlbHMgdnMgQmFieWxvbiB1bml0c1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gaHRtbE1lc2guZ2V0QWJzb2x1dGVQb3NpdGlvbigpO1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXguc2V0Um93RnJvbUZsb2F0cyhcclxuICAgICAgICAgICAgMyxcclxuICAgICAgICAgICAgKC10aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzEyXSArIHBvc2l0aW9uLngpICogQmFieWxvblVuaXRzVG9QaXhlbHMgKiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICgtdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxM10gKyBwb3NpdGlvbi55KSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzICogZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAodGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxNF0gLSBwb3NpdGlvbi56KSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzLFxyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzE1XSAqIDAuMDAwMDEgKiBCYWJ5bG9uVW5pdHNUb1BpeGVsc1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBvdGhlciB2YWx1ZXMgdG8gYmUgcGl4ZWxzIHZzIEJhYnlsb24gdW5pdHNcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCgzLCBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoNywgQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDExLCBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcblxyXG4gICAgICAgIHJldHVybiBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcmVuZGVySHRtbE1lc2goaHRtbE1lc2g6IEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghaHRtbE1lc2guZWxlbWVudCB8fCAhaHRtbE1lc2guZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xyXG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIHJlbmRlciwgc28gYmFpbFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSBodG1sIG1lc2ggZGF0YSBpcyBpbml0aWFsaXplZCBiZWZvcmVcclxuICAgICAgICAvLyBjb21wdXRpbmcgdGhlIGJhc2Ugc2NhbGUgZmFjdG9yXHJcbiAgICAgICAgbGV0IGh0bWxNZXNoRGF0YSA9IHRoaXMuX2NhY2hlLmh0bWxNZXNoRGF0YS5nZXQoaHRtbE1lc2gpO1xyXG4gICAgICAgIGlmICghaHRtbE1lc2hEYXRhKSB7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoRGF0YSA9IHsgc3R5bGU6IFwiXCIgfTtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuaHRtbE1lc2hEYXRhLnNldChodG1sTWVzaCwgaHRtbE1lc2hEYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYUVsZW1lbnQgPSBodG1sTWVzaC5faXNDYW52YXNPdmVybGF5ID8gdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50IDogdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoaHRtbE1lc2guZWxlbWVudC5wYXJlbnROb2RlICE9PSBjYW1lcmFFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNhbWVyYUVsZW1lbnQhLmFwcGVuZENoaWxkKGh0bWxNZXNoLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGh0bWxNZXNoIGNvbnRlbnQgaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgYmFzZSBzY2FsZSBmYWN0b3JcclxuICAgICAgICBpZiAoaHRtbE1lc2gucmVxdWlyZXNVcGRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQmFzZVNjYWxlRmFjdG9yKGh0bWxNZXNoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZvciB0aGUgaHRtbCBtZXNoXHJcbiAgICAgICAgY29uc3Qgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCA9IHRoaXMuX2dldFRyYW5zZm9ybWF0aW9uTWF0cml4KGh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbSk7XHJcblxyXG4gICAgICAgIGxldCBzdHlsZSA9IGB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgJHt0aGlzLl9nZXRIdG1sQ29udGVudENzc01hdHJpeChzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4LCB1c2VSaWdodEhhbmRlZFN5c3RlbSl9YDtcclxuICAgICAgICAvLyBJbiBhIHJpZ2h0IGhhbmRlZCBzeXN0ZW0sIHNjcmVlbnMgYXJlIG9uIHRoZSB3cm9uZyBzaWRlIG9mIHRoZSBtZXNoLCBzbyB3ZSBoYXZlIHRvIHJvdGF0ZSBieSBNYXRoLlBJIHdoaWNoIHJlc3VsdHMgaW4gdGhlIG1hdHJpeDNkIHNlZW4gYmVsb3dcclxuICAgICAgICBzdHlsZSArPSBgJHt1c2VSaWdodEhhbmRlZFN5c3RlbSA/IFwibWF0cml4M2QoLTEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIC0xLCAwLCAwLCAwLCAwLCAxKVwiIDogXCJcIn1gO1xyXG5cclxuICAgICAgICBpZiAoaHRtbE1lc2hEYXRhLnN0eWxlICE9PSBzdHlsZSkge1xyXG4gICAgICAgICAgICBodG1sTWVzaC5lbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgICAgICBodG1sTWVzaC5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaHRtbE1lc2guX21hcmtBc1VwZGF0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlcihzY2VuZTogU2NlbmUsIGNhbWVyYTogQ2FtZXJhKSB7XHJcbiAgICAgICAgbGV0IG5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID0gc2NlbmUudXNlUmlnaHRIYW5kZWRTeXN0ZW07XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIHBvc2l0aW9uIGFuZCBzaXplIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRhaW5lclBvc2l0aW9uSWZOZWVkZWQoKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgY2FtZXJhIGNoYW5nZVxyXG4gICAgICAgIGlmICh0aGlzLl9jYW1lcmFNYXRyaXhVcGRhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGNhbWVyYSBwb3NpdGlvbiBoYXMgY2hhbmdlZCwgdGhlbiB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueCAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi54IHx8XHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi55ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnkgfHxcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnogIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24uelxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLmNvcHlGcm9tKGNhbWVyYS5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhIGRwciBjaGFuZ2VcclxuICAgICAgICBpZiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gIT09IHRoaXMuX2xhc3REZXZpY2VQaXhlbFJhdGlvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3REZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcbiAgICAgICAgICAgIExvZ2dlci5Mb2coXCJJbiByZW5kZXIgLSBkcHIgY2hhbmdlZDogXCIsIHRoaXMuX2xhc3REZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG1lc2hlcyBuZWVkIHRvIGJlIHVwZGF0ZWRcclxuICAgICAgICBjb25zdCBtZXNoZXNOZWVkaW5nVXBkYXRlID0gc2NlbmUubWVzaGVzLmZpbHRlcigobWVzaCkgPT4gKG1lc2ggYXMgYW55KVtcImlzSHRtbE1lc2hcIl0gJiYgKG5lZWRzVXBkYXRlIHx8IChtZXNoIGFzIEh0bWxNZXNoKS5yZXF1aXJlc1VwZGF0ZSkpO1xyXG4gICAgICAgIG5lZWRzVXBkYXRlID0gbmVlZHNVcGRhdGUgfHwgbWVzaGVzTmVlZGluZ1VwZGF0ZS5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBpZiAoIW5lZWRzVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBhIHByb2plY3Rpb24gbWF0cml4IGZvciB0aGUgY2FtZXJhXHJcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5nZXRQcm9qZWN0aW9uTWF0cml4KCk7XHJcbiAgICAgICAgY29uc3QgZm92ID0gcHJvamVjdGlvbk1hdHJpeC5tWzVdICogdGhpcy5faGVpZ2h0SGFsZjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuZm92ICE9PSBmb3YpIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gW3RoaXMuX292ZXJsYXlFbGVtZW50cz8uZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5kb21FbGVtZW50XTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5tb2RlID09IENhbWVyYS5QRVJTUEVDVElWRV9DQU1FUkEpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFBlcnNwZWN0aXZlID0gZm92ICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5wZXJzcGVjdGl2ZSA9IGZvdiArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRQZXJzcGVjdGl2ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnBlcnNwZWN0aXZlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5mb3YgPSBmb3Y7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIENTUyBtYXRyaXggZm9yIHRoZSBjYW1lcmEgKHdoaWNoIHdpbGwgaW5jbHVkZSBhbnkgY2FtZXJhIHJvdGF0aW9uKVxyXG4gICAgICAgIGlmIChjYW1lcmEucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNhbWVyYS5jb21wdXRlV29ybGRNYXRyaXgoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYU1hdHJpeFdvcmxkID0gdGhpcy5fdGVtcC5jYW1lcmFXb3JsZE1hdHJpeDtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5jb3B5RnJvbShjYW1lcmEuZ2V0V29ybGRNYXRyaXgoKSk7XHJcbiAgICAgICAgY29uc3QgY2FtZXJhUm90YXRpb25NYXRyaXggPSB0aGlzLl90ZW1wLmNhbWVyYVJvdGF0aW9uTWF0cml4O1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkLmdldFJvdGF0aW9uTWF0cml4KCkudHJhbnNwb3NlVG9SZWYoY2FtZXJhUm90YXRpb25NYXRyaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXkgPSB0aGlzLl90ZW1wLmNhbWVyYVdvcmxkTWF0cml4QXNBcnJheTtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5jb3B5VG9BcnJheShjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXkpO1xyXG5cclxuICAgICAgICAvLyBGb3IgYSBmZXcgdmFsdWVzLCB3ZSBoYXZlIHRvIGFkanVzdCB0aGUgZGlyZWN0aW9uIGJhc2VkIG9uIHRoZSBoYW5kZWRuZXNzIG9mIHRoZSBzeXN0ZW1cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzFdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVsxXTtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbMl0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzJdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs0XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bNF0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzZdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs2XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbOF0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzhdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs5XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bOV0gKiBkaXJlY3Rpb247XHJcblxyXG4gICAgICAgIE1hdHJpeC5Gcm9tQXJyYXlUb1JlZihjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXksIDAsIGNhbWVyYU1hdHJpeFdvcmxkKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhQ1NTTWF0cml4ID0gdGhpcy5fZ2V0Q2FtZXJhQ3NzTWF0cml4KGNhbWVyYU1hdHJpeFdvcmxkKTtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IGNhbWVyYUNTU01hdHJpeDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuc3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNhbWVyYUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY2FtZXJhRWxlbWVudF07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnN0eWxlID0gc3R5bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBfUmVuZGVyIG9iamVjdHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgZm9yIChjb25zdCBtZXNoIG9mIG1lc2hlc05lZWRpbmdVcGRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVySHRtbE1lc2gobWVzaCBhcyBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUJhc2VTY2FsZUZhY3RvcihodG1sTWVzaDogSHRtbE1lc2gpIHtcclxuICAgICAgICAvLyBHZXQgc2NyZWVuIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAgICBsZXQgc2NyZWVuV2lkdGggPSB0aGlzLl93aWR0aDtcclxuICAgICAgICBsZXQgc2NyZWVuSGVpZ2h0ID0gdGhpcy5faGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgYXNwZWN0IHJhdGlvc1xyXG4gICAgICAgIGNvbnN0IGh0bWxNZXNoQXNwZWN0UmF0aW8gPSAoaHRtbE1lc2gud2lkdGggfHwgMSkgLyAoaHRtbE1lc2guaGVpZ2h0IHx8IDEpO1xyXG4gICAgICAgIGNvbnN0IHNjcmVlbkFzcGVjdFJhdGlvID0gc2NyZWVuV2lkdGggLyBzY3JlZW5IZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBzY3JlZW4gZGltZW5zaW9ucyBiYXNlZCBvbiBhc3BlY3QgcmF0aW9zXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoQXNwZWN0UmF0aW8gPiBzY3JlZW5Bc3BlY3RSYXRpbykge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgSFRNTCBtZXNoIGlzIHdpZGVyIHJlbGF0aXZlIHRvIGl0cyBoZWlnaHQgdGhhbiB0aGUgc2NyZWVuLCBhZGp1c3QgdGhlIHNjcmVlbiB3aWR0aFxyXG4gICAgICAgICAgICBzY3JlZW5XaWR0aCA9IHNjcmVlbkhlaWdodCAqIGh0bWxNZXNoQXNwZWN0UmF0aW87XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIEhUTUwgbWVzaCBpcyB0YWxsZXIgcmVsYXRpdmUgdG8gaXRzIHdpZHRoIHRoYW4gdGhlIHNjcmVlbiwgYWRqdXN0IHRoZSBzY3JlZW4gaGVpZ2h0XHJcbiAgICAgICAgICAgIHNjcmVlbkhlaWdodCA9IHNjcmVlbldpZHRoIC8gaHRtbE1lc2hBc3BlY3RSYXRpbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBjb250ZW50IHRvIGZpbGwgc2NyZWVuIHNvIHdlIGdldCBtYXggcmVzb2x1dGlvbiB3aGVuIGl0IGlzIHNocnVuayB0byBmaXQgdGhlIG1lc2hcclxuICAgICAgICBodG1sTWVzaC5zZXRDb250ZW50U2l6ZVB4KHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlQ29udGFpbmVyUG9zaXRpb25JZk5lZWRlZCgpIHtcclxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNhbnZhcyBoYXMgbW92ZWQgb24gdGhlIHNjcmVlblxyXG4gICAgICAgIGNvbnN0IGNhbnZhc1JlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAvLyBjYW52YXMgcmVjdCBtYXkgYmUgbnVsbCBpZiBsYXlvdXQgbm90IGNvbXBsZXRlXHJcbiAgICAgICAgaWYgKCFjYW52YXNSZWN0KSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5XYXJuKFBvc2l0aW9uVXBkYXRlRmFpbE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB3aW5kb3cuc2Nyb2xsWDtcclxuICAgICAgICBjb25zdCBjYW52YXNEb2N1bWVudFRvcCA9IGNhbnZhc1JlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0RvY3VtZW50TGVmdCA9IGNhbnZhc1JlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24udG9wICE9PSBjYW52YXNEb2N1bWVudFRvcCB8fCB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24ubGVmdCAhPT0gY2FudmFzRG9jdW1lbnRMZWZ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi50b3AgPSBjYW52YXNEb2N1bWVudFRvcDtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLmxlZnQgPSBjYW52YXNEb2N1bWVudExlZnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIsIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY29udGFpbmVyXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0b3AgYW5kIGxlZnQgb2YgdGhlIGNzcyBjb250YWluZXIgdG8gbWF0Y2ggdGhlIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUGFyZW50ID0gY29udGFpbmVyLm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBjb250YWluZXJQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREb2N1bWVudFRvcCA9IHBhcmVudFJlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RG9jdW1lbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nID0gdGhpcy5fZ2V0QW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyhjb250YWluZXJQYXJlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9keSBtYXJnaW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keU1hcmdpblRvcCA9IHBhcnNlSW50KGJvZHlTdHlsZS5tYXJnaW5Ub3AsIDEwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlNYXJnaW5MZWZ0ID0gcGFyc2VJbnQoYm9keVN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7Y2FudmFzRG9jdW1lbnRUb3AgLSBwYXJlbnREb2N1bWVudFRvcCAtIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcubWFyZ2luVG9wICsgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZy5wYWRkaW5nVG9wICsgYm9keU1hcmdpblRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGAke1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc0RvY3VtZW50TGVmdCAtIHBhcmVudERvY3VtZW50TGVmdCAtIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcubWFyZ2luTGVmdCArIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcucGFkZGluZ0xlZnQgKyBib2R5TWFyZ2luTGVmdFxyXG4gICAgICAgICAgICAgICAgfXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX29uQ2FtZXJhTWF0cml4Q2hhbmdlZCA9IChjYW1lcmE6IENhbWVyYSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4ID0gY2FtZXJhLmdldFdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgdGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCA9IHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgX2Vwc2lsb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmFicyh2YWx1ZSkgPCAxZS0xMCA/IDAgOiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgdG90YWwgbWFyZ2lucyBhbmQgcGFkZGluZyBmb3IgYW4gZWxlbWVudCwgZXhjbHVkaW5nIHRoZSBib2R5IGFuZCBkb2N1bWVudCBtYXJnaW5zXHJcbiAgICBwcml2YXRlIF9nZXRBbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgbGV0IG1hcmdpblRvcCA9IDA7XHJcbiAgICAgICAgbGV0IG1hcmdpbkxlZnQgPSAwO1xyXG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gMDtcclxuICAgICAgICBsZXQgcGFkZGluZ0xlZnQgPSAwO1xyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBtYXJnaW5Ub3AgKz0gcGFyc2VJbnQoc3R5bGUubWFyZ2luVG9wLCAxMCk7XHJcbiAgICAgICAgICAgIG1hcmdpbkxlZnQgKz0gcGFyc2VJbnQoc3R5bGUubWFyZ2luTGVmdCwgMTApO1xyXG4gICAgICAgICAgICBwYWRkaW5nVG9wICs9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKTtcclxuICAgICAgICAgICAgcGFkZGluZ0xlZnQgKz0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKTtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgbWFyZ2luVG9wLCBtYXJnaW5MZWZ0LCBwYWRkaW5nVG9wLCBwYWRkaW5nTGVmdCB9O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEh0bWxNZXNoUmVuZGVyZXIgfSBmcm9tIFwiLi9odG1sTWVzaFJlbmRlcmVyXCI7XHJcbmltcG9ydCB7IEh0bWxNZXNoIH0gZnJvbSBcIi4vaHRtbE1lc2hcIjtcclxuaW1wb3J0IHsgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuaW1wb3J0IHsgRml0U3RyYXRlZ3kgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5cclxuLy8gRXhwb3J0IHB1YmxpYyBjbGFzc2VzIGFuZCBmdW5jdGlvbnNcclxuZXhwb3J0IHsgSHRtbE1lc2hSZW5kZXJlciwgSHRtbE1lc2gsIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IsIEZpdFN0cmF0ZWd5IH07XHJcbiIsImltcG9ydCB7IFRvb2xzIH0gZnJvbSBcImNvcmUvTWlzYy90b29sc1wiO1xyXG5cclxuLy8gQSBjYXB0dXJlIG1hbmFnZW1lbnQgc3lzdGVtIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IG9iamVjdCBoYXMgdGhlIHBvaW50ZXJcclxuLy8gZXZlbnRzIGJ5IGVsaW1pbmF0aW5nIHJhY2UgY29uZGl0aW9ucyB0aGF0IGNhbiBjYXVzZSB0aGUgcG9pbnRlciBldmVudHMgdG8gYmVcclxuLy8gcmVsZWFzZWQgYnkgYSBkaWZmZXJlbnQgb2JqZWN0IGFmdGVyIHRoZXkgYXJlIGNhcHR1cmVkIGxlYXZpbmcgbm8gb2JqZWN0XHJcbi8vIGFzIHRoZSBvd25lci4gIEl0IGRvZXMgdGhpcyBieSBxdWV1ZWluZyByZXF1ZXN0cyBhbmQgb25seSBhbGxvd2luZ1xyXG4vLyBjYXB0dXJlIHdoZW4gdGhlIGN1cnJlbnQgY2FwdHVyZSBvd25lciByZWxlYXNlcyBwb2ludGVyIGV2ZW50cy5cclxuXHJcbnR5cGUgQ2FwdHVyZVJlbGVhc2VDYWxsYmFjayA9ICgpID0+IHZvaWQ7XHJcblxyXG50eXBlIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2tzID0ge1xyXG4gICAgY2FwdHVyZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaztcclxuICAgIHJlbGVhc2U6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2s7XHJcbn07XHJcblxyXG5sZXQgQ2FwdHVyZVJlcXVlc3RRdWV1ZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbi8vIEtleSBpcyByZXF1ZXN0IGlkLCB2YWx1ZSBpcyBvYmplY3Qgd2l0aCBjYXB0dXJlIGFuZCByZWxlYXNlIGNhbGxiYWNrc1xyXG5jb25zdCBQZW5kaW5nUmVxdWVzdENhbGxiYWNrczogTWFwPHN0cmluZywgQ2FwdHVyZVJlbGVhc2VDYWxsYmFja3M+ID0gbmV3IE1hcCgpO1xyXG5cclxuLy8gS2VlcCB0cmFjayBvZiByZWxlYXNlIHJlcXVlc3RzIHdpdGggbm8gbWF0Y2hpbmcgY2FwdHVyZSByZXF1ZXN0XHJcbi8vIGluIGNhc2UgdGhlIHJlbGVhc2UgcmVxdWVzdCBhcnJpdmVkIGJlZm9yZSB0aGUgY2FwdHVyZSB0byBhdm9pZFxyXG4vLyB0aGUgY2FwdHVyZSByZXF1ZXN0IG5ldmVyIGdldHRpbmcgcmVsZWFzZWQuXHJcbmxldCBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5sZXQgQ3VycmVudE93bmVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gQ2FsbGVkIG9uIGZpcnN0IGNhcHR1cmUgb3IgcmVsZWFzZSByZXF1ZXN0XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBpZCBvZiB0aGUgb2JqZWN0IGN1cnJlbnRseSBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICogQHJldHVybnMgVGhlIGlkIG9mIHRoZSBvYmplY3QgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKiBvciBudWxsIGlmIG5vIG9iamVjdCBpcyBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IGdldENhcHR1cmluZ0lkID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIEN1cnJlbnRPd25lcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXF1ZXN0IHRoYXQgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzLiAgSWYgdGhlcmUgaXMgbm8gY3VycmVudFxyXG4gKiBvd25lciwgdGhlbiB0aGUgcmVxdWVzdCBpcyBncmFudGVkIGltbWVkaWF0ZWx5LiAgSWYgdGhlcmUgaXMgYSBjdXJyZW50IG93bmVyLCB0aGVuIHRoZSByZXF1ZXN0XHJcbiAqIGlzIHF1ZXVlZCB1bnRpbCB0aGUgY3VycmVudCBvd25lciByZWxlYXNlcyBwb2ludGVyIGV2ZW50cy5cclxuICogQHBhcmFtIHJlcXVlc3RJZCBBbiBpZCB0byBpZGVudGlmeSB0aGUgcmVxdWVzdC4gIFRoaXMgaWQgd2lsbCBiZSB1c2VkIHRvIG1hdGNoIHRoZSBjYXB0dXJlXHJcbiAqIHJlcXVlc3Qgd2l0aCB0aGUgcmVsZWFzZSByZXF1ZXN0LlxyXG4gKiBAcGFyYW0gY2FwdHVyZUNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgZ3JhbnRlZCBhbmQgdGhlIG9iamVjdCBpcyBjYXB0dXJpbmdcclxuICogQHBhcmFtIHJlbGVhc2VDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgcmVxdWVzdENhcHR1cmUgPSAocmVxdWVzdElkOiBzdHJpbmcsIGNhcHR1cmVDYWxsYmFjazogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaywgcmVsZWFzZUNhbGxiYWNrOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdENhcHR1cmUgLSBQb2ludGVyIGV2ZW50cyBjYXB0dXJlIHJlcXVlc3RlZCBmb3IgJHtyZXF1ZXN0SWR9YCk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSByZWxlYXNlIGZvciB0aGlzIHJlcXVlc3QsIHRoZW4gaWdub3JlIHRoZSByZXF1ZXN0XHJcbiAgICBpZiAoUmVtb3ZlVW5tYXRjaGVkUmVxdWVzdChyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RDYXB0dXJlIC0gQ2FwdHVyZSByZXF1ZXN0IG1hdGNoZWQgcHJldmlvdXMgcmVsZWFzZSByZXF1ZXN0ICR7cmVxdWVzdElkfS4gIENhbmNlbGxpbmcgY2FwdHVyZSByZXF1ZXN0YCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0SWQgIT09IEN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgYWRkIGl0IHRvIHRoZSBxdWV1ZVxyXG4gICAgICAgIEVucXVldWVDYXB0dXJlUmVxdWVzdChyZXF1ZXN0SWQsIGNhcHR1cmVDYWxsYmFjaywgcmVsZWFzZUNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgb3duZXIsIGdvIGFoZWFkIGFuZCBncmFudCB0aGUgcmVxdWVzdFxyXG4gICAgICAgIFRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCgpO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgdGhlIHJlcXVlc3QgaWQgaXMgdGhlIGN1cnJlbnQgb3duZXIsIGRvIG5vdGhpbmdcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZWxlYXNlIHBvaW50ZXIgZXZlbnRzIGZyb20gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4gIElmIHRoZSBvYmplY3QgaXMgdGhlIGN1cnJlbnQgb3duZXJcclxuICogdGhlbiBwb2ludGVyIGV2ZW50cyBhcmUgcmVsZWFzZWQgaW1tZWRpYXRlbHkuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCB0aGUgY3VycmVudCBvd25lciwgdGhlbiB0aGVcclxuICogYXNzb2NpYXRlZCBjYXB0dXJlIHJlcXVlc3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4gIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdFxyXG4gKiBpbiB0aGUgcXVldWUsIHRoZW4gdGhlIHJlbGVhc2UgcmVxdWVzdCBpcyBhZGRlZCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkIHJlbGVhc2UgcmVxdWVzdHMgYW5kIHdpbGxcclxuICogbmVnYXRlIHRoZSBuZXh0IGNhcHR1cmUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkLiAgVGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHRoZSBwb3NzaWJpbGl0eSB0aGF0XHJcbiAqIHRoZSByZWxlYXNlIHJlcXVlc3QgYXJyaXZlZCBiZWZvcmUgdGhlIGNhcHR1cmUgcmVxdWVzdC5cclxuICogQHBhcmFtIHJlcXVlc3RJZCBUaGUgaWQgd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSBpZCBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0XHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0UmVsZWFzZSA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0UmVsZWFzZSAtIFBvaW50ZXIgZXZlbnRzIHJlbGVhc2UgcmVxdWVzdGVkIGZvciAke3JlcXVlc3RJZH1gKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcmVxdWVzdElkIGlzIHRoZSBjdXJyZW50IGNhcHR1cmUgaG9sZGVyIHJlbGVhc2UgaXRcclxuICAgIGlmICghcmVxdWVzdElkIHx8IHJlcXVlc3RJZCA9PT0gQ3VycmVudE93bmVyKSB7XHJcbiAgICAgICAgVHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwKCk7XHJcbiAgICB9IGVsc2UgaWYgKENhbmNlbFJlcXVlc3QocmVxdWVzdElkKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIGluIHRoZSBxdWV1ZSwgYnV0IG5vdCB0aGUgY3VycmVudCBjYXB0dXJlIGhvbGRlciwgcmVtb3ZlIGl0IGFuZCBpdCdzIGNhbGxiYWNrc1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmRlbGV0ZShyZXF1ZXN0SWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdFJlbGVhc2UgLSBSZWNlaXZlZCByZWxlYXNlIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IGJ1dCBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkYCk7XHJcbiAgICAgICAgLy8gcmVxdWVzdCB3YXMgbm90IGN1cnJlbnQgYW5kIG5vdCBpbiBxdWV1ZSwgbGlrZWx5IGJlY2F1c2Ugd2UgcmVjZWl2ZWQgYSByZWxlYXNlXHJcbiAgICAgICAgLy8gcmVxdWVzdCBiZWZvcmUgdGhlIGNhcHR1cmUuICBBZGQgaXQgdG8gdGhlIHVubWF0Y2hlZCBsaXN0IHRvIGd1YXJkIGFnYWluc3QgdGhpcyBwb3NzaWJpbGl0eVxyXG4gICAgICAgIGlmICghVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLmluY2x1ZGVzKHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAgICAgVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogUmVsZWFzZSBwb2ludGVyIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG93bmVyXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCByZWxlYXNlQ3VycmVudCA9ICgpID0+IHtcclxuICAgIHJlcXVlc3RSZWxlYXNlKEN1cnJlbnRPd25lcik7XHJcbn07XHJcblxyXG5jb25zdCBFbnF1ZXVlQ2FwdHVyZVJlcXVlc3QgPSAocmVxdWVzdElkOiBzdHJpbmcsIGNhcHR1cmU6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2ssIHJlbGVhc2U6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2spID0+IHtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5lbnF1ZXVlQ2FwdHVyZVJlcXVlc3QgLSBFbnF1ZXVlaW5nIGNhcHR1cmUgcmVxdWVzdCBmb3IgICR7cmVxdWVzdElkfWApO1xyXG4gICAgaWYgKCFDYXB0dXJlUmVxdWVzdFF1ZXVlLmluY2x1ZGVzKHJlcXVlc3RJZCkpIHtcclxuICAgICAgICBDYXB0dXJlUmVxdWVzdFF1ZXVlLnB1c2gocmVxdWVzdElkKTtcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5zZXQocmVxdWVzdElkLCB7IGNhcHR1cmUsIHJlbGVhc2UgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBSZW1vdmVzIHRoZSByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlIGlmIGl0IGV4aXN0cy4gIFJldHVybnMgdHJ1ZVxyXG4vLyBpZiB0aGUgcmVxdWVzdCB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIG90aGVyd2lzZSBmYWxzZVxyXG5jb25zdCBDYW5jZWxSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIENhcHR1cmVSZXF1ZXN0UXVldWUgPSBDYXB0dXJlUmVxdWVzdFF1ZXVlLmZpbHRlcigoaWQpID0+IHtcclxuICAgICAgICBpZiAoaWQgIT09IHJlcXVlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmNhbmNlbFJlcXVlc3QgLSBDYW5jZWxpbmcgcG9pbnRlciBldmVudHMgY2FwdHVyZSByZXF1ZXN0ICR7cmVxdWVzdElkfWApO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVtb3ZlZDtcclxufTtcclxuXHJcbmNvbnN0IFJlbW92ZVVubWF0Y2hlZFJlcXVlc3QgPSAocmVxdWVzdElkOiBzdHJpbmcpID0+IHtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMgPSBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMuZmlsdGVyKChpZCkgPT4ge1xyXG4gICAgICAgIGlmIChpZCAhPT0gcmVxdWVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVtb3ZlZDtcclxufTtcclxuXHJcbmNvbnN0IFRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCA9ICgpID0+IHtcclxuICAgIGNvbnN0IG5ld093bmVySWQgPSBOZXh0Q2FwdHVyZVJlcXVlc3QoKTtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS50cmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAgLSBUcmFuc2ZlcnJyaW5nIHBvaW50ZXIgZXZlbnRzIGZyb20gJHtDdXJyZW50T3duZXJ9IHRvICR7bmV3T3duZXJJZH1gKTtcclxuICAgIC8vIFJlbGVhc2UgdGhlIGN1cnJlbnQgb3duZXJcclxuICAgIERvUmVsZWFzZSgpO1xyXG4gICAgaWYgKG5ld093bmVySWQpIHtcclxuICAgICAgICBEb0NhcHR1cmUobmV3T3duZXJJZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBEb1JlbGVhc2UgPSAoKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZG9SZWxlYXNlIC0gUmVsZWFzaW5nIHBvaW50ZXIgZXZlbnRzIGZyb20gJHtDdXJyZW50T3duZXJ9YCk7XHJcbiAgICBpZiAoQ3VycmVudE93bmVyKSB7XHJcbiAgICAgICAgLy8gY2FsbCB0aGUgcmVsZWFzZSBjYWxsYmFja1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmdldChDdXJyZW50T3duZXIpPy5yZWxlYXNlKCk7XHJcbiAgICAgICAgLy8gQW5kIHJlbW92ZSB0aGUgY2FsbGJhY2tzXHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZGVsZXRlKEN1cnJlbnRPd25lcik7XHJcbiAgICAgICAgQ3VycmVudE93bmVyID0gbnVsbDtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IERvQ2FwdHVyZSA9IChuZXdPd25lcklkOiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChuZXdPd25lcklkKSB7XHJcbiAgICAgICAgLy8gY2FsbCB0aGUgY2FwdHVyZSBjYWxsYmFja1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmdldChuZXdPd25lcklkKT8uY2FwdHVyZSgpO1xyXG4gICAgfVxyXG4gICAgQ3VycmVudE93bmVyID0gbmV3T3duZXJJZDtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5kb0NhcHR1cmUgLSBQb2ludGVyIGV2ZW50cyBub3cgY2FwdHVyZWQgYnkgJHtuZXdPd25lcklkfWApO1xyXG59O1xyXG5cclxuY29uc3QgTmV4dENhcHR1cmVSZXF1ZXN0ID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIENhcHR1cmVSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCA/IENhcHR1cmVSZXF1ZXN0UXVldWUuc2hpZnQoKSA6IG51bGw7XHJcbn07XHJcblxyXG4vLyAjcmVnaW9uIERlYnVnZ2luZyBzdXBwb3J0XHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgICAgICBcInBvaW50ZXItZXZlbnRzLWNhcHR1cmUtZGVidWdcIjogYm9vbGVhbiB8IG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IERlYnVnTG9nID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xyXG4gICAgLy8gSWYgd2UgYXJlIHJ1bm5uaW5nIGluIGEgdGVzdCBydW5uZXIgKGluIG5vZGUsIHNvIHdpbmRvdyBpcyBub3QgZGVmaW5lZClcclxuICAgIC8vIG9yIGlmIHRoZSBkZWJ1ZyBmbGFnIGlzIHNldCwgdGhlbiBsb2cgdGhlIG1lc3NhZ2VcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8IHdpbmRvd1tcInBvaW50ZXItZXZlbnRzLWNhcHR1cmUtZGVidWdcIl0pIHtcclxuICAgICAgICBUb29scy5Mb2coXHJcbiAgICAgICAgICAgIGAke3BlcmZvcm1hbmNlLm5vdygpfSAtIGdhbWUuc2NlbmUucG9pbnRlckV2ZW50cyAtICR7bWVzc2FnZX1cXG5jdXJyZW50T3duZXI6ICR7Q3VycmVudE93bmVyfVxcbnF1ZXVlOiAke0NhcHR1cmVSZXF1ZXN0UXVldWV9XFxudW5tYXRjaGVkOiAke1VubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0c31gXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufTtcclxuLy8gI2VuZHJlZ2lvbiBEZWJ1Z2dpbmcgc3VwcG9ydFxyXG4iLCJpbXBvcnQgdHlwZSB7IEFic3RyYWN0TWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9hYnN0cmFjdE1lc2hcIjtcclxuaW1wb3J0IHR5cGUgeyBCZWhhdmlvciB9IGZyb20gXCJjb3JlL0JlaGF2aW9ycy9iZWhhdmlvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcImNvcmUvTWlzYy9sb2dnZXJcIjtcclxuaW1wb3J0IHsgcmVxdWVzdENhcHR1cmUsIHJlcXVlc3RSZWxlYXNlLCByZWxlYXNlQ3VycmVudCwgZ2V0Q2FwdHVyaW5nSWQgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZVwiO1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIHZhcmlhYmxlIGZvciBob2xkaW5nIHRoZSBjdXJyZW50IHNjZW5lXHJcbmxldCBMb2NhbFNjZW5lOiBTY2VuZSB8IG51bGwgPSBudWxsO1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNvdW50IG9mIGJlaGF2aW9yIGluc3RhbmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbi8vIG9uIGVudHJ5LiAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IG9yIHN0b3Agb2JzZXJ2aW5nIHBvaW50ZXIgbW92ZW1lbnQuXHJcbmxldCBDYXB0dXJlT25FbnRlckNvdW50ID0gMDtcclxuXHJcbi8vIE1hcCB1c2VkIHRvIHN0b3JlIGluc3RhbmNlIG9mIHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGZvciBhIG1lc2hcclxuLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoaXMgZ2V0cyBjaGVja2VkIG9uIHBvaW50ZXIgbW92ZSBhbmQgd2UgZG9uJ3Qgd2FudCB0b1xyXG4vLyB1c2UgZ2V0QmVoYXZpb3JCeU5hbWUoKSBiZWNhdXNlIHRoYXQgaXMgYSBsaW5lYXIgc2VhcmNoXHJcbmNvbnN0IE1lc2hUb0JlaGF2aW9yTWFwID0gbmV3IFdlYWtNYXA8QWJzdHJhY3RNZXNoLCBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yPigpO1xyXG5cclxuY29uc3QgU3RhcnRDYXB0dXJlT25FbnRlciA9IChzY2VuZTogU2NlbmUpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyLCBkbyBub3RoaW5nXHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKENhcHR1cmVPbkVudGVyQ291bnQgPT09IDApIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgTG9jYWxTY2VuZSA9IExvY2FsU2NlbmUgPz8gc2NlbmU7XHJcbiAgICAgICAgTG9nZ2VyLkxvZyhcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3I6IFN0YXJ0aW5nIG9ic2VydmF0aW9uIG9mIHBvaW50ZXIgbW92ZSBldmVudHMuXCIpO1xyXG4gICAgICAgIExvY2FsU2NlbmUub25EaXNwb3NlT2JzZXJ2YWJsZS5hZGQoRG9TdG9wQ2FwdHVyZU9uRW50ZXIpO1xyXG4gICAgfVxyXG4gICAgQ2FwdHVyZU9uRW50ZXJDb3VudCsrO1xyXG59O1xyXG5cclxuY29uc3QgRG9TdG9wQ2FwdHVyZU9uRW50ZXIgPSAoKSA9PiB7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBPblBvaW50ZXJNb3ZlKTtcclxuICAgIExvY2FsU2NlbmUgPSBudWxsO1xyXG4gICAgTG9nZ2VyLkxvZyhcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3I6IFN0b3BwaW5nIG9ic2VydmF0aW9uIG9mIHBvaW50ZXIgbW92ZSBldmVudHMuXCIpO1xyXG4gICAgQ2FwdHVyZU9uRW50ZXJDb3VudCA9IDA7XHJcbn07XHJcblxyXG5jb25zdCBTdG9wQ2FwdHVyZU9uRW50ZXIgPSAoKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlciwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IG9ic2VydmluZyBwb2ludGVyIG1vdmVtZW50LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoIUxvY2FsU2NlbmUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgQ2FwdHVyZU9uRW50ZXJDb3VudC0tO1xyXG4gICAgaWYgKENhcHR1cmVPbkVudGVyQ291bnQgPD0gMCkge1xyXG4gICAgICAgIERvU3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBNb2R1bGUgbGV2ZWwgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gZW50ZXJlZCBtZXNoIHNob3VsZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbmNvbnN0IE9uUG9pbnRlck1vdmUgPSAoZXZ0OiBQb2ludGVyRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XHJcbiAgICBpZiAoIUxvY2FsU2NlbmUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FudmFzUmVjdCA9IExvY2FsU2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgaWYgKCFjYW52YXNSZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNsaWVudCBYIGFuZCBZIGZyb20gZWl0aGVyIHRoZSBwb2ludGVyIGV2ZW50IG9yIGZyb20gdGhlXHJcbiAgICAvLyBUb3VjaEV2ZW50IHRvdWNoXHJcbiAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IFwidG91Y2hlc1wiIGluIGV2dCA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xyXG5cclxuICAgIC8vIGdldCB0aGUgcGlja2VkIG1lc2gsIGlmIGFueVxyXG4gICAgY29uc3QgcG9pbnRlclNjcmVlblggPSBjbGllbnRYIC0gY2FudmFzUmVjdC5sZWZ0O1xyXG4gICAgY29uc3QgcG9pbnRlclNjcmVlblkgPSBjbGllbnRZIC0gY2FudmFzUmVjdC50b3A7XHJcblxyXG4gICAgbGV0IHBvaW50ZXJDYXB0dXJlQmVoYXZpb3I6IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwaWNrUmVzdWx0ID0gTG9jYWxTY2VuZS5waWNrKHBvaW50ZXJTY3JlZW5YLCBwb2ludGVyU2NyZWVuWSwgKG1lc2gpID0+IHtcclxuICAgICAgICAvLyBJZiB0aGUgbWVzaCBoYXMgYW4gaW5zdGFuY2Ugb2YgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBhdHRhY2hlZCB0byBpdCxcclxuICAgICAgICAvLyBhbmQgY2FwdHVyZSBvbiBwb2ludGVyIGVudGVyIGlzIHRydWUsIHRoZW4gd2Ugd2FudCB0byBwaWNrIGl0XHJcbiAgICAgICAgY29uc3QgcG9pbnRlckNhcHR1cmVCZWhhdmlvciA9IE1lc2hUb0JlaGF2aW9yTWFwLmdldChtZXNoKTtcclxuICAgICAgICByZXR1cm4gbWVzaC5pc0VuYWJsZWQoKSAmJiB0eXBlb2YgcG9pbnRlckNhcHR1cmVCZWhhdmlvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yLl9jYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcGlja2VkTWVzaDogQWJzdHJhY3RNZXNoIHwgbnVsbDtcclxuICAgIGlmIChwaWNrUmVzdWx0LmhpdCkge1xyXG4gICAgICAgIHBpY2tlZE1lc2ggPSBwaWNrUmVzdWx0LnBpY2tlZE1lc2g7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBpY2tlZE1lc2ggPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhcHR1cmluZ0lkQXNJbnQgPSBwYXJzZUludChnZXRDYXB0dXJpbmdJZCgpIHx8IFwiXCIpO1xyXG5cclxuICAgIC8vIGlmIHRoZSBwaWNrZWQgbWVzaCBpcyB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHBpY2tlZE1lc2ggJiYgcGlja2VkTWVzaC51bmlxdWVJZCA9PT0gY2FwdHVyaW5nSWRBc0ludCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGVyZSBpcyBhIGNhcHR1cmluZyBtZXNoIGFuZCBpdCBpcyBub3QgdGhlIGN1cnJlbnQgcGlja2VkIG1lc2gsIG9yIG5vXHJcbiAgICAvLyBtZXNoIGlzIHBpY2tlZCwgcmVsZWFzZSB0aGUgY2FwdHVyaW5nIG1lc2hcclxuICAgIGlmIChjYXB0dXJpbmdJZEFzSW50ICYmICghcGlja2VkTWVzaCB8fCBwaWNrZWRNZXNoLnVuaXF1ZUlkICE9PSBjYXB0dXJpbmdJZEFzSW50KSkge1xyXG4gICAgICAgIHJlbGVhc2VDdXJyZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBwaWNrZWQgbWVzaCBhbmQgaXQgaXMgbm90IHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoLCBjYXB0dXJlXHJcbiAgICAvLyB0aGUgcG9pbnRlciBldmVudHMuICBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2ggaGFzIGFscmVhZHkgYmVlblxyXG4gICAgLy8gcmVsZWFzZWQgYWJvdmVcclxuICAgIGlmIChwaWNrZWRNZXNoKSB7XHJcbiAgICAgICAgcG9pbnRlckNhcHR1cmVCZWhhdmlvciA9IE1lc2hUb0JlaGF2aW9yTWFwLmdldChwaWNrZWRNZXNoKTtcclxuICAgICAgICBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yIS5jYXB0dXJlUG9pbnRlckV2ZW50cygpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEJlaGF2aW9yIGZvciBhbnkgY29udGVudCB0aGF0IGNhbiBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzLCBpLmUuIGJ5cGFzcyB0aGUgQmFieWxvbiBwb2ludGVyIGV2ZW50IGhhbmRsaW5nXHJcbiAqIGFuZCByZWNlaXZlIHBvaW50ZXIgZXZlbnRzIGRpcmVjdGx5LiAgSXQgd2lsbCByZWdpc3RlciB0aGUgY2FwdHVyZSB0cmlnZ2VycyBhbmQgbmVnb3RpYXRlIHRoZSBjYXB0dXJlIGFuZFxyXG4gKiByZWxlYXNlIG9mIHBvaW50ZXIgZXZlbnRzLiAgQ3VyZXJudGx5IHRoaXMgYXBwbGllcyBvbmx5IHRvIEh0bWxNZXNoXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBpbXBsZW1lbnRzIEJlaGF2aW9yPEFic3RyYWN0TWVzaD4ge1xyXG4gICAgLyoqIGdldHMgb3Igc2V0cyBiZWhhdmlvcidzIG5hbWUgKi9cclxuICAgIHB1YmxpYyBuYW1lID0gXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBfYXR0YWNoZWRNZXNoOiBBYnN0cmFjdE1lc2ggfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHVibGljIF9jYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIG1lc2ggdGhhdCB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBhdHRhY2hlZE1lc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaGVkTWVzaDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGF0dGFjaGVkTWVzaCh2YWx1ZTogQWJzdHJhY3RNZXNoIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaGVkTWVzaCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX2NhcHR1cmVDYWxsYmFjazogKCkgPT4gdm9pZCxcclxuICAgICAgICBwcml2YXRlIF9yZWxlYXNlQ2FsbGJhY2s6ICgpID0+IHZvaWQsXHJcbiAgICAgICAgeyBjYXB0dXJlT25Qb2ludGVyRW50ZXIgPSB0cnVlIH0gPSB7fVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNoZWRNZXNoID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcblxyXG4gICAgICAgIC8vIFdhcm4gaWYgd2UgYXJlIG5vdCBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5XYXJuKGBDcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIG91dHNpZGUgb2YgYSBicm93c2VyLiAgVGhlIGJlaGF2aW9yIHdpbGwgbm90IHdvcmsuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGlmIHRoZSBiZWhhdmlvciBzaG91bGQgY2FwdHVyZSBwb2ludGVyIGV2ZW50cyB3aGVuIHRoZSBwb2ludGVyIGVudGVycyB0aGUgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGNhcHR1cmVPblBvaW50ZXJFbnRlcihjYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID09PSBjYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICBTdGFydENhcHR1cmVPbkVudGVyKHRoaXMuX2F0dGFjaGVkTWVzaC5nZXRTY2VuZSgpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFN0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIChiZWZvcmUgYXR0YWNoaW5nIGl0IHRvIGEgdGFyZ2V0KVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdCgpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG8gYSB0YXJnZXRcclxuICAgICAqIEBwYXJhbSBtZXNoIGRlZmluZXMgdGhlIHRhcmdldCB3aGVyZSB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGF0dGFjaChtZXNoOiBBYnN0cmFjdE1lc2gpIHtcclxuICAgICAgICAvLyBBZGQgYSByZWZlcmVuY2UgdG8gdGhpcyBiZWhhdmlvciBvbiB0aGUgbWVzaC4gIFdlIGRvIHRoaXMgc28gd2UgY2FuIGdldCBhXHJcbiAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSBiZWhhdmlvciBpbiB0aGUgb25Qb2ludGVyTW92ZSBmdW5jdGlvbiB3aXRob3V0IHJlbHlpbmcgb25cclxuICAgICAgICAvLyBnZXRCZWhhdmlvckJ5TmFtZSgpLCB3aGljaCBkb2VzIGEgbGluZWFyIHNlYXJjaCBvZiB0aGUgYmVoYXZpb3JzIGFycmF5LlxyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRNZXNoID0gbWVzaDtcclxuICAgICAgICBNZXNoVG9CZWhhdmlvck1hcC5zZXQobWVzaCwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICBTdGFydENhcHR1cmVPbkVudGVyKG1lc2guZ2V0U2NlbmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIGlzIGRldGFjaGVkIGZyb20gaXRzIHRhcmdldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGV0YWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGJlaGF2aW9yIGZyb20gdGhlIG1lc2hcclxuICAgICAgICBNZXNoVG9CZWhhdmlvck1hcC5kZWxldGUodGhpcy5hdHRhY2hlZE1lc2gpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgU3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRNZXNoID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2UgdGhlIGJlaGF2aW9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgcHVibGljIHJlbGVhc2VQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0UmVsZWFzZSh0aGlzLmF0dGFjaGVkTWVzaC51bmlxdWVJZC50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICBwdWJsaWMgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcXVlc3RDYXB0dXJlKHRoaXMuYXR0YWNoZWRNZXNoLnVuaXF1ZUlkLnRvU3RyaW5nKCksIHRoaXMuX2NhcHR1cmVDYWxsYmFjaywgdGhpcy5fcmVsZWFzZUNhbGxiYWNrKTtcclxuICAgIH1cclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xuZXhwb3J0ICogZnJvbSBcIi4vaHRtbE1lc2gvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21zZGZUZXh0L2luZGV4XCI7XG4iLCJpbXBvcnQgdHlwZSB7IElEaXNwb3NhYmxlLCBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgQk1Gb250Q2hhciB9IGZyb20gXCIuL3NkZi9ibUZvbnRcIjtcclxuaW1wb3J0IHR5cGUgeyBTZGZGb250IH0gZnJvbSBcIi4vc2RmL2ZvbnRcIjtcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcblxyXG5lbnVtIENoYXJDb2RlIHtcclxuICAgIFNQQUNFID0gMzIsXHJcbiAgICBUT0ZVID0gMHhmZmZjLFxyXG59XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgZm9udCBhc3NldCBmb3IgU0RGIChTaWduZWQgRGlzdGFuY2UgRmllbGQpIHJlbmRlcmluZy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBGb250QXNzZXQgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFycyA9IG5ldyBNYXA8bnVtYmVyLCBCTUZvbnRDaGFyPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhcnNSZWdleDogUmVnRXhwO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfa2VybmluZ3MgPSBuZXcgTWFwPG51bWJlciwgTWFwPG51bWJlciwgbnVtYmVyPj4oKTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgX2ZvbnQ6IFNkZkZvbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBmb250IHNjYWxlIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBzY2FsZTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiB1c2VkIHRleHR1cmVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSB0ZXh0dXJlczogVGV4dHVyZVtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb250QXNzZXQgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbkRhdGEgZGVmaW5lcyB0aGUgZm9udCBkYXRhIGluIEpTT04gZm9ybWF0LlxyXG4gICAgICogQHBhcmFtIHRleHR1cmVVcmwgZGVmaW5lcyB0aGUgdXJsIG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBmb3IgdGhlIGZvbnQuXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgaG9zdGluZyBzY2VuZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRlZmluaXRpb25EYXRhOiBzdHJpbmcsIHRleHR1cmVVcmw6IHN0cmluZywgc2NlbmU/OiBTY2VuZSkge1xyXG4gICAgICAgIHRoaXMuX2ZvbnQgPSBKU09OLnBhcnNlKGRlZmluaXRpb25EYXRhKSBhcyBTZGZGb250O1xyXG4gICAgICAgIC8vIFNvIGZhciB3ZSBvbmx5IGNvbnNpZGVyIG9uZSBwYWdlXHJcbiAgICAgICAgdGhpcy5fZm9udC5wYWdlcyA9IFt0ZXh0dXJlVXJsXTtcclxuXHJcbiAgICAgICAgdGhpcy5fZm9udC5jaGFycy5mb3JFYWNoKChjaGFyKSA9PiB0aGlzLl9jaGFycy5zZXQoY2hhci5pZCwgY2hhcikpO1xyXG4gICAgICAgIHRoaXMuX2ZvbnQua2VybmluZ3MuZm9yRWFjaCgoa2VybmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3VibWFwID0gdGhpcy5fa2VybmluZ3MuZ2V0KGtlcm5pbmcuZmlyc3QpO1xyXG4gICAgICAgICAgICBpZiAoIXN1Ym1hcCkge1xyXG4gICAgICAgICAgICAgICAgc3VibWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2VybmluZ3Muc2V0KGtlcm5pbmcuZmlyc3QsIHN1Ym1hcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VibWFwLnNldChrZXJuaW5nLnNlY29uZCwga2VybmluZy5hbW91bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NoYXJzUmVnZXggPSBuZXcgUmVnRXhwKGBbJHt0aGlzLl9mb250LmNoYXJzLm1hcCgoYykgPT4gYy5jaGFyLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCBcIlxcXFwkJlwiKSkuam9pbihcIlwiKX1dYCwgXCJnXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVGYWxsYmFja3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEgLyB0aGlzLl9mb250LmluZm8uc2l6ZTtcclxuICAgICAgICB0aGlzLnRleHR1cmVzID0gdGhpcy5fZm9udC5wYWdlcy5tYXAoKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKHBhZ2UsIHNjZW5lLCB7IG5vTWlwbWFwOiBmYWxzZSwgaW52ZXJ0WTogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHRleHR1cmUuYW5pc290cm9waWNGaWx0ZXJpbmdMZXZlbCA9IDE2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgdGV4dHVyZSBvZiB0aGlzLnRleHR1cmVzKSB7XHJcbiAgICAgICAgICAgIHRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRleHR1cmVzLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlRmFsbGJhY2tzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hhcnMuaGFzKENoYXJDb2RlLlNQQUNFKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFycy5zZXQoQ2hhckNvZGUuU1BBQ0UsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBDaGFyQ29kZS5TUEFDRSxcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICB4b2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgeW9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHhhZHZhbmNlOiB0aGlzLl9mb250LmluZm8uc2l6ZSAqIDAuNSxcclxuICAgICAgICAgICAgICAgIHBhZ2U6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hubDogLTEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDogLTEsXHJcbiAgICAgICAgICAgICAgICBjaGFyOiBcIiBcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NoYXJzLmhhcyhDaGFyQ29kZS5UT0ZVKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFycy5zZXQoQ2hhckNvZGUuVE9GVSwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IENoYXJDb2RlLlRPRlUsXHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9mb250LmluZm8uc2l6ZSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fZm9udC5pbmZvLnNpemUsXHJcbiAgICAgICAgICAgICAgICB4b2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgeW9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHhhZHZhbmNlOiB0aGlzLl9mb250LmluZm8uc2l6ZSAqIDAuNSxcclxuICAgICAgICAgICAgICAgIHBhZ2U6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hubDogLTEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDogLTEsXHJcbiAgICAgICAgICAgICAgICBjaGFyOiBcIu+/v1wiLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHVibGljIF9nZXRDaGFyKGNoYXJDb2RlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnMuZ2V0KGNoYXJDb2RlKSB8fCB0aGlzLl9jaGFycy5nZXQoQ2hhckNvZGUuVE9GVSkhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfZ2V0S2VybmluZyhmaXJzdDogbnVtYmVyLCBzZWNvbmQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9rZXJuaW5ncy5nZXQoZmlyc3QpPy5nZXQoc2Vjb25kKSB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfdW5zdXBwb3J0ZWRDaGFycyh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKHRoaXMuX2NoYXJzUmVnZXgsIFwiXCIpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL2ZvbnRBc3NldFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9wYXJhZ3JhcGhPcHRpb25zXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRSZW5kZXJlclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zZGYvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2hhZGVycy9tc2RmLnZlcnRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zaGFkZXJzL21zZGYuZnJhZ21lbnRcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2hhZGVyc1dHU0wvbXNkZi52ZXJ0ZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2hhZGVyc1dHU0wvbXNkZi5mcmFnbWVudFwiO1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcblxyXG5pbXBvcnQgdHlwZSB7IElWZWN0b3IyTGlrZSB9IGZyb20gXCJjb3JlL01hdGhzXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogbnVtYmVyO1xyXG4gICAgbGluZUhlaWdodDogbnVtYmVyO1xyXG4gICAgbGV0dGVyU3BhY2luZzogbnVtYmVyO1xyXG4gICAgdGFiU2l6ZTogbnVtYmVyO1xyXG4gICAgd2hpdGVTcGFjZTogLyogJ25vcm1hbCcgfCAnbm93cmFwJyB8ICdwcmUnIHwgJ3ByZS13cmFwJyB8ICovIFwicHJlLWxpbmVcIiAvKiB8ICdicmVhay1zcGFjZXMnKi87XHJcbiAgICB0ZXh0QWxpZ246IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJjZW50ZXJcIiAvKiB8ICdqdXN0aWZ5JyovO1xyXG4gICAgdHJhbnNsYXRlOiBJVmVjdG9yMkxpa2UgfCB1bmRlZmluZWQ7XHJcbn07XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjb25zdCBEZWZhdWx0UGFyYWdyYXBoT3B0aW9uczogUGFyYWdyYXBoT3B0aW9ucyA9IHtcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eSxcclxuICAgIGxpbmVIZWlnaHQ6IDEsXHJcbiAgICBsZXR0ZXJTcGFjaW5nOiAxLFxyXG4gICAgdGFiU2l6ZTogNCxcclxuICAgIHdoaXRlU3BhY2U6IFwicHJlLWxpbmVcIixcclxuICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcclxuICAgIHRyYW5zbGF0ZTogeyB4OiAtMC41LCB5OiAtMC41IH0sXHJcbn07XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG4vKipcclxuICogSG9sZHMgaW5mb3JtYXRpb24gb24gaG93IHRoZSBmb250IHdhcyBnZW5lcmF0ZWQuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnRJbmZvID0ge1xyXG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmb250ICovXHJcbiAgICBmYWNlOiBzdHJpbmc7XHJcbiAgICAvKiogVGhlIHNpemUgb2YgdGhlIGZvbnQgKi9cclxuICAgIHNpemU6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgZm9udCBpcyBib2xkICovXHJcbiAgICBib2xkOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGZvbnQgaXMgaXRhbGljICovXHJcbiAgICBpdGFsaWM6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgY2hhcnNldCBvZiB0aGUgZm9udCAqL1xyXG4gICAgY2hhcnNldDogc3RyaW5nW107XHJcbiAgICAvKiogVGhlIGNoYXJzZXQgaXMgdW5pY29kZSAgKi9cclxuICAgIHVuaWNvZGU6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgZm9udCBoZWlnaHQgc3RyZXRjaCBpbiBwZXJjZW50YWdlLiAxMDAlIG1lYW5zIG5vIHN0cmV0Y2guICovXHJcbiAgICBzdHJldGNoSDogbnVtYmVyO1xyXG4gICAgLyoqIFNldCB0byAxIGlmIHNtb290aGluZyB3YXMgdHVybmVkIG9uLiAqL1xyXG4gICAgc21vb3RoOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIHN1cGVyc2FtcGxpbmcgbGV2ZWwgdXNlZC4gMSBtZWFucyBubyBzdXBlcnNhbXBsaW5nIHdhcyB1c2VkLiAqL1xyXG4gICAgYWE6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgcGFkZGluZyBmb3IgZWFjaCBjaGFyYWN0ZXIgKHVwLCByaWdodCwgZG93biwgbGVmdCkuICovXHJcbiAgICBwYWRkaW5nOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcclxuICAgIC8qKiBUaGUgc3BhY2luZyBmb3IgZWFjaCBjaGFyYWN0ZXIgKGhvcml6b250YWwsIHZlcnRpY2FsKS4gKi9cclxuICAgIHNwYWNpbmc6IFtudW1iZXIsIG51bWJlcl07XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvdXRsaW5lIHRoaWNrbmVzcyBmb3IgdGhlIGNoYXJhY3RlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFyayBtaXNzaW5nIGluIG1zZGYtYm1mb250LXhtbFxyXG4gICAgICovXHJcbiAgICBvdXRsaW5lPzogbnVtYmVyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEhvbGRzIGluZm9ybWF0aW9uIGNvbW1vbiB0byBhbGwgY2hhcmFjdGVycy5cclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udENvbW1vbiA9IHtcclxuICAgIC8qKiBEaXN0YW5jZSBpbiBwaXhlbHMgYmV0d2VlbiBlYWNoIGxpbmUgb2YgdGV4dCAqL1xyXG4gICAgbGluZUhlaWdodDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGZyb20gdGhlIGFic29sdXRlIHRvcCBvZiB0aGUgbGluZSB0byB0aGUgYmFzZSBvZiB0aGUgY2hhcmFjdGVycyAqL1xyXG4gICAgYmFzZTogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZSwgbm9ybWFsbHkgdXNlZCB0byBzY2FsZSB0aGUgeCBwb3Mgb2YgdGhlIGNoYXJhY3RlciBpbWFnZSAqL1xyXG4gICAgc2NhbGVXOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZSwgbm9ybWFsbHkgdXNlZCB0byBzY2FsZSB0aGUgeSBwb3Mgb2YgdGhlIGNoYXJhY3RlciBpbWFnZSAqL1xyXG4gICAgc2NhbGVIOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZm9udCAqL1xyXG4gICAgcGFnZXM6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMSBpZiB0aGUgbW9ub2Nocm9tZSBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBwYWNrZWQgaW50byBlYWNoIG9mIHRoZSB0ZXh0dXJlIGNoYW5uZWxzLiBJbiB0aGlzIGNhc2UgYWxwaGFDaG5sIGRlc2NyaWJlcyB3aGF0IGlzIHN0b3JlZCBpbiBlYWNoIGNoYW5uZWwuICovXHJcbiAgICBwYWNrZWQ6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMCBpZiB0aGUgY2hhbm5lbCBob2xkcyB0aGUgZ2x5cGggZGF0YSwgMSBpZiBpdCBob2xkcyB0aGUgb3V0bGluZSwgMiBpZiBpdCBob2xkcyB0aGUgZ2x5cGggYW5kIHRoZSBvdXRsaW5lLCAzIGlmIGl0cyBzZXQgdG8gemVybywgYW5kIDQgaWYgaXRzIHNldCB0byBvbmUuICovXHJcbiAgICBhbHBoYUNobmw6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMCBpZiB0aGUgY2hhbm5lbCBob2xkcyB0aGUgZ2x5cGggZGF0YSwgMSBpZiBpdCBob2xkcyB0aGUgb3V0bGluZSwgMiBpZiBpdCBob2xkcyB0aGUgZ2x5cGggYW5kIHRoZSBvdXRsaW5lLCAzIGlmIGl0cyBzZXQgdG8gemVybywgYW5kIDQgaWYgaXRzIHNldCB0byBvbmUuICovXHJcbiAgICByZWRDaG5sOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDAgaWYgdGhlIGNoYW5uZWwgaG9sZHMgdGhlIGdseXBoIGRhdGEsIDEgaWYgaXQgaG9sZHMgdGhlIG91dGxpbmUsIDIgaWYgaXQgaG9sZHMgdGhlIGdseXBoIGFuZCB0aGUgb3V0bGluZSwgMyBpZiBpdHMgc2V0IHRvIHplcm8sIGFuZCA0IGlmIGl0cyBzZXQgdG8gb25lLiAqL1xyXG4gICAgZ3JlZW5DaG5sOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDAgaWYgdGhlIGNoYW5uZWwgaG9sZHMgdGhlIGdseXBoIGRhdGEsIDEgaWYgaXQgaG9sZHMgdGhlIG91dGxpbmUsIDIgaWYgaXQgaG9sZHMgdGhlIGdseXBoIGFuZCB0aGUgb3V0bGluZSwgMyBpZiBpdHMgc2V0IHRvIHplcm8sIGFuZCA0IGlmIGl0cyBzZXQgdG8gb25lLiAqL1xyXG4gICAgYmx1ZUNobmw6IG51bWJlcjtcclxufTtcclxuXHJcbi8qKiBOYW1lIG9mIGEgdGV4dHVyZSBmaWxlLiBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggcGFnZSBpbiB0aGUgZm9udC4gKi9cclxuZXhwb3J0IHR5cGUgQk1Gb250UGFnZXMgPSB7XHJcbiAgICBbaWQ6IG51bWJlcl06IHN0cmluZztcclxufSAmIEFycmF5PHN0cmluZz47XHJcblxyXG4vKipcclxuICogRGVzY3JpYmVzIGEgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgZm9udFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQk1Gb250Q2hhciA9IHtcclxuICAgIC8qKiBDaGFyYWN0ZXIgaWQgKGNoYXJDb2RlKSAqL1xyXG4gICAgaWQ6IG51bWJlcjtcclxuICAgIC8qKiBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgaW1hZ2UgaW4gdGhlIHRleHR1cmUuICovXHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICAvKiogUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBpbWFnZSBpbiB0aGUgdGV4dHVyZSAqL1xyXG4gICAgeTogbnVtYmVyO1xyXG4gICAgLyoqIFdpZHRoIG9mIHRoZSBjaHJhY3RlciBpbWFnZSBpbiB0aGUgdGV4dHVyZSAqL1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBIZWlnaHQgb2YgdGhlIGNocmFjdGVyIGltYWdlIGluIHRoZSB0ZXh0dXJlICovXHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIC8qKiBIb3Jpem9udGFsIG9mZnNldCB0byBiZSBhcHBsaWVkIG9uIHNjcmVlbiAqL1xyXG4gICAgeG9mZnNldDogbnVtYmVyO1xyXG4gICAgLyoqIFZlcnRpY2FsIG9mZnNldCB0byBiZSBhcHBsaWVkIG9uIHNjcmVlbiAqL1xyXG4gICAgeW9mZnNldDogbnVtYmVyO1xyXG4gICAgLyoqIEhvcml6b250YWwgYWR2YW5jZSBhZnRlciB0aGUgY2hhcmFjdGVyICovXHJcbiAgICB4YWR2YW5jZTogbnVtYmVyO1xyXG4gICAgLyoqIFBhZ2UgaW5kZXggd2hlcmUgdGhlIGNoYXJhY3RlciBpbWFnZSBpcyBmb3VuZCAqL1xyXG4gICAgcGFnZTogbnVtYmVyO1xyXG4gICAgLyoqIFRleHR1cmUgY2hhbm5lbCB3aGVyZSB0aGUgY2hyYWN0ZXIgaW1hZ2UgaXMgZm91bmRcclxuICAgICAqIC0gMSA9IGJsdWVcclxuICAgICAqIC0gMiA9IGdyZWVuXHJcbiAgICAgKiAtIDMgPSByZWRcclxuICAgICAqIC0gOCA9IGFscGhhXHJcbiAgICAgKiAtIDE1ID0gYWxsIGNoYW5uZWxzXHJcbiAgICAgKi9cclxuICAgIGNobmw6IG51bWJlcjtcclxufSAmIEJNRm9udENoYXJFeHRyYTtcclxuXHJcbi8qKlxyXG4gKiBhZGRpdGlvbmFsIGNvbnRleHQgZnJvbSBtc2RmLWJtZm9udC14bWxcclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udENoYXJFeHRyYSA9IHtcclxuICAgIC8qKiBpbmRleCBvZiBvcGVudHlwZS5qcyBnbHlwaCAqL1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiBhY3R1YWwgY2hhcmFjdGVyKi9cclxuICAgIGNoYXI6IHN0cmluZztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGUga2VybmluZyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGFkanVzdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjZXJ0YWluIGNoYXJhY3RlcnMsIGUuZy4gc29tZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBwbGFjZWQgY2xvc2VyIHRvIGVhY2ggb3RoZXIgdGhhbiBvdGhlcnMuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnRLZXJuaW5nID0ge1xyXG4gICAgLyoqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaWQuICovXHJcbiAgICBmaXJzdDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBzZWNvbmQgY2hhcmFjdGVyIGlkLiAqL1xyXG4gICAgc2Vjb25kOiBudW1iZXI7XHJcbiAgICAvKiogSG93IG11Y2ggdGhlIHggcG9zaXRpb24gc2hvdWxkIGJlIGFkanVzdGVkIHdoZW4gZHJhd2luZyB0aGUgc2Vjb25kIGNoYXJhY3RlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGZpcnN0LiAqL1xyXG4gICAgYW1vdW50OiBudW1iZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGF0aWJsZSB3aXRoIFttc2RmLWJtZm9udC14bWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9zb2lteS9tc2RmLWJtZm9udC14bWwpXHJcbiAqIEBzZWUgaHR0cHM6Ly93d3cuYW5nZWxjb2RlLmNvbS9wcm9kdWN0cy9ibWZvbnQvZG9jL2ZpbGVfZm9ybWF0Lmh0bWxcclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udCA9IHtcclxuICAgIC8qKiB7QGluaGVyaXREb2MgQk1Gb250SW5mb30gKi9cclxuICAgIGluZm86IEJNRm9udEluZm87XHJcbiAgICAvKioge0Bpbmhlcml0RG9jIEJNRm9udENvbW1vbn0gKi9cclxuICAgIGNvbW1vbjogQk1Gb250Q29tbW9uO1xyXG4gICAgLyoqIHtAaW5oZXJpdERvYyBCTUZvbnRQYWdlc30gKi9cclxuICAgIHBhZ2VzOiBCTUZvbnRQYWdlcztcclxuICAgIC8qKiB7QGluaGVyaXREb2MgQk1Gb250Q2hhcn0gKi9cclxuICAgIGNoYXJzOiBCTUZvbnRDaGFyW107XHJcbiAgICAvKioge0Bpbmhlcml0RG9jIEJNRm9udEtlcm5pbmd9ICovXHJcbiAgICBrZXJuaW5nczogQk1Gb250S2VybmluZ1tdO1xyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcbmltcG9ydCB0eXBlIHsgQk1Gb250IH0gZnJvbSBcIi4vYm1Gb250XCI7XHJcblxyXG5leHBvcnQgdHlwZSBTZGZGb250RGlzdGFuY2VGaWVsZCA9IHtcclxuICAgIGZpZWxkVHlwZTogXCJzZGZcIiB8IFwibXNkZlwiO1xyXG4gICAgZGlzdGFuY2VSYW5nZTogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgU2RmRm9udCA9IEJNRm9udCAmIHtcclxuICAgIGRpc3RhbmNlRmllbGQ6IFNkZkZvbnREaXN0YW5jZUZpZWxkO1xyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcbmltcG9ydCB0eXBlIHsgQk1Gb250Q2hhciB9IGZyb20gXCIuL2JtRm9udFwiO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgdHlwZSBTZGZHbHlwaCA9IHtcclxuICAgIGNoYXI6IEJNRm9udENoYXI7XHJcbiAgICAvKiogaW5kZXggb2YgdGhlIGxpbmUgKi9cclxuICAgIGxpbmU6IG51bWJlcjtcclxuICAgIC8qKiBwb3NpdGlvbiB3aXRoaW4gdGhlIGxpbmUgKi9cclxuICAgIHBvc2l0aW9uOiBudW1iZXI7XHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICB5OiBudW1iZXI7XHJcbn07XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2JtRm9udFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZm9udFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2x5cGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhcmFncmFwaFwiO1xuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5pbXBvcnQgdHlwZSB7IFNkZkdseXBoIH0gZnJvbSBcIi4vZ2x5cGhcIjtcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IHR5cGUgU2RmVGV4dExpbmUgPSB7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICBnbHlwaHM6IFNkZkdseXBoW107XHJcbiAgICBzdGFydDogbnVtYmVyO1xyXG4gICAgZW5kOiBudW1iZXI7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBiYWJ5bG9uanMvYXZhaWxhYmxlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGpzZG9jL3JlcXVpcmUtanNkb2MgKi9cclxuaW1wb3J0IHR5cGUgeyBGb250QXNzZXQgfSBmcm9tIFwiLi4vZm9udEFzc2V0XCI7XHJcbmltcG9ydCB7IERlZmF1bHRQYXJhZ3JhcGhPcHRpb25zLCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi4vcGFyYWdyYXBoT3B0aW9uc1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9ibUZvbnRcIjtcclxuaW1wb3J0IHR5cGUgeyBTZGZHbHlwaCB9IGZyb20gXCIuL2dseXBoXCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmVGV4dExpbmUgfSBmcm9tIFwiLi9saW5lXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTZGZUZXh0UGFyYWdyYXBoIHtcclxuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBQYXJhZ3JhcGhPcHRpb25zO1xyXG5cclxuICAgIGdldCBsaW5lSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRBc3NldC5fZm9udC5jb21tb24ubGluZUhlaWdodCAqIHRoaXMub3B0aW9ucy5saW5lSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJlYWRvbmx5IHBhcmFncmFwaDtcclxuICAgIHJlYWRvbmx5IGxpbmVzO1xyXG4gICAgcmVhZG9ubHkgd2lkdGg7XHJcbiAgICByZWFkb25seSBoZWlnaHQ7XHJcbiAgICByZWFkb25seSBnbHlwaHM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEFzc2V0OiBGb250QXNzZXQsXHJcbiAgICAgICAgb3B0aW9ucz86IFBhcnRpYWw8UGFyYWdyYXBoT3B0aW9ucz5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgLi4uRGVmYXVsdFBhcmFncmFwaE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBwYXJhZ3JhcGgsIGxpbmVzLCBnbHlwaHMsIHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2NvbXB1dGVNZXRyaWNzKHRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFncmFwaCA9IHBhcmFncmFwaDtcclxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XHJcbiAgICAgICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvbXB1dGVNZXRyaWNzKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuX2NvbGxhcHNlKHRleHQpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrZWQgPSB0aGlzLl9icmVha0xpbmVzKGNvbGxhcHNlZCk7XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGJyZWFrZWQubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVzOiBTZGZUZXh0TGluZVtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRyaW1tZWQpIHtcclxuICAgICAgICAgICAgbGluZXMucHVzaCguLi50aGlzLl93cmFwKGxpbmUsIGxpbmVzLmxlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCguLi5saW5lcy5tYXAoKGxpbmUpID0+IGxpbmUud2lkdGgpKTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmxpbmVIZWlnaHQgKiBsaW5lcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGV4dEFsaWduICE9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMudHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudGV4dEFsaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoIC0gbGluZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh3aWR0aCAtIGxpbmUud2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMub3B0aW9ucy50cmFuc2xhdGUgPyB0aGlzLm9wdGlvbnMudHJhbnNsYXRlLnggKiB3aWR0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5vcHRpb25zLnRyYW5zbGF0ZSA/IHRoaXMub3B0aW9ucy50cmFuc2xhdGUueSAqIGhlaWdodCA6IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGxpbmUuZ2x5cGhzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGgueCArPSBhbmNob3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGgueCArPSB4O1xyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoLnkgKz0geTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBnbHlwaHMgPSBsaW5lcy5mbGF0TWFwKChsaW5lKSA9PiBsaW5lLmdseXBocyk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHBhcmFncmFwaDogdHJpbW1lZC5qb2luKFwiXFxuXCIpLFxyXG4gICAgICAgICAgICBsaW5lcyxcclxuICAgICAgICAgICAgZ2x5cGhzLFxyXG4gICAgICAgICAgICB3aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYnJlYWtMaW5lcyh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dC5zcGxpdChcIlxcblwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jb2xsYXBzZSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHQvZywgXCIgXCIucmVwZWF0KHRoaXMub3B0aW9ucy50YWJTaXplKSkucmVwbGFjZSgvICsvZywgXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3dyYXAodGV4dDogc3RyaW5nLCBsaW5lT2Zmc2V0ID0gMCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PFNkZlRleHRMaW5lPigpO1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudExpbmUgPSBsaW5lT2Zmc2V0O1xyXG4gICAgICAgIGxldCBjdXJyZW50R2x5cGhzID0gbmV3IEFycmF5PFNkZkdseXBoPigpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Q3Vyc29yID0gMDtcclxuICAgICAgICBsZXQgY3VycmVudFdpZHRoID0gMDtcclxuICAgICAgICBsZXQgbGFzdENoYXI6IEJNRm9udENoYXIgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcclxuICAgICAgICBsZXQgZW5kID0gc3RhcnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHB1c2hDdXJyZW50TGluZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgbGluZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LnNsaWNlKHN0YXJ0LCBlbmQpLFxyXG4gICAgICAgICAgICAgICAgZ2x5cGhzOiBjdXJyZW50R2x5cGhzLFxyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgZW5kOiBlbmQsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgaSA9IGVuZDtcclxuICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSB0aGlzLmZvbnRBc3NldC5fZ2V0Q2hhcihjaGFyQ29kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJXaWR0aCA9IGNoYXIud2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGtlcm5pbmcgPSBsYXN0Q2hhciA/IHRoaXMuZm9udEFzc2V0Ll9nZXRLZXJuaW5nKGxhc3RDaGFyLmlkLCBjaGFyLmlkKSA6IDA7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50Q3Vyc29yICs9IGtlcm5pbmc7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoID0gY3VycmVudEN1cnNvciArIGNoYXJXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgY3Vyc29yUHJvZ3Jlc3MgPSBjaGFyLnhhZHZhbmNlICsgdGhpcy5vcHRpb25zLmxldHRlclNwYWNpbmc7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IGN1cnJlbnRDdXJzb3IgKyBjdXJzb3JQcm9ncmVzcztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEJyZWFrID0gbmV4dFBvc2l0aW9uID4gdGhpcy5vcHRpb25zLm1heFdpZHRoIHx8IG5ld1dpZHRoID4gdGhpcy5vcHRpb25zLm1heFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3VsZEJyZWFrKSB7XHJcbiAgICAgICAgICAgICAgICBwdXNoQ3VycmVudExpbmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSsrO1xyXG4gICAgICAgICAgICAgICAgbGFzdENoYXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gMDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDtcclxuICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRHbHlwaHMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgeCA9IGN1cnJlbnRDdXJzb3I7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjdXJyZW50TGluZSAqIHRoaXMubGluZUhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRHbHlwaHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBjaGFyLFxyXG4gICAgICAgICAgICAgICAgbGluZTogY3VycmVudExpbmUsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogY3VycmVudEdseXBocy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICB4OiB4LFxyXG4gICAgICAgICAgICAgICAgeTogeSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEJyZWFrKSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0Q2hhciA9IGNoYXI7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gbmV4dFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFdpZHRoID0gbmV3V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRDdXJzb3IgPSBjdXJzb3JQcm9ncmVzcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRHbHlwaHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAobGFzdENoYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRXaWR0aCArPSBsYXN0Q2hhci54YWR2YW5jZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwdXNoQ3VycmVudExpbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5lcztcclxuICAgIH1cclxufVxyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJtc2RmUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGAjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZVxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIGZvbnRBdGxhczt1bmlmb3JtIHZlYzQgdUNvbG9yO3VuaWZvcm0gdmVjNCB1U3Ryb2tlQ29sb3I7dW5pZm9ybSBmbG9hdCB1U3Ryb2tlSW5zZXRXaWR0aDt1bmlmb3JtIGZsb2F0IHVTdHJva2VPdXRzZXRXaWR0aDt1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczt2YXJ5aW5nIHZlYzIgYXRsYXNVVjtmbG9hdCBtZWRpYW4odmVjMyBtc2RmKSB7cmV0dXJuIG1heChtaW4obXNkZi5yLG1zZGYuZyksbWluKG1heChtc2RmLnIsbXNkZi5nKSxtc2RmLmIpKTt9XG52b2lkIG1haW4odm9pZClcbnt2ZWMzIHM9dGV4dHVyZTJEKGZvbnRBdGxhcyxhdGxhc1VWKS5yZ2I7ZmxvYXQgc2lnRGlzdD1tZWRpYW4ocyktMC41K3RoaWNrbmVzcztmbG9hdCBhbHBoYT1jbGFtcChzaWdEaXN0L2Z3aWR0aChzaWdEaXN0KSswLjUsMC4wLDEuMCk7ZmxvYXQgc2lnRGlzdE91dHNldD1zaWdEaXN0K3VTdHJva2VPdXRzZXRXaWR0aCowLjU7ZmxvYXQgc2lnRGlzdEluc2V0PXNpZ0Rpc3QtdVN0cm9rZUluc2V0V2lkdGgqMC41O2Zsb2F0IG91dHNldD1jbGFtcChzaWdEaXN0T3V0c2V0L2Z3aWR0aChzaWdEaXN0T3V0c2V0KSswLjUsMC4wLDEuMCk7ZmxvYXQgaW5zZXQ9MS4wLWNsYW1wKHNpZ0Rpc3RJbnNldC9md2lkdGgoc2lnRGlzdEluc2V0KSswLjUsMC4wLDEuMCk7ZmxvYXQgYm9yZGVyPW91dHNldCppbnNldDt2ZWM0IGZpbGxlZEZyYWdDb2xvcj12ZWM0KHVDb2xvci5yZ2IsYWxwaGEqdUNvbG9yLmEpO3ZlYzQgc3Ryb2tlZEZyYWdDb2xvcj12ZWM0KHVTdHJva2VDb2xvci5yZ2IsYm9yZGVyKnVTdHJva2VDb2xvci5hKTtnbF9GcmFnQ29sb3I9bWl4KGZpbGxlZEZyYWdDb2xvcixzdHJva2VkRnJhZ0NvbG9yLGJvcmRlcik7fWA7XG4vLyBTaWRlZWZmZWN0XG5pZiAoIVNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSkge1xuICAgIFNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtc2RmUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwibXNkZlZlcnRleFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYCNkZWZpbmUgQklMTEJPQVJEIDFcbiNkZWZpbmUgQklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEIDJcbmF0dHJpYnV0ZSB2ZWMyIG9mZnNldHM7YXR0cmlidXRlIHZlYzQgd29ybGQwO2F0dHJpYnV0ZSB2ZWM0IHdvcmxkMTthdHRyaWJ1dGUgdmVjNCB3b3JsZDI7YXR0cmlidXRlIHZlYzQgd29ybGQzO2F0dHJpYnV0ZSB2ZWM0IHV2czt1bmlmb3JtIG1hdDQgdHJhbnNmb3JtO3VuaWZvcm0gbWF0NCBwYXJlbnRXb3JsZDt1bmlmb3JtIG1hdDQgdmlldzt1bmlmb3JtIG1hdDQgcHJvamVjdGlvbjt1bmlmb3JtIHZlYzMgY2VudGVyO3VuaWZvcm0gaW50IG1vZGU7dmFyeWluZyB2ZWMyIGF0bGFzVVY7dm9pZCBtYWluKHZvaWQpIHttYXQ0IHdvcmxkPW1hdDQod29ybGQwLHdvcmxkMSx3b3JsZDIsd29ybGQzKTt2ZWM0IHdvcmxkUG9zPXRyYW5zZm9ybSood29ybGQqdmVjNChvZmZzZXRzLnh5LXZlYzIoMC41LDAuNSksMC4sMS4wKSk7aWYgKG1vZGU+PUJJTExCT0FSRCkge3ZlYzMgdmlld1Bvcz0odmlldypwYXJlbnRXb3JsZCp2ZWM0KDAuLDAuLDAuLDEuMCkpLnh5ejsgXG5pZiAobW9kZT09QklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEKSB7dmlld1Bvcy54Lz12aWV3UG9zLno7dmlld1Bvcy55Lz12aWV3UG9zLno7dmlld1Bvcy56PTEuMDt9XG5nbF9Qb3NpdGlvbj1wcm9qZWN0aW9uKnZlYzQodmlld1Bvcyt3b3JsZFBvcy54eXosMS4wKTsgfSBlbHNlIHt2ZWMzIHZpZXdQb3M9KHZpZXcqcGFyZW50V29ybGQqd29ybGRQb3MpLnh5ejsgXG5nbF9Qb3NpdGlvbj1wcm9qZWN0aW9uKnZlYzQodmlld1BvcywxLjApOyB9XG5hdGxhc1VWPXZlYzIodXZzLngrb2Zmc2V0cy54KnV2cy56LHV2cy55KygxLjAtb2Zmc2V0cy55KSp1dnMudyk7fWA7XG4vLyBTaWRlZWZmZWN0XG5pZiAoIVNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSkge1xuICAgIFNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtc2RmVmVydGV4U2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcIm1zZGZQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHZhciBmb250QXRsYXM6IHRleHR1cmVfMmQ8ZjMyPjt2YXIgZm9udEF0bGFzU2FtcGxlcjogc2FtcGxlcjt1bmlmb3JtIHVDb2xvcjogdmVjNGY7dW5pZm9ybSB0aGlja25lc3M6IGYzMjt1bmlmb3JtIHVTdHJva2VDb2xvcjogdmVjNGY7dW5pZm9ybSB1U3Ryb2tlSW5zZXRXaWR0aDogZjMyO3VuaWZvcm0gdVN0cm9rZU91dHNldFdpZHRoOiBmMzI7dmFyeWluZyBhdGxhc1VWOiB2ZWMyZjtmbiBtZWRpYW4obXNkZjogdmVjMzxmMzI+KS0+ZjMyIHtsZXQgYT1taW4obXNkZi5yLG1zZGYuZyk7bGV0IGI9bWF4KG1zZGYucixtc2RmLmcpO3JldHVybiBtYXgoYSxtaW4oYixtc2RmLmIpKTt9XG5AZnJhZ21lbnRcbmZuIG1haW4oaW5wdXQ6IEZyYWdtZW50SW5wdXRzKS0+RnJhZ21lbnRPdXRwdXRzIHtsZXQgcz10ZXh0dXJlU2FtcGxlKGZvbnRBdGxhcyxmb250QXRsYXNTYW1wbGVyLGlucHV0LmF0bGFzVVYpLnJnYjtsZXQgc2lnRGlzdD1tZWRpYW4ocyktMC41K3VuaWZvcm1zLnRoaWNrbmVzcztsZXQgYWZ3aWR0aD1sZW5ndGgodmVjMjxmMzI+KGRwZHgoc2lnRGlzdCksZHBkeShzaWdEaXN0KSkpO2xldCBhbHBoYT1jbGFtcChzaWdEaXN0L2Fmd2lkdGgrMC41LDAuMCwxLjApO2xldCBzaWdEaXN0T3V0c2V0PXNpZ0Rpc3QrdW5pZm9ybXMudVN0cm9rZU91dHNldFdpZHRoKjAuNTtsZXQgc2lnRGlzdEluc2V0PXNpZ0Rpc3QtdW5pZm9ybXMudVN0cm9rZUluc2V0V2lkdGgqMC41O2xldCBhZndpZHRoT3V0c2V0PWxlbmd0aCh2ZWMyPGYzMj4oZHBkeChzaWdEaXN0T3V0c2V0KSxkcGR5KHNpZ0Rpc3RPdXRzZXQpKSk7bGV0IGFmd2lkdGhJbnNldD1sZW5ndGgodmVjMjxmMzI+KGRwZHgoc2lnRGlzdEluc2V0KSxkcGR5KHNpZ0Rpc3RJbnNldCkpKTtsZXQgb3V0c2V0PWNsYW1wKHNpZ0Rpc3RPdXRzZXQvYWZ3aWR0aE91dHNldCswLjUsMC4wLDEuMCk7bGV0IGluc2V0PTEuMC1jbGFtcChzaWdEaXN0SW5zZXQvYWZ3aWR0aEluc2V0KzAuNSwwLjAsMS4wKTtsZXQgYm9yZGVyPW91dHNldCppbnNldDtsZXQgZmlsbGVkRnJhZ0NvbG9yPXZlYzQ8ZjMyPih1bmlmb3Jtcy51Q29sb3IucmdiLGFscGhhKnVuaWZvcm1zLnVDb2xvci5hKTtsZXQgc3Ryb2tlZEZyYWdDb2xvcj12ZWM0PGYzMj4odW5pZm9ybXMudVN0cm9rZUNvbG9yLnJnYixib3JkZXIqdW5pZm9ybXMudVN0cm9rZUNvbG9yLmEpO2ZyYWdtZW50T3V0cHV0cy5jb2xvcj1taXgoZmlsbGVkRnJhZ0NvbG9yLHN0cm9rZWRGcmFnQ29sb3IsYm9yZGVyKTt9YDtcbi8vIFNpZGVlZmZlY3RcbmlmICghU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlV0dTTFtuYW1lXSkge1xuICAgIFNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVdHU0xbbmFtZV0gPSBzaGFkZXI7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgbXNkZlBpeGVsU2hhZGVyV0dTTCA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJtc2RmVmVydGV4U2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgI2RlZmluZSBCSUxMQk9BUkQgMVxuI2RlZmluZSBCSUxMQk9BUkRTQ1JFRU5QUk9KRUNURUQgMlxuYXR0cmlidXRlIG9mZnNldHM6IHZlYzJmO2F0dHJpYnV0ZSB3b3JsZDA6IHZlYzRmO2F0dHJpYnV0ZSB3b3JsZDE6IHZlYzRmO2F0dHJpYnV0ZSB3b3JsZDI6IHZlYzRmO2F0dHJpYnV0ZSB3b3JsZDM6IHZlYzRmO2F0dHJpYnV0ZSB1dnM6IHZlYzRmO3VuaWZvcm0gdHJhbnNmb3JtOiBtYXQ0eDRmO3VuaWZvcm0gcGFyZW50V29ybGQ6IG1hdDR4NGY7dW5pZm9ybSB2aWV3OiBtYXQ0eDRmO3VuaWZvcm0gcHJvamVjdGlvbjogbWF0NHg0Zjt1bmlmb3JtIG1vZGU6IHUzMjt2YXJ5aW5nIGF0bGFzVVY6IHZlYzJmO0B2ZXJ0ZXhcbmZuIG1haW4oaW5wdXQ6IFZlcnRleElucHV0cyktPkZyYWdtZW50SW5wdXRzIHtsZXQgd29ybGQ9bWF0NHg0PGYzMj4oaW5wdXQud29ybGQwLGlucHV0LndvcmxkMSxpbnB1dC53b3JsZDIsaW5wdXQud29ybGQzKTtsZXQgbG9jYWxPZmZzZXQ9dmVjNDxmMzI+KGlucHV0Lm9mZnNldHMtdmVjMjxmMzI+KDAuNSwwLjUpLDAuMCwxLjApO2xldCB3b3JsZFBvcz11bmlmb3Jtcy50cmFuc2Zvcm0qd29ybGQqbG9jYWxPZmZzZXQ7aWYgKHVuaWZvcm1zLm1vZGU+PUJJTExCT0FSRCkgeyBcbnZhciB2aWV3UG9zPSh1bmlmb3Jtcy52aWV3KnVuaWZvcm1zLnBhcmVudFdvcmxkKnZlYzRmKDAuLDAuLDAuLDEuMCkpLnh5ejtpZiAodW5pZm9ybXMubW9kZT09QklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEKSB7dmlld1Bvcz12ZWMzZih2aWV3UG9zLngvdmlld1Bvcy56LHZpZXdQb3MueS92aWV3UG9zLnosMS4wKTt9IFxudmVydGV4T3V0cHV0cy5wb3NpdGlvbj11bmlmb3Jtcy5wcm9qZWN0aW9uKnZlYzQ8ZjMyPih2aWV3UG9zK3dvcmxkUG9zLnh5eiwxLjApO30gZWxzZSB7IFxubGV0IHZpZXdQb3M9KHVuaWZvcm1zLnZpZXcqdW5pZm9ybXMucGFyZW50V29ybGQqd29ybGRQb3MpLnh5ejt2ZXJ0ZXhPdXRwdXRzLnBvc2l0aW9uPXVuaWZvcm1zLnByb2plY3Rpb24qdmVjNDxmMzI+KHZpZXdQb3MsMS4wKTt9XG52ZXJ0ZXhPdXRwdXRzLmF0bGFzVVY9dmVjMjxmMzI+KFxuaW5wdXQudXZzLngraW5wdXQub2Zmc2V0cy54KmlucHV0LnV2cy56LFxuaW5wdXQudXZzLnkrKDEuMC1pbnB1dC5vZmZzZXRzLnkpKmlucHV0LnV2cy53XG4pO31gO1xuLy8gU2lkZWVmZmVjdFxuaWYgKCFTaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVXR1NMW25hbWVdKSB7XG4gICAgU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlV0dTTFtuYW1lXSA9IHNoYWRlcjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtc2RmVmVydGV4U2hhZGVyV0dTTCA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgdHlwZSB7IFZlcnRleEJ1ZmZlciB9IGZyb20gXCJjb3JlL0J1ZmZlcnMvYnVmZmVyXCI7XHJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJjb3JlL0J1ZmZlcnMvYnVmZmVyXCI7XHJcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RFbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL2Fic3RyYWN0RW5naW5lXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCJjb3JlL0VuZ2luZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgVGhpbkVuZ2luZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvdGhpbkVuZ2luZVwiO1xyXG5pbXBvcnQgeyBEcmF3V3JhcHBlciB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9kcmF3V3JhcHBlclwiO1xyXG5pbXBvcnQgeyBTaGFkZXJMYW5ndWFnZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zaGFkZXJMYW5ndWFnZVwiO1xyXG5pbXBvcnQgdHlwZSB7IElEaXNwb3NhYmxlIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCB7IFNkZlRleHRQYXJhZ3JhcGggfSBmcm9tIFwiLi9zZGYvcGFyYWdyYXBoXCI7XHJcbmltcG9ydCB0eXBlIHsgRm9udEFzc2V0IH0gZnJvbSBcIi4vZm9udEFzc2V0XCI7XHJcbmltcG9ydCB0eXBlIHsgUGFyYWdyYXBoT3B0aW9ucyB9IGZyb20gXCIuL3BhcmFncmFwaE9wdGlvbnNcIjtcclxuaW1wb3J0IHsgVGhpbk1hdHJpeCB9IGZyb20gXCJjb3JlL01hdGhzL1RoaW5NYXRocy90aGluTWF0aC5tYXRyaXhcIjtcclxuaW1wb3J0IHtcclxuICAgIENvcHlNYXRyaXhUb0FycmF5LFxyXG4gICAgQ29weU1hdHJpeFRvUmVmLFxyXG4gICAgSWRlbnRpdHlNYXRyaXhUb1JlZixcclxuICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZixcclxuICAgIFNjYWxpbmdNYXRyaXhUb1JlZixcclxuICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYsXHJcbn0gZnJvbSBcImNvcmUvTWF0aHMvVGhpbk1hdGhzL3RoaW5NYXRoLm1hdHJpeC5mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHR5cGUgeyBJQ29sb3I0TGlrZSwgSU1hdHJpeExpa2UgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmxpa2VcIjtcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBOb2RlIGNsYXNzIGZyb20gQmFieWxvbi5qc1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJTm9kZUxpa2Uge1xyXG4gICAgZ2V0V29ybGRNYXRyaXgoKTogSU1hdHJpeExpa2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGFzcyB1c2VkIHRvIHJlbmRlciB0ZXh0IHVzaW5nIE1TREYgKE11bHRpLWNoYW5uZWwgU2lnbmVkIERpc3RhbmNlIEZpZWxkKSB0ZWNobmlxdWVcclxuICogVGhhbmtzIGEgbG90IHRvIHRoZSB3b3JrIG9mIEJodXNoYW5fV2FnaCBhbmQgemJfc2ogZm9yIHRoZWlyIGFtYXppbmcgd29yayBvbiBNU0RGIGZvciBCYWJ5bG9uLmpzXHJcbiAqICM2UkxDV1AjMTZcclxuICogU3RhciB3YXJzIHNjcm9sbGVyOiAjNlJMQ1dQIzI5XHJcbiAqIFdpdGggbWV0cmljczogIzZSTENXUCMzNVxyXG4gKiBUaGlja25lc3M6ICNJQUJNRVojM1xyXG4gKiBTb2xhciBzeXN0ZW06ICM5WUNEWUMjOVxyXG4gKiBTdHJva2U6ICM2UkxDV1AjMzdcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUZXh0UmVuZGVyZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF91c2VWQU86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2VuZ2luZTogQWJzdHJhY3RFbmdpbmU7XHJcbiAgICBwcml2YXRlIF9zaGFkZXJMYW5ndWFnZTogU2hhZGVyTGFuZ3VhZ2U7XHJcbiAgICBwcml2YXRlIF92ZXJ0ZXhCdWZmZXJzOiB7IFtrZXk6IHN0cmluZ106IFZlcnRleEJ1ZmZlciB9ID0ge307XHJcbiAgICBwcml2YXRlIF9zcHJpdGVCdWZmZXI6IE51bGxhYmxlPEJ1ZmZlcj47XHJcbiAgICBwcml2YXRlIF93b3JsZEJ1ZmZlcjogTnVsbGFibGU8QnVmZmVyPjtcclxuICAgIHByaXZhdGUgX3V2QnVmZmVyOiBOdWxsYWJsZTxCdWZmZXI+O1xyXG4gICAgcHJpdmF0ZSBfZHJhd1dyYXBwZXJCYXNlOiBEcmF3V3JhcHBlcjtcclxuICAgIHByaXZhdGUgX3ZlcnRleEFycmF5T2JqZWN0OiBXZWJHTFZlcnRleEFycmF5T2JqZWN0O1xyXG4gICAgcHJpdmF0ZSBfZm9udDogRm9udEFzc2V0O1xyXG4gICAgcHJpdmF0ZSBfY2hhck1hdHJpY2VzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIHByaXZhdGUgX2NoYXJVdnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgcHJpdmF0ZSBfaXNEaXJ0eSA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9iYXNlTGluZSA9IDA7XHJcblxyXG4gICAgLy8gQ2FjaGVcclxuICAgIHByaXZhdGUgX3NjYWxpbmdNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfZm9udFNjYWxlTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX29mZnNldE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGlvbk1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9iYXNlTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX3NjYWxlZE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9sb2NhbE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9maW5hbE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9saW5lTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX3BhcmVudFdvcmxkTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgY29sb3Igb2YgdGhlIHRleHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbG9yOiBJQ29sb3I0TGlrZSA9IHsgcjogMS4wLCBnOiAxLjAsIGI6IDEuMCwgYTogMS4wIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGNvbG9yIG9mIHRoZSBzdHJva2UgYXJvdW5kIHRoZSB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdHJva2VDb2xvcjogSUNvbG9yNExpa2UgPSB7IHI6IDEuMCwgZzogMS4wLCBiOiAxLjAsIGE6IDEuMCB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgc3Ryb2tlIGFyb3VuZCB0aGUgdGV4dCAoaW5zZXQpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdHJva2VJbnNldFdpZHRoID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgd2lkdGggb2YgdGhlIHN0cm9rZSBhcm91bmQgdGhlIHRleHQgKG91dHNldClcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cm9rZU91dHNldFdpZHRoID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB0ZXh0ICgwIG1lYW5zIGFzIGRlZmluZWQgaW4gdGhlIGZvbnQpXHJcbiAgICAgKiBWYWx1ZSBtdXN0IGJlIGJldHdlZW4gLTAuNSBhbmQgMC41XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0aGlja25lc3NDb250cm9sID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9wYXJlbnQ6IE51bGxhYmxlPElOb2RlTGlrZT4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBwYXJlbnQgb2YgdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJlbnQoKTogTnVsbGFibGU8SU5vZGVMaWtlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHBhcmVudCh2YWx1ZTogTnVsbGFibGU8SU5vZGVMaWtlPikge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RyYW5zZm9ybU1hdHJpeDogSU1hdHJpeExpa2UgPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IG9mIHRoZSB0ZXh0IHJlbmRlcmVyXHJcbiAgICAgKiBJdCB3aWxsIGJlIGFwcGxpZWQgaW4gdGhhdCBvcmRlcjpcclxuICAgICAqIHBhcmVudCB4IHRyYW5zZm9ybSB4IHBhcmFncmFwaCB3b3JsZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHRyYW5zZm9ybU1hdHJpeCgpOiBJTWF0cml4TGlrZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybU1hdHJpeDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRyYW5zZm9ybU1hdHJpeCh2YWx1ZTogSU1hdHJpeExpa2UpIHtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1NYXRyaXggPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBpZiB0aGUgdGV4dCBpcyBiaWxsYm9hcmRlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNCaWxsYm9hcmQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBpZiB0aGUgdGV4dCBpcyBzY3JlZW4gcHJvamVjdGVkXHJcbiAgICAgKiBUaGlzIHdpbGwgd29yayBvbmx5IGlmIHRoZSB0ZXh0IGlzIGJpbGxib2FyZGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0JpbGxib2FyZFNjcmVlblByb2plY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjaGFyYWN0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoIC8gMTY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIHRleHQgcmVuZGVyZXIgc2hvdWxkIGlnbm9yZSB0aGUgZGVwdGggYnVmZmVyXHJcbiAgICAgKiBEZWZhdWx0IGlzIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpZ25vcmVEZXB0aEJ1ZmZlciA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZW5naW5lOiBBYnN0cmFjdEVuZ2luZSwgc2hhZGVyTGFuZ3VhZ2U6IFNoYWRlckxhbmd1YWdlID0gU2hhZGVyTGFuZ3VhZ2UuR0xTTCwgZm9udDogRm9udEFzc2V0KSB7XHJcbiAgICAgICAgdGhpcy5fZW5naW5lID0gZW5naW5lO1xyXG4gICAgICAgIHRoaXMuX3NoYWRlckxhbmd1YWdlID0gc2hhZGVyTGFuZ3VhZ2U7XHJcbiAgICAgICAgdGhpcy5fZm9udCA9IGZvbnQ7XHJcbiAgICAgICAgdGhpcy5fYmFzZUxpbmUgPSBmb250Ll9mb250LmNvbW1vbi5saW5lSGVpZ2h0ICogZm9udC5zY2FsZTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXNlVkFPID0gZW5naW5lLmdldENhcHMoKS52ZXJ0ZXhBcnJheU9iamVjdCAmJiAhZW5naW5lLmRpc2FibGVWZXJ0ZXhBcnJheU9iamVjdHM7XHJcblxyXG4gICAgICAgIC8vIE1haW4gdmVydGV4IGJ1ZmZlclxyXG4gICAgICAgIGNvbnN0IHNwcml0ZURhdGEgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAxLCAwLCAwLCAxLCAxLCAxXSk7XHJcbiAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyID0gbmV3IEJ1ZmZlcihlbmdpbmUsIHNwcml0ZURhdGEsIGZhbHNlLCAyKTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1wib2Zmc2V0c1wiXSA9IHRoaXMuX3Nwcml0ZUJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJvZmZzZXRzXCIsIDAsIDIpO1xyXG5cclxuICAgICAgICAvLyBJbnN0YW5jZXNcclxuICAgICAgICB0aGlzLl9yZXNpemVCdWZmZXJzKDEyOCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzaXplQnVmZmVycyhjYXBhY2l0eTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmxkQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3V2QnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMuX2VuZ2luZSwgbmV3IEZsb2F0MzJBcnJheShjYXBhY2l0eSAqIDE2KSwgdHJ1ZSwgMTYpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDBcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDBcIiwgMCwgNCwgMTYsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDFcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDFcIiwgNCwgNCwgMTYsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDJcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDJcIiwgOCwgNCwgMTYsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ3b3JsZDNcIl0gPSB0aGlzLl93b3JsZEJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ3b3JsZDNcIiwgMTIsIDQsIDE2LCB0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXZCdWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMuX2VuZ2luZSwgbmV3IEZsb2F0MzJBcnJheShjYXBhY2l0eSAqIDQpLCB0cnVlLCA0KTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1widXZzXCJdID0gdGhpcy5fdXZCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwidXZzXCIsIDAsIDQsIDQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldFNoYWRlcnModmVydGV4OiBzdHJpbmcsIGZyYWdtZW50OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2U/LmRpc3Bvc2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlID0gbmV3IERyYXdXcmFwcGVyKHRoaXMuX2VuZ2luZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmF3V3JhcHBlckJhc2UuZHJhd0NvbnRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlLmRyYXdDb250ZXh0LnVzZUluc3RhbmNpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZS5lZmZlY3QgPSB0aGlzLl9lbmdpbmUuY3JlYXRlRWZmZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhTb3VyY2U6IHZlcnRleCxcclxuICAgICAgICAgICAgICAgIGZyYWdtZW50U291cmNlOiBmcmFnbWVudCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW1wib2Zmc2V0c1wiLCBcIndvcmxkMFwiLCBcIndvcmxkMVwiLCBcIndvcmxkMlwiLCBcIndvcmxkM1wiLCBcInV2c1wiXSxcclxuICAgICAgICAgICAgW1wicGFyZW50V29ybGRcIiwgXCJ2aWV3XCIsIFwicHJvamVjdGlvblwiLCBcInVDb2xvclwiLCBcInRoaWNrbmVzc1wiLCBcInVTdHJva2VDb2xvclwiLCBcInVTdHJva2VJbnNldFdpZHRoXCIsIFwidVN0cm9rZU91dHNldFdpZHRoXCIsIFwibW9kZVwiLCBcInRyYW5zZm9ybVwiXSxcclxuICAgICAgICAgICAgW1wiZm9udEF0bGFzXCJdLFxyXG4gICAgICAgICAgICBkZWZpbmVzLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRoaXMuX3NoYWRlckxhbmd1YWdlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlLmVmZmVjdC5fcmVmQ291bnQrKztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIHBhcmFncmFwaCBvZiB0ZXh0IHRvIHRoZSByZW5kZXJlclxyXG4gICAgICogQHBhcmFtIHRleHQgZGVmaW5lIHRoZSB0ZXh0IHRvIGFkZFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgZGVmaW5lIHRoZSBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIHBhcmFncmFwaCAob3B0aW9uYWwpXHJcbiAgICAgKiBAcGFyYW0gd29ybGRNYXRyaXggZGVmaW5lIHRoZSB3b3JsZCBtYXRyaXggdG8gdXNlIGZvciB0aGUgcGFyYWdyYXBoIChvcHRpb25hbClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFBhcmFncmFwaCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPFBhcmFncmFwaE9wdGlvbnM+LCB3b3JsZE1hdHJpeD86IElNYXRyaXhMaWtlKSB7XHJcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gbmV3IFNkZlRleHRQYXJhZ3JhcGgodGV4dCwgdGhpcy5fZm9udCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvbnRTY2FsZSA9IHRoaXMuX2ZvbnQuc2NhbGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleFdpZHRoID0gdGhpcy5fZm9udC5fZm9udC5jb21tb24uc2NhbGVXO1xyXG4gICAgICAgIGNvbnN0IHRleEhlaWdodCA9IHRoaXMuX2ZvbnQuX2ZvbnQuY29tbW9uLnNjYWxlSDtcclxuICAgICAgICBjb25zdCBnbHlwaHMgPSBwYXJhZ3JhcGguZ2x5cGhzLmZpbHRlcigoZykgPT4gZy5jaGFyLnBhZ2UgPj0gMCk7XHJcblxyXG4gICAgICAgIGxldCB3b3JsZE1hdHJpeFRvVXNlID0gd29ybGRNYXRyaXg7XHJcblxyXG4gICAgICAgIGlmICghd29ybGRNYXRyaXhUb1VzZSkge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyYWdyYXBoLmxpbmVIZWlnaHQgKiBmb250U2NhbGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVPZmZzZXQgPSAocGFyYWdyYXBoLmxpbmVzLmxlbmd0aCAqIGxpbmVIZWlnaHQpIC8gMjtcclxuICAgICAgICAgICAgVHJhbnNsYXRpb25NYXRyaXhUb1JlZigwLCB0aGlzLl9iYXNlTGluZSAtIGxpbmVPZmZzZXQsIDAsIHRoaXMuX2xpbmVNYXRyaXgpO1xyXG4gICAgICAgICAgICB3b3JsZE1hdHJpeFRvVXNlID0gdGhpcy5fbGluZU1hdHJpeDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFNjYWxpbmdNYXRyaXhUb1JlZihmb250U2NhbGUsIGZvbnRTY2FsZSwgMS4wLCB0aGlzLl9mb250U2NhbGVNYXRyaXgpO1xyXG4gICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoMC41LCAtMC41LCAwLCB0aGlzLl9vZmZzZXRNYXRyaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBjaGFyc1V2c0Jhc2UgPSB0aGlzLl9jaGFyVXZzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBtYXRyaWNlc0Jhc2UgPSB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoO1xyXG4gICAgICAgIGdseXBocy5mb3JFYWNoKChnLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAwXSA9IGcuY2hhci54IC8gdGV4V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAxXSA9IGcuY2hhci55IC8gdGV4SGVpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFyVXZzW2NoYXJzVXZzQmFzZSArIGkgKiA0ICsgMl0gPSBnLmNoYXIud2lkdGggLyB0ZXhXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDNdID0gZy5jaGFyLmhlaWdodCAvIHRleEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBnLnggKyBnLmNoYXIueG9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgeSA9IDEuMCAtIChnLnkgKyBnLmNoYXIueW9mZnNldCk7XHJcblxyXG4gICAgICAgICAgICBTY2FsaW5nTWF0cml4VG9SZWYoZy5jaGFyLndpZHRoLCBnLmNoYXIuaGVpZ2h0LCAxLjAsIHRoaXMuX3NjYWxpbmdNYXRyaXgpO1xyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fb2Zmc2V0TWF0cml4LCB0aGlzLl9zY2FsaW5nTWF0cml4LCB0aGlzLl9iYXNlTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoeCAqIGZvbnRTY2FsZSwgeSAqIGZvbnRTY2FsZSwgMC4wLCB0aGlzLl90cmFuc2xhdGlvbk1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9iYXNlTWF0cml4LCB0aGlzLl9mb250U2NhbGVNYXRyaXgsIHRoaXMuX3NjYWxlZE1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9zY2FsZWRNYXRyaXgsIHRoaXMuX3RyYW5zbGF0aW9uTWF0cml4LCB0aGlzLl9sb2NhbE1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fbG9jYWxNYXRyaXgsIHdvcmxkTWF0cml4VG9Vc2UsIHRoaXMuX2ZpbmFsTWF0cml4KTtcclxuICAgICAgICAgICAgQ29weU1hdHJpeFRvQXJyYXkodGhpcy5fZmluYWxNYXRyaXgsIHRoaXMuX2NoYXJNYXRyaWNlcywgbWF0cmljZXNCYXNlICsgaSAqIDE2KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2Jhc2VMaW5lIC09IHBhcmFncmFwaC5saW5lSGVpZ2h0ICogZm9udFNjYWxlICogcGFyYWdyYXBoLmxpbmVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlciB0aGUgdGV4dCB1c2luZyB0aGUgcHJvdmlkZWQgdmlldyBhbmQgcHJvamVjdGlvbiBtYXRyaWNlc1xyXG4gICAgICogQHBhcmFtIHZpZXdNYXRyaXggZGVmaW5lIHRoZSB2aWV3IG1hdHJpeCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uTWF0cml4IGRlZmluZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggdG8gdXNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXIodmlld01hdHJpeDogSU1hdHJpeExpa2UsIHByb2plY3Rpb25NYXRyaXg6IElNYXRyaXhMaWtlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJhd1dyYXBwZXIgPSB0aGlzLl9kcmF3V3JhcHBlckJhc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IGRyYXdXcmFwcGVyLmVmZmVjdCE7XHJcblxyXG4gICAgICAgIC8vIENoZWNrXHJcbiAgICAgICAgaWYgKCFlZmZlY3QuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZW5naW5lID0gdGhpcy5fZW5naW5lO1xyXG5cclxuICAgICAgICBlbmdpbmUuc2V0U3RhdGUoZmFsc2UpO1xyXG4gICAgICAgIGVuZ2luZS5lbmFibGVFZmZlY3QoZHJhd1dyYXBwZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pZ25vcmVEZXB0aEJ1ZmZlcikge1xyXG4gICAgICAgICAgICBlbmdpbmUuc2V0RGVwdGhCdWZmZXIoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICBDb3B5TWF0cml4VG9SZWYodGhpcy5fcGFyZW50LmdldFdvcmxkTWF0cml4KCksIHRoaXMuX3BhcmVudFdvcmxkTWF0cml4KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBJZGVudGl0eU1hdHJpeFRvUmVmKHRoaXMuX3BhcmVudFdvcmxkTWF0cml4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVmZmVjdC5zZXRJbnQoXCJtb2RlXCIsIHRoaXMuaXNCaWxsYm9hcmQgPyAodGhpcy5pc0JpbGxib2FyZFNjcmVlblByb2plY3RlZCA/IDIgOiAxKSA6IDApO1xyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJwYXJlbnRXb3JsZFwiLCB0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInZpZXdcIiwgdmlld01hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInByb2plY3Rpb25cIiwgcHJvamVjdGlvbk1hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInRyYW5zZm9ybVwiLCB0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIFRleHR1cmVcclxuICAgICAgICBlZmZlY3Quc2V0VGV4dHVyZShcImZvbnRBdGxhc1wiLCB0aGlzLl9mb250LnRleHR1cmVzWzBdKTtcclxuICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KFwidUNvbG9yXCIsIHRoaXMuY29sb3IpO1xyXG4gICAgICAgIGVmZmVjdC5zZXREaXJlY3RDb2xvcjQoXCJ1U3Ryb2tlQ29sb3JcIiwgdGhpcy5zdHJva2VDb2xvcik7XHJcbiAgICAgICAgZWZmZWN0LnNldEZsb2F0KFwidGhpY2tuZXNzXCIsIHRoaXMudGhpY2tuZXNzQ29udHJvbCAqIDAuOSk7XHJcbiAgICAgICAgZWZmZWN0LnNldEZsb2F0KFwidVN0cm9rZUluc2V0V2lkdGhcIiwgdGhpcy5zdHJva2VJbnNldFdpZHRoKTtcclxuICAgICAgICBlZmZlY3Quc2V0RmxvYXQoXCJ1U3Ryb2tlT3V0c2V0V2lkdGhcIiwgdGhpcy5zdHJva2VPdXRzZXRXaWR0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlQ291bnQgPSB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoIC8gMTY7XHJcblxyXG4gICAgICAgIC8vIE5lZWQgdXBkYXRlP1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0RpcnR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlciEuZ2V0QnVmZmVyKCkhLmNhcGFjaXR5IC8gNCA8IGluc3RhbmNlQ291bnQgKiAxNikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplQnVmZmVycyhpbnN0YW5jZUNvdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIhLnVwZGF0ZSh0aGlzLl9jaGFyTWF0cmljZXMpO1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlciEudXBkYXRlKHRoaXMuX2NoYXJVdnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3VzZVZBTykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCA9IChlbmdpbmUgYXMgVGhpbkVuZ2luZSkucmVjb3JkVmVydGV4QXJyYXlPYmplY3QodGhpcy5fdmVydGV4QnVmZmVycywgbnVsbCwgZWZmZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAoZW5naW5lIGFzIFRoaW5FbmdpbmUpLmJpbmRWZXJ0ZXhBcnJheU9iamVjdCh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCwgbnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVkJPc1xyXG4gICAgICAgICAgICBlbmdpbmUuYmluZEJ1ZmZlcnModGhpcy5fdmVydGV4QnVmZmVycywgbnVsbCwgZWZmZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVuZ2luZS5zZXRBbHBoYU1vZGUoQ29uc3RhbnRzLkFMUEhBX0NPTUJJTkUpO1xyXG4gICAgICAgIGVuZ2luZS5kcmF3QXJyYXlzVHlwZShDb25zdGFudHMuTUFURVJJQUxfVHJpYW5nbGVTdHJpcERyYXdNb2RlLCAwLCA0LCBpbnN0YW5jZUNvdW50KTtcclxuICAgICAgICBlbmdpbmUudW5iaW5kSW5zdGFuY2VBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgZW5naW5lLnNldEFscGhhTW9kZShDb25zdGFudHMuQUxQSEFfRElTQUJMRSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlnbm9yZURlcHRoQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIGVuZ2luZS5zZXREZXB0aEJ1ZmZlcih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91dkJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcHJpdGVCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAodGhpcy5fZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlbGVhc2VWZXJ0ZXhBcnJheU9iamVjdCh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCk7XHJcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgaW5zdGFuY2UgYXN5bmNocm9ub3VzbHlcclxuICAgICAqIEBwYXJhbSBmb250IGRlZmluZSB0aGUgZm9udCBhc3NldCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBlbmdpbmUgZGVmaW5lIHRoZSBlbmdpbmUgdG8gdXNlXHJcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBUZXh0UmVuZGVyZXIgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBDcmVhdGVUZXh0UmVuZGVyZXJBc3luYyhmb250OiBGb250QXNzZXQsIGVuZ2luZTogQWJzdHJhY3RFbmdpbmUpIHtcclxuICAgICAgICBpZiAoIWVuZ2luZS5nZXRDYXBzKCkuaW5zdGFuY2VkQXJyYXlzIHx8ICFlbmdpbmUuX2ZlYXR1cmVzLnN1cHBvcnRTcHJpdGVJbnN0YW5jaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluc3RhbmNlZCBhcnJheXMgYXJlIHJlcXVpcmVkIGZvciBNU0RGIHRleHQgcmVuZGVyaW5nLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLkdMU0w7XHJcbiAgICAgICAgbGV0IHZlcnRleDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZnJhZ21lbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKGVuZ2luZS5pc1dlYkdQVSkge1xyXG4gICAgICAgICAgICBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLldHU0w7XHJcbiAgICAgICAgICAgIHZlcnRleCA9IChhd2FpdCBpbXBvcnQoXCIuL3NoYWRlcnNXR1NML21zZGYudmVydGV4XCIpKS5tc2RmVmVydGV4U2hhZGVyV0dTTC5zaGFkZXI7XHJcbiAgICAgICAgICAgIGZyYWdtZW50ID0gKGF3YWl0IGltcG9ydChcIi4vc2hhZGVyc1dHU0wvbXNkZi5mcmFnbWVudFwiKSkubXNkZlBpeGVsU2hhZGVyV0dTTC5zaGFkZXI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmVydGV4ID0gKGF3YWl0IGltcG9ydChcIi4vc2hhZGVycy9tc2RmLnZlcnRleFwiKSkubXNkZlZlcnRleFNoYWRlci5zaGFkZXI7XHJcbiAgICAgICAgICAgIGZyYWdtZW50ID0gKGF3YWl0IGltcG9ydChcIi4vc2hhZGVycy9tc2RmLmZyYWdtZW50XCIpKS5tc2RmUGl4ZWxTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGV4dFJlbmRlcmVyID0gbmV3IFRleHRSZW5kZXJlcihlbmdpbmUsIHNoYWRlckxhbmd1YWdlLCBmb250KTtcclxuICAgICAgICB0ZXh0UmVuZGVyZXIuX3NldFNoYWRlcnModmVydGV4LCBmcmFnbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0UmVuZGVyZXI7XHJcbiAgICB9XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRoc19tYXRoX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlc1xyXG5pbXBvcnQgKiBhcyBhZGRvbnMgZnJvbSBcImFkZG9ucy9pbmRleFwiO1xyXG5cclxuZXhwb3J0IHsgYWRkb25zIH07XHJcbmV4cG9ydCBkZWZhdWx0IGFkZG9ucztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("babylonjs")):"function"==typeof define&&define.amd?define("babylonjs-addons",["babylonjs"],t):"object"==typeof exports?exports["babylonjs-addons"]=t(require("babylonjs")):e.ADDONS=t(e.BABYLON)}("undefined"!=typeof self?self:"undefined"!=typeof global?global:this,(e=>(()=>{"use strict";var t={36:(e,t,r)=>{r.r(t),r.d(t,{msdfVertexShader:()=>s});var i=r(597),n="msdfVertexShader",o="#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\nattribute vec2 offsets;attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;attribute vec4 uvs;uniform mat4 transform;uniform mat4 parentWorld;uniform mat4 view;uniform mat4 projection;uniform vec3 center;uniform int mode;varying vec2 atlasUV;void main(void) {mat4 world=mat4(world0,world1,world2,world3);vec4 worldPos=transform*(world*vec4(offsets.xy-vec2(0.5,0.5),0.,1.0));if (mode>=BILLBOARD) {vec3 viewPos=(view*parentWorld*vec4(0.,0.,0.,1.0)).xyz; \nif (mode==BILLBOARDSCREENPROJECTED) {viewPos.x/=viewPos.z;viewPos.y/=viewPos.z;viewPos.z=1.0;}\ngl_Position=projection*vec4(viewPos+worldPos.xyz,1.0); } else {vec3 viewPos=(view*parentWorld*worldPos).xyz; \ngl_Position=projection*vec4(viewPos,1.0); }\natlasUV=vec2(uvs.x+offsets.x*uvs.z,uvs.y+(1.0-offsets.y)*uvs.w);}";i.ShaderStore.ShadersStore[n]||(i.ShaderStore.ShadersStore[n]=o);var s={name:n,shader:o}},115:(e,t,r)=>{r.r(t),r.d(t,{msdfPixelShaderWGSL:()=>s});var i=r(597),n="msdfPixelShader",o="var fontAtlas: texture_2d<f32>;var fontAtlasSampler: sampler;uniform uColor: vec4f;uniform thickness: f32;uniform uStrokeColor: vec4f;uniform uStrokeInsetWidth: f32;uniform uStrokeOutsetWidth: f32;varying atlasUV: vec2f;fn median(msdf: vec3<f32>)->f32 {let a=min(msdf.r,msdf.g);let b=max(msdf.r,msdf.g);return max(a,min(b,msdf.b));}\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {let s=textureSample(fontAtlas,fontAtlasSampler,input.atlasUV).rgb;let sigDist=median(s)-0.5+uniforms.thickness;let afwidth=length(vec2<f32>(dpdx(sigDist),dpdy(sigDist)));let alpha=clamp(sigDist/afwidth+0.5,0.0,1.0);let sigDistOutset=sigDist+uniforms.uStrokeOutsetWidth*0.5;let sigDistInset=sigDist-uniforms.uStrokeInsetWidth*0.5;let afwidthOutset=length(vec2<f32>(dpdx(sigDistOutset),dpdy(sigDistOutset)));let afwidthInset=length(vec2<f32>(dpdx(sigDistInset),dpdy(sigDistInset)));let outset=clamp(sigDistOutset/afwidthOutset+0.5,0.0,1.0);let inset=1.0-clamp(sigDistInset/afwidthInset+0.5,0.0,1.0);let border=outset*inset;let filledFragColor=vec4<f32>(uniforms.uColor.rgb,alpha*uniforms.uColor.a);let strokedFragColor=vec4<f32>(uniforms.uStrokeColor.rgb,border*uniforms.uStrokeColor.a);fragmentOutputs.color=mix(filledFragColor,strokedFragColor,border);}";i.ShaderStore.ShadersStoreWGSL[n]||(i.ShaderStore.ShadersStoreWGSL[n]=o);var s={name:n,shader:o}},370:(e,t,r)=>{r.r(t),r.d(t,{msdfPixelShader:()=>s});var i=r(597),n="msdfPixelShader",o="#extension GL_OES_standard_derivatives : enable\nprecision highp float;uniform sampler2D fontAtlas;uniform vec4 uColor;uniform vec4 uStrokeColor;uniform float uStrokeInsetWidth;uniform float uStrokeOutsetWidth;uniform float thickness;varying vec2 atlasUV;float median(vec3 msdf) {return max(min(msdf.r,msdf.g),min(max(msdf.r,msdf.g),msdf.b));}\nvoid main(void)\n{vec3 s=texture2D(fontAtlas,atlasUV).rgb;float sigDist=median(s)-0.5+thickness;float alpha=clamp(sigDist/fwidth(sigDist)+0.5,0.0,1.0);float sigDistOutset=sigDist+uStrokeOutsetWidth*0.5;float sigDistInset=sigDist-uStrokeInsetWidth*0.5;float outset=clamp(sigDistOutset/fwidth(sigDistOutset)+0.5,0.0,1.0);float inset=1.0-clamp(sigDistInset/fwidth(sigDistInset)+0.5,0.0,1.0);float border=outset*inset;vec4 filledFragColor=vec4(uColor.rgb,alpha*uColor.a);vec4 strokedFragColor=vec4(uStrokeColor.rgb,border*uStrokeColor.a);gl_FragColor=mix(filledFragColor,strokedFragColor,border);}";i.ShaderStore.ShadersStore[n]||(i.ShaderStore.ShadersStore[n]=o);var s={name:n,shader:o}},597:t=>{t.exports=e},681:(e,t,r)=>{r.r(t),r.d(t,{msdfVertexShaderWGSL:()=>s});var i=r(597),n="msdfVertexShader",o="#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\nattribute offsets: vec2f;attribute world0: vec4f;attribute world1: vec4f;attribute world2: vec4f;attribute world3: vec4f;attribute uvs: vec4f;uniform transform: mat4x4f;uniform parentWorld: mat4x4f;uniform view: mat4x4f;uniform projection: mat4x4f;uniform mode: u32;varying atlasUV: vec2f;@vertex\nfn main(input: VertexInputs)->FragmentInputs {let world=mat4x4<f32>(input.world0,input.world1,input.world2,input.world3);let localOffset=vec4<f32>(input.offsets-vec2<f32>(0.5,0.5),0.0,1.0);let worldPos=uniforms.transform*world*localOffset;if (uniforms.mode>=BILLBOARD) { \nvar viewPos=(uniforms.view*uniforms.parentWorld*vec4f(0.,0.,0.,1.0)).xyz;if (uniforms.mode==BILLBOARDSCREENPROJECTED) {viewPos=vec3f(viewPos.x/viewPos.z,viewPos.y/viewPos.z,1.0);} \nvertexOutputs.position=uniforms.projection*vec4<f32>(viewPos+worldPos.xyz,1.0);} else { \nlet viewPos=(uniforms.view*uniforms.parentWorld*worldPos).xyz;vertexOutputs.position=uniforms.projection*vec4<f32>(viewPos,1.0);}\nvertexOutputs.atlasUV=vec2<f32>(\ninput.uvs.x+input.offsets.x*input.uvs.z,\ninput.uvs.y+(1.0-input.offsets.y)*input.uvs.w\n);}";i.ShaderStore.ShadersStoreWGSL[n]||(i.ShaderStore.ShadersStoreWGSL[n]=o);var s={name:n,shader:o}}},r={};function i(e){var n=r[e];if(void 0!==n)return n.exports;var o=r[e]={exports:{}};return t[e](o,o.exports,i),o.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};i.d(n,{default:()=>F});var o={};i.r(o),i.d(o,{DefaultParagraphOptions:()=>D,FitStrategy:()=>R,FontAsset:()=>T,HtmlMesh:()=>W,HtmlMeshRenderer:()=>c,PointerEventsCaptureBehavior:()=>I,SdfTextParagraph:()=>k,TextRenderer:()=>L,msdfPixelShader:()=>z.msdfPixelShader,msdfPixelShaderWGSL:()=>U.msdfPixelShaderWGSL,msdfVertexShader:()=>j.msdfVertexShader,msdfVertexShaderWGSL:()=>V.msdfVertexShaderWGSL});var s=i(597),a=100,l=function(e){return function(t,r){var i=t.getMesh(),n=r.getMesh(),o=i.isHtmlMesh,s=n.isHtmlMesh;return o?s&&i.absolutePosition.z<=n.absolutePosition.z?1:-1:s?1:e(t,r)}},c=function(){function e(e,t){var r=void 0===t?{}:t,i=r.parentContainerId,n=void 0===i?null:i,o=r._containerId,a=void 0===o?"css-container":o,l=r.enableOverlayRender,c=void 0===l||l,h=r.defaultOpaqueRenderOrder,d=void 0===h?s.RenderingGroup.PainterSortCompare:h,u=r.defaultAlphaTestRenderOrder,f=void 0===u?s.RenderingGroup.PainterSortCompare:u,p=r.defaultTransparentRenderOrder,v=void 0===p?s.RenderingGroup.defaultTransparentSortCompare:p,m=this;this._cache={cameraData:{fov:0,position:new s.Vector3,style:""},htmlMeshData:new WeakMap},this._width=0,this._height=0,this._heightHalf=0,this._temp={scaleTransform:new s.Vector3,rotationTransform:new s.Quaternion,positionTransform:new s.Vector3,objectMatrix:s.Matrix.Identity(),cameraWorldMatrix:s.Matrix.Identity(),cameraRotationMatrix:s.Matrix.Identity(),cameraWorldMatrixAsArray:new Array(16)},this._lastDevicePixelRatio=window.devicePixelRatio,this._cameraMatrixUpdated=!0,this._previousCanvasDocumentPosition={top:0,left:0},this._renderObserver=null,this._onCameraMatrixChanged=function(e){m._cameraWorldMatrix=e.getWorldMatrix(),m._cameraMatrixUpdated=!0},"undefined"!=typeof document&&(this._containerId=a,this._init(e,n,c,d,f,v))}return e.prototype.dispose=function(){var e,t;this._renderObserver&&(this._renderObserver.remove(),this._renderObserver=null),null===(e=this._overlayElements)||void 0===e||e.container.remove(),this._overlayElements=null,null===(t=this._inSceneElements)||void 0===t||t.container.remove(),this._inSceneElements=null},e.prototype._init=function(e,t,r,i,n,o){var s,a=this;if("undefined"!=typeof document){var c=t?document.getElementById(t):document.body;c||(c=document.body);var h="".concat(this._containerId,"_in_scene");if(this._inSceneElements=this._createRenderLayerElements(h),c.insertBefore(this._inSceneElements.container,c.firstChild),r){var d="".concat(this._containerId,"_overlay");this._overlayElements=this._createRenderLayerElements(d);var u=+(null!==(s=e.getEngine().getRenderingCanvas().style.zIndex)&&void 0!==s?s:"0")+1;this._overlayElements.container.style.zIndex="".concat(u),this._overlayElements.container.style.pointerEvents="none",c.insertBefore(this._overlayElements.container,c.firstChild)}this._engine=e.getEngine();var f,p,v=this._engine.getRenderingCanvasClientRect();if(!v)throw new Error("Failed to get client rect for rendering canvas");this._setSize(v.width,v.height),this._engine.onResizeObservable.add((function(){var e=a._engine.getRenderingCanvasClientRect();e&&a._setSize(e.width,e.height)}));var m=function(){var t=e.activeCamera;t&&(f=t.onProjectionMatrixChangedObservable.add((function(){a._onCameraMatrixChanged(t)})),p=t.onViewMatrixChangedObservable.add((function(){a._onCameraMatrixChanged(t)})))};m(),e.onActiveCameraChanged.add((function(){var t,r;f&&(null===(t=e.activeCamera)||void 0===t||t.onProjectionMatrixChangedObservable.remove(f)),p&&(null===(r=e.activeCamera)||void 0===r||r.onViewMatrixChangedObservable.remove(p)),m()}));var _=l(i),g=l(n),y=l(o);e.setRenderingOrder(0,_,g,y),this._renderObserver=e.onBeforeRenderObservable.add((function(){a._render(e,e.activeCamera)}))}},e.prototype._createRenderLayerElements=function(e){var t=document.getElementById(e);t&&t.remove();var r=document.createElement("div");r.id=e,r.style.position="absolute",r.style.width="100%",r.style.height="100%",r.style.zIndex="-1";var i=document.createElement("div");i.style.overflow="hidden";var n=document.createElement("div");return n.style.webkitTransformStyle="preserve-3d",n.style.transformStyle="preserve-3d",n.style.pointerEvents="none",i.appendChild(n),r.appendChild(i),{container:r,domElement:i,cameraElement:n}},e.prototype._getSize=function(){return{width:this._width,height:this._height}},e.prototype._setSize=function(e,t){if(this._width=e,this._height=t,this._heightHalf=this._height/2,this._inSceneElements&&this._overlayElements)for(var r=0,i=[this._inSceneElements.domElement,this._overlayElements.domElement,this._inSceneElements.cameraElement,this._overlayElements.cameraElement];r<i.length;r++){var n=i[r];n&&(n.style.width="".concat(e,"px"),n.style.height="".concat(t,"px"))}},e.prototype._getCameraCssMatrix=function(e){var t=e.m;return"matrix3d(".concat(this._epsilon(t[0]),",").concat(this._epsilon(-t[1]),",").concat(this._epsilon(t[2]),",").concat(this._epsilon(t[3]),",").concat(this._epsilon(t[4]),",").concat(this._epsilon(-t[5]),",").concat(this._epsilon(t[6]),",").concat(this._epsilon(t[7]),",").concat(this._epsilon(t[8]),",").concat(this._epsilon(-t[9]),",").concat(this._epsilon(t[10]),",").concat(this._epsilon(t[11]),",").concat(this._epsilon(t[12]),",").concat(this._epsilon(-t[13]),",").concat(this._epsilon(t[14]),",").concat(this._epsilon(t[15]),")")},e.prototype._getHtmlContentCssMatrix=function(e,t){var r=e.m,i=t?-1:1;return"matrix3d(".concat(this._epsilon(r[0]),",").concat(this._epsilon(r[1]),",").concat(this._epsilon(r[2]*-i),",").concat(this._epsilon(r[3]),",").concat(this._epsilon(-r[4]),",").concat(this._epsilon(-r[5]),",").concat(this._epsilon(r[6]*i),",").concat(this._epsilon(-r[7]),",").concat(this._epsilon(r[8]*-i),",").concat(this._epsilon(r[9]*-i),",").concat(this._epsilon(r[10]),",").concat(this._epsilon(r[11]*i),",").concat(this._epsilon(r[12]*i),",").concat(this._epsilon(r[13]*i),",").concat(this._epsilon(r[14]*i),",").concat(this._epsilon(r[15]),")")},e.prototype._getTransformationMatrix=function(e,t){var r;if(this._cameraWorldMatrix||(this._cameraWorldMatrix=null===(r=e.getScene().activeCamera)||void 0===r?void 0:r.getWorldMatrix()),!this._cameraWorldMatrix)return s.Matrix.Identity();var i=e.getWorldMatrix(),n=1,o=1;e.sourceWidth&&e.sourceHeight&&(n=e.width/(e.sourceWidth/a),o=e.height/(e.sourceHeight/a));var l=this._temp.scaleTransform,c=this._temp.rotationTransform,h=this._temp.positionTransform,d=this._temp.objectMatrix;i.decompose(l,c,h),l.x*=n,l.y*=o,s.Matrix.ComposeToRef(l,c,h,d);var u=t?-1:1,f=e.getAbsolutePosition();return d.setRowFromFloats(3,(-this._cameraWorldMatrix.m[12]+f.x)*a*u,(-this._cameraWorldMatrix.m[13]+f.y)*a*u,(this._cameraWorldMatrix.m[14]-f.z)*a,1e-5*this._cameraWorldMatrix.m[15]*a),d.multiplyAtIndex(3,a),d.multiplyAtIndex(7,a),d.multiplyAtIndex(11,a),d},e.prototype._renderHtmlMesh=function(e,t){var r,i;if(e.element&&e.element.firstElementChild){var n=this._cache.htmlMeshData.get(e);n||(n={style:""},this._cache.htmlMeshData.set(e,n));var o=e._isCanvasOverlay?null===(r=this._overlayElements)||void 0===r?void 0:r.cameraElement:null===(i=this._inSceneElements)||void 0===i?void 0:i.cameraElement;e.element.parentNode!==o&&o.appendChild(e.element),e.requiresUpdate&&this._updateBaseScaleFactor(e);var s=this._getTransformationMatrix(e,t),a="translate(-50%, -50%) ".concat(this._getHtmlContentCssMatrix(s,t));a+="".concat(t?"matrix3d(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1)":""),n.style!==a&&(e.element.style.webkitTransform=a,e.element.style.transform=a),e._markAsUpdated()}},e.prototype._render=function(e,t){var r,i,n,o,a=!1,l=e.useRightHandedSystem;this._updateContainerPositionIfNeeded(),this._cameraMatrixUpdated&&(this._cameraMatrixUpdated=!1,a=!0),t.position.x===this._cache.cameraData.position.x&&t.position.y===this._cache.cameraData.position.y&&t.position.z===this._cache.cameraData.position.z||(this._cache.cameraData.position.copyFrom(t.position),a=!0),window.devicePixelRatio!==this._lastDevicePixelRatio&&(this._lastDevicePixelRatio=window.devicePixelRatio,s.Logger.Log("In render - dpr changed: ",this._lastDevicePixelRatio),a=!0);var c=e.meshes.filter((function(e){return e.isHtmlMesh&&(a||e.requiresUpdate)}));if(a=a||c.length>0){var h=t.getProjectionMatrix().m[5]*this._heightHalf;if(this._cache.cameraData.fov!==h){var d=[null===(r=this._overlayElements)||void 0===r?void 0:r.domElement,null===(i=this._inSceneElements)||void 0===i?void 0:i.domElement];if(t.mode==s.Camera.PERSPECTIVE_CAMERA)for(var u=0,f=d;u<f.length;u++)(M=f[u])&&(M.style.webkitPerspective=h+"px",M.style.perspective=h+"px");else for(var p=0,v=d;p<v.length;p++)(M=v[p])&&(M.style.webkitPerspective="",M.style.perspective="");this._cache.cameraData.fov=h}null===t.parent&&t.computeWorldMatrix();var m=this._temp.cameraWorldMatrix;m.copyFrom(t.getWorldMatrix());var _=this._temp.cameraRotationMatrix;m.getRotationMatrix().transposeToRef(_);var g=this._temp.cameraWorldMatrixAsArray;m.copyToArray(g);var y=l?1:-1;g[1]=_.m[1],g[2]=_.m[2]*y,g[4]=_.m[4]*y,g[6]=_.m[6]*y,g[8]=_.m[8]*y,g[9]=_.m[9]*y,s.Matrix.FromArrayToRef(g,0,m);var x=this._getCameraCssMatrix(m);if(this._cache.cameraData.style!==x){for(var b=0,w=d=[null===(n=this._inSceneElements)||void 0===n?void 0:n.cameraElement,null===(o=this._overlayElements)||void 0===o?void 0:o.cameraElement];b<w.length;b++){var M;(M=w[b])&&(M.style.webkitTransform=x,M.style.transform=x)}this._cache.cameraData.style=x}for(var S=0,C=c;S<C.length;S++){var E=C[S];this._renderHtmlMesh(E,l)}}},e.prototype._updateBaseScaleFactor=function(e){var t=this._width,r=this._height,i=(e.width||1)/(e.height||1);i>t/r?t=r*i:r=t/i,e.setContentSizePx(t,r)},e.prototype._updateContainerPositionIfNeeded=function(){var e,t,r=this._engine.getRenderingCanvasClientRect();if(r){var i=window.scrollY,n=window.scrollX,o=r.top+i,a=r.left+n;if(this._previousCanvasDocumentPosition.top!==o||this._previousCanvasDocumentPosition.left!==a){this._previousCanvasDocumentPosition.top=o,this._previousCanvasDocumentPosition.left=a;for(var l=0,c=[null===(e=this._inSceneElements)||void 0===e?void 0:e.container,null===(t=this._overlayElements)||void 0===t?void 0:t.container];l<c.length;l++){var h=c[l];if(h){var d=h.offsetParent,u=d.getBoundingClientRect(),f=u.top+i,p=u.left+n,v=this._getAncestorMarginsAndPadding(d),m=window.getComputedStyle(document.body),_=parseInt(m.marginTop,10),g=parseInt(m.marginLeft,10);h.style.top="".concat(o-f-v.marginTop+v.paddingTop+_,"px"),h.style.left="".concat(a-p-v.marginLeft+v.paddingLeft+g,"px")}}}}else s.Logger.Warn("Failed to update html mesh renderer position due to failure to get canvas rect. HtmlMesh instances may not render correctly")},e.prototype._epsilon=function(e){return Math.abs(e)<1e-10?0:e},e.prototype._getAncestorMarginsAndPadding=function(e){for(var t=0,r=0,i=0,n=0;e&&e!==document.body&&e!==document.documentElement;){var o=window.getComputedStyle(e);t+=parseInt(o.marginTop,10),r+=parseInt(o.marginLeft,10),i+=parseInt(o.paddingTop,10),n+=parseInt(o.paddingLeft,10),e=e.offsetParent}return{marginTop:t,marginLeft:r,paddingTop:i,paddingLeft:n}},e}(),h=function(e,t){return h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},h(e,t)};var d=function(){return d=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},d.apply(this,arguments)};Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var u,f=[],p=new Map,v=[],m=null,_=function(e){M("In pointerEventsCapture.requestRelease - Pointer events release requested for ".concat(e)),e&&e!==m?g(e)?p.delete(e):(M("In pointerEventsCapture.requestRelease - Received release request ".concat(e," but no matching capture request was received")),v.includes(e)||v.push(e)):y()},g=function(e){var t=!1;return f=f.filter((function(r){return r!==e||(t=!0,M("In pointerEventsCapture.cancelRequest - Canceling pointer events capture request ".concat(e)),!1)})),t},y=function(){var e=w();M("In pointerEventsCapture.transferPointerEventsOwnership - Transferrring pointer events from ".concat(m," to ").concat(e)),x(),e&&b(e)},x=function(){var e;M("In pointerEventsCapture.doRelease - Releasing pointer events from ".concat(m)),m&&(null===(e=p.get(m))||void 0===e||e.release(),p.delete(m),m=null)},b=function(e){var t;e&&(null===(t=p.get(e))||void 0===t||t.capture()),m=e,M("In pointerEventsCapture.doCapture - Pointer events now captured by ".concat(e))},w=function(){return f.length>0?f.shift():null},M=function(e){("undefined"==typeof window||window["pointer-events-capture-debug"])&&s.Tools.Log("".concat(performance.now()," - game.scene.pointerEvents - ").concat(e,"\ncurrentOwner: ").concat(m,"\nqueue: ").concat(f,"\nunmatched: ").concat(v))},S=null,C=0,E=new WeakMap,O=function(e){"undefined"!=typeof document&&(0===C&&(document.addEventListener("pointermove",A),document.addEventListener("touchstart",A),S=null!=S?S:e,s.Logger.Log("PointerEventsCaptureBehavior: Starting observation of pointer move events."),S.onDisposeObservable.add(P)),C++)},P=function(){document.removeEventListener("pointermove",A),document.removeEventListener("touchstart",A),S=null,s.Logger.Log("PointerEventsCaptureBehavior: Stopping observation of pointer move events."),C=0},B=function(){"undefined"!=typeof document&&S&&--C<=0&&P()},A=function(e){if(S){var t=S.getEngine().getRenderingCanvasClientRect();if(t){var r,i="touches"in e?e.touches[0]:e,n=i.clientX,o=i.clientY,s=n-t.left,a=o-t.top,l=S.pick(s,a,(function(e){var t=E.get(e);return e.isEnabled()&&void 0!==t&&t._captureOnPointerEnter}));r=l.hit?l.pickedMesh:null;var c=parseInt(m||"");r&&r.uniqueId===c||(!c||r&&r.uniqueId===c||_(m),r&&E.get(r).capturePointerEvents())}}},I=function(){function e(e,t,r){var i=(void 0===r?{}:r).captureOnPointerEnter,n=void 0===i||i;this._captureCallback=e,this._releaseCallback=t,this.name="PointerEventsCaptureBehavior",this._attachedMesh=null,this._captureOnPointerEnter=n,"undefined"==typeof document&&s.Logger.Warn("Creating an instance of PointerEventsCaptureBehavior outside of a browser. The behavior will not work.")}return Object.defineProperty(e.prototype,"attachedMesh",{get:function(){return this._attachedMesh},set:function(e){this._attachedMesh=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"captureOnPointerEnter",{set:function(e){this._captureOnPointerEnter!==e&&(this._captureOnPointerEnter=e,this._attachedMesh&&(this._captureOnPointerEnter?O(this._attachedMesh.getScene()):B()))},enumerable:!1,configurable:!0}),e.prototype.init=function(){},e.prototype.attach=function(e){this.attachedMesh=e,E.set(e,this),this._captureOnPointerEnter&&O(e.getScene())},e.prototype.detach=function(){this.attachedMesh&&(E.delete(this.attachedMesh),this._captureOnPointerEnter&&B(),this.attachedMesh=null)},e.prototype.dispose=function(){this.detach()},e.prototype.releasePointerEvents=function(){this.attachedMesh&&_(this.attachedMesh.uniqueId.toString())},e.prototype.capturePointerEvents=function(){var e,t,r;this.attachedMesh&&(e=this.attachedMesh.uniqueId.toString(),t=this._captureCallback,r=this._releaseCallback,M("In pointerEventsCapture.requestCapture - Pointer events capture requested for ".concat(e)),function(e){var t=!1;return v=v.filter((function(r){return r!==e||(t=!0,!1)})),t}(e)?M("In pointerEventsCapture.requestCapture - Capture request matched previous release request ".concat(e,". Cancelling capture request")):(e!==m&&function(e,t,r){M("In pointerEventsCapture.enqueueCaptureRequest - Enqueueing capture request for ".concat(e)),f.includes(e)||(f.push(e),p.set(e,{capture:t,release:r}))}(e,t,r),m||y()))},e}(),R={CONTAIN:{wrapElement:function(e){var t=document.createElement("div");t.style.display="flex",t.style.justifyContent="center",t.style.alignItems="center";var r=document.createElement("div");return r.style.visibility="hidden",r.appendChild(e),t.appendChild(r),t},updateSize:function(e,t,r){var i=e.firstElementChild;e.style.width="".concat(t,"px"),e.style.height="".concat(r,"px");var n=[i.offsetWidth,i.offsetHeight],o=n[0],s=n[1],a=Math.min(t/o,r/s);i.style.transform="scale(".concat(a,")"),i.style.visibility="visible"}},COVER:{wrapElement:function(e){var t=document.createElement("div");t.style.display="flex",t.style.justifyContent="center",t.style.alignItems="center",t.style.overflow="hidden";var r=document.createElement("div");return r.style.visibility="hidden",r.appendChild(e),t.appendChild(r),t},updateSize:function(e,t,r){var i=e.firstElementChild;e.style.width="".concat(t,"px"),e.style.height="".concat(r,"px");var n=[i.offsetWidth,i.offsetHeight],o=n[0],s=n[1],a=Math.max(t/o,r/s);i.style.transform="scale(".concat(a,")"),i.style.visibility="visible"}},STRETCH:{wrapElement:function(e){var t=document.createElement("div");t.style.display="flex",t.style.justifyContent="center",t.style.alignItems="center";var r=document.createElement("div");return r.style.visibility="hidden",r.appendChild(e),t.appendChild(r),t},updateSize:function(e,t,r){var i=e.firstElementChild;e.style.width="".concat(t,"px"),e.style.height="".concat(r,"px");var n=[i.offsetWidth,i.offsetHeight],o=n[0],s=n[1];i.style.transform="scale(".concat(t/o,", ").concat(r/s,")"),i.style.visibility="visible"}},NONE:{wrapElement:function(e){return e},updateSize:function(e,t,r){e&&(e.style.width="".concat(t,"px"),e.style.height="".concat(r,"px"))}}},W=function(e){function t(t,r,i){var n=void 0===i?{}:i,o=n.captureOnPointerEnter,a=void 0===o||o,l=n.isCanvasOverlay,c=void 0!==l&&l,h=n.fitStrategy,d=void 0===h?R.NONE:h,u=e.call(this,r,t)||this;return u._enabled=!1,u._ready=!1,u._isCanvasOverlay=!1,u._requiresUpdate=!0,u._inverseScaleMatrix=null,u._captureOnPointerEnter=!0,u._pointerEventCaptureBehavior=null,u._sourceWidth=null,u._sourceHeight=null,u._fitStrategy=R.NONE,"undefined"==typeof document?(s.Logger.Warn("Creating an instance of an HtmlMesh with id ".concat(r," outside of a browser. The mesh will not be visible.")),u):(u._fitStrategy=d,u._isCanvasOverlay=c,u._createMask(),u._element=u._createElement(),u.setEnabled(!0),u._captureOnPointerEnter=a,u._pointerEventCaptureBehavior=new I(u.capturePointerEvents.bind(u),u.releasePointerEvents.bind(u),{captureOnPointerEnter:u._captureOnPointerEnter}),u.addBehavior(u._pointerEventCaptureBehavior),u)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}h(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}(t,e),Object.defineProperty(t.prototype,"isHtmlMesh",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sourceWidth",{get:function(){return this._sourceWidth},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sourceHeight",{get:function(){return this._sourceHeight},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"width",{get:function(){return this._width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this._height},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this._element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"requiresUpdate",{get:function(){return this._requiresUpdate},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"captureOnPointerEnter",{set:function(e){this._captureOnPointerEnter=e,this._pointerEventCaptureBehavior&&(this._pointerEventCaptureBehavior.captureOnPointerEnter=e)},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){var t;e.prototype.dispose.call(this),null===(t=this._element)||void 0===t||t.remove(),this._element=void 0,this._pointerEventCaptureBehavior&&(this._pointerEventCaptureBehavior.dispose(),this._pointerEventCaptureBehavior=null)},t.prototype._markAsUpdated=function(){this._requiresUpdate=!1},t.prototype.setContent=function(e,t,r){this._setAsReady(!1),this._sourceWidth=null,this._sourceHeight=null,this._element&&(this._width=t,this._height=r,this._requiresUpdate=!0,this.scaling.setAll(1),e&&(this._element.appendChild(this._fitStrategy.wrapElement(e)),this._updateScaleIfNecessary()),this.sourceWidth&&this.sourceHeight&&this._setAsReady(!0))},t.prototype.setEnabled=function(e){this._enabled=e,e&&!this._ready||this._doSetEnabled(e)},t.prototype.setContentSizePx=function(e,t){this._sourceWidth=e,this._sourceHeight=t,this._element&&this._element.firstElementChild&&(this._fitStrategy.updateSize(this._element.firstElementChild,e,t),this._updateScaleIfNecessary(),this.width&&this.height&&this._setAsReady(!0))},t.prototype._setAsReady=function(e){this._ready=e,e?this._doSetEnabled(this._enabled):this._doSetEnabled(!1)},t.prototype._doSetEnabled=function(t){var r,i=this;this._element&&(t&&!this._worldMatrixUpdateObserver?this._worldMatrixUpdateObserver=this.onAfterWorldMatrixUpdateObservable.add((function(){i._requiresUpdate=!0})):t||(null===(r=this._worldMatrixUpdateObserver)||void 0===r||r.remove(),this._worldMatrixUpdateObserver=null),this._element.style.display=t?"":"none",this._setElementzIndex(-1e4*this.position.z),e.prototype.setEnabled.call(this,t))},t.prototype._updateScaleIfNecessary=function(){this.scaling.setAll(1),this._inverseScaleMatrix&&(this.bakeTransformIntoVertices(this._inverseScaleMatrix),this._inverseScaleMatrix=null);var e=this._width||1,t=this._height||1,r=s.Matrix.Scaling(e,t,1);this.bakeTransformIntoVertices(r),this._inverseScaleMatrix=new s.Matrix,r.invertToRef(this._inverseScaleMatrix)},t.prototype._createMask=function(){(0,s.CreatePlaneVertexData)({width:1,height:1}).applyToMesh(this);var e=this.getScene();this.checkCollisions=!0;var t=new s.StandardMaterial("".concat(this.id,"-mat"),e);this._isCanvasOverlay||(t.backFaceCulling=!1,t.disableColorWrite=!0,t.disableLighting=!0),this.material=t,this.material.freeze()},t.prototype._setElementzIndex=function(e){this._element&&(this._element.style.zIndex="".concat(e))},t.prototype.capturePointerEvents=function(){this._element&&(this._element.style.pointerEvents="auto",document.getElementsByTagName("body")[0].style.pointerEvents="none")},t.prototype.releasePointerEvents=function(){this._element&&(document.getElementsByTagName("body")[0].style.pointerEvents="auto",this._element.style.pointerEvents="none")},t.prototype._createElement=function(){if("undefined"!=typeof document){var e=document.createElement("div");return e.id=this.id,e.style.backgroundColor=this._isCanvasOverlay?"transparent":"#000",e.style.zIndex="1",e.style.position="absolute",e.style.pointerEvents="none",e.style.backfaceVisibility="hidden",e}},t}(s.Mesh);!function(e){e[e.SPACE=32]="SPACE",e[e.TOFU=65532]="TOFU"}(u||(u={}));var T=function(){function e(e,t,r){var i=this;this._chars=new Map,this._kernings=new Map,this._font=JSON.parse(e),this._font.pages=[t],this._font.chars.forEach((function(e){return i._chars.set(e.id,e)})),this._font.kernings.forEach((function(e){var t=i._kernings.get(e.first);t||(t=new Map,i._kernings.set(e.first,t)),t.set(e.second,e.amount)})),this._charsRegex=new RegExp("[".concat(this._font.chars.map((function(e){return e.char.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")})).join(""),"]"),"g"),this._updateFallbacks(),this.scale=1/this._font.info.size,this.textures=this._font.pages.map((function(e){var t=new s.Texture(e,r,{noMipmap:!1,invertY:!1});return t.anisotropicFilteringLevel=16,t}))}return e.prototype.dispose=function(){for(var e=0,t=this.textures;e<t.length;e++)t[e].dispose();this.textures.length=0},e.prototype._updateFallbacks=function(){this._chars.has(u.SPACE)||this._chars.set(u.SPACE,{id:u.SPACE,x:0,y:0,width:0,height:0,xoffset:0,yoffset:0,xadvance:.5*this._font.info.size,page:-1,chnl:-1,index:-1,char:" "}),this._chars.has(u.TOFU)||this._chars.set(u.TOFU,{id:u.TOFU,x:0,y:0,width:this._font.info.size,height:this._font.info.size,xoffset:0,yoffset:0,xadvance:.5*this._font.info.size,page:-1,chnl:-1,index:-1,char:""})},e.prototype._getChar=function(e){return this._chars.get(e)||this._chars.get(u.TOFU)},e.prototype._getKerning=function(e,t){var r;return(null===(r=this._kernings.get(e))||void 0===r?void 0:r.get(t))||0},e.prototype._unsupportedChars=function(e){return e.replace(this._charsRegex,"")},e}(),D={maxWidth:1/0,lineHeight:1,letterSpacing:1,tabSize:4,whiteSpace:"pre-line",textAlign:"center",translate:{x:-.5,y:-.5}},k=function(){function e(e,t,r){this.text=e,this.fontAsset=t,this.options=d(d({},D),r);var i=this._computeMetrics(e),n=i.paragraph,o=i.lines,s=i.glyphs,a=i.width,l=i.height;this.paragraph=n,this.lines=o,this.glyphs=s,this.width=a,this.height=l}return Object.defineProperty(e.prototype,"lineHeight",{get:function(){return this.fontAsset._font.common.lineHeight*this.options.lineHeight},enumerable:!1,configurable:!0}),e.prototype._computeMetrics=function(e){for(var t=this,r=this._collapse(e),i=this._breakLines(r).map((function(e){return e.trim()})),n=[],o=0,s=i;o<s.length;o++){var a=s[o];n.push.apply(n,this._wrap(a,n.length))}var l=Math.max.apply(Math,n.map((function(e){return e.width}))),c=this.lineHeight*n.length;("left"!==this.options.textAlign||this.options.translate)&&n.forEach((function(e){for(var r=function(){switch(t.options.textAlign){case"right":return l-e.width;case"center":return(l-e.width)/2;default:return 0}}(),i=t.options.translate?t.options.translate.x*l:0,n=t.options.translate?t.options.translate.y*c:0,o=0,s=e.glyphs;o<s.length;o++){var a=s[o];a.x+=r,a.x+=i,a.y+=n}}));var h=n.flatMap((function(e){return e.glyphs}));return{paragraph:i.join("\n"),lines:n,glyphs:h,width:l,height:c}},e.prototype._breakLines=function(e){return e.split("\n")},e.prototype._collapse=function(e){return e.replace(/\t/g," ".repeat(this.options.tabSize)).replace(/ +/g," ")},e.prototype._wrap=function(e,t){void 0===t&&(t=0);for(var r,i=new Array,n=t,o=new Array,s=0,a=0,l=0,c=l,h=function(){i.push({text:e.slice(l,c),glyphs:o,start:l,end:c,width:a})};c<e.length;){var d=c,u=e.charCodeAt(d),f=this.fontAsset._getChar(u),p=f.width,v=(s+=r?this.fontAsset._getKerning(r.id,f.id):0)+p,m=f.xadvance+this.options.letterSpacing,_=s+m,g=_>this.options.maxWidth||v>this.options.maxWidth;g&&(h(),n++,r=void 0,s=0,a=0,c=(l=c)+1,o=[]);var y=s,x=n*this.lineHeight;o.push({char:f,line:n,position:o.length,x:y,y:x}),g?s=m:(r=f,s=_,a=v,c++)}return o.length>0&&h(),i},e}(),L=function(){function e(e,t,r){void 0===t&&(t=0),this._useVAO=!1,this._vertexBuffers={},this._charMatrices=new Array,this._charUvs=new Array,this._isDirty=!0,this._baseLine=0,this._scalingMatrix=new s.ThinMatrix,this._fontScaleMatrix=new s.ThinMatrix,this._offsetMatrix=new s.ThinMatrix,this._translationMatrix=new s.ThinMatrix,this._baseMatrix=new s.ThinMatrix,this._scaledMatrix=new s.ThinMatrix,this._localMatrix=new s.ThinMatrix,this._finalMatrix=new s.ThinMatrix,this._lineMatrix=new s.ThinMatrix,this._parentWorldMatrix=new s.ThinMatrix,this.color={r:1,g:1,b:1,a:1},this.strokeColor={r:1,g:1,b:1,a:1},this.strokeInsetWidth=0,this.strokeOutsetWidth=0,this.thicknessControl=0,this._parent=null,this._transformMatrix=new s.ThinMatrix,this.isBillboard=!1,this.isBillboardScreenProjected=!1,this.ignoreDepthBuffer=!1,this._engine=e,this._shaderLanguage=t,this._font=r,this._baseLine=r._font.common.lineHeight*r.scale,this._useVAO=e.getCaps().vertexArrayObject&&!e.disableVertexArrayObjects;var i=new Float32Array([0,0,1,0,0,1,1,1]);this._spriteBuffer=new s.Buffer(e,i,!1,2),this._vertexBuffers.offsets=this._spriteBuffer.createVertexBuffer("offsets",0,2),this._resizeBuffers(128)}return Object.defineProperty(e.prototype,"parent",{get:function(){return this._parent},set:function(e){this._parent=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"transformMatrix",{get:function(){return this._transformMatrix},set:function(e){this._transformMatrix=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"characterCount",{get:function(){return this._charMatrices.length/16},enumerable:!1,configurable:!0}),e.prototype._resizeBuffers=function(e){this._worldBuffer&&(this._worldBuffer.dispose(),this._worldBuffer=null),this._uvBuffer&&(this._uvBuffer.dispose(),this._uvBuffer=null),this._worldBuffer=new s.Buffer(this._engine,new Float32Array(16*e),!0,16),this._vertexBuffers.world0=this._worldBuffer.createVertexBuffer("world0",0,4,16,!0),this._vertexBuffers.world1=this._worldBuffer.createVertexBuffer("world1",4,4,16,!0),this._vertexBuffers.world2=this._worldBuffer.createVertexBuffer("world2",8,4,16,!0),this._vertexBuffers.world3=this._worldBuffer.createVertexBuffer("world3",12,4,16,!0),this._uvBuffer=new s.Buffer(this._engine,new Float32Array(4*e),!0,4),this._vertexBuffers.uvs=this._uvBuffer.createVertexBuffer("uvs",0,4,4,!0)},e.prototype._setShaders=function(e,t){var r;null===(r=this._drawWrapperBase)||void 0===r||r.dispose(),this._drawWrapperBase=new s.DrawWrapper(this._engine),this._drawWrapperBase.drawContext&&(this._drawWrapperBase.drawContext.useInstancing=!0),this._drawWrapperBase.effect=this._engine.createEffect({vertexSource:e,fragmentSource:t},["offsets","world0","world1","world2","world3","uvs"],["parentWorld","view","projection","uColor","thickness","uStrokeColor","uStrokeInsetWidth","uStrokeOutsetWidth","mode","transform"],["fontAtlas"],"",void 0,void 0,void 0,void 0,this._shaderLanguage),this._drawWrapperBase.effect._refCount++},e.prototype.addParagraph=function(e,t,r){var i=this,n=new k(e,this._font,t),o=this._font.scale,a=this._font._font.common.scaleW,l=this._font._font.common.scaleH,c=n.glyphs.filter((function(e){return e.char.page>=0})),h=r;if(!h){var d=n.lineHeight*o,u=n.lines.length*d/2;(0,s.TranslationMatrixToRef)(0,this._baseLine-u,0,this._lineMatrix),h=this._lineMatrix}(0,s.ScalingMatrixToRef)(o,o,1,this._fontScaleMatrix),(0,s.TranslationMatrixToRef)(.5,-.5,0,this._offsetMatrix);var f=this._charUvs.length,p=this._charMatrices.length;c.forEach((function(e,t){i._charUvs[f+4*t+0]=e.char.x/a,i._charUvs[f+4*t+1]=e.char.y/l,i._charUvs[f+4*t+2]=e.char.width/a,i._charUvs[f+4*t+3]=e.char.height/l;var r=e.x+e.char.xoffset,n=1-(e.y+e.char.yoffset);(0,s.ScalingMatrixToRef)(e.char.width,e.char.height,1,i._scalingMatrix),(0,s.MultiplyMatricesToRef)(i._offsetMatrix,i._scalingMatrix,i._baseMatrix),(0,s.TranslationMatrixToRef)(r*o,n*o,0,i._translationMatrix),(0,s.MultiplyMatricesToRef)(i._baseMatrix,i._fontScaleMatrix,i._scaledMatrix),(0,s.MultiplyMatricesToRef)(i._scaledMatrix,i._translationMatrix,i._localMatrix),(0,s.MultiplyMatricesToRef)(i._localMatrix,h,i._finalMatrix),(0,s.CopyMatrixToArray)(i._finalMatrix,i._charMatrices,p+16*t)})),this._isDirty=!0,this._baseLine-=n.lineHeight*o*n.lines.length},e.prototype.render=function(e,t){var r=this._drawWrapperBase,i=r.effect;if(i.isReady()){var n=this._engine;n.setState(!1),n.enableEffect(r),this.ignoreDepthBuffer&&n.setDepthBuffer(!1),this._parent?(0,s.CopyMatrixToRef)(this._parent.getWorldMatrix(),this._parentWorldMatrix):(0,s.IdentityMatrixToRef)(this._parentWorldMatrix),i.setInt("mode",this.isBillboard?this.isBillboardScreenProjected?2:1:0),i.setMatrix("parentWorld",this._parentWorldMatrix),i.setMatrix("view",e),i.setMatrix("projection",t),i.setMatrix("transform",this.transformMatrix),i.setTexture("fontAtlas",this._font.textures[0]),i.setDirectColor4("uColor",this.color),i.setDirectColor4("uStrokeColor",this.strokeColor),i.setFloat("thickness",.9*this.thicknessControl),i.setFloat("uStrokeInsetWidth",this.strokeInsetWidth),i.setFloat("uStrokeOutsetWidth",this.strokeOutsetWidth);var o=this._charMatrices.length/16;this._isDirty&&(this._isDirty=!1,this._worldBuffer.getBuffer().capacity/4<16*o&&this._resizeBuffers(o),this._worldBuffer.update(this._charMatrices),this._uvBuffer.update(this._charUvs)),this._useVAO?(this._vertexArrayObject||(this._vertexArrayObject=n.recordVertexArrayObject(this._vertexBuffers,null,i)),n.bindVertexArrayObject(this._vertexArrayObject,null)):n.bindBuffers(this._vertexBuffers,null,i),n.setAlphaMode(s.Constants.ALPHA_COMBINE),n.drawArraysType(s.Constants.MATERIAL_TriangleStripDrawMode,0,4,o),n.unbindInstanceAttributes(),n.setAlphaMode(s.Constants.ALPHA_DISABLE),this.ignoreDepthBuffer&&n.setDepthBuffer(!0)}},e.prototype.dispose=function(){this._worldBuffer&&(this._worldBuffer.dispose(),this._worldBuffer=null),this._uvBuffer&&(this._uvBuffer.dispose(),this._uvBuffer=null),this._spriteBuffer&&(this._spriteBuffer.dispose(),this._spriteBuffer=null),this._vertexArrayObject&&(this._engine.releaseVertexArrayObject(this._vertexArrayObject),this._vertexArrayObject=null)},e.CreateTextRendererAsync=function(t,r){return n=this,o=void 0,a=function(){var n,o,s,a;return function(e,t){var r,i,n,o={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(l){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(r=1,i&&(n=2&a[0]?i.return:a[0]?i.throw||((n=i.return)&&n.call(i),0):i.next)&&!(n=n.call(i,a[1])).done)return n;switch(i=0,n&&(a=[2&a[0],n.value]),a[0]){case 0:case 1:n=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,i=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!((n=(n=o.trys).length>0&&n[n.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!n||a[1]>n[0]&&a[1]<n[3])){o.label=a[1];break}if(6===a[0]&&o.label<n[1]){o.label=n[1],n=a;break}if(n&&o.label<n[2]){o.label=n[2],o.ops.push(a);break}n[2]&&o.ops.pop(),o.trys.pop();continue}a=t.call(e,o)}catch(e){a=[6,e],i=0}finally{r=n=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}}(this,(function(l){switch(l.label){case 0:if(!r.getCaps().instancedArrays||!r._features.supportSpriteInstancing)throw new Error("Instanced arrays are required for MSDF text rendering.");return n=0,o="",s="",r.isWebGPU?(n=1,[4,Promise.resolve().then(i.bind(i,681))]):[3,3];case 1:return o=l.sent().msdfVertexShaderWGSL.shader,[4,Promise.resolve().then(i.bind(i,115))];case 2:return s=l.sent().msdfPixelShaderWGSL.shader,[3,6];case 3:return[4,Promise.resolve().then(i.bind(i,36))];case 4:return o=l.sent().msdfVertexShader.shader,[4,Promise.resolve().then(i.bind(i,370))];case 5:s=l.sent().msdfPixelShader.shader,l.label=6;case 6:return(a=new e(r,n,t))._setShaders(o,s),[2,a]}}))},new((s=void 0)||(s=Promise))((function(e,t){function r(e){try{l(a.next(e))}catch(e){t(e)}}function i(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof s?n:new s((function(e){e(n)}))).then(r,i)}l((a=a.apply(n,o||[])).next())}));var n,o,s,a},e}(),j=i(36),z=i(370),V=i(681),U=i(115);const F=o;return n.default})()));
|
2
|
+
//# sourceMappingURL=babylonjs.addons.min.js.map
|