@vonage/ml-transformers 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ml-transformers.es.js +14 -11
- package/dist/ml-transformers.umd.js +31 -31
- package/dist/types/src/filters/background-filter.d.ts +2 -1
- package/dist/types/src/processors/processor-worker.d.ts +1 -1
- package/dist/types/src/transformers/background-transformer.d.ts +2 -2
- package/package.json +1 -1
|
@@ -28422,7 +28422,7 @@ class BackgroundFilter {
|
|
|
28422
28422
|
this.backgroundVideo.inputVideo = videoBGReadable;
|
|
28423
28423
|
}
|
|
28424
28424
|
async setVirtualBGImage(image) {
|
|
28425
|
-
this.
|
|
28425
|
+
this.virtualBGImage = image;
|
|
28426
28426
|
this.backgroundImage.inputBackgroundImage = await this.backgroundResizer.process(image);
|
|
28427
28427
|
}
|
|
28428
28428
|
async process(foreground, mask) {
|
|
@@ -28438,7 +28438,7 @@ class BackgroundFilter {
|
|
|
28438
28438
|
(_e = this.activePipeline) == null ? void 0 : _e.run();
|
|
28439
28439
|
}
|
|
28440
28440
|
}
|
|
28441
|
-
resizeForeground(width, height) {
|
|
28441
|
+
async resizeForeground(width, height) {
|
|
28442
28442
|
var _a;
|
|
28443
28443
|
this.canvas.width = width;
|
|
28444
28444
|
this.canvas.height = height;
|
|
@@ -28446,6 +28446,9 @@ class BackgroundFilter {
|
|
|
28446
28446
|
this.backgroundVideo.resizeOutput(width, height);
|
|
28447
28447
|
this.backgroundResizer.resizeForeground(width, height);
|
|
28448
28448
|
(_a = this.activePipeline) == null ? void 0 : _a.resizeOutput(width, height);
|
|
28449
|
+
if (this.virtualBGImage) {
|
|
28450
|
+
this.backgroundImage.inputBackgroundImage = await this.backgroundResizer.process(this.virtualBGImage);
|
|
28451
|
+
}
|
|
28449
28452
|
}
|
|
28450
28453
|
getBlurSize(radius = BlurRadius.Low) {
|
|
28451
28454
|
switch (radius) {
|
|
@@ -29279,10 +29282,10 @@ class BackgroundTransformer {
|
|
|
29279
29282
|
if (input.width !== this.previousDimensions.width || input.height !== this.previousDimensions.height) {
|
|
29280
29283
|
this.previousDimensions.width = input.width;
|
|
29281
29284
|
this.previousDimensions.height = input.height;
|
|
29282
|
-
(_a = this.backgroundFilter) == null ? void 0 : _a.resizeForeground(
|
|
29285
|
+
await ((_a = this.backgroundFilter) == null ? void 0 : _a.resizeForeground(
|
|
29283
29286
|
input.width,
|
|
29284
29287
|
input.height
|
|
29285
|
-
);
|
|
29288
|
+
));
|
|
29286
29289
|
}
|
|
29287
29290
|
await ((_b = this.backgroundFilter) == null ? void 0 : _b.process(input, mask));
|
|
29288
29291
|
frame.close();
|
|
@@ -29303,13 +29306,13 @@ class BackgroundTransformer {
|
|
|
29303
29306
|
var _a;
|
|
29304
29307
|
await ((_a = this.backgroundFilter) == null ? void 0 : _a.setBackgroundOptions(options));
|
|
29305
29308
|
}
|
|
29306
|
-
setVideoBGReadable(stream) {
|
|
29309
|
+
async setVideoBGReadable(stream) {
|
|
29307
29310
|
var _a;
|
|
29308
|
-
(_a = this.backgroundFilter) == null ? void 0 : _a.setVideoBGReadable(stream);
|
|
29311
|
+
await ((_a = this.backgroundFilter) == null ? void 0 : _a.setVideoBGReadable(stream));
|
|
29309
29312
|
}
|
|
29310
|
-
setVirtualBGImage(image) {
|
|
29313
|
+
async setVirtualBGImage(image) {
|
|
29311
29314
|
var _a;
|
|
29312
|
-
(_a = this.backgroundFilter) == null ? void 0 : _a.setVirtualBGImage(image);
|
|
29315
|
+
await ((_a = this.backgroundFilter) == null ? void 0 : _a.setVirtualBGImage(image));
|
|
29313
29316
|
}
|
|
29314
29317
|
setFlickeringOptions(options) {
|
|
29315
29318
|
var _a;
|
|
@@ -29350,8 +29353,8 @@ const _ProcessorWorker = class {
|
|
|
29350
29353
|
setVideoBGReadable(stream) {
|
|
29351
29354
|
this.backgroundTransformer.setVideoBGReadable(stream);
|
|
29352
29355
|
}
|
|
29353
|
-
setVirtualBGImage(image) {
|
|
29354
|
-
this.backgroundTransformer.setVirtualBGImage(image);
|
|
29356
|
+
async setVirtualBGImage(image) {
|
|
29357
|
+
await this.backgroundTransformer.setVirtualBGImage(image);
|
|
29355
29358
|
}
|
|
29356
29359
|
async terminate() {
|
|
29357
29360
|
await this.mediaProcessor.destroy();
|
|
@@ -29367,7 +29370,7 @@ let ProcessorWorker = _ProcessorWorker;
|
|
|
29367
29370
|
(() => {
|
|
29368
29371
|
A("ProcessorWorker", _ProcessorWorker);
|
|
29369
29372
|
})();
|
|
29370
|
-
const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBIZT0ocj0+KHJbci5JTklUPTBdPSJJTklUIixyW3IuRk9SV0FSRD0xXT0iRk9SV0FSRCIscltyLlRFUk1JTkFURT0yXT0iVEVSTUlOQVRFIixyKSkoSGV8fHt9KTtmdW5jdGlvbiBqaShyKXtyZXR1cm5bSW1hZ2VCaXRtYXAsUmVhZGFibGVTdHJlYW0sV3JpdGFibGVTdHJlYW1dLnNvbWUoZT0+ciBpbnN0YW5jZW9mIGUpfWZ1bmN0aW9uIE90KHIsZSl7Y29uc3R7aWQ6dH09cixuPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnQscmVzdWx0OmV9LG4uZmlsdGVyKGk9PmppKGkpKSl9YXN5bmMgZnVuY3Rpb24gcWkocixlKXtjb25zdHtmdW5jdGlvbk5hbWU6dCxhcmdzOm59PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighdCl0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2VbdF0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3R9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDtPdChyLGF3YWl0IGUuaW5zdGFuY2VbdF0oLi4ubiE9bnVsbD9uOltdKSl9ZnVuY3Rpb24ga3IoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWNvbnN0IExyPXt9O2Z1bmN0aW9uIFhpKHIsZSl7ZS53b3JrZXJJZD1yLGtyKCkmJihMcltlLndvcmtlcklkXT1lKX1mdW5jdGlvbiBZaShyLGUpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBjbGFzc05hbWUgd2hpbGUgaW5pdGlhbGl6aW5nIHdvcmtlciI7Y29uc3RbdF09ci5hcmdzLG49THJbdF07aWYobillLmluc3RhbmNlPW5ldyBuKHIuYXJncy5zbGljZSgxKSk7ZWxzZSB0aHJvd2B1bmtub3duIHdvcmtlciBjbGFzcyAke3R9YDtPdChyLHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBLaShyLGUpe2NvbnN0e2FyZ3M6dH09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi50IT1udWxsP3Q6W10pKSxPdChyLG4pfWZ1bmN0aW9uIEppKCl7Y29uc3Qgcj17fTtvbm1lc3NhZ2U9YXN5bmMgZT0+e2NvbnN0IHQ9ZS5kYXRhO3N3aXRjaCh0LnR5cGUpe2Nhc2UgSGUuSU5JVDpZaSh0LHIpO2JyZWFrO2Nhc2UgSGUuRk9SV0FSRDpxaSh0LHIpO2JyZWFrO2Nhc2UgSGUuVEVSTUlOQVRFOktpKHQscik7YnJlYWt9fX1rcigpJiZKaSgpO2NsYXNzIFp7fVoudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxaLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgTXQ9e2V4cG9ydHM6e319LCRyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBpPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxpKX19LFFpPSRyLHRlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gTnQocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocil9ZnVuY3Rpb24gVXQocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBaaShyKXtyZXR1cm4gciE9PW51bGwmJiFVdChyKSYmci5jb25zdHJ1Y3RvciE9PW51bGwmJiFVdChyLmNvbnN0cnVjdG9yKSYmdHlwZW9mIHIuY29uc3RydWN0b3IuaXNCdWZmZXI9PSJmdW5jdGlvbiImJnIuY29uc3RydWN0b3IuaXNCdWZmZXIocil9ZnVuY3Rpb24genIocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0ifWZ1bmN0aW9uIGVvKHIpe3JldHVybiB0ZS5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiB0byhyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJnpyKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIHJvKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gbm8ocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBHcihyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBWZShyKXtpZih0ZS5jYWxsKHIpIT09IltvYmplY3QgT2JqZWN0XSIpcmV0dXJuITE7dmFyIGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiBlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV9ZnVuY3Rpb24gaW8ocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gb28ocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gc28ocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBCbG9iXSJ9ZnVuY3Rpb24gSHIocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGFvKHIpe3JldHVybiBHcihyKSYmSHIoci5waXBlKX1mdW5jdGlvbiB1byhyKXtyZXR1cm4gdGUuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIGNvKHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gZm8oKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gQnQocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxOdChyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBpIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsaSkmJmUuY2FsbChudWxsLHJbaV0saSxyKX1mdW5jdGlvbiBrdCgpe3ZhciByPXt9O2Z1bmN0aW9uIGUoaSxvKXtWZShyW29dKSYmVmUoaSk/cltvXT1rdChyW29dLGkpOlZlKGkpP3Jbb109a3Qoe30saSk6TnQoaSk/cltvXT1pLnNsaWNlKCk6cltvXT1pfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKUJ0KGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBsbyhyLGUsdCl7cmV0dXJuIEJ0KGUsZnVuY3Rpb24oaSxvKXt0JiZ0eXBlb2YgaT09ImZ1bmN0aW9uIj9yW29dPVFpKGksdCk6cltvXT1pfSkscn1mdW5jdGlvbiBtbyhyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyICQ9e2lzQXJyYXk6TnQsaXNBcnJheUJ1ZmZlcjp6cixpc0J1ZmZlcjpaaSxpc0Zvcm1EYXRhOmVvLGlzQXJyYXlCdWZmZXJWaWV3OnRvLGlzU3RyaW5nOnJvLGlzTnVtYmVyOm5vLGlzT2JqZWN0OkdyLGlzUGxhaW5PYmplY3Q6VmUsaXNVbmRlZmluZWQ6VXQsaXNEYXRlOmlvLGlzRmlsZTpvbyxpc0Jsb2I6c28saXNGdW5jdGlvbjpIcixpc1N0cmVhbTphbyxpc1VSTFNlYXJjaFBhcmFtczp1byxpc1N0YW5kYXJkQnJvd3NlckVudjpmbyxmb3JFYWNoOkJ0LG1lcmdlOmt0LGV4dGVuZDpsbyx0cmltOmNvLHN0cmlwQk9NOm1vfSx4ZT0kO2Z1bmN0aW9uIFZyKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBXcj1mdW5jdGlvbihlLHQsbil7aWYoIXQpcmV0dXJuIGU7dmFyIGk7aWYobilpPW4odCk7ZWxzZSBpZih4ZS5pc1VSTFNlYXJjaFBhcmFtcyh0KSlpPXQudG9TdHJpbmcoKTtlbHNle3ZhciBvPVtdO3hlLmZvckVhY2godCxmdW5jdGlvbih1LGYpe3U9PT1udWxsfHx0eXBlb2YgdT09InVuZGVmaW5lZCJ8fCh4ZS5pc0FycmF5KHUpP2Y9ZisiW10iOnU9W3VdLHhlLmZvckVhY2godSxmdW5jdGlvbihkKXt4ZS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6eGUuaXNPYmplY3QoZCkmJihkPUpTT04uc3RyaW5naWZ5KGQpKSxvLnB1c2goVnIoZikrIj0iK1ZyKGQpKX0pKX0pLGk9by5qb2luKCImIil9aWYoaSl7dmFyIHM9ZS5pbmRleE9mKCIjIik7cyE9PS0xJiYoZT1lLnNsaWNlKDAscykpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK2l9cmV0dXJuIGV9LGhvPSQ7ZnVuY3Rpb24gV2UoKXt0aGlzLmhhbmRsZXJzPVtdfVdlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6bj9uLnN5bmNocm9ub3VzOiExLHJ1bldoZW46bj9uLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LFdlLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sV2UucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7aG8uZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKG4pe24hPT1udWxsJiZlKG4pfSl9O3ZhciBwbz1XZSx5bz0kLF9vPWZ1bmN0aW9uKGUsdCl7eW8uZm9yRWFjaChlLGZ1bmN0aW9uKGksbyl7byE9PXQmJm8udG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKSYmKGVbdF09aSxkZWxldGUgZVtvXSl9KX0sanI9ZnVuY3Rpb24oZSx0LG4saSxvKXtyZXR1cm4gZS5jb25maWc9dCxuJiYoZS5jb2RlPW4pLGUucmVxdWVzdD1pLGUucmVzcG9uc2U9byxlLmlzQXhpb3NFcnJvcj0hMCxlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzp0aGlzLmNvbmZpZyxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19LGV9LHhvPWpyLHFyPWZ1bmN0aW9uKGUsdCxuLGksbyl7dmFyIHM9bmV3IEVycm9yKGUpO3JldHVybiB4byhzLHQsbixpLG8pfSxibz1xcixnbz1mdW5jdGlvbihlLHQsbil7dmFyIGk9bi5jb25maWcudmFsaWRhdGVTdGF0dXM7IW4uc3RhdHVzfHwhaXx8aShuLnN0YXR1cyk/ZShuKTp0KGJvKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrbi5zdGF0dXMsbi5jb25maWcsbnVsbCxuLnJlcXVlc3QsbikpfSxqZT0kLHZvPWplLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24odCxuLGksbyxzLGEpe3ZhciB1PVtdO3UucHVzaCh0KyI9IitlbmNvZGVVUklDb21wb25lbnQobikpLGplLmlzTnVtYmVyKGkpJiZ1LnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShpKS50b0dNVFN0cmluZygpKSxqZS5pc1N0cmluZyhvKSYmdS5wdXNoKCJwYXRoPSIrbyksamUuaXNTdHJpbmcocykmJnUucHVzaCgiZG9tYWluPSIrcyksYT09PSEwJiZ1LnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT11LmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24odCl7dmFyIG49ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK3QrIik9KFteO10qKSIpKTtyZXR1cm4gbj9kZWNvZGVVUklDb21wb25lbnQoblszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGUodCwiIixEYXRlLm5vdygpLTg2NGU1KX19fSgpOmZ1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSgpLEVvPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LFRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LEFvPUVvLHdvPVRvLFJvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFBbyh0KT93byhlLHQpOnR9LEx0PSQsU289WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSxJbz1mdW5jdGlvbihlKXt2YXIgdD17fSxuLGksbztyZXR1cm4gZSYmTHQuZm9yRWFjaChlLnNwbGl0KGAKYCksZnVuY3Rpb24oYSl7aWYobz1hLmluZGV4T2YoIjoiKSxuPUx0LnRyaW0oYS5zdWJzdHIoMCxvKSkudG9Mb3dlckNhc2UoKSxpPUx0LnRyaW0oYS5zdWJzdHIobysxKSksbil7aWYodFtuXSYmU28uaW5kZXhPZihuKT49MClyZXR1cm47bj09PSJzZXQtY29va2llIj90W25dPSh0W25dP3Rbbl06W10pLmNvbmNhdChbaV0pOnRbbl09dFtuXT90W25dKyIsICIraTppfX0pLHR9LFhyPSQsRm89WHIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlPS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIiksbjtmdW5jdGlvbiBpKG8pe3ZhciBzPW87cmV0dXJuIGUmJih0LnNldEF0dHJpYnV0ZSgiaHJlZiIscykscz10LmhyZWYpLHQuc2V0QXR0cmlidXRlKCJocmVmIixzKSx7aHJlZjp0LmhyZWYscHJvdG9jb2w6dC5wcm90b2NvbD90LnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDp0Lmhvc3Qsc2VhcmNoOnQuc2VhcmNoP3Quc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6dC5oYXNoP3QuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnQuaG9zdG5hbWUscG9ydDp0LnBvcnQscGF0aG5hbWU6dC5wYXRobmFtZS5jaGFyQXQoMCk9PT0iLyI/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZX19cmV0dXJuIG49aSh3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24ocyl7dmFyIGE9WHIuaXNTdHJpbmcocyk/aShzKTpzO3JldHVybiBhLnByb3RvY29sPT09bi5wcm90b2NvbCYmYS5ob3N0PT09bi5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiEwfX0oKTtmdW5jdGlvbiAkdChyKXt0aGlzLm1lc3NhZ2U9cn0kdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sJHQucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIHFlPSR0LFhlPSQsUG89Z28sRG89dm8sQ289V3IsT289Um8sTW89SW8sTm89Rm8senQ9cXIsVW89S2UsQm89cWUsWXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4saSl7dmFyIG89ZS5kYXRhLHM9ZS5oZWFkZXJzLGE9ZS5yZXNwb25zZVR5cGUsdTtmdW5jdGlvbiBmKCl7ZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi51bnN1YnNjcmliZSh1KSxlLnNpZ25hbCYmZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHUpfVhlLmlzRm9ybURhdGEobykmJmRlbGV0ZSBzWyJDb250ZW50LVR5cGUiXTt2YXIgYz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZD1lLmF1dGgudXNlcm5hbWV8fCIiLHA9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtzLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShkKyI6IitwKX12YXIgeT1PbyhlLmJhc2VVUkwsZS51cmwpO2Mub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLENvKHksZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksYy50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBtKCl7aWYoISFjKXt2YXIgYj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIGM/TW8oYy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxnPSFhfHxhPT09InRleHQifHxhPT09Impzb24iP2MucmVzcG9uc2VUZXh0OmMucmVzcG9uc2UsVD17ZGF0YTpnLHN0YXR1czpjLnN0YXR1cyxzdGF0dXNUZXh0OmMuc3RhdHVzVGV4dCxoZWFkZXJzOmIsY29uZmlnOmUscmVxdWVzdDpjfTtQbyhmdW5jdGlvbihMKXtuKEwpLGYoKX0sZnVuY3Rpb24oTCl7aShMKSxmKCl9LFQpLGM9bnVsbH19aWYoIm9ubG9hZGVuZCJpbiBjP2Mub25sb2FkZW5kPW06Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshY3x8Yy5yZWFkeVN0YXRlIT09NHx8Yy5zdGF0dXM9PT0wJiYhKGMucmVzcG9uc2VVUkwmJmMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KG0pfSxjLm9uYWJvcnQ9ZnVuY3Rpb24oKXshY3x8KGkoenQoIlJlcXVlc3QgYWJvcnRlZCIsZSwiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsKX0sYy5vbmVycm9yPWZ1bmN0aW9uKCl7aSh6dCgiTmV0d29yayBFcnJvciIsZSxudWxsLGMpKSxjPW51bGx9LGMub250aW1lb3V0PWZ1bmN0aW9uKCl7dmFyIGc9ZS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLFQ9ZS50cmFuc2l0aW9uYWx8fFVvLnRyYW5zaXRpb25hbDtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJihnPWUudGltZW91dEVycm9yTWVzc2FnZSksaSh6dChnLGUsVC5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLGMpKSxjPW51bGx9LFhlLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBfPShlLndpdGhDcmVkZW50aWFsc3x8Tm8oeSkpJiZlLnhzcmZDb29raWVOYW1lP0RvLnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO18mJihzW2UueHNyZkhlYWRlck5hbWVdPV8pfSJzZXRSZXF1ZXN0SGVhZGVyImluIGMmJlhlLmZvckVhY2gocyxmdW5jdGlvbihnLFQpe3R5cGVvZiBvPT0idW5kZWZpbmVkIiYmVC50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSI/ZGVsZXRlIHNbVF06Yy5zZXRSZXF1ZXN0SGVhZGVyKFQsZyl9KSxYZS5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fChjLndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxhJiZhIT09Impzb24iJiYoYy5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLHR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmYy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLHR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmMudXBsb2FkJiZjLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSwoZS5jYW5jZWxUb2tlbnx8ZS5zaWduYWwpJiYodT1mdW5jdGlvbihiKXshY3x8KGkoIWJ8fGImJmIudHlwZT9uZXcgQm8oImNhbmNlbGVkIik6YiksYy5hYm9ydCgpLGM9bnVsbCl9LGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKHUpLGUuc2lnbmFsJiYoZS5zaWduYWwuYWJvcnRlZD91KCk6ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHUpKSksb3x8KG89bnVsbCksYy5zZW5kKG8pfSl9LEM9JCxLcj1fbyxrbz1qcixMbz17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIEpyKHIsZSl7IUMuaXNVbmRlZmluZWQocikmJkMuaXNVbmRlZmluZWQoclsiQ29udGVudC1UeXBlIl0pJiYoclsiQ29udGVudC1UeXBlIl09ZSl9ZnVuY3Rpb24gJG8oKXt2YXIgcjtyZXR1cm4odHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT0idW5kZWZpbmVkInx8dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PT0iW29iamVjdCBwcm9jZXNzXSIpJiYocj1Zcikscn1mdW5jdGlvbiB6byhyLGUsdCl7aWYoQy5pc1N0cmluZyhyKSl0cnl7cmV0dXJuKGV8fEpTT04ucGFyc2UpKHIpLEMudHJpbShyKX1jYXRjaChuKXtpZihuLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IG59cmV0dXJuKHR8fEpTT04uc3RyaW5naWZ5KShyKX12YXIgWWU9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjokbygpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEtyKHQsIkFjY2VwdCIpLEtyKHQsIkNvbnRlbnQtVHlwZSIpLEMuaXNGb3JtRGF0YShlKXx8Qy5pc0FycmF5QnVmZmVyKGUpfHxDLmlzQnVmZmVyKGUpfHxDLmlzU3RyZWFtKGUpfHxDLmlzRmlsZShlKXx8Qy5pc0Jsb2IoZSk/ZTpDLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOkMuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KEpyKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpDLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oSnIodCwiYXBwbGljYXRpb24vanNvbiIpLHpvKGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxZZS50cmFuc2l0aW9uYWwsbj10JiZ0LnNpbGVudEpTT05QYXJzaW5nLGk9dCYmdC5mb3JjZWRKU09OUGFyc2luZyxvPSFuJiZ0aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihvfHxpJiZDLmlzU3RyaW5nKGUpJiZlLmxlbmd0aCl0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2gocyl7aWYobyl0aHJvdyBzLm5hbWU9PT0iU3ludGF4RXJyb3IiP2tvKHMsdGhpcywiRV9KU09OX1BBUlNFIik6c31yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtDLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sZnVuY3Rpb24oZSl7WWUuaGVhZGVyc1tlXT17fX0pLEMuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKGUpe1llLmhlYWRlcnNbZV09Qy5tZXJnZShMbyl9KTt2YXIgS2U9WWUsR289JCxIbz1LZSxWbz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpc3x8SG87cmV0dXJuIEdvLmZvckVhY2gobixmdW5jdGlvbihzKXtlPXMuY2FsbChpLGUsdCl9KSxlfSxRcj1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxacj0kLEd0PVZvLFdvPVFyLGpvPUtlLHFvPXFlO2Z1bmN0aW9uIEh0KHIpe2lmKHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLHIuc2lnbmFsJiZyLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBxbygiY2FuY2VsZWQiKX12YXIgWG89ZnVuY3Rpb24oZSl7SHQoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPUd0LmNhbGwoZSxlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPVpyLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksWnIuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxmdW5jdGlvbihpKXtkZWxldGUgZS5oZWFkZXJzW2ldfSk7dmFyIHQ9ZS5hZGFwdGVyfHxqby5hZGFwdGVyO3JldHVybiB0KGUpLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIEh0KGUpLGkuZGF0YT1HdC5jYWxsKGUsaS5kYXRhLGkuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSxpfSxmdW5jdGlvbihpKXtyZXR1cm4gV28oaSl8fChIdChlKSxpJiZpLnJlc3BvbnNlJiYoaS5yZXNwb25zZS5kYXRhPUd0LmNhbGwoZSxpLnJlc3BvbnNlLmRhdGEsaS5yZXNwb25zZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QoaSl9KX0sej0kLGVuPWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbj17fTtmdW5jdGlvbiBpKGMsZCl7cmV0dXJuIHouaXNQbGFpbk9iamVjdChjKSYmei5pc1BsYWluT2JqZWN0KGQpP3oubWVyZ2UoYyxkKTp6LmlzUGxhaW5PYmplY3QoZCk/ei5tZXJnZSh7fSxkKTp6LmlzQXJyYXkoZCk/ZC5zbGljZSgpOmR9ZnVuY3Rpb24gbyhjKXtpZih6LmlzVW5kZWZpbmVkKHRbY10pKXtpZighei5pc1VuZGVmaW5lZChlW2NdKSlyZXR1cm4gaSh2b2lkIDAsZVtjXSl9ZWxzZSByZXR1cm4gaShlW2NdLHRbY10pfWZ1bmN0aW9uIHMoYyl7aWYoIXouaXNVbmRlZmluZWQodFtjXSkpcmV0dXJuIGkodm9pZCAwLHRbY10pfWZ1bmN0aW9uIGEoYyl7aWYoei5pc1VuZGVmaW5lZCh0W2NdKSl7aWYoIXouaXNVbmRlZmluZWQoZVtjXSkpcmV0dXJuIGkodm9pZCAwLGVbY10pfWVsc2UgcmV0dXJuIGkodm9pZCAwLHRbY10pfWZ1bmN0aW9uIHUoYyl7aWYoYyBpbiB0KXJldHVybiBpKGVbY10sdFtjXSk7aWYoYyBpbiBlKXJldHVybiBpKHZvaWQgMCxlW2NdKX12YXIgZj17dXJsOnMsbWV0aG9kOnMsZGF0YTpzLGJhc2VVUkw6YSx0cmFuc2Zvcm1SZXF1ZXN0OmEsdHJhbnNmb3JtUmVzcG9uc2U6YSxwYXJhbXNTZXJpYWxpemVyOmEsdGltZW91dDphLHRpbWVvdXRNZXNzYWdlOmEsd2l0aENyZWRlbnRpYWxzOmEsYWRhcHRlcjphLHJlc3BvbnNlVHlwZTphLHhzcmZDb29raWVOYW1lOmEseHNyZkhlYWRlck5hbWU6YSxvblVwbG9hZFByb2dyZXNzOmEsb25Eb3dubG9hZFByb2dyZXNzOmEsZGVjb21wcmVzczphLG1heENvbnRlbnRMZW5ndGg6YSxtYXhCb2R5TGVuZ3RoOmEsdHJhbnNwb3J0OmEsaHR0cEFnZW50OmEsaHR0cHNBZ2VudDphLGNhbmNlbFRva2VuOmEsc29ja2V0UGF0aDphLHJlc3BvbnNlRW5jb2Rpbmc6YSx2YWxpZGF0ZVN0YXR1czp1fTtyZXR1cm4gei5mb3JFYWNoKE9iamVjdC5rZXlzKGUpLmNvbmNhdChPYmplY3Qua2V5cyh0KSksZnVuY3Rpb24oZCl7dmFyIHA9ZltkXXx8byx5PXAoZCk7ei5pc1VuZGVmaW5lZCh5KSYmcCE9PXV8fChuW2RdPXkpfSksbn0sdG49e3ZlcnNpb246IjAuMjUuMCJ9LFlvPXRuLnZlcnNpb24sVnQ9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKGZ1bmN0aW9uKHIsZSl7VnRbcl09ZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT09cnx8ImEiKyhlPDE/Im4gIjoiICIpK3J9fSk7dmFyIHJuPXt9O1Z0LnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gaShvLHMpe3JldHVybiJbQXhpb3MgdiIrWW8rIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitvKyInIitzKyhuPyIuICIrbjoiIil9cmV0dXJuIGZ1bmN0aW9uKG8scyxhKXtpZihlPT09ITEpdGhyb3cgbmV3IEVycm9yKGkocywiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSkpO3JldHVybiB0JiYhcm5bc10mJihybltzXT0hMCxjb25zb2xlLndhcm4oaShzLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLGU/ZShvLHMsYSk6ITB9fTtmdW5jdGlvbiBLbyhyLGUsdCl7aWYodHlwZW9mIHIhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0LmtleXMociksaT1uLmxlbmd0aDtpLS0gPjA7KXt2YXIgbz1uW2ldLHM9ZVtvXTtpZihzKXt2YXIgYT1yW29dLHU9YT09PXZvaWQgMHx8cyhhLG8scik7aWYodSE9PSEwKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrdSk7Y29udGludWV9aWYodCE9PSEwKXRocm93IEVycm9yKCJVbmtub3duIG9wdGlvbiAiK28pfX12YXIgSm89e2Fzc2VydE9wdGlvbnM6S28sdmFsaWRhdG9yczpWdH0sbm49JCxRbz1Xcixvbj1wbyxzbj1YbyxKZT1lbixhbj1KbyxiZT1hbi52YWxpZGF0b3JzO2Z1bmN0aW9uIEllKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgb24scmVzcG9uc2U6bmV3IG9ufX1JZS5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD1KZSh0aGlzLmRlZmF1bHRzLHQpLHQubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgbj10LnRyYW5zaXRpb25hbDtuIT09dm9pZCAwJiZhbi5hc3NlcnRPcHRpb25zKG4se3NpbGVudEpTT05QYXJzaW5nOmJlLnRyYW5zaXRpb25hbChiZS5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpiZS50cmFuc2l0aW9uYWwoYmUuYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpiZS50cmFuc2l0aW9uYWwoYmUuYm9vbGVhbil9LCExKTt2YXIgaT1bXSxvPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbih5KXt0eXBlb2YgeS5ydW5XaGVuPT0iZnVuY3Rpb24iJiZ5LnJ1bldoZW4odCk9PT0hMXx8KG89byYmeS5zeW5jaHJvbm91cyxpLnVuc2hpZnQoeS5mdWxmaWxsZWQseS5yZWplY3RlZCkpfSk7dmFyIHM9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbih5KXtzLnB1c2goeS5mdWxmaWxsZWQseS5yZWplY3RlZCl9KTt2YXIgYTtpZighbyl7dmFyIHU9W3NuLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KHUsaSksdT11LmNvbmNhdChzKSxhPVByb21pc2UucmVzb2x2ZSh0KTt1Lmxlbmd0aDspYT1hLnRoZW4odS5zaGlmdCgpLHUuc2hpZnQoKSk7cmV0dXJuIGF9Zm9yKHZhciBmPXQ7aS5sZW5ndGg7KXt2YXIgYz1pLnNoaWZ0KCksZD1pLnNoaWZ0KCk7dHJ5e2Y9YyhmKX1jYXRjaChwKXtkKHApO2JyZWFrfX10cnl7YT1zbihmKX1jYXRjaChwKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QocCl9Zm9yKDtzLmxlbmd0aDspYT1hLnRoZW4ocy5zaGlmdCgpLHMuc2hpZnQoKSk7cmV0dXJuIGF9LEllLnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7aWYoIWUudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTtyZXR1cm4gZT1KZSh0aGlzLmRlZmF1bHRzLGUpLFFvKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LG5uLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe0llLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QoSmUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLG5uLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtJZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuLGkpe3JldHVybiB0aGlzLnJlcXVlc3QoSmUoaXx8e30se21ldGhvZDplLHVybDp0LGRhdGE6bn0pKX19KTt2YXIgWm89SWUsZXM9cWU7ZnVuY3Rpb24gZ2Uocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihpKXtlPWl9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgaSxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKGk9MDtpPG87aSsrKXQuX2xpc3RlbmVyc1tpXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgaSxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMpe3Quc3Vic2NyaWJlKHMpLGk9c30pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShpKX0sb30scihmdW5jdGlvbihpKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBlcyhpKSxlKHQucmVhc29uKSl9KX1nZS5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxnZS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LGdlLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxnZS5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBnZShmdW5jdGlvbihpKXtlPWl9KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciB0cz1nZSxycz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LG5zPSQsaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5zLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSx1bj0kLG9zPSRyLFFlPVpvLHNzPWVuLGFzPUtlO2Z1bmN0aW9uIGNuKHIpe3ZhciBlPW5ldyBRZShyKSx0PW9zKFFlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiB1bi5leHRlbmQodCxRZS5wcm90b3R5cGUsZSksdW4uZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24oaSl7cmV0dXJuIGNuKHNzKHIsaSkpfSx0fXZhciBLPWNuKGFzKTtLLkF4aW9zPVFlLEsuQ2FuY2VsPXFlLEsuQ2FuY2VsVG9rZW49dHMsSy5pc0NhbmNlbD1RcixLLlZFUlNJT049dG4udmVyc2lvbixLLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEsuc3ByZWFkPXJzLEsuaXNBeGlvc0Vycm9yPWlzLE10LmV4cG9ydHM9SyxNdC5leHBvcnRzLmRlZmF1bHQ9Szt2YXIgdXM9TXQuZXhwb3J0cztjbGFzcyBFe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IGZuKGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIEUub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IGZuKGUpOm5ldyBsbn1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IGxufXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIEUub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIEUuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIGZuIGV4dGVuZHMgRXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpFLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBFLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3MgbG4gZXh0ZW5kcyBFe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gRS5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIEUuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgY3M9IjIuMC4wIjtmdW5jdGlvbiBmcyhyKXtnbG9iYWxUaGlzLl92b25hZ2VNZWRpYVByb2Nlc3Nvck1ldGFkYXRhPXJ9ZnVuY3Rpb24gbHMoKXtyZXR1cm4gZ2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YX1jbGFzcyBHe2NvbnN0cnVjdG9yKCl7Y29uc3QgZT1scygpO3RoaXMuX3JlcG9ydD17YWN0aW9uOkUuZW1wdHkoKSxhcHBsaWNhdGlvbklkOkUub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UuYXBwSWQ6bnVsbCksdGltZXN0YW1wOkRhdGUubm93KCksZnBzOkUuZW1wdHkoKSxmcmFtZXNUcmFuc2Zvcm1lZDpFLmVtcHR5KCksZ3VpZDpFLmVtcHR5KCksaGlnaGVzdEZyYW1lVHJhbnNmb3JtQ3B1OkUuZW1wdHkoKSxtZXNzYWdlOkUuZW1wdHkoKSxzb3VyY2U6RS5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5zb3VyY2VUeXBlOm51bGwpLHRyYW5zZm9ybWVkRnBzOkUuZW1wdHkoKSx0cmFuc2Zvcm1lclR5cGU6RS5lbXB0eSgpLHZhcmlhdGlvbjpFLmVtcHR5KCksdmlkZW9IZWlnaHQ6RS5lbXB0eSgpLHZpZGVvV2lkdGg6RS5lbXB0eSgpLHZlcnNpb246Y3MsZXJyb3I6RS5lbXB0eSgpLHByb3h5VXJsOkUub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UucHJveHlVcmw6bnVsbCl9fWFjdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmFjdGlvbj1FLm9mTnVsbGFibGUoZSksdGhpc31mcmFtZXNUcmFuc2Zvcm1lZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmZyYW1lc1RyYW5zZm9ybWVkPUUub2ZOdWxsYWJsZShlKSx0aGlzfWZwcyhlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmZwcz1FLm9mTnVsbGFibGUoZSksdGhpc31ndWlkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZ3VpZD1FLm9mTnVsbGFibGUoZSksdGhpc31tZXNzYWdlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQubWVzc2FnZT1FLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lZEZwcyhlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnRyYW5zZm9ybWVkRnBzPUUub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVyVHlwZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnRyYW5zZm9ybWVyVHlwZT1FLm9mTnVsbGFibGUoZSksdGhpc312YXJpYXRpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52YXJpYXRpb249RS5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9IZWlnaHQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb0hlaWdodD1FLm9mTnVsbGFibGUoZSksdGhpc312aWRlb1dpZHRoKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9XaWR0aD1FLm9mTnVsbGFibGUoZSksdGhpc31lcnJvcihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmVycm9yPUUub2ZOdWxsYWJsZShlKSx0aGlzfWJ1aWxkKCl7cmV0dXJuIHRoaXMuX3JlcG9ydH19Y29uc3QgZHM9cj0+SlNPTi5zdHJpbmdpZnkociwoZSx0KT0+e2lmKHQhPT1udWxsKXJldHVybiB0fSk7Y2xhc3MgSHtzdGF0aWMgcmVwb3J0KGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKGUuYXBwbGljYXRpb25JZC5pc0VtcHR5KCl8fGUuc291cmNlLmlzRW1wdHkoKSl7dCgic3VjY2VzcyIpO3JldHVybn1sZXQgaT11cy5jcmVhdGUoKSxvPXt0aW1lb3V0OjFlNCx0aW1lb3V0RXJyb3JNZXNzYWdlOiJSZXF1ZXN0IHRpbWVvdXQiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19LHM9ImhsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIjtpZihlLnByb3h5VXJsLmlzRW1wdHkoKSlzPSJodHRwczovLyIrcztlbHNle2xldCBhO2UucHJveHlVcmwuZ2V0KCkuc2xpY2UoZS5wcm94eVVybC5nZXQoKS5sZW5ndGgtMSkhPT0iLyI/YT1lLnByb3h5VXJsLmdldCgpKyIvIjphPWUucHJveHlVcmwuZ2V0KCkscz1hK3N9aS5wb3N0KHMsZHMoZSksbykudGhlbihhPT57Y29uc29sZS5sb2coYSksdCgic3VjY2VzcyIpfSkuY2F0Y2goYT0+e2NvbnNvbGUubG9nKGEpLG4oYSl9KX0pfX12YXIgWmUsbXM9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIGhzKCl7aWYoIVplJiYoWmU9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIVplKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFplKG1zKX12YXIgcHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIHlzKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJnBzLnRlc3Qocil9Zm9yKHZhciBPPVtdLFd0PTA7V3Q8MjU2OysrV3QpTy5wdXNoKChXdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIF9zKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KE9bcltlKzBdXStPW3JbZSsxXV0rT1tyW2UrMl1dK09bcltlKzNdXSsiLSIrT1tyW2UrNF1dK09bcltlKzVdXSsiLSIrT1tyW2UrNl1dK09bcltlKzddXSsiLSIrT1tyW2UrOF1dK09bcltlKzldXSsiLSIrT1tyW2UrMTBdXStPW3JbZSsxMV1dK09bcltlKzEyXV0rT1tyW2UrMTNdXStPW3JbZSsxNF1dK09bcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIXlzKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gZG4ocixlLHQpe3I9cnx8e307dmFyIG49ci5yYW5kb218fChyLnJuZ3x8aHMpKCk7aWYobls2XT1uWzZdJjE1fDY0LG5bOF09bls4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgaT0wO2k8MTY7KytpKWVbdCtpXT1uW2ldO3JldHVybiBlfXJldHVybiBfcyhuKX1jb25zdCByZT1uZXcgV2Vha01hcCxldD1uZXcgV2Vha01hcCxGZT1uZXcgV2Vha01hcCxqdD1TeW1ib2woImFueVByb2R1Y2VyIiksbW49UHJvbWlzZS5yZXNvbHZlKCksdHQ9U3ltYm9sKCJsaXN0ZW5lckFkZGVkIikscnQ9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgcXQ9ITE7ZnVuY3Rpb24gdmUocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBudChyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBFZShyLGUpe2NvbnN0IHQ9ZXQuZ2V0KHIpO3JldHVybiB0LmhhcyhlKXx8dC5zZXQoZSxuZXcgU2V0KSx0LmdldChlKX1mdW5jdGlvbiBQZShyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCI/ZTpqdCxuPUZlLmdldChyKTtyZXR1cm4gbi5oYXModCl8fG4uc2V0KHQsbmV3IFNldCksbi5nZXQodCl9ZnVuY3Rpb24geHMocixlLHQpe2NvbnN0IG49RmUuZ2V0KHIpO2lmKG4uaGFzKGUpKWZvcihjb25zdCBpIG9mIG4uZ2V0KGUpKWkuZW5xdWV1ZSh0KTtpZihuLmhhcyhqdCkpe2NvbnN0IGk9UHJvbWlzZS5hbGwoW2UsdF0pO2Zvcihjb25zdCBvIG9mIG4uZ2V0KGp0KSlvLmVucXVldWUoaSl9fWZ1bmN0aW9uIGhuKHIsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PSExLG49KCk9Pnt9LGk9W107Y29uc3Qgbz17ZW5xdWV1ZShzKXtpLnB1c2gocyksbigpfSxmaW5pc2goKXt0PSEwLG4oKX19O2Zvcihjb25zdCBzIG9mIGUpUGUocixzKS5hZGQobyk7cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gaT9pLmxlbmd0aD09PTA/dD8oaT12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShzPT57bj1zfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IGkuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4ocyl7aT12b2lkIDA7Zm9yKGNvbnN0IGEgb2YgZSlQZShyLGEpLmRlbGV0ZShvKTtyZXR1cm4gbigpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBzfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIHBuKHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIHluO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZigheW4uaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBYdD1yPT5yPT09dHR8fHI9PT1ydDtjbGFzcyBmZXtzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1wbih0KSxuPT57aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBzIG9mIHQpaWYobi5wcm90b3R5cGVbc10hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke3N9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIGkoKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgZmV9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDppfSk7Y29uc3Qgbz1zPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtzXSguLi5hKX07Zm9yKGNvbnN0IHMgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUscyx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKHMpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIHF0O2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fHF0fXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7cXQ9ZX1jb25zdHJ1Y3RvcihlPXt9KXtyZS5zZXQodGhpcyxuZXcgU2V0KSxldC5zZXQodGhpcyxuZXcgTWFwKSxGZS5zZXQodGhpcyxuZXcgTWFwKSx0aGlzLmRlYnVnPWUuZGVidWd8fHt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0odCxuLGksbyk9PntvPUpTT04uc3RyaW5naWZ5KG8pLHR5cGVvZiBpPT0ic3ltYm9sIiYmKGk9aS50b1N0cmluZygpKTtjb25zdCBzPW5ldyBEYXRlLGE9YCR7cy5nZXRIb3VycygpfToke3MuZ2V0TWludXRlcygpfToke3MuZ2V0U2Vjb25kcygpfS4ke3MuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7YX1dW2VtaXR0ZXJ5OiR7dH1dWyR7bn1dIEV2ZW50IE5hbWU6ICR7aX0KCWRhdGE6ICR7b31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxuKXsoZmUuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtudCh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSl2ZShuKSxFZSh0aGlzLG4pLmFkZCh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmUiLG4sdm9pZCAwKSxYdChuKXx8dGhpcy5lbWl0KHR0LHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSk7cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHQpfW9mZihlLHQpe250KHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKXZlKG4pLEVlKHRoaXMsbikuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixuLHZvaWQgMCksWHQobil8fHRoaXMuZW1pdChydCx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBuPXRoaXMub24oZSxpPT57bigpLHQoaSl9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSl2ZSh0KTtyZXR1cm4gaG4odGhpcyxlKX1hc3luYyBlbWl0KGUsdCl7dmUoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx4cyh0aGlzLGUsdCk7Y29uc3Qgbj1FZSh0aGlzLGUpLGk9cmUuZ2V0KHRoaXMpLG89Wy4uLm5dLHM9WHQoZSk/W106Wy4uLmldO2F3YWl0IG1uLGF3YWl0IFByb21pc2UuYWxsKFsuLi5vLm1hcChhc3luYyBhPT57aWYobi5oYXMoYSkpcmV0dXJuIGEodCl9KSwuLi5zLm1hcChhc3luYyBhPT57aWYoaS5oYXMoYSkpcmV0dXJuIGEoZSx0KX0pXSl9YXN5bmMgZW1pdFNlcmlhbChlLHQpe3ZlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgbj1FZSh0aGlzLGUpLGk9cmUuZ2V0KHRoaXMpLG89Wy4uLm5dLHM9Wy4uLmldO2F3YWl0IG1uO2Zvcihjb25zdCBhIG9mIG8pbi5oYXMoYSkmJmF3YWl0IGEodCk7Zm9yKGNvbnN0IGEgb2YgcylpLmhhcyhhKSYmYXdhaXQgYShlLHQpfW9uQW55KGUpe3JldHVybiBudChlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHJlLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KHR0LHtsaXN0ZW5lcjplfSksdGhpcy5vZmZBbnkuYmluZCh0aGlzLGUpfWFueUV2ZW50KCl7cmV0dXJuIGhuKHRoaXMpfW9mZkFueShlKXtudChlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KHJ0LHtsaXN0ZW5lcjplfSkscmUuZ2V0KHRoaXMpLmRlbGV0ZShlKX1jbGVhckxpc3RlbmVycyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlpZih0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJjbGVhciIsdCx2b2lkIDApLHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJzeW1ib2wiKXtFZSh0aGlzLHQpLmNsZWFyKCk7Y29uc3Qgbj1QZSh0aGlzLHQpO2Zvcihjb25zdCBpIG9mIG4paS5maW5pc2goKTtuLmNsZWFyKCl9ZWxzZXtyZS5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBldC5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIEZlLmdldCh0aGlzKS52YWx1ZXMoKSl7Zm9yKGNvbnN0IGkgb2YgbilpLmZpbmlzaCgpO24uY2xlYXIoKX19fWxpc3RlbmVyQ291bnQoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl7aWYodHlwZW9mIG49PSJzdHJpbmciKXt0Kz1yZS5nZXQodGhpcykuc2l6ZStFZSh0aGlzLG4pLnNpemUrUGUodGhpcyxuKS5zaXplK1BlKHRoaXMpLnNpemU7Y29udGludWV9dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZ2ZShuKSx0Kz1yZS5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgaSBvZiBldC5nZXQodGhpcykudmFsdWVzKCkpdCs9aS5zaXplO2Zvcihjb25zdCBpIG9mIEZlLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1pLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1wbih0KTtmb3IoY29uc3QgbiBvZiB0KXtpZihlW25dIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtufVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbbl0uYmluZCh0aGlzKX0pfX19Y29uc3QgeW49T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZmUucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShmZSwibGlzdGVuZXJBZGRlZCIse3ZhbHVlOnR0LHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGZlLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTpydCx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pO3ZhciBZdD1mZTtmdW5jdGlvbiBicyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gZ3Mocil7aWYoYnMocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gS3Qocil7cmV0dXJuIGdzKHIpLm1lc3NhZ2V9dmFyIEp0PShyPT4oci5waXBlbGluZV9lbmRlZD0icGlwZWxpbmVfZW5kZWQiLHIucGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIsci5waXBlbGluZV9zdGFydGVkPSJwaXBlbGluZV9zdGFydGVkIixyLnBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIixyLnBpcGVsaW5lX3Jlc3RhcnRlZD0icGlwZWxpbmVfcmVzdGFydGVkIixyLnBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvciIscikpKEp0fHx7fSk7Y29uc3QgdnM9NTAwLEVzPS44O2NsYXNzIFRzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1kbigpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBuPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7SC5yZXBvcnQobil9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydD09ImZ1bmN0aW9uIil0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQoZSl9Y2F0Y2godCl7Y29uc3Qgbj1uZXcgRygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKEt0KHQpKS5idWlsZCgpO0gucmVwb3J0KG4pO2NvbnN0IGk9e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsaSl9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBuLGksbyxzO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShpPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9pOjApLCsrdGhpcy5mcmFtZXNGcm9tU291cmNlXyx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHQpLHQudGVybWluYXRlKCk7ZWxzZSB0cnl7YXdhaXQoKHM9KG89dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOnMuY2FsbChvLGUsdCkpLCsrdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8sdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89PT12cyYmdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl9Y2F0Y2goYSl7Y29uc3QgdT1uZXcgRygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihLdChhKSkuYnVpbGQoKTtILnJlcG9ydCh1KTtjb25zdCBmPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixmKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChuKXtjb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFouZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoS3QobikpLmJ1aWxkKCk7SC5yZXBvcnQoaSk7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6bixmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixvKX19dGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCk7Y29uc3QgdD1uZXcgRygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO0gucmVwb3J0KHQpfXN0b3AoKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTdG9wIHN0cmVhbS4iKSx0aGlzLmNvbnRyb2xsZXJfJiYodGhpcy5mbHVzaCh0aGlzLmNvbnRyb2xsZXJfKSx0aGlzLmNvbnRyb2xsZXJfLnRlcm1pbmF0ZSgpKSx0aGlzLnNob3VsZFN0b3BfPSEwfW1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKXtsZXQgZT0oRGF0ZS5ub3coKS10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF8pLzFlMyx0PXRoaXMuZnJhbWVzRnJvbVNvdXJjZV8vZSxuPXRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfL2U7aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypFcz50KXtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSx3YXJuaW5nVHlwZToiZnBzX2Ryb3AiLGRyb3BJbmZvOntyZXF1ZXN0ZWQ6dGhpcy50cmFja0V4cGVjdGVkUmF0ZV8sY3VycmVudDp0fX07dGhpcy5lbWl0KCJ3YXJuIixvKX1jb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKG4pLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTtILnJlcG9ydChpKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3MgQXMgZXh0ZW5kcyBZdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMudHJhbnNmb3JtZXJzXz1bXSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49bmV3IFRzKGVbdF0sdCk7bi5vbigiZXJyb3IiLGk9Pnt0aGlzLmVtaXQoImVycm9yIixpKX0pLG4ub24oIndhcm4iLGk9Pnt0aGlzLmVtaXQoIndhcm4iLGkpfSksdGhpcy50cmFuc2Zvcm1lcnNfLnB1c2gobil9fXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWU7Zm9yKGxldCB0IG9mIHRoaXMudHJhbnNmb3JtZXJzXyl0LnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX1hc3luYyBzdGFydChlLHQpe2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBObyB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufXRyeXtsZXQgbj1lO2ZvcihsZXQgaSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZT1lLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0oaSkpO2UucGlwZVRvKHQpLnRoZW4oYXN5bmMoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNldHVwLiIpLGF3YWl0IHQuYWJvcnQoKSxhd2FpdCBuLmNhbmNlbCgpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfZW5kZWQiKX0pLmNhdGNoKGFzeW5jIGk9PntlLmNhbmNlbCgpLnRoZW4oKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTaHV0dGluZyBkb3duIHN0cmVhbXMgYWZ0ZXIgYWJvcnQuIil9KS5jYXRjaChvPT57Y29uc29sZS5lcnJvcigiW1BpcGVsaW5lXSBFcnJvciBmcm9tIHN0cmVhbSB0cmFuc2Zvcm06IixvKX0pLGF3YWl0IHQuYWJvcnQoaSksYXdhaXQgbi5jYW5jZWwoaSksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9lbmRlZF93aXRoX2Vycm9yIil9KX1jYXRjaHt0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciIpLHRoaXMuZGVzdHJveSgpO3JldHVybn10aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX3N0YXJ0ZWQiKSxjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIHdzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudXVpZF89ZG4oKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO0gucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtILnJlcG9ydChpKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKTtyZXR1cm59aWYoIXRoaXMucmVhZGFibGVfKXtjb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy5yZWFkYWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtILnJlcG9ydChpKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFJlYWRhYmxlIGlzIG51bGwuIik7cmV0dXJufWlmKCF0aGlzLndyaXRhYmxlXyl7Y29uc3QgaT1uZXcgRygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoWi5lcnJvcnMud3JpdGFibGVfbnVsbCkudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7SC5yZXBvcnQoaSksdCgiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgbj0hMTt0aGlzLnBpcGVsaW5lXyYmKG49ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBBcyh0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixpPT57dGhpcy5lbWl0KCJ3YXJuIixpKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsaT0+e3RoaXMuZW1pdCgiZXJyb3IiLGkpfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIsaT0+e24mJihpPT09InBpcGVsaW5lX3N0YXJ0ZWQiP2k9SnQucGlwZWxpbmVfcmVzdGFydGVkOmk9PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKGk9SnQucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsaSl9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKGk9Pnt0KGkpfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgRygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoWi51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiBILnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgRygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtILnJlcG9ydCh0KSxlKCl9KX19dmFyIGl0PShyPT4oci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIixyKSkoaXR8fHt9KTsvKiBAbGljZW5zZSB0d2dsLmpzIDUuMC40IENvcHlyaWdodCAoYykgMjAxNSwgR3JlZ2cgVGF2YXJlcyBBbGwgUmlnaHRzIFJlc2VydmVkLgpBdmFpbGFibGUgdmlhIHRoZSBNSVQgbGljZW5zZS4Kc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9ncmVnZ21hbi90d2dsLmpzIGZvciBkZXRhaWxzICovY29uc3QgUXQ9NTEyMCxEZT01MTIxLFp0PTUxMjIsZXI9NTEyMyx0cj01MTI0LHJyPTUxMjUsbnI9NTEyNixScz0zMjgxOSxTcz0zMjgyMCxJcz0zMzYzNSxGcz01MTMxLFBzPTMzNjQwLERzPTM1ODk5LENzPTM1OTAyLE9zPTM2MjY5LE1zPTM0MDQyLF9uPXt9O3tjb25zdCByPV9uO3JbUXRdPUludDhBcnJheSxyW0RlXT1VaW50OEFycmF5LHJbWnRdPUludDE2QXJyYXkscltlcl09VWludDE2QXJyYXksclt0cl09SW50MzJBcnJheSxyW3JyXT1VaW50MzJBcnJheSxyW25yXT1GbG9hdDMyQXJyYXkscltSc109VWludDE2QXJyYXkscltTc109VWludDE2QXJyYXkscltJc109VWludDE2QXJyYXkscltGc109VWludDE2QXJyYXkscltQc109VWludDMyQXJyYXkscltEc109VWludDMyQXJyYXkscltDc109VWludDMyQXJyYXkscltPc109VWludDMyQXJyYXkscltNc109VWludDMyQXJyYXl9ZnVuY3Rpb24gaXIocil7aWYociBpbnN0YW5jZW9mIEludDhBcnJheSlyZXR1cm4gUXQ7aWYociBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHIgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlyZXR1cm4gRGU7aWYociBpbnN0YW5jZW9mIEludDE2QXJyYXkpcmV0dXJuIFp0O2lmKHIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSlyZXR1cm4gZXI7aWYociBpbnN0YW5jZW9mIEludDMyQXJyYXkpcmV0dXJuIHRyO2lmKHIgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlyZXR1cm4gcnI7aWYociBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlyZXR1cm4gbnI7dGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCB0eXBlZCBhcnJheSB0eXBlIil9ZnVuY3Rpb24gTnMocil7aWYocj09PUludDhBcnJheSlyZXR1cm4gUXQ7aWYocj09PVVpbnQ4QXJyYXl8fHI9PT1VaW50OENsYW1wZWRBcnJheSlyZXR1cm4gRGU7aWYocj09PUludDE2QXJyYXkpcmV0dXJuIFp0O2lmKHI9PT1VaW50MTZBcnJheSlyZXR1cm4gZXI7aWYocj09PUludDMyQXJyYXkpcmV0dXJuIHRyO2lmKHI9PT1VaW50MzJBcnJheSlyZXR1cm4gcnI7aWYocj09PUZsb2F0MzJBcnJheSlyZXR1cm4gbnI7dGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCB0eXBlZCBhcnJheSB0eXBlIil9ZnVuY3Rpb24gVXMocil7Y29uc3QgZT1fbltyXTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZ2wgdHlwZSIpO3JldHVybiBlfWNvbnN0IG90PXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCI/ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiYoZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8ZS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcil9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn07ZnVuY3Rpb24geG4oLi4ucil7Y29uc29sZS5lcnJvciguLi5yKX1jb25zdCBibj1uZXcgTWFwO2Z1bmN0aW9uIENlKHIsZSl7aWYoIXJ8fHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgdD1ibi5nZXQoZSk7dHx8KHQ9bmV3IFdlYWtNYXAsYm4uc2V0KGUsdCkpO2xldCBuPXQuZ2V0KHIpO2lmKG49PT12b2lkIDApe2NvbnN0IGk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpO249aS5zdWJzdHJpbmcoOCxpLmxlbmd0aC0xKT09PWUsdC5zZXQocixuKX1yZXR1cm4gbn1mdW5jdGlvbiBCcyhyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xCdWZmZXIhPSJ1bmRlZmluZWQiJiZDZShlLCJXZWJHTEJ1ZmZlciIpfWZ1bmN0aW9uIGtzKHIsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTFJlbmRlcmJ1ZmZlciE9InVuZGVmaW5lZCImJkNlKGUsIldlYkdMUmVuZGVyYnVmZmVyIil9ZnVuY3Rpb24gTHMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2hhZGVyIT0idW5kZWZpbmVkIiYmQ2UoZSwiV2ViR0xTaGFkZXIiKX1mdW5jdGlvbiBvcihyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlIT0idW5kZWZpbmVkIiYmQ2UoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gJHMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlciE9InVuZGVmaW5lZCImJkNlKGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IGduPTM1MDQ0LGxlPTM0OTYyLHpzPTM0OTYzLEdzPTM0NjYwLEhzPTUxMjAsVnM9NTEyMSxXcz01MTIyLGpzPTUxMjMscXM9NTEyNCxYcz01MTI1LFlzPTUxMjYsdm49e2F0dHJpYlByZWZpeDoiIn07ZnVuY3Rpb24gS3MocixlLHQsbixpKXtyLmJpbmRCdWZmZXIoZSx0KSxyLmJ1ZmZlckRhdGEoZSxuLGl8fGduKX1mdW5jdGlvbiBFbihyLGUsdCxuKXtpZihCcyhyLGUpKXJldHVybiBlO3Q9dHx8bGU7Y29uc3QgaT1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiBLcyhyLHQsaSxlLG4pLGl9ZnVuY3Rpb24gVG4ocil7cmV0dXJuIHI9PT0iaW5kaWNlcyJ9ZnVuY3Rpb24gSnMocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBJbnQ4QXJyYXl8fHIgaW5zdGFuY2VvZiBVaW50OEFycmF5fWZ1bmN0aW9uIFFzKHIpe3JldHVybiByPT09SW50OEFycmF5fHxyPT09VWludDhBcnJheX1mdW5jdGlvbiBacyhyKXtyZXR1cm4gci5sZW5ndGg/cjpyLmRhdGF9Y29uc3QgZWE9L2Nvb3JkfHRleHR1cmUvaSx0YT0vY29sb3J8Y29sb3VyL2k7ZnVuY3Rpb24gQW4ocixlKXtsZXQgdDtpZihlYS50ZXN0KHIpP3Q9Mjp0YS50ZXN0KHIpP3Q9NDp0PTMsZSV0PjApdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGd1ZXNzIG51bUNvbXBvbmVudHMgZm9yIGF0dHJpYnV0ZSAnJHtyfScuIFRyaWVkICR7dH0gYnV0ICR7ZX0gdmFsdWVzIGlzIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5ICR7dH0uIFlvdSBzaG91bGQgc3BlY2lmeSBpdC5gKTtyZXR1cm4gdH1mdW5jdGlvbiByYShyLGUpe3JldHVybiByLm51bUNvbXBvbmVudHN8fHIuc2l6ZXx8QW4oZSxacyhyKS5sZW5ndGgpfWZ1bmN0aW9uIHduKHIsZSl7aWYob3QocikpcmV0dXJuIHI7aWYob3Qoci5kYXRhKSlyZXR1cm4gci5kYXRhO0FycmF5LmlzQXJyYXkocikmJihyPXtkYXRhOnJ9KTtsZXQgdD1yLnR5cGU7cmV0dXJuIHR8fChUbihlKT90PVVpbnQxNkFycmF5OnQ9RmxvYXQzMkFycmF5KSxuZXcgdChyLmRhdGEpfWZ1bmN0aW9uIG5hKHIsZSl7Y29uc3QgdD17fTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpZighVG4obikpe2NvbnN0IGk9ZVtuXSxvPWkuYXR0cmlifHxpLm5hbWV8fGkuYXR0cmliTmFtZXx8dm4uYXR0cmliUHJlZml4K247aWYoaS52YWx1ZSl7aWYoIUFycmF5LmlzQXJyYXkoaS52YWx1ZSkmJiFvdChpLnZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoImFycmF5LnZhbHVlIGlzIG5vdCBhcnJheSBvciB0eXBlZGFycmF5Iik7dFtvXT17dmFsdWU6aS52YWx1ZX19ZWxzZXtsZXQgcyxhLHUsZjtpZihpLmJ1ZmZlciYmaS5idWZmZXIgaW5zdGFuY2VvZiBXZWJHTEJ1ZmZlcilzPWkuYnVmZmVyLGY9aS5udW1Db21wb25lbnRzfHxpLnNpemUsYT1pLnR5cGUsdT1pLm5vcm1hbGl6ZTtlbHNlIGlmKHR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIGkuZGF0YT09Im51bWJlciIpe2NvbnN0IGM9aS5kYXRhfHxpLGQ9aS50eXBlfHxGbG9hdDMyQXJyYXkscD1jKmQuQllURVNfUEVSX0VMRU1FTlQ7YT1OcyhkKSx1PWkubm9ybWFsaXplIT09dm9pZCAwP2kubm9ybWFsaXplOlFzKGQpLGY9aS5udW1Db21wb25lbnRzfHxpLnNpemV8fEFuKG4sYykscz1yLmNyZWF0ZUJ1ZmZlcigpLHIuYmluZEJ1ZmZlcihsZSxzKSxyLmJ1ZmZlckRhdGEobGUscCxpLmRyYXdUeXBlfHxnbil9ZWxzZXtjb25zdCBjPXduKGksbik7cz1FbihyLGMsdm9pZCAwLGkuZHJhd1R5cGUpLGE9aXIoYyksdT1pLm5vcm1hbGl6ZSE9PXZvaWQgMD9pLm5vcm1hbGl6ZTpKcyhjKSxmPXJhKGksbil9dFtvXT17YnVmZmVyOnMsbnVtQ29tcG9uZW50czpmLHR5cGU6YSxub3JtYWxpemU6dSxzdHJpZGU6aS5zdHJpZGV8fDAsb2Zmc2V0Omkub2Zmc2V0fHwwLGRpdmlzb3I6aS5kaXZpc29yPT09dm9pZCAwP3ZvaWQgMDppLmRpdmlzb3IsZHJhd1R5cGU6aS5kcmF3VHlwZX19fX0pLHIuYmluZEJ1ZmZlcihsZSxudWxsKSx0fWZ1bmN0aW9uIGlhKHIsZSl7cmV0dXJuIGU9PT1Ic3x8ZT09PVZzPzE6ZT09PVdzfHxlPT09anM/MjplPT09cXN8fGU9PT1Yc3x8ZT09PVlzPzQ6MH1jb25zdCBzcj1bInBvc2l0aW9uIiwicG9zaXRpb25zIiwiYV9wb3NpdGlvbiJdO2Z1bmN0aW9uIG9hKHIsZSl7bGV0IHQsbjtmb3Iobj0wO248c3IubGVuZ3RoJiYodD1zcltuXSwhKHQgaW4gZXx8KHQ9dm4uYXR0cmliUHJlZml4K3QsdCBpbiBlKSkpOysrbik7bj09PXNyLmxlbmd0aCYmKHQ9T2JqZWN0LmtleXMoZSlbMF0pO2NvbnN0IGk9ZVt0XTtpZighaS5idWZmZXIpcmV0dXJuIDE7ci5iaW5kQnVmZmVyKGxlLGkuYnVmZmVyKTtjb25zdCBvPXIuZ2V0QnVmZmVyUGFyYW1ldGVyKGxlLEdzKTtyLmJpbmRCdWZmZXIobGUsbnVsbCk7Y29uc3Qgcz1pYShyLGkudHlwZSksYT1vL3MsdT1pLm51bUNvbXBvbmVudHN8fGkuc2l6ZSxmPWEvdTtpZihmJTEhPT0wKXRocm93IG5ldyBFcnJvcihgbnVtQ29tcG9uZW50cyAke3V9IG5vdCBjb3JyZWN0IGZvciBsZW5ndGggJHtsZW5ndGh9YCk7cmV0dXJuIGZ9ZnVuY3Rpb24gc2EocixlLHQpe2NvbnN0IG49bmEocixlKSxpPU9iamVjdC5hc3NpZ24oe30sdHx8e30pO2kuYXR0cmlicz1PYmplY3QuYXNzaWduKHt9LHQ/dC5hdHRyaWJzOnt9LG4pO2NvbnN0IG89ZS5pbmRpY2VzO2lmKG8pe2NvbnN0IHM9d24obywiaW5kaWNlcyIpO2kuaW5kaWNlcz1FbihyLHMsenMpLGkubnVtRWxlbWVudHM9cy5sZW5ndGgsaS5lbGVtZW50VHlwZT1pcihzKX1lbHNlIGkubnVtRWxlbWVudHN8fChpLm51bUVsZW1lbnRzPW9hKHIsaS5hdHRyaWJzKSk7cmV0dXJuIGl9ZnVuY3Rpb24gT2Uocil7cmV0dXJuISFyLnRleFN0b3JhZ2UyRH1jb25zdCBSbj1mdW5jdGlvbigpe2NvbnN0IHI9e30sZT17fTtmdW5jdGlvbiB0KG4pe2NvbnN0IGk9bi5jb25zdHJ1Y3Rvci5uYW1lO2lmKCFyW2ldKXtmb3IoY29uc3QgbyBpbiBuKWlmKHR5cGVvZiBuW29dPT0ibnVtYmVyIil7Y29uc3Qgcz1lW25bb11dO2VbbltvXV09cz9gJHtzfSB8ICR7b31gOm99cltpXT0hMH19cmV0dXJuIGZ1bmN0aW9uKGksbyl7cmV0dXJuIHQoaSksZVtvXXx8KHR5cGVvZiBvPT0ibnVtYmVyIj9gMHgke28udG9TdHJpbmcoMTYpfWA6byl9fSgpLG5lPXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sTWU9b3QsU249ZnVuY3Rpb24oKXtsZXQgcjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcj1yfHwodHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHJ9fSgpLEluPTY0MDYsSj02NDA3LEk9NjQwOCxGbj02NDA5LFBuPTY0MTAsTmU9NjQwMixEbj0zNDA0MSxzdD0zMzA3MSxhYT05NzI4LHVhPTk3MjksaWU9MzU1MyxvZT0zNDA2NyxkZT0zMjg3OSxtZT0zNTg2Nixhcj0zNDA2OSxjYT0zNDA3MCxmYT0zNDA3MSxsYT0zNDA3MixkYT0zNDA3MyxtYT0zNDA3NCx1cj0xMDI0MSxjcj0xMDI0MCxhdD0xMDI0Mix1dD0xMDI0MyxDbj0zMjg4MixoYT0zMzA4MixwYT0zMzA4Myx5YT0zMzA4NCxfYT0zMzA4NSxmcj0zMzE3LE9uPTMzMTQsTW49MzI4NzgsTm49MzMxNixVbj0zMzE1LEJuPTMyODc3LHhhPTM3NDQzLGJhPTM3NDQxLGdhPTM3NDQwLHZhPTMzMzIxLEVhPTM2NzU2LFRhPTMzMzI1LEFhPTMzMzI2LHdhPTMzMzMwLFJhPTMzMzI5LFNhPTMzMzM4LElhPTMzMzM3LEZhPTMzMzQwLFBhPTMzMzM5LERhPTMzMzIzLENhPTM2NzU3LE9hPTMzMzI3LE1hPTMzMzI4LE5hPTMzMzM2LFVhPTMzMzM1LEJhPTMzMzMyLGthPTMzMzMxLExhPTMzMzM0LCRhPTMzMzMzLHphPTMyODQ5LEdhPTM1OTA1LEhhPTM2MTk0LFZhPTM2NzU4LFdhPTM1ODk4LGphPTM1OTAxLHFhPTM0ODQzLFhhPTM0ODM3LFlhPTM2MjIxLEthPTM2MjM5LEphPTM2MjE1LFFhPTM2MjMzLFphPTM2MjA5LGV1PTM2MjI3LHR1PTMyODU2LHJ1PTM1OTA3LG51PTM2NzU5LGl1PTMyODU1LG91PTMyODU0LHN1PTMyODU3LGF1PTM0ODQyLHV1PTM0ODM2LGN1PTM2MjIwLGZ1PTM2MjM4LGx1PTM2OTc1LGR1PTM2MjE0LG11PTM2MjMyLGh1PTM2MjI2LHB1PTM2MjA4LHl1PTMzMTg5LF91PTMzMTkwLHh1PTM2MDEyLGJ1PTM2MDEzLGd1PTM1MDU2LHNlPTUxMjAsUz01MTIxLGN0PTUxMjIsVGU9NTEyMyxmdD01MTI0LGhlPTUxMjUsTj01MTI2LGtuPTMyODE5LExuPTMyODIwLCRuPTMzNjM1LFc9NTEzMSxVZT0zNjE5Myxscj0zMzY0MCx2dT0zNTg5OSxFdT0zNTkwMixUdT0zNjI2OSxBdT0zNDA0MixsdD0zMzMxOSxBZT0zMzMyMCxkdD02NDAzLHdlPTM2MjQ0LFJlPTM2MjQ4LHBlPTM2MjQ5O2xldCBkcjtmdW5jdGlvbiBtdChyKXtpZighZHIpe2NvbnN0IGU9e307ZVtJbl09e3RleHR1cmVGb3JtYXQ6SW4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbUyxXLFVlLE5dfSxlW0ZuXT17dGV4dHVyZUZvcm1hdDpGbixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxLDIsMiw0XSx0eXBlOltTLFcsVWUsTl19LGVbUG5dPXt0ZXh0dXJlRm9ybWF0OlBuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzIsNCw0LDhdLHR5cGU6W1MsVyxVZSxOXX0sZVtKXT17dGV4dHVyZUZvcm1hdDpKLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzMsNiw2LDEyLDJdLHR5cGU6W1MsVyxVZSxOLCRuXX0sZVtJXT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsOCw4LDE2LDIsMl0sdHlwZTpbUyxXLFVlLE4sa24sTG5dfSxlW05lXT17dGV4dHVyZUZvcm1hdDpOZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyLDRdLHR5cGU6W2hlLFRlXX0sZVt2YV09e3RleHR1cmVGb3JtYXQ6ZHQsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbRWFdPXt0ZXh0dXJlRm9ybWF0OmR0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3NlXX0sZVtUYV09e3RleHR1cmVGb3JtYXQ6ZHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltOLFddfSxlW0FhXT17dGV4dHVyZUZvcm1hdDpkdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltOXX0sZVt3YV09e3RleHR1cmVGb3JtYXQ6d2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbUmFdPXt0ZXh0dXJlRm9ybWF0OndlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3NlXX0sZVtCYV09e3RleHR1cmVGb3JtYXQ6d2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbVGVdfSxlW2thXT17dGV4dHVyZUZvcm1hdDp3ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltjdF19LGVbTGFdPXt0ZXh0dXJlRm9ybWF0OndlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2hlXX0sZVskYV09e3RleHR1cmVGb3JtYXQ6d2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZnRdfSxlW0RhXT17dGV4dHVyZUZvcm1hdDpsdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtDYV09e3RleHR1cmVGb3JtYXQ6bHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbc2VdfSxlW09hXT17dGV4dHVyZUZvcm1hdDpsdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols4LDRdLHR5cGU6W04sV119LGVbTWFdPXt0ZXh0dXJlRm9ybWF0Omx0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W05dfSxlW05hXT17dGV4dHVyZUZvcm1hdDpBZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtVYV09e3RleHR1cmVGb3JtYXQ6QWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbc2VdfSxlW1NhXT17dGV4dHVyZUZvcm1hdDpBZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltUZV19LGVbSWFdPXt0ZXh0dXJlRm9ybWF0OkFlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2N0XX0sZVtGYV09e3RleHR1cmVGb3JtYXQ6QWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbaGVdfSxlW1BhXT17dGV4dHVyZUZvcm1hdDpBZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltmdF19LGVbemFdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbR2FdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbSGFdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltTLCRuXX0sZVtWYV09e3RleHR1cmVGb3JtYXQ6Sixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltzZV19LGVbV2FdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltOLFcsdnVdfSxlW2phXT17dGV4dHVyZUZvcm1hdDpKLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDYsNF0sdHlwZTpbTixXLEV1XX0sZVtxYV09e3RleHR1cmVGb3JtYXQ6Sixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2XSx0eXBlOltOLFddfSxlW1hhXT17dGV4dHVyZUZvcm1hdDpKLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltOXX0sZVtZYV09e3RleHR1cmVGb3JtYXQ6UmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbS2FdPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzNdLHR5cGU6W3NlXX0sZVtKYV09e3RleHR1cmVGb3JtYXQ6UmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpbVGVdfSxlW1FhXT17dGV4dHVyZUZvcm1hdDpSZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols2XSx0eXBlOltjdF19LGVbWmFdPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltoZV19LGVbZXVdPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltmdF19LGVbdHVdPXt0ZXh0dXJlRm9ybWF0OkksY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbcnVdPXt0ZXh0dXJlRm9ybWF0OkksY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbbnVdPXt0ZXh0dXJlRm9ybWF0OkksY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbc2VdfSxlW2l1XT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltTLExuLGxyXX0sZVtvdV09e3RleHR1cmVGb3JtYXQ6SSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W1Msa25dfSxlW3N1XT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2xyXX0sZVthdV09e3RleHR1cmVGb3JtYXQ6SSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltOLFddfSxlW3V1XT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltOXX0sZVtjdV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbZnVdPXt0ZXh0dXJlRm9ybWF0OnBlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3NlXX0sZVtsdV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbbHJdfSxlW2R1XT17dGV4dHVyZUZvcm1hdDpwZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltUZV19LGVbbXVdPXt0ZXh0dXJlRm9ybWF0OnBlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W2N0XX0sZVtodV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W2Z0XX0sZVtwdV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W2hlXX0sZVt5dV09e3RleHR1cmVGb3JtYXQ6TmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltUZSxoZV19LGVbX3VdPXt0ZXh0dXJlRm9ybWF0Ok5lLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2hlXX0sZVt4dV09e3RleHR1cmVGb3JtYXQ6TmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbTl19LGVbZ3VdPXt0ZXh0dXJlRm9ybWF0OkRuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0F1XX0sZVtidV09e3RleHR1cmVGb3JtYXQ6RG4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbVHVdfSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2NvbnN0IG49ZVt0XTtuLmJ5dGVzUGVyRWxlbWVudE1hcD17fSxuLmJ5dGVzUGVyRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGksbyl7Y29uc3Qgcz1uLnR5cGVbb107bi5ieXRlc1BlckVsZW1lbnRNYXBbc109aX0pfSksZHI9ZX1yZXR1cm4gZHJbcl19ZnVuY3Rpb24gd3UocixlKXtjb25zdCB0PW10KHIpO2lmKCF0KXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0Ijtjb25zdCBuPXQuYnl0ZXNQZXJFbGVtZW50TWFwW2VdO2lmKG49PT12b2lkIDApdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBufWZ1bmN0aW9uIEJlKHIpe2NvbnN0IGU9bXQocik7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybntmb3JtYXQ6ZS50ZXh0dXJlRm9ybWF0LHR5cGU6ZS50eXBlWzBdfX1mdW5jdGlvbiB6bihyKXtyZXR1cm4ociZyLTEpPT09MH1mdW5jdGlvbiBSdShyLGUsdCxuKXtpZighT2UocikpcmV0dXJuIHpuKGUpJiZ6bih0KTtjb25zdCBpPW10KG4pO2lmKCFpKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gaS5jb2xvclJlbmRlcmFibGUmJmkudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gU3Uocil7Y29uc3QgZT1tdChyKTtpZighZSl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIGUudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gSXUocixlLHQpe3JldHVybiBNZShlKT9pcihlKTp0fHxTfWZ1bmN0aW9uIGh0KHIsZSx0LG4saSl7aWYoaSUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBkaW1lbnNpb25zIjtpZighdCYmIW4pe2NvbnN0IG89TWF0aC5zcXJ0KGkvKGU9PT1vZT82OjEpKTtvJTE9PT0wPyh0PW8sbj1vKToodD1pLG49MSl9ZWxzZSBpZihuKXtpZighdCYmKHQ9aS9uLHQlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPWkvdCxuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIFNlKHIsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmci5waXhlbFN0b3JlaSh4YSxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnIucGl4ZWxTdG9yZWkoYmEsZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZyLnBpeGVsU3RvcmVpKGdhLGUuZmxpcFkpfWZ1bmN0aW9uIEduKHIpe3IucGl4ZWxTdG9yZWkoZnIsNCksT2UocikmJihyLnBpeGVsU3RvcmVpKE9uLDApLHIucGl4ZWxTdG9yZWkoTW4sMCksci5waXhlbFN0b3JlaShObiwwKSxyLnBpeGVsU3RvcmVpKFVuLDApLHIucGl4ZWxTdG9yZWkoQm4sMCkpfWZ1bmN0aW9uIEZ1KHIsZSx0LG4pe24ubWluTWFnJiYodC5jYWxsKHIsZSx1cixuLm1pbk1hZyksdC5jYWxsKHIsZSxjcixuLm1pbk1hZykpLG4ubWluJiZ0LmNhbGwocixlLHVyLG4ubWluKSxuLm1hZyYmdC5jYWxsKHIsZSxjcixuLm1hZyksbi53cmFwJiYodC5jYWxsKHIsZSxhdCxuLndyYXApLHQuY2FsbChyLGUsdXQsbi53cmFwKSwoZT09PWRlfHwkcyhyLGUpKSYmdC5jYWxsKHIsZSxDbixuLndyYXApKSxuLndyYXBSJiZ0LmNhbGwocixlLENuLG4ud3JhcFIpLG4ud3JhcFMmJnQuY2FsbChyLGUsYXQsbi53cmFwUyksbi53cmFwVCYmdC5jYWxsKHIsZSx1dCxuLndyYXBUKSxuLm1pbkxvZCYmdC5jYWxsKHIsZSxoYSxuLm1pbkxvZCksbi5tYXhMb2QmJnQuY2FsbChyLGUscGEsbi5tYXhMb2QpLG4uYmFzZUxldmVsJiZ0LmNhbGwocixlLHlhLG4uYmFzZUxldmVsKSxuLm1heExldmVsJiZ0LmNhbGwocixlLF9hLG4ubWF4TGV2ZWwpfWZ1bmN0aW9uIEhuKHIsZSx0KXtjb25zdCBuPXQudGFyZ2V0fHxpZTtyLmJpbmRUZXh0dXJlKG4sZSksRnUocixuLHIudGV4UGFyYW1ldGVyaSx0KX1mdW5jdGlvbiBQdShyKXtyZXR1cm4gcj1yfHxuZS50ZXh0dXJlQ29sb3IsTWUocik/cjpuZXcgVWludDhBcnJheShbclswXSoyNTUsclsxXSoyNTUsclsyXSoyNTUsclszXSoyNTVdKX1mdW5jdGlvbiBtcihyLGUsdCxuLGksbyl7dD10fHxuZS50ZXh0dXJlT3B0aW9ucyxvPW98fEk7Y29uc3Qgcz10LnRhcmdldHx8aWU7aWYobj1ufHx0LndpZHRoLGk9aXx8dC5oZWlnaHQsci5iaW5kVGV4dHVyZShzLGUpLFJ1KHIsbixpLG8pKXIuZ2VuZXJhdGVNaXBtYXAocyk7ZWxzZXtjb25zdCBhPVN1KG8pP3VhOmFhO3IudGV4UGFyYW1ldGVyaShzLHVyLGEpLHIudGV4UGFyYW1ldGVyaShzLGNyLGEpLHIudGV4UGFyYW1ldGVyaShzLGF0LHN0KSxyLnRleFBhcmFtZXRlcmkocyx1dCxzdCl9fWZ1bmN0aW9uIGtlKHIpe3JldHVybiByLmF1dG89PT0hMHx8ci5hdXRvPT09dm9pZCAwJiZyLmxldmVsPT09dm9pZCAwfWZ1bmN0aW9uIGhyKHIsZSl7cmV0dXJuIGU9ZXx8e30sZS5jdWJlRmFjZU9yZGVyfHxbYXIsY2EsZmEsbGEsZGEsbWFdfWZ1bmN0aW9uIHByKHIsZSl7Y29uc3Qgbj1ocihyLGUpLm1hcChmdW5jdGlvbihpLG8pe3JldHVybntmYWNlOmksbmR4Om99fSk7cmV0dXJuIG4uc29ydChmdW5jdGlvbihpLG8pe3JldHVybiBpLmZhY2Utby5mYWNlfSksbn1mdW5jdGlvbiBWbihyLGUsdCxuKXtuPW58fG5lLnRleHR1cmVPcHRpb25zO2NvbnN0IGk9bi50YXJnZXR8fGllLG89bi5sZXZlbHx8MDtsZXQgcz10LndpZHRoLGE9dC5oZWlnaHQ7Y29uc3QgdT1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8SSxmPUJlKHUpLGM9bi5mb3JtYXR8fGYuZm9ybWF0LGQ9bi50eXBlfHxmLnR5cGU7aWYoU2UocixuKSxyLmJpbmRUZXh0dXJlKGksZSksaT09PW9lKXtjb25zdCBwPXQud2lkdGgseT10LmhlaWdodDtsZXQgbSxfO2lmKHAvNj09PXkpbT15LF89WzAsMCwxLDAsMiwwLDMsMCw0LDAsNSwwXTtlbHNlIGlmKHkvNj09PXApbT1wLF89WzAsMCwwLDEsMCwyLDAsMywwLDQsMCw1XTtlbHNlIGlmKHAvMz09PXkvMiltPXAvMyxfPVswLDAsMSwwLDIsMCwwLDEsMSwxLDIsMV07ZWxzZSBpZihwLzI9PT15LzMpbT1wLzIsXz1bMCwwLDEsMCwwLDEsMSwxLDAsMiwxLDJdO2Vsc2UgdGhyb3ciY2FuJ3QgZmlndXJlIG91dCBjdWJlIG1hcCBmcm9tIGVsZW1lbnQ6ICIrKHQuc3JjP3Quc3JjOnQubm9kZU5hbWUpO2NvbnN0IGI9U24oKTtiPyhiLmNhbnZhcy53aWR0aD1tLGIuY2FudmFzLmhlaWdodD1tLHM9bSxhPW0scHIocixuKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NvbnN0IFQ9X1tnLm5keCoyKzBdKm0sRj1fW2cubmR4KjIrMV0qbTtiLmRyYXdJbWFnZSh0LFQsRixtLG0sMCwwLG0sbSksci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsYyxkLGIuY2FudmFzKX0pLGIuY2FudmFzLndpZHRoPTEsYi5jYW52YXMuaGVpZ2h0PTEpOnR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJihzPW0sYT1tLHByKHIsbikuZm9yRWFjaChmdW5jdGlvbihnKXtjb25zdCBUPV9bZy5uZHgqMiswXSptLEY9X1tnLm5keCoyKzFdKm07ci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsbSxtLDAsYyxkLG51bGwpLGNyZWF0ZUltYWdlQml0bWFwKHQsVCxGLG0sbSx7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkudGhlbihmdW5jdGlvbihMKXtTZShyLG4pLHIuYmluZFRleHR1cmUoaSxlKSxyLnRleEltYWdlMkQoZy5mYWNlLG8sdSxjLGQsTCksa2UobikmJm1yKHIsZSxuLHMsYSx1KX0pfSkpfWVsc2UgaWYoaT09PWRlfHxpPT09bWUpe2NvbnN0IHA9TWF0aC5taW4odC53aWR0aCx0LmhlaWdodCkseT1NYXRoLm1heCh0LndpZHRoLHQuaGVpZ2h0KSxtPXkvcDtpZihtJTEhPT0wKXRocm93ImNhbiBub3QgY29tcHV0ZSAzRCBkaW1lbnNpb25zIG9mIGVsZW1lbnQiO2NvbnN0IF89dC53aWR0aD09PXk/MTowLGI9dC5oZWlnaHQ9PT15PzE6MDtyLnBpeGVsU3RvcmVpKGZyLDEpLHIucGl4ZWxTdG9yZWkoT24sdC53aWR0aCksci5waXhlbFN0b3JlaShNbiwwKSxyLnBpeGVsU3RvcmVpKEJuLDApLHIudGV4SW1hZ2UzRChpLG8sdSxwLHAscCwwLGMsZCxudWxsKTtmb3IobGV0IGc9MDtnPG07KytnKXtjb25zdCBUPWcqcCpfLEY9ZypwKmI7ci5waXhlbFN0b3JlaShObixUKSxyLnBpeGVsU3RvcmVpKFVuLEYpLHIudGV4U3ViSW1hZ2UzRChpLG8sMCwwLGcscCxwLDEsYyxkLHQpfUduKHIpfWVsc2Ugci50ZXhJbWFnZTJEKGksbyx1LGMsZCx0KTtrZShuKSYmbXIocixlLG4scyxhLHUpLEhuKHIsZSxuKX1mdW5jdGlvbiBMZSgpe31mdW5jdGlvbiBEdShyKXtpZih0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gZS5ocmVmPXIsZS5ob3N0bmFtZT09PWxvY2F0aW9uLmhvc3RuYW1lJiZlLnBvcnQ9PT1sb2NhdGlvbi5wb3J0JiZlLnByb3RvY29sPT09bG9jYXRpb24ucHJvdG9jb2x9ZWxzZXtjb25zdCBlPW5ldyBVUkwobG9jYXRpb24uaHJlZikub3JpZ2luO3JldHVybiBuZXcgVVJMKHIsbG9jYXRpb24uaHJlZikub3JpZ2luPT09ZX19ZnVuY3Rpb24gQ3UocixlKXtyZXR1cm4gZT09PXZvaWQgMCYmIUR1KHIpPyJhbm9ueW1vdXMiOmV9ZnVuY3Rpb24gT3UocixlLHQpe3Q9dHx8TGU7bGV0IG47aWYoZT1lIT09dm9pZCAwP2U6bmUuY3Jvc3NPcmlnaW4sZT1DdShyLGUpLHR5cGVvZiBJbWFnZSE9InVuZGVmaW5lZCIpe249bmV3IEltYWdlLGUhPT12b2lkIDAmJihuLmNyb3NzT3JpZ2luPWUpO2NvbnN0IGk9ZnVuY3Rpb24oKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixvKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMpLG49bnVsbH0sbz1mdW5jdGlvbigpe2NvbnN0IHU9ImNvdWxkbid0IGxvYWQgaW1hZ2U6ICIrcjt4bih1KSx0KHUsbiksaSgpfSxzPWZ1bmN0aW9uKCl7dChudWxsLG4pLGkoKX07cmV0dXJuIG4uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG8pLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIscyksbi5zcmM9cixufWVsc2UgaWYodHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIil7bGV0IGksbztjb25zdCBzPWZ1bmN0aW9uKCl7dChpLG8pfSxhPXt9O2UmJihhLm1vZGU9ImNvcnMiKSxmZXRjaChyLGEpLnRoZW4oZnVuY3Rpb24odSl7aWYoIXUub2spdGhyb3cgdTtyZXR1cm4gdS5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHUpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh1LHtwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KX0pLnRoZW4oZnVuY3Rpb24odSl7bz11LHNldFRpbWVvdXQocyl9KS5jYXRjaChmdW5jdGlvbih1KXtpPXUsc2V0VGltZW91dChzKX0pLG49bnVsbH1yZXR1cm4gbn1mdW5jdGlvbiBXbihyKXtyZXR1cm4gdHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwfHx0eXBlb2YgSW1hZ2VEYXRhIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlRGF0YXx8dHlwZW9mIEhUTUxFbGVtZW50IT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fWZ1bmN0aW9uIHlyKHIsZSx0KXtyZXR1cm4gV24ocik/KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KG51bGwscil9KSxyKTpPdShyLGUsdCl9ZnVuY3Rpb24gX3IocixlLHQpe3Q9dHx8bmUudGV4dHVyZU9wdGlvbnM7Y29uc3Qgbj10LnRhcmdldHx8aWU7aWYoci5iaW5kVGV4dHVyZShuLGUpLHQuY29sb3I9PT0hMSlyZXR1cm47Y29uc3QgaT1QdSh0LmNvbG9yKTtpZihuPT09b2UpZm9yKGxldCBvPTA7bzw2OysrbylyLnRleEltYWdlMkQoYXIrbywwLEksMSwxLDAsSSxTLGkpO2Vsc2Ugbj09PWRlfHxuPT09bWU/ci50ZXhJbWFnZTNEKG4sMCxJLDEsMSwxLDAsSSxTLGkpOnIudGV4SW1hZ2UyRChuLDAsSSwxLDEsMCxJLFMsaSl9ZnVuY3Rpb24gTXUocixlLHQsbil7cmV0dXJuIG49bnx8TGUsdD10fHxuZS50ZXh0dXJlT3B0aW9ucyxfcihyLGUsdCksdD1PYmplY3QuYXNzaWduKHt9LHQpLHlyKHQuc3JjLHQuY3Jvc3NPcmlnaW4sZnVuY3Rpb24obyxzKXtvP24obyxlLHMpOihWbihyLGUscyx0KSxuKG51bGwsZSxzKSl9KX1mdW5jdGlvbiBOdShyLGUsdCxuKXtuPW58fExlO2NvbnN0IGk9dC5zcmM7aWYoaS5sZW5ndGghPT02KXRocm93InRoZXJlIG11c3QgYmUgNiB1cmxzIGZvciBhIGN1YmVtYXAiO2NvbnN0IG89dC5sZXZlbHx8MCxzPXQuaW50ZXJuYWxGb3JtYXR8fHQuZm9ybWF0fHxJLGE9QmUocyksdT10LmZvcm1hdHx8YS5mb3JtYXQsZj10LnR5cGV8fFMsYz10LnRhcmdldHx8aWU7aWYoYyE9PW9lKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfQ1VCRV9NQVAiO19yKHIsZSx0KSx0PU9iamVjdC5hc3NpZ24oe30sdCk7bGV0IGQ9Njtjb25zdCBwPVtdLHk9aHIocix0KTtsZXQgbTtmdW5jdGlvbiBfKGIpe3JldHVybiBmdW5jdGlvbihnLFQpey0tZCxnP3AucHVzaChnKTpULndpZHRoIT09VC5oZWlnaHQ/cC5wdXNoKCJjdWJlbWFwIGZhY2UgaW1nIGlzIG5vdCBhIHNxdWFyZTogIitULnNyYyk6KFNlKHIsdCksci5iaW5kVGV4dHVyZShjLGUpLGQ9PT01P2hyKCkuZm9yRWFjaChmdW5jdGlvbihGKXtyLnRleEltYWdlMkQoRixvLHMsdSxmLFQpfSk6ci50ZXhJbWFnZTJEKGIsbyxzLHUsZixUKSxrZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChjKSksZD09PTAmJm4ocC5sZW5ndGg/cDp2b2lkIDAsZSxtKX19bT1pLm1hcChmdW5jdGlvbihiLGcpe3JldHVybiB5cihiLHQuY3Jvc3NPcmlnaW4sXyh5W2ddKSl9KX1mdW5jdGlvbiBVdShyLGUsdCxuKXtuPW58fExlO2NvbnN0IGk9dC5zcmMsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8SSxzPUJlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxTLGY9dC50YXJnZXR8fG1lO2lmKGYhPT1kZSYmZiE9PW1lKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfM0Qgb3IgVEVYVFVSRV8yRF9BUlJBWSI7X3IocixlLHQpLHQ9T2JqZWN0LmFzc2lnbih7fSx0KTtsZXQgYz1pLmxlbmd0aDtjb25zdCBkPVtdO2xldCBwO2NvbnN0IHk9dC5sZXZlbHx8MDtsZXQgbT10LndpZHRoLF89dC5oZWlnaHQ7Y29uc3QgYj1pLmxlbmd0aDtsZXQgZz0hMDtmdW5jdGlvbiBUKEYpe3JldHVybiBmdW5jdGlvbihMLFYpe2lmKC0tYyxMKWQucHVzaChMKTtlbHNle2lmKFNlKHIsdCksci5iaW5kVGV4dHVyZShmLGUpLGcpe2c9ITEsbT10LndpZHRofHxWLndpZHRoLF89dC5oZWlnaHR8fFYuaGVpZ2h0LHIudGV4SW1hZ2UzRChmLHksbyxtLF8sYiwwLGEsdSxudWxsKTtmb3IobGV0IGVlPTA7ZWU8YjsrK2VlKXIudGV4U3ViSW1hZ2UzRChmLHksMCwwLGVlLG0sXywxLGEsdSxWKX1lbHNle2xldCBlZT1WLHE7KFYud2lkdGghPT1tfHxWLmhlaWdodCE9PV8pJiYocT1TbigpLGVlPXEuY2FudmFzLHEuY2FudmFzLndpZHRoPW0scS5jYW52YXMuaGVpZ2h0PV8scS5kcmF3SW1hZ2UoViwwLDAsbSxfKSksci50ZXhTdWJJbWFnZTNEKGYseSwwLDAsRixtLF8sMSxhLHUsZWUpLHEmJmVlPT09cS5jYW52YXMmJihxLmNhbnZhcy53aWR0aD0wLHEuY2FudmFzLmhlaWdodD0wKX1rZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChmKX1jPT09MCYmbihkLmxlbmd0aD9kOnZvaWQgMCxlLHApfX1wPWkubWFwKGZ1bmN0aW9uKEYsTCl7cmV0dXJuIHlyKEYsdC5jcm9zc09yaWdpbixUKEwpKX0pfWZ1bmN0aW9uIEJ1KHIsZSx0LG4pe249bnx8bmUudGV4dHVyZU9wdGlvbnM7Y29uc3QgaT1uLnRhcmdldHx8aWU7ci5iaW5kVGV4dHVyZShpLGUpO2xldCBvPW4ud2lkdGgscz1uLmhlaWdodCxhPW4uZGVwdGg7Y29uc3QgdT1uLmxldmVsfHwwLGY9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fEksYz1CZShmKSxkPW4uZm9ybWF0fHxjLmZvcm1hdCxwPW4udHlwZXx8SXUocix0LGMudHlwZSk7aWYoTWUodCkpdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYodD1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcikpO2Vsc2V7Y29uc3QgYj1VcyhwKTt0PW5ldyBiKHQpfWNvbnN0IHk9d3UoZixwKSxtPXQuYnl0ZUxlbmd0aC95O2lmKG0lMSl0aHJvdyJsZW5ndGggd3Jvbmcgc2l6ZSBmb3IgZm9ybWF0OiAiK1JuKHIsZCk7bGV0IF87aWYoaT09PWRlfHxpPT09bWUpaWYoIW8mJiFzJiYhYSl7Y29uc3QgYj1NYXRoLmNicnQobSk7aWYoYiUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBjdWJlIHNpemUgb2YgYXJyYXkgb2YgbnVtRWxlbWVudHM6ICIrbTtvPWIscz1iLGE9Yn1lbHNlIG8mJighc3x8IWEpPyhfPWh0KHIsaSxzLGEsbS9vKSxzPV8ud2lkdGgsYT1fLmhlaWdodCk6cyYmKCFvfHwhYSk/KF89aHQocixpLG8sYSxtL3MpLG89Xy53aWR0aCxhPV8uaGVpZ2h0KTooXz1odChyLGksbyxzLG0vYSksbz1fLndpZHRoLHM9Xy5oZWlnaHQpO2Vsc2UgXz1odChyLGksbyxzLG0pLG89Xy53aWR0aCxzPV8uaGVpZ2h0O2lmKEduKHIpLHIucGl4ZWxTdG9yZWkoZnIsbi51bnBhY2tBbGlnbm1lbnR8fDEpLFNlKHIsbiksaT09PW9lKXtjb25zdCBiPXkvdC5CWVRFU19QRVJfRUxFTUVOVCxnPW0vNipiO3ByKHIsbikuZm9yRWFjaChUPT57Y29uc3QgRj1nKlQubmR4LEw9dC5zdWJhcnJheShGLEYrZyk7ci50ZXhJbWFnZTJEKFQuZmFjZSx1LGYsbyxzLDAsZCxwLEwpfSl9ZWxzZSBpPT09ZGV8fGk9PT1tZT9yLnRleEltYWdlM0QoaSx1LGYsbyxzLGEsMCxkLHAsdCk6ci50ZXhJbWFnZTJEKGksdSxmLG8scywwLGQscCx0KTtyZXR1cm57d2lkdGg6byxoZWlnaHQ6cyxkZXB0aDphLHR5cGU6cH19ZnVuY3Rpb24ga3UocixlLHQpe2NvbnN0IG49dC50YXJnZXR8fGllO3IuYmluZFRleHR1cmUobixlKTtjb25zdCBpPXQubGV2ZWx8fDAsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8SSxzPUJlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxzLnR5cGU7aWYoU2Uocix0KSxuPT09b2UpZm9yKGxldCBmPTA7Zjw2OysrZilyLnRleEltYWdlMkQoYXIrZixpLG8sdC53aWR0aCx0LmhlaWdodCwwLGEsdSxudWxsKTtlbHNlIG49PT1kZXx8bj09PW1lP3IudGV4SW1hZ2UzRChuLGksbyx0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsMCxhLHUsbnVsbCk6ci50ZXhJbWFnZTJEKG4saSxvLHQud2lkdGgsdC5oZWlnaHQsMCxhLHUsbnVsbCl9ZnVuY3Rpb24gam4ocixlLHQpe3Q9dHx8TGUsZT1lfHxuZS50ZXh0dXJlT3B0aW9ucztjb25zdCBuPXIuY3JlYXRlVGV4dHVyZSgpLGk9ZS50YXJnZXR8fGllO2xldCBvPWUud2lkdGh8fDEscz1lLmhlaWdodHx8MTtjb25zdCBhPWUuaW50ZXJuYWxGb3JtYXR8fEk7ci5iaW5kVGV4dHVyZShpLG4pLGk9PT1vZSYmKHIudGV4UGFyYW1ldGVyaShpLGF0LHN0KSxyLnRleFBhcmFtZXRlcmkoaSx1dCxzdCkpO2xldCB1PWUuc3JjO2lmKHUpaWYodHlwZW9mIHU9PSJmdW5jdGlvbiImJih1PXUocixlKSksdHlwZW9mIHU9PSJzdHJpbmciKU11KHIsbixlLHQpO2Vsc2UgaWYoTWUodSl8fEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09Im51bWJlciJ8fEFycmF5LmlzQXJyYXkodVswXSl8fE1lKHVbMF0pKSl7Y29uc3QgZj1CdShyLG4sdSxlKTtvPWYud2lkdGgscz1mLmhlaWdodH1lbHNlIEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09InN0cmluZyJ8fFduKHVbMF0pKT9pPT09b2U/TnUocixuLGUsdCk6VXUocixuLGUsdCk6KFZuKHIsbix1LGUpLG89dS53aWR0aCxzPXUuaGVpZ2h0KTtlbHNlIGt1KHIsbixlKTtyZXR1cm4ga2UoZSkmJm1yKHIsbixlLG8scyxhKSxIbihyLG4sZSksbn1jb25zdCBwdD14bjtmdW5jdGlvbiBxbihyKXtyZXR1cm4gdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocik6bnVsbH1jb25zdCB5dD0zMzk4NCxfdD0zNDk2MixMdT0zNDk2MywkdT0zNTcxMyx6dT0zNTcxNCxHdT0zNTYzMixIdT0zNTYzMyxWdT0zNTk4MSxYbj0zNTcxOCxXdT0zNTcyMSxqdT0zNTk3MSxxdT0zNTM4MixYdT0zNTM5NixZdT0zNTM5OCxLdT0zNTM5MixKdT0zNTM5NSx4dD01MTI2LFluPTM1NjY0LEtuPTM1NjY1LEpuPTM1NjY2LHhyPTUxMjQsUW49MzU2NjcsWm49MzU2NjgsZWk9MzU2NjksdGk9MzU2NzAscmk9MzU2NzEsbmk9MzU2NzIsaWk9MzU2NzMsb2k9MzU2NzQsc2k9MzU2NzUsYWk9MzU2NzYsUXU9MzU2NzgsWnU9MzU2ODAsZWM9MzU2NzksdGM9MzU2ODIscmM9MzU2ODUsbmM9MzU2ODYsaWM9MzU2ODcsb2M9MzU2ODgsc2M9MzU2ODksYWM9MzU2OTAsdWM9MzYyODksY2M9MzYyOTIsZmM9MzYyOTMsYnI9NTEyNSx1aT0zNjI5NCxjaT0zNjI5NSxmaT0zNjI5NixsYz0zNjI5OCxkYz0zNjI5OSxtYz0zNjMwMCxoYz0zNjMwMyxwYz0zNjMwNix5Yz0zNjMwNyxfYz0zNjMwOCx4Yz0zNjMxMSxidD0zNTUzLGd0PTM0MDY3LGdyPTMyODc5LHZ0PTM1ODY2LHY9e307ZnVuY3Rpb24gbGkocixlKXtyZXR1cm4gdltlXS5iaW5kUG9pbnR9ZnVuY3Rpb24gYmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWYoZSx0KX19ZnVuY3Rpb24gZ2MocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWZ2KGUsdCl9fWZ1bmN0aW9uIHZjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJmdihlLHQpfX1mdW5jdGlvbiBFYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0zZnYoZSx0KX19ZnVuY3Rpb24gVGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNGZ2KGUsdCl9fWZ1bmN0aW9uIGRpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpKGUsdCl9fWZ1bmN0aW9uIG1pKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpdihlLHQpfX1mdW5jdGlvbiBoaShyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0yaXYoZSx0KX19ZnVuY3Rpb24gcGkocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtM2l2KGUsdCl9fWZ1bmN0aW9uIHlpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTRpdihlLHQpfX1mdW5jdGlvbiBBYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xdWkoZSx0KX19ZnVuY3Rpb24gd2MocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMXVpdihlLHQpfX1mdW5jdGlvbiBSYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0ydWl2KGUsdCl9fWZ1bmN0aW9uIFNjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTN1aXYoZSx0KX19ZnVuY3Rpb24gSWMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNHVpdihlLHQpfX1mdW5jdGlvbiBGYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyZnYoZSwhMSx0KX19ZnVuY3Rpb24gUGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtTWF0cml4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIERjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDRmdihlLCExLHQpfX1mdW5jdGlvbiBDYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDNmdihlLCExLHQpfX1mdW5jdGlvbiBPYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDJmdihlLCExLHQpfX1mdW5jdGlvbiBNYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDRmdihlLCExLHQpfX1mdW5jdGlvbiBOYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDJmdihlLCExLHQpfX1mdW5jdGlvbiBVYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDRmdihlLCExLHQpfX1mdW5jdGlvbiBCYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDNmdihlLCExLHQpfX1mdW5jdGlvbiBCKHIsZSx0LG4pe2NvbnN0IGk9bGkocixlKTtyZXR1cm4gT2Uocik/ZnVuY3Rpb24obyl7bGV0IHMsYTtvcihyLG8pPyhzPW8sYT1udWxsKToocz1vLnRleHR1cmUsYT1vLnNhbXBsZXIpLHIudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHl0K3QpLHIuYmluZFRleHR1cmUoaSxzKSxyLmJpbmRTYW1wbGVyKHQsYSl9OmZ1bmN0aW9uKG8pe3IudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHl0K3QpLHIuYmluZFRleHR1cmUoaSxvKX19ZnVuY3Rpb24gayhyLGUsdCxuLGkpe2NvbnN0IG89bGkocixlKSxzPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgYT0wO2E8aTsrK2Epc1thXT10K2E7cmV0dXJuIE9lKHIpP2Z1bmN0aW9uKGEpe3IudW5pZm9ybTFpdihuLHMpLGEuZm9yRWFjaChmdW5jdGlvbih1LGYpe3IuYWN0aXZlVGV4dHVyZSh5dCtzW2ZdKTtsZXQgYyxkO29yKHIsdSk/KGM9dSxkPW51bGwpOihjPXUudGV4dHVyZSxkPXUuc2FtcGxlciksci5iaW5kU2FtcGxlcih0LGQpLHIuYmluZFRleHR1cmUobyxjKX0pfTpmdW5jdGlvbihhKXtyLnVuaWZvcm0xaXYobixzKSxhLmZvckVhY2goZnVuY3Rpb24odSxmKXtyLmFjdGl2ZVRleHR1cmUoeXQrc1tmXSksci5iaW5kVGV4dHVyZShvLHUpfSl9fXZbeHRdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQsc2V0dGVyOmJjLGFycmF5U2V0dGVyOmdjfSx2W1luXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo4LHNldHRlcjp2Yyxjb2xzOjJ9LHZbS25dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjEyLHNldHRlcjpFYyxjb2xzOjN9LHZbSm5dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjE2LHNldHRlcjpUYyxjb2xzOjR9LHZbeHJdPXtUeXBlOkludDMyQXJyYXksc2l6ZTo0LHNldHRlcjpkaSxhcnJheVNldHRlcjptaX0sdltRbl09e1R5cGU6SW50MzJBcnJheSxzaXplOjgsc2V0dGVyOmhpLGNvbHM6Mn0sdltabl09e1R5cGU6SW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpwaSxjb2xzOjN9LHZbZWldPXtUeXBlOkludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6eWksY29sczo0fSx2W2JyXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOkFjLGFycmF5U2V0dGVyOndjfSx2W3VpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOlJjLGNvbHM6Mn0sdltjaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6U2MsY29sczozfSx2W2ZpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpJYyxjb2xzOjR9LHZbdGldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6ZGksYXJyYXlTZXR0ZXI6bWl9LHZbcmldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6OCxzZXR0ZXI6aGksY29sczoyfSx2W25pXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpwaSxjb2xzOjN9LHZbaWldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOnlpLGNvbHM6NH0sdltvaV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOkZjLHJvd3M6Mixjb2xzOjJ9LHZbc2ldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpQYyxyb3dzOjMsY29sczozfSx2W2FpXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6RGMscm93czo0LGNvbHM6NH0sdltyY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOkNjLHJvd3M6Mixjb2xzOjN9LHZbbmNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpNYyxyb3dzOjIsY29sczo0fSx2W2ljXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6T2Mscm93czozLGNvbHM6Mn0sdltvY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOlVjLHJvd3M6Myxjb2xzOjR9LHZbc2NdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjY0LHNldHRlcjpOYyxyb3dzOjQsY29sczoyfSx2W2FjXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6QmMscm93czo0LGNvbHM6M30sdltRdV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6YnR9LHZbWnVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50Omd0fSx2W2VjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDpncn0sdlt0Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6YnR9LHZbdWNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50OnZ0fSx2W2NjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDp2dH0sdltmY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6Z3R9LHZbbGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50OmJ0fSx2W2RjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDpncn0sdlttY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6Z3R9LHZbaGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50OnZ0fSx2W3BjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDpidH0sdlt5Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6Z3J9LHZbX2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50Omd0fSx2W3hjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDp2dH07ZnVuY3Rpb24gRXQocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlzd2l0Y2goci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSksdC52YWx1ZS5sZW5ndGgpe2Nhc2UgNDpyLnZlcnRleEF0dHJpYjRmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMzpyLnZlcnRleEF0dHJpYjNmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMjpyLnZlcnRleEF0dHJpYjJmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMTpyLnZlcnRleEF0dHJpYjFmdihlLHQudmFsdWUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIGEgZmxvYXQgY29uc3RhbnQgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQhIil9ZWxzZSByLmJpbmRCdWZmZXIoX3QsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHx4dCx0Lm5vcm1hbGl6ZXx8ITEsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gYWUocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlpZihyLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZhbHVlLmxlbmd0aD09PTQpci52ZXJ0ZXhBdHRyaWI0aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihfdCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHx4cix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiBUdChyLGUpe3JldHVybiBmdW5jdGlvbih0KXtpZih0LnZhbHVlKWlmKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmFsdWUubGVuZ3RoPT09NClyLnZlcnRleEF0dHJpYjR1aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihfdCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHxicix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiB2cihyLGUsdCl7Y29uc3Qgbj10LnNpemUsaT10LmNvdW50O3JldHVybiBmdW5jdGlvbihvKXtyLmJpbmRCdWZmZXIoX3Qsby5idWZmZXIpO2NvbnN0IHM9by5zaXplfHxvLm51bUNvbXBvbmVudHN8fG4sYT1zL2ksdT1vLnR5cGV8fHh0LGM9dlt1XS5zaXplKnMsZD1vLm5vcm1hbGl6ZXx8ITEscD1vLm9mZnNldHx8MCx5PWMvaTtmb3IobGV0IG09MDttPGk7KyttKXIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSttKSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoZSttLGEsdSxkLGMscCt5Km0pLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUrbSxvLmRpdmlzb3J8fDApfX1jb25zdCBQPXt9O1BbeHRdPXtzaXplOjQsc2V0dGVyOkV0fSxQW1luXT17c2l6ZTo4LHNldHRlcjpFdH0sUFtLbl09e3NpemU6MTIsc2V0dGVyOkV0fSxQW0puXT17c2l6ZToxNixzZXR0ZXI6RXR9LFBbeHJdPXtzaXplOjQsc2V0dGVyOmFlfSxQW1FuXT17c2l6ZTo4LHNldHRlcjphZX0sUFtabl09e3NpemU6MTIsc2V0dGVyOmFlfSxQW2VpXT17c2l6ZToxNixzZXR0ZXI6YWV9LFBbYnJdPXtzaXplOjQsc2V0dGVyOlR0fSxQW3VpXT17c2l6ZTo4LHNldHRlcjpUdH0sUFtjaV09e3NpemU6MTIsc2V0dGVyOlR0fSxQW2ZpXT17c2l6ZToxNixzZXR0ZXI6VHR9LFBbdGldPXtzaXplOjQsc2V0dGVyOmFlfSxQW3JpXT17c2l6ZTo4LHNldHRlcjphZX0sUFtuaV09e3NpemU6MTIsc2V0dGVyOmFlfSxQW2lpXT17c2l6ZToxNixzZXR0ZXI6YWV9LFBbb2ldPXtzaXplOjQsc2V0dGVyOnZyLGNvdW50OjJ9LFBbc2ldPXtzaXplOjksc2V0dGVyOnZyLGNvdW50OjN9LFBbYWldPXtzaXplOjE2LHNldHRlcjp2cixjb3VudDo0fTtjb25zdCBrYz0vRVJST1I6XHMqXGQrOihcZCspL2dpO2Z1bmN0aW9uIExjKHIsZT0iIix0PTApe2NvbnN0IG49Wy4uLmUubWF0Y2hBbGwoa2MpXSxpPW5ldyBNYXAobi5tYXAoKG8scyk9Pntjb25zdCBhPXBhcnNlSW50KG9bMV0pLHU9bltzKzFdLGY9dT91LmluZGV4OmUubGVuZ3RoLGM9ZS5zdWJzdHJpbmcoby5pbmRleCxmKTtyZXR1cm5bYS0xLGNdfSkpO3JldHVybiByLnNwbGl0KGAKYCkubWFwKChvLHMpPT57Y29uc3QgYT1pLmdldChzKTtyZXR1cm5gJHtzKzErdH06ICR7b30ke2E/YAoKXl5eICR7YX1gOiIifWB9KS5qb2luKGAKYCl9Y29uc3QgX2k9L15bIFx0XSpcbi87ZnVuY3Rpb24geGkocil7bGV0IGU9MDtyZXR1cm4gX2kudGVzdChyKSYmKGU9MSxyPXIucmVwbGFjZShfaSwiIikpLHtsaW5lT2Zmc2V0OmUsc2hhZGVyU291cmNlOnJ9fWZ1bmN0aW9uIGJpKHIsZSl7cmV0dXJuIHIuZXJyb3JDYWxsYmFjayhlKSxyLmNhbGxiYWNrJiZzZXRUaW1lb3V0KCgpPT57ci5jYWxsYmFjayhgJHtlfQoke3IuZXJyb3JzLmpvaW4oYApgKX1gKX0pLG51bGx9ZnVuY3Rpb24gZ2kocixlLHQsbil7Y29uc3QgaT1yLmNyZWF0ZVNoYWRlcih0KTtyZXR1cm4gci5zaGFkZXJTb3VyY2UoaSx4aShlKS5zaGFkZXJTb3VyY2UpLHIuY29tcGlsZVNoYWRlcihpKSwhbi5jYWxsYmFjayYmISRjKHIsdCxpLG4uZXJyb3JDYWxsYmFjayk/KHIuZGVsZXRlU2hhZGVyKGkpLG51bGwpOml9ZnVuY3Rpb24gJGMocixlLHQsbil7bj1ufHxwdDtjb25zdCBpPXIuZ2V0U2hhZGVyUGFyYW1ldGVyKHQsJHUpO2lmKCFpKXtjb25zdCBvPXIuZ2V0U2hhZGVySW5mb0xvZyh0KSx7bGluZU9mZnNldDpzLHNoYWRlclNvdXJjZTphfT14aShyLmdldFNoYWRlclNvdXJjZSh0KSk7bihgJHtMYyhhLG8scyl9CkVycm9yIGNvbXBpbGluZyAke1JuKHIsZSl9OiAke299YCl9cmV0dXJuIGl9ZnVuY3Rpb24gRXIocixlLHQpe2xldCBuLGksbztpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHQ9ZSxlPXZvaWQgMCksdHlwZW9mIHI9PSJmdW5jdGlvbiIpdD1yLHI9dm9pZCAwO2Vsc2UgaWYociYmIUFycmF5LmlzQXJyYXkocikpe2lmKHIuZXJyb3JDYWxsYmFjayYmci5lcnJvcnMpcmV0dXJuIHI7Y29uc3QgZj1yO3Q9Zi5lcnJvckNhbGxiYWNrLHI9Zi5hdHRyaWJMb2NhdGlvbnMsbj1mLnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MsaT1mLnRyYW5zZm9ybUZlZWRiYWNrTW9kZSxvPWYuY2FsbGJhY2t9Y29uc3Qgcz10fHxwdCxhPVtdLHU9e2Vycm9yQ2FsbGJhY2soZiwuLi5jKXthLnB1c2goZikscyhmLC4uLmMpfSx0cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzOm4sdHJhbnNmb3JtRmVlZGJhY2tNb2RlOmksY2FsbGJhY2s6byxlcnJvcnM6YX07aWYocil7bGV0IGY9e307QXJyYXkuaXNBcnJheShyKT9yLmZvckVhY2goZnVuY3Rpb24oYyxkKXtmW2NdPWU/ZVtkXTpkfSk6Zj1yLHUuYXR0cmliTG9jYXRpb25zPWZ9cmV0dXJuIHV9Y29uc3Qgdmk9WyJWRVJURVhfU0hBREVSIiwiRlJBR01FTlRfU0hBREVSIl07ZnVuY3Rpb24gemMocixlKXtpZihlLmluZGV4T2YoImZyYWciKT49MClyZXR1cm4gR3U7aWYoZS5pbmRleE9mKCJ2ZXJ0Iik+PTApcmV0dXJuIEh1fWZ1bmN0aW9uIEVpKHIsZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3IuZGVsZXRlU2hhZGVyKHQpfSl9Y29uc3QgR2M9KHI9MCk9Pm5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoZSxyKSk7ZnVuY3Rpb24gSGMocixlLHQsbixpKXtjb25zdCBvPUVyKHQsbixpKSxzPVtdLGE9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDsrK2Mpe2xldCBkPWVbY107aWYodHlwZW9mIGQ9PSJzdHJpbmciKXtjb25zdCBwPXFuKGQpLHk9cD9wLnRleHQ6ZDtsZXQgbT1yW3ZpW2NdXTtwJiZwLnR5cGUmJihtPXpjKHIscC50eXBlKXx8bSksZD1naShyLHksbSxvKSxhLnB1c2goZCl9THMocixkKSYmcy5wdXNoKGQpfWlmKHMubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuIEVpKHIsYSksYmkobywibm90IGVub3VnaCBzaGFkZXJzIGZvciBwcm9ncmFtIik7Y29uc3QgdT1yLmNyZWF0ZVByb2dyYW0oKTtzLmZvckVhY2goZnVuY3Rpb24oYyl7ci5hdHRhY2hTaGFkZXIodSxjKX0pLG8uYXR0cmliTG9jYXRpb25zJiZPYmplY3Qua2V5cyhvLmF0dHJpYkxvY2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbihjKXtyLmJpbmRBdHRyaWJMb2NhdGlvbih1LG8uYXR0cmliTG9jYXRpb25zW2NdLGMpfSk7bGV0IGY9by50cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzO3JldHVybiBmJiYoZi5hdHRyaWJzJiYoZj1mLmF0dHJpYnMpLEFycmF5LmlzQXJyYXkoZil8fChmPU9iamVjdC5rZXlzKGYpKSxyLnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3ModSxmLG8udHJhbnNmb3JtRmVlZGJhY2tNb2RlfHxWdSkpLHIubGlua1Byb2dyYW0odSksby5jYWxsYmFjaz8oVmMocix1LG8pLG51bGwpOlRpKHIsdSxvLmVycm9yQ2FsbGJhY2spP3U6KHIuZGVsZXRlUHJvZ3JhbSh1KSxFaShyLGEpLG51bGwpfWFzeW5jIGZ1bmN0aW9uIFZjKHIsZSx0KXtjb25zdCBuPXIuZ2V0RXh0ZW5zaW9uKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSxpPW4/KHUsZik9PnUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihmLG4uQ09NUExFVElPTl9TVEFUVVNfS0hSKTooKT0+ITA7bGV0IG89MDtkbyBhd2FpdCBHYyhvKSxvPTFlMy82MDt3aGlsZSghaShyLGUpKTtjb25zdCBzPVRpKHIsZSx0LmVycm9yQ2FsbGJhY2spLGE9cz92b2lkIDA6dC5lcnJvcnMuam9pbihgCmApO3N8fCgodC5lcnJvckNhbGxiYWNrfHxwdCkoYSksci5kZWxldGVQcm9ncmFtKGUpLGU9bnVsbCksdC5jYWxsYmFjayhhLGUpfWZ1bmN0aW9uIFRpKHIsZSx0KXt0PXR8fHB0O2NvbnN0IG49ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsenUpO2lmKCFuKXtjb25zdCBpPXIuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7dChgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke2l9YCl9cmV0dXJuIG59ZnVuY3Rpb24gV2MocixlLHQsbixpKXtjb25zdCBvPUVyKHQsbixpKSxzPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7KythKXtjb25zdCB1PWdpKHIsZVthXSxyW3ZpW2FdXSxvKTtpZighby5jYWxsYmFjayYmIXUpcmV0dXJuIG51bGw7cy5wdXNoKHUpfXJldHVybiBIYyhyLHMsbyl9ZnVuY3Rpb24gQWkocil7Y29uc3QgZT1yLm5hbWU7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZ2xfIil8fGUuc3RhcnRzV2l0aCgid2ViZ2xfIil9Y29uc3QgamM9LyhcLnxcW3xdfFx3KykvZyxxYz1yPT5yPj0iMCImJnI8PSI5IjtmdW5jdGlvbiBYYyhyLGUsdCxuKXtjb25zdCBpPXIuc3BsaXQoamMpLmZpbHRlcihhPT5hIT09IiIpO2xldCBvPTAscz0iIjtmb3IoOzspe2NvbnN0IGE9aVtvKytdO3MrPWE7Y29uc3QgdT1xYyhhWzBdKSxmPXU/cGFyc2VJbnQoYSk6YTtpZih1JiYocys9aVtvKytdKSxvPT09aS5sZW5ndGgpe3RbZl09ZTticmVha31lbHNle2NvbnN0IGQ9aVtvKytdLHA9ZD09PSJbIix5PXRbZl18fChwP1tdOnt9KTt0W2ZdPXksdD15LG5bc109bltzXXx8ZnVuY3Rpb24obSl7cmV0dXJuIGZ1bmN0aW9uKF8pe3dpKG0sXyl9fSh5KSxzKz1kfX19ZnVuY3Rpb24gWWMocixlKXtsZXQgdD0wO2Z1bmN0aW9uIG4oYSx1LGYpe2NvbnN0IGM9dS5uYW1lLmVuZHNXaXRoKCJbMF0iKSxkPXUudHlwZSxwPXZbZF07aWYoIXApdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGU6IDB4JHtkLnRvU3RyaW5nKDE2KX1gKTtsZXQgeTtpZihwLmJpbmRQb2ludCl7Y29uc3QgbT10O3QrPXUuc2l6ZSxjP3k9cC5hcnJheVNldHRlcihyLGQsbSxmLHUuc2l6ZSk6eT1wLnNldHRlcihyLGQsbSxmLHUuc2l6ZSl9ZWxzZSBwLmFycmF5U2V0dGVyJiZjP3k9cC5hcnJheVNldHRlcihyLGYpOnk9cC5zZXR0ZXIocixmKTtyZXR1cm4geS5sb2NhdGlvbj1mLHl9Y29uc3QgaT17fSxvPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsWG4pO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7aWYoQWkodSkpY29udGludWU7bGV0IGY9dS5uYW1lO2YuZW5kc1dpdGgoIlswXSIpJiYoZj1mLnN1YnN0cigwLGYubGVuZ3RoLTMpKTtjb25zdCBjPXIuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdS5uYW1lKTtpZihjKXtjb25zdCBkPW4oZSx1LGMpO2lbZl09ZCxYYyhmLGQsbyxpKX19cmV0dXJuIGl9ZnVuY3Rpb24gS2MocixlKXtjb25zdCB0PXt9LG49ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsanUpO2ZvcihsZXQgaT0wO2k8bjsrK2kpe2NvbnN0IG89ci5nZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoZSxpKTt0W28ubmFtZV09e2luZGV4OmksdHlwZTpvLnR5cGUsc2l6ZTpvLnNpemV9fXJldHVybiB0fWZ1bmN0aW9uIEpjKHIsZSl7Y29uc3QgdD1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxYbiksbj1bXSxpPVtdO2ZvcihsZXQgYT0wO2E8dDsrK2Epe2kucHVzaChhKSxuLnB1c2goe30pO2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7blthXS5uYW1lPXUubmFtZX1bWyJVTklGT1JNX1RZUEUiLCJ0eXBlIl0sWyJVTklGT1JNX1NJWkUiLCJzaXplIl0sWyJVTklGT1JNX0JMT0NLX0lOREVYIiwiYmxvY2tOZHgiXSxbIlVOSUZPUk1fT0ZGU0VUIiwib2Zmc2V0Il1dLmZvckVhY2goZnVuY3Rpb24oYSl7Y29uc3QgdT1hWzBdLGY9YVsxXTtyLmdldEFjdGl2ZVVuaWZvcm1zKGUsaSxyW3VdKS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7bltkXVtmXT1jfSl9KTtjb25zdCBvPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUscXUpO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKGUsYSksZj17aW5kZXg6ci5nZXRVbmlmb3JtQmxvY2tJbmRleChlLHUpLHVzZWRCeVZlcnRleFNoYWRlcjpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsWHUpLHVzZWRCeUZyYWdtZW50U2hhZGVyOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxZdSksc2l6ZTpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsS3UpLHVuaWZvcm1JbmRpY2VzOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxKdSl9O2YudXNlZD1mLnVzZWRCeVZlcnRleFNoYWRlcnx8Zi51c2VkQnlGcmFnbWVudFNoYWRlcixvW3VdPWZ9cmV0dXJue2Jsb2NrU3BlY3M6byx1bmlmb3JtRGF0YTpufX1mdW5jdGlvbiB3aShyLGUpe2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IG49clt0XTt0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGVbdF0pOndpKHJbdF0sZVt0XSl9fWZ1bmN0aW9uIFJpKHIsLi4uZSl7Y29uc3QgdD1yLnVuaWZvcm1TZXR0ZXJzfHxyLG49ZS5sZW5ndGg7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1lW2ldO2lmKEFycmF5LmlzQXJyYXkobykpe2NvbnN0IHM9by5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzOysrYSlSaSh0LG9bYV0pfWVsc2UgZm9yKGNvbnN0IHMgaW4gbyl7Y29uc3QgYT10W3NdO2EmJmEob1tzXSl9fX1mdW5jdGlvbiBRYyhyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxXdSk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1yLmdldEFjdGl2ZUF0dHJpYihlLGkpO2lmKEFpKG8pKWNvbnRpbnVlO2NvbnN0IHM9ci5nZXRBdHRyaWJMb2NhdGlvbihlLG8ubmFtZSksYT1QW28udHlwZV0sdT1hLnNldHRlcihyLHMsYSk7dS5sb2NhdGlvbj1zLHRbby5uYW1lXT11fXJldHVybiB0fWZ1bmN0aW9uIFpjKHIsZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1yW3RdO24mJm4oZVt0XSl9fWZ1bmN0aW9uIGVmKHIsZSx0KXt0LnZlcnRleEFycmF5T2JqZWN0P3IuYmluZFZlcnRleEFycmF5KHQudmVydGV4QXJyYXlPYmplY3QpOihaYyhlLmF0dHJpYlNldHRlcnN8fGUsdC5hdHRyaWJzKSx0LmluZGljZXMmJnIuYmluZEJ1ZmZlcihMdSx0LmluZGljZXMpKX1mdW5jdGlvbiBTaShyLGUpe2NvbnN0IHQ9WWMocixlKSxuPVFjKHIsZSksaT17cHJvZ3JhbTplLHVuaWZvcm1TZXR0ZXJzOnQsYXR0cmliU2V0dGVyczpufTtyZXR1cm4gT2UocikmJihpLnVuaWZvcm1CbG9ja1NwZWM9SmMocixlKSxpLnRyYW5zZm9ybUZlZWRiYWNrSW5mbz1LYyhyLGUpKSxpfWNvbnN0IHRmPS9cc3x7fH18Oy87ZnVuY3Rpb24gcmYocixlLHQsbixpKXtjb25zdCBvPUVyKHQsbixpKSxzPVtdO2lmKGU9ZS5tYXAoZnVuY3Rpb24oZil7aWYoIXRmLnRlc3QoZikpe2NvbnN0IGM9cW4oZik7aWYoYylmPWMudGV4dDtlbHNle2NvbnN0IGQ9YG5vIGVsZW1lbnQgd2l0aCBpZDogJHtmfWA7by5lcnJvckNhbGxiYWNrKGQpLHMucHVzaChkKX19cmV0dXJuIGZ9KSxzLmxlbmd0aClyZXR1cm4gYmkobywiIik7Y29uc3QgYT1vLmNhbGxiYWNrO2EmJihvLmNhbGxiYWNrPShmLGMpPT57bGV0IGQ7Znx8KGQ9U2kocixjKSksYShmLGQpfSk7Y29uc3QgdT1XYyhyLGUsbyk7cmV0dXJuIHU/U2kocix1KTpudWxsfWNvbnN0IG5mPTQsSWk9NTEyMztmdW5jdGlvbiBvZihyLGUsdCxuLGksbyl7dD10PT09dm9pZCAwP25mOnQ7Y29uc3Qgcz1lLmluZGljZXMsYT1lLmVsZW1lbnRUeXBlLHU9bj09PXZvaWQgMD9lLm51bUVsZW1lbnRzOm47aT1pPT09dm9pZCAwPzA6aSxhfHxzP28hPT12b2lkIDA/ci5kcmF3RWxlbWVudHNJbnN0YW5jZWQodCx1LGE9PT12b2lkIDA/SWk6ZS5lbGVtZW50VHlwZSxpLG8pOnIuZHJhd0VsZW1lbnRzKHQsdSxhPT09dm9pZCAwP0lpOmUuZWxlbWVudFR5cGUsaSk6byE9PXZvaWQgMD9yLmRyYXdBcnJheXNJbnN0YW5jZWQodCxpLHUsbyk6ci5kcmF3QXJyYXlzKHQsaSx1KX1jb25zdCBGaT0zNjE2MCxBdD0zNjE2MSxzZj0zNTUzLGFmPTUxMjEsdWY9NjQwMixjZj02NDA4LGZmPTMzMTkwLGxmPTM2MDEyLGRmPTM1MDU2LG1mPTM2MDEzLGhmPTMyODU0LHBmPTMyODU1LHlmPTM2MTk0LFBpPTMzMTg5LERpPTY0MDEsQ2k9MzYxNjgsVHI9MzQwNDEsQXI9MzYwNjQsd3Q9MzYwOTYsT2k9MzYxMjgsd3I9MzMzMDYsUnI9MzMwNzEsU3I9OTcyOSxfZj1be2Zvcm1hdDpjZix0eXBlOmFmLG1pbjpTcix3cmFwOlJyfSx7Zm9ybWF0OlRyfV0saj17fTtqW1RyXT13cixqW0RpXT1PaSxqW0NpXT1PaSxqW3VmXT13dCxqW1BpXT13dCxqW2ZmXT13dCxqW2xmXT13dCxqW2RmXT13cixqW21mXT13cjtmdW5jdGlvbiB4ZihyLGUpe3JldHVybiBqW3JdfHxqW2VdfWNvbnN0IHVlPXt9O3VlW2hmXT0hMCx1ZVtwZl09ITAsdWVbeWZdPSEwLHVlW1RyXT0hMCx1ZVtQaV09ITAsdWVbRGldPSEwLHVlW0NpXT0hMDtmdW5jdGlvbiBiZihyKXtyZXR1cm4gdWVbcl19Y29uc3QgZ2Y9MzI7ZnVuY3Rpb24gdmYocil7cmV0dXJuIHI+PUFyJiZyPEFyK2dmfWZ1bmN0aW9uIFJ0KHIsZSx0LG4pe2NvbnN0IGk9Rmksbz1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ci5iaW5kRnJhbWVidWZmZXIoaSxvKSx0PXR8fHIuZHJhd2luZ0J1ZmZlcldpZHRoLG49bnx8ci5kcmF3aW5nQnVmZmVySGVpZ2h0LGU9ZXx8X2Y7Y29uc3Qgcz1bXSxhPXtmcmFtZWJ1ZmZlcjpvLGF0dGFjaG1lbnRzOltdLHdpZHRoOnQsaGVpZ2h0Om59O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24odSxmKXtsZXQgYz11LmF0dGFjaG1lbnQ7Y29uc3QgZD11LnNhbXBsZXMscD11LmZvcm1hdDtsZXQgeT11LmF0dGFjaG1lbnRQb2ludHx8eGYocCx1LmludGVybmFsRm9ybWF0KTtpZih5fHwoeT1BcitmKSx2Zih5KSYmcy5wdXNoKHkpLCFjKWlmKGQhPT12b2lkIDB8fGJmKHApKWM9ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxyLmJpbmRSZW5kZXJidWZmZXIoQXQsYyksZD4xP3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKEF0LGQscCx0LG4pOnIucmVuZGVyYnVmZmVyU3RvcmFnZShBdCxwLHQsbik7ZWxzZXtjb25zdCBtPU9iamVjdC5hc3NpZ24oe30sdSk7bS53aWR0aD10LG0uaGVpZ2h0PW4sbS5hdXRvPT09dm9pZCAwJiYobS5hdXRvPSExLG0ubWluPW0ubWlufHxtLm1pbk1hZ3x8U3IsbS5tYWc9bS5tYWd8fG0ubWluTWFnfHxTcixtLndyYXBTPW0ud3JhcFN8fG0ud3JhcHx8UnIsbS53cmFwVD1tLndyYXBUfHxtLndyYXB8fFJyKSxjPWpuKHIsbSl9aWYoa3MocixjKSlyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGkseSxBdCxjKTtlbHNlIGlmKG9yKHIsYykpdS5sYXllciE9PXZvaWQgMD9yLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKGkseSxjLHUubGV2ZWx8fDAsdS5sYXllcik6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLHksdS50YXJnZXR8fHNmLGMsdS5sZXZlbHx8MCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gYXR0YWNobWVudCB0eXBlIik7YS5hdHRhY2htZW50cy5wdXNoKGMpfSksci5kcmF3QnVmZmVycyYmci5kcmF3QnVmZmVycyhzKSxhfWZ1bmN0aW9uIEVmKHIsZSx0KXt0PXR8fEZpLGU/KHIuYmluZEZyYW1lYnVmZmVyKHQsZS5mcmFtZWJ1ZmZlciksci52aWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCkpOihyLmJpbmRGcmFtZWJ1ZmZlcih0LG51bGwpLHIudmlld3BvcnQoMCwwLHIuZHJhd2luZ0J1ZmZlcldpZHRoLHIuZHJhd2luZ0J1ZmZlckhlaWdodCkpfWZ1bmN0aW9uIFIocixlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT9lOmpuKHIse3NyYzplLHdyYXA6ci5DTEFNUF9UT19FREdFfSl9Y2xhc3MgeWV7Y29uc3RydWN0b3IoZSl7Y29uc3R7Y29udGV4dDp0LHdpZHRoOm4saGVpZ2h0Oml9PWU7dGhpcy5jb250ZXh0PXQsdGhpcy5vcHRpb25zPWU7Y29uc3Qgbz10aGlzLmJ1aWxkRGVmaW5lcygpO3RoaXMucHJvZ3JhbUluZm89cmYodGhpcy5jb250ZXh0LFtvK3RoaXMuZ2V0VmVydGV4U2hhZGVyKCksbyt0aGlzLmdldEZyYWdtZW50U2hhZGVyKCldKSx0aGlzLmJ1ZmZlckluZm89c2EodGhpcy5jb250ZXh0LHRoaXMuZ2V0QnVmZmVycygpKSx0aGlzLmZiaT1SdCh0aGlzLmNvbnRleHQsW3tmb3JtYXQ6dGhpcy5jb250ZXh0LlJHQkEsdHlwZTp0aGlzLmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dGhpcy5jb250ZXh0LkxJTkVBUix3cmFwOnRoaXMuY29udGV4dC5DTEFNUF9UT19FREdFfV0sbixpKSx0aGlzLm91dHB1dD10aGlzLmZiaS5hdHRhY2htZW50c1swXX1yZXNpemVPdXRwdXQoZSx0KXt0aGlzLmZiaT1SdCh0aGlzLmNvbnRleHQsW3tmb3JtYXQ6dGhpcy5jb250ZXh0LlJHQkEsdHlwZTp0aGlzLmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dGhpcy5jb250ZXh0LkxJTkVBUix3cmFwOnRoaXMuY29udGV4dC5DTEFNUF9UT19FREdFfV0sZSx0KSx0aGlzLm9wdGlvbnMud2lkdGg9ZSx0aGlzLm9wdGlvbnMuaGVpZ2h0PXQsdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF19Z2V0RGVmaW5lcygpe3JldHVybnt9fWdldEJ1ZmZlcnMoKXtyZXR1cm57cG9zaXRpb246e251bUNvbXBvbmVudHM6MixkYXRhOlstMSwtMSwtMSwxLDEsLTEsMSwxLC0xLDEsMSwtMV19LHRleHR1cmVfY29vcmQ6e251bUNvbXBvbmVudHM6MixkYXRhOlswLDAsMCwxLDEsMCwxLDEsMCwxLDEsMF19fX1idWlsZERlZmluZXMoKXtsZXQgZT0iIjtjb25zdCB0PXRoaXMuZ2V0RGVmaW5lcygpO2ZvcihsZXQgbiBpbiB0KWUrPWAjZGVmaW5lICR7bn0gJHt0W25dLnRvRml4ZWQoMSl9CmA7cmV0dXJuIGV9cnVuKGUpe2NvbnN0IHQ9RGF0ZS5ub3coKTtsZXQgbj0wO3RoaXMubGFzdFJ1biYmKG49KHQtdGhpcy5sYXN0UnVuKS8xZTMpLHRoaXMubGFzdFJ1bj10LHRoaXMuY29udGV4dC52aWV3cG9ydCgwLDAsdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCx0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodCksdGhpcy5jb250ZXh0LnVzZVByb2dyYW0odGhpcy5wcm9ncmFtSW5mby5wcm9ncmFtKSxlZih0aGlzLmNvbnRleHQsdGhpcy5wcm9ncmFtSW5mbyx0aGlzLmJ1ZmZlckluZm8pLFJpKHRoaXMucHJvZ3JhbUluZm8se2RlbHRhOm4sY2FudmFzOlt0aGlzLmNvbnRleHQuY2FudmFzLndpZHRoLHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0XSwuLi5lfSksRWYodGhpcy5jb250ZXh0LHRoaXMub3B0aW9ucy5kaXNhYmxlRnJhbWVidWZmZXI/bnVsbDp0aGlzLmZiaSksb2YodGhpcy5jb250ZXh0LHRoaXMuYnVmZmVySW5mbyl9fXZhciBUZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwp1bmlmb3JtIHNhbXBsZXIyRCBtYXNrOwoKdmVjNCBsb29wKCk7Cgp2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IGxvb3AoKTsgfQpgLEFmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3Mgd2YgZXh0ZW5kcyB5ZXtnZXREZWZpbmVzKCl7dmFyIGU7cmV0dXJue1JBRElVUzooZT10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD9lOjF9fWdldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFRmK3RoaXMuY3JlYXRlTG9vcEZ1bmN0aW9uKCl9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIEFmfWNyZWF0ZUxvb3BGdW5jdGlvbigpe3ZhciB0O2xldCBlPSh0PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3Q6MTtyZXR1cm5gCgogICAgICAgIHZlYzQgbG9vcCgpIHsgCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLDAsMCwwKTsKICAgICAgICAgICAgZmxvYXQgZmFjdG9yU3VtID0gMC47CgogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRSYWRpdXMgPSB2ZWMyKC0ke2V9LikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZEluY3JlbWVudCA9IHZlYzIoMS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIGRpZmYgPSBub3JtYWxpemVkUmFkaXVzOwogICAgICAgICAgICBmbG9hdCBtYXhMZW5ndGggPSBsZW5ndGgobm9ybWFsaXplZFJhZGl1cyk7CgogICAgICAgICAgICBmb3IoaW50IHk9LSR7ZX07IHk8JHtlKzF9OyArK3kpIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgeD0tJHtlfTsgeDwke2UrMX07ICsreCkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9ICgxLi0gdGV4dHVyZTJEKG1hc2ssIF90ZXh0dXJlX2Nvb3JkICsgZGlmZikuYSkgKiAobWF4TGVuZ3RoIC0gbGVuZ3RoKGRpZmYpKSAvIG1heExlbmd0aDsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZmFjdG9yICogdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkICsgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgZmFjdG9yU3VtICs9IGZhY3RvcjsKICAgICAgICAgICAgICAgICAgICBkaWZmLnggKz0gbm9ybWFsaXplZEluY3JlbWVudC54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlmZi55ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueTsKICAgICAgICAgICAgICAgIGRpZmYueCA9IG5vcm1hbGl6ZWRSYWRpdXMueDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IC8gZmFjdG9yU3VtOwogICAgICAgIH1gfX12YXIgUmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSBzYW1wbGVyMkQgYmFja2dyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgZm9yZWdyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwoKdm9pZCBtYWluKCkgewogIHZlYzQgYmFja2dyb3VuZENvbG9yID0gdGV4dHVyZTJEKGJhY2tncm91bmQsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IGZvcmVncm91bmRDb2xvciA9IHRleHR1cmUyRChmb3JlZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCB0cmVzaG9sZENvbG9yID0gdGV4dHVyZTJEKHRocmVzaG9sZCwgX3RleHR1cmVfY29vcmQpOwogIGdsX0ZyYWdDb2xvciA9IGZvcmVncm91bmRDb2xvciAqIHRyZXNob2xkQ29sb3IuYSArCiAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yICogKDEuIC0gdHJlc2hvbGRDb2xvci5hKTsKfQpgLFNmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwogIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKfQpgO2NsYXNzIElyIGV4dGVuZHMgeWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gUmZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIFNmfX1jbGFzcyBGcntjb25zdHJ1Y3Rvcigpe3RoaXMuc3RlcHM9W119YWRkU3RlcChlKXt0aGlzLnN0ZXBzLnB1c2goZSl9YXN5bmMgcnVuKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVwcyllLnByb2dyYW0ucnVuKGUuZ2V0VW5pZm9ybXMoKSl9cmVzaXplT3V0cHV0KGUsdCl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5zdGVwcyluLnByb2dyYW0ucmVzaXplT3V0cHV0KGUsdCl9fWNsYXNzIFByIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucHJlY2lzZU1hc2tFbmFibGVkPSExfX1jbGFzcyBJZiBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH0saT1uZXcgd2Yoey4uLm4scmFkaXVzOnR9KSxvPW5ldyBJcih7Li4ubixkaXNhYmxlRnJhbWVidWZmZXI6ITB9KTt0aGlzLmFkZFN0ZXAoe3Byb2dyYW06aSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlIoZSx0aGlzLmlucHV0SW1hZ2UpLG1hc2s6UihlLHRoaXMuaW5wdXRNYXNrKX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOm8sZ2V0VW5pZm9ybXM6KCk9Pih7YmFja2dyb3VuZDpSKGUsaS5vdXRwdXQpLGZvcmVncm91bmQ6UihlLHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOlIoZSx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEoZSx0KXt0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz10fX1jbGFzcyBNaSBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5jb250ZXh0PWUsdGhpcy5wcmVjaXNlTWFza0VuYWJsZWQ9ITA7Y29uc3QgdD17Y29udGV4dDplLGhlaWdodDplLmNhbnZhcy5oZWlnaHQsd2lkdGg6ZS5jYW52YXMud2lkdGh9LG49bmV3IElyKHsuLi50LGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpuLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6UihlLHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6UihlLHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOlIoZSx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEoZSx0KXt0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz10fX1jbGFzcyBGZiBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnByZWNpc2VNYXNrRW5hYmxlZD0hMH1zZXQgaW5wdXRWaWRlbyhlKXt0aGlzLmZyYW1lUmVhZGVyPWUuZ2V0UmVhZGVyKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKX1hc3luYyBydW4oKXt0aGlzLmZyYW1lUmVhZGVyJiYoYXdhaXQgc3VwZXIucnVuKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSl9YXN5bmMgcmVhZE5leHRWaWRlb0ZyYW1lKCl7dmFyIHQ7Y29uc3QgZT1hd2FpdCgodD10aGlzLmZyYW1lUmVhZGVyKT09bnVsbD92b2lkIDA6dC5yZWFkKCkpO2UhPW51bGwmJmUudmFsdWUmJih0aGlzLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGUudmFsdWUpLGUudmFsdWUuY2xvc2UoKSl9fXZhciBQZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdmVjNCBsb29wKCk7Cgp2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IGxvb3AoKTsgfQpgLERmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmAsRHI9KHI9PihyW3IuTElORUFSPTBdPSJMSU5FQVIiLHJbci5HQVVTU0lBTj0xXT0iR0FVU1NJQU4iLHIpKShEcnx8e30pO2NsYXNzIE5pIGV4dGVuZHMgeWV7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBQZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBEZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKCiAgICAgICAgICAgIGZvcihpbnQgeT0tJHtlfTsgeTwke2UrMX07ICsreSkgewogICAgICAgICAgICAgICAgZm9yKGludCB4PS0ke2V9OyB4PCR7ZSsxfTsgKyt4KSB7CiAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gMS47CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH1nZXRGYWN0b3IoZSx0KXtzd2l0Y2godGhpcy5vcHRpb25zLnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KTtjYXNlIDA6ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KX19Z2V0TGluZWFyRmFjdG9yKGUsdCl7cmV0dXJuIDF9Z2V0R2F1c3NpYW5GYWN0b3IoZSx0KXt2YXIgdTtjb25zdCBuPU1hdGguUEkqMixpPU1hdGgubWF4KCh1PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3U6MSwxKSxvPTEvKG4qaSoqMikscz0tKGUqKjIrdCoqMiksYT1vKnM7cmV0dXJuIG8qTWF0aC5FKiphfX1jbGFzcyBDZiBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH0saT1uZXcgTmkoey4uLm4scmFkaXVzOnQsdHlwZTpEci5HQVVTU0lBTn0pLG89bmV3IElyKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6UihlLHRoaXMuaW5wdXRJbWFnZSl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpvLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6UihlLHRoaXMuaW5wdXRJbWFnZSksZm9yZWdyb3VuZDpSKGUsaS5vdXRwdXQpLHRocmVzaG9sZDpSKGUsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKGUsdCl7dGhpcy5pbnB1dEltYWdlPWUsdGhpcy5pbnB1dE1hc2s9dH19Y2xhc3MgQ3IgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmZiaTI9UnQoZS5jb250ZXh0LFt7Zm9ybWF0OmUuY29udGV4dC5SR0JBLHR5cGU6ZS5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOmUuY29udGV4dC5MSU5FQVIsbWFnOmUuY29udGV4dC5MSU5FQVIsd3JhcDplLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLGUud2lkdGgsZS5oZWlnaHQpfXJ1bihlKXtjb25zdCB0PXRoaXMuZmJpO3RoaXMuZmJpPXRoaXMuZmJpMix0aGlzLmZiaTI9dCx0aGlzLm91dHB1dD10aGlzLmZiaS5hdHRhY2htZW50c1swXSxzdXBlci5ydW4oey4uLmUscHJldmlvdXNfcmVuZGVyaW5nOnRoaXMuZmJpMi5hdHRhY2htZW50c1swXX0pfXJlc2l6ZU91dHB1dChlLHQpe3N1cGVyLnJlc2l6ZU91dHB1dChlLHQpLHRoaXMuZmJpMj1SdCh0aGlzLmNvbnRleHQsW3tmb3JtYXQ6dGhpcy5jb250ZXh0LlJHQkEsdHlwZTp0aGlzLmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dGhpcy5jb250ZXh0LkxJTkVBUix3cmFwOnRoaXMuY29udGV4dC5DTEFNUF9UT19FREdFfV0sZSx0KX19dmFyIE9mPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCi8vIHVuaWZvcm0gZmxvYXQgdHJlc2hvbGQ7CnVuaWZvcm0gc2FtcGxlcjJEIGltYWdlX25vdzsKdW5pZm9ybSBzYW1wbGVyMkQgaW1hZ2VfYmVmb3JlOwp1bmlmb3JtIHNhbXBsZXIyRCBtYXNrX25vdzsKdW5pZm9ybSBzYW1wbGVyMkQgbWFza19iZWZvcmU7CnVuaWZvcm0gc2FtcGxlcjJEIHByZXZpb3VzX3JlbmRlcmluZzsKdW5pZm9ybSB2ZWMyIGNhbnZhczsKCnVuaWZvcm0gZmxvYXQgZGVsdGE7CgpmbG9hdCBjdXJyZW50X2ZhY3RvciA9IDAuNjk7CmZsb2F0IHByZXZpb3VzX2ZhY3RvciA9IDAuNzQ7CmZsb2F0IHRocmVzaG9sZF9hY3RpdmF0aW9uID0gMC41NDsKCmZsb2F0IG1hcChmbG9hdCB2YWx1ZSwgZmxvYXQgbWluMSwgZmxvYXQgbWF4MSwgZmxvYXQgbWluMiwgZmxvYXQgbWF4MikgewogIHJldHVybiBtaW4yICsgKHZhbHVlIC0gbWluMSkgKiAobWF4MiAtIG1pbjIpIC8gKG1heDEgLSBtaW4xKTsKfQoKZmxvYXQgZ2V0VGhyZXNob2xkKCkgewogIHZlYzQgY29sb3IgPSB2ZWM0KDAuKTsKICBmb3IgKGZsb2F0IHkgPSAtNi47IHkgPCA3LjsgeSArPSAxLikgewogICAgZm9yIChmbG9hdCB4ID0gLTYuOyB4IDwgNy47IHggKz0gMS4pIHsKICAgICAgdmVjNCBpbWFnZV9ub3dfY29sb3IgPQogICAgICAgICAgdGV4dHVyZTJEKGltYWdlX25vdywgX3RleHR1cmVfY29vcmQgKyB2ZWMyKHgsIHkpIC8gY2FudmFzKTsKICAgICAgdmVjNCBpbWFnZV9iZWZvcmVfY29sb3IgPQogICAgICAgICAgdGV4dHVyZTJEKGltYWdlX2JlZm9yZSwgX3RleHR1cmVfY29vcmQgKyB2ZWMyKHgsIHkpIC8gY2FudmFzKTsKICAgICAgY29sb3IgKz0gYWJzKGltYWdlX2JlZm9yZV9jb2xvciAtIGltYWdlX25vd19jb2xvcik7CiAgICB9CiAgfQogIHJldHVybiAoY29sb3IueCArIGNvbG9yLnkgKyBjb2xvci56KSAvICgzLiAqIDkuKTsKfQoKdm9pZCBtYWluKCkgewogIGZsb2F0IHRyZXNob2xkX2lucHV0ID0gLjQ7CiAgZmxvYXQgdHJlc2hvbGRfcHJldmlvdXNfcmVuZGVyaW5nID0gLjk4OwoKICB2ZWM0IG1hc2tfbm93X2NvbG9yID0gdGV4dHVyZTJEKG1hc2tfbm93LCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBtYXNrX2JlZm9yZV9jb2xvciA9IHRleHR1cmUyRChtYXNrX2JlZm9yZSwgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgcHJldmlvdXNfcmVuZGVyaW5nX2NvbG9yID0gdGV4dHVyZTJEKHByZXZpb3VzX3JlbmRlcmluZywgX3RleHR1cmVfY29vcmQpOwoKICB2ZWMzIG1hc2tfZGlmZiA9IGFicyhtYXNrX2JlZm9yZV9jb2xvci54eXogLSBtYXNrX25vd19jb2xvci54eXopOwogIGZsb2F0IGZsaWNrZXJpbmcgPSBtYXNrX2RpZmYueDsKICBmbG9hdCB0aHJlc2hvbGQgPSBnZXRUaHJlc2hvbGQoKTsKICBpZiAodGhyZXNob2xkIDwgdGhyZXNob2xkX2FjdGl2YXRpb24pIHsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZmxpY2tlcmluZywgMC4sIDAuLCAxLikgKiBjdXJyZW50X2ZhY3RvciArCiAgICAgICAgICAgICAgICAgICBwcmV2aW91c19yZW5kZXJpbmdfY29sb3IgKiBwcmV2aW91c19mYWN0b3I7CiAgICBnbF9GcmFnQ29sb3IgKj0gKDEuIC0gdGhyZXNob2xkKTsKICB9Cn0KYCxNZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIE5mIGV4dGVuZHMgQ3J7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gT2Z9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIE1mfX12YXIgVWY9YCN2ZXJzaW9uIDMwMCBlcwovLyBodHRwczovL2dpdGh1Yi5jb20vVm9sY29taXgvdmlydHVhbC1iYWNrZ3JvdW5kL2Jsb2IvbWFpbi9zcmMvcGlwZWxpbmVzL3dlYmdsMi9qb2ludEJpbGF0ZXJhbEZpbHRlclN0YWdlLnRzCgpwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CnVuaWZvcm0gc2FtcGxlcjJEIGlucHV0X2ZyYW1lOwp1bmlmb3JtIHNhbXBsZXIyRCBzZWdtZW50YXRpb25fbWFzazsKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwp1bmlmb3JtIHZlYzIgdGV4ZWxfc2l6ZTsKdW5pZm9ybSBmbG9hdCBzdGVwOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKdW5pZm9ybSBmbG9hdCBvZmZzZXQ7CnVuaWZvcm0gZmxvYXQgc2lnbWFfdGV4ZWw7CnVuaWZvcm0gZmxvYXQgc2lnbWFfY29sb3I7CgppbiB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwpvdXQgdmVjNCBvdXRDb2xvcjsKCmZsb2F0IGdhdXNzaWFuKGZsb2F0IHgsIGZsb2F0IHNpZ21hKSB7CiAgZmxvYXQgY29lZmYgPSAtMC41IC8gKHNpZ21hICogc2lnbWEgKiA0LjAgKyAxLjBlLTYpOwogIHJldHVybiBleHAoKHggKiB4KSAqIGNvZWZmKTsKfQoKdm9pZCBtYWluKCkgewogIHZlYzIgY2VudGVyQ29vcmQgPSBfdGV4dHVyZV9jb29yZDsKICB2ZWMzIGNlbnRlckNvbG9yID0gdGV4dHVyZShpbnB1dF9mcmFtZSwgY2VudGVyQ29vcmQpLnJnYjsKICBmbG9hdCBuZXdWYWwgPSAwLjA7CiAgZmxvYXQgc3BhY2VXZWlnaHQgPSAwLjA7CiAgZmxvYXQgY29sb3JXZWlnaHQgPSAwLjA7CiAgZmxvYXQgdG90YWxXZWlnaHQgPSAwLjA7CiAgLy8gU3Vic2FtcGxlIGtlcm5lbCBzcGFjZS4KICBmb3IgKGZsb2F0IGkgPSAtcmFkaXVzICsgb2Zmc2V0OyBpIDw9IHJhZGl1czsgaSArPSBzdGVwKSB7CiAgICBmb3IgKGZsb2F0IGogPSAtcmFkaXVzICsgb2Zmc2V0OyBqIDw9IHJhZGl1czsgaiArPSBzdGVwKSB7CiAgICAgIHZlYzIgc2hpZnQgPSB2ZWMyKGosIGkpICogdGV4ZWxfc2l6ZTsKICAgICAgdmVjMiBjb29yZCA9IHZlYzIoY2VudGVyQ29vcmQgKyBzaGlmdCk7CiAgICAgIHZlYzMgZnJhbWVDb2xvciA9IHRleHR1cmUoaW5wdXRfZnJhbWUsIGNvb3JkKS5yZ2I7CiAgICAgIGZsb2F0IHRocmVzaG9sZCA9IHRleHR1cmUodGhyZXNob2xkLCBjb29yZCkuYTsKICAgICAgZmxvYXQgb3V0VmFsID0gdGV4dHVyZShzZWdtZW50YXRpb25fbWFzaywgY29vcmQpLmE7CgogICAgICBzcGFjZVdlaWdodCA9IGdhdXNzaWFuKGRpc3RhbmNlKGNlbnRlckNvb3JkLCBjb29yZCksIHNpZ21hX3RleGVsKTsKICAgICAgY29sb3JXZWlnaHQgPSBnYXVzc2lhbihkaXN0YW5jZShjZW50ZXJDb2xvciwgZnJhbWVDb2xvciksIHNpZ21hX2NvbG9yKTsKICAgICAgdG90YWxXZWlnaHQgKz0gc3BhY2VXZWlnaHQgKiBjb2xvcldlaWdodDsKICAgICAgbmV3VmFsICs9IHNwYWNlV2VpZ2h0ICogY29sb3JXZWlnaHQgKiBvdXRWYWwgKiB0aHJlc2hvbGQ7CiAgICB9CiAgfQogIG5ld1ZhbCAvPSB0b3RhbFdlaWdodDsKICBvdXRDb2xvciA9IHZlYzQodmVjMygwLiksIG5ld1ZhbCk7Cn1gLEJmPWAjdmVyc2lvbiAzMDAgZXMKaW4gdmVjMiBwb3NpdGlvbjsKaW4gdmVjMiB0ZXh0dXJlX2Nvb3JkOwpvdXQgdmVjMiBfdGV4dHVyZV9jb29yZDsKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfWA7Y2xhc3Mga2YgZXh0ZW5kcyB5ZXtnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBVZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gQmZ9fXZhciBMZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgewogIGludCBjb3VudCA9IDA7CiAgZm9yIChmbG9hdCB5ID0gLTEuOyB5IDwgMi47IHkgKz0gMS4pIHsKICAgIGZvciAoZmxvYXQgeCA9IC0xLjsgeCA8IDIuOyB4ICs9IDEuKSB7CiAgICAgIHZlYzIgY29vcmQgPSBfdGV4dHVyZV9jb29yZCArIHZlYzIoeSwgeCkgLyBjYW52YXM7CiAgICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgY29vcmQpOwogICAgICBpZiAoY29sb3IuciA+IC4xKSB7CiAgICAgICAgY291bnQrKzsKICAgICAgfQogICAgfQogIH0KICBpZiAoY291bnQgPiA1KSB7CiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOwogIH0KfQpgLCRmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3MgemYgZXh0ZW5kcyB5ZXtnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBMZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gJGZ9fXZhciBHZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgewogIHZlYzQgY29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOwogIGZvciAoZmxvYXQgeSA9IC0yLjsgeSA8IDMuOyB5ICs9IDEuKSB7CiAgICBmb3IgKGZsb2F0IHggPSAtMi47IHggPCAzLjsgeCArPSAxLikgewogICAgICB2ZWMyIGNvb3JkID0gX3RleHR1cmVfY29vcmQ7CiAgICAgIGNvb3JkICs9IHZlYzIoeSwgeCkgLyBjYW52YXM7CiAgICAgIGNvbG9yICs9IHRleHR1cmUyRCh0ZXh0dXJlLCBjb29yZCkgKiAoMS4gLyA0Lik7CiAgICB9CiAgfQoKICBnbF9GcmFnQ29sb3IgPSBjb2xvcjsKfQpgLEhmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3MgVmYgZXh0ZW5kcyBDcntnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBHZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gSGZ9fXZhciBXZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHNhbXBsZXIyRCB0aHJlc2hvbGQ7CnVuaWZvcm0gc2FtcGxlcjJEIGlucHV0czsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGlucHV0c19jb2xvciA9IHRleHR1cmUyRChpbnB1dHMsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IHRocmVzaG9sZF9jb2xvciA9IHRleHR1cmUyRCh0aHJlc2hvbGQsIF90ZXh0dXJlX2Nvb3JkKTsKICBpZiAodGhyZXNob2xkX2NvbG9yLnIgPCAuMSAmJiBpbnB1dHNfY29sb3IuciA+IC41KSB7CiAgICBnbF9GcmFnQ29sb3IgPSBpbnB1dHNfY29sb3I7CiAgfQp9CmAsamY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBxZiBleHRlbmRzIENye2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFdmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBqZn19Y2xhc3MgWGYgZXh0ZW5kcyBGcntjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZSx0aGlzLm9wdGlvbnM9e2N1cnJlbnRUaHJlc2hvbGRNaW5pbXVtOjAsY3VycmVudFRocmVzaG9sZE1heGltdW06MSxwcmV2aW91c1RocmVzaG9sZE1pbmltdW06MCxwcmV2aW91c1RocmVzaG9sZE1heGltdW06MSx0aHJlc2hvbGRNaW5pbXVtOjAsdGhyZXNob2xkTWF4aW11bToxLHRocmVzaG9sZEZhY3RvcjoxfTtjb25zdCBpPXtjb250ZXh0OmUsaGVpZ2h0Om4sd2lkdGg6dH0sbz1uZXcgTmYoaSkscz1uZXcgTmkoey4uLmkscmFkaXVzOjEsdHlwZTpEci5HQVVTU0lBTn0pLGE9bmV3IHFmKGkpLHU9bmV3IFZmKGkpLGY9bmV3IHpmKGkpLGM9bmV3IGtmKHsuLi5pfSksZD0uNjYscD02NDAseT00ODAsbT0yNTYsXz0xNDQ7bGV0IGI9MTtiKj1NYXRoLm1heChwL20seS9fKTtjb25zdCBnPU1hdGgubWF4KDEsTWF0aC5zcXJ0KGIpKmQpLFQ9MS9wLEY9MS95O3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpvLGdldFVuaWZvcm1zOigpPT4oe2ltYWdlX25vdzpSKGUsdGhpcy5pbnB1dEltYWdlKSxpbWFnZV9iZWZvcmU6UihlLHRoaXMucHJldmlvdXNJbnB1dEltYWdlKSxtYXNrX25vdzpSKGUsdGhpcy5pbnB1dE1hc2spLG1hc2tfYmVmb3JlOlIoZSx0aGlzLnByZXZpb3VzSW5wdXRNYXNrKSxjdXJyZW50X3RocmVzaG9sZF9taW5pbXVtOnRoaXMub3B0aW9ucy5jdXJyZW50VGhyZXNob2xkTWluaW11bSxjdXJyZW50X3RocmVzaG9sZF9tYXhpbXVtOnRoaXMub3B0aW9ucy5jdXJyZW50VGhyZXNob2xkTWF4aW11bSxwcmV2aW91c190aHJlc2hvbGRfbWluaW11bTp0aGlzLm9wdGlvbnMucHJldmlvdXNUaHJlc2hvbGRNaW5pbXVtLHByZXZpb3VzX3RocmVzaG9sZF9tYXhpbXVtOnRoaXMub3B0aW9ucy5wcmV2aW91c1RocmVzaG9sZE1heGltdW0sdGhyZXNob2xkX21pbmltdW06dGhpcy5vcHRpb25zLnRocmVzaG9sZE1pbmltdW0sdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLnRocmVzaG9sZE1heGltdW0sdGhyZXNob2xkX2ZhY3Rvcjp0aGlzLm9wdGlvbnMudGhyZXNob2xkRmFjdG9yfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06YSxnZXRVbmlmb3JtczooKT0+KHtpbnB1dHM6UihlLHRoaXMuaW5wdXRNYXNrKSx0aHJlc2hvbGQ6UihlLG8ub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmYsZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpSKGUsYS5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06dSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlIoZSxmLm91dHB1dCl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6UihlLHUub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmMsZ2V0VW5pZm9ybXM6KCk9Pih7aW5wdXRfZnJhbWU6UihlLHRoaXMuaW5wdXRJbWFnZSksc2VnbWVudGF0aW9uX21hc2s6UihlLHRoaXMuaW5wdXRNYXNrKSx0aHJlc2hvbGQ6UihlLHMub3V0cHV0KSx0ZXhlbF9zaXplOltULEZdLHN0ZXA6ZyxyYWRpdXM6YixvZmZzZXQ6Zz4xP2cqLjU6MCxzaWdtYV90ZXhlbDpNYXRoLm1heChULEYpKmIsc2lnbWFfY29sb3I6LjF9KX0pLHRoaXMub3V0cHV0PWMub3V0cHV0fXNldERhdGEoZSx0KXt0aGlzLnByZXZpb3VzSW5wdXRJbWFnZT10aGlzLmlucHV0SW1hZ2U/dGhpcy5pbnB1dEltYWdlOmUsdGhpcy5wcmV2aW91c0lucHV0TWFzaz10aGlzLmlucHV0TWFzaz90aGlzLmlucHV0TWFzazp0LHRoaXMuaW5wdXRJbWFnZT1lLHRoaXMuaW5wdXRNYXNrPXR9c2V0T3B0aW9ucyhlKXt0aGlzLm9wdGlvbnM9ZX19dmFyIFlmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKCnZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkKTsgfQpgLEtmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKdW5pZm9ybSBib29sIGludmVydF95OwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7CiAgaWYgKGludmVydF95KSB7CiAgICBfdGV4dHVyZV9jb29yZC55ID0gMS4gLSB0ZXh0dXJlX2Nvb3JkLnk7CiAgfQp9CmA7Y2xhc3MgSmYgZXh0ZW5kcyB5ZXtnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBZZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gS2Z9fWNsYXNzIFFmIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKCksdGhpcy5jb250ZXh0PWU7Y29uc3QgaT17Y29udGV4dDplLGhlaWdodDpuLHdpZHRoOnR9O3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpuZXcgSmYoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSksZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpSKGUsdGhpcy5pbnB1dEltYWdlKSxpbnZlcnRfeTohMH0pfSl9c2V0RGF0YShlKXt0aGlzLmlucHV0SW1hZ2U9ZX19Y2xhc3MgWmZ7Y29uc3RydWN0b3IoZSl7dGhpcy5jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiKSx0aGlzLmNhbnZhcy53aWR0aD1lLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodD1lLmhlaWdodCx0aGlzLnJlc2l6ZT1uZXcgUWYodGhpcy5jb250ZXh0LGUud2lkdGgsZS5oZWlnaHQpfXJlc2l6ZUZvcmVncm91bmQoZSx0KXt0aGlzLmNhbnZhcy53aWR0aD1lLHRoaXMuY2FudmFzLmhlaWdodD10LHRoaXMucmVzaXplLnJlc2l6ZU91dHB1dChlLHQpfWFzeW5jIHByb2Nlc3MoZSl7dmFyIHQsbjtyZXR1cm4gdGhpcy5jYW52YXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGgsKHQ9dGhpcy5yZXNpemUpPT1udWxsfHx0LnNldERhdGEoZSksKG49dGhpcy5yZXNpemUpPT1udWxsfHxuLnJ1bigpLHRoaXMuY2FudmFzfX1jbGFzcyBlbHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNhbnZhcz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCksdGhpcy5jb250ZXh0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIndlYmdsMiIpLHRoaXMuY2FudmFzLndpZHRoPWUuZm9yZWdyb3VuZFdpZHRoLHRoaXMuY2FudmFzLmhlaWdodD1lLmZvcmVncm91bmRIZWlnaHQsdGhpcy5pbXByb3ZlTWFza1NlZ21lbnRhdGlvbj1uZXcgWGYodGhpcy5jb250ZXh0LGUubWFza1dpZHRoLGUubWFza0hlaWdodCksdGhpcy5iYWNrZ3JvdW5kSW1hZ2U9bmV3IE1pKHRoaXMuY29udGV4dCksdGhpcy5iYWNrZ3JvdW5kVmlkZW89bmV3IEZmKHRoaXMuY29udGV4dCksdGhpcy5iYWNrZ3JvdW5kUmVzaXplcj1uZXcgWmYoe3dpZHRoOmUuZm9yZWdyb3VuZFdpZHRoLGhlaWdodDplLmZvcmVncm91bmRIZWlnaHR9KX1zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXtzd2l0Y2goZS50cmFuc2Zvcm1lclR5cGUpe2Nhc2UiQmFja2dyb3VuZEJsdXIiOnRoaXMuYWN0aXZlUGlwZWxpbmU9bmV3IElmKHRoaXMuY29udGV4dCx0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJTaWxob3VldHRlQmx1ciI6dGhpcy5hY3RpdmVQaXBlbGluZT1uZXcgQ2YodGhpcy5jb250ZXh0LHRoaXMuZ2V0Qmx1clNpemUoZS5yYWRpdXMpKTticmVhaztjYXNlIlZpZGVvQmFja2dyb3VuZCI6dGhpcy5hY3RpdmVQaXBlbGluZT10aGlzLmJhY2tncm91bmRWaWRlbzticmVhaztjYXNlIlZpcnR1YWxCYWNrZ3JvdW5kIjp0aGlzLmFjdGl2ZVBpcGVsaW5lPXRoaXMuYmFja2dyb3VuZEltYWdlO2JyZWFrfXRoaXMub3B0aW9ucz1lfXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe3ZhciB0Oyh0PXRoaXMuaW1wcm92ZU1hc2tTZWdtZW50YXRpb24pPT1udWxsfHx0LnNldE9wdGlvbnMoZSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFZpZGVvLmlucHV0VmlkZW89ZX1hc3luYyBzZXRWaXJ0dWFsQkdJbWFnZShlKXt0aGlzLmJhY2tncm91bmRJbWFnZS5pbnB1dEJhY2tncm91bmRJbWFnZT1lLHRoaXMuYmFja2dyb3VuZEltYWdlLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IHRoaXMuYmFja2dyb3VuZFJlc2l6ZXIucHJvY2VzcyhlKX1hc3luYyBwcm9jZXNzKGUsdCl7dmFyIG4saSxvLHMsYTtpZih0aGlzLmFjdGl2ZVBpcGVsaW5lJiZlLndpZHRoJiYodD09bnVsbD92b2lkIDA6dC53aWR0aCkpe2xldCB1PXQ7KCgobj10aGlzLm9wdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpJiYoKGk9dGhpcy5vcHRpb25zKT09bnVsbD92b2lkIDA6aS5zZWxmaWVTZWdtZW50YXRpb25UeXBlKT09PSJQUkVDSVNFInx8ISgobz10aGlzLm9wdGlvbnMpIT1udWxsJiZvLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpJiZ0aGlzLmFjdGl2ZVBpcGVsaW5lLnByZWNpc2VNYXNrRW5hYmxlZCkmJih0aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLnNldERhdGEoZSx0KSx0aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLnJ1bigpLHU9dGhpcy5pbXByb3ZlTWFza1NlZ21lbnRhdGlvbi5vdXRwdXQpLChzPXRoaXMuYWN0aXZlUGlwZWxpbmUpPT1udWxsfHxzLnNldERhdGEoZSx1KSwoYT10aGlzLmFjdGl2ZVBpcGVsaW5lKT09bnVsbHx8YS5ydW4oKX19cmVzaXplRm9yZWdyb3VuZChlLHQpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXQsdGhpcy5iYWNrZ3JvdW5kSW1hZ2UucmVzaXplT3V0cHV0KGUsdCksdGhpcy5iYWNrZ3JvdW5kVmlkZW8ucmVzaXplT3V0cHV0KGUsdCksdGhpcy5iYWNrZ3JvdW5kUmVzaXplci5yZXNpemVGb3JlZ3JvdW5kKGUsdCksKG49dGhpcy5hY3RpdmVQaXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsdCl9Z2V0Qmx1clNpemUoZT1pdC5Mb3cpe3N3aXRjaChlKXtjYXNlIGl0LkxvdzpyZXR1cm4gNTtjYXNlIGl0LkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfX12YXIgU3Q9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZSE9InVuZGVmaW5lZCI/ZTp7fSxuLGk7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihsLGgpe249bCxpPWh9KTt2YXIgbz17fSxzO2ZvcihzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYmKG9bc109dFtzXSk7dmFyIGE9Ii4vdGhpcy5wcm9ncmFtIix1PWZ1bmN0aW9uKGwsaCl7dGhyb3cgaH0sZj0hMCxjPSIiO2Z1bmN0aW9uIGQobCl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUobCxjKTpjK2x9dmFyIHA7dHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGM9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihjPXIpLGMuaW5kZXhPZigiYmxvYjoiKSE9PTA/Yz1jLnN1YnN0cigwLGMucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpjPSIiO3ZhciB5PXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksbT10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IocyBpbiBvKW8uaGFzT3duUHJvcGVydHkocykmJih0W3NdPW9bc10pO289bnVsbCx0LmFyZ3VtZW50cyYmdC5hcmd1bWVudHMsdC50aGlzUHJvZ3JhbSYmKGE9dC50aGlzUHJvZ3JhbSksdC5xdWl0JiYodT10LnF1aXQpO3ZhciBfO3Qud2FzbUJpbmFyeSYmKF89dC53YXNtQmluYXJ5KTt2YXIgYj10Lm5vRXhpdFJ1bnRpbWV8fCEwO3R5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJmNlKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIGcsVD0hMSxGPXR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwO2Z1bmN0aW9uIEwobCxoLHgpe2Zvcih2YXIgQT1oK3gsRD1oO2xbRF0mJiEoRD49QSk7KSsrRDtpZihELWg+MTYmJmwuc3ViYXJyYXkmJkYpcmV0dXJuIEYuZGVjb2RlKGwuc3ViYXJyYXkoaCxEKSk7Zm9yKHZhciBNPSIiO2g8RDspe3ZhciB3PWxbaCsrXTtpZighKHcmMTI4KSl7TSs9U3RyaW5nLmZyb21DaGFyQ29kZSh3KTtjb250aW51ZX12YXIgVT1sW2grK10mNjM7aWYoKHcmMjI0KT09MTkyKXtNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCh3JjMxKTw8NnxVKTtjb250aW51ZX12YXIgUT1sW2grK10mNjM7aWYoKHcmMjQwKT09MjI0P3c9KHcmMTUpPDwxMnxVPDw2fFE6dz0odyY3KTw8MTh8VTw8MTJ8UTw8NnxsW2grK10mNjMsdzw2NTUzNilNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHcpO2Vsc2V7dmFyIFdpPXctNjU1MzY7TSs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxXaT4+MTAsNTYzMjB8V2kmMTAyMyl9fXJldHVybiBNfWZ1bmN0aW9uIFYobCxoKXtyZXR1cm4gbD9MKCRlLGwsaCk6IiJ9ZnVuY3Rpb24gZWUobCxoLHgpe2Zvcih2YXIgQT0wO0E8bC5sZW5ndGg7KytBKUl0W2grKz4+MF09bC5jaGFyQ29kZUF0KEEpO3h8fChJdFtoPj4wXT0wKX1mdW5jdGlvbiBxKGwsaCl7cmV0dXJuIGwlaD4wJiYobCs9aC1sJWgpLGx9dmFyIEJpLEl0LCRlLFg7ZnVuY3Rpb24ga2kobCl7Qmk9bCx0LkhFQVA4PUl0PW5ldyBJbnQ4QXJyYXkobCksdC5IRUFQMTY9bmV3IEludDE2QXJyYXkobCksdC5IRUFQMzI9WD1uZXcgSW50MzJBcnJheShsKSx0LkhFQVBVOD0kZT1uZXcgVWludDhBcnJheShsKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGwpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkobCksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkobCksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkobCl9dC5JTklUSUFMX01FTU9SWTt2YXIgTXIsTGk9W10sJGk9W10semk9W10sYWw9MDtmdW5jdGlvbiB1bCgpe3JldHVybiBifHxhbD4wfWZ1bmN0aW9uIGNsKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspZGwodC5wcmVSdW4uc2hpZnQoKSk7TnIoTGkpfWZ1bmN0aW9uIGZsKCl7TnIoJGkpfWZ1bmN0aW9uIGxsKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOylobCh0LnBvc3RSdW4uc2hpZnQoKSk7TnIoemkpfWZ1bmN0aW9uIGRsKGwpe0xpLnVuc2hpZnQobCl9ZnVuY3Rpb24gbWwobCl7JGkudW5zaGlmdChsKX1mdW5jdGlvbiBobChsKXt6aS51bnNoaWZ0KGwpfXZhciBfZT0wLHplPW51bGw7ZnVuY3Rpb24gcGwobCl7X2UrKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhfZSl9ZnVuY3Rpb24geWwobCl7aWYoX2UtLSx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhfZSksX2U9PTAmJnplKXt2YXIgaD16ZTt6ZT1udWxsLGgoKX19dC5wcmVsb2FkZWRJbWFnZXM9e30sdC5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gY2UobCl7dC5vbkFib3J0JiZ0Lm9uQWJvcnQobCksbD0iQWJvcnRlZCgiK2wrIikiLG0obCksVD0hMCxsKz0iLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dmFyIGg9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihsKTt0aHJvdyBpKGgpLGh9dmFyIF9sPSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjtmdW5jdGlvbiBHaShsKXtyZXR1cm4gbC5zdGFydHNXaXRoKF9sKX12YXIgWTtZPSJ0ZmxpdGUtc2ltZC53YXNtIixHaShZKXx8KFk9ZChZKSk7ZnVuY3Rpb24gSGkobCl7dHJ5e2lmKGw9PVkmJl8pcmV0dXJuIG5ldyBVaW50OEFycmF5KF8pO2lmKCFwKXRocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1jYXRjaChoKXtjZShoKX19ZnVuY3Rpb24geGwoKXtyZXR1cm4hXyYmZiYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKFkse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGwpe2lmKCFsLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrWSsiJyI7cmV0dXJuIGwuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIEhpKFkpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBIaShZKX0pfWZ1bmN0aW9uIGJsKCl7dmFyIGw9e2E6JGx9O2Z1bmN0aW9uIGgodyxVKXt2YXIgUT13LmV4cG9ydHM7dC5hc209USxnPXQuYXNtLnEsa2koZy5idWZmZXIpLE1yPXQuYXNtLkQsbWwodC5hc20ucikseWwoKX1wbCgpO2Z1bmN0aW9uIHgodyl7aCh3Lmluc3RhbmNlKX1mdW5jdGlvbiBBKHcpe3JldHVybiB4bCgpLnRoZW4oZnVuY3Rpb24oVSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKFUsbCl9KS50aGVuKGZ1bmN0aW9uKFUpe3JldHVybiBVfSkudGhlbih3LGZ1bmN0aW9uKFUpe20oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrVSksY2UoVSl9KX1mdW5jdGlvbiBEKCl7cmV0dXJuIV8mJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09ImZ1bmN0aW9uIiYmIUdpKFkpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goWSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24odyl7dmFyIFU9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcodyxsKTtyZXR1cm4gVS50aGVuKHgsZnVuY3Rpb24oUSl7cmV0dXJuIG0oIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK1EpLG0oImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksQSh4KX0pfSk6QSh4KX1pZih0Lmluc3RhbnRpYXRlV2FzbSl0cnl7dmFyIE09dC5pbnN0YW50aWF0ZVdhc20obCxoKTtyZXR1cm4gTX1jYXRjaCh3KXtyZXR1cm4gbSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIit3KSwhMX1yZXR1cm4gRCgpLmNhdGNoKGkpLHt9fWZ1bmN0aW9uIE5yKGwpe2Zvcig7bC5sZW5ndGg+MDspe3ZhciBoPWwuc2hpZnQoKTtpZih0eXBlb2YgaD09ImZ1bmN0aW9uIil7aCh0KTtjb250aW51ZX12YXIgeD1oLmZ1bmM7dHlwZW9mIHg9PSJudW1iZXIiP2guYXJnPT09dm9pZCAwP01yLmdldCh4KSgpOk1yLmdldCh4KShoLmFyZyk6eChoLmFyZz09PXZvaWQgMD9udWxsOmguYXJnKX19ZnVuY3Rpb24gZ2wobCxoLHgsQSl7Y2UoIkFzc2VydGlvbiBmYWlsZWQ6ICIrVihsKSsiLCBhdDogIitbaD9WKGgpOiJ1bmtub3duIGZpbGVuYW1lIix4LEE/VihBKToidW5rbm93biBmdW5jdGlvbiJdKX1mdW5jdGlvbiB2bChsLGgpe2NlKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBFbChsLGgpe2NlKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBUbCgpe2NlKCIiKX12YXIgRnQ7RnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O3ZhciBBbD0hMDtmdW5jdGlvbiB3bChsKXtyZXR1cm4gWFtWaSgpPj4yXT1sLGx9ZnVuY3Rpb24gUmwobCxoKXt2YXIgeDtpZihsPT09MCl4PURhdGUubm93KCk7ZWxzZSBpZigobD09PTF8fGw9PT00KSYmQWwpeD1GdCgpO2Vsc2UgcmV0dXJuIHdsKDI4KSwtMTtyZXR1cm4gWFtoPj4yXT14LzFlM3wwLFhbaCs0Pj4yXT14JTFlMyoxZTMqMWUzfDAsMH1mdW5jdGlvbiBTbCgpe3JldHVybiAyMTQ3NDgzNjQ4fWZ1bmN0aW9uIElsKGwsaCx4KXskZS5jb3B5V2l0aGluKGwsaCxoK3gpfWZ1bmN0aW9uIEZsKGwpe3RyeXtyZXR1cm4gZy5ncm93KGwtQmkuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KSxraShnLmJ1ZmZlciksMX1jYXRjaHt9fWZ1bmN0aW9uIFBsKGwpe3ZhciBoPSRlLmxlbmd0aDtsPWw+Pj4wO3ZhciB4PTIxNDc0ODM2NDg7aWYobD54KXJldHVybiExO2Zvcih2YXIgQT0xO0E8PTQ7QSo9Mil7dmFyIEQ9aCooMSsuMi9BKTtEPU1hdGgubWluKEQsbCsxMDA2NjMyOTYpO3ZhciBNPU1hdGgubWluKHgscShNYXRoLm1heChsLEQpLDY1NTM2KSksdz1GbChNKTtpZih3KXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIERsKGwpe2Zvcih2YXIgaD1GdCgpO0Z0KCktaDxsOyk7fXZhciBVcj17fTtmdW5jdGlvbiBDbCgpe3JldHVybiBhfHwiLi90aGlzLnByb2dyYW0ifWZ1bmN0aW9uIEdlKCl7aWYoIUdlLnN0cmluZ3Mpe3ZhciBsPSh0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLGg9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzpsLF86Q2woKX07Zm9yKHZhciB4IGluIFVyKVVyW3hdPT09dm9pZCAwP2RlbGV0ZSBoW3hdOmhbeF09VXJbeF07dmFyIEE9W107Zm9yKHZhciB4IGluIGgpQS5wdXNoKHgrIj0iK2hbeF0pO0dlLnN0cmluZ3M9QX1yZXR1cm4gR2Uuc3RyaW5nc312YXIgUHQ9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihsLGgpe3ZhciB4PVB0LmJ1ZmZlcnNbbF07aD09PTB8fGg9PT0xMD8oKGw9PT0xP3k6bSkoTCh4LDApKSx4Lmxlbmd0aD0wKTp4LnB1c2goaCl9LHZhcmFyZ3M6dm9pZCAwLGdldDpmdW5jdGlvbigpe1B0LnZhcmFyZ3MrPTQ7dmFyIGw9WFtQdC52YXJhcmdzLTQ+PjJdO3JldHVybiBsfSxnZXRTdHI6ZnVuY3Rpb24obCl7dmFyIGg9VihsKTtyZXR1cm4gaH0sZ2V0NjQ6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbH19O2Z1bmN0aW9uIE9sKGwsaCl7dmFyIHg9MDtyZXR1cm4gR2UoKS5mb3JFYWNoKGZ1bmN0aW9uKEEsRCl7dmFyIE09aCt4O1hbbCtEKjQ+PjJdPU0sZWUoQSxNKSx4Kz1BLmxlbmd0aCsxfSksMH1mdW5jdGlvbiBNbChsLGgpe3ZhciB4PUdlKCk7WFtsPj4yXT14Lmxlbmd0aDt2YXIgQT0wO3JldHVybiB4LmZvckVhY2goZnVuY3Rpb24oRCl7QSs9RC5sZW5ndGgrMX0pLFhbaD4+Ml09QSwwfWZ1bmN0aW9uIE5sKGwpe0dsKGwpfWZ1bmN0aW9uIFVsKGwpe3JldHVybiAwfWZ1bmN0aW9uIEJsKGwsaCx4LEEsRCl7fWZ1bmN0aW9uIGtsKGwsaCx4LEEpe2Zvcih2YXIgRD0wLE09MDtNPHg7TSsrKXtmb3IodmFyIHc9WFtoK00qOD4+Ml0sVT1YW2grKE0qOCs0KT4+Ml0sUT0wO1E8VTtRKyspUHQucHJpbnRDaGFyKGwsJGVbdytRXSk7RCs9VX1yZXR1cm4gWFtBPj4yXT1ELDB9ZnVuY3Rpb24gTGwoKXtpZih0eXBlb2YgY3J5cHRvPT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiIpe3ZhciBsPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGwpLGxbMF19fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKCl7Y2UoInJhbmRvbURldmljZSIpfX1mdW5jdGlvbiBEdChsLGgpe0R0LnJhbmRvbURldmljZXx8KER0LnJhbmRvbURldmljZT1MbCgpKTtmb3IodmFyIHg9MDt4PGg7eCsrKUl0W2wreD4+MF09RHQucmFuZG9tRGV2aWNlKCk7cmV0dXJuIDB9dmFyICRsPXthOmdsLGU6dmwsZDpFbCxiOlRsLG46UmwsaDpTbCxsOklsLG06UGwscDpEbCxmOk9sLGc6TWwsajpObCxpOlVsLGs6QmwsYzprbCxvOkR0fTtibCgpLHQuX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX19fd2FzbV9jYWxsX2N0b3JzPXQuYXNtLnIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9dC5hc20ucykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD10LmFzbS50KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0SGVpZ2h0PXQuYXNtLnUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRXaWR0aD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dFdpZHRoPXQuYXNtLnYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9dC5hc20udykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0PXQuYXNtLngpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dEhlaWdodD10LmFzbS55KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dFdpZHRoPXQuYXNtLnopLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dENoYW5uZWxDb3VudD10LmFzbS5BKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2xvYWRNb2RlbD1mdW5jdGlvbigpe3JldHVybih0Ll9sb2FkTW9kZWw9dC5hc20uQikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9ydW5JbmZlcmVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4odC5fcnVuSW5mZXJlbmNlPXQuYXNtLkMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIFZpPXQuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4oVmk9dC5fX19lcnJub19sb2NhdGlvbj10LmFzbS5FKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEN0O2Z1bmN0aW9uIHpsKGwpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrbCsiKSIsdGhpcy5zdGF0dXM9bH16ZT1mdW5jdGlvbiBsKCl7Q3R8fEJyKCksQ3R8fCh6ZT1sKX07ZnVuY3Rpb24gQnIobCl7aWYoX2U+MHx8KGNsKCksX2U+MCkpcmV0dXJuO2Z1bmN0aW9uIGgoKXtDdHx8KEN0PSEwLHQuY2FsbGVkUnVuPSEwLCFUJiYoZmwoKSxuKHQpLHQub25SdW50aW1lSW5pdGlhbGl6ZWQmJnQub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxsbCgpKSl9dC5zZXRTdGF0dXM/KHQuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldFN0YXR1cygiIil9LDEpLGgoKX0sMSkpOmgoKX10LnJ1bj1CcjtmdW5jdGlvbiBHbChsLGgpe0hsKGwpfWZ1bmN0aW9uIEhsKGwpe3VsKCl8fCh0Lm9uRXhpdCYmdC5vbkV4aXQobCksVD0hMCksdShsLG5ldyB6bChsKSl9aWYodC5wcmVJbml0KWZvcih0eXBlb2YgdC5wcmVJbml0PT0iZnVuY3Rpb24iJiYodC5wcmVJbml0PVt0LnByZUluaXRdKTt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5wb3AoKSgpO3JldHVybiBCcigpLGUucmVhZHl9fSgpO3R5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCI/bW9kdWxlLmV4cG9ydHM9U3Q6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gU3R9KTp0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJihleHBvcnRzLmNyZWF0ZVZvbmFnZVRGTGl0ZVNpbWRNb2R1bGU9U3QpO2NsYXNzIHRse2NvbnN0cnVjdG9yKCl7dGhpcy5pc1NJTURTdXBwb3J0ZWQ9ITEsdGhpcy5pc1RocmVhZHNTdXBwb3J0ZWQ9ITEsdGhpcy5pbnB1dFdpZHRoPTAsdGhpcy5pbnB1dEhlaWdodD0wLHRoaXMuaW5wdXRDaGFubmVsQ291bnQ9MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0PTAsdGhpcy5vdXRwdXRXaWR0aD0wLHRoaXMub3V0cHV0SGVpZ2h0PTAsdGhpcy5vdXRwdXRDaGFubmVsQ291bnQ9MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldD0wfX1jb25zdCBybD0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC9tbC9zZWxmaWVfc2VnbWVudGF0aW9uLzQuMC4wLyIsbmw9Imh0dHBzOi8vZDNvcHFqbXF6eGYwNTcuY2xvdWRmcm9udC5uZXQvbWwvc2VsZmllX3NlZ21lbnRhdGlvbi80LjAuMC8iO2FzeW5jIGZ1bmN0aW9uIGlsKHI9cmwsZT1ubCl7bGV0IHQ9bmV3IHRsO3ZhciBuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGksbyl7YXN5bmMgZnVuY3Rpb24gcygpe3JldHVybiBTdCh7bG9jYXRlRmlsZTpmdW5jdGlvbihmKXtyZXR1cm4gcitmfX0pfWFzeW5jIGZ1bmN0aW9uIGEodSl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKGYsYyk9Pntjb25zdCBkPXU7aWYodHlwZW9mIGQ9PSJ1bmRlZmluZWQiKXJldHVybiBjKCJURkxpdGUgYmFja2VuZCB1bmF2YWlsYWJsZTogd2FzbVNpbWQiKTtjb25zdCBwPSJzZWxmaWVfc2VnbWVudGF0aW9uX2xhbmRzY2FwZSI7Y29uc29sZS5sb2coIkxvYWRpbmcgdGZsaXRlIG1vZGVsOiIscCk7bGV0IHk9ZStgJHtwfS50ZmxpdGVgO2NvbnNvbGUubG9nKCJURkxpdGUgbW9kZWxVcmw6ICIreSk7dHJ5e2NvbnN0IF89YXdhaXQoYXdhaXQgZmV0Y2goeSkpLmFycmF5QnVmZmVyKCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBzaXplOiIsXy5ieXRlTGVuZ3RoKTtjb25zdCBiPWQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0KCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBtZW1vcnkgb2Zmc2V0OiIsYiksY29uc29sZS5sb2coIkxvYWRpbmcgbW9kZWwgYnVmZmVyLi4uIiksZC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KF8pLGIpO2NvbnN0IGc9ZC5fbG9hZE1vZGVsKF8uYnl0ZUxlbmd0aCk7aWYoY29uc29sZS5sb2coIkxvYWQgbW9kZWwgcmVzdWx0OiIsZyksZyE9PTApe2MoIkNhbm5vdCBsb2FkIG1vZGVsIik7cmV0dXJufXQuaW5wdXRXaWR0aD1kLl9nZXRJbnB1dFdpZHRoKCksdC5pbnB1dEhlaWdodD1kLl9nZXRJbnB1dEhlaWdodCgpLHQuaW5wdXRDaGFubmVsQ291bnQ9ZC5fZ2V0SW5wdXRDaGFubmVsQ291bnQoKSx0LmlucHV0TWVtb3J5T2Zmc2V0PWQuX2dldElucHV0TWVtb3J5T2Zmc2V0KCksY29uc29sZS5sb2coIklucHV0IG1lbW9yeSBvZmZzZXQ6Iix0LmlucHV0TWVtb3J5T2Zmc2V0KSxjb25zb2xlLmxvZygiSW5wdXQgaGVpZ2h0OiIsdC5pbnB1dEhlaWdodCksY29uc29sZS5sb2coIklucHV0IHdpZHRoOiIsdC5pbnB1dFdpZHRoKSxjb25zb2xlLmxvZygiSW5wdXQgY2hhbm5lbHM6Iix0LmlucHV0Q2hhbm5lbENvdW50KSx0Lm91dHB1dE1lbW9yeU9mZnNldD1kLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSx0Lm91dHB1dFdpZHRoPWQuX2dldE91dHB1dFdpZHRoKCksdC5vdXRwdXRIZWlnaHQ9ZC5fZ2V0T3V0cHV0SGVpZ2h0KCksdC5vdXRwdXRDaGFubmVsQ291bnQ9ZC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCksY29uc29sZS5sb2coIk91dHB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5vdXRwdXRNZW1vcnlPZmZzZXQpLGNvbnNvbGUubG9nKCJPdXRwdXQgaGVpZ2h0OiIsdC5vdXRwdXRIZWlnaHQpLGNvbnNvbGUubG9nKCJPdXRwdXQgd2lkdGg6Iix0Lm91dHB1dFdpZHRoKSxjb25zb2xlLmxvZygiT3V0cHV0IGNoYW5uZWxzOiIsdC5vdXRwdXRDaGFubmVsQ291bnQpLHQuc2VsZWN0ZWRURkxpdGU9ZH1jYXRjaChtKXtjKG0pO3JldHVybn1mKCl9KX1zKCkudGhlbih1PT57aWYodT09PW51bGwpdGhyb3cgY29uc29sZS5lcnJvcigibG9hZFRGTGl0ZSBudWxsIiksImxvYWRURkxpdGUgbnVsbCI7YSh1KS50aGVuKGY9PntpKHQpfSkuY2F0Y2goZj0+e2NvbnNvbGUuZXJyb3IoImxvYWRURkxpdGVNb2RlbCBlcnJvciIpLG8oImxvYWRURkxpdGVNb2RlbCBlcnJvciIpfSl9KS5jYXRjaCh1PT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZSBlcnJvcjoiLHUpLG8oImxvYWRURkxpdGUgZXJyb3I6Iit1KX0pfSk7cmV0dXJuIG59Y2xhc3Mgb2x7Y29uc3RydWN0b3IoKXt0aGlzLmNhbnZhcz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCksdGhpcy5jb250ZXh0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSksdGhpcy5waXhlbENvdW50PTAsdGhpcy5pbnB1dE9mZnNldD0wLHRoaXMub3V0cHV0T2Zmc2V0PTB9YXN5bmMgaW5pdChlLHQpe3RoaXMuaW5mb3M9YXdhaXQgaWwoZSx0KSx0aGlzLmluZm9zJiYodGhpcy5jYW52YXMud2lkdGg9dGhpcy5pbmZvcy5pbnB1dFdpZHRoLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmluZm9zLmlucHV0SGVpZ2h0LHRoaXMucGl4ZWxDb3VudD10aGlzLmluZm9zLmlucHV0V2lkdGgqdGhpcy5pbmZvcy5pbnB1dEhlaWdodCx0aGlzLm1hc2s9bmV3IEltYWdlRGF0YSh0aGlzLmluZm9zLmlucHV0V2lkdGgsdGhpcy5pbmZvcy5pbnB1dEhlaWdodCksdGhpcy5pbnB1dE9mZnNldD10aGlzLmluZm9zLmlucHV0TWVtb3J5T2Zmc2V0LzQsdGhpcy5vdXRwdXRPZmZzZXQ9dGhpcy5pbmZvcy5vdXRwdXRNZW1vcnlPZmZzZXQvNCl9Z2V0T3V0cHV0RGltZW5zaW9ucygpe3ZhciBlLHQsbixpO3JldHVybnt3aWR0aDoodD0oZT10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6ZS5vdXRwdXRXaWR0aCkhPW51bGw/dDowLGhlaWdodDooaT0obj10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6bi5vdXRwdXRIZWlnaHQpIT1udWxsP2k6MH19YXN5bmMgcHJvY2VzcyhlKXtpZighdGhpcy5tYXNrfHwhdGhpcy5pbmZvcylyZXR1cm47Y29uc3QgdD10aGlzLmluZm9zLmlucHV0V2lkdGgsbj10aGlzLmluZm9zLmlucHV0SGVpZ2h0O3RoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCwwLDAsdCxuKTtjb25zdCBpPXRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHQsbiksbz10aGlzLmluZm9zLnNlbGVjdGVkVEZMaXRlLkhFQVBGMzI7Zm9yKGxldCBzPTA7czx0aGlzLnBpeGVsQ291bnQ7cysrKXtjb25zdCBhPXRoaXMuaW5wdXRPZmZzZXQrcyozO29bYV09aS5kYXRhW3MqNF0vMjU1LG9bYSsxXT1pLmRhdGFbcyo0KzFdLzI1NSxvW2ErMl09aS5kYXRhW3MqNCsyXS8yNTV9dGhpcy5pbmZvcy5zZWxlY3RlZFRGTGl0ZS5fcnVuSW5mZXJlbmNlKCk7Zm9yKGxldCBzPTA7czx0aGlzLnBpeGVsQ291bnQ7cysrKXtjb25zdCBhPXRoaXMuaW5mb3Muc2VsZWN0ZWRURkxpdGUuSEVBUEYzMlt0aGlzLm91dHB1dE9mZnNldCtzXTt0aGlzLm1hc2suZGF0YVtzKjRdPXRoaXMubWFzay5kYXRhW3MqNCszXT0yNTUqYX1yZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5tYXNrKX19Y2xhc3Mgc2x7Y29uc3RydWN0b3IoKXt0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbj1uZXcgb2wsdGhpcy5wcmV2aW91c0RpbWVuc2lvbnM9e3dpZHRoOjAsaGVpZ2h0OjB9fWFzeW5jIGluaXQoZSl7YXdhaXQgdGhpcy5zZWxmaWVTZWdtZW50YXRpb24uaW5pdChlLndhc21Bc3NldFVyaVBhdGgsZS50ZmxpdGVBc3NldFVyaVBhdGgpO2NvbnN0e3dpZHRoOnQsaGVpZ2h0Om59PXRoaXMuc2VsZmllU2VnbWVudGF0aW9uLmdldE91dHB1dERpbWVuc2lvbnMoKTt0aGlzLmJhY2tncm91bmRGaWx0ZXI9bmV3IGVsKHtmb3JlZ3JvdW5kV2lkdGg6MSxmb3JlZ3JvdW5kSGVpZ2h0OjEsbWFza1dpZHRoOnQsbWFza0hlaWdodDpufSl9YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG8scyxhLHU7Y29uc3Qgbj1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChlKSxpPWF3YWl0IHRoaXMuc2VsZmllU2VnbWVudGF0aW9uLnByb2Nlc3Mobik7aT8oKG4ud2lkdGghPT10aGlzLnByZXZpb3VzRGltZW5zaW9ucy53aWR0aHx8bi5oZWlnaHQhPT10aGlzLnByZXZpb3VzRGltZW5zaW9ucy5oZWlnaHQpJiYodGhpcy5wcmV2aW91c0RpbWVuc2lvbnMud2lkdGg9bi53aWR0aCx0aGlzLnByZXZpb3VzRGltZW5zaW9ucy5oZWlnaHQ9bi5oZWlnaHQsKG89dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbHx8by5yZXNpemVGb3JlZ3JvdW5kKG4ud2lkdGgsbi5oZWlnaHQpKSxhd2FpdCgocz10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpzLnByb2Nlc3MobixpKSksZS5jbG9zZSgpLHQuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSgoYT10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDphLmNhbnZhcyx7dGltZXN0YW1wOih1PWUudGltZXN0YW1wKSE9bnVsbD91OjAsYWxwaGE6ImRpc2NhcmQifSkpKTp0LmVucXVldWUoZSl9YXN5bmMgc2V0QmFja2dyb3VuZE9wdGlvbnMoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3ZhciB0Oyh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGx8fHQuc2V0VmlkZW9CR1JlYWRhYmxlKGUpfXNldFZpcnR1YWxCR0ltYWdlKGUpe3ZhciB0Oyh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGx8fHQuc2V0VmlydHVhbEJHSW1hZ2UoZSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dmFyIHQ7KHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbHx8dC5zZXRGbGlja2VyaW5nT3B0aW9ucyhlKX19Y29uc3QgT3I9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcj1uZXcgc2wsdGhpcy5tZWRpYVByb2Nlc3Nvcj1uZXcgd3MsdGhpcy5yYXRlPTMwfWFzeW5jIGluaXQoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuaW5pdChlKSxhd2FpdCB0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYW5zZm9ybWVycyhbdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXJdKSx0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMucmF0ZSksdGhpcy5tZWRpYVByb2Nlc3Nvci5vbkFueSgodCxuKT0+e3ZhciBpOyhpPXRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3IpPT1udWxsfHxpLmNhbGwodGhpcyx7bmFtZTp0LGRhdGE6bn0pfSl9YXN5bmMgb25NZWRpYVByb2Nlc3NvckV2ZW50KCl7cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGU9PnRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I9ZSl9YXN5bmMgc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy5yYXRlPWUsdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFja0V4cGVjdGVkUmF0ZShlKX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt0aGlzLm1lZGlhUHJvY2Vzc29yLnRyYW5zZm9ybShlLHQpfWFzeW5jIHNldEJhY2tncm91bmRPcHRpb25zKGUpe3ZhciB0O2F3YWl0KCh0PXRoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyKT09bnVsbD92b2lkIDA6dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLnNldFZpZGVvQkdSZWFkYWJsZShlKX1zZXRWaXJ0dWFsQkdJbWFnZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaXJ0dWFsQkdJbWFnZShlKX1hc3luYyB0ZXJtaW5hdGUoKXthd2FpdCB0aGlzLm1lZGlhUHJvY2Vzc29yLmRlc3Ryb3koKX1zZXRGbGlja2VyaW5nT3B0aW9ucyhlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRGbGlja2VyaW5nT3B0aW9ucyhlKX1zZXRWb25hZ2VNZXRhZGF0YShlKXtmcyhlKX19O2xldCBVaT1PcjsoKCk9PntYaSgiUHJvY2Vzc29yV29ya2VyIixPcil9KSgpfSkoKTsK";
|
|
29373
|
+
const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBIZT0ocj0+KHJbci5JTklUPTBdPSJJTklUIixyW3IuRk9SV0FSRD0xXT0iRk9SV0FSRCIscltyLlRFUk1JTkFURT0yXT0iVEVSTUlOQVRFIixyKSkoSGV8fHt9KTtmdW5jdGlvbiBqaShyKXtyZXR1cm5bSW1hZ2VCaXRtYXAsUmVhZGFibGVTdHJlYW0sV3JpdGFibGVTdHJlYW1dLnNvbWUoZT0+ciBpbnN0YW5jZW9mIGUpfWZ1bmN0aW9uIE90KHIsZSl7Y29uc3R7aWQ6dH09cixuPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnQscmVzdWx0OmV9LG4uZmlsdGVyKGk9PmppKGkpKSl9YXN5bmMgZnVuY3Rpb24gcWkocixlKXtjb25zdHtmdW5jdGlvbk5hbWU6dCxhcmdzOm59PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighdCl0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2VbdF0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3R9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDtPdChyLGF3YWl0IGUuaW5zdGFuY2VbdF0oLi4ubiE9bnVsbD9uOltdKSl9ZnVuY3Rpb24ga3IoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWNvbnN0IExyPXt9O2Z1bmN0aW9uIFhpKHIsZSl7ZS53b3JrZXJJZD1yLGtyKCkmJihMcltlLndvcmtlcklkXT1lKX1mdW5jdGlvbiBZaShyLGUpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBjbGFzc05hbWUgd2hpbGUgaW5pdGlhbGl6aW5nIHdvcmtlciI7Y29uc3RbdF09ci5hcmdzLG49THJbdF07aWYobillLmluc3RhbmNlPW5ldyBuKHIuYXJncy5zbGljZSgxKSk7ZWxzZSB0aHJvd2B1bmtub3duIHdvcmtlciBjbGFzcyAke3R9YDtPdChyLHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBLaShyLGUpe2NvbnN0e2FyZ3M6dH09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi50IT1udWxsP3Q6W10pKSxPdChyLG4pfWZ1bmN0aW9uIEppKCl7Y29uc3Qgcj17fTtvbm1lc3NhZ2U9YXN5bmMgZT0+e2NvbnN0IHQ9ZS5kYXRhO3N3aXRjaCh0LnR5cGUpe2Nhc2UgSGUuSU5JVDpZaSh0LHIpO2JyZWFrO2Nhc2UgSGUuRk9SV0FSRDpxaSh0LHIpO2JyZWFrO2Nhc2UgSGUuVEVSTUlOQVRFOktpKHQscik7YnJlYWt9fX1rcigpJiZKaSgpO2NsYXNzIFp7fVoudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxaLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgTXQ9e2V4cG9ydHM6e319LCRyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBpPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxpKX19LFFpPSRyLHRlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gTnQocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocil9ZnVuY3Rpb24gVXQocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBaaShyKXtyZXR1cm4gciE9PW51bGwmJiFVdChyKSYmci5jb25zdHJ1Y3RvciE9PW51bGwmJiFVdChyLmNvbnN0cnVjdG9yKSYmdHlwZW9mIHIuY29uc3RydWN0b3IuaXNCdWZmZXI9PSJmdW5jdGlvbiImJnIuY29uc3RydWN0b3IuaXNCdWZmZXIocil9ZnVuY3Rpb24genIocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0ifWZ1bmN0aW9uIGVvKHIpe3JldHVybiB0ZS5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiB0byhyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJnpyKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIHJvKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gbm8ocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBHcihyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBWZShyKXtpZih0ZS5jYWxsKHIpIT09IltvYmplY3QgT2JqZWN0XSIpcmV0dXJuITE7dmFyIGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiBlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV9ZnVuY3Rpb24gaW8ocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gb28ocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gc28ocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBCbG9iXSJ9ZnVuY3Rpb24gSHIocil7cmV0dXJuIHRlLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGFvKHIpe3JldHVybiBHcihyKSYmSHIoci5waXBlKX1mdW5jdGlvbiB1byhyKXtyZXR1cm4gdGUuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIGNvKHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gZm8oKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gQnQocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxOdChyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBpIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsaSkmJmUuY2FsbChudWxsLHJbaV0saSxyKX1mdW5jdGlvbiBrdCgpe3ZhciByPXt9O2Z1bmN0aW9uIGUoaSxvKXtWZShyW29dKSYmVmUoaSk/cltvXT1rdChyW29dLGkpOlZlKGkpP3Jbb109a3Qoe30saSk6TnQoaSk/cltvXT1pLnNsaWNlKCk6cltvXT1pfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKUJ0KGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBsbyhyLGUsdCl7cmV0dXJuIEJ0KGUsZnVuY3Rpb24oaSxvKXt0JiZ0eXBlb2YgaT09ImZ1bmN0aW9uIj9yW29dPVFpKGksdCk6cltvXT1pfSkscn1mdW5jdGlvbiBtbyhyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyICQ9e2lzQXJyYXk6TnQsaXNBcnJheUJ1ZmZlcjp6cixpc0J1ZmZlcjpaaSxpc0Zvcm1EYXRhOmVvLGlzQXJyYXlCdWZmZXJWaWV3OnRvLGlzU3RyaW5nOnJvLGlzTnVtYmVyOm5vLGlzT2JqZWN0OkdyLGlzUGxhaW5PYmplY3Q6VmUsaXNVbmRlZmluZWQ6VXQsaXNEYXRlOmlvLGlzRmlsZTpvbyxpc0Jsb2I6c28saXNGdW5jdGlvbjpIcixpc1N0cmVhbTphbyxpc1VSTFNlYXJjaFBhcmFtczp1byxpc1N0YW5kYXJkQnJvd3NlckVudjpmbyxmb3JFYWNoOkJ0LG1lcmdlOmt0LGV4dGVuZDpsbyx0cmltOmNvLHN0cmlwQk9NOm1vfSx4ZT0kO2Z1bmN0aW9uIFZyKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBXcj1mdW5jdGlvbihlLHQsbil7aWYoIXQpcmV0dXJuIGU7dmFyIGk7aWYobilpPW4odCk7ZWxzZSBpZih4ZS5pc1VSTFNlYXJjaFBhcmFtcyh0KSlpPXQudG9TdHJpbmcoKTtlbHNle3ZhciBvPVtdO3hlLmZvckVhY2godCxmdW5jdGlvbih1LGYpe3U9PT1udWxsfHx0eXBlb2YgdT09InVuZGVmaW5lZCJ8fCh4ZS5pc0FycmF5KHUpP2Y9ZisiW10iOnU9W3VdLHhlLmZvckVhY2godSxmdW5jdGlvbihkKXt4ZS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6eGUuaXNPYmplY3QoZCkmJihkPUpTT04uc3RyaW5naWZ5KGQpKSxvLnB1c2goVnIoZikrIj0iK1ZyKGQpKX0pKX0pLGk9by5qb2luKCImIil9aWYoaSl7dmFyIHM9ZS5pbmRleE9mKCIjIik7cyE9PS0xJiYoZT1lLnNsaWNlKDAscykpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK2l9cmV0dXJuIGV9LGhvPSQ7ZnVuY3Rpb24gV2UoKXt0aGlzLmhhbmRsZXJzPVtdfVdlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6bj9uLnN5bmNocm9ub3VzOiExLHJ1bldoZW46bj9uLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LFdlLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sV2UucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7aG8uZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKG4pe24hPT1udWxsJiZlKG4pfSl9O3ZhciBwbz1XZSx5bz0kLF9vPWZ1bmN0aW9uKGUsdCl7eW8uZm9yRWFjaChlLGZ1bmN0aW9uKGksbyl7byE9PXQmJm8udG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKSYmKGVbdF09aSxkZWxldGUgZVtvXSl9KX0sanI9ZnVuY3Rpb24oZSx0LG4saSxvKXtyZXR1cm4gZS5jb25maWc9dCxuJiYoZS5jb2RlPW4pLGUucmVxdWVzdD1pLGUucmVzcG9uc2U9byxlLmlzQXhpb3NFcnJvcj0hMCxlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzp0aGlzLmNvbmZpZyxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19LGV9LHhvPWpyLHFyPWZ1bmN0aW9uKGUsdCxuLGksbyl7dmFyIHM9bmV3IEVycm9yKGUpO3JldHVybiB4byhzLHQsbixpLG8pfSxibz1xcixnbz1mdW5jdGlvbihlLHQsbil7dmFyIGk9bi5jb25maWcudmFsaWRhdGVTdGF0dXM7IW4uc3RhdHVzfHwhaXx8aShuLnN0YXR1cyk/ZShuKTp0KGJvKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrbi5zdGF0dXMsbi5jb25maWcsbnVsbCxuLnJlcXVlc3QsbikpfSxqZT0kLHZvPWplLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24odCxuLGksbyxzLGEpe3ZhciB1PVtdO3UucHVzaCh0KyI9IitlbmNvZGVVUklDb21wb25lbnQobikpLGplLmlzTnVtYmVyKGkpJiZ1LnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShpKS50b0dNVFN0cmluZygpKSxqZS5pc1N0cmluZyhvKSYmdS5wdXNoKCJwYXRoPSIrbyksamUuaXNTdHJpbmcocykmJnUucHVzaCgiZG9tYWluPSIrcyksYT09PSEwJiZ1LnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT11LmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24odCl7dmFyIG49ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK3QrIik9KFteO10qKSIpKTtyZXR1cm4gbj9kZWNvZGVVUklDb21wb25lbnQoblszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGUodCwiIixEYXRlLm5vdygpLTg2NGU1KX19fSgpOmZ1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSgpLEVvPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LFRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LEFvPUVvLHdvPVRvLFJvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFBbyh0KT93byhlLHQpOnR9LEx0PSQsU289WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSxJbz1mdW5jdGlvbihlKXt2YXIgdD17fSxuLGksbztyZXR1cm4gZSYmTHQuZm9yRWFjaChlLnNwbGl0KGAKYCksZnVuY3Rpb24oYSl7aWYobz1hLmluZGV4T2YoIjoiKSxuPUx0LnRyaW0oYS5zdWJzdHIoMCxvKSkudG9Mb3dlckNhc2UoKSxpPUx0LnRyaW0oYS5zdWJzdHIobysxKSksbil7aWYodFtuXSYmU28uaW5kZXhPZihuKT49MClyZXR1cm47bj09PSJzZXQtY29va2llIj90W25dPSh0W25dP3Rbbl06W10pLmNvbmNhdChbaV0pOnRbbl09dFtuXT90W25dKyIsICIraTppfX0pLHR9LFhyPSQsRm89WHIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlPS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIiksbjtmdW5jdGlvbiBpKG8pe3ZhciBzPW87cmV0dXJuIGUmJih0LnNldEF0dHJpYnV0ZSgiaHJlZiIscykscz10LmhyZWYpLHQuc2V0QXR0cmlidXRlKCJocmVmIixzKSx7aHJlZjp0LmhyZWYscHJvdG9jb2w6dC5wcm90b2NvbD90LnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDp0Lmhvc3Qsc2VhcmNoOnQuc2VhcmNoP3Quc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6dC5oYXNoP3QuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnQuaG9zdG5hbWUscG9ydDp0LnBvcnQscGF0aG5hbWU6dC5wYXRobmFtZS5jaGFyQXQoMCk9PT0iLyI/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZX19cmV0dXJuIG49aSh3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24ocyl7dmFyIGE9WHIuaXNTdHJpbmcocyk/aShzKTpzO3JldHVybiBhLnByb3RvY29sPT09bi5wcm90b2NvbCYmYS5ob3N0PT09bi5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiEwfX0oKTtmdW5jdGlvbiAkdChyKXt0aGlzLm1lc3NhZ2U9cn0kdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sJHQucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIHFlPSR0LFhlPSQsUG89Z28sRG89dm8sQ289V3IsT289Um8sTW89SW8sTm89Rm8senQ9cXIsVW89S2UsQm89cWUsWXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4saSl7dmFyIG89ZS5kYXRhLHM9ZS5oZWFkZXJzLGE9ZS5yZXNwb25zZVR5cGUsdTtmdW5jdGlvbiBmKCl7ZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi51bnN1YnNjcmliZSh1KSxlLnNpZ25hbCYmZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHUpfVhlLmlzRm9ybURhdGEobykmJmRlbGV0ZSBzWyJDb250ZW50LVR5cGUiXTt2YXIgYz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZD1lLmF1dGgudXNlcm5hbWV8fCIiLHA9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtzLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShkKyI6IitwKX12YXIgeT1PbyhlLmJhc2VVUkwsZS51cmwpO2Mub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLENvKHksZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksYy50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBtKCl7aWYoISFjKXt2YXIgYj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIGM/TW8oYy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxnPSFhfHxhPT09InRleHQifHxhPT09Impzb24iP2MucmVzcG9uc2VUZXh0OmMucmVzcG9uc2UsVD17ZGF0YTpnLHN0YXR1czpjLnN0YXR1cyxzdGF0dXNUZXh0OmMuc3RhdHVzVGV4dCxoZWFkZXJzOmIsY29uZmlnOmUscmVxdWVzdDpjfTtQbyhmdW5jdGlvbihMKXtuKEwpLGYoKX0sZnVuY3Rpb24oTCl7aShMKSxmKCl9LFQpLGM9bnVsbH19aWYoIm9ubG9hZGVuZCJpbiBjP2Mub25sb2FkZW5kPW06Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshY3x8Yy5yZWFkeVN0YXRlIT09NHx8Yy5zdGF0dXM9PT0wJiYhKGMucmVzcG9uc2VVUkwmJmMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KG0pfSxjLm9uYWJvcnQ9ZnVuY3Rpb24oKXshY3x8KGkoenQoIlJlcXVlc3QgYWJvcnRlZCIsZSwiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsKX0sYy5vbmVycm9yPWZ1bmN0aW9uKCl7aSh6dCgiTmV0d29yayBFcnJvciIsZSxudWxsLGMpKSxjPW51bGx9LGMub250aW1lb3V0PWZ1bmN0aW9uKCl7dmFyIGc9ZS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLFQ9ZS50cmFuc2l0aW9uYWx8fFVvLnRyYW5zaXRpb25hbDtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJihnPWUudGltZW91dEVycm9yTWVzc2FnZSksaSh6dChnLGUsVC5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLGMpKSxjPW51bGx9LFhlLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBfPShlLndpdGhDcmVkZW50aWFsc3x8Tm8oeSkpJiZlLnhzcmZDb29raWVOYW1lP0RvLnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO18mJihzW2UueHNyZkhlYWRlck5hbWVdPV8pfSJzZXRSZXF1ZXN0SGVhZGVyImluIGMmJlhlLmZvckVhY2gocyxmdW5jdGlvbihnLFQpe3R5cGVvZiBvPT0idW5kZWZpbmVkIiYmVC50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSI/ZGVsZXRlIHNbVF06Yy5zZXRSZXF1ZXN0SGVhZGVyKFQsZyl9KSxYZS5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fChjLndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxhJiZhIT09Impzb24iJiYoYy5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLHR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmYy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLHR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmMudXBsb2FkJiZjLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSwoZS5jYW5jZWxUb2tlbnx8ZS5zaWduYWwpJiYodT1mdW5jdGlvbihiKXshY3x8KGkoIWJ8fGImJmIudHlwZT9uZXcgQm8oImNhbmNlbGVkIik6YiksYy5hYm9ydCgpLGM9bnVsbCl9LGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKHUpLGUuc2lnbmFsJiYoZS5zaWduYWwuYWJvcnRlZD91KCk6ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHUpKSksb3x8KG89bnVsbCksYy5zZW5kKG8pfSl9LEM9JCxLcj1fbyxrbz1qcixMbz17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIEpyKHIsZSl7IUMuaXNVbmRlZmluZWQocikmJkMuaXNVbmRlZmluZWQoclsiQ29udGVudC1UeXBlIl0pJiYoclsiQ29udGVudC1UeXBlIl09ZSl9ZnVuY3Rpb24gJG8oKXt2YXIgcjtyZXR1cm4odHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT0idW5kZWZpbmVkInx8dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PT0iW29iamVjdCBwcm9jZXNzXSIpJiYocj1Zcikscn1mdW5jdGlvbiB6byhyLGUsdCl7aWYoQy5pc1N0cmluZyhyKSl0cnl7cmV0dXJuKGV8fEpTT04ucGFyc2UpKHIpLEMudHJpbShyKX1jYXRjaChuKXtpZihuLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IG59cmV0dXJuKHR8fEpTT04uc3RyaW5naWZ5KShyKX12YXIgWWU9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjokbygpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEtyKHQsIkFjY2VwdCIpLEtyKHQsIkNvbnRlbnQtVHlwZSIpLEMuaXNGb3JtRGF0YShlKXx8Qy5pc0FycmF5QnVmZmVyKGUpfHxDLmlzQnVmZmVyKGUpfHxDLmlzU3RyZWFtKGUpfHxDLmlzRmlsZShlKXx8Qy5pc0Jsb2IoZSk/ZTpDLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOkMuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KEpyKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpDLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oSnIodCwiYXBwbGljYXRpb24vanNvbiIpLHpvKGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxZZS50cmFuc2l0aW9uYWwsbj10JiZ0LnNpbGVudEpTT05QYXJzaW5nLGk9dCYmdC5mb3JjZWRKU09OUGFyc2luZyxvPSFuJiZ0aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihvfHxpJiZDLmlzU3RyaW5nKGUpJiZlLmxlbmd0aCl0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2gocyl7aWYobyl0aHJvdyBzLm5hbWU9PT0iU3ludGF4RXJyb3IiP2tvKHMsdGhpcywiRV9KU09OX1BBUlNFIik6c31yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtDLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sZnVuY3Rpb24oZSl7WWUuaGVhZGVyc1tlXT17fX0pLEMuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKGUpe1llLmhlYWRlcnNbZV09Qy5tZXJnZShMbyl9KTt2YXIgS2U9WWUsR289JCxIbz1LZSxWbz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpc3x8SG87cmV0dXJuIEdvLmZvckVhY2gobixmdW5jdGlvbihzKXtlPXMuY2FsbChpLGUsdCl9KSxlfSxRcj1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxacj0kLEd0PVZvLFdvPVFyLGpvPUtlLHFvPXFlO2Z1bmN0aW9uIEh0KHIpe2lmKHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLHIuc2lnbmFsJiZyLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBxbygiY2FuY2VsZWQiKX12YXIgWG89ZnVuY3Rpb24oZSl7SHQoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPUd0LmNhbGwoZSxlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPVpyLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksWnIuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxmdW5jdGlvbihpKXtkZWxldGUgZS5oZWFkZXJzW2ldfSk7dmFyIHQ9ZS5hZGFwdGVyfHxqby5hZGFwdGVyO3JldHVybiB0KGUpLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIEh0KGUpLGkuZGF0YT1HdC5jYWxsKGUsaS5kYXRhLGkuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSxpfSxmdW5jdGlvbihpKXtyZXR1cm4gV28oaSl8fChIdChlKSxpJiZpLnJlc3BvbnNlJiYoaS5yZXNwb25zZS5kYXRhPUd0LmNhbGwoZSxpLnJlc3BvbnNlLmRhdGEsaS5yZXNwb25zZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QoaSl9KX0sej0kLGVuPWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbj17fTtmdW5jdGlvbiBpKGMsZCl7cmV0dXJuIHouaXNQbGFpbk9iamVjdChjKSYmei5pc1BsYWluT2JqZWN0KGQpP3oubWVyZ2UoYyxkKTp6LmlzUGxhaW5PYmplY3QoZCk/ei5tZXJnZSh7fSxkKTp6LmlzQXJyYXkoZCk/ZC5zbGljZSgpOmR9ZnVuY3Rpb24gbyhjKXtpZih6LmlzVW5kZWZpbmVkKHRbY10pKXtpZighei5pc1VuZGVmaW5lZChlW2NdKSlyZXR1cm4gaSh2b2lkIDAsZVtjXSl9ZWxzZSByZXR1cm4gaShlW2NdLHRbY10pfWZ1bmN0aW9uIHMoYyl7aWYoIXouaXNVbmRlZmluZWQodFtjXSkpcmV0dXJuIGkodm9pZCAwLHRbY10pfWZ1bmN0aW9uIGEoYyl7aWYoei5pc1VuZGVmaW5lZCh0W2NdKSl7aWYoIXouaXNVbmRlZmluZWQoZVtjXSkpcmV0dXJuIGkodm9pZCAwLGVbY10pfWVsc2UgcmV0dXJuIGkodm9pZCAwLHRbY10pfWZ1bmN0aW9uIHUoYyl7aWYoYyBpbiB0KXJldHVybiBpKGVbY10sdFtjXSk7aWYoYyBpbiBlKXJldHVybiBpKHZvaWQgMCxlW2NdKX12YXIgZj17dXJsOnMsbWV0aG9kOnMsZGF0YTpzLGJhc2VVUkw6YSx0cmFuc2Zvcm1SZXF1ZXN0OmEsdHJhbnNmb3JtUmVzcG9uc2U6YSxwYXJhbXNTZXJpYWxpemVyOmEsdGltZW91dDphLHRpbWVvdXRNZXNzYWdlOmEsd2l0aENyZWRlbnRpYWxzOmEsYWRhcHRlcjphLHJlc3BvbnNlVHlwZTphLHhzcmZDb29raWVOYW1lOmEseHNyZkhlYWRlck5hbWU6YSxvblVwbG9hZFByb2dyZXNzOmEsb25Eb3dubG9hZFByb2dyZXNzOmEsZGVjb21wcmVzczphLG1heENvbnRlbnRMZW5ndGg6YSxtYXhCb2R5TGVuZ3RoOmEsdHJhbnNwb3J0OmEsaHR0cEFnZW50OmEsaHR0cHNBZ2VudDphLGNhbmNlbFRva2VuOmEsc29ja2V0UGF0aDphLHJlc3BvbnNlRW5jb2Rpbmc6YSx2YWxpZGF0ZVN0YXR1czp1fTtyZXR1cm4gei5mb3JFYWNoKE9iamVjdC5rZXlzKGUpLmNvbmNhdChPYmplY3Qua2V5cyh0KSksZnVuY3Rpb24oZCl7dmFyIHA9ZltkXXx8byx5PXAoZCk7ei5pc1VuZGVmaW5lZCh5KSYmcCE9PXV8fChuW2RdPXkpfSksbn0sdG49e3ZlcnNpb246IjAuMjUuMCJ9LFlvPXRuLnZlcnNpb24sVnQ9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKGZ1bmN0aW9uKHIsZSl7VnRbcl09ZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT09cnx8ImEiKyhlPDE/Im4gIjoiICIpK3J9fSk7dmFyIHJuPXt9O1Z0LnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gaShvLHMpe3JldHVybiJbQXhpb3MgdiIrWW8rIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitvKyInIitzKyhuPyIuICIrbjoiIil9cmV0dXJuIGZ1bmN0aW9uKG8scyxhKXtpZihlPT09ITEpdGhyb3cgbmV3IEVycm9yKGkocywiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSkpO3JldHVybiB0JiYhcm5bc10mJihybltzXT0hMCxjb25zb2xlLndhcm4oaShzLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLGU/ZShvLHMsYSk6ITB9fTtmdW5jdGlvbiBLbyhyLGUsdCl7aWYodHlwZW9mIHIhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0LmtleXMociksaT1uLmxlbmd0aDtpLS0gPjA7KXt2YXIgbz1uW2ldLHM9ZVtvXTtpZihzKXt2YXIgYT1yW29dLHU9YT09PXZvaWQgMHx8cyhhLG8scik7aWYodSE9PSEwKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrdSk7Y29udGludWV9aWYodCE9PSEwKXRocm93IEVycm9yKCJVbmtub3duIG9wdGlvbiAiK28pfX12YXIgSm89e2Fzc2VydE9wdGlvbnM6S28sdmFsaWRhdG9yczpWdH0sbm49JCxRbz1Xcixvbj1wbyxzbj1YbyxKZT1lbixhbj1KbyxiZT1hbi52YWxpZGF0b3JzO2Z1bmN0aW9uIEllKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgb24scmVzcG9uc2U6bmV3IG9ufX1JZS5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD1KZSh0aGlzLmRlZmF1bHRzLHQpLHQubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgbj10LnRyYW5zaXRpb25hbDtuIT09dm9pZCAwJiZhbi5hc3NlcnRPcHRpb25zKG4se3NpbGVudEpTT05QYXJzaW5nOmJlLnRyYW5zaXRpb25hbChiZS5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpiZS50cmFuc2l0aW9uYWwoYmUuYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpiZS50cmFuc2l0aW9uYWwoYmUuYm9vbGVhbil9LCExKTt2YXIgaT1bXSxvPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbih5KXt0eXBlb2YgeS5ydW5XaGVuPT0iZnVuY3Rpb24iJiZ5LnJ1bldoZW4odCk9PT0hMXx8KG89byYmeS5zeW5jaHJvbm91cyxpLnVuc2hpZnQoeS5mdWxmaWxsZWQseS5yZWplY3RlZCkpfSk7dmFyIHM9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbih5KXtzLnB1c2goeS5mdWxmaWxsZWQseS5yZWplY3RlZCl9KTt2YXIgYTtpZighbyl7dmFyIHU9W3NuLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KHUsaSksdT11LmNvbmNhdChzKSxhPVByb21pc2UucmVzb2x2ZSh0KTt1Lmxlbmd0aDspYT1hLnRoZW4odS5zaGlmdCgpLHUuc2hpZnQoKSk7cmV0dXJuIGF9Zm9yKHZhciBmPXQ7aS5sZW5ndGg7KXt2YXIgYz1pLnNoaWZ0KCksZD1pLnNoaWZ0KCk7dHJ5e2Y9YyhmKX1jYXRjaChwKXtkKHApO2JyZWFrfX10cnl7YT1zbihmKX1jYXRjaChwKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QocCl9Zm9yKDtzLmxlbmd0aDspYT1hLnRoZW4ocy5zaGlmdCgpLHMuc2hpZnQoKSk7cmV0dXJuIGF9LEllLnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7aWYoIWUudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTtyZXR1cm4gZT1KZSh0aGlzLmRlZmF1bHRzLGUpLFFvKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LG5uLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe0llLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QoSmUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLG5uLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtJZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuLGkpe3JldHVybiB0aGlzLnJlcXVlc3QoSmUoaXx8e30se21ldGhvZDplLHVybDp0LGRhdGE6bn0pKX19KTt2YXIgWm89SWUsZXM9cWU7ZnVuY3Rpb24gZ2Uocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihpKXtlPWl9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgaSxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKGk9MDtpPG87aSsrKXQuX2xpc3RlbmVyc1tpXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgaSxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMpe3Quc3Vic2NyaWJlKHMpLGk9c30pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShpKX0sb30scihmdW5jdGlvbihpKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBlcyhpKSxlKHQucmVhc29uKSl9KX1nZS5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxnZS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LGdlLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxnZS5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBnZShmdW5jdGlvbihpKXtlPWl9KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciB0cz1nZSxycz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LG5zPSQsaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5zLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSx1bj0kLG9zPSRyLFFlPVpvLHNzPWVuLGFzPUtlO2Z1bmN0aW9uIGNuKHIpe3ZhciBlPW5ldyBRZShyKSx0PW9zKFFlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiB1bi5leHRlbmQodCxRZS5wcm90b3R5cGUsZSksdW4uZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24oaSl7cmV0dXJuIGNuKHNzKHIsaSkpfSx0fXZhciBLPWNuKGFzKTtLLkF4aW9zPVFlLEsuQ2FuY2VsPXFlLEsuQ2FuY2VsVG9rZW49dHMsSy5pc0NhbmNlbD1RcixLLlZFUlNJT049dG4udmVyc2lvbixLLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEsuc3ByZWFkPXJzLEsuaXNBeGlvc0Vycm9yPWlzLE10LmV4cG9ydHM9SyxNdC5leHBvcnRzLmRlZmF1bHQ9Szt2YXIgdXM9TXQuZXhwb3J0cztjbGFzcyBFe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IGZuKGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIEUub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IGZuKGUpOm5ldyBsbn1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IGxufXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIEUub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIEUuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIGZuIGV4dGVuZHMgRXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpFLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBFLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3MgbG4gZXh0ZW5kcyBFe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gRS5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIEUuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgY3M9IjIuMC4wIjtmdW5jdGlvbiBmcyhyKXtnbG9iYWxUaGlzLl92b25hZ2VNZWRpYVByb2Nlc3Nvck1ldGFkYXRhPXJ9ZnVuY3Rpb24gbHMoKXtyZXR1cm4gZ2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YX1jbGFzcyBHe2NvbnN0cnVjdG9yKCl7Y29uc3QgZT1scygpO3RoaXMuX3JlcG9ydD17YWN0aW9uOkUuZW1wdHkoKSxhcHBsaWNhdGlvbklkOkUub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UuYXBwSWQ6bnVsbCksdGltZXN0YW1wOkRhdGUubm93KCksZnBzOkUuZW1wdHkoKSxmcmFtZXNUcmFuc2Zvcm1lZDpFLmVtcHR5KCksZ3VpZDpFLmVtcHR5KCksaGlnaGVzdEZyYW1lVHJhbnNmb3JtQ3B1OkUuZW1wdHkoKSxtZXNzYWdlOkUuZW1wdHkoKSxzb3VyY2U6RS5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5zb3VyY2VUeXBlOm51bGwpLHRyYW5zZm9ybWVkRnBzOkUuZW1wdHkoKSx0cmFuc2Zvcm1lclR5cGU6RS5lbXB0eSgpLHZhcmlhdGlvbjpFLmVtcHR5KCksdmlkZW9IZWlnaHQ6RS5lbXB0eSgpLHZpZGVvV2lkdGg6RS5lbXB0eSgpLHZlcnNpb246Y3MsZXJyb3I6RS5lbXB0eSgpLHByb3h5VXJsOkUub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UucHJveHlVcmw6bnVsbCl9fWFjdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmFjdGlvbj1FLm9mTnVsbGFibGUoZSksdGhpc31mcmFtZXNUcmFuc2Zvcm1lZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmZyYW1lc1RyYW5zZm9ybWVkPUUub2ZOdWxsYWJsZShlKSx0aGlzfWZwcyhlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmZwcz1FLm9mTnVsbGFibGUoZSksdGhpc31ndWlkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZ3VpZD1FLm9mTnVsbGFibGUoZSksdGhpc31tZXNzYWdlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQubWVzc2FnZT1FLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lZEZwcyhlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnRyYW5zZm9ybWVkRnBzPUUub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVyVHlwZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnRyYW5zZm9ybWVyVHlwZT1FLm9mTnVsbGFibGUoZSksdGhpc312YXJpYXRpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52YXJpYXRpb249RS5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9IZWlnaHQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb0hlaWdodD1FLm9mTnVsbGFibGUoZSksdGhpc312aWRlb1dpZHRoKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9XaWR0aD1FLm9mTnVsbGFibGUoZSksdGhpc31lcnJvcihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LmVycm9yPUUub2ZOdWxsYWJsZShlKSx0aGlzfWJ1aWxkKCl7cmV0dXJuIHRoaXMuX3JlcG9ydH19Y29uc3QgZHM9cj0+SlNPTi5zdHJpbmdpZnkociwoZSx0KT0+e2lmKHQhPT1udWxsKXJldHVybiB0fSk7Y2xhc3MgSHtzdGF0aWMgcmVwb3J0KGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKGUuYXBwbGljYXRpb25JZC5pc0VtcHR5KCl8fGUuc291cmNlLmlzRW1wdHkoKSl7dCgic3VjY2VzcyIpO3JldHVybn1sZXQgaT11cy5jcmVhdGUoKSxvPXt0aW1lb3V0OjFlNCx0aW1lb3V0RXJyb3JNZXNzYWdlOiJSZXF1ZXN0IHRpbWVvdXQiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19LHM9ImhsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIjtpZihlLnByb3h5VXJsLmlzRW1wdHkoKSlzPSJodHRwczovLyIrcztlbHNle2xldCBhO2UucHJveHlVcmwuZ2V0KCkuc2xpY2UoZS5wcm94eVVybC5nZXQoKS5sZW5ndGgtMSkhPT0iLyI/YT1lLnByb3h5VXJsLmdldCgpKyIvIjphPWUucHJveHlVcmwuZ2V0KCkscz1hK3N9aS5wb3N0KHMsZHMoZSksbykudGhlbihhPT57Y29uc29sZS5sb2coYSksdCgic3VjY2VzcyIpfSkuY2F0Y2goYT0+e2NvbnNvbGUubG9nKGEpLG4oYSl9KX0pfX12YXIgWmUsbXM9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIGhzKCl7aWYoIVplJiYoWmU9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIVplKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFplKG1zKX12YXIgcHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIHlzKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJnBzLnRlc3Qocil9Zm9yKHZhciBPPVtdLFd0PTA7V3Q8MjU2OysrV3QpTy5wdXNoKChXdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIF9zKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KE9bcltlKzBdXStPW3JbZSsxXV0rT1tyW2UrMl1dK09bcltlKzNdXSsiLSIrT1tyW2UrNF1dK09bcltlKzVdXSsiLSIrT1tyW2UrNl1dK09bcltlKzddXSsiLSIrT1tyW2UrOF1dK09bcltlKzldXSsiLSIrT1tyW2UrMTBdXStPW3JbZSsxMV1dK09bcltlKzEyXV0rT1tyW2UrMTNdXStPW3JbZSsxNF1dK09bcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIXlzKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gZG4ocixlLHQpe3I9cnx8e307dmFyIG49ci5yYW5kb218fChyLnJuZ3x8aHMpKCk7aWYobls2XT1uWzZdJjE1fDY0LG5bOF09bls4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgaT0wO2k8MTY7KytpKWVbdCtpXT1uW2ldO3JldHVybiBlfXJldHVybiBfcyhuKX1jb25zdCByZT1uZXcgV2Vha01hcCxldD1uZXcgV2Vha01hcCxGZT1uZXcgV2Vha01hcCxqdD1TeW1ib2woImFueVByb2R1Y2VyIiksbW49UHJvbWlzZS5yZXNvbHZlKCksdHQ9U3ltYm9sKCJsaXN0ZW5lckFkZGVkIikscnQ9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgcXQ9ITE7ZnVuY3Rpb24gdmUocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBudChyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBFZShyLGUpe2NvbnN0IHQ9ZXQuZ2V0KHIpO3JldHVybiB0LmhhcyhlKXx8dC5zZXQoZSxuZXcgU2V0KSx0LmdldChlKX1mdW5jdGlvbiBQZShyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCI/ZTpqdCxuPUZlLmdldChyKTtyZXR1cm4gbi5oYXModCl8fG4uc2V0KHQsbmV3IFNldCksbi5nZXQodCl9ZnVuY3Rpb24geHMocixlLHQpe2NvbnN0IG49RmUuZ2V0KHIpO2lmKG4uaGFzKGUpKWZvcihjb25zdCBpIG9mIG4uZ2V0KGUpKWkuZW5xdWV1ZSh0KTtpZihuLmhhcyhqdCkpe2NvbnN0IGk9UHJvbWlzZS5hbGwoW2UsdF0pO2Zvcihjb25zdCBvIG9mIG4uZ2V0KGp0KSlvLmVucXVldWUoaSl9fWZ1bmN0aW9uIGhuKHIsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PSExLG49KCk9Pnt9LGk9W107Y29uc3Qgbz17ZW5xdWV1ZShzKXtpLnB1c2gocyksbigpfSxmaW5pc2goKXt0PSEwLG4oKX19O2Zvcihjb25zdCBzIG9mIGUpUGUocixzKS5hZGQobyk7cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gaT9pLmxlbmd0aD09PTA/dD8oaT12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShzPT57bj1zfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IGkuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4ocyl7aT12b2lkIDA7Zm9yKGNvbnN0IGEgb2YgZSlQZShyLGEpLmRlbGV0ZShvKTtyZXR1cm4gbigpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBzfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIHBuKHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIHluO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZigheW4uaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBYdD1yPT5yPT09dHR8fHI9PT1ydDtjbGFzcyBmZXtzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1wbih0KSxuPT57aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBzIG9mIHQpaWYobi5wcm90b3R5cGVbc10hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke3N9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIGkoKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgZmV9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDppfSk7Y29uc3Qgbz1zPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtzXSguLi5hKX07Zm9yKGNvbnN0IHMgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUscyx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKHMpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIHF0O2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fHF0fXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7cXQ9ZX1jb25zdHJ1Y3RvcihlPXt9KXtyZS5zZXQodGhpcyxuZXcgU2V0KSxldC5zZXQodGhpcyxuZXcgTWFwKSxGZS5zZXQodGhpcyxuZXcgTWFwKSx0aGlzLmRlYnVnPWUuZGVidWd8fHt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0odCxuLGksbyk9PntvPUpTT04uc3RyaW5naWZ5KG8pLHR5cGVvZiBpPT0ic3ltYm9sIiYmKGk9aS50b1N0cmluZygpKTtjb25zdCBzPW5ldyBEYXRlLGE9YCR7cy5nZXRIb3VycygpfToke3MuZ2V0TWludXRlcygpfToke3MuZ2V0U2Vjb25kcygpfS4ke3MuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7YX1dW2VtaXR0ZXJ5OiR7dH1dWyR7bn1dIEV2ZW50IE5hbWU6ICR7aX0KCWRhdGE6ICR7b31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxuKXsoZmUuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtudCh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSl2ZShuKSxFZSh0aGlzLG4pLmFkZCh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmUiLG4sdm9pZCAwKSxYdChuKXx8dGhpcy5lbWl0KHR0LHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSk7cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHQpfW9mZihlLHQpe250KHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKXZlKG4pLEVlKHRoaXMsbikuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixuLHZvaWQgMCksWHQobil8fHRoaXMuZW1pdChydCx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBuPXRoaXMub24oZSxpPT57bigpLHQoaSl9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSl2ZSh0KTtyZXR1cm4gaG4odGhpcyxlKX1hc3luYyBlbWl0KGUsdCl7dmUoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx4cyh0aGlzLGUsdCk7Y29uc3Qgbj1FZSh0aGlzLGUpLGk9cmUuZ2V0KHRoaXMpLG89Wy4uLm5dLHM9WHQoZSk/W106Wy4uLmldO2F3YWl0IG1uLGF3YWl0IFByb21pc2UuYWxsKFsuLi5vLm1hcChhc3luYyBhPT57aWYobi5oYXMoYSkpcmV0dXJuIGEodCl9KSwuLi5zLm1hcChhc3luYyBhPT57aWYoaS5oYXMoYSkpcmV0dXJuIGEoZSx0KX0pXSl9YXN5bmMgZW1pdFNlcmlhbChlLHQpe3ZlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgbj1FZSh0aGlzLGUpLGk9cmUuZ2V0KHRoaXMpLG89Wy4uLm5dLHM9Wy4uLmldO2F3YWl0IG1uO2Zvcihjb25zdCBhIG9mIG8pbi5oYXMoYSkmJmF3YWl0IGEodCk7Zm9yKGNvbnN0IGEgb2YgcylpLmhhcyhhKSYmYXdhaXQgYShlLHQpfW9uQW55KGUpe3JldHVybiBudChlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHJlLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KHR0LHtsaXN0ZW5lcjplfSksdGhpcy5vZmZBbnkuYmluZCh0aGlzLGUpfWFueUV2ZW50KCl7cmV0dXJuIGhuKHRoaXMpfW9mZkFueShlKXtudChlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KHJ0LHtsaXN0ZW5lcjplfSkscmUuZ2V0KHRoaXMpLmRlbGV0ZShlKX1jbGVhckxpc3RlbmVycyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlpZih0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJjbGVhciIsdCx2b2lkIDApLHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJzeW1ib2wiKXtFZSh0aGlzLHQpLmNsZWFyKCk7Y29uc3Qgbj1QZSh0aGlzLHQpO2Zvcihjb25zdCBpIG9mIG4paS5maW5pc2goKTtuLmNsZWFyKCl9ZWxzZXtyZS5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBldC5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIEZlLmdldCh0aGlzKS52YWx1ZXMoKSl7Zm9yKGNvbnN0IGkgb2YgbilpLmZpbmlzaCgpO24uY2xlYXIoKX19fWxpc3RlbmVyQ291bnQoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl7aWYodHlwZW9mIG49PSJzdHJpbmciKXt0Kz1yZS5nZXQodGhpcykuc2l6ZStFZSh0aGlzLG4pLnNpemUrUGUodGhpcyxuKS5zaXplK1BlKHRoaXMpLnNpemU7Y29udGludWV9dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZ2ZShuKSx0Kz1yZS5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgaSBvZiBldC5nZXQodGhpcykudmFsdWVzKCkpdCs9aS5zaXplO2Zvcihjb25zdCBpIG9mIEZlLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1pLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1wbih0KTtmb3IoY29uc3QgbiBvZiB0KXtpZihlW25dIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtufVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbbl0uYmluZCh0aGlzKX0pfX19Y29uc3QgeW49T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZmUucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShmZSwibGlzdGVuZXJBZGRlZCIse3ZhbHVlOnR0LHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGZlLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTpydCx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pO3ZhciBZdD1mZTtmdW5jdGlvbiBicyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gZ3Mocil7aWYoYnMocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gS3Qocil7cmV0dXJuIGdzKHIpLm1lc3NhZ2V9dmFyIEp0PShyPT4oci5waXBlbGluZV9lbmRlZD0icGlwZWxpbmVfZW5kZWQiLHIucGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIsci5waXBlbGluZV9zdGFydGVkPSJwaXBlbGluZV9zdGFydGVkIixyLnBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIixyLnBpcGVsaW5lX3Jlc3RhcnRlZD0icGlwZWxpbmVfcmVzdGFydGVkIixyLnBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvciIscikpKEp0fHx7fSk7Y29uc3QgdnM9NTAwLEVzPS44O2NsYXNzIFRzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1kbigpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBuPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7SC5yZXBvcnQobil9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydD09ImZ1bmN0aW9uIil0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQoZSl9Y2F0Y2godCl7Y29uc3Qgbj1uZXcgRygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKEt0KHQpKS5idWlsZCgpO0gucmVwb3J0KG4pO2NvbnN0IGk9e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsaSl9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBuLGksbyxzO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShpPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9pOjApLCsrdGhpcy5mcmFtZXNGcm9tU291cmNlXyx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHQpLHQudGVybWluYXRlKCk7ZWxzZSB0cnl7YXdhaXQoKHM9KG89dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOnMuY2FsbChvLGUsdCkpLCsrdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8sdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89PT12cyYmdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl9Y2F0Y2goYSl7Y29uc3QgdT1uZXcgRygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihLdChhKSkuYnVpbGQoKTtILnJlcG9ydCh1KTtjb25zdCBmPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixmKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChuKXtjb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFouZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoS3QobikpLmJ1aWxkKCk7SC5yZXBvcnQoaSk7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6bixmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixvKX19dGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCk7Y29uc3QgdD1uZXcgRygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO0gucmVwb3J0KHQpfXN0b3AoKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTdG9wIHN0cmVhbS4iKSx0aGlzLmNvbnRyb2xsZXJfJiYodGhpcy5mbHVzaCh0aGlzLmNvbnRyb2xsZXJfKSx0aGlzLmNvbnRyb2xsZXJfLnRlcm1pbmF0ZSgpKSx0aGlzLnNob3VsZFN0b3BfPSEwfW1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKXtsZXQgZT0oRGF0ZS5ub3coKS10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF8pLzFlMyx0PXRoaXMuZnJhbWVzRnJvbVNvdXJjZV8vZSxuPXRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfL2U7aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypFcz50KXtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSx3YXJuaW5nVHlwZToiZnBzX2Ryb3AiLGRyb3BJbmZvOntyZXF1ZXN0ZWQ6dGhpcy50cmFja0V4cGVjdGVkUmF0ZV8sY3VycmVudDp0fX07dGhpcy5lbWl0KCJ3YXJuIixvKX1jb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKG4pLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTtILnJlcG9ydChpKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3MgQXMgZXh0ZW5kcyBZdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMudHJhbnNmb3JtZXJzXz1bXSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49bmV3IFRzKGVbdF0sdCk7bi5vbigiZXJyb3IiLGk9Pnt0aGlzLmVtaXQoImVycm9yIixpKX0pLG4ub24oIndhcm4iLGk9Pnt0aGlzLmVtaXQoIndhcm4iLGkpfSksdGhpcy50cmFuc2Zvcm1lcnNfLnB1c2gobil9fXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWU7Zm9yKGxldCB0IG9mIHRoaXMudHJhbnNmb3JtZXJzXyl0LnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX1hc3luYyBzdGFydChlLHQpe2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBObyB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufXRyeXtsZXQgbj1lO2ZvcihsZXQgaSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZT1lLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0oaSkpO2UucGlwZVRvKHQpLnRoZW4oYXN5bmMoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNldHVwLiIpLGF3YWl0IHQuYWJvcnQoKSxhd2FpdCBuLmNhbmNlbCgpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfZW5kZWQiKX0pLmNhdGNoKGFzeW5jIGk9PntlLmNhbmNlbCgpLnRoZW4oKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTaHV0dGluZyBkb3duIHN0cmVhbXMgYWZ0ZXIgYWJvcnQuIil9KS5jYXRjaChvPT57Y29uc29sZS5lcnJvcigiW1BpcGVsaW5lXSBFcnJvciBmcm9tIHN0cmVhbSB0cmFuc2Zvcm06IixvKX0pLGF3YWl0IHQuYWJvcnQoaSksYXdhaXQgbi5jYW5jZWwoaSksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9lbmRlZF93aXRoX2Vycm9yIil9KX1jYXRjaHt0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciIpLHRoaXMuZGVzdHJveSgpO3JldHVybn10aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX3N0YXJ0ZWQiKSxjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIHdzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudXVpZF89ZG4oKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO0gucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtILnJlcG9ydChpKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKTtyZXR1cm59aWYoIXRoaXMucmVhZGFibGVfKXtjb25zdCBpPW5ldyBHKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShaLmVycm9ycy5yZWFkYWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtILnJlcG9ydChpKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFJlYWRhYmxlIGlzIG51bGwuIik7cmV0dXJufWlmKCF0aGlzLndyaXRhYmxlXyl7Y29uc3QgaT1uZXcgRygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoWi5lcnJvcnMud3JpdGFibGVfbnVsbCkudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7SC5yZXBvcnQoaSksdCgiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgbj0hMTt0aGlzLnBpcGVsaW5lXyYmKG49ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBBcyh0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixpPT57dGhpcy5lbWl0KCJ3YXJuIixpKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsaT0+e3RoaXMuZW1pdCgiZXJyb3IiLGkpfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIsaT0+e24mJihpPT09InBpcGVsaW5lX3N0YXJ0ZWQiP2k9SnQucGlwZWxpbmVfcmVzdGFydGVkOmk9PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKGk9SnQucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsaSl9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKGk9Pnt0KGkpfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgRygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoWi51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiBILnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgRygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtILnJlcG9ydCh0KSxlKCl9KX19dmFyIGl0PShyPT4oci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIixyKSkoaXR8fHt9KTsvKiBAbGljZW5zZSB0d2dsLmpzIDUuMC40IENvcHlyaWdodCAoYykgMjAxNSwgR3JlZ2cgVGF2YXJlcyBBbGwgUmlnaHRzIFJlc2VydmVkLgpBdmFpbGFibGUgdmlhIHRoZSBNSVQgbGljZW5zZS4Kc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9ncmVnZ21hbi90d2dsLmpzIGZvciBkZXRhaWxzICovY29uc3QgUXQ9NTEyMCxEZT01MTIxLFp0PTUxMjIsZXI9NTEyMyx0cj01MTI0LHJyPTUxMjUsbnI9NTEyNixScz0zMjgxOSxTcz0zMjgyMCxJcz0zMzYzNSxGcz01MTMxLFBzPTMzNjQwLERzPTM1ODk5LENzPTM1OTAyLE9zPTM2MjY5LE1zPTM0MDQyLF9uPXt9O3tjb25zdCByPV9uO3JbUXRdPUludDhBcnJheSxyW0RlXT1VaW50OEFycmF5LHJbWnRdPUludDE2QXJyYXkscltlcl09VWludDE2QXJyYXksclt0cl09SW50MzJBcnJheSxyW3JyXT1VaW50MzJBcnJheSxyW25yXT1GbG9hdDMyQXJyYXkscltSc109VWludDE2QXJyYXkscltTc109VWludDE2QXJyYXkscltJc109VWludDE2QXJyYXkscltGc109VWludDE2QXJyYXkscltQc109VWludDMyQXJyYXkscltEc109VWludDMyQXJyYXkscltDc109VWludDMyQXJyYXkscltPc109VWludDMyQXJyYXkscltNc109VWludDMyQXJyYXl9ZnVuY3Rpb24gaXIocil7aWYociBpbnN0YW5jZW9mIEludDhBcnJheSlyZXR1cm4gUXQ7aWYociBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHIgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlyZXR1cm4gRGU7aWYociBpbnN0YW5jZW9mIEludDE2QXJyYXkpcmV0dXJuIFp0O2lmKHIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSlyZXR1cm4gZXI7aWYociBpbnN0YW5jZW9mIEludDMyQXJyYXkpcmV0dXJuIHRyO2lmKHIgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlyZXR1cm4gcnI7aWYociBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlyZXR1cm4gbnI7dGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCB0eXBlZCBhcnJheSB0eXBlIil9ZnVuY3Rpb24gTnMocil7aWYocj09PUludDhBcnJheSlyZXR1cm4gUXQ7aWYocj09PVVpbnQ4QXJyYXl8fHI9PT1VaW50OENsYW1wZWRBcnJheSlyZXR1cm4gRGU7aWYocj09PUludDE2QXJyYXkpcmV0dXJuIFp0O2lmKHI9PT1VaW50MTZBcnJheSlyZXR1cm4gZXI7aWYocj09PUludDMyQXJyYXkpcmV0dXJuIHRyO2lmKHI9PT1VaW50MzJBcnJheSlyZXR1cm4gcnI7aWYocj09PUZsb2F0MzJBcnJheSlyZXR1cm4gbnI7dGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCB0eXBlZCBhcnJheSB0eXBlIil9ZnVuY3Rpb24gVXMocil7Y29uc3QgZT1fbltyXTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZ2wgdHlwZSIpO3JldHVybiBlfWNvbnN0IG90PXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCI/ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiYoZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8ZS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcil9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn07ZnVuY3Rpb24geG4oLi4ucil7Y29uc29sZS5lcnJvciguLi5yKX1jb25zdCBibj1uZXcgTWFwO2Z1bmN0aW9uIENlKHIsZSl7aWYoIXJ8fHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgdD1ibi5nZXQoZSk7dHx8KHQ9bmV3IFdlYWtNYXAsYm4uc2V0KGUsdCkpO2xldCBuPXQuZ2V0KHIpO2lmKG49PT12b2lkIDApe2NvbnN0IGk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpO249aS5zdWJzdHJpbmcoOCxpLmxlbmd0aC0xKT09PWUsdC5zZXQocixuKX1yZXR1cm4gbn1mdW5jdGlvbiBCcyhyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xCdWZmZXIhPSJ1bmRlZmluZWQiJiZDZShlLCJXZWJHTEJ1ZmZlciIpfWZ1bmN0aW9uIGtzKHIsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTFJlbmRlcmJ1ZmZlciE9InVuZGVmaW5lZCImJkNlKGUsIldlYkdMUmVuZGVyYnVmZmVyIil9ZnVuY3Rpb24gTHMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2hhZGVyIT0idW5kZWZpbmVkIiYmQ2UoZSwiV2ViR0xTaGFkZXIiKX1mdW5jdGlvbiBvcihyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlIT0idW5kZWZpbmVkIiYmQ2UoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gJHMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlciE9InVuZGVmaW5lZCImJkNlKGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IGduPTM1MDQ0LGxlPTM0OTYyLHpzPTM0OTYzLEdzPTM0NjYwLEhzPTUxMjAsVnM9NTEyMSxXcz01MTIyLGpzPTUxMjMscXM9NTEyNCxYcz01MTI1LFlzPTUxMjYsdm49e2F0dHJpYlByZWZpeDoiIn07ZnVuY3Rpb24gS3MocixlLHQsbixpKXtyLmJpbmRCdWZmZXIoZSx0KSxyLmJ1ZmZlckRhdGEoZSxuLGl8fGduKX1mdW5jdGlvbiBFbihyLGUsdCxuKXtpZihCcyhyLGUpKXJldHVybiBlO3Q9dHx8bGU7Y29uc3QgaT1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiBLcyhyLHQsaSxlLG4pLGl9ZnVuY3Rpb24gVG4ocil7cmV0dXJuIHI9PT0iaW5kaWNlcyJ9ZnVuY3Rpb24gSnMocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBJbnQ4QXJyYXl8fHIgaW5zdGFuY2VvZiBVaW50OEFycmF5fWZ1bmN0aW9uIFFzKHIpe3JldHVybiByPT09SW50OEFycmF5fHxyPT09VWludDhBcnJheX1mdW5jdGlvbiBacyhyKXtyZXR1cm4gci5sZW5ndGg/cjpyLmRhdGF9Y29uc3QgZWE9L2Nvb3JkfHRleHR1cmUvaSx0YT0vY29sb3J8Y29sb3VyL2k7ZnVuY3Rpb24gQW4ocixlKXtsZXQgdDtpZihlYS50ZXN0KHIpP3Q9Mjp0YS50ZXN0KHIpP3Q9NDp0PTMsZSV0PjApdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGd1ZXNzIG51bUNvbXBvbmVudHMgZm9yIGF0dHJpYnV0ZSAnJHtyfScuIFRyaWVkICR7dH0gYnV0ICR7ZX0gdmFsdWVzIGlzIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5ICR7dH0uIFlvdSBzaG91bGQgc3BlY2lmeSBpdC5gKTtyZXR1cm4gdH1mdW5jdGlvbiByYShyLGUpe3JldHVybiByLm51bUNvbXBvbmVudHN8fHIuc2l6ZXx8QW4oZSxacyhyKS5sZW5ndGgpfWZ1bmN0aW9uIHduKHIsZSl7aWYob3QocikpcmV0dXJuIHI7aWYob3Qoci5kYXRhKSlyZXR1cm4gci5kYXRhO0FycmF5LmlzQXJyYXkocikmJihyPXtkYXRhOnJ9KTtsZXQgdD1yLnR5cGU7cmV0dXJuIHR8fChUbihlKT90PVVpbnQxNkFycmF5OnQ9RmxvYXQzMkFycmF5KSxuZXcgdChyLmRhdGEpfWZ1bmN0aW9uIG5hKHIsZSl7Y29uc3QgdD17fTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpZighVG4obikpe2NvbnN0IGk9ZVtuXSxvPWkuYXR0cmlifHxpLm5hbWV8fGkuYXR0cmliTmFtZXx8dm4uYXR0cmliUHJlZml4K247aWYoaS52YWx1ZSl7aWYoIUFycmF5LmlzQXJyYXkoaS52YWx1ZSkmJiFvdChpLnZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoImFycmF5LnZhbHVlIGlzIG5vdCBhcnJheSBvciB0eXBlZGFycmF5Iik7dFtvXT17dmFsdWU6aS52YWx1ZX19ZWxzZXtsZXQgcyxhLHUsZjtpZihpLmJ1ZmZlciYmaS5idWZmZXIgaW5zdGFuY2VvZiBXZWJHTEJ1ZmZlcilzPWkuYnVmZmVyLGY9aS5udW1Db21wb25lbnRzfHxpLnNpemUsYT1pLnR5cGUsdT1pLm5vcm1hbGl6ZTtlbHNlIGlmKHR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIGkuZGF0YT09Im51bWJlciIpe2NvbnN0IGM9aS5kYXRhfHxpLGQ9aS50eXBlfHxGbG9hdDMyQXJyYXkscD1jKmQuQllURVNfUEVSX0VMRU1FTlQ7YT1OcyhkKSx1PWkubm9ybWFsaXplIT09dm9pZCAwP2kubm9ybWFsaXplOlFzKGQpLGY9aS5udW1Db21wb25lbnRzfHxpLnNpemV8fEFuKG4sYykscz1yLmNyZWF0ZUJ1ZmZlcigpLHIuYmluZEJ1ZmZlcihsZSxzKSxyLmJ1ZmZlckRhdGEobGUscCxpLmRyYXdUeXBlfHxnbil9ZWxzZXtjb25zdCBjPXduKGksbik7cz1FbihyLGMsdm9pZCAwLGkuZHJhd1R5cGUpLGE9aXIoYyksdT1pLm5vcm1hbGl6ZSE9PXZvaWQgMD9pLm5vcm1hbGl6ZTpKcyhjKSxmPXJhKGksbil9dFtvXT17YnVmZmVyOnMsbnVtQ29tcG9uZW50czpmLHR5cGU6YSxub3JtYWxpemU6dSxzdHJpZGU6aS5zdHJpZGV8fDAsb2Zmc2V0Omkub2Zmc2V0fHwwLGRpdmlzb3I6aS5kaXZpc29yPT09dm9pZCAwP3ZvaWQgMDppLmRpdmlzb3IsZHJhd1R5cGU6aS5kcmF3VHlwZX19fX0pLHIuYmluZEJ1ZmZlcihsZSxudWxsKSx0fWZ1bmN0aW9uIGlhKHIsZSl7cmV0dXJuIGU9PT1Ic3x8ZT09PVZzPzE6ZT09PVdzfHxlPT09anM/MjplPT09cXN8fGU9PT1Yc3x8ZT09PVlzPzQ6MH1jb25zdCBzcj1bInBvc2l0aW9uIiwicG9zaXRpb25zIiwiYV9wb3NpdGlvbiJdO2Z1bmN0aW9uIG9hKHIsZSl7bGV0IHQsbjtmb3Iobj0wO248c3IubGVuZ3RoJiYodD1zcltuXSwhKHQgaW4gZXx8KHQ9dm4uYXR0cmliUHJlZml4K3QsdCBpbiBlKSkpOysrbik7bj09PXNyLmxlbmd0aCYmKHQ9T2JqZWN0LmtleXMoZSlbMF0pO2NvbnN0IGk9ZVt0XTtpZighaS5idWZmZXIpcmV0dXJuIDE7ci5iaW5kQnVmZmVyKGxlLGkuYnVmZmVyKTtjb25zdCBvPXIuZ2V0QnVmZmVyUGFyYW1ldGVyKGxlLEdzKTtyLmJpbmRCdWZmZXIobGUsbnVsbCk7Y29uc3Qgcz1pYShyLGkudHlwZSksYT1vL3MsdT1pLm51bUNvbXBvbmVudHN8fGkuc2l6ZSxmPWEvdTtpZihmJTEhPT0wKXRocm93IG5ldyBFcnJvcihgbnVtQ29tcG9uZW50cyAke3V9IG5vdCBjb3JyZWN0IGZvciBsZW5ndGggJHtsZW5ndGh9YCk7cmV0dXJuIGZ9ZnVuY3Rpb24gc2EocixlLHQpe2NvbnN0IG49bmEocixlKSxpPU9iamVjdC5hc3NpZ24oe30sdHx8e30pO2kuYXR0cmlicz1PYmplY3QuYXNzaWduKHt9LHQ/dC5hdHRyaWJzOnt9LG4pO2NvbnN0IG89ZS5pbmRpY2VzO2lmKG8pe2NvbnN0IHM9d24obywiaW5kaWNlcyIpO2kuaW5kaWNlcz1FbihyLHMsenMpLGkubnVtRWxlbWVudHM9cy5sZW5ndGgsaS5lbGVtZW50VHlwZT1pcihzKX1lbHNlIGkubnVtRWxlbWVudHN8fChpLm51bUVsZW1lbnRzPW9hKHIsaS5hdHRyaWJzKSk7cmV0dXJuIGl9ZnVuY3Rpb24gT2Uocil7cmV0dXJuISFyLnRleFN0b3JhZ2UyRH1jb25zdCBSbj1mdW5jdGlvbigpe2NvbnN0IHI9e30sZT17fTtmdW5jdGlvbiB0KG4pe2NvbnN0IGk9bi5jb25zdHJ1Y3Rvci5uYW1lO2lmKCFyW2ldKXtmb3IoY29uc3QgbyBpbiBuKWlmKHR5cGVvZiBuW29dPT0ibnVtYmVyIil7Y29uc3Qgcz1lW25bb11dO2VbbltvXV09cz9gJHtzfSB8ICR7b31gOm99cltpXT0hMH19cmV0dXJuIGZ1bmN0aW9uKGksbyl7cmV0dXJuIHQoaSksZVtvXXx8KHR5cGVvZiBvPT0ibnVtYmVyIj9gMHgke28udG9TdHJpbmcoMTYpfWA6byl9fSgpLG5lPXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sTWU9b3QsU249ZnVuY3Rpb24oKXtsZXQgcjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcj1yfHwodHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHJ9fSgpLEluPTY0MDYsSj02NDA3LEk9NjQwOCxGbj02NDA5LFBuPTY0MTAsTmU9NjQwMixEbj0zNDA0MSxzdD0zMzA3MSxhYT05NzI4LHVhPTk3MjksaWU9MzU1MyxvZT0zNDA2NyxkZT0zMjg3OSxtZT0zNTg2Nixhcj0zNDA2OSxjYT0zNDA3MCxmYT0zNDA3MSxsYT0zNDA3MixkYT0zNDA3MyxtYT0zNDA3NCx1cj0xMDI0MSxjcj0xMDI0MCxhdD0xMDI0Mix1dD0xMDI0MyxDbj0zMjg4MixoYT0zMzA4MixwYT0zMzA4Myx5YT0zMzA4NCxfYT0zMzA4NSxmcj0zMzE3LE9uPTMzMTQsTW49MzI4NzgsTm49MzMxNixVbj0zMzE1LEJuPTMyODc3LHhhPTM3NDQzLGJhPTM3NDQxLGdhPTM3NDQwLHZhPTMzMzIxLEVhPTM2NzU2LFRhPTMzMzI1LEFhPTMzMzI2LHdhPTMzMzMwLFJhPTMzMzI5LFNhPTMzMzM4LElhPTMzMzM3LEZhPTMzMzQwLFBhPTMzMzM5LERhPTMzMzIzLENhPTM2NzU3LE9hPTMzMzI3LE1hPTMzMzI4LE5hPTMzMzM2LFVhPTMzMzM1LEJhPTMzMzMyLGthPTMzMzMxLExhPTMzMzM0LCRhPTMzMzMzLHphPTMyODQ5LEdhPTM1OTA1LEhhPTM2MTk0LFZhPTM2NzU4LFdhPTM1ODk4LGphPTM1OTAxLHFhPTM0ODQzLFhhPTM0ODM3LFlhPTM2MjIxLEthPTM2MjM5LEphPTM2MjE1LFFhPTM2MjMzLFphPTM2MjA5LGV1PTM2MjI3LHR1PTMyODU2LHJ1PTM1OTA3LG51PTM2NzU5LGl1PTMyODU1LG91PTMyODU0LHN1PTMyODU3LGF1PTM0ODQyLHV1PTM0ODM2LGN1PTM2MjIwLGZ1PTM2MjM4LGx1PTM2OTc1LGR1PTM2MjE0LG11PTM2MjMyLGh1PTM2MjI2LHB1PTM2MjA4LHl1PTMzMTg5LF91PTMzMTkwLHh1PTM2MDEyLGJ1PTM2MDEzLGd1PTM1MDU2LHNlPTUxMjAsUz01MTIxLGN0PTUxMjIsVGU9NTEyMyxmdD01MTI0LGhlPTUxMjUsTj01MTI2LGtuPTMyODE5LExuPTMyODIwLCRuPTMzNjM1LFc9NTEzMSxVZT0zNjE5Myxscj0zMzY0MCx2dT0zNTg5OSxFdT0zNTkwMixUdT0zNjI2OSxBdT0zNDA0MixsdD0zMzMxOSxBZT0zMzMyMCxkdD02NDAzLHdlPTM2MjQ0LFJlPTM2MjQ4LHBlPTM2MjQ5O2xldCBkcjtmdW5jdGlvbiBtdChyKXtpZighZHIpe2NvbnN0IGU9e307ZVtJbl09e3RleHR1cmVGb3JtYXQ6SW4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbUyxXLFVlLE5dfSxlW0ZuXT17dGV4dHVyZUZvcm1hdDpGbixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxLDIsMiw0XSx0eXBlOltTLFcsVWUsTl19LGVbUG5dPXt0ZXh0dXJlRm9ybWF0OlBuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzIsNCw0LDhdLHR5cGU6W1MsVyxVZSxOXX0sZVtKXT17dGV4dHVyZUZvcm1hdDpKLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzMsNiw2LDEyLDJdLHR5cGU6W1MsVyxVZSxOLCRuXX0sZVtJXT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsOCw4LDE2LDIsMl0sdHlwZTpbUyxXLFVlLE4sa24sTG5dfSxlW05lXT17dGV4dHVyZUZvcm1hdDpOZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyLDRdLHR5cGU6W2hlLFRlXX0sZVt2YV09e3RleHR1cmVGb3JtYXQ6ZHQsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbRWFdPXt0ZXh0dXJlRm9ybWF0OmR0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3NlXX0sZVtUYV09e3RleHR1cmVGb3JtYXQ6ZHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltOLFddfSxlW0FhXT17dGV4dHVyZUZvcm1hdDpkdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltOXX0sZVt3YV09e3RleHR1cmVGb3JtYXQ6d2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbUmFdPXt0ZXh0dXJlRm9ybWF0OndlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3NlXX0sZVtCYV09e3RleHR1cmVGb3JtYXQ6d2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbVGVdfSxlW2thXT17dGV4dHVyZUZvcm1hdDp3ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltjdF19LGVbTGFdPXt0ZXh0dXJlRm9ybWF0OndlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2hlXX0sZVskYV09e3RleHR1cmVGb3JtYXQ6d2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZnRdfSxlW0RhXT17dGV4dHVyZUZvcm1hdDpsdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtDYV09e3RleHR1cmVGb3JtYXQ6bHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbc2VdfSxlW09hXT17dGV4dHVyZUZvcm1hdDpsdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols4LDRdLHR5cGU6W04sV119LGVbTWFdPXt0ZXh0dXJlRm9ybWF0Omx0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W05dfSxlW05hXT17dGV4dHVyZUZvcm1hdDpBZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtVYV09e3RleHR1cmVGb3JtYXQ6QWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbc2VdfSxlW1NhXT17dGV4dHVyZUZvcm1hdDpBZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltUZV19LGVbSWFdPXt0ZXh0dXJlRm9ybWF0OkFlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2N0XX0sZVtGYV09e3RleHR1cmVGb3JtYXQ6QWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbaGVdfSxlW1BhXT17dGV4dHVyZUZvcm1hdDpBZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltmdF19LGVbemFdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbR2FdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbSGFdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltTLCRuXX0sZVtWYV09e3RleHR1cmVGb3JtYXQ6Sixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltzZV19LGVbV2FdPXt0ZXh0dXJlRm9ybWF0OkosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltOLFcsdnVdfSxlW2phXT17dGV4dHVyZUZvcm1hdDpKLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDYsNF0sdHlwZTpbTixXLEV1XX0sZVtxYV09e3RleHR1cmVGb3JtYXQ6Sixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2XSx0eXBlOltOLFddfSxlW1hhXT17dGV4dHVyZUZvcm1hdDpKLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltOXX0sZVtZYV09e3RleHR1cmVGb3JtYXQ6UmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbS2FdPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzNdLHR5cGU6W3NlXX0sZVtKYV09e3RleHR1cmVGb3JtYXQ6UmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpbVGVdfSxlW1FhXT17dGV4dHVyZUZvcm1hdDpSZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols2XSx0eXBlOltjdF19LGVbWmFdPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltoZV19LGVbZXVdPXt0ZXh0dXJlRm9ybWF0OlJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltmdF19LGVbdHVdPXt0ZXh0dXJlRm9ybWF0OkksY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbcnVdPXt0ZXh0dXJlRm9ybWF0OkksY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbbnVdPXt0ZXh0dXJlRm9ybWF0OkksY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbc2VdfSxlW2l1XT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltTLExuLGxyXX0sZVtvdV09e3RleHR1cmVGb3JtYXQ6SSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W1Msa25dfSxlW3N1XT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2xyXX0sZVthdV09e3RleHR1cmVGb3JtYXQ6SSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltOLFddfSxlW3V1XT17dGV4dHVyZUZvcm1hdDpJLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltOXX0sZVtjdV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbZnVdPXt0ZXh0dXJlRm9ybWF0OnBlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3NlXX0sZVtsdV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbbHJdfSxlW2R1XT17dGV4dHVyZUZvcm1hdDpwZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltUZV19LGVbbXVdPXt0ZXh0dXJlRm9ybWF0OnBlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W2N0XX0sZVtodV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W2Z0XX0sZVtwdV09e3RleHR1cmVGb3JtYXQ6cGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W2hlXX0sZVt5dV09e3RleHR1cmVGb3JtYXQ6TmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltUZSxoZV19LGVbX3VdPXt0ZXh0dXJlRm9ybWF0Ok5lLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2hlXX0sZVt4dV09e3RleHR1cmVGb3JtYXQ6TmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbTl19LGVbZ3VdPXt0ZXh0dXJlRm9ybWF0OkRuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0F1XX0sZVtidV09e3RleHR1cmVGb3JtYXQ6RG4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbVHVdfSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2NvbnN0IG49ZVt0XTtuLmJ5dGVzUGVyRWxlbWVudE1hcD17fSxuLmJ5dGVzUGVyRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGksbyl7Y29uc3Qgcz1uLnR5cGVbb107bi5ieXRlc1BlckVsZW1lbnRNYXBbc109aX0pfSksZHI9ZX1yZXR1cm4gZHJbcl19ZnVuY3Rpb24gd3UocixlKXtjb25zdCB0PW10KHIpO2lmKCF0KXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0Ijtjb25zdCBuPXQuYnl0ZXNQZXJFbGVtZW50TWFwW2VdO2lmKG49PT12b2lkIDApdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBufWZ1bmN0aW9uIEJlKHIpe2NvbnN0IGU9bXQocik7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybntmb3JtYXQ6ZS50ZXh0dXJlRm9ybWF0LHR5cGU6ZS50eXBlWzBdfX1mdW5jdGlvbiB6bihyKXtyZXR1cm4ociZyLTEpPT09MH1mdW5jdGlvbiBSdShyLGUsdCxuKXtpZighT2UocikpcmV0dXJuIHpuKGUpJiZ6bih0KTtjb25zdCBpPW10KG4pO2lmKCFpKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gaS5jb2xvclJlbmRlcmFibGUmJmkudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gU3Uocil7Y29uc3QgZT1tdChyKTtpZighZSl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIGUudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gSXUocixlLHQpe3JldHVybiBNZShlKT9pcihlKTp0fHxTfWZ1bmN0aW9uIGh0KHIsZSx0LG4saSl7aWYoaSUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBkaW1lbnNpb25zIjtpZighdCYmIW4pe2NvbnN0IG89TWF0aC5zcXJ0KGkvKGU9PT1vZT82OjEpKTtvJTE9PT0wPyh0PW8sbj1vKToodD1pLG49MSl9ZWxzZSBpZihuKXtpZighdCYmKHQ9aS9uLHQlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPWkvdCxuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIFNlKHIsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmci5waXhlbFN0b3JlaSh4YSxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnIucGl4ZWxTdG9yZWkoYmEsZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZyLnBpeGVsU3RvcmVpKGdhLGUuZmxpcFkpfWZ1bmN0aW9uIEduKHIpe3IucGl4ZWxTdG9yZWkoZnIsNCksT2UocikmJihyLnBpeGVsU3RvcmVpKE9uLDApLHIucGl4ZWxTdG9yZWkoTW4sMCksci5waXhlbFN0b3JlaShObiwwKSxyLnBpeGVsU3RvcmVpKFVuLDApLHIucGl4ZWxTdG9yZWkoQm4sMCkpfWZ1bmN0aW9uIEZ1KHIsZSx0LG4pe24ubWluTWFnJiYodC5jYWxsKHIsZSx1cixuLm1pbk1hZyksdC5jYWxsKHIsZSxjcixuLm1pbk1hZykpLG4ubWluJiZ0LmNhbGwocixlLHVyLG4ubWluKSxuLm1hZyYmdC5jYWxsKHIsZSxjcixuLm1hZyksbi53cmFwJiYodC5jYWxsKHIsZSxhdCxuLndyYXApLHQuY2FsbChyLGUsdXQsbi53cmFwKSwoZT09PWRlfHwkcyhyLGUpKSYmdC5jYWxsKHIsZSxDbixuLndyYXApKSxuLndyYXBSJiZ0LmNhbGwocixlLENuLG4ud3JhcFIpLG4ud3JhcFMmJnQuY2FsbChyLGUsYXQsbi53cmFwUyksbi53cmFwVCYmdC5jYWxsKHIsZSx1dCxuLndyYXBUKSxuLm1pbkxvZCYmdC5jYWxsKHIsZSxoYSxuLm1pbkxvZCksbi5tYXhMb2QmJnQuY2FsbChyLGUscGEsbi5tYXhMb2QpLG4uYmFzZUxldmVsJiZ0LmNhbGwocixlLHlhLG4uYmFzZUxldmVsKSxuLm1heExldmVsJiZ0LmNhbGwocixlLF9hLG4ubWF4TGV2ZWwpfWZ1bmN0aW9uIEhuKHIsZSx0KXtjb25zdCBuPXQudGFyZ2V0fHxpZTtyLmJpbmRUZXh0dXJlKG4sZSksRnUocixuLHIudGV4UGFyYW1ldGVyaSx0KX1mdW5jdGlvbiBQdShyKXtyZXR1cm4gcj1yfHxuZS50ZXh0dXJlQ29sb3IsTWUocik/cjpuZXcgVWludDhBcnJheShbclswXSoyNTUsclsxXSoyNTUsclsyXSoyNTUsclszXSoyNTVdKX1mdW5jdGlvbiBtcihyLGUsdCxuLGksbyl7dD10fHxuZS50ZXh0dXJlT3B0aW9ucyxvPW98fEk7Y29uc3Qgcz10LnRhcmdldHx8aWU7aWYobj1ufHx0LndpZHRoLGk9aXx8dC5oZWlnaHQsci5iaW5kVGV4dHVyZShzLGUpLFJ1KHIsbixpLG8pKXIuZ2VuZXJhdGVNaXBtYXAocyk7ZWxzZXtjb25zdCBhPVN1KG8pP3VhOmFhO3IudGV4UGFyYW1ldGVyaShzLHVyLGEpLHIudGV4UGFyYW1ldGVyaShzLGNyLGEpLHIudGV4UGFyYW1ldGVyaShzLGF0LHN0KSxyLnRleFBhcmFtZXRlcmkocyx1dCxzdCl9fWZ1bmN0aW9uIGtlKHIpe3JldHVybiByLmF1dG89PT0hMHx8ci5hdXRvPT09dm9pZCAwJiZyLmxldmVsPT09dm9pZCAwfWZ1bmN0aW9uIGhyKHIsZSl7cmV0dXJuIGU9ZXx8e30sZS5jdWJlRmFjZU9yZGVyfHxbYXIsY2EsZmEsbGEsZGEsbWFdfWZ1bmN0aW9uIHByKHIsZSl7Y29uc3Qgbj1ocihyLGUpLm1hcChmdW5jdGlvbihpLG8pe3JldHVybntmYWNlOmksbmR4Om99fSk7cmV0dXJuIG4uc29ydChmdW5jdGlvbihpLG8pe3JldHVybiBpLmZhY2Utby5mYWNlfSksbn1mdW5jdGlvbiBWbihyLGUsdCxuKXtuPW58fG5lLnRleHR1cmVPcHRpb25zO2NvbnN0IGk9bi50YXJnZXR8fGllLG89bi5sZXZlbHx8MDtsZXQgcz10LndpZHRoLGE9dC5oZWlnaHQ7Y29uc3QgdT1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8SSxmPUJlKHUpLGM9bi5mb3JtYXR8fGYuZm9ybWF0LGQ9bi50eXBlfHxmLnR5cGU7aWYoU2UocixuKSxyLmJpbmRUZXh0dXJlKGksZSksaT09PW9lKXtjb25zdCBwPXQud2lkdGgseT10LmhlaWdodDtsZXQgbSxfO2lmKHAvNj09PXkpbT15LF89WzAsMCwxLDAsMiwwLDMsMCw0LDAsNSwwXTtlbHNlIGlmKHkvNj09PXApbT1wLF89WzAsMCwwLDEsMCwyLDAsMywwLDQsMCw1XTtlbHNlIGlmKHAvMz09PXkvMiltPXAvMyxfPVswLDAsMSwwLDIsMCwwLDEsMSwxLDIsMV07ZWxzZSBpZihwLzI9PT15LzMpbT1wLzIsXz1bMCwwLDEsMCwwLDEsMSwxLDAsMiwxLDJdO2Vsc2UgdGhyb3ciY2FuJ3QgZmlndXJlIG91dCBjdWJlIG1hcCBmcm9tIGVsZW1lbnQ6ICIrKHQuc3JjP3Quc3JjOnQubm9kZU5hbWUpO2NvbnN0IGI9U24oKTtiPyhiLmNhbnZhcy53aWR0aD1tLGIuY2FudmFzLmhlaWdodD1tLHM9bSxhPW0scHIocixuKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NvbnN0IFQ9X1tnLm5keCoyKzBdKm0sRj1fW2cubmR4KjIrMV0qbTtiLmRyYXdJbWFnZSh0LFQsRixtLG0sMCwwLG0sbSksci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsYyxkLGIuY2FudmFzKX0pLGIuY2FudmFzLndpZHRoPTEsYi5jYW52YXMuaGVpZ2h0PTEpOnR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJihzPW0sYT1tLHByKHIsbikuZm9yRWFjaChmdW5jdGlvbihnKXtjb25zdCBUPV9bZy5uZHgqMiswXSptLEY9X1tnLm5keCoyKzFdKm07ci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsbSxtLDAsYyxkLG51bGwpLGNyZWF0ZUltYWdlQml0bWFwKHQsVCxGLG0sbSx7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkudGhlbihmdW5jdGlvbihMKXtTZShyLG4pLHIuYmluZFRleHR1cmUoaSxlKSxyLnRleEltYWdlMkQoZy5mYWNlLG8sdSxjLGQsTCksa2UobikmJm1yKHIsZSxuLHMsYSx1KX0pfSkpfWVsc2UgaWYoaT09PWRlfHxpPT09bWUpe2NvbnN0IHA9TWF0aC5taW4odC53aWR0aCx0LmhlaWdodCkseT1NYXRoLm1heCh0LndpZHRoLHQuaGVpZ2h0KSxtPXkvcDtpZihtJTEhPT0wKXRocm93ImNhbiBub3QgY29tcHV0ZSAzRCBkaW1lbnNpb25zIG9mIGVsZW1lbnQiO2NvbnN0IF89dC53aWR0aD09PXk/MTowLGI9dC5oZWlnaHQ9PT15PzE6MDtyLnBpeGVsU3RvcmVpKGZyLDEpLHIucGl4ZWxTdG9yZWkoT24sdC53aWR0aCksci5waXhlbFN0b3JlaShNbiwwKSxyLnBpeGVsU3RvcmVpKEJuLDApLHIudGV4SW1hZ2UzRChpLG8sdSxwLHAscCwwLGMsZCxudWxsKTtmb3IobGV0IGc9MDtnPG07KytnKXtjb25zdCBUPWcqcCpfLEY9ZypwKmI7ci5waXhlbFN0b3JlaShObixUKSxyLnBpeGVsU3RvcmVpKFVuLEYpLHIudGV4U3ViSW1hZ2UzRChpLG8sMCwwLGcscCxwLDEsYyxkLHQpfUduKHIpfWVsc2Ugci50ZXhJbWFnZTJEKGksbyx1LGMsZCx0KTtrZShuKSYmbXIocixlLG4scyxhLHUpLEhuKHIsZSxuKX1mdW5jdGlvbiBMZSgpe31mdW5jdGlvbiBEdShyKXtpZih0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gZS5ocmVmPXIsZS5ob3N0bmFtZT09PWxvY2F0aW9uLmhvc3RuYW1lJiZlLnBvcnQ9PT1sb2NhdGlvbi5wb3J0JiZlLnByb3RvY29sPT09bG9jYXRpb24ucHJvdG9jb2x9ZWxzZXtjb25zdCBlPW5ldyBVUkwobG9jYXRpb24uaHJlZikub3JpZ2luO3JldHVybiBuZXcgVVJMKHIsbG9jYXRpb24uaHJlZikub3JpZ2luPT09ZX19ZnVuY3Rpb24gQ3UocixlKXtyZXR1cm4gZT09PXZvaWQgMCYmIUR1KHIpPyJhbm9ueW1vdXMiOmV9ZnVuY3Rpb24gT3UocixlLHQpe3Q9dHx8TGU7bGV0IG47aWYoZT1lIT09dm9pZCAwP2U6bmUuY3Jvc3NPcmlnaW4sZT1DdShyLGUpLHR5cGVvZiBJbWFnZSE9InVuZGVmaW5lZCIpe249bmV3IEltYWdlLGUhPT12b2lkIDAmJihuLmNyb3NzT3JpZ2luPWUpO2NvbnN0IGk9ZnVuY3Rpb24oKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixvKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMpLG49bnVsbH0sbz1mdW5jdGlvbigpe2NvbnN0IHU9ImNvdWxkbid0IGxvYWQgaW1hZ2U6ICIrcjt4bih1KSx0KHUsbiksaSgpfSxzPWZ1bmN0aW9uKCl7dChudWxsLG4pLGkoKX07cmV0dXJuIG4uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG8pLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIscyksbi5zcmM9cixufWVsc2UgaWYodHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIil7bGV0IGksbztjb25zdCBzPWZ1bmN0aW9uKCl7dChpLG8pfSxhPXt9O2UmJihhLm1vZGU9ImNvcnMiKSxmZXRjaChyLGEpLnRoZW4oZnVuY3Rpb24odSl7aWYoIXUub2spdGhyb3cgdTtyZXR1cm4gdS5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHUpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh1LHtwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KX0pLnRoZW4oZnVuY3Rpb24odSl7bz11LHNldFRpbWVvdXQocyl9KS5jYXRjaChmdW5jdGlvbih1KXtpPXUsc2V0VGltZW91dChzKX0pLG49bnVsbH1yZXR1cm4gbn1mdW5jdGlvbiBXbihyKXtyZXR1cm4gdHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwfHx0eXBlb2YgSW1hZ2VEYXRhIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlRGF0YXx8dHlwZW9mIEhUTUxFbGVtZW50IT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fWZ1bmN0aW9uIHlyKHIsZSx0KXtyZXR1cm4gV24ocik/KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KG51bGwscil9KSxyKTpPdShyLGUsdCl9ZnVuY3Rpb24gX3IocixlLHQpe3Q9dHx8bmUudGV4dHVyZU9wdGlvbnM7Y29uc3Qgbj10LnRhcmdldHx8aWU7aWYoci5iaW5kVGV4dHVyZShuLGUpLHQuY29sb3I9PT0hMSlyZXR1cm47Y29uc3QgaT1QdSh0LmNvbG9yKTtpZihuPT09b2UpZm9yKGxldCBvPTA7bzw2OysrbylyLnRleEltYWdlMkQoYXIrbywwLEksMSwxLDAsSSxTLGkpO2Vsc2Ugbj09PWRlfHxuPT09bWU/ci50ZXhJbWFnZTNEKG4sMCxJLDEsMSwxLDAsSSxTLGkpOnIudGV4SW1hZ2UyRChuLDAsSSwxLDEsMCxJLFMsaSl9ZnVuY3Rpb24gTXUocixlLHQsbil7cmV0dXJuIG49bnx8TGUsdD10fHxuZS50ZXh0dXJlT3B0aW9ucyxfcihyLGUsdCksdD1PYmplY3QuYXNzaWduKHt9LHQpLHlyKHQuc3JjLHQuY3Jvc3NPcmlnaW4sZnVuY3Rpb24obyxzKXtvP24obyxlLHMpOihWbihyLGUscyx0KSxuKG51bGwsZSxzKSl9KX1mdW5jdGlvbiBOdShyLGUsdCxuKXtuPW58fExlO2NvbnN0IGk9dC5zcmM7aWYoaS5sZW5ndGghPT02KXRocm93InRoZXJlIG11c3QgYmUgNiB1cmxzIGZvciBhIGN1YmVtYXAiO2NvbnN0IG89dC5sZXZlbHx8MCxzPXQuaW50ZXJuYWxGb3JtYXR8fHQuZm9ybWF0fHxJLGE9QmUocyksdT10LmZvcm1hdHx8YS5mb3JtYXQsZj10LnR5cGV8fFMsYz10LnRhcmdldHx8aWU7aWYoYyE9PW9lKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfQ1VCRV9NQVAiO19yKHIsZSx0KSx0PU9iamVjdC5hc3NpZ24oe30sdCk7bGV0IGQ9Njtjb25zdCBwPVtdLHk9aHIocix0KTtsZXQgbTtmdW5jdGlvbiBfKGIpe3JldHVybiBmdW5jdGlvbihnLFQpey0tZCxnP3AucHVzaChnKTpULndpZHRoIT09VC5oZWlnaHQ/cC5wdXNoKCJjdWJlbWFwIGZhY2UgaW1nIGlzIG5vdCBhIHNxdWFyZTogIitULnNyYyk6KFNlKHIsdCksci5iaW5kVGV4dHVyZShjLGUpLGQ9PT01P2hyKCkuZm9yRWFjaChmdW5jdGlvbihGKXtyLnRleEltYWdlMkQoRixvLHMsdSxmLFQpfSk6ci50ZXhJbWFnZTJEKGIsbyxzLHUsZixUKSxrZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChjKSksZD09PTAmJm4ocC5sZW5ndGg/cDp2b2lkIDAsZSxtKX19bT1pLm1hcChmdW5jdGlvbihiLGcpe3JldHVybiB5cihiLHQuY3Jvc3NPcmlnaW4sXyh5W2ddKSl9KX1mdW5jdGlvbiBVdShyLGUsdCxuKXtuPW58fExlO2NvbnN0IGk9dC5zcmMsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8SSxzPUJlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxTLGY9dC50YXJnZXR8fG1lO2lmKGYhPT1kZSYmZiE9PW1lKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfM0Qgb3IgVEVYVFVSRV8yRF9BUlJBWSI7X3IocixlLHQpLHQ9T2JqZWN0LmFzc2lnbih7fSx0KTtsZXQgYz1pLmxlbmd0aDtjb25zdCBkPVtdO2xldCBwO2NvbnN0IHk9dC5sZXZlbHx8MDtsZXQgbT10LndpZHRoLF89dC5oZWlnaHQ7Y29uc3QgYj1pLmxlbmd0aDtsZXQgZz0hMDtmdW5jdGlvbiBUKEYpe3JldHVybiBmdW5jdGlvbihMLFYpe2lmKC0tYyxMKWQucHVzaChMKTtlbHNle2lmKFNlKHIsdCksci5iaW5kVGV4dHVyZShmLGUpLGcpe2c9ITEsbT10LndpZHRofHxWLndpZHRoLF89dC5oZWlnaHR8fFYuaGVpZ2h0LHIudGV4SW1hZ2UzRChmLHksbyxtLF8sYiwwLGEsdSxudWxsKTtmb3IobGV0IGVlPTA7ZWU8YjsrK2VlKXIudGV4U3ViSW1hZ2UzRChmLHksMCwwLGVlLG0sXywxLGEsdSxWKX1lbHNle2xldCBlZT1WLHE7KFYud2lkdGghPT1tfHxWLmhlaWdodCE9PV8pJiYocT1TbigpLGVlPXEuY2FudmFzLHEuY2FudmFzLndpZHRoPW0scS5jYW52YXMuaGVpZ2h0PV8scS5kcmF3SW1hZ2UoViwwLDAsbSxfKSksci50ZXhTdWJJbWFnZTNEKGYseSwwLDAsRixtLF8sMSxhLHUsZWUpLHEmJmVlPT09cS5jYW52YXMmJihxLmNhbnZhcy53aWR0aD0wLHEuY2FudmFzLmhlaWdodD0wKX1rZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChmKX1jPT09MCYmbihkLmxlbmd0aD9kOnZvaWQgMCxlLHApfX1wPWkubWFwKGZ1bmN0aW9uKEYsTCl7cmV0dXJuIHlyKEYsdC5jcm9zc09yaWdpbixUKEwpKX0pfWZ1bmN0aW9uIEJ1KHIsZSx0LG4pe249bnx8bmUudGV4dHVyZU9wdGlvbnM7Y29uc3QgaT1uLnRhcmdldHx8aWU7ci5iaW5kVGV4dHVyZShpLGUpO2xldCBvPW4ud2lkdGgscz1uLmhlaWdodCxhPW4uZGVwdGg7Y29uc3QgdT1uLmxldmVsfHwwLGY9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fEksYz1CZShmKSxkPW4uZm9ybWF0fHxjLmZvcm1hdCxwPW4udHlwZXx8SXUocix0LGMudHlwZSk7aWYoTWUodCkpdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYodD1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcikpO2Vsc2V7Y29uc3QgYj1VcyhwKTt0PW5ldyBiKHQpfWNvbnN0IHk9d3UoZixwKSxtPXQuYnl0ZUxlbmd0aC95O2lmKG0lMSl0aHJvdyJsZW5ndGggd3Jvbmcgc2l6ZSBmb3IgZm9ybWF0OiAiK1JuKHIsZCk7bGV0IF87aWYoaT09PWRlfHxpPT09bWUpaWYoIW8mJiFzJiYhYSl7Y29uc3QgYj1NYXRoLmNicnQobSk7aWYoYiUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBjdWJlIHNpemUgb2YgYXJyYXkgb2YgbnVtRWxlbWVudHM6ICIrbTtvPWIscz1iLGE9Yn1lbHNlIG8mJighc3x8IWEpPyhfPWh0KHIsaSxzLGEsbS9vKSxzPV8ud2lkdGgsYT1fLmhlaWdodCk6cyYmKCFvfHwhYSk/KF89aHQocixpLG8sYSxtL3MpLG89Xy53aWR0aCxhPV8uaGVpZ2h0KTooXz1odChyLGksbyxzLG0vYSksbz1fLndpZHRoLHM9Xy5oZWlnaHQpO2Vsc2UgXz1odChyLGksbyxzLG0pLG89Xy53aWR0aCxzPV8uaGVpZ2h0O2lmKEduKHIpLHIucGl4ZWxTdG9yZWkoZnIsbi51bnBhY2tBbGlnbm1lbnR8fDEpLFNlKHIsbiksaT09PW9lKXtjb25zdCBiPXkvdC5CWVRFU19QRVJfRUxFTUVOVCxnPW0vNipiO3ByKHIsbikuZm9yRWFjaChUPT57Y29uc3QgRj1nKlQubmR4LEw9dC5zdWJhcnJheShGLEYrZyk7ci50ZXhJbWFnZTJEKFQuZmFjZSx1LGYsbyxzLDAsZCxwLEwpfSl9ZWxzZSBpPT09ZGV8fGk9PT1tZT9yLnRleEltYWdlM0QoaSx1LGYsbyxzLGEsMCxkLHAsdCk6ci50ZXhJbWFnZTJEKGksdSxmLG8scywwLGQscCx0KTtyZXR1cm57d2lkdGg6byxoZWlnaHQ6cyxkZXB0aDphLHR5cGU6cH19ZnVuY3Rpb24ga3UocixlLHQpe2NvbnN0IG49dC50YXJnZXR8fGllO3IuYmluZFRleHR1cmUobixlKTtjb25zdCBpPXQubGV2ZWx8fDAsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8SSxzPUJlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxzLnR5cGU7aWYoU2Uocix0KSxuPT09b2UpZm9yKGxldCBmPTA7Zjw2OysrZilyLnRleEltYWdlMkQoYXIrZixpLG8sdC53aWR0aCx0LmhlaWdodCwwLGEsdSxudWxsKTtlbHNlIG49PT1kZXx8bj09PW1lP3IudGV4SW1hZ2UzRChuLGksbyx0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsMCxhLHUsbnVsbCk6ci50ZXhJbWFnZTJEKG4saSxvLHQud2lkdGgsdC5oZWlnaHQsMCxhLHUsbnVsbCl9ZnVuY3Rpb24gam4ocixlLHQpe3Q9dHx8TGUsZT1lfHxuZS50ZXh0dXJlT3B0aW9ucztjb25zdCBuPXIuY3JlYXRlVGV4dHVyZSgpLGk9ZS50YXJnZXR8fGllO2xldCBvPWUud2lkdGh8fDEscz1lLmhlaWdodHx8MTtjb25zdCBhPWUuaW50ZXJuYWxGb3JtYXR8fEk7ci5iaW5kVGV4dHVyZShpLG4pLGk9PT1vZSYmKHIudGV4UGFyYW1ldGVyaShpLGF0LHN0KSxyLnRleFBhcmFtZXRlcmkoaSx1dCxzdCkpO2xldCB1PWUuc3JjO2lmKHUpaWYodHlwZW9mIHU9PSJmdW5jdGlvbiImJih1PXUocixlKSksdHlwZW9mIHU9PSJzdHJpbmciKU11KHIsbixlLHQpO2Vsc2UgaWYoTWUodSl8fEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09Im51bWJlciJ8fEFycmF5LmlzQXJyYXkodVswXSl8fE1lKHVbMF0pKSl7Y29uc3QgZj1CdShyLG4sdSxlKTtvPWYud2lkdGgscz1mLmhlaWdodH1lbHNlIEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09InN0cmluZyJ8fFduKHVbMF0pKT9pPT09b2U/TnUocixuLGUsdCk6VXUocixuLGUsdCk6KFZuKHIsbix1LGUpLG89dS53aWR0aCxzPXUuaGVpZ2h0KTtlbHNlIGt1KHIsbixlKTtyZXR1cm4ga2UoZSkmJm1yKHIsbixlLG8scyxhKSxIbihyLG4sZSksbn1jb25zdCBwdD14bjtmdW5jdGlvbiBxbihyKXtyZXR1cm4gdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocik6bnVsbH1jb25zdCB5dD0zMzk4NCxfdD0zNDk2MixMdT0zNDk2MywkdT0zNTcxMyx6dT0zNTcxNCxHdT0zNTYzMixIdT0zNTYzMyxWdT0zNTk4MSxYbj0zNTcxOCxXdT0zNTcyMSxqdT0zNTk3MSxxdT0zNTM4MixYdT0zNTM5NixZdT0zNTM5OCxLdT0zNTM5MixKdT0zNTM5NSx4dD01MTI2LFluPTM1NjY0LEtuPTM1NjY1LEpuPTM1NjY2LHhyPTUxMjQsUW49MzU2NjcsWm49MzU2NjgsZWk9MzU2NjksdGk9MzU2NzAscmk9MzU2NzEsbmk9MzU2NzIsaWk9MzU2NzMsb2k9MzU2NzQsc2k9MzU2NzUsYWk9MzU2NzYsUXU9MzU2NzgsWnU9MzU2ODAsZWM9MzU2NzksdGM9MzU2ODIscmM9MzU2ODUsbmM9MzU2ODYsaWM9MzU2ODcsb2M9MzU2ODgsc2M9MzU2ODksYWM9MzU2OTAsdWM9MzYyODksY2M9MzYyOTIsZmM9MzYyOTMsYnI9NTEyNSx1aT0zNjI5NCxjaT0zNjI5NSxmaT0zNjI5NixsYz0zNjI5OCxkYz0zNjI5OSxtYz0zNjMwMCxoYz0zNjMwMyxwYz0zNjMwNix5Yz0zNjMwNyxfYz0zNjMwOCx4Yz0zNjMxMSxidD0zNTUzLGd0PTM0MDY3LGdyPTMyODc5LHZ0PTM1ODY2LHY9e307ZnVuY3Rpb24gbGkocixlKXtyZXR1cm4gdltlXS5iaW5kUG9pbnR9ZnVuY3Rpb24gYmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWYoZSx0KX19ZnVuY3Rpb24gZ2MocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWZ2KGUsdCl9fWZ1bmN0aW9uIHZjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJmdihlLHQpfX1mdW5jdGlvbiBFYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0zZnYoZSx0KX19ZnVuY3Rpb24gVGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNGZ2KGUsdCl9fWZ1bmN0aW9uIGRpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpKGUsdCl9fWZ1bmN0aW9uIG1pKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpdihlLHQpfX1mdW5jdGlvbiBoaShyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0yaXYoZSx0KX19ZnVuY3Rpb24gcGkocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtM2l2KGUsdCl9fWZ1bmN0aW9uIHlpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTRpdihlLHQpfX1mdW5jdGlvbiBBYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xdWkoZSx0KX19ZnVuY3Rpb24gd2MocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMXVpdihlLHQpfX1mdW5jdGlvbiBSYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0ydWl2KGUsdCl9fWZ1bmN0aW9uIFNjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTN1aXYoZSx0KX19ZnVuY3Rpb24gSWMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNHVpdihlLHQpfX1mdW5jdGlvbiBGYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyZnYoZSwhMSx0KX19ZnVuY3Rpb24gUGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtTWF0cml4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIERjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDRmdihlLCExLHQpfX1mdW5jdGlvbiBDYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDNmdihlLCExLHQpfX1mdW5jdGlvbiBPYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDJmdihlLCExLHQpfX1mdW5jdGlvbiBNYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDRmdihlLCExLHQpfX1mdW5jdGlvbiBOYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDJmdihlLCExLHQpfX1mdW5jdGlvbiBVYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDRmdihlLCExLHQpfX1mdW5jdGlvbiBCYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDNmdihlLCExLHQpfX1mdW5jdGlvbiBCKHIsZSx0LG4pe2NvbnN0IGk9bGkocixlKTtyZXR1cm4gT2Uocik/ZnVuY3Rpb24obyl7bGV0IHMsYTtvcihyLG8pPyhzPW8sYT1udWxsKToocz1vLnRleHR1cmUsYT1vLnNhbXBsZXIpLHIudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHl0K3QpLHIuYmluZFRleHR1cmUoaSxzKSxyLmJpbmRTYW1wbGVyKHQsYSl9OmZ1bmN0aW9uKG8pe3IudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHl0K3QpLHIuYmluZFRleHR1cmUoaSxvKX19ZnVuY3Rpb24gayhyLGUsdCxuLGkpe2NvbnN0IG89bGkocixlKSxzPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgYT0wO2E8aTsrK2Epc1thXT10K2E7cmV0dXJuIE9lKHIpP2Z1bmN0aW9uKGEpe3IudW5pZm9ybTFpdihuLHMpLGEuZm9yRWFjaChmdW5jdGlvbih1LGYpe3IuYWN0aXZlVGV4dHVyZSh5dCtzW2ZdKTtsZXQgYyxkO29yKHIsdSk/KGM9dSxkPW51bGwpOihjPXUudGV4dHVyZSxkPXUuc2FtcGxlciksci5iaW5kU2FtcGxlcih0LGQpLHIuYmluZFRleHR1cmUobyxjKX0pfTpmdW5jdGlvbihhKXtyLnVuaWZvcm0xaXYobixzKSxhLmZvckVhY2goZnVuY3Rpb24odSxmKXtyLmFjdGl2ZVRleHR1cmUoeXQrc1tmXSksci5iaW5kVGV4dHVyZShvLHUpfSl9fXZbeHRdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQsc2V0dGVyOmJjLGFycmF5U2V0dGVyOmdjfSx2W1luXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo4LHNldHRlcjp2Yyxjb2xzOjJ9LHZbS25dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjEyLHNldHRlcjpFYyxjb2xzOjN9LHZbSm5dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjE2LHNldHRlcjpUYyxjb2xzOjR9LHZbeHJdPXtUeXBlOkludDMyQXJyYXksc2l6ZTo0LHNldHRlcjpkaSxhcnJheVNldHRlcjptaX0sdltRbl09e1R5cGU6SW50MzJBcnJheSxzaXplOjgsc2V0dGVyOmhpLGNvbHM6Mn0sdltabl09e1R5cGU6SW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpwaSxjb2xzOjN9LHZbZWldPXtUeXBlOkludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6eWksY29sczo0fSx2W2JyXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOkFjLGFycmF5U2V0dGVyOndjfSx2W3VpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOlJjLGNvbHM6Mn0sdltjaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6U2MsY29sczozfSx2W2ZpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpJYyxjb2xzOjR9LHZbdGldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6ZGksYXJyYXlTZXR0ZXI6bWl9LHZbcmldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6OCxzZXR0ZXI6aGksY29sczoyfSx2W25pXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpwaSxjb2xzOjN9LHZbaWldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOnlpLGNvbHM6NH0sdltvaV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOkZjLHJvd3M6Mixjb2xzOjJ9LHZbc2ldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpQYyxyb3dzOjMsY29sczozfSx2W2FpXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6RGMscm93czo0LGNvbHM6NH0sdltyY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOkNjLHJvd3M6Mixjb2xzOjN9LHZbbmNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpNYyxyb3dzOjIsY29sczo0fSx2W2ljXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6T2Mscm93czozLGNvbHM6Mn0sdltvY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOlVjLHJvd3M6Myxjb2xzOjR9LHZbc2NdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjY0LHNldHRlcjpOYyxyb3dzOjQsY29sczoyfSx2W2FjXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6QmMscm93czo0LGNvbHM6M30sdltRdV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6YnR9LHZbWnVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50Omd0fSx2W2VjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDpncn0sdlt0Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6YnR9LHZbdWNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50OnZ0fSx2W2NjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDp2dH0sdltmY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6Z3R9LHZbbGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50OmJ0fSx2W2RjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDpncn0sdlttY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6Z3R9LHZbaGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50OnZ0fSx2W3BjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDpidH0sdlt5Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkIsYXJyYXlTZXR0ZXI6ayxiaW5kUG9pbnQ6Z3J9LHZbX2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpCLGFycmF5U2V0dGVyOmssYmluZFBvaW50Omd0fSx2W3hjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6QixhcnJheVNldHRlcjprLGJpbmRQb2ludDp2dH07ZnVuY3Rpb24gRXQocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlzd2l0Y2goci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSksdC52YWx1ZS5sZW5ndGgpe2Nhc2UgNDpyLnZlcnRleEF0dHJpYjRmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMzpyLnZlcnRleEF0dHJpYjNmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMjpyLnZlcnRleEF0dHJpYjJmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMTpyLnZlcnRleEF0dHJpYjFmdihlLHQudmFsdWUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIGEgZmxvYXQgY29uc3RhbnQgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQhIil9ZWxzZSByLmJpbmRCdWZmZXIoX3QsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHx4dCx0Lm5vcm1hbGl6ZXx8ITEsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gYWUocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlpZihyLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZhbHVlLmxlbmd0aD09PTQpci52ZXJ0ZXhBdHRyaWI0aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihfdCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHx4cix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiBUdChyLGUpe3JldHVybiBmdW5jdGlvbih0KXtpZih0LnZhbHVlKWlmKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmFsdWUubGVuZ3RoPT09NClyLnZlcnRleEF0dHJpYjR1aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihfdCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHxicix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiB2cihyLGUsdCl7Y29uc3Qgbj10LnNpemUsaT10LmNvdW50O3JldHVybiBmdW5jdGlvbihvKXtyLmJpbmRCdWZmZXIoX3Qsby5idWZmZXIpO2NvbnN0IHM9by5zaXplfHxvLm51bUNvbXBvbmVudHN8fG4sYT1zL2ksdT1vLnR5cGV8fHh0LGM9dlt1XS5zaXplKnMsZD1vLm5vcm1hbGl6ZXx8ITEscD1vLm9mZnNldHx8MCx5PWMvaTtmb3IobGV0IG09MDttPGk7KyttKXIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSttKSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoZSttLGEsdSxkLGMscCt5Km0pLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUrbSxvLmRpdmlzb3J8fDApfX1jb25zdCBQPXt9O1BbeHRdPXtzaXplOjQsc2V0dGVyOkV0fSxQW1luXT17c2l6ZTo4LHNldHRlcjpFdH0sUFtLbl09e3NpemU6MTIsc2V0dGVyOkV0fSxQW0puXT17c2l6ZToxNixzZXR0ZXI6RXR9LFBbeHJdPXtzaXplOjQsc2V0dGVyOmFlfSxQW1FuXT17c2l6ZTo4LHNldHRlcjphZX0sUFtabl09e3NpemU6MTIsc2V0dGVyOmFlfSxQW2VpXT17c2l6ZToxNixzZXR0ZXI6YWV9LFBbYnJdPXtzaXplOjQsc2V0dGVyOlR0fSxQW3VpXT17c2l6ZTo4LHNldHRlcjpUdH0sUFtjaV09e3NpemU6MTIsc2V0dGVyOlR0fSxQW2ZpXT17c2l6ZToxNixzZXR0ZXI6VHR9LFBbdGldPXtzaXplOjQsc2V0dGVyOmFlfSxQW3JpXT17c2l6ZTo4LHNldHRlcjphZX0sUFtuaV09e3NpemU6MTIsc2V0dGVyOmFlfSxQW2lpXT17c2l6ZToxNixzZXR0ZXI6YWV9LFBbb2ldPXtzaXplOjQsc2V0dGVyOnZyLGNvdW50OjJ9LFBbc2ldPXtzaXplOjksc2V0dGVyOnZyLGNvdW50OjN9LFBbYWldPXtzaXplOjE2LHNldHRlcjp2cixjb3VudDo0fTtjb25zdCBrYz0vRVJST1I6XHMqXGQrOihcZCspL2dpO2Z1bmN0aW9uIExjKHIsZT0iIix0PTApe2NvbnN0IG49Wy4uLmUubWF0Y2hBbGwoa2MpXSxpPW5ldyBNYXAobi5tYXAoKG8scyk9Pntjb25zdCBhPXBhcnNlSW50KG9bMV0pLHU9bltzKzFdLGY9dT91LmluZGV4OmUubGVuZ3RoLGM9ZS5zdWJzdHJpbmcoby5pbmRleCxmKTtyZXR1cm5bYS0xLGNdfSkpO3JldHVybiByLnNwbGl0KGAKYCkubWFwKChvLHMpPT57Y29uc3QgYT1pLmdldChzKTtyZXR1cm5gJHtzKzErdH06ICR7b30ke2E/YAoKXl5eICR7YX1gOiIifWB9KS5qb2luKGAKYCl9Y29uc3QgX2k9L15bIFx0XSpcbi87ZnVuY3Rpb24geGkocil7bGV0IGU9MDtyZXR1cm4gX2kudGVzdChyKSYmKGU9MSxyPXIucmVwbGFjZShfaSwiIikpLHtsaW5lT2Zmc2V0OmUsc2hhZGVyU291cmNlOnJ9fWZ1bmN0aW9uIGJpKHIsZSl7cmV0dXJuIHIuZXJyb3JDYWxsYmFjayhlKSxyLmNhbGxiYWNrJiZzZXRUaW1lb3V0KCgpPT57ci5jYWxsYmFjayhgJHtlfQoke3IuZXJyb3JzLmpvaW4oYApgKX1gKX0pLG51bGx9ZnVuY3Rpb24gZ2kocixlLHQsbil7Y29uc3QgaT1yLmNyZWF0ZVNoYWRlcih0KTtyZXR1cm4gci5zaGFkZXJTb3VyY2UoaSx4aShlKS5zaGFkZXJTb3VyY2UpLHIuY29tcGlsZVNoYWRlcihpKSwhbi5jYWxsYmFjayYmISRjKHIsdCxpLG4uZXJyb3JDYWxsYmFjayk/KHIuZGVsZXRlU2hhZGVyKGkpLG51bGwpOml9ZnVuY3Rpb24gJGMocixlLHQsbil7bj1ufHxwdDtjb25zdCBpPXIuZ2V0U2hhZGVyUGFyYW1ldGVyKHQsJHUpO2lmKCFpKXtjb25zdCBvPXIuZ2V0U2hhZGVySW5mb0xvZyh0KSx7bGluZU9mZnNldDpzLHNoYWRlclNvdXJjZTphfT14aShyLmdldFNoYWRlclNvdXJjZSh0KSk7bihgJHtMYyhhLG8scyl9CkVycm9yIGNvbXBpbGluZyAke1JuKHIsZSl9OiAke299YCl9cmV0dXJuIGl9ZnVuY3Rpb24gRXIocixlLHQpe2xldCBuLGksbztpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHQ9ZSxlPXZvaWQgMCksdHlwZW9mIHI9PSJmdW5jdGlvbiIpdD1yLHI9dm9pZCAwO2Vsc2UgaWYociYmIUFycmF5LmlzQXJyYXkocikpe2lmKHIuZXJyb3JDYWxsYmFjayYmci5lcnJvcnMpcmV0dXJuIHI7Y29uc3QgZj1yO3Q9Zi5lcnJvckNhbGxiYWNrLHI9Zi5hdHRyaWJMb2NhdGlvbnMsbj1mLnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MsaT1mLnRyYW5zZm9ybUZlZWRiYWNrTW9kZSxvPWYuY2FsbGJhY2t9Y29uc3Qgcz10fHxwdCxhPVtdLHU9e2Vycm9yQ2FsbGJhY2soZiwuLi5jKXthLnB1c2goZikscyhmLC4uLmMpfSx0cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzOm4sdHJhbnNmb3JtRmVlZGJhY2tNb2RlOmksY2FsbGJhY2s6byxlcnJvcnM6YX07aWYocil7bGV0IGY9e307QXJyYXkuaXNBcnJheShyKT9yLmZvckVhY2goZnVuY3Rpb24oYyxkKXtmW2NdPWU/ZVtkXTpkfSk6Zj1yLHUuYXR0cmliTG9jYXRpb25zPWZ9cmV0dXJuIHV9Y29uc3Qgdmk9WyJWRVJURVhfU0hBREVSIiwiRlJBR01FTlRfU0hBREVSIl07ZnVuY3Rpb24gemMocixlKXtpZihlLmluZGV4T2YoImZyYWciKT49MClyZXR1cm4gR3U7aWYoZS5pbmRleE9mKCJ2ZXJ0Iik+PTApcmV0dXJuIEh1fWZ1bmN0aW9uIEVpKHIsZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3IuZGVsZXRlU2hhZGVyKHQpfSl9Y29uc3QgR2M9KHI9MCk9Pm5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoZSxyKSk7ZnVuY3Rpb24gSGMocixlLHQsbixpKXtjb25zdCBvPUVyKHQsbixpKSxzPVtdLGE9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDsrK2Mpe2xldCBkPWVbY107aWYodHlwZW9mIGQ9PSJzdHJpbmciKXtjb25zdCBwPXFuKGQpLHk9cD9wLnRleHQ6ZDtsZXQgbT1yW3ZpW2NdXTtwJiZwLnR5cGUmJihtPXpjKHIscC50eXBlKXx8bSksZD1naShyLHksbSxvKSxhLnB1c2goZCl9THMocixkKSYmcy5wdXNoKGQpfWlmKHMubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuIEVpKHIsYSksYmkobywibm90IGVub3VnaCBzaGFkZXJzIGZvciBwcm9ncmFtIik7Y29uc3QgdT1yLmNyZWF0ZVByb2dyYW0oKTtzLmZvckVhY2goZnVuY3Rpb24oYyl7ci5hdHRhY2hTaGFkZXIodSxjKX0pLG8uYXR0cmliTG9jYXRpb25zJiZPYmplY3Qua2V5cyhvLmF0dHJpYkxvY2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbihjKXtyLmJpbmRBdHRyaWJMb2NhdGlvbih1LG8uYXR0cmliTG9jYXRpb25zW2NdLGMpfSk7bGV0IGY9by50cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzO3JldHVybiBmJiYoZi5hdHRyaWJzJiYoZj1mLmF0dHJpYnMpLEFycmF5LmlzQXJyYXkoZil8fChmPU9iamVjdC5rZXlzKGYpKSxyLnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3ModSxmLG8udHJhbnNmb3JtRmVlZGJhY2tNb2RlfHxWdSkpLHIubGlua1Byb2dyYW0odSksby5jYWxsYmFjaz8oVmMocix1LG8pLG51bGwpOlRpKHIsdSxvLmVycm9yQ2FsbGJhY2spP3U6KHIuZGVsZXRlUHJvZ3JhbSh1KSxFaShyLGEpLG51bGwpfWFzeW5jIGZ1bmN0aW9uIFZjKHIsZSx0KXtjb25zdCBuPXIuZ2V0RXh0ZW5zaW9uKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSxpPW4/KHUsZik9PnUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihmLG4uQ09NUExFVElPTl9TVEFUVVNfS0hSKTooKT0+ITA7bGV0IG89MDtkbyBhd2FpdCBHYyhvKSxvPTFlMy82MDt3aGlsZSghaShyLGUpKTtjb25zdCBzPVRpKHIsZSx0LmVycm9yQ2FsbGJhY2spLGE9cz92b2lkIDA6dC5lcnJvcnMuam9pbihgCmApO3N8fCgodC5lcnJvckNhbGxiYWNrfHxwdCkoYSksci5kZWxldGVQcm9ncmFtKGUpLGU9bnVsbCksdC5jYWxsYmFjayhhLGUpfWZ1bmN0aW9uIFRpKHIsZSx0KXt0PXR8fHB0O2NvbnN0IG49ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsenUpO2lmKCFuKXtjb25zdCBpPXIuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7dChgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke2l9YCl9cmV0dXJuIG59ZnVuY3Rpb24gV2MocixlLHQsbixpKXtjb25zdCBvPUVyKHQsbixpKSxzPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7KythKXtjb25zdCB1PWdpKHIsZVthXSxyW3ZpW2FdXSxvKTtpZighby5jYWxsYmFjayYmIXUpcmV0dXJuIG51bGw7cy5wdXNoKHUpfXJldHVybiBIYyhyLHMsbyl9ZnVuY3Rpb24gQWkocil7Y29uc3QgZT1yLm5hbWU7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZ2xfIil8fGUuc3RhcnRzV2l0aCgid2ViZ2xfIil9Y29uc3QgamM9LyhcLnxcW3xdfFx3KykvZyxxYz1yPT5yPj0iMCImJnI8PSI5IjtmdW5jdGlvbiBYYyhyLGUsdCxuKXtjb25zdCBpPXIuc3BsaXQoamMpLmZpbHRlcihhPT5hIT09IiIpO2xldCBvPTAscz0iIjtmb3IoOzspe2NvbnN0IGE9aVtvKytdO3MrPWE7Y29uc3QgdT1xYyhhWzBdKSxmPXU/cGFyc2VJbnQoYSk6YTtpZih1JiYocys9aVtvKytdKSxvPT09aS5sZW5ndGgpe3RbZl09ZTticmVha31lbHNle2NvbnN0IGQ9aVtvKytdLHA9ZD09PSJbIix5PXRbZl18fChwP1tdOnt9KTt0W2ZdPXksdD15LG5bc109bltzXXx8ZnVuY3Rpb24obSl7cmV0dXJuIGZ1bmN0aW9uKF8pe3dpKG0sXyl9fSh5KSxzKz1kfX19ZnVuY3Rpb24gWWMocixlKXtsZXQgdD0wO2Z1bmN0aW9uIG4oYSx1LGYpe2NvbnN0IGM9dS5uYW1lLmVuZHNXaXRoKCJbMF0iKSxkPXUudHlwZSxwPXZbZF07aWYoIXApdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGU6IDB4JHtkLnRvU3RyaW5nKDE2KX1gKTtsZXQgeTtpZihwLmJpbmRQb2ludCl7Y29uc3QgbT10O3QrPXUuc2l6ZSxjP3k9cC5hcnJheVNldHRlcihyLGQsbSxmLHUuc2l6ZSk6eT1wLnNldHRlcihyLGQsbSxmLHUuc2l6ZSl9ZWxzZSBwLmFycmF5U2V0dGVyJiZjP3k9cC5hcnJheVNldHRlcihyLGYpOnk9cC5zZXR0ZXIocixmKTtyZXR1cm4geS5sb2NhdGlvbj1mLHl9Y29uc3QgaT17fSxvPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsWG4pO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7aWYoQWkodSkpY29udGludWU7bGV0IGY9dS5uYW1lO2YuZW5kc1dpdGgoIlswXSIpJiYoZj1mLnN1YnN0cigwLGYubGVuZ3RoLTMpKTtjb25zdCBjPXIuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdS5uYW1lKTtpZihjKXtjb25zdCBkPW4oZSx1LGMpO2lbZl09ZCxYYyhmLGQsbyxpKX19cmV0dXJuIGl9ZnVuY3Rpb24gS2MocixlKXtjb25zdCB0PXt9LG49ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsanUpO2ZvcihsZXQgaT0wO2k8bjsrK2kpe2NvbnN0IG89ci5nZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoZSxpKTt0W28ubmFtZV09e2luZGV4OmksdHlwZTpvLnR5cGUsc2l6ZTpvLnNpemV9fXJldHVybiB0fWZ1bmN0aW9uIEpjKHIsZSl7Y29uc3QgdD1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxYbiksbj1bXSxpPVtdO2ZvcihsZXQgYT0wO2E8dDsrK2Epe2kucHVzaChhKSxuLnB1c2goe30pO2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7blthXS5uYW1lPXUubmFtZX1bWyJVTklGT1JNX1RZUEUiLCJ0eXBlIl0sWyJVTklGT1JNX1NJWkUiLCJzaXplIl0sWyJVTklGT1JNX0JMT0NLX0lOREVYIiwiYmxvY2tOZHgiXSxbIlVOSUZPUk1fT0ZGU0VUIiwib2Zmc2V0Il1dLmZvckVhY2goZnVuY3Rpb24oYSl7Y29uc3QgdT1hWzBdLGY9YVsxXTtyLmdldEFjdGl2ZVVuaWZvcm1zKGUsaSxyW3VdKS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7bltkXVtmXT1jfSl9KTtjb25zdCBvPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUscXUpO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKGUsYSksZj17aW5kZXg6ci5nZXRVbmlmb3JtQmxvY2tJbmRleChlLHUpLHVzZWRCeVZlcnRleFNoYWRlcjpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsWHUpLHVzZWRCeUZyYWdtZW50U2hhZGVyOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxZdSksc2l6ZTpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsS3UpLHVuaWZvcm1JbmRpY2VzOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxKdSl9O2YudXNlZD1mLnVzZWRCeVZlcnRleFNoYWRlcnx8Zi51c2VkQnlGcmFnbWVudFNoYWRlcixvW3VdPWZ9cmV0dXJue2Jsb2NrU3BlY3M6byx1bmlmb3JtRGF0YTpufX1mdW5jdGlvbiB3aShyLGUpe2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IG49clt0XTt0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGVbdF0pOndpKHJbdF0sZVt0XSl9fWZ1bmN0aW9uIFJpKHIsLi4uZSl7Y29uc3QgdD1yLnVuaWZvcm1TZXR0ZXJzfHxyLG49ZS5sZW5ndGg7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1lW2ldO2lmKEFycmF5LmlzQXJyYXkobykpe2NvbnN0IHM9by5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzOysrYSlSaSh0LG9bYV0pfWVsc2UgZm9yKGNvbnN0IHMgaW4gbyl7Y29uc3QgYT10W3NdO2EmJmEob1tzXSl9fX1mdW5jdGlvbiBRYyhyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxXdSk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1yLmdldEFjdGl2ZUF0dHJpYihlLGkpO2lmKEFpKG8pKWNvbnRpbnVlO2NvbnN0IHM9ci5nZXRBdHRyaWJMb2NhdGlvbihlLG8ubmFtZSksYT1QW28udHlwZV0sdT1hLnNldHRlcihyLHMsYSk7dS5sb2NhdGlvbj1zLHRbby5uYW1lXT11fXJldHVybiB0fWZ1bmN0aW9uIFpjKHIsZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1yW3RdO24mJm4oZVt0XSl9fWZ1bmN0aW9uIGVmKHIsZSx0KXt0LnZlcnRleEFycmF5T2JqZWN0P3IuYmluZFZlcnRleEFycmF5KHQudmVydGV4QXJyYXlPYmplY3QpOihaYyhlLmF0dHJpYlNldHRlcnN8fGUsdC5hdHRyaWJzKSx0LmluZGljZXMmJnIuYmluZEJ1ZmZlcihMdSx0LmluZGljZXMpKX1mdW5jdGlvbiBTaShyLGUpe2NvbnN0IHQ9WWMocixlKSxuPVFjKHIsZSksaT17cHJvZ3JhbTplLHVuaWZvcm1TZXR0ZXJzOnQsYXR0cmliU2V0dGVyczpufTtyZXR1cm4gT2UocikmJihpLnVuaWZvcm1CbG9ja1NwZWM9SmMocixlKSxpLnRyYW5zZm9ybUZlZWRiYWNrSW5mbz1LYyhyLGUpKSxpfWNvbnN0IHRmPS9cc3x7fH18Oy87ZnVuY3Rpb24gcmYocixlLHQsbixpKXtjb25zdCBvPUVyKHQsbixpKSxzPVtdO2lmKGU9ZS5tYXAoZnVuY3Rpb24oZil7aWYoIXRmLnRlc3QoZikpe2NvbnN0IGM9cW4oZik7aWYoYylmPWMudGV4dDtlbHNle2NvbnN0IGQ9YG5vIGVsZW1lbnQgd2l0aCBpZDogJHtmfWA7by5lcnJvckNhbGxiYWNrKGQpLHMucHVzaChkKX19cmV0dXJuIGZ9KSxzLmxlbmd0aClyZXR1cm4gYmkobywiIik7Y29uc3QgYT1vLmNhbGxiYWNrO2EmJihvLmNhbGxiYWNrPShmLGMpPT57bGV0IGQ7Znx8KGQ9U2kocixjKSksYShmLGQpfSk7Y29uc3QgdT1XYyhyLGUsbyk7cmV0dXJuIHU/U2kocix1KTpudWxsfWNvbnN0IG5mPTQsSWk9NTEyMztmdW5jdGlvbiBvZihyLGUsdCxuLGksbyl7dD10PT09dm9pZCAwP25mOnQ7Y29uc3Qgcz1lLmluZGljZXMsYT1lLmVsZW1lbnRUeXBlLHU9bj09PXZvaWQgMD9lLm51bUVsZW1lbnRzOm47aT1pPT09dm9pZCAwPzA6aSxhfHxzP28hPT12b2lkIDA/ci5kcmF3RWxlbWVudHNJbnN0YW5jZWQodCx1LGE9PT12b2lkIDA/SWk6ZS5lbGVtZW50VHlwZSxpLG8pOnIuZHJhd0VsZW1lbnRzKHQsdSxhPT09dm9pZCAwP0lpOmUuZWxlbWVudFR5cGUsaSk6byE9PXZvaWQgMD9yLmRyYXdBcnJheXNJbnN0YW5jZWQodCxpLHUsbyk6ci5kcmF3QXJyYXlzKHQsaSx1KX1jb25zdCBGaT0zNjE2MCxBdD0zNjE2MSxzZj0zNTUzLGFmPTUxMjEsdWY9NjQwMixjZj02NDA4LGZmPTMzMTkwLGxmPTM2MDEyLGRmPTM1MDU2LG1mPTM2MDEzLGhmPTMyODU0LHBmPTMyODU1LHlmPTM2MTk0LFBpPTMzMTg5LERpPTY0MDEsQ2k9MzYxNjgsVHI9MzQwNDEsQXI9MzYwNjQsd3Q9MzYwOTYsT2k9MzYxMjgsd3I9MzMzMDYsUnI9MzMwNzEsU3I9OTcyOSxfZj1be2Zvcm1hdDpjZix0eXBlOmFmLG1pbjpTcix3cmFwOlJyfSx7Zm9ybWF0OlRyfV0saj17fTtqW1RyXT13cixqW0RpXT1PaSxqW0NpXT1PaSxqW3VmXT13dCxqW1BpXT13dCxqW2ZmXT13dCxqW2xmXT13dCxqW2RmXT13cixqW21mXT13cjtmdW5jdGlvbiB4ZihyLGUpe3JldHVybiBqW3JdfHxqW2VdfWNvbnN0IHVlPXt9O3VlW2hmXT0hMCx1ZVtwZl09ITAsdWVbeWZdPSEwLHVlW1RyXT0hMCx1ZVtQaV09ITAsdWVbRGldPSEwLHVlW0NpXT0hMDtmdW5jdGlvbiBiZihyKXtyZXR1cm4gdWVbcl19Y29uc3QgZ2Y9MzI7ZnVuY3Rpb24gdmYocil7cmV0dXJuIHI+PUFyJiZyPEFyK2dmfWZ1bmN0aW9uIFJ0KHIsZSx0LG4pe2NvbnN0IGk9Rmksbz1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ci5iaW5kRnJhbWVidWZmZXIoaSxvKSx0PXR8fHIuZHJhd2luZ0J1ZmZlcldpZHRoLG49bnx8ci5kcmF3aW5nQnVmZmVySGVpZ2h0LGU9ZXx8X2Y7Y29uc3Qgcz1bXSxhPXtmcmFtZWJ1ZmZlcjpvLGF0dGFjaG1lbnRzOltdLHdpZHRoOnQsaGVpZ2h0Om59O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24odSxmKXtsZXQgYz11LmF0dGFjaG1lbnQ7Y29uc3QgZD11LnNhbXBsZXMscD11LmZvcm1hdDtsZXQgeT11LmF0dGFjaG1lbnRQb2ludHx8eGYocCx1LmludGVybmFsRm9ybWF0KTtpZih5fHwoeT1BcitmKSx2Zih5KSYmcy5wdXNoKHkpLCFjKWlmKGQhPT12b2lkIDB8fGJmKHApKWM9ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxyLmJpbmRSZW5kZXJidWZmZXIoQXQsYyksZD4xP3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKEF0LGQscCx0LG4pOnIucmVuZGVyYnVmZmVyU3RvcmFnZShBdCxwLHQsbik7ZWxzZXtjb25zdCBtPU9iamVjdC5hc3NpZ24oe30sdSk7bS53aWR0aD10LG0uaGVpZ2h0PW4sbS5hdXRvPT09dm9pZCAwJiYobS5hdXRvPSExLG0ubWluPW0ubWlufHxtLm1pbk1hZ3x8U3IsbS5tYWc9bS5tYWd8fG0ubWluTWFnfHxTcixtLndyYXBTPW0ud3JhcFN8fG0ud3JhcHx8UnIsbS53cmFwVD1tLndyYXBUfHxtLndyYXB8fFJyKSxjPWpuKHIsbSl9aWYoa3MocixjKSlyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGkseSxBdCxjKTtlbHNlIGlmKG9yKHIsYykpdS5sYXllciE9PXZvaWQgMD9yLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKGkseSxjLHUubGV2ZWx8fDAsdS5sYXllcik6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLHksdS50YXJnZXR8fHNmLGMsdS5sZXZlbHx8MCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gYXR0YWNobWVudCB0eXBlIik7YS5hdHRhY2htZW50cy5wdXNoKGMpfSksci5kcmF3QnVmZmVycyYmci5kcmF3QnVmZmVycyhzKSxhfWZ1bmN0aW9uIEVmKHIsZSx0KXt0PXR8fEZpLGU/KHIuYmluZEZyYW1lYnVmZmVyKHQsZS5mcmFtZWJ1ZmZlciksci52aWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCkpOihyLmJpbmRGcmFtZWJ1ZmZlcih0LG51bGwpLHIudmlld3BvcnQoMCwwLHIuZHJhd2luZ0J1ZmZlcldpZHRoLHIuZHJhd2luZ0J1ZmZlckhlaWdodCkpfWZ1bmN0aW9uIFIocixlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT9lOmpuKHIse3NyYzplLHdyYXA6ci5DTEFNUF9UT19FREdFfSl9Y2xhc3MgeWV7Y29uc3RydWN0b3IoZSl7Y29uc3R7Y29udGV4dDp0LHdpZHRoOm4saGVpZ2h0Oml9PWU7dGhpcy5jb250ZXh0PXQsdGhpcy5vcHRpb25zPWU7Y29uc3Qgbz10aGlzLmJ1aWxkRGVmaW5lcygpO3RoaXMucHJvZ3JhbUluZm89cmYodGhpcy5jb250ZXh0LFtvK3RoaXMuZ2V0VmVydGV4U2hhZGVyKCksbyt0aGlzLmdldEZyYWdtZW50U2hhZGVyKCldKSx0aGlzLmJ1ZmZlckluZm89c2EodGhpcy5jb250ZXh0LHRoaXMuZ2V0QnVmZmVycygpKSx0aGlzLmZiaT1SdCh0aGlzLmNvbnRleHQsW3tmb3JtYXQ6dGhpcy5jb250ZXh0LlJHQkEsdHlwZTp0aGlzLmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dGhpcy5jb250ZXh0LkxJTkVBUix3cmFwOnRoaXMuY29udGV4dC5DTEFNUF9UT19FREdFfV0sbixpKSx0aGlzLm91dHB1dD10aGlzLmZiaS5hdHRhY2htZW50c1swXX1yZXNpemVPdXRwdXQoZSx0KXt0aGlzLmZiaT1SdCh0aGlzLmNvbnRleHQsW3tmb3JtYXQ6dGhpcy5jb250ZXh0LlJHQkEsdHlwZTp0aGlzLmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dGhpcy5jb250ZXh0LkxJTkVBUix3cmFwOnRoaXMuY29udGV4dC5DTEFNUF9UT19FREdFfV0sZSx0KSx0aGlzLm9wdGlvbnMud2lkdGg9ZSx0aGlzLm9wdGlvbnMuaGVpZ2h0PXQsdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF19Z2V0RGVmaW5lcygpe3JldHVybnt9fWdldEJ1ZmZlcnMoKXtyZXR1cm57cG9zaXRpb246e251bUNvbXBvbmVudHM6MixkYXRhOlstMSwtMSwtMSwxLDEsLTEsMSwxLC0xLDEsMSwtMV19LHRleHR1cmVfY29vcmQ6e251bUNvbXBvbmVudHM6MixkYXRhOlswLDAsMCwxLDEsMCwxLDEsMCwxLDEsMF19fX1idWlsZERlZmluZXMoKXtsZXQgZT0iIjtjb25zdCB0PXRoaXMuZ2V0RGVmaW5lcygpO2ZvcihsZXQgbiBpbiB0KWUrPWAjZGVmaW5lICR7bn0gJHt0W25dLnRvRml4ZWQoMSl9CmA7cmV0dXJuIGV9cnVuKGUpe2NvbnN0IHQ9RGF0ZS5ub3coKTtsZXQgbj0wO3RoaXMubGFzdFJ1biYmKG49KHQtdGhpcy5sYXN0UnVuKS8xZTMpLHRoaXMubGFzdFJ1bj10LHRoaXMuY29udGV4dC52aWV3cG9ydCgwLDAsdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCx0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodCksdGhpcy5jb250ZXh0LnVzZVByb2dyYW0odGhpcy5wcm9ncmFtSW5mby5wcm9ncmFtKSxlZih0aGlzLmNvbnRleHQsdGhpcy5wcm9ncmFtSW5mbyx0aGlzLmJ1ZmZlckluZm8pLFJpKHRoaXMucHJvZ3JhbUluZm8se2RlbHRhOm4sY2FudmFzOlt0aGlzLmNvbnRleHQuY2FudmFzLndpZHRoLHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0XSwuLi5lfSksRWYodGhpcy5jb250ZXh0LHRoaXMub3B0aW9ucy5kaXNhYmxlRnJhbWVidWZmZXI/bnVsbDp0aGlzLmZiaSksb2YodGhpcy5jb250ZXh0LHRoaXMuYnVmZmVySW5mbyl9fXZhciBUZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwp1bmlmb3JtIHNhbXBsZXIyRCBtYXNrOwoKdmVjNCBsb29wKCk7Cgp2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IGxvb3AoKTsgfQpgLEFmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3Mgd2YgZXh0ZW5kcyB5ZXtnZXREZWZpbmVzKCl7dmFyIGU7cmV0dXJue1JBRElVUzooZT10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD9lOjF9fWdldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFRmK3RoaXMuY3JlYXRlTG9vcEZ1bmN0aW9uKCl9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIEFmfWNyZWF0ZUxvb3BGdW5jdGlvbigpe3ZhciB0O2xldCBlPSh0PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3Q6MTtyZXR1cm5gCgogICAgICAgIHZlYzQgbG9vcCgpIHsgCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLDAsMCwwKTsKICAgICAgICAgICAgZmxvYXQgZmFjdG9yU3VtID0gMC47CgogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRSYWRpdXMgPSB2ZWMyKC0ke2V9LikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZEluY3JlbWVudCA9IHZlYzIoMS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIGRpZmYgPSBub3JtYWxpemVkUmFkaXVzOwogICAgICAgICAgICBmbG9hdCBtYXhMZW5ndGggPSBsZW5ndGgobm9ybWFsaXplZFJhZGl1cyk7CgogICAgICAgICAgICBmb3IoaW50IHk9LSR7ZX07IHk8JHtlKzF9OyArK3kpIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgeD0tJHtlfTsgeDwke2UrMX07ICsreCkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9ICgxLi0gdGV4dHVyZTJEKG1hc2ssIF90ZXh0dXJlX2Nvb3JkICsgZGlmZikuYSkgKiAobWF4TGVuZ3RoIC0gbGVuZ3RoKGRpZmYpKSAvIG1heExlbmd0aDsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZmFjdG9yICogdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkICsgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgZmFjdG9yU3VtICs9IGZhY3RvcjsKICAgICAgICAgICAgICAgICAgICBkaWZmLnggKz0gbm9ybWFsaXplZEluY3JlbWVudC54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlmZi55ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueTsKICAgICAgICAgICAgICAgIGRpZmYueCA9IG5vcm1hbGl6ZWRSYWRpdXMueDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IC8gZmFjdG9yU3VtOwogICAgICAgIH1gfX12YXIgUmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSBzYW1wbGVyMkQgYmFja2dyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgZm9yZWdyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwoKdm9pZCBtYWluKCkgewogIHZlYzQgYmFja2dyb3VuZENvbG9yID0gdGV4dHVyZTJEKGJhY2tncm91bmQsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IGZvcmVncm91bmRDb2xvciA9IHRleHR1cmUyRChmb3JlZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCB0cmVzaG9sZENvbG9yID0gdGV4dHVyZTJEKHRocmVzaG9sZCwgX3RleHR1cmVfY29vcmQpOwogIGdsX0ZyYWdDb2xvciA9IGZvcmVncm91bmRDb2xvciAqIHRyZXNob2xkQ29sb3IuYSArCiAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yICogKDEuIC0gdHJlc2hvbGRDb2xvci5hKTsKfQpgLFNmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwogIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKfQpgO2NsYXNzIElyIGV4dGVuZHMgeWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gUmZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIFNmfX1jbGFzcyBGcntjb25zdHJ1Y3Rvcigpe3RoaXMuc3RlcHM9W119YWRkU3RlcChlKXt0aGlzLnN0ZXBzLnB1c2goZSl9YXN5bmMgcnVuKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVwcyllLnByb2dyYW0ucnVuKGUuZ2V0VW5pZm9ybXMoKSl9cmVzaXplT3V0cHV0KGUsdCl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5zdGVwcyluLnByb2dyYW0ucmVzaXplT3V0cHV0KGUsdCl9fWNsYXNzIFByIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucHJlY2lzZU1hc2tFbmFibGVkPSExfX1jbGFzcyBJZiBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH0saT1uZXcgd2Yoey4uLm4scmFkaXVzOnR9KSxvPW5ldyBJcih7Li4ubixkaXNhYmxlRnJhbWVidWZmZXI6ITB9KTt0aGlzLmFkZFN0ZXAoe3Byb2dyYW06aSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlIoZSx0aGlzLmlucHV0SW1hZ2UpLG1hc2s6UihlLHRoaXMuaW5wdXRNYXNrKX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOm8sZ2V0VW5pZm9ybXM6KCk9Pih7YmFja2dyb3VuZDpSKGUsaS5vdXRwdXQpLGZvcmVncm91bmQ6UihlLHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOlIoZSx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEoZSx0KXt0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz10fX1jbGFzcyBNaSBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5jb250ZXh0PWUsdGhpcy5wcmVjaXNlTWFza0VuYWJsZWQ9ITA7Y29uc3QgdD17Y29udGV4dDplLGhlaWdodDplLmNhbnZhcy5oZWlnaHQsd2lkdGg6ZS5jYW52YXMud2lkdGh9LG49bmV3IElyKHsuLi50LGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpuLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6UihlLHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6UihlLHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOlIoZSx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEoZSx0KXt0aGlzLmlucHV0SW1hZ2U9ZSx0aGlzLmlucHV0TWFzaz10fX1jbGFzcyBGZiBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnByZWNpc2VNYXNrRW5hYmxlZD0hMH1zZXQgaW5wdXRWaWRlbyhlKXt0aGlzLmZyYW1lUmVhZGVyPWUuZ2V0UmVhZGVyKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKX1hc3luYyBydW4oKXt0aGlzLmZyYW1lUmVhZGVyJiYoYXdhaXQgc3VwZXIucnVuKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSl9YXN5bmMgcmVhZE5leHRWaWRlb0ZyYW1lKCl7dmFyIHQ7Y29uc3QgZT1hd2FpdCgodD10aGlzLmZyYW1lUmVhZGVyKT09bnVsbD92b2lkIDA6dC5yZWFkKCkpO2UhPW51bGwmJmUudmFsdWUmJih0aGlzLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGUudmFsdWUpLGUudmFsdWUuY2xvc2UoKSl9fXZhciBQZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdmVjNCBsb29wKCk7Cgp2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IGxvb3AoKTsgfQpgLERmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmAsRHI9KHI9PihyW3IuTElORUFSPTBdPSJMSU5FQVIiLHJbci5HQVVTU0lBTj0xXT0iR0FVU1NJQU4iLHIpKShEcnx8e30pO2NsYXNzIE5pIGV4dGVuZHMgeWV7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBQZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBEZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKCiAgICAgICAgICAgIGZvcihpbnQgeT0tJHtlfTsgeTwke2UrMX07ICsreSkgewogICAgICAgICAgICAgICAgZm9yKGludCB4PS0ke2V9OyB4PCR7ZSsxfTsgKyt4KSB7CiAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gMS47CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH1nZXRGYWN0b3IoZSx0KXtzd2l0Y2godGhpcy5vcHRpb25zLnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KTtjYXNlIDA6ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KX19Z2V0TGluZWFyRmFjdG9yKGUsdCl7cmV0dXJuIDF9Z2V0R2F1c3NpYW5GYWN0b3IoZSx0KXt2YXIgdTtjb25zdCBuPU1hdGguUEkqMixpPU1hdGgubWF4KCh1PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3U6MSwxKSxvPTEvKG4qaSoqMikscz0tKGUqKjIrdCoqMiksYT1vKnM7cmV0dXJuIG8qTWF0aC5FKiphfX1jbGFzcyBDZiBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZTtjb25zdCBuPXtjb250ZXh0OmUsaGVpZ2h0OmUuY2FudmFzLmhlaWdodCx3aWR0aDplLmNhbnZhcy53aWR0aH0saT1uZXcgTmkoey4uLm4scmFkaXVzOnQsdHlwZTpEci5HQVVTU0lBTn0pLG89bmV3IElyKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6UihlLHRoaXMuaW5wdXRJbWFnZSl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpvLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6UihlLHRoaXMuaW5wdXRJbWFnZSksZm9yZWdyb3VuZDpSKGUsaS5vdXRwdXQpLHRocmVzaG9sZDpSKGUsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKGUsdCl7dGhpcy5pbnB1dEltYWdlPWUsdGhpcy5pbnB1dE1hc2s9dH19Y2xhc3MgQ3IgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmZiaTI9UnQoZS5jb250ZXh0LFt7Zm9ybWF0OmUuY29udGV4dC5SR0JBLHR5cGU6ZS5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOmUuY29udGV4dC5MSU5FQVIsbWFnOmUuY29udGV4dC5MSU5FQVIsd3JhcDplLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLGUud2lkdGgsZS5oZWlnaHQpfXJ1bihlKXtjb25zdCB0PXRoaXMuZmJpO3RoaXMuZmJpPXRoaXMuZmJpMix0aGlzLmZiaTI9dCx0aGlzLm91dHB1dD10aGlzLmZiaS5hdHRhY2htZW50c1swXSxzdXBlci5ydW4oey4uLmUscHJldmlvdXNfcmVuZGVyaW5nOnRoaXMuZmJpMi5hdHRhY2htZW50c1swXX0pfXJlc2l6ZU91dHB1dChlLHQpe3N1cGVyLnJlc2l6ZU91dHB1dChlLHQpLHRoaXMuZmJpMj1SdCh0aGlzLmNvbnRleHQsW3tmb3JtYXQ6dGhpcy5jb250ZXh0LlJHQkEsdHlwZTp0aGlzLmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dGhpcy5jb250ZXh0LkxJTkVBUix3cmFwOnRoaXMuY29udGV4dC5DTEFNUF9UT19FREdFfV0sZSx0KX19dmFyIE9mPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCi8vIHVuaWZvcm0gZmxvYXQgdHJlc2hvbGQ7CnVuaWZvcm0gc2FtcGxlcjJEIGltYWdlX25vdzsKdW5pZm9ybSBzYW1wbGVyMkQgaW1hZ2VfYmVmb3JlOwp1bmlmb3JtIHNhbXBsZXIyRCBtYXNrX25vdzsKdW5pZm9ybSBzYW1wbGVyMkQgbWFza19iZWZvcmU7CnVuaWZvcm0gc2FtcGxlcjJEIHByZXZpb3VzX3JlbmRlcmluZzsKdW5pZm9ybSB2ZWMyIGNhbnZhczsKCnVuaWZvcm0gZmxvYXQgZGVsdGE7CgpmbG9hdCBjdXJyZW50X2ZhY3RvciA9IDAuNjk7CmZsb2F0IHByZXZpb3VzX2ZhY3RvciA9IDAuNzQ7CmZsb2F0IHRocmVzaG9sZF9hY3RpdmF0aW9uID0gMC41NDsKCmZsb2F0IG1hcChmbG9hdCB2YWx1ZSwgZmxvYXQgbWluMSwgZmxvYXQgbWF4MSwgZmxvYXQgbWluMiwgZmxvYXQgbWF4MikgewogIHJldHVybiBtaW4yICsgKHZhbHVlIC0gbWluMSkgKiAobWF4MiAtIG1pbjIpIC8gKG1heDEgLSBtaW4xKTsKfQoKZmxvYXQgZ2V0VGhyZXNob2xkKCkgewogIHZlYzQgY29sb3IgPSB2ZWM0KDAuKTsKICBmb3IgKGZsb2F0IHkgPSAtNi47IHkgPCA3LjsgeSArPSAxLikgewogICAgZm9yIChmbG9hdCB4ID0gLTYuOyB4IDwgNy47IHggKz0gMS4pIHsKICAgICAgdmVjNCBpbWFnZV9ub3dfY29sb3IgPQogICAgICAgICAgdGV4dHVyZTJEKGltYWdlX25vdywgX3RleHR1cmVfY29vcmQgKyB2ZWMyKHgsIHkpIC8gY2FudmFzKTsKICAgICAgdmVjNCBpbWFnZV9iZWZvcmVfY29sb3IgPQogICAgICAgICAgdGV4dHVyZTJEKGltYWdlX2JlZm9yZSwgX3RleHR1cmVfY29vcmQgKyB2ZWMyKHgsIHkpIC8gY2FudmFzKTsKICAgICAgY29sb3IgKz0gYWJzKGltYWdlX2JlZm9yZV9jb2xvciAtIGltYWdlX25vd19jb2xvcik7CiAgICB9CiAgfQogIHJldHVybiAoY29sb3IueCArIGNvbG9yLnkgKyBjb2xvci56KSAvICgzLiAqIDkuKTsKfQoKdm9pZCBtYWluKCkgewogIGZsb2F0IHRyZXNob2xkX2lucHV0ID0gLjQ7CiAgZmxvYXQgdHJlc2hvbGRfcHJldmlvdXNfcmVuZGVyaW5nID0gLjk4OwoKICB2ZWM0IG1hc2tfbm93X2NvbG9yID0gdGV4dHVyZTJEKG1hc2tfbm93LCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBtYXNrX2JlZm9yZV9jb2xvciA9IHRleHR1cmUyRChtYXNrX2JlZm9yZSwgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgcHJldmlvdXNfcmVuZGVyaW5nX2NvbG9yID0gdGV4dHVyZTJEKHByZXZpb3VzX3JlbmRlcmluZywgX3RleHR1cmVfY29vcmQpOwoKICB2ZWMzIG1hc2tfZGlmZiA9IGFicyhtYXNrX2JlZm9yZV9jb2xvci54eXogLSBtYXNrX25vd19jb2xvci54eXopOwogIGZsb2F0IGZsaWNrZXJpbmcgPSBtYXNrX2RpZmYueDsKICBmbG9hdCB0aHJlc2hvbGQgPSBnZXRUaHJlc2hvbGQoKTsKICBpZiAodGhyZXNob2xkIDwgdGhyZXNob2xkX2FjdGl2YXRpb24pIHsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZmxpY2tlcmluZywgMC4sIDAuLCAxLikgKiBjdXJyZW50X2ZhY3RvciArCiAgICAgICAgICAgICAgICAgICBwcmV2aW91c19yZW5kZXJpbmdfY29sb3IgKiBwcmV2aW91c19mYWN0b3I7CiAgICBnbF9GcmFnQ29sb3IgKj0gKDEuIC0gdGhyZXNob2xkKTsKICB9Cn0KYCxNZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIE5mIGV4dGVuZHMgQ3J7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gT2Z9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIE1mfX12YXIgVWY9YCN2ZXJzaW9uIDMwMCBlcwovLyBodHRwczovL2dpdGh1Yi5jb20vVm9sY29taXgvdmlydHVhbC1iYWNrZ3JvdW5kL2Jsb2IvbWFpbi9zcmMvcGlwZWxpbmVzL3dlYmdsMi9qb2ludEJpbGF0ZXJhbEZpbHRlclN0YWdlLnRzCgpwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CnVuaWZvcm0gc2FtcGxlcjJEIGlucHV0X2ZyYW1lOwp1bmlmb3JtIHNhbXBsZXIyRCBzZWdtZW50YXRpb25fbWFzazsKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwp1bmlmb3JtIHZlYzIgdGV4ZWxfc2l6ZTsKdW5pZm9ybSBmbG9hdCBzdGVwOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKdW5pZm9ybSBmbG9hdCBvZmZzZXQ7CnVuaWZvcm0gZmxvYXQgc2lnbWFfdGV4ZWw7CnVuaWZvcm0gZmxvYXQgc2lnbWFfY29sb3I7CgppbiB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwpvdXQgdmVjNCBvdXRDb2xvcjsKCmZsb2F0IGdhdXNzaWFuKGZsb2F0IHgsIGZsb2F0IHNpZ21hKSB7CiAgZmxvYXQgY29lZmYgPSAtMC41IC8gKHNpZ21hICogc2lnbWEgKiA0LjAgKyAxLjBlLTYpOwogIHJldHVybiBleHAoKHggKiB4KSAqIGNvZWZmKTsKfQoKdm9pZCBtYWluKCkgewogIHZlYzIgY2VudGVyQ29vcmQgPSBfdGV4dHVyZV9jb29yZDsKICB2ZWMzIGNlbnRlckNvbG9yID0gdGV4dHVyZShpbnB1dF9mcmFtZSwgY2VudGVyQ29vcmQpLnJnYjsKICBmbG9hdCBuZXdWYWwgPSAwLjA7CiAgZmxvYXQgc3BhY2VXZWlnaHQgPSAwLjA7CiAgZmxvYXQgY29sb3JXZWlnaHQgPSAwLjA7CiAgZmxvYXQgdG90YWxXZWlnaHQgPSAwLjA7CiAgLy8gU3Vic2FtcGxlIGtlcm5lbCBzcGFjZS4KICBmb3IgKGZsb2F0IGkgPSAtcmFkaXVzICsgb2Zmc2V0OyBpIDw9IHJhZGl1czsgaSArPSBzdGVwKSB7CiAgICBmb3IgKGZsb2F0IGogPSAtcmFkaXVzICsgb2Zmc2V0OyBqIDw9IHJhZGl1czsgaiArPSBzdGVwKSB7CiAgICAgIHZlYzIgc2hpZnQgPSB2ZWMyKGosIGkpICogdGV4ZWxfc2l6ZTsKICAgICAgdmVjMiBjb29yZCA9IHZlYzIoY2VudGVyQ29vcmQgKyBzaGlmdCk7CiAgICAgIHZlYzMgZnJhbWVDb2xvciA9IHRleHR1cmUoaW5wdXRfZnJhbWUsIGNvb3JkKS5yZ2I7CiAgICAgIGZsb2F0IHRocmVzaG9sZCA9IHRleHR1cmUodGhyZXNob2xkLCBjb29yZCkuYTsKICAgICAgZmxvYXQgb3V0VmFsID0gdGV4dHVyZShzZWdtZW50YXRpb25fbWFzaywgY29vcmQpLmE7CgogICAgICBzcGFjZVdlaWdodCA9IGdhdXNzaWFuKGRpc3RhbmNlKGNlbnRlckNvb3JkLCBjb29yZCksIHNpZ21hX3RleGVsKTsKICAgICAgY29sb3JXZWlnaHQgPSBnYXVzc2lhbihkaXN0YW5jZShjZW50ZXJDb2xvciwgZnJhbWVDb2xvciksIHNpZ21hX2NvbG9yKTsKICAgICAgdG90YWxXZWlnaHQgKz0gc3BhY2VXZWlnaHQgKiBjb2xvcldlaWdodDsKICAgICAgbmV3VmFsICs9IHNwYWNlV2VpZ2h0ICogY29sb3JXZWlnaHQgKiBvdXRWYWwgKiB0aHJlc2hvbGQ7CiAgICB9CiAgfQogIG5ld1ZhbCAvPSB0b3RhbFdlaWdodDsKICBvdXRDb2xvciA9IHZlYzQodmVjMygwLiksIG5ld1ZhbCk7Cn1gLEJmPWAjdmVyc2lvbiAzMDAgZXMKaW4gdmVjMiBwb3NpdGlvbjsKaW4gdmVjMiB0ZXh0dXJlX2Nvb3JkOwpvdXQgdmVjMiBfdGV4dHVyZV9jb29yZDsKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfWA7Y2xhc3Mga2YgZXh0ZW5kcyB5ZXtnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBVZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gQmZ9fXZhciBMZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgewogIGludCBjb3VudCA9IDA7CiAgZm9yIChmbG9hdCB5ID0gLTEuOyB5IDwgMi47IHkgKz0gMS4pIHsKICAgIGZvciAoZmxvYXQgeCA9IC0xLjsgeCA8IDIuOyB4ICs9IDEuKSB7CiAgICAgIHZlYzIgY29vcmQgPSBfdGV4dHVyZV9jb29yZCArIHZlYzIoeSwgeCkgLyBjYW52YXM7CiAgICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgY29vcmQpOwogICAgICBpZiAoY29sb3IuciA+IC4xKSB7CiAgICAgICAgY291bnQrKzsKICAgICAgfQogICAgfQogIH0KICBpZiAoY291bnQgPiA1KSB7CiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOwogIH0KfQpgLCRmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3MgemYgZXh0ZW5kcyB5ZXtnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBMZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gJGZ9fXZhciBHZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgewogIHZlYzQgY29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOwogIGZvciAoZmxvYXQgeSA9IC0yLjsgeSA8IDMuOyB5ICs9IDEuKSB7CiAgICBmb3IgKGZsb2F0IHggPSAtMi47IHggPCAzLjsgeCArPSAxLikgewogICAgICB2ZWMyIGNvb3JkID0gX3RleHR1cmVfY29vcmQ7CiAgICAgIGNvb3JkICs9IHZlYzIoeSwgeCkgLyBjYW52YXM7CiAgICAgIGNvbG9yICs9IHRleHR1cmUyRCh0ZXh0dXJlLCBjb29yZCkgKiAoMS4gLyA0Lik7CiAgICB9CiAgfQoKICBnbF9GcmFnQ29sb3IgPSBjb2xvcjsKfQpgLEhmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3MgVmYgZXh0ZW5kcyBDcntnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBHZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gSGZ9fXZhciBXZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHNhbXBsZXIyRCB0aHJlc2hvbGQ7CnVuaWZvcm0gc2FtcGxlcjJEIGlucHV0czsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGlucHV0c19jb2xvciA9IHRleHR1cmUyRChpbnB1dHMsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IHRocmVzaG9sZF9jb2xvciA9IHRleHR1cmUyRCh0aHJlc2hvbGQsIF90ZXh0dXJlX2Nvb3JkKTsKICBpZiAodGhyZXNob2xkX2NvbG9yLnIgPCAuMSAmJiBpbnB1dHNfY29sb3IuciA+IC41KSB7CiAgICBnbF9GcmFnQ29sb3IgPSBpbnB1dHNfY29sb3I7CiAgfQp9CmAsamY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBxZiBleHRlbmRzIENye2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFdmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBqZn19Y2xhc3MgWGYgZXh0ZW5kcyBGcntjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIoKSx0aGlzLmNvbnRleHQ9ZSx0aGlzLm9wdGlvbnM9e2N1cnJlbnRUaHJlc2hvbGRNaW5pbXVtOjAsY3VycmVudFRocmVzaG9sZE1heGltdW06MSxwcmV2aW91c1RocmVzaG9sZE1pbmltdW06MCxwcmV2aW91c1RocmVzaG9sZE1heGltdW06MSx0aHJlc2hvbGRNaW5pbXVtOjAsdGhyZXNob2xkTWF4aW11bToxLHRocmVzaG9sZEZhY3RvcjoxfTtjb25zdCBpPXtjb250ZXh0OmUsaGVpZ2h0Om4sd2lkdGg6dH0sbz1uZXcgTmYoaSkscz1uZXcgTmkoey4uLmkscmFkaXVzOjEsdHlwZTpEci5HQVVTU0lBTn0pLGE9bmV3IHFmKGkpLHU9bmV3IFZmKGkpLGY9bmV3IHpmKGkpLGM9bmV3IGtmKHsuLi5pfSksZD0uNjYscD02NDAseT00ODAsbT0yNTYsXz0xNDQ7bGV0IGI9MTtiKj1NYXRoLm1heChwL20seS9fKTtjb25zdCBnPU1hdGgubWF4KDEsTWF0aC5zcXJ0KGIpKmQpLFQ9MS9wLEY9MS95O3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpvLGdldFVuaWZvcm1zOigpPT4oe2ltYWdlX25vdzpSKGUsdGhpcy5pbnB1dEltYWdlKSxpbWFnZV9iZWZvcmU6UihlLHRoaXMucHJldmlvdXNJbnB1dEltYWdlKSxtYXNrX25vdzpSKGUsdGhpcy5pbnB1dE1hc2spLG1hc2tfYmVmb3JlOlIoZSx0aGlzLnByZXZpb3VzSW5wdXRNYXNrKSxjdXJyZW50X3RocmVzaG9sZF9taW5pbXVtOnRoaXMub3B0aW9ucy5jdXJyZW50VGhyZXNob2xkTWluaW11bSxjdXJyZW50X3RocmVzaG9sZF9tYXhpbXVtOnRoaXMub3B0aW9ucy5jdXJyZW50VGhyZXNob2xkTWF4aW11bSxwcmV2aW91c190aHJlc2hvbGRfbWluaW11bTp0aGlzLm9wdGlvbnMucHJldmlvdXNUaHJlc2hvbGRNaW5pbXVtLHByZXZpb3VzX3RocmVzaG9sZF9tYXhpbXVtOnRoaXMub3B0aW9ucy5wcmV2aW91c1RocmVzaG9sZE1heGltdW0sdGhyZXNob2xkX21pbmltdW06dGhpcy5vcHRpb25zLnRocmVzaG9sZE1pbmltdW0sdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLnRocmVzaG9sZE1heGltdW0sdGhyZXNob2xkX2ZhY3Rvcjp0aGlzLm9wdGlvbnMudGhyZXNob2xkRmFjdG9yfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06YSxnZXRVbmlmb3JtczooKT0+KHtpbnB1dHM6UihlLHRoaXMuaW5wdXRNYXNrKSx0aHJlc2hvbGQ6UihlLG8ub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmYsZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpSKGUsYS5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06dSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlIoZSxmLm91dHB1dCl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6UihlLHUub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmMsZ2V0VW5pZm9ybXM6KCk9Pih7aW5wdXRfZnJhbWU6UihlLHRoaXMuaW5wdXRJbWFnZSksc2VnbWVudGF0aW9uX21hc2s6UihlLHRoaXMuaW5wdXRNYXNrKSx0aHJlc2hvbGQ6UihlLHMub3V0cHV0KSx0ZXhlbF9zaXplOltULEZdLHN0ZXA6ZyxyYWRpdXM6YixvZmZzZXQ6Zz4xP2cqLjU6MCxzaWdtYV90ZXhlbDpNYXRoLm1heChULEYpKmIsc2lnbWFfY29sb3I6LjF9KX0pLHRoaXMub3V0cHV0PWMub3V0cHV0fXNldERhdGEoZSx0KXt0aGlzLnByZXZpb3VzSW5wdXRJbWFnZT10aGlzLmlucHV0SW1hZ2U/dGhpcy5pbnB1dEltYWdlOmUsdGhpcy5wcmV2aW91c0lucHV0TWFzaz10aGlzLmlucHV0TWFzaz90aGlzLmlucHV0TWFzazp0LHRoaXMuaW5wdXRJbWFnZT1lLHRoaXMuaW5wdXRNYXNrPXR9c2V0T3B0aW9ucyhlKXt0aGlzLm9wdGlvbnM9ZX19dmFyIFlmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKCnZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkKTsgfQpgLEtmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKdW5pZm9ybSBib29sIGludmVydF95OwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7CiAgaWYgKGludmVydF95KSB7CiAgICBfdGV4dHVyZV9jb29yZC55ID0gMS4gLSB0ZXh0dXJlX2Nvb3JkLnk7CiAgfQp9CmA7Y2xhc3MgSmYgZXh0ZW5kcyB5ZXtnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBZZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gS2Z9fWNsYXNzIFFmIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKCksdGhpcy5jb250ZXh0PWU7Y29uc3QgaT17Y29udGV4dDplLGhlaWdodDpuLHdpZHRoOnR9O3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpuZXcgSmYoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSksZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpSKGUsdGhpcy5pbnB1dEltYWdlKSxpbnZlcnRfeTohMH0pfSl9c2V0RGF0YShlKXt0aGlzLmlucHV0SW1hZ2U9ZX19Y2xhc3MgWmZ7Y29uc3RydWN0b3IoZSl7dGhpcy5jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiKSx0aGlzLmNhbnZhcy53aWR0aD1lLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodD1lLmhlaWdodCx0aGlzLnJlc2l6ZT1uZXcgUWYodGhpcy5jb250ZXh0LGUud2lkdGgsZS5oZWlnaHQpfXJlc2l6ZUZvcmVncm91bmQoZSx0KXt0aGlzLmNhbnZhcy53aWR0aD1lLHRoaXMuY2FudmFzLmhlaWdodD10LHRoaXMucmVzaXplLnJlc2l6ZU91dHB1dChlLHQpfWFzeW5jIHByb2Nlc3MoZSl7dmFyIHQsbjtyZXR1cm4gdGhpcy5jYW52YXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGgsKHQ9dGhpcy5yZXNpemUpPT1udWxsfHx0LnNldERhdGEoZSksKG49dGhpcy5yZXNpemUpPT1udWxsfHxuLnJ1bigpLHRoaXMuY2FudmFzfX1jbGFzcyBlbHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNhbnZhcz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCksdGhpcy5jb250ZXh0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIndlYmdsMiIpLHRoaXMuY2FudmFzLndpZHRoPWUuZm9yZWdyb3VuZFdpZHRoLHRoaXMuY2FudmFzLmhlaWdodD1lLmZvcmVncm91bmRIZWlnaHQsdGhpcy5pbXByb3ZlTWFza1NlZ21lbnRhdGlvbj1uZXcgWGYodGhpcy5jb250ZXh0LGUubWFza1dpZHRoLGUubWFza0hlaWdodCksdGhpcy5iYWNrZ3JvdW5kSW1hZ2U9bmV3IE1pKHRoaXMuY29udGV4dCksdGhpcy5iYWNrZ3JvdW5kVmlkZW89bmV3IEZmKHRoaXMuY29udGV4dCksdGhpcy5iYWNrZ3JvdW5kUmVzaXplcj1uZXcgWmYoe3dpZHRoOmUuZm9yZWdyb3VuZFdpZHRoLGhlaWdodDplLmZvcmVncm91bmRIZWlnaHR9KX1zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXtzd2l0Y2goZS50cmFuc2Zvcm1lclR5cGUpe2Nhc2UiQmFja2dyb3VuZEJsdXIiOnRoaXMuYWN0aXZlUGlwZWxpbmU9bmV3IElmKHRoaXMuY29udGV4dCx0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJTaWxob3VldHRlQmx1ciI6dGhpcy5hY3RpdmVQaXBlbGluZT1uZXcgQ2YodGhpcy5jb250ZXh0LHRoaXMuZ2V0Qmx1clNpemUoZS5yYWRpdXMpKTticmVhaztjYXNlIlZpZGVvQmFja2dyb3VuZCI6dGhpcy5hY3RpdmVQaXBlbGluZT10aGlzLmJhY2tncm91bmRWaWRlbzticmVhaztjYXNlIlZpcnR1YWxCYWNrZ3JvdW5kIjp0aGlzLmFjdGl2ZVBpcGVsaW5lPXRoaXMuYmFja2dyb3VuZEltYWdlO2JyZWFrfXRoaXMub3B0aW9ucz1lfXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe3ZhciB0Oyh0PXRoaXMuaW1wcm92ZU1hc2tTZWdtZW50YXRpb24pPT1udWxsfHx0LnNldE9wdGlvbnMoZSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFZpZGVvLmlucHV0VmlkZW89ZX1hc3luYyBzZXRWaXJ0dWFsQkdJbWFnZShlKXt0aGlzLnZpcnR1YWxCR0ltYWdlPWUsdGhpcy5iYWNrZ3JvdW5kSW1hZ2UuaW5wdXRCYWNrZ3JvdW5kSW1hZ2U9YXdhaXQgdGhpcy5iYWNrZ3JvdW5kUmVzaXplci5wcm9jZXNzKGUpfWFzeW5jIHByb2Nlc3MoZSx0KXt2YXIgbixpLG8scyxhO2lmKHRoaXMuYWN0aXZlUGlwZWxpbmUmJmUud2lkdGgmJih0PT1udWxsP3ZvaWQgMDp0LndpZHRoKSl7bGV0IHU9dDsoKChuPXRoaXMub3B0aW9ucyk9PW51bGw/dm9pZCAwOm4uc2VsZmllU2VnbWVudGF0aW9uVHlwZSkmJigoaT10aGlzLm9wdGlvbnMpPT1udWxsP3ZvaWQgMDppLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpPT09IlBSRUNJU0UifHwhKChvPXRoaXMub3B0aW9ucykhPW51bGwmJm8uc2VsZmllU2VnbWVudGF0aW9uVHlwZSkmJnRoaXMuYWN0aXZlUGlwZWxpbmUucHJlY2lzZU1hc2tFbmFibGVkKSYmKHRoaXMuaW1wcm92ZU1hc2tTZWdtZW50YXRpb24uc2V0RGF0YShlLHQpLHRoaXMuaW1wcm92ZU1hc2tTZWdtZW50YXRpb24ucnVuKCksdT10aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLm91dHB1dCksKHM9dGhpcy5hY3RpdmVQaXBlbGluZSk9PW51bGx8fHMuc2V0RGF0YShlLHUpLChhPXRoaXMuYWN0aXZlUGlwZWxpbmUpPT1udWxsfHxhLnJ1bigpfX1hc3luYyByZXNpemVGb3JlZ3JvdW5kKGUsdCl7dmFyIG47dGhpcy5jYW52YXMud2lkdGg9ZSx0aGlzLmNhbnZhcy5oZWlnaHQ9dCx0aGlzLmJhY2tncm91bmRJbWFnZS5yZXNpemVPdXRwdXQoZSx0KSx0aGlzLmJhY2tncm91bmRWaWRlby5yZXNpemVPdXRwdXQoZSx0KSx0aGlzLmJhY2tncm91bmRSZXNpemVyLnJlc2l6ZUZvcmVncm91bmQoZSx0KSwobj10aGlzLmFjdGl2ZVBpcGVsaW5lKT09bnVsbHx8bi5yZXNpemVPdXRwdXQoZSx0KSx0aGlzLnZpcnR1YWxCR0ltYWdlJiYodGhpcy5iYWNrZ3JvdW5kSW1hZ2UuaW5wdXRCYWNrZ3JvdW5kSW1hZ2U9YXdhaXQgdGhpcy5iYWNrZ3JvdW5kUmVzaXplci5wcm9jZXNzKHRoaXMudmlydHVhbEJHSW1hZ2UpKX1nZXRCbHVyU2l6ZShlPWl0Lkxvdyl7c3dpdGNoKGUpe2Nhc2UgaXQuTG93OnJldHVybiA1O2Nhc2UgaXQuSGlnaDpyZXR1cm4gMTJ9cmV0dXJuIGV9fXZhciBTdD1mdW5jdGlvbigpe3ZhciByPXR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwO3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXR5cGVvZiBlIT0idW5kZWZpbmVkIj9lOnt9LG4saTt0LnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKGwsaCl7bj1sLGk9aH0pO3ZhciBvPXt9LHM7Zm9yKHMgaW4gdCl0Lmhhc093blByb3BlcnR5KHMpJiYob1tzXT10W3NdKTt2YXIgYT0iLi90aGlzLnByb2dyYW0iLHU9ZnVuY3Rpb24obCxoKXt0aHJvdyBofSxmPSEwLGM9IiI7ZnVuY3Rpb24gZChsKXtyZXR1cm4gdC5sb2NhdGVGaWxlP3QubG9jYXRlRmlsZShsLGMpOmMrbH12YXIgcDt0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoYz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksciYmKGM9ciksYy5pbmRleE9mKCJibG9iOiIpIT09MD9jPWMuc3Vic3RyKDAsYy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOmM9IiI7dmFyIHk9dC5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxtPXQucHJpbnRFcnJ8fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO2ZvcihzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmKHRbc109b1tzXSk7bz1udWxsLHQuYXJndW1lbnRzJiZ0LmFyZ3VtZW50cyx0LnRoaXNQcm9ncmFtJiYoYT10LnRoaXNQcm9ncmFtKSx0LnF1aXQmJih1PXQucXVpdCk7dmFyIF87dC53YXNtQmluYXJ5JiYoXz10Lndhc21CaW5hcnkpO3ZhciBiPXQubm9FeGl0UnVudGltZXx8ITA7dHlwZW9mIFdlYkFzc2VtYmx5IT0ib2JqZWN0IiYmY2UoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgZyxUPSExLEY9dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gTChsLGgseCl7Zm9yKHZhciBBPWgreCxEPWg7bFtEXSYmIShEPj1BKTspKytEO2lmKEQtaD4xNiYmbC5zdWJhcnJheSYmRilyZXR1cm4gRi5kZWNvZGUobC5zdWJhcnJheShoLEQpKTtmb3IodmFyIE09IiI7aDxEOyl7dmFyIHc9bFtoKytdO2lmKCEodyYxMjgpKXtNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHcpO2NvbnRpbnVlfXZhciBVPWxbaCsrXSY2MztpZigodyYyMjQpPT0xOTIpe00rPVN0cmluZy5mcm9tQ2hhckNvZGUoKHcmMzEpPDw2fFUpO2NvbnRpbnVlfXZhciBRPWxbaCsrXSY2MztpZigodyYyNDApPT0yMjQ/dz0odyYxNSk8PDEyfFU8PDZ8UTp3PSh3JjcpPDwxOHxVPDwxMnxRPDw2fGxbaCsrXSY2Myx3PDY1NTM2KU0rPVN0cmluZy5mcm9tQ2hhckNvZGUodyk7ZWxzZXt2YXIgV2k9dy02NTUzNjtNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fFdpPj4xMCw1NjMyMHxXaSYxMDIzKX19cmV0dXJuIE19ZnVuY3Rpb24gVihsLGgpe3JldHVybiBsP0woJGUsbCxoKToiIn1mdW5jdGlvbiBlZShsLGgseCl7Zm9yKHZhciBBPTA7QTxsLmxlbmd0aDsrK0EpSXRbaCsrPj4wXT1sLmNoYXJDb2RlQXQoQSk7eHx8KEl0W2g+PjBdPTApfWZ1bmN0aW9uIHEobCxoKXtyZXR1cm4gbCVoPjAmJihsKz1oLWwlaCksbH12YXIgQmksSXQsJGUsWDtmdW5jdGlvbiBraShsKXtCaT1sLHQuSEVBUDg9SXQ9bmV3IEludDhBcnJheShsKSx0LkhFQVAxNj1uZXcgSW50MTZBcnJheShsKSx0LkhFQVAzMj1YPW5ldyBJbnQzMkFycmF5KGwpLHQuSEVBUFU4PSRlPW5ldyBVaW50OEFycmF5KGwpLHQuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkobCksdC5IRUFQVTMyPW5ldyBVaW50MzJBcnJheShsKSx0LkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShsKSx0LkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShsKX10LklOSVRJQUxfTUVNT1JZO3ZhciBNcixMaT1bXSwkaT1bXSx6aT1bXSxhbD0wO2Z1bmN0aW9uIHVsKCl7cmV0dXJuIGJ8fGFsPjB9ZnVuY3Rpb24gY2woKXtpZih0LnByZVJ1bilmb3IodHlwZW9mIHQucHJlUnVuPT0iZnVuY3Rpb24iJiYodC5wcmVSdW49W3QucHJlUnVuXSk7dC5wcmVSdW4ubGVuZ3RoOylkbCh0LnByZVJ1bi5zaGlmdCgpKTtOcihMaSl9ZnVuY3Rpb24gZmwoKXtOcigkaSl9ZnVuY3Rpb24gbGwoKXtpZih0LnBvc3RSdW4pZm9yKHR5cGVvZiB0LnBvc3RSdW49PSJmdW5jdGlvbiImJih0LnBvc3RSdW49W3QucG9zdFJ1bl0pO3QucG9zdFJ1bi5sZW5ndGg7KWhsKHQucG9zdFJ1bi5zaGlmdCgpKTtOcih6aSl9ZnVuY3Rpb24gZGwobCl7TGkudW5zaGlmdChsKX1mdW5jdGlvbiBtbChsKXskaS51bnNoaWZ0KGwpfWZ1bmN0aW9uIGhsKGwpe3ppLnVuc2hpZnQobCl9dmFyIF9lPTAsemU9bnVsbDtmdW5jdGlvbiBwbChsKXtfZSsrLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKF9lKX1mdW5jdGlvbiB5bChsKXtpZihfZS0tLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKF9lKSxfZT09MCYmemUpe3ZhciBoPXplO3plPW51bGwsaCgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBjZShsKXt0Lm9uQWJvcnQmJnQub25BYm9ydChsKSxsPSJBYm9ydGVkKCIrbCsiKSIsbShsKSxUPSEwLGwrPSIuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgaD1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGwpO3Rocm93IGkoaCksaH12YXIgX2w9ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIEdpKGwpe3JldHVybiBsLnN0YXJ0c1dpdGgoX2wpfXZhciBZO1k9InRmbGl0ZS1zaW1kLndhc20iLEdpKFkpfHwoWT1kKFkpKTtmdW5jdGlvbiBIaShsKXt0cnl7aWYobD09WSYmXylyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoXyk7aWYoIXApdGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKGgpe2NlKGgpfX1mdW5jdGlvbiB4bCgpe3JldHVybiFfJiZmJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goWSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24obCl7aWYoIWwub2spdGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIitZKyInIjtyZXR1cm4gbC5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gSGkoWSl9KTpQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIEhpKFkpfSl9ZnVuY3Rpb24gYmwoKXt2YXIgbD17YTokbH07ZnVuY3Rpb24gaCh3LFUpe3ZhciBRPXcuZXhwb3J0czt0LmFzbT1RLGc9dC5hc20ucSxraShnLmJ1ZmZlciksTXI9dC5hc20uRCxtbCh0LmFzbS5yKSx5bCgpfXBsKCk7ZnVuY3Rpb24geCh3KXtoKHcuaW5zdGFuY2UpfWZ1bmN0aW9uIEEodyl7cmV0dXJuIHhsKCkudGhlbihmdW5jdGlvbihVKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoVSxsKX0pLnRoZW4oZnVuY3Rpb24oVSl7cmV0dXJuIFV9KS50aGVuKHcsZnVuY3Rpb24oVSl7bSgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitVKSxjZShVKX0pfWZ1bmN0aW9uIEQoKXtyZXR1cm4hXyYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhR2koWSkmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChZLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbih3KXt2YXIgVT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyh3LGwpO3JldHVybiBVLnRoZW4oeCxmdW5jdGlvbihRKXtyZXR1cm4gbSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrUSksbSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxBKHgpfSl9KTpBKHgpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgTT10Lmluc3RhbnRpYXRlV2FzbShsLGgpO3JldHVybiBNfWNhdGNoKHcpe3JldHVybiBtKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK3cpLCExfXJldHVybiBEKCkuY2F0Y2goaSkse319ZnVuY3Rpb24gTnIobCl7Zm9yKDtsLmxlbmd0aD4wOyl7dmFyIGg9bC5zaGlmdCgpO2lmKHR5cGVvZiBoPT0iZnVuY3Rpb24iKXtoKHQpO2NvbnRpbnVlfXZhciB4PWguZnVuYzt0eXBlb2YgeD09Im51bWJlciI/aC5hcmc9PT12b2lkIDA/TXIuZ2V0KHgpKCk6TXIuZ2V0KHgpKGguYXJnKTp4KGguYXJnPT09dm9pZCAwP251bGw6aC5hcmcpfX1mdW5jdGlvbiBnbChsLGgseCxBKXtjZSgiQXNzZXJ0aW9uIGZhaWxlZDogIitWKGwpKyIsIGF0OiAiK1toP1YoaCk6InVua25vd24gZmlsZW5hbWUiLHgsQT9WKEEpOiJ1bmtub3duIGZ1bmN0aW9uIl0pfWZ1bmN0aW9uIHZsKGwsaCl7Y2UoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIEVsKGwsaCl7Y2UoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIFRsKCl7Y2UoIiIpfXZhciBGdDtGdD1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07dmFyIEFsPSEwO2Z1bmN0aW9uIHdsKGwpe3JldHVybiBYW1ZpKCk+PjJdPWwsbH1mdW5jdGlvbiBSbChsLGgpe3ZhciB4O2lmKGw9PT0wKXg9RGF0ZS5ub3coKTtlbHNlIGlmKChsPT09MXx8bD09PTQpJiZBbCl4PUZ0KCk7ZWxzZSByZXR1cm4gd2woMjgpLC0xO3JldHVybiBYW2g+PjJdPXgvMWUzfDAsWFtoKzQ+PjJdPXglMWUzKjFlMyoxZTN8MCwwfWZ1bmN0aW9uIFNsKCl7cmV0dXJuIDIxNDc0ODM2NDh9ZnVuY3Rpb24gSWwobCxoLHgpeyRlLmNvcHlXaXRoaW4obCxoLGgreCl9ZnVuY3Rpb24gRmwobCl7dHJ5e3JldHVybiBnLmdyb3cobC1CaS5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLGtpKGcuYnVmZmVyKSwxfWNhdGNoe319ZnVuY3Rpb24gUGwobCl7dmFyIGg9JGUubGVuZ3RoO2w9bD4+PjA7dmFyIHg9MjE0NzQ4MzY0ODtpZihsPngpcmV0dXJuITE7Zm9yKHZhciBBPTE7QTw9NDtBKj0yKXt2YXIgRD1oKigxKy4yL0EpO0Q9TWF0aC5taW4oRCxsKzEwMDY2MzI5Nik7dmFyIE09TWF0aC5taW4oeCxxKE1hdGgubWF4KGwsRCksNjU1MzYpKSx3PUZsKE0pO2lmKHcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gRGwobCl7Zm9yKHZhciBoPUZ0KCk7RnQoKS1oPGw7KTt9dmFyIFVyPXt9O2Z1bmN0aW9uIENsKCl7cmV0dXJuIGF8fCIuL3RoaXMucHJvZ3JhbSJ9ZnVuY3Rpb24gR2UoKXtpZighR2Uuc3RyaW5ncyl7dmFyIGw9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsaD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmwsXzpDbCgpfTtmb3IodmFyIHggaW4gVXIpVXJbeF09PT12b2lkIDA/ZGVsZXRlIGhbeF06aFt4XT1Vclt4XTt2YXIgQT1bXTtmb3IodmFyIHggaW4gaClBLnB1c2goeCsiPSIraFt4XSk7R2Uuc3RyaW5ncz1BfXJldHVybiBHZS5zdHJpbmdzfXZhciBQdD17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGwsaCl7dmFyIHg9UHQuYnVmZmVyc1tsXTtoPT09MHx8aD09PTEwPygobD09PTE/eTptKShMKHgsMCkpLHgubGVuZ3RoPTApOngucHVzaChoKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7UHQudmFyYXJncys9NDt2YXIgbD1YW1B0LnZhcmFyZ3MtND4+Ml07cmV0dXJuIGx9LGdldFN0cjpmdW5jdGlvbihsKXt2YXIgaD1WKGwpO3JldHVybiBofSxnZXQ2NDpmdW5jdGlvbihsLGgpe3JldHVybiBsfX07ZnVuY3Rpb24gT2wobCxoKXt2YXIgeD0wO3JldHVybiBHZSgpLmZvckVhY2goZnVuY3Rpb24oQSxEKXt2YXIgTT1oK3g7WFtsK0QqND4+Ml09TSxlZShBLE0pLHgrPUEubGVuZ3RoKzF9KSwwfWZ1bmN0aW9uIE1sKGwsaCl7dmFyIHg9R2UoKTtYW2w+PjJdPXgubGVuZ3RoO3ZhciBBPTA7cmV0dXJuIHguZm9yRWFjaChmdW5jdGlvbihEKXtBKz1ELmxlbmd0aCsxfSksWFtoPj4yXT1BLDB9ZnVuY3Rpb24gTmwobCl7R2wobCl9ZnVuY3Rpb24gVWwobCl7cmV0dXJuIDB9ZnVuY3Rpb24gQmwobCxoLHgsQSxEKXt9ZnVuY3Rpb24ga2wobCxoLHgsQSl7Zm9yKHZhciBEPTAsTT0wO008eDtNKyspe2Zvcih2YXIgdz1YW2grTSo4Pj4yXSxVPVhbaCsoTSo4KzQpPj4yXSxRPTA7UTxVO1ErKylQdC5wcmludENoYXIobCwkZVt3K1FdKTtEKz1VfXJldHVybiBYW0E+PjJdPUQsMH1mdW5jdGlvbiBMbCgpe2lmKHR5cGVvZiBjcnlwdG89PSJvYmplY3QiJiZ0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIil7dmFyIGw9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobCksbFswXX19ZWxzZSByZXR1cm4gZnVuY3Rpb24oKXtjZSgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIER0KGwsaCl7RHQucmFuZG9tRGV2aWNlfHwoRHQucmFuZG9tRGV2aWNlPUxsKCkpO2Zvcih2YXIgeD0wO3g8aDt4KyspSXRbbCt4Pj4wXT1EdC5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgJGw9e2E6Z2wsZTp2bCxkOkVsLGI6VGwsbjpSbCxoOlNsLGw6SWwsbTpQbCxwOkRsLGY6T2wsZzpNbCxqOk5sLGk6VWwsazpCbCxjOmtsLG86RHR9O2JsKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgVmk9dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybihWaT10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sQ3Q7ZnVuY3Rpb24gemwobCl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitsKyIpIix0aGlzLnN0YXR1cz1sfXplPWZ1bmN0aW9uIGwoKXtDdHx8QnIoKSxDdHx8KHplPWwpfTtmdW5jdGlvbiBCcihsKXtpZihfZT4wfHwoY2woKSxfZT4wKSlyZXR1cm47ZnVuY3Rpb24gaCgpe0N0fHwoQ3Q9ITAsdC5jYWxsZWRSdW49ITAsIVQmJihmbCgpLG4odCksdC5vblJ1bnRpbWVJbml0aWFsaXplZCYmdC5vblJ1bnRpbWVJbml0aWFsaXplZCgpLGxsKCkpKX10LnNldFN0YXR1cz8odC5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0U3RhdHVzKCIiKX0sMSksaCgpfSwxKSk6aCgpfXQucnVuPUJyO2Z1bmN0aW9uIEdsKGwsaCl7SGwobCl9ZnVuY3Rpb24gSGwobCl7dWwoKXx8KHQub25FeGl0JiZ0Lm9uRXhpdChsKSxUPSEwKSx1KGwsbmV3IHpsKGwpKX1pZih0LnByZUluaXQpZm9yKHR5cGVvZiB0LnByZUluaXQ9PSJmdW5jdGlvbiImJih0LnByZUluaXQ9W3QucHJlSW5pdF0pO3QucHJlSW5pdC5sZW5ndGg+MDspdC5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEJyKCksZS5yZWFkeX19KCk7dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0Ij9tb2R1bGUuZXhwb3J0cz1TdDp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBTdH0pOnR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmKGV4cG9ydHMuY3JlYXRlVm9uYWdlVEZMaXRlU2ltZE1vZHVsZT1TdCk7Y2xhc3MgdGx7Y29uc3RydWN0b3IoKXt0aGlzLmlzU0lNRFN1cHBvcnRlZD0hMSx0aGlzLmlzVGhyZWFkc1N1cHBvcnRlZD0hMSx0aGlzLmlucHV0V2lkdGg9MCx0aGlzLmlucHV0SGVpZ2h0PTAsdGhpcy5pbnB1dENoYW5uZWxDb3VudD0wLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXQ9MCx0aGlzLm91dHB1dFdpZHRoPTAsdGhpcy5vdXRwdXRIZWlnaHQ9MCx0aGlzLm91dHB1dENoYW5uZWxDb3VudD0wLHRoaXMub3V0cHV0TWVtb3J5T2Zmc2V0PTB9fWNvbnN0IHJsPSJodHRwczovL2Qzb3Bxam1xenhmMDU3LmNsb3VkZnJvbnQubmV0L21sL3NlbGZpZV9zZWdtZW50YXRpb24vNC4wLjAvIixubD0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC9tbC9zZWxmaWVfc2VnbWVudGF0aW9uLzQuMC4wLyI7YXN5bmMgZnVuY3Rpb24gaWwocj1ybCxlPW5sKXtsZXQgdD1uZXcgdGw7dmFyIG49bmV3IFByb21pc2UoZnVuY3Rpb24oaSxvKXthc3luYyBmdW5jdGlvbiBzKCl7cmV0dXJuIFN0KHtsb2NhdGVGaWxlOmZ1bmN0aW9uKGYpe3JldHVybiByK2Z9fSl9YXN5bmMgZnVuY3Rpb24gYSh1KXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZixjKT0+e2NvbnN0IGQ9dTtpZih0eXBlb2YgZD09InVuZGVmaW5lZCIpcmV0dXJuIGMoIlRGTGl0ZSBiYWNrZW5kIHVuYXZhaWxhYmxlOiB3YXNtU2ltZCIpO2NvbnN0IHA9InNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIjtjb25zb2xlLmxvZygiTG9hZGluZyB0ZmxpdGUgbW9kZWw6IixwKTtsZXQgeT1lK2Ake3B9LnRmbGl0ZWA7Y29uc29sZS5sb2coIlRGTGl0ZSBtb2RlbFVybDogIit5KTt0cnl7Y29uc3QgXz1hd2FpdChhd2FpdCBmZXRjaCh5KSkuYXJyYXlCdWZmZXIoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIHNpemU6IixfLmJ5dGVMZW5ndGgpO2NvbnN0IGI9ZC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIG1lbW9yeSBvZmZzZXQ6IixiKSxjb25zb2xlLmxvZygiTG9hZGluZyBtb2RlbCBidWZmZXIuLi4iKSxkLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoXyksYik7Y29uc3QgZz1kLl9sb2FkTW9kZWwoXy5ieXRlTGVuZ3RoKTtpZihjb25zb2xlLmxvZygiTG9hZCBtb2RlbCByZXN1bHQ6IixnKSxnIT09MCl7YygiQ2Fubm90IGxvYWQgbW9kZWwiKTtyZXR1cm59dC5pbnB1dFdpZHRoPWQuX2dldElucHV0V2lkdGgoKSx0LmlucHV0SGVpZ2h0PWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudD1kLl9nZXRJbnB1dENoYW5uZWxDb3VudCgpLHQuaW5wdXRNZW1vcnlPZmZzZXQ9ZC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSxjb25zb2xlLmxvZygiSW5wdXQgbWVtb3J5IG9mZnNldDoiLHQuaW5wdXRNZW1vcnlPZmZzZXQpLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0KSxjb25zb2xlLmxvZygiSW5wdXQgd2lkdGg6Iix0LmlucHV0V2lkdGgpLGNvbnNvbGUubG9nKCJJbnB1dCBjaGFubmVsczoiLHQuaW5wdXRDaGFubmVsQ291bnQpLHQub3V0cHV0TWVtb3J5T2Zmc2V0PWQuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpLHQub3V0cHV0V2lkdGg9ZC5fZ2V0T3V0cHV0V2lkdGgoKSx0Lm91dHB1dEhlaWdodD1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudD1kLl9nZXRPdXRwdXRDaGFubmVsQ291bnQoKSxjb25zb2xlLmxvZygiT3V0cHV0IG1lbW9yeSBvZmZzZXQ6Iix0Lm91dHB1dE1lbW9yeU9mZnNldCksY29uc29sZS5sb2coIk91dHB1dCBoZWlnaHQ6Iix0Lm91dHB1dEhlaWdodCksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGgpLGNvbnNvbGUubG9nKCJPdXRwdXQgY2hhbm5lbHM6Iix0Lm91dHB1dENoYW5uZWxDb3VudCksdC5zZWxlY3RlZFRGTGl0ZT1kfWNhdGNoKG0pe2MobSk7cmV0dXJufWYoKX0pfXMoKS50aGVuKHU9PntpZih1PT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjthKHUpLnRoZW4oZj0+e2kodCl9KS5jYXRjaChmPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKHU9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsdSksbygibG9hZFRGTGl0ZSBlcnJvcjoiK3UpfSl9KTtyZXR1cm4gbn1jbGFzcyBvbHtjb25zdHJ1Y3Rvcigpe3RoaXMuY2FudmFzPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSx0aGlzLmNvbnRleHQ9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KSx0aGlzLnBpeGVsQ291bnQ9MCx0aGlzLmlucHV0T2Zmc2V0PTAsdGhpcy5vdXRwdXRPZmZzZXQ9MH1hc3luYyBpbml0KGUsdCl7dGhpcy5pbmZvcz1hd2FpdCBpbChlLHQpLHRoaXMuaW5mb3MmJih0aGlzLmNhbnZhcy53aWR0aD10aGlzLmluZm9zLmlucHV0V2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0PXRoaXMuaW5mb3MuaW5wdXRIZWlnaHQsdGhpcy5waXhlbENvdW50PXRoaXMuaW5mb3MuaW5wdXRXaWR0aCp0aGlzLmluZm9zLmlucHV0SGVpZ2h0LHRoaXMubWFzaz1uZXcgSW1hZ2VEYXRhKHRoaXMuaW5mb3MuaW5wdXRXaWR0aCx0aGlzLmluZm9zLmlucHV0SGVpZ2h0KSx0aGlzLmlucHV0T2Zmc2V0PXRoaXMuaW5mb3MuaW5wdXRNZW1vcnlPZmZzZXQvNCx0aGlzLm91dHB1dE9mZnNldD10aGlzLmluZm9zLm91dHB1dE1lbW9yeU9mZnNldC80KX1nZXRPdXRwdXREaW1lbnNpb25zKCl7dmFyIGUsdCxuLGk7cmV0dXJue3dpZHRoOih0PShlPXRoaXMuaW5mb3MpPT1udWxsP3ZvaWQgMDplLm91dHB1dFdpZHRoKSE9bnVsbD90OjAsaGVpZ2h0OihpPShuPXRoaXMuaW5mb3MpPT1udWxsP3ZvaWQgMDpuLm91dHB1dEhlaWdodCkhPW51bGw/aTowfX1hc3luYyBwcm9jZXNzKGUpe2lmKCF0aGlzLm1hc2t8fCF0aGlzLmluZm9zKXJldHVybjtjb25zdCB0PXRoaXMuaW5mb3MuaW5wdXRXaWR0aCxuPXRoaXMuaW5mb3MuaW5wdXRIZWlnaHQ7dGhpcy5jb250ZXh0LmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0LDAsMCx0LG4pO2NvbnN0IGk9dGhpcy5jb250ZXh0LmdldEltYWdlRGF0YSgwLDAsdCxuKSxvPXRoaXMuaW5mb3Muc2VsZWN0ZWRURkxpdGUuSEVBUEYzMjtmb3IobGV0IHM9MDtzPHRoaXMucGl4ZWxDb3VudDtzKyspe2NvbnN0IGE9dGhpcy5pbnB1dE9mZnNldCtzKjM7b1thXT1pLmRhdGFbcyo0XS8yNTUsb1thKzFdPWkuZGF0YVtzKjQrMV0vMjU1LG9bYSsyXT1pLmRhdGFbcyo0KzJdLzI1NX10aGlzLmluZm9zLnNlbGVjdGVkVEZMaXRlLl9ydW5JbmZlcmVuY2UoKTtmb3IobGV0IHM9MDtzPHRoaXMucGl4ZWxDb3VudDtzKyspe2NvbnN0IGE9dGhpcy5pbmZvcy5zZWxlY3RlZFRGTGl0ZS5IRUFQRjMyW3RoaXMub3V0cHV0T2Zmc2V0K3NdO3RoaXMubWFzay5kYXRhW3MqNF09dGhpcy5tYXNrLmRhdGFbcyo0KzNdPTI1NSphfXJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLm1hc2spfX1jbGFzcyBzbHtjb25zdHJ1Y3Rvcigpe3RoaXMuc2VsZmllU2VnbWVudGF0aW9uPW5ldyBvbCx0aGlzLnByZXZpb3VzRGltZW5zaW9ucz17d2lkdGg6MCxoZWlnaHQ6MH19YXN5bmMgaW5pdChlKXthd2FpdCB0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5pbml0KGUud2FzbUFzc2V0VXJpUGF0aCxlLnRmbGl0ZUFzc2V0VXJpUGF0aCk7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09dGhpcy5zZWxmaWVTZWdtZW50YXRpb24uZ2V0T3V0cHV0RGltZW5zaW9ucygpO3RoaXMuYmFja2dyb3VuZEZpbHRlcj1uZXcgZWwoe2ZvcmVncm91bmRXaWR0aDoxLGZvcmVncm91bmRIZWlnaHQ6MSxtYXNrV2lkdGg6dCxtYXNrSGVpZ2h0Om59KX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt2YXIgbyxzLGEsdTtjb25zdCBuPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGUpLGk9YXdhaXQgdGhpcy5zZWxmaWVTZWdtZW50YXRpb24ucHJvY2VzcyhuKTtpPygobi53aWR0aCE9PXRoaXMucHJldmlvdXNEaW1lbnNpb25zLndpZHRofHxuLmhlaWdodCE9PXRoaXMucHJldmlvdXNEaW1lbnNpb25zLmhlaWdodCkmJih0aGlzLnByZXZpb3VzRGltZW5zaW9ucy53aWR0aD1uLndpZHRoLHRoaXMucHJldmlvdXNEaW1lbnNpb25zLmhlaWdodD1uLmhlaWdodCxhd2FpdCgobz10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpvLnJlc2l6ZUZvcmVncm91bmQobi53aWR0aCxuLmhlaWdodCkpKSxhd2FpdCgocz10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDpzLnByb2Nlc3MobixpKSksZS5jbG9zZSgpLHQuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSgoYT10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDphLmNhbnZhcyx7dGltZXN0YW1wOih1PWUudGltZXN0YW1wKSE9bnVsbD91OjAsYWxwaGE6ImRpc2NhcmQifSkpKTp0LmVucXVldWUoZSl9YXN5bmMgc2V0QmFja2dyb3VuZE9wdGlvbnMoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKSl9YXN5bmMgc2V0VmlkZW9CR1JlYWRhYmxlKGUpe3ZhciB0O2F3YWl0KCh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnQuc2V0VmlkZW9CR1JlYWRhYmxlKGUpKX1hc3luYyBzZXRWaXJ0dWFsQkdJbWFnZShlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDp0LnNldFZpcnR1YWxCR0ltYWdlKGUpKX1zZXRGbGlja2VyaW5nT3B0aW9ucyhlKXt2YXIgdDsodD10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsfHx0LnNldEZsaWNrZXJpbmdPcHRpb25zKGUpfX1jb25zdCBPcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyPW5ldyBzbCx0aGlzLm1lZGlhUHJvY2Vzc29yPW5ldyB3cyx0aGlzLnJhdGU9MzB9YXN5bmMgaW5pdChlKXthd2FpdCB0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5pbml0KGUpLGF3YWl0IHRoaXMubWVkaWFQcm9jZXNzb3Iuc2V0VHJhbnNmb3JtZXJzKFt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcl0pLHRoaXMubWVkaWFQcm9jZXNzb3Iuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy5yYXRlKSx0aGlzLm1lZGlhUHJvY2Vzc29yLm9uQW55KCh0LG4pPT57dmFyIGk7KGk9dGhpcy5yZXNvbHZlT25NZWRpYVByb2Nlc3Nvcik9PW51bGx8fGkuY2FsbCh0aGlzLHtuYW1lOnQsZGF0YTpufSl9KX1hc3luYyBvbk1lZGlhUHJvY2Vzc29yRXZlbnQoKXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoZT0+dGhpcy5yZXNvbHZlT25NZWRpYVByb2Nlc3Nvcj1lKX1hc3luYyBzZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnJhdGU9ZSx0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpfWFzeW5jIHRyYW5zZm9ybShlLHQpe3RoaXMubWVkaWFQcm9jZXNzb3IudHJhbnNmb3JtKGUsdCl9YXN5bmMgc2V0QmFja2dyb3VuZE9wdGlvbnMoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIpPT1udWxsP3ZvaWQgMDp0LnNldEJhY2tncm91bmRPcHRpb25zKGUpKX1zZXRWaWRlb0JHUmVhZGFibGUoZSl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlkZW9CR1JlYWRhYmxlKGUpfWFzeW5jIHNldFZpcnR1YWxCR0ltYWdlKGUpe2F3YWl0IHRoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLnNldFZpcnR1YWxCR0ltYWdlKGUpfWFzeW5jIHRlcm1pbmF0ZSgpe2F3YWl0IHRoaXMubWVkaWFQcm9jZXNzb3IuZGVzdHJveSgpfXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLnNldEZsaWNrZXJpbmdPcHRpb25zKGUpfXNldFZvbmFnZU1ldGFkYXRhKGUpe2ZzKGUpfX07bGV0IFVpPU9yOygoKT0+e1hpKCJQcm9jZXNzb3JXb3JrZXIiLE9yKX0pKCl9KSgpOwo=";
|
|
29371
29374
|
const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
|
|
29372
29375
|
function WorkerWrapper() {
|
|
29373
29376
|
const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
|