@aerokit/sdk 12.57.0 → 12.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -39,16 +39,45 @@ __export(decorators_exports, {
|
|
|
39
39
|
});
|
|
40
40
|
module.exports = __toCommonJS(decorators_exports);
|
|
41
41
|
var rs = __toESM(require("@aerokit/sdk/http/rs"));
|
|
42
|
+
const ROUTES_KEY = /* @__PURE__ */ Symbol.for("dirigible.controller.routes");
|
|
43
|
+
const GLOBAL_ROUTES = globalThis[ROUTES_KEY] ?? (globalThis[ROUTES_KEY] = []);
|
|
42
44
|
const router = rs.service();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
function Controller(ctr) {
|
|
46
|
+
const instance = new ctr();
|
|
47
|
+
const routes = GLOBAL_ROUTES;
|
|
48
|
+
for (const route of routes) {
|
|
49
|
+
const fn = instance[route.propertyKey.name];
|
|
50
|
+
if (typeof fn === "function") {
|
|
51
|
+
((fn2, instance2) => {
|
|
52
|
+
router.resource(route.path)[route.method]((ctx, req, res) => {
|
|
53
|
+
const body = req.json ? req.json() : null;
|
|
54
|
+
const result = fn2.call(instance2, body, ctx, req, res);
|
|
55
|
+
if (result !== void 0) {
|
|
56
|
+
res.json(result);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
})(fn, instance);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
46
62
|
router.execute();
|
|
63
|
+
GLOBAL_ROUTES.length = 0;
|
|
47
64
|
}
|
|
48
65
|
function Documentation(documentation) {
|
|
49
66
|
return function(value, context) {
|
|
50
67
|
};
|
|
51
68
|
}
|
|
69
|
+
function createRequestDecorator(httpMethod) {
|
|
70
|
+
return function(path) {
|
|
71
|
+
return function(target, propertyKey) {
|
|
72
|
+
GLOBAL_ROUTES.push({
|
|
73
|
+
controller: target.constructor,
|
|
74
|
+
method: httpMethod,
|
|
75
|
+
path: path || "/",
|
|
76
|
+
propertyKey
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
}
|
|
52
81
|
const Get = createRequestDecorator("get");
|
|
53
82
|
const Post = createRequestDecorator("post");
|
|
54
83
|
const Put = createRequestDecorator("put");
|
|
@@ -56,21 +85,4 @@ const Patch = createRequestDecorator("patch");
|
|
|
56
85
|
const Delete = createRequestDecorator("delete");
|
|
57
86
|
const Head = createRequestDecorator("head");
|
|
58
87
|
const Options = createRequestDecorator("options");
|
|
59
|
-
|
|
60
|
-
return function(path, consumesMimeTypes = ["*/*"], producesMimeTypes = ["application/json"]) {
|
|
61
|
-
return function(target, propertyKey, descriptor) {
|
|
62
|
-
const handler = descriptor ? descriptor.value : target;
|
|
63
|
-
router.resource(path)[httpMethod]((ctx, req, res) => {
|
|
64
|
-
handleRequest(req, res, ctx, handler);
|
|
65
|
-
}).consumes(consumesMimeTypes).produces(producesMimeTypes);
|
|
66
|
-
};
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
function handleRequest(req, res, ctx, handler) {
|
|
70
|
-
const body = req.json();
|
|
71
|
-
const maybeResponseBody = handler.apply(instance || {}, [body, ctx, req, res]);
|
|
72
|
-
if (maybeResponseBody) {
|
|
73
|
-
res.json(maybeResponseBody);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0dHAvZGVjb3JhdG9ycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0ICogYXMgcnMgZnJvbSBcIkBhZXJva2l0L3Nkay9odHRwL3JzXCJcblxuY29uc3Qgcm91dGVyID0gcnMuc2VydmljZSgpO1xubGV0IGluc3RhbmNlID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbnRyb2xsZXIoY3RyOiB7IG5ldygpIH0sIGNvbnRleHQ6IENsYXNzRGVjb3JhdG9yQ29udGV4dCk6IHZvaWQge1xuICAgIGluc3RhbmNlID0gbmV3IGN0cigpO1xuICAgIHJvdXRlci5leGVjdXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb2N1bWVudGF0aW9uKGRvY3VtZW50YXRpb246IHN0cmluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHZhbHVlOiBhbnksXG4gICAgY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0IHwgQ2xhc3NGaWVsZERlY29yYXRvckNvbnRleHQgfCBDbGFzc01ldGhvZERlY29yYXRvckNvbnRleHRcbiAgKSB7fTtcbn1cblxuZXhwb3J0IGNvbnN0IEdldCA9IGNyZWF0ZVJlcXVlc3REZWNvcmF0b3IoXCJnZXRcIilcbmV4cG9ydCBjb25zdCBQb3N0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcInBvc3RcIilcbmV4cG9ydCBjb25zdCBQdXQgPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwicHV0XCIpXG5leHBvcnQgY29uc3QgUGF0Y2ggPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwicGF0Y2hcIilcbmV4cG9ydCBjb25zdCBEZWxldGUgPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwiZGVsZXRlXCIpXG5leHBvcnQgY29uc3QgSGVhZCA9IGNyZWF0ZVJlcXVlc3REZWNvcmF0b3IoXCJoZWFkXCIpXG5leHBvcnQgY29uc3QgT3B0aW9ucyA9IGNyZWF0ZVJlcXVlc3REZWNvcmF0b3IoXCJvcHRpb25zXCIpXG5cbmZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3REZWNvcmF0b3IoaHR0cE1ldGhvZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBjb25zdW1lc01pbWVUeXBlczogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10gPSBbJyovKiddLCBwcm9kdWNlc01pbWVUeXBlczogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXSk6IGFueSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdGFyZ2V0O1xuICAgICAgICAgICAgcm91dGVyLnJlc291cmNlKHBhdGgpW2h0dHBNZXRob2RdKChjdHgsIHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChyZXEsIHJlcywgY3R4LCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pLmNvbnN1bWVzKGNvbnN1bWVzTWltZVR5cGVzKS5wcm9kdWNlcyhwcm9kdWNlc01pbWVUeXBlcyk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KHJlcSwgcmVzLCBjdHgsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBib2R5ID0gcmVxLmpzb24oKTtcbiAgICBjb25zdCBtYXliZVJlc3BvbnNlQm9keSA9IGhhbmRsZXIuYXBwbHkoaW5zdGFuY2UgfHwge30sIFtib2R5LCBjdHgsIHJlcSwgcmVzXSk7XG4gICAgaWYgKG1heWJlUmVzcG9uc2VCb2R5KSB7XG4gICAgICAgIHJlcy5qc29uKG1heWJlUmVzcG9uc2VCb2R5KTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQW9CO0FBRXBCLE1BQU0sU0FBUyxHQUFHLFFBQVE7QUFDMUIsSUFBSSxXQUFXO0FBRVIsU0FBUyxXQUFXLEtBQWdCLFNBQXNDO0FBQzdFLGFBQVcsSUFBSSxJQUFJO0FBQ25CLFNBQU8sUUFBUTtBQUNuQjtBQUVPLFNBQVMsY0FBYyxlQUF1QjtBQUNuRCxTQUFPLFNBQ0wsT0FDQSxTQUNBO0FBQUEsRUFBQztBQUNMO0FBRU8sTUFBTSxNQUFNLHVCQUF1QixLQUFLO0FBQ3hDLE1BQU0sT0FBTyx1QkFBdUIsTUFBTTtBQUMxQyxNQUFNLE1BQU0sdUJBQXVCLEtBQUs7QUFDeEMsTUFBTSxRQUFRLHVCQUF1QixPQUFPO0FBQzVDLE1BQU0sU0FBUyx1QkFBdUIsUUFBUTtBQUM5QyxNQUFNLE9BQU8sdUJBQXVCLE1BQU07QUFDMUMsTUFBTSxVQUFVLHVCQUF1QixTQUFTO0FBRXZELFNBQVMsdUJBQXVCLFlBQVk7QUFDeEMsU0FBTyxTQUFVLE1BQWMsb0JBQW1ELENBQUMsS0FBSyxHQUFHLG9CQUFtRCxDQUFDLGtCQUFrQixHQUFRO0FBQ3JLLFdBQU8sU0FBVSxRQUFRLGFBQWEsWUFBWTtBQUM5QyxZQUFNLFVBQVUsYUFBYSxXQUFXLFFBQVE7QUFDaEQsYUFBTyxTQUFTLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLEtBQUssUUFBUTtBQUNqRCxzQkFBYyxLQUFLLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFDeEMsQ0FBQyxFQUFFLFNBQVMsaUJBQWlCLEVBQUUsU0FBUyxpQkFBaUI7QUFBQSxJQUM3RDtBQUFBLEVBQ0o7QUFDSjtBQUVBLFNBQVMsY0FBYyxLQUFLLEtBQUssS0FBSyxTQUFTO0FBQzNDLFFBQU0sT0FBTyxJQUFJLEtBQUs7QUFDdEIsUUFBTSxvQkFBb0IsUUFBUSxNQUFNLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQzdFLE1BQUksbUJBQW1CO0FBQ25CLFFBQUksS0FBSyxpQkFBaUI7QUFBQSxFQUM5QjtBQUNKOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0dHAvZGVjb3JhdG9ycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0ICogYXMgcnMgZnJvbSBcIkBhZXJva2l0L3Nkay9odHRwL3JzXCI7XG5cbmNvbnN0IFJPVVRFU19LRVkgPSBTeW1ib2wuZm9yKFwiZGlyaWdpYmxlLmNvbnRyb2xsZXIucm91dGVzXCIpO1xuXG5jb25zdCBHTE9CQUxfUk9VVEVTOiBhbnlbXSA9XG4gICAgKGdsb2JhbFRoaXMgYXMgYW55KVtST1VURVNfS0VZXSA/P1xuICAgICgoZ2xvYmFsVGhpcyBhcyBhbnkpW1JPVVRFU19LRVldID0gW10pO1xuXG5jb25zdCByb3V0ZXIgPSBycy5zZXJ2aWNlKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb250cm9sbGVyKGN0cjogeyBuZXcoKTogYW55IH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjdHIoKTtcbiAgICBjb25zdCByb3V0ZXMgPSBHTE9CQUxfUk9VVEVTO1xuICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgICAgIGNvbnN0IGZuID0gaW5zdGFuY2Vbcm91dGUucHJvcGVydHlLZXkubmFtZV07XG4gICAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0KChmbiwgaW5zdGFuY2UpID0+IHtcblx0XHQgICAgICAgIHJvdXRlci5yZXNvdXJjZShyb3V0ZS5wYXRoKVtyb3V0ZS5tZXRob2RdKChjdHgsIHJlcSwgcmVzKSA9PiB7XG5cdFx0ICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlcS5qc29uID8gcmVxLmpzb24oKSA6IG51bGw7XG5cdFx0ICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4uY2FsbChpbnN0YW5jZSwgYm9keSwgY3R4LCByZXEsIHJlcyk7XG5cdFx0ICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ICAgICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG5cdFx0ICAgICAgICAgICAgfVxuXHRcdCAgICAgICAgfSk7XG5cdFx0ICAgIH0pKGZuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByb3V0ZXIuZXhlY3V0ZSgpO1xuXHRHTE9CQUxfUk9VVEVTLmxlbmd0aCA9IDA7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0IHwgQ2xhc3NGaWVsZERlY29yYXRvckNvbnRleHQgfCBDbGFzc01ldGhvZERlY29yYXRvckNvbnRleHRcbiAgICApIHt9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKGh0dHBNZXRob2Q6IHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIEdMT0JBTF9ST1VURVMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogdGFyZ2V0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogaHR0cE1ldGhvZCxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoIHx8IFwiL1wiLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgR2V0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcImdldFwiKTtcbmV4cG9ydCBjb25zdCBQb3N0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcInBvc3RcIik7XG5leHBvcnQgY29uc3QgUHV0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcInB1dFwiKTtcbmV4cG9ydCBjb25zdCBQYXRjaCA9IGNyZWF0ZVJlcXVlc3REZWNvcmF0b3IoXCJwYXRjaFwiKTtcbmV4cG9ydCBjb25zdCBEZWxldGUgPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwiZGVsZXRlXCIpO1xuZXhwb3J0IGNvbnN0IEhlYWQgPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwiaGVhZFwiKTtcbmV4cG9ydCBjb25zdCBPcHRpb25zID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcIm9wdGlvbnNcIik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQW9CO0FBRXBCLE1BQU0sYUFBYSx1QkFBTyxJQUFJLDZCQUE2QjtBQUUzRCxNQUFNLGdCQUNELFdBQW1CLFVBQVUsTUFDNUIsV0FBbUIsVUFBVSxJQUFJLENBQUM7QUFFeEMsTUFBTSxTQUFTLEdBQUcsUUFBUTtBQUVuQixTQUFTLFdBQVcsS0FBcUI7QUFDNUMsUUFBTSxXQUFXLElBQUksSUFBSTtBQUN6QixRQUFNLFNBQVM7QUFDZixhQUFXLFNBQVMsUUFBUTtBQUN4QixVQUFNLEtBQUssU0FBUyxNQUFNLFlBQVksSUFBSTtBQUMxQyxRQUFJLE9BQU8sT0FBTyxZQUFZO0FBQ25DLE9BQUMsQ0FBQ0EsS0FBSUMsY0FBYTtBQUNaLGVBQU8sU0FBUyxNQUFNLElBQUksRUFBRSxNQUFNLE1BQU0sRUFBRSxDQUFDLEtBQUssS0FBSyxRQUFRO0FBQ3pELGdCQUFNLE9BQU8sSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJO0FBQ3JDLGdCQUFNLFNBQVNELElBQUcsS0FBS0MsV0FBVSxNQUFNLEtBQUssS0FBSyxHQUFHO0FBQ3BELGNBQUksV0FBVyxRQUFXO0FBQ3RCLGdCQUFJLEtBQUssTUFBTTtBQUFBLFVBQ25CO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTCxHQUFHLElBQUksUUFBUTtBQUFBLElBQ2I7QUFBQSxFQUNKO0FBRUEsU0FBTyxRQUFRO0FBQ2xCLGdCQUFjLFNBQVM7QUFDeEI7QUFHTyxTQUFTLGNBQWMsZUFBdUI7QUFDakQsU0FBTyxTQUNILE9BQ0EsU0FDRjtBQUFBLEVBQUM7QUFDUDtBQUVBLFNBQVMsdUJBQXVCLFlBQW9CO0FBQ2hELFNBQU8sU0FBVSxNQUFjO0FBQzNCLFdBQU8sU0FBVSxRQUFhLGFBQXFCO0FBQy9DLG9CQUFjLEtBQUs7QUFBQSxRQUNmLFlBQVksT0FBTztBQUFBLFFBQ25CLFFBQVE7QUFBQSxRQUNSLE1BQU0sUUFBUTtBQUFBLFFBQ2Q7QUFBQSxNQUNKLENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSjtBQUNKO0FBRU8sTUFBTSxNQUFNLHVCQUF1QixLQUFLO0FBQ3hDLE1BQU0sT0FBTyx1QkFBdUIsTUFBTTtBQUMxQyxNQUFNLE1BQU0sdUJBQXVCLEtBQUs7QUFDeEMsTUFBTSxRQUFRLHVCQUF1QixPQUFPO0FBQzVDLE1BQU0sU0FBUyx1QkFBdUIsUUFBUTtBQUM5QyxNQUFNLE9BQU8sdUJBQXVCLE1BQU07QUFDMUMsTUFBTSxVQUFVLHVCQUF1QixTQUFTOyIsCiAgIm5hbWVzIjogWyJmbiIsICJpbnN0YW5jZSJdCn0K
|
|
@@ -155,6 +155,7 @@ class HttpController {
|
|
|
155
155
|
}
|
|
156
156
|
} else {
|
|
157
157
|
logger.error("No suitable resource handler for Resource[{}], Method[{}], Content-Type[{}], Accept[{}] found", resourcePath, method.toUpperCase(), contentTypeHeader, acceptsHeader);
|
|
158
|
+
logger.error("Registered resource handlers for Resource[{}] are [{}]", resourcePath, JSON.stringify(_oConfiguration));
|
|
158
159
|
this.sendError(response2.BAD_REQUEST, void 0, "Bad Request", "No suitable processor for this request.");
|
|
159
160
|
}
|
|
160
161
|
}
|
|
@@ -303,4 +304,4 @@ const matchMediaType = function(request2, producesMediaTypes, consumesMediaTypes
|
|
|
303
304
|
}
|
|
304
305
|
return isProduceMatched && isConsumeMatched;
|
|
305
306
|
};
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2h0dHAvcnMvcmVzb3VyY2UtaHR0cC1jb250cm9sbGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSZXNwb25zZSBhcyByZXNwb25zZSB9IGZyb20gXCIuLi9yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdCBhcyByZXF1ZXN0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZ3MgfSBmcm9tIFwiLi9yZXNvdXJjZS1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5cbi8vIERlY2xhcmF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgZGlyaWdpYmxlUmVxdWlyZSBmdW5jdGlvbiBhbmQgaXRzIGRlcGVuZGVuY3lcbmRlY2xhcmUgZnVuY3Rpb24gZGlyaWdpYmxlUmVxdWlyZShtb2R1bGU6IHN0cmluZyk6IGFueTtcbmNvbnN0IHsgbWF0Y2ggfSA9IGRpcmlnaWJsZVJlcXVpcmUoXCJtb2R1bGVzL3NyYy9odHRwL3BhdGgtdG8tcmVnZXhwLzYuMi4xL2luZGV4LmpzXCIpO1xuXG5jb25zdCBsb2dnZXI6IGFueSA9IExvZ2dpbmcuZ2V0TG9nZ2VyKCdodHRwLnJzLmNvbnRyb2xsZXInKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgKGJlZm9yZSwgc2VydmUsIGNhdGNoKS5cbiAqL1xuaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgICBwYXRoUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBxdWVyeVBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzcG9uc2U6IGFueTtcbiAgICByZXM6IGFueTtcbiAgICByZXF1ZXN0OiBhbnk7XG4gICAgcmVxOiBhbnk7XG4gICAgLy8gQ29udGV4dCBwcm9wZXJ0aWVzIGZvciBlcnJvciBoYW5kbGluZyBtaWdodCBhbHNvIGJlIGF0dGFjaGVkIGhlcmVcbiAgICBzdXBwcmVzc1N0YWNrPzogYm9vbGVhbjtcbiAgICBodHRwRXJyb3JDb2RlPzogbnVtYmVyO1xuICAgIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgICBlcnJvck5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogYW55O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZSgpOiBhbnkge1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSAoSHR0cENvbnRyb2xsZXIpIGluc3RhbmNlLCBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggb01hcHBpbmdzLlxuICpcbiAqIEBwYXJhbSBvQ29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIGNvbmZpZ3VyYXRpb24gYnVpbGRlciB3aXRoIGNvbmZpZ3VyYXRpb24oKSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIG5ldyBIdHRwQ29udHJvbGxlciBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2Uob0NvbmZpZz86IGFueSk6IEh0dHBDb250cm9sbGVyIHtcbiAgICBsZXQgY29uZmlnOiBSZXNvdXJjZU1hcHBpbmdzIHwgYW55O1xuICAgIGlmIChvQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29uZmlnID09PSAnb2JqZWN0JyB8fCBvQ29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5ncykge1xuICAgICAgICAgICAgY29uZmlnID0gb0NvbmZpZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBDb250cm9sbGVyKGNvbmZpZyk7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMgYW5kIHJvdXRpbmcgdGhlbSB0byB0aGUgY29ycmVjdCByZXNvdXJjZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDb250cm9sbGVyIHtcblxuICAgIHJlc291cmNlOiBGdW5jdGlvbjtcbiAgICByZXNvdXJjZVBhdGg6IEZ1bmN0aW9uO1xuICAgIHJlc291cmNlTWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ3M7XG5cbiAgICAvLyBJbmRleCBzaWduYXR1cmUgdG8gYWxsb3cgZHluYW1pYyBtZXRob2QgYXNzaWdubWVudCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgSHR0cENvbnRyb2xsZXIgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9NYXBwaW5ncyBUaGUgbWFwcGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9NYXBwaW5ncz86IFJlc291cmNlTWFwcGluZ3MgfCBhbnkpIHtcbiAgICAgICAgaWYgKG9NYXBwaW5ncyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNYXBwaW5ncyA9IG9NYXBwaW5ncztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb01hcHBpbmdzID09PSAnb2JqZWN0JyB8fCBvTWFwcGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Mob01hcHBpbmdzLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYgaW5wdXQgaXMgdW5leHBlY3RlZFxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Moe30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxpYXMgZm9yIHJlc291cmNlTWFwcGluZ3MucmVzb3VyY2VcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZU1hcHBpbmdzLnJlc291cmNlUGF0aC5iaW5kKHRoaXMucmVzb3VyY2VNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gd2VhdmUtaW4gSFRUUCBtZXRob2QtYmFzZWQgZmFjdG9yeSBmdW5jdGlvbnMgLSBzaG9ydGN1dCBmb3Igc2VydmljZSgpLnJlc291cmNlKHNQYXRoKS5tZXRob2RcbiAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3JlbW92ZScsICdtZXRob2QnXS5mb3JFYWNoKChzTWV0aG9kTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzW3NNZXRob2ROYW1lXSA9ICguLi5hbGxBcmd1bWVudHM6IGFueVtdKTogSHR0cENvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGxBcmd1bWVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0luc3VmZmljaWVudCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gSHR0cENvbnRyb2xsZXIgbWV0aG9kICcgKyBzTWV0aG9kTmFtZSArICcuJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzUGF0aCBpcyBhbHdheXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgbGV0IHNQYXRoID0gYWxsQXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzUGF0aCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudHMgKHNWZXJiLCBhcnJDb25zdW1lcywgYXJyUHJvZHVjZXMpIGFyZSB1c2VkIGJ5IFJlc291cmNlTWFwcGluZ3MuZmluZC9yZXNvdXJjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNWZXJiID0gYWxsQXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyckNvbnN1bWVzID0gYWxsQXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyclByb2R1Y2VzID0gYWxsQXJndW1lbnRzWzNdO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBleGlzdGluZyByZXNvdXJjZSBvciBjcmVhdGUgYSBuZXcgb25lIGJhc2VkIG9uIHRoZSBwYXRoIChhbmQgb3RoZXIgb3B0aW9uYWwgY29uc3RyYWludHMpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHRoaXMucmVzb3VyY2VNYXBwaW5ncy5maW5kKHNQYXRoLCBzVmVyYiwgYXJyQ29uc3VtZXMsIGFyclByb2R1Y2VzKSB8fCB0aGlzLnJlc291cmNlTWFwcGluZ3MucmVzb3VyY2Uoc1BhdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgYXJndW1lbnRzICpleGNlcHQqIHRoZSBzUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VNZXRob2RBcmdzID0gYWxsQXJndW1lbnRzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICByZXNvdXJjZVtzTWV0aG9kTmFtZV0uYXBwbHkocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kQXJncyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBsaXN0ZW4ocmVxdWVzdDogYW55LCByZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMsIGZpbmRpbmcgdGhlIGJlc3QgbWF0Y2hpbmcgcmVzb3VyY2UgYW5kIGhhbmRsZXIuXG4gICAgICovXG4gICAgZXhlY3V0ZShyZXF1ZXN0PzogYW55LCByZXNwb25zZT86IGFueSk6IHZvaWQge1xuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdCB8fCBnZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoOiBzdHJpbmcgPSByZXF1ZXN0LmdldFJlc291cmNlUGF0aCgpO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgX29Db25maWd1cmF0aW9uOiBhbnkgPSB0aGlzLnJlc291cmNlTWFwcGluZ3MuY29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gbWF0Y2hSZXF1ZXN0VXJsKHJlcXVlc3RQYXRoLCBtZXRob2QsIF9vQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGxldCByZXNvdXJjZUhhbmRsZXI6IGFueTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiSGFuZGxlcnM6IGFueVtdID0gX29Db25maWd1cmF0aW9uW21hdGNoZXNbMF0uZF1bbWV0aG9kXTtcbiAgICAgICAgICAgIGlmICh2ZXJiSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUhhbmRsZXIgPSB2ZXJiSGFuZGxlcnMuZmlsdGVyKChoYW5kbGVyRGVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1lZGlhVHlwZShyZXF1ZXN0LCBoYW5kbGVyRGVmLnByb2R1Y2VzLCBoYW5kbGVyRGVmLmNvbnN1bWVzKTtcbiAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwgZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSByZXF1ZXN0LmdldFF1ZXJ5UGFyYW1ldGVyc01hcCgpIHx8IHt9O1xuICAgICAgICBjb25zdCBhY2NlcHRzSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdBY2NlcHQnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IHJlc291cmNlUGF0aDogc3RyaW5nID0gcmVxdWVzdFBhdGg7XG5cbiAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4OiBSZXF1ZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBcInBhdGhQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicXVlcnlQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXNcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXF1ZXN0XCI6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgXCJyZXFcIjogcmVxdWVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzBdLnBhdGhQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjdHgucGF0aFBhcmFtZXRlcnMgPSBtYXRjaGVzWzBdLnBhdGhQYXJhbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBsZXQgX2JlZm9yZTogRnVuY3Rpb24sIF9zZXJ2ZTogRnVuY3Rpb24sIF9jYXRjaDogRnVuY3Rpb24sIF9maW5hbGx5OiBGdW5jdGlvbjtcbiAgICAgICAgICAgIF9iZWZvcmUgPSByZXNvdXJjZUhhbmRsZXIuYmVmb3JlIHx8IG5vb3A7XG4gICAgICAgICAgICBfc2VydmUgPSByZXNvdXJjZUhhbmRsZXIuaGFuZGxlciB8fCByZXNvdXJjZUhhbmRsZXIuc2VydmUgfHwgbm9vcDtcbiAgICAgICAgICAgIF9jYXRjaCA9IHJlc291cmNlSGFuZGxlci5jYXRjaCB8fCBjYXRjaEVycm9ySGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGVIZWFkZXIuam9pbignLCcpLFxuICAgICAgICAgICAgICAgIGFjY2VwdHM6IGFjY2VwdHNIZWFkZXIuam9pbignLCcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9maW5hbGx5ID0gcmVzb3VyY2VIYW5kbGVyLmZpbmFsbHkgfHwgbm9vcDtcblxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tBcmdzOiBhbnlbXSA9IFtjdHgsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNvdXJjZUhhbmRsZXIsIHRoaXNdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgnQmVmb3JlIHNlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgIF9iZWZvcmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcblxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoJ1NlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBfc2VydmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCdTZXJ2aW5nIHJlcXVlc3QgZm9yIFJlc291cmNlW3t9XSwgTWV0aG9kW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCcsIHJlc291cmNlUGF0aCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGNvbnRlbnRUeXBlSGVhZGVyLCBhY2NlcHRzSGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncy5zcGxpY2UoMSwgMCwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhdGNoLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoX2NhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gZXJyb3IgaGFuZGxlciB0aHJldyBlcnJvcicsIF9jYXRjaEVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IF9jYXRjaEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIEh0dHBDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVJlc3BvbnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpbmFsbHkuYXBwbHkodGhpcywgW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9maW5hbGx5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gcG9zdCBoYW5kbGVyIHRocmV3IGVycm9yJywgX2ZpbmFsbHlFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc3VpdGFibGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZvdW5kJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3IocmVzcG9uc2UuQkFEX1JFUVVFU1QsIHVuZGVmaW5lZCwgJ0JhZCBSZXF1ZXN0JywgJ05vIHN1aXRhYmxlIHByb2Nlc3NvciBmb3IgdGhpcyByZXF1ZXN0LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNYXBwaW5ncyBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZ3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQgbWVkaWEgdHlwZS5cbiAgICAgKi9cbiAgICBzZW5kRXJyb3IoaHR0cEVycm9yQ29kZTogbnVtYmVyLCBhcHBsaWNhdGlvbkVycm9yQ29kZTogYW55LCBlcnJvck5hbWU6IHN0cmluZywgZXJyb3JEZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWNjZXB0TWVkaWFUeXBlczogc3RyaW5nW10gPSBub3JtYWxpemVNZWRpYVR5cGVIZWFkZXJWYWx1ZShyZXF1ZXN0LmdldEhlYWRlcignQWNjZXB0JykpIHx8IFsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBjb25zdCBpc0h0bWw6IGJvb2xlYW4gPSBjbGllbnRBY2NlcHRNZWRpYVR5cGVzLnNvbWUoKGFjY2VwdE1lZGlhVHlwZSkgPT4gaXNNaW1lVHlwZUNvbXBhdGlibGUoJyovaHRtbCcsIGFjY2VwdE1lZGlhVHlwZSkpO1xuXG4gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhodHRwRXJyb3JDb2RlIHx8IHJlc3BvbnNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7XG5cbiAgICAgICAgaWYgKGlzSHRtbCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gZXJyb3JOYW1lICsgKGFwcGxpY2F0aW9uRXJyb3JDb2RlICE9PSB1bmRlZmluZWQgPyAnWycgKyBhcHBsaWNhdGlvbkVycm9yQ29kZSArICddJyA6ICcnKSArIChlcnJvckRldGFpbHMgPyAnOiAnICsgZXJyb3JEZXRhaWxzIDogJycpO1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGh0dHBFcnJvckNvZGUgfHwgcmVzcG9uc2UuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IGFwcGxpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBlcnJvckRldGFpbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgcmVzcG9uc2UucHJpbnQoSlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VSZXNwb25zZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLlxuICAgICAqL1xuICAgIGNsb3NlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICAgIHJlc3BvbnNlLmZsdXNoKCk7XG4gICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgbWF0Y2hlZCByb3V0ZSBkZWZpbml0aW9ucywgcHJlZmVycmluZyBleGFjdCBtYXRjaGVzIG92ZXIgdGhvc2Ugd2l0aCBwbGFjZWhvbGRlcnMuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSb3V0ZURlZmluaXRpb25zU29ydGVyKHA6IGFueSwgbjogYW55KTogbnVtYmVyIHtcbiAgICBwLncgPSBjYWxjdWxhdGVNYXRjaGVkUm91dGVXZWlnaHQocCk7XG4gICAgbi53ID0gY2FsY3VsYXRlTWF0Y2hlZFJvdXRlV2VpZ2h0KG4pO1xuXG4gICAgaWYgKG4udyA9PT0gcC53KSB7XG4gICAgICAgIC8vIFRoZSBvbmUgd2l0aCBsZXNzIHBsYWNlaG9sZGVycyB3aW5zXG4gICAgICAgIGNvbnN0IG0xID0gcC5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDEgPSBtMSAhPT0gbnVsbCA/IG0xLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IG0yID0gbi5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDIgPSBtMiAhPT0gbnVsbCA/IG0yLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnNDb3VudDEgPiBwbGFjZWhvbGRlcnNDb3VudDIpIHtcbiAgICAgICAgICAgIG4udyA9IG4udyArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJzQ291bnQxIDwgcGxhY2Vob2xkZXJzQ291bnQyKSB7XG4gICAgICAgICAgICBwLncgPSBwLncgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuLncgLSBwLnc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgYSBtYXRjaGVkIHJvdXRlIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdGNoZWRSb3V0ZVdlaWdodChtYXRjaGVkUm91dGU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChtYXRjaGVkUm91dGUucGFyYW1zICYmIE9iamVjdC5rZXlzKG1hdGNoZWRSb3V0ZS5wYXJhbXMpLmxlbmd0aCA+IDApID8gMCA6IDE7IC8vIGFsd2F5cyBwcmVmZXIgZXhhY3Qgcm91dGUgZGVmaW5pdGlvbnMgLSBzZXQgd2VpZ2h0IHRvIDFcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBicmFjZXMgKGUuZy4sICcvYXBpL3twYXRoUGFyYW19JykgdG8gcGF0aC10by1yZWdleHAgZm9ybWF0IChlLmcuLCAnL2FwaS86cGF0aFBhcmFtJykuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKHBhdGhEZWZpbml0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhQYXJhbXNJbkJyYWNlc01hdGNoZXIgPSAvKHsoXFx3KlxcKj8pfSkvZzsgLy8gbWF0Y2hlcyBjYXNlcyBsaWtlICcvYXBpL3twYXRoUGFyYW19JyBvciAnL2FwaS97cGF0aFBhcmFtKn0nXG4gICAgcmV0dXJuIHBhdGhEZWZpbml0aW9uLnJlcGxhY2UocGF0aFBhcmFtc0luQnJhY2VzTWF0Y2hlciwgXCI6JDJcIik7IC8vIHRyYW5zZm9ybXMgbWF0Y2hlZCBjYXNlcyB0byAnL2FwaS86cGF0aFBhcmFtJyBvciAnL2FwaS86cGF0aFBhcmFtKidcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgcm91dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3QgcGF0aCBhbmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBtYXRjaFJlcXVlc3RVcmwocmVxdWVzdFBhdGg6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGNmZzogYW55KTogYW55W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjZmcpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBoYW5kbGVyc10pID0+IGhhbmRsZXJzICYmIChoYW5kbGVycyBhcyBhbnkpW21ldGhvZF0pXG4gICAgICAgIC5tYXAoKFtwYXRoLCBfXSkgPT4gcGF0aClcbiAgICAgICAgLnJlZHVjZSgobWF0Y2hlczogYW55W10sIHBhdGg6IHN0cmluZykgPT4gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVzLCBwYXRoLCByZXF1ZXN0UGF0aCksIFtdKVxuICAgICAgICAuc29ydChtYXRjaGVkUm91dGVEZWZpbml0aW9uc1NvcnRlcik7XG59XG5cbi8qKlxuICogUmVkdWNlciBmdW5jdGlvbiB0byBhdHRlbXB0IG1hdGNoaW5nIGEgZGVmaW5lZCBwYXRoIGFnYWluc3QgdGhlIHJlcXVlc3QgcGF0aCB1c2luZyBwYXRoLXRvLXJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVkRGVmaW5pdGlvbnM6IGFueVtdLCBkZWZpbmVkUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIC8vICdtYXRjaCcgZnJvbSBwYXRoLXRvLXJlZ2V4cCBpcyB1c2VkIGhlcmVcbiAgICBjb25zdCBwYXRoTWF0Y2hlciA9IG1hdGNoKHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKGRlZmluZWRQYXRoKSk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHBhdGhNYXRjaGVyKHJlcXVlc3RQYXRoKTtcblxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBwYXRoUGFyYW1zIGlzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnNcbiAgICAgICAgY29uc3QgcGF0aFBhcmFtcyA9IG1hdGNoZWQucGFyYW1zO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWREZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBkOiBkZWZpbmVkUGF0aCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhdGhQYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hlZERlZmluaXRpb25zLnB1c2gobWF0Y2hlZERlZmluaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlZERlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gSFRUUCBtZWRpYSB0eXBlIGhlYWRlciB2YWx1ZSAoZS5nLiwgXCJ0ZXh0L3BsYWluOyBxPTAuOSwgYXBwbGljYXRpb24vanNvblwiKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUoc01lZGlhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc01lZGlhVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNNZWRpYVR5cGUgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IG9mIGluZGl2aWR1YWwgdHlwZXNcbiAgICBsZXQgYXJyTWVkaWFUeXBlID0gc01lZGlhVHlwZS5zcGxpdCgnLCcpO1xuICAgIGFyck1lZGlhVHlwZSA9IGFyck1lZGlhVHlwZS5tYXAoKG1pbWVUeXBlRW50cnkpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGVzY2FwaW5nLCByZW1vdmUgcXVhbGl0eSBvciBvdGhlciBhdHRyaWJ1dGVzIChlLmcuLCAnOyBxPTAuOScpXG4gICAgICAgIHJldHVybiBtaW1lVHlwZUVudHJ5LnJlcGxhY2UoJ1xcXFwnLCAnJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyck1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB0eXBlLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNvdXJjZSBNSU1FIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IE1JTUUgdHlwZSwgc3VwcG9ydGluZyB3aWxkY2FyZHMgKCopLlxuICovXG5mdW5jdGlvbiBpc01pbWVUeXBlQ29tcGF0aWJsZShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoc291cmNlID09PSB0YXJnZXQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0TSA9IHRhcmdldC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHNvdXJjZU0gPSBzb3VyY2Uuc3BsaXQoJy8nKTtcblxuICAgIC8vIFRhcmdldCBpcyB3aWxkY2FyZCB0eXBlLCBTb3VyY2UgaGFzIGEgc3BlY2lmaWMgc3VidHlwZSAoZS5nLiwgdGFyZ2V0PSovanNvbiwgc291cmNlPWFwcGxpY2F0aW9uL2pzb24pXG4gICAgaWYgKHRhcmdldE1bMF0gPT09ICcqJyAmJiB0YXJnZXRNWzFdID09PSBzb3VyY2VNWzFdKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTb3VyY2UgaXMgd2lsZGNhcmQgdHlwZSwgVGFyZ2V0IGhhcyBhIHNwZWNpZmljIHN1YnR5cGUgKGUuZy4sIHNvdXJjZT0qL2pzb24sIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzBdID09PSAnKicgJiYgdGFyZ2V0TVsxXSA9PT0gc291cmNlTVsxXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUYXJnZXQgaXMgd2lsZGNhcmQgc3VidHlwZSwgU291cmNlIGhhcyBhIHNwZWNpZmljIHR5cGUgKGUuZy4sIHRhcmdldD1hcHBsaWNhdGlvbi8qLCBzb3VyY2U9YXBwbGljYXRpb24vanNvbilcbiAgICBpZiAodGFyZ2V0TVsxXSA9PT0gJyonICYmIHRhcmdldE1bMF0gPT09IHNvdXJjZU1bMF0pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNvdXJjZSBpcyB3aWxkY2FyZCBzdWJ0eXBlLCBUYXJnZXQgaGFzIGEgc3BlY2lmaWMgdHlwZSAoZS5nLiwgc291cmNlPWFwcGxpY2F0aW9uLyosIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzFdID09PSAnKicgJiYgdGFyZ2V0TVswXSA9PT0gc291cmNlTVswXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICovXG5jb25zdCBjYXRjaEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICh0aGlzOiBIdHRwQ29udHJvbGxlciwgbG9nY3R4OiBhbnksIGN0eDogUmVxdWVzdENvbnRleHQsIGVycjogYW55LCByZXF1ZXN0OiBhbnksIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY3R4LnN1cHByZXNzU3RhY2spIHtcbiAgICAgICAgY29uc3QgZGV0YWlsc01zZyA9IChjdHguZXJyb3JOYW1lIHx8IFwiXCIpICsgKGN0eC5lcnJvckNvZGUgPyBcIiBbXCIgKyBjdHguZXJyb3JDb2RlICsgXCJdXCIgOiBcIlwiKSArIChjdHguZXJyb3JNZXNzYWdlID8gXCI6IFwiICsgY3R4LmVycm9yTWVzc2FnZSA6IFwiXCIpO1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VydmluZyByZXNvdXJjZVt7fV0sIFZlcmJbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZpbmlzaGVkIGluIGVycm9yLiB7fScsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBkZXRhaWxzTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1NlcnZpbmcgcmVzb3VyY2Vbe31dLCBWZXJiW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCBpbiBlcnJvcicsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGh0dHBFcnJvckNvZGUgPSBjdHguaHR0cEVycm9yQ29kZSB8fCByZXNwb25zZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY3R4LmVycm9yTWVzc2FnZSB8fCAoZXJyICYmIGVyci5tZXNzYWdlKTtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBjdHguZXJyb3JOYW1lIHx8IChlcnIgJiYgZXJyLm5hbWUpO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGN0eC5lcnJvckNvZGU7XG5cbiAgICB0aGlzLnNlbmRFcnJvcihodHRwRXJyb3JDb2RlLCBlcnJvckNvZGUsIGVycm9yTmFtZSwgZXJyb3JNZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IG1lZGlhIHR5cGVzIG1hdGNoIHRoZSByZXNvdXJjZSBoYW5kbGVyJ3MgY29uc3VtZXMgYW5kIHByb2R1Y2VzIGNvbnN0cmFpbnRzLlxuICovXG5jb25zdCBtYXRjaE1lZGlhVHlwZSA9IGZ1bmN0aW9uIChyZXF1ZXN0OiBhbnksIHByb2R1Y2VzTWVkaWFUeXBlczogc3RyaW5nW10sIGNvbnN1bWVzTWVkaWFUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBsZXQgaXNQcm9kdWNlTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjY2VwdHNNZWRpYVR5cGVzID0gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoJ0FjY2VwdCcpKTtcblxuICAgIC8vIDEuIENoZWNrIFByb2R1Y2VzIChBY2NlcHRzIGhlYWRlcilcbiAgICBpZiAoIWFjY2VwdHNNZWRpYVR5cGVzIHx8IGFjY2VwdHNNZWRpYVR5cGVzLmxlbmd0aCA9PT0gMCB8fCBhY2NlcHRzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gT3V0cHV0IG1lZGlhIHR5cGUgaXMgbm90IHJlc3RyaWN0ZWQgYnkgY2xpZW50IG9yIGNsaWVudCBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzUHJvZHVjZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9kdWNlc01lZGlhVHlwZXMgJiYgcHJvZHVjZXNNZWRpYVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y2VzTUlNRSA9IGFjY2VwdHNNZWRpYVR5cGVzLmZpbHRlcigoYWNjZXB0c01lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWNlc01lZGlhVHlwZXMuc29tZSgocHJvZHVjZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGFjY2VwdHNNZWRpYVR5cGUsIHByb2R1Y2VzTWVkaWFUeXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IG1hdGNoZWRQcm9kdWNlc01JTUUgJiYgbWF0Y2hlZFByb2R1Y2VzTUlNRS5sZW5ndGggPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2UgZG9lc24ndCBzcGVjaWZ5IHByb2R1Y2VzLCBzbyBpdCBtYXRjaGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyBhbnl0aGluZyBvciBpZiBwcm9kdWNlcyBpcyBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBDb25zdW1lcyAoQ29udGVudC1UeXBlIGhlYWRlcilcbiAgICBsZXQgaXNDb25zdW1lTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlTWVkaWFUeXBlcyA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7XG5cbiAgICBpZiAoIWNvbnN1bWVzTWVkaWFUeXBlcyB8fCBjb25zdW1lc01lZGlhVHlwZXMubGVuZ3RoID09PSAwIHx8IGNvbnN1bWVzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gSW5wdXQgbWVkaWEgdHlwZSBpcyBub3QgcmVzdHJpY3RlZCBieSByZXNvdXJjZSBvciByZXNvdXJjZSBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50VHlwZU1lZGlhVHlwZXMgJiYgY29uc3VtZXNNZWRpYVR5cGVzICYmIGNvbnN1bWVzTWVkaWFUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb25zdW1lc01JTUUgPSBjb250ZW50VHlwZU1lZGlhVHlwZXMuZmlsdGVyKChjb250ZW50VHlwZU1lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lc01lZGlhVHlwZXMuc29tZSgoY29uc3VtZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGNvbnRlbnRUeXBlTWVkaWFUeXBlLCBjb25zdW1lc01lZGlhVHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSBtYXRjaGVkQ29uc3VtZXNNSU1FICYmIG1hdGNoZWRDb25zdW1lc01JTUUubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1Byb2R1Y2VNYXRjaGVkICYmIGlzQ29uc3VtZU1hdGNoZWQ7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBcUM7QUFDckMscUJBQW1DO0FBQ25DLCtCQUFpQztBQUNqQyxpQkFBd0I7QUFJeEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxpQkFBaUIsZ0RBQWdEO0FBRW5GLE1BQU0sU0FBYyxtQkFBUSxVQUFVLG9CQUFvQjtBQW9CMUQsU0FBUyxhQUFrQjtBQUN2QixTQUFPLGVBQUFBO0FBQ1g7QUFDQSxTQUFTLGNBQW1CO0FBQ3hCLFNBQU8sZ0JBQUFDO0FBQ1g7QUFRTyxTQUFTLFFBQVEsU0FBK0I7QUFDbkQsTUFBSTtBQUNKLE1BQUksWUFBWSxRQUFXO0FBQ3ZCLFFBQUksT0FBTyxZQUFZLFlBQVksbUJBQW1CLDJDQUFrQjtBQUNwRSxlQUFTO0FBQUEsSUFDYjtBQUFBLEVBQ0o7QUFDQSxTQUFPLElBQUksZUFBZSxNQUFNO0FBQ3BDO0FBS08sTUFBTSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY3hCLFlBQVksV0FBb0M7QUFDNUMsUUFBSSxxQkFBcUIsMkNBQWtCO0FBQ3ZDLFdBQUssbUJBQW1CO0FBQUEsSUFDNUIsV0FBVyxPQUFPLGNBQWMsWUFBWSxjQUFjLFFBQVc7QUFDakUsV0FBSyxtQkFBbUIsSUFBSSwwQ0FBaUIsV0FBVyxJQUFJO0FBQUEsSUFDaEUsT0FBTztBQUVILFdBQUssbUJBQW1CLElBQUksMENBQWlCLENBQUMsR0FBRyxJQUFJO0FBQUEsSUFDekQ7QUFHQSxTQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxLQUFLLGdCQUFnQjtBQUdqRyxLQUFDLE9BQU8sUUFBUSxPQUFPLFVBQVUsVUFBVSxRQUFRLEVBQUUsUUFBUSxDQUFDLGdCQUF3QjtBQUNsRixXQUFLLFdBQVcsSUFBSSxJQUFJLGlCQUF3QztBQUM1RCxZQUFJLGFBQWEsU0FBUztBQUN0QixnQkFBTSxNQUFNLDhEQUE4RCxjQUFjLEdBQUc7QUFHL0YsWUFBSSxRQUFRLGFBQWEsQ0FBQztBQUMxQixZQUFJLFVBQVU7QUFDVixrQkFBUTtBQUdaLGNBQU0sUUFBUSxhQUFhLENBQUM7QUFDNUIsY0FBTSxjQUFjLGFBQWEsQ0FBQztBQUNsQyxjQUFNLGNBQWMsYUFBYSxDQUFDO0FBR2xDLGNBQU0sV0FBZ0IsS0FBSyxpQkFBaUIsS0FBSyxPQUFPLE9BQU8sYUFBYSxXQUFXLEtBQUssS0FBSyxpQkFBaUIsU0FBUyxLQUFLO0FBR2hJLGNBQU0scUJBQXFCLGFBQWEsTUFBTSxDQUFDO0FBRy9DLGlCQUFTLFdBQVcsRUFBRSxNQUFNLFVBQVUsa0JBQWtCO0FBRXhELGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBT0QsVUFBY0MsV0FBcUI7QUFDdEMsU0FBSyxRQUFRRCxVQUFTQyxTQUFRO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQVFELFVBQWVDLFdBQXNCO0FBQ3pDLElBQUFELFdBQVVBLFlBQVcsV0FBVztBQUNoQyxVQUFNLGNBQXNCQSxTQUFRLGdCQUFnQjtBQUNwRCxVQUFNLFNBQWlCQSxTQUFRLFVBQVUsRUFBRSxZQUFZO0FBQ3ZELFVBQU0sa0JBQXVCLEtBQUssaUJBQWlCLGNBQWM7QUFFakUsVUFBTSxVQUFpQixnQkFBZ0IsYUFBYSxRQUFRLGVBQWU7QUFDM0UsUUFBSTtBQUVKLFFBQUksV0FBVyxRQUFRLENBQUMsR0FBRztBQUN2QixZQUFNLGVBQXNCLGdCQUFnQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTTtBQUNoRSxVQUFJLGNBQWM7QUFDZCwwQkFBa0IsYUFBYSxPQUFPLENBQUMsZUFBZTtBQUNsRCxpQkFBTyxlQUFlQSxVQUFTLFdBQVcsVUFBVSxXQUFXLFFBQVE7QUFBQSxRQUMzRSxDQUFDLEVBQUUsQ0FBQztBQUFBLE1BQ1I7QUFBQSxJQUNKO0FBRUEsSUFBQUMsWUFBV0EsYUFBWSxZQUFZO0FBQ25DLFVBQU0sY0FBc0NELFNBQVEsc0JBQXNCLEtBQUssQ0FBQztBQUNoRixVQUFNLGdCQUEwQiw4QkFBOEJBLFNBQVEsVUFBVSxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQy9GLFVBQU0sb0JBQThCLDhCQUE4QkEsU0FBUSxVQUFVLGNBQWMsQ0FBQyxLQUFLLENBQUM7QUFDekcsVUFBTSxlQUF1QjtBQUU3QixRQUFJLGlCQUFpQjtBQUNqQixZQUFNLE1BQXNCO0FBQUEsUUFDeEIsa0JBQWtCLENBQUM7QUFBQSxRQUNuQixtQkFBbUIsQ0FBQztBQUFBLFFBQ3BCLFlBQVlDO0FBQUEsUUFDWixPQUFPQTtBQUFBLFFBQ1AsV0FBV0Q7QUFBQSxRQUNYLE9BQU9BO0FBQUEsTUFDWDtBQUNBLFVBQUksUUFBUSxDQUFDLEVBQUUsWUFBWTtBQUN2QixZQUFJLGlCQUFpQixRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ3BDO0FBQ0EsVUFBSSxrQkFBa0I7QUFFdEIsWUFBTSxPQUFPLFdBQVk7QUFBQSxNQUFFO0FBQzNCLFVBQUksU0FBbUIsUUFBa0IsUUFBa0I7QUFDM0QsZ0JBQVUsZ0JBQWdCLFVBQVU7QUFDcEMsZUFBUyxnQkFBZ0IsV0FBVyxnQkFBZ0IsU0FBUztBQUM3RCxlQUFTLGdCQUFnQixTQUFTLGtCQUFrQixLQUFLLE1BQU07QUFBQSxRQUMzRCxNQUFNO0FBQUEsUUFDTixRQUFRLE9BQU8sWUFBWTtBQUFBLFFBQzNCLGFBQWEsa0JBQWtCLEtBQUssR0FBRztBQUFBLFFBQ3ZDLFNBQVMsY0FBYyxLQUFLLEdBQUc7QUFBQSxNQUNuQyxDQUFDO0FBQ0QsaUJBQVcsZ0JBQWdCLFdBQVc7QUFFdEMsWUFBTSxlQUFzQixDQUFDLEtBQUtBLFVBQVNDLFdBQVUsaUJBQWlCLElBQUk7QUFFMUUsVUFBSTtBQUNBLGVBQU8sTUFBTSxxRkFBcUYsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUN0SyxnQkFBUSxNQUFNLE1BQU0sWUFBWTtBQUVoQyxZQUFJLENBQUNBLFVBQVMsWUFBWSxHQUFHO0FBQ3pCLGlCQUFPLE1BQU0sOEVBQThFLGNBQWMsT0FBTyxZQUFZLEdBQUcsbUJBQW1CLGFBQWE7QUFDL0osaUJBQU8sTUFBTSxNQUFNLFlBQVk7QUFDL0IsaUJBQU8sTUFBTSx1RkFBdUYsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUFBLFFBQzVLO0FBQUEsTUFDSixTQUFTLEtBQVU7QUFDZixZQUFJO0FBQ0EsdUJBQWEsT0FBTyxHQUFHLEdBQUcsR0FBRztBQUM3QixpQkFBTyxNQUFNLE1BQU0sWUFBWTtBQUFBLFFBQ25DLFNBQVMsV0FBVztBQUNoQixpQkFBTyxNQUFNLHdHQUF3RyxTQUFTO0FBQzlILGdCQUFNO0FBQUEsUUFDVjtBQUFBLE1BQ0osVUFBRTtBQUNFLHVCQUFlLFVBQVUsY0FBYyxLQUFLLElBQUk7QUFDaEQsWUFBSTtBQUNBLG1CQUFTLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxRQUMzQixTQUFTLGFBQWE7QUFDbEIsaUJBQU8sTUFBTSx1R0FBdUcsV0FBVztBQUFBLFFBQ25JO0FBQUEsTUFDSjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU8sTUFBTSxpR0FBaUcsY0FBYyxPQUFPLFlBQVksR0FBRyxtQkFBbUIsYUFBYTtBQUNsTCxXQUFLLFVBQVVBLFVBQVMsYUFBYSxRQUFXLGVBQWUseUNBQXlDO0FBQUEsSUFDNUc7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxXQUE2QjtBQUN6QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsVUFBVSxlQUF1QixzQkFBMkIsV0FBbUIsY0FBNEI7QUFDdkcsVUFBTSx5QkFBbUMsOEJBQThCLGVBQUFELFFBQVEsVUFBVSxRQUFRLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtBQUMxSCxVQUFNLFNBQWtCLHVCQUF1QixLQUFLLENBQUMsb0JBQW9CLHFCQUFxQixVQUFVLGVBQWUsQ0FBQztBQUV4SCxvQkFBQUMsU0FBUyxVQUFVLGlCQUFpQixnQkFBQUEsU0FBUyxxQkFBcUI7QUFFbEUsUUFBSSxRQUFRO0FBQ1IsWUFBTSxVQUFrQixhQUFhLHlCQUF5QixTQUFZLE1BQU0sdUJBQXVCLE1BQU0sT0FBTyxlQUFlLE9BQU8sZUFBZTtBQUN6SixzQkFBQUEsU0FBUyxVQUFVLGlCQUFpQixnQkFBQUEsU0FBUyx1QkFBdUIsT0FBTztBQUFBLElBQy9FLE9BQU87QUFDSCxZQUFNLE9BQU87QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQSxRQUNULFdBQVc7QUFBQSxNQUNmO0FBQ0Esc0JBQUFBLFNBQVMsVUFBVSxnQkFBZ0Isa0JBQWtCO0FBQ3JELHNCQUFBQSxTQUFTLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxJQUNoRDtBQUNBLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxnQkFBc0I7QUFDbEIsb0JBQUFBLFNBQVMsTUFBTTtBQUNmLG9CQUFBQSxTQUFTLE1BQU07QUFBQSxFQUNuQjtBQUNKO0FBS0EsU0FBUyw4QkFBOEIsR0FBUSxHQUFnQjtBQUMzRCxJQUFFLElBQUksNEJBQTRCLENBQUM7QUFDbkMsSUFBRSxJQUFJLDRCQUE0QixDQUFDO0FBRW5DLE1BQUksRUFBRSxNQUFNLEVBQUUsR0FBRztBQUViLFVBQU0sS0FBSyxFQUFFLEVBQUUsTUFBTSxVQUFVO0FBQy9CLFVBQU0scUJBQXFCLE9BQU8sT0FBTyxHQUFHLFNBQVM7QUFDckQsVUFBTSxLQUFLLEVBQUUsRUFBRSxNQUFNLFVBQVU7QUFDL0IsVUFBTSxxQkFBcUIsT0FBTyxPQUFPLEdBQUcsU0FBUztBQUNyRCxRQUFJLHFCQUFxQixvQkFBb0I7QUFDekMsUUFBRSxJQUFJLEVBQUUsSUFBSTtBQUFBLElBQ2hCLFdBQVcscUJBQXFCLG9CQUFvQjtBQUNoRCxRQUFFLElBQUksRUFBRSxJQUFJO0FBQUEsSUFDaEI7QUFBQSxFQUNKO0FBQ0EsU0FBTyxFQUFFLElBQUksRUFBRTtBQUNuQjtBQUtBLFNBQVMsNEJBQTRCLGNBQTJCO0FBQzVELFNBQVEsYUFBYSxVQUFVLE9BQU8sS0FBSyxhQUFhLE1BQU0sRUFBRSxTQUFTLElBQUssSUFBSTtBQUN0RjtBQUtBLFNBQVMsb0NBQW9DLGdCQUFnQztBQUN6RSxRQUFNLDRCQUE0QjtBQUNsQyxTQUFPLGVBQWUsUUFBUSwyQkFBMkIsS0FBSztBQUNsRTtBQUtBLFNBQVMsZ0JBQWdCLGFBQXFCLFFBQWdCLEtBQWlCO0FBQzNFLFNBQU8sT0FBTyxRQUFRLEdBQUcsRUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxRQUFRLE1BQU0sWUFBYSxTQUFpQixNQUFNLENBQUMsRUFDL0QsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUN2QixPQUFPLENBQUMsU0FBZ0IsU0FBaUIsZ0NBQWdDLFNBQVMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQ3hHLEtBQUssNkJBQTZCO0FBQzNDO0FBS0EsU0FBUyxnQ0FBZ0Msb0JBQTJCLGFBQXFCLGFBQTRCO0FBRWpILFFBQU0sY0FBYyxNQUFNLG9DQUFvQyxXQUFXLENBQUM7QUFDMUUsUUFBTSxVQUFVLFlBQVksV0FBVztBQUV2QyxNQUFJLFNBQVM7QUFFVCxVQUFNLGFBQWEsUUFBUTtBQUUzQixVQUFNLG9CQUFvQjtBQUFBLE1BQ3RCLEdBQUc7QUFBQSxNQUNILEdBQUc7QUFBQSxNQUNIO0FBQUEsSUFDSjtBQUNBLHVCQUFtQixLQUFLLGlCQUFpQjtBQUFBLEVBQzdDO0FBQ0EsU0FBTztBQUNYO0FBS0EsU0FBUyw4QkFBOEIsWUFBNkQ7QUFDaEcsTUFBSSxlQUFlLFVBQWEsZUFBZTtBQUMzQztBQUVKLE1BQUksZUFBZSxXQUFXLE1BQU0sR0FBRztBQUN2QyxpQkFBZSxhQUFhLElBQUksQ0FBQyxrQkFBa0I7QUFFL0MsV0FBTyxjQUFjLFFBQVEsTUFBTSxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUs7QUFBQSxFQUM5RCxDQUFDO0FBQ0QsU0FBTyxhQUFhLE9BQU8sVUFBUSxLQUFLLFNBQVMsQ0FBQztBQUN0RDtBQUtBLFNBQVMscUJBQXFCLFFBQWdCLFFBQXlCO0FBQ25FLE1BQUksV0FBVztBQUNYLFdBQU87QUFFWCxRQUFNLFVBQVUsT0FBTyxNQUFNLEdBQUc7QUFDaEMsUUFBTSxVQUFVLE9BQU8sTUFBTSxHQUFHO0FBR2hDLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUdYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLE1BQUksUUFBUSxDQUFDLE1BQU0sT0FBTyxRQUFRLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUMsV0FBTztBQUVYLFNBQU87QUFDWDtBQUtBLE1BQU0sb0JBQW9CLFNBQWdDLFFBQWEsS0FBcUIsS0FBVUQsVUFBY0MsV0FBcUI7QUFDckksTUFBSSxJQUFJLGVBQWU7QUFDbkIsVUFBTSxjQUFjLElBQUksYUFBYSxPQUFPLElBQUksWUFBWSxPQUFPLElBQUksWUFBWSxNQUFNLE9BQU8sSUFBSSxlQUFlLE9BQU8sSUFBSSxlQUFlO0FBQzdJLFdBQU8sS0FBSyxzRkFBc0YsT0FBTyxNQUFNLE9BQU8sUUFBUSxPQUFPLGFBQWEsT0FBTyxTQUFTLFVBQVU7QUFBQSxFQUNoTCxPQUFPO0FBQ0gsV0FBTyxNQUFNLGtGQUFrRixPQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sYUFBYSxPQUFPLFNBQVMsR0FBRztBQUFBLEVBQ3RLO0FBRUEsUUFBTSxnQkFBZ0IsSUFBSSxpQkFBaUJBLFVBQVM7QUFDcEQsUUFBTSxlQUFlLElBQUksZ0JBQWlCLE9BQU8sSUFBSTtBQUNyRCxRQUFNLFlBQVksSUFBSSxhQUFjLE9BQU8sSUFBSTtBQUMvQyxRQUFNLFlBQVksSUFBSTtBQUV0QixPQUFLLFVBQVUsZUFBZSxXQUFXLFdBQVcsWUFBWTtBQUNwRTtBQUtBLE1BQU0saUJBQWlCLFNBQVVELFVBQWMsb0JBQThCLG9CQUF1QztBQUNoSCxNQUFJLG1CQUFtQjtBQUN2QixRQUFNLG9CQUFvQiw4QkFBOEJBLFNBQVEsVUFBVSxRQUFRLENBQUM7QUFHbkYsTUFBSSxDQUFDLHFCQUFxQixrQkFBa0IsV0FBVyxLQUFLLGtCQUFrQixTQUFTLEtBQUssR0FBRztBQUUzRix1QkFBbUI7QUFBQSxFQUN2QixPQUFPO0FBQ0gsUUFBSSxzQkFBc0IsbUJBQW1CLFFBQVE7QUFDakQsWUFBTSxzQkFBc0Isa0JBQWtCLE9BQU8sQ0FBQyxxQkFBcUI7QUFDdkUsZUFBTyxtQkFBbUIsS0FBSyxDQUFDLHNCQUFzQjtBQUNsRCxpQkFBTyxxQkFBcUIsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25FLENBQUM7QUFBQSxNQUNMLENBQUM7QUFDRCx5QkFBbUIsdUJBQXVCLG9CQUFvQixTQUFTO0FBQUEsSUFDM0UsT0FBTztBQUVILHlCQUFtQjtBQUFBLElBQ3ZCO0FBQUEsRUFDSjtBQUdBLE1BQUksbUJBQW1CO0FBQ3ZCLFFBQU0sd0JBQXdCLDhCQUE4QkEsU0FBUSxlQUFlLENBQUM7QUFFcEYsTUFBSSxDQUFDLHNCQUFzQixtQkFBbUIsV0FBVyxLQUFLLG1CQUFtQixTQUFTLEtBQUssR0FBRztBQUU5Rix1QkFBbUI7QUFBQSxFQUN2QixPQUFPO0FBQ0gsUUFBSSx5QkFBeUIsc0JBQXNCLG1CQUFtQixRQUFRO0FBQzFFLFlBQU0sc0JBQXNCLHNCQUFzQixPQUFPLENBQUMseUJBQXlCO0FBQy9FLGVBQU8sbUJBQW1CLEtBQUssQ0FBQyxzQkFBc0I7QUFDbEQsaUJBQU8scUJBQXFCLHNCQUFzQixpQkFBaUI7QUFBQSxRQUN2RSxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQ0QseUJBQW1CLHVCQUF1QixvQkFBb0IsU0FBUztBQUFBLElBQzNFO0FBQUEsRUFDSjtBQUVBLFNBQU8sb0JBQW9CO0FBQy9COyIsCiAgIm5hbWVzIjogWyJyZXF1ZXN0IiwgInJlc3BvbnNlIl0KfQo=
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2h0dHAvcnMvcmVzb3VyY2UtaHR0cC1jb250cm9sbGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSZXNwb25zZSBhcyByZXNwb25zZSB9IGZyb20gXCIuLi9yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdCBhcyByZXF1ZXN0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZ3MgfSBmcm9tIFwiLi9yZXNvdXJjZS1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5cbi8vIERlY2xhcmF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgZGlyaWdpYmxlUmVxdWlyZSBmdW5jdGlvbiBhbmQgaXRzIGRlcGVuZGVuY3lcbmRlY2xhcmUgZnVuY3Rpb24gZGlyaWdpYmxlUmVxdWlyZShtb2R1bGU6IHN0cmluZyk6IGFueTtcbmNvbnN0IHsgbWF0Y2ggfSA9IGRpcmlnaWJsZVJlcXVpcmUoXCJtb2R1bGVzL3NyYy9odHRwL3BhdGgtdG8tcmVnZXhwLzYuMi4xL2luZGV4LmpzXCIpO1xuXG5jb25zdCBsb2dnZXI6IGFueSA9IExvZ2dpbmcuZ2V0TG9nZ2VyKCdodHRwLnJzLmNvbnRyb2xsZXInKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgKGJlZm9yZSwgc2VydmUsIGNhdGNoKS5cbiAqL1xuaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgICBwYXRoUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBxdWVyeVBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzcG9uc2U6IGFueTtcbiAgICByZXM6IGFueTtcbiAgICByZXF1ZXN0OiBhbnk7XG4gICAgcmVxOiBhbnk7XG4gICAgLy8gQ29udGV4dCBwcm9wZXJ0aWVzIGZvciBlcnJvciBoYW5kbGluZyBtaWdodCBhbHNvIGJlIGF0dGFjaGVkIGhlcmVcbiAgICBzdXBwcmVzc1N0YWNrPzogYm9vbGVhbjtcbiAgICBodHRwRXJyb3JDb2RlPzogbnVtYmVyO1xuICAgIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgICBlcnJvck5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogYW55O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZSgpOiBhbnkge1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSAoSHR0cENvbnRyb2xsZXIpIGluc3RhbmNlLCBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggb01hcHBpbmdzLlxuICpcbiAqIEBwYXJhbSBvQ29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIGNvbmZpZ3VyYXRpb24gYnVpbGRlciB3aXRoIGNvbmZpZ3VyYXRpb24oKSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIG5ldyBIdHRwQ29udHJvbGxlciBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2Uob0NvbmZpZz86IGFueSk6IEh0dHBDb250cm9sbGVyIHtcbiAgICBsZXQgY29uZmlnOiBSZXNvdXJjZU1hcHBpbmdzIHwgYW55O1xuICAgIGlmIChvQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29uZmlnID09PSAnb2JqZWN0JyB8fCBvQ29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5ncykge1xuICAgICAgICAgICAgY29uZmlnID0gb0NvbmZpZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBDb250cm9sbGVyKGNvbmZpZyk7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMgYW5kIHJvdXRpbmcgdGhlbSB0byB0aGUgY29ycmVjdCByZXNvdXJjZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDb250cm9sbGVyIHtcblxuICAgIHJlc291cmNlOiBGdW5jdGlvbjtcbiAgICByZXNvdXJjZVBhdGg6IEZ1bmN0aW9uO1xuICAgIHJlc291cmNlTWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ3M7XG5cbiAgICAvLyBJbmRleCBzaWduYXR1cmUgdG8gYWxsb3cgZHluYW1pYyBtZXRob2QgYXNzaWdubWVudCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgSHR0cENvbnRyb2xsZXIgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9NYXBwaW5ncyBUaGUgbWFwcGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9NYXBwaW5ncz86IFJlc291cmNlTWFwcGluZ3MgfCBhbnkpIHtcbiAgICAgICAgaWYgKG9NYXBwaW5ncyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNYXBwaW5ncyA9IG9NYXBwaW5ncztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb01hcHBpbmdzID09PSAnb2JqZWN0JyB8fCBvTWFwcGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Mob01hcHBpbmdzLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYgaW5wdXQgaXMgdW5leHBlY3RlZFxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Moe30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxpYXMgZm9yIHJlc291cmNlTWFwcGluZ3MucmVzb3VyY2VcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZU1hcHBpbmdzLnJlc291cmNlUGF0aC5iaW5kKHRoaXMucmVzb3VyY2VNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gd2VhdmUtaW4gSFRUUCBtZXRob2QtYmFzZWQgZmFjdG9yeSBmdW5jdGlvbnMgLSBzaG9ydGN1dCBmb3Igc2VydmljZSgpLnJlc291cmNlKHNQYXRoKS5tZXRob2RcbiAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3JlbW92ZScsICdtZXRob2QnXS5mb3JFYWNoKChzTWV0aG9kTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzW3NNZXRob2ROYW1lXSA9ICguLi5hbGxBcmd1bWVudHM6IGFueVtdKTogSHR0cENvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGxBcmd1bWVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0luc3VmZmljaWVudCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gSHR0cENvbnRyb2xsZXIgbWV0aG9kICcgKyBzTWV0aG9kTmFtZSArICcuJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzUGF0aCBpcyBhbHdheXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgbGV0IHNQYXRoID0gYWxsQXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzUGF0aCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudHMgKHNWZXJiLCBhcnJDb25zdW1lcywgYXJyUHJvZHVjZXMpIGFyZSB1c2VkIGJ5IFJlc291cmNlTWFwcGluZ3MuZmluZC9yZXNvdXJjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNWZXJiID0gYWxsQXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyckNvbnN1bWVzID0gYWxsQXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyclByb2R1Y2VzID0gYWxsQXJndW1lbnRzWzNdO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBleGlzdGluZyByZXNvdXJjZSBvciBjcmVhdGUgYSBuZXcgb25lIGJhc2VkIG9uIHRoZSBwYXRoIChhbmQgb3RoZXIgb3B0aW9uYWwgY29uc3RyYWludHMpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHRoaXMucmVzb3VyY2VNYXBwaW5ncy5maW5kKHNQYXRoLCBzVmVyYiwgYXJyQ29uc3VtZXMsIGFyclByb2R1Y2VzKSB8fCB0aGlzLnJlc291cmNlTWFwcGluZ3MucmVzb3VyY2Uoc1BhdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgYXJndW1lbnRzICpleGNlcHQqIHRoZSBzUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VNZXRob2RBcmdzID0gYWxsQXJndW1lbnRzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICByZXNvdXJjZVtzTWV0aG9kTmFtZV0uYXBwbHkocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kQXJncyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBsaXN0ZW4ocmVxdWVzdDogYW55LCByZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMsIGZpbmRpbmcgdGhlIGJlc3QgbWF0Y2hpbmcgcmVzb3VyY2UgYW5kIGhhbmRsZXIuXG4gICAgICovXG4gICAgZXhlY3V0ZShyZXF1ZXN0PzogYW55LCByZXNwb25zZT86IGFueSk6IHZvaWQge1xuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdCB8fCBnZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoOiBzdHJpbmcgPSByZXF1ZXN0LmdldFJlc291cmNlUGF0aCgpO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgX29Db25maWd1cmF0aW9uOiBhbnkgPSB0aGlzLnJlc291cmNlTWFwcGluZ3MuY29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gbWF0Y2hSZXF1ZXN0VXJsKHJlcXVlc3RQYXRoLCBtZXRob2QsIF9vQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGxldCByZXNvdXJjZUhhbmRsZXI6IGFueTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiSGFuZGxlcnM6IGFueVtdID0gX29Db25maWd1cmF0aW9uW21hdGNoZXNbMF0uZF1bbWV0aG9kXTtcbiAgICAgICAgICAgIGlmICh2ZXJiSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUhhbmRsZXIgPSB2ZXJiSGFuZGxlcnMuZmlsdGVyKChoYW5kbGVyRGVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1lZGlhVHlwZShyZXF1ZXN0LCBoYW5kbGVyRGVmLnByb2R1Y2VzLCBoYW5kbGVyRGVmLmNvbnN1bWVzKTtcbiAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwgZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSByZXF1ZXN0LmdldFF1ZXJ5UGFyYW1ldGVyc01hcCgpIHx8IHt9O1xuICAgICAgICBjb25zdCBhY2NlcHRzSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdBY2NlcHQnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IHJlc291cmNlUGF0aDogc3RyaW5nID0gcmVxdWVzdFBhdGg7XG5cbiAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4OiBSZXF1ZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBcInBhdGhQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicXVlcnlQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXNcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXF1ZXN0XCI6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgXCJyZXFcIjogcmVxdWVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzBdLnBhdGhQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjdHgucGF0aFBhcmFtZXRlcnMgPSBtYXRjaGVzWzBdLnBhdGhQYXJhbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBsZXQgX2JlZm9yZTogRnVuY3Rpb24sIF9zZXJ2ZTogRnVuY3Rpb24sIF9jYXRjaDogRnVuY3Rpb24sIF9maW5hbGx5OiBGdW5jdGlvbjtcbiAgICAgICAgICAgIF9iZWZvcmUgPSByZXNvdXJjZUhhbmRsZXIuYmVmb3JlIHx8IG5vb3A7XG4gICAgICAgICAgICBfc2VydmUgPSByZXNvdXJjZUhhbmRsZXIuaGFuZGxlciB8fCByZXNvdXJjZUhhbmRsZXIuc2VydmUgfHwgbm9vcDtcbiAgICAgICAgICAgIF9jYXRjaCA9IHJlc291cmNlSGFuZGxlci5jYXRjaCB8fCBjYXRjaEVycm9ySGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGVIZWFkZXIuam9pbignLCcpLFxuICAgICAgICAgICAgICAgIGFjY2VwdHM6IGFjY2VwdHNIZWFkZXIuam9pbignLCcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9maW5hbGx5ID0gcmVzb3VyY2VIYW5kbGVyLmZpbmFsbHkgfHwgbm9vcDtcblxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tBcmdzOiBhbnlbXSA9IFtjdHgsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNvdXJjZUhhbmRsZXIsIHRoaXNdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgnQmVmb3JlIHNlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgIF9iZWZvcmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcblxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoJ1NlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBfc2VydmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCdTZXJ2aW5nIHJlcXVlc3QgZm9yIFJlc291cmNlW3t9XSwgTWV0aG9kW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCcsIHJlc291cmNlUGF0aCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGNvbnRlbnRUeXBlSGVhZGVyLCBhY2NlcHRzSGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncy5zcGxpY2UoMSwgMCwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhdGNoLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoX2NhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gZXJyb3IgaGFuZGxlciB0aHJldyBlcnJvcicsIF9jYXRjaEVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IF9jYXRjaEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIEh0dHBDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVJlc3BvbnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpbmFsbHkuYXBwbHkodGhpcywgW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9maW5hbGx5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gcG9zdCBoYW5kbGVyIHRocmV3IGVycm9yJywgX2ZpbmFsbHlFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc3VpdGFibGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZvdW5kJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuXHRcdFx0bG9nZ2VyLmVycm9yKCdSZWdpc3RlcmVkIHJlc291cmNlIGhhbmRsZXJzIGZvciBSZXNvdXJjZVt7fV0gYXJlIFt7fV0nLCByZXNvdXJjZVBhdGgsIEpTT04uc3RyaW5naWZ5KF9vQ29uZmlndXJhdGlvbikpO1xuICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3IocmVzcG9uc2UuQkFEX1JFUVVFU1QsIHVuZGVmaW5lZCwgJ0JhZCBSZXF1ZXN0JywgJ05vIHN1aXRhYmxlIHByb2Nlc3NvciBmb3IgdGhpcyByZXF1ZXN0LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNYXBwaW5ncyBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZ3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQgbWVkaWEgdHlwZS5cbiAgICAgKi9cbiAgICBzZW5kRXJyb3IoaHR0cEVycm9yQ29kZTogbnVtYmVyLCBhcHBsaWNhdGlvbkVycm9yQ29kZTogYW55LCBlcnJvck5hbWU6IHN0cmluZywgZXJyb3JEZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWNjZXB0TWVkaWFUeXBlczogc3RyaW5nW10gPSBub3JtYWxpemVNZWRpYVR5cGVIZWFkZXJWYWx1ZShyZXF1ZXN0LmdldEhlYWRlcignQWNjZXB0JykpIHx8IFsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBjb25zdCBpc0h0bWw6IGJvb2xlYW4gPSBjbGllbnRBY2NlcHRNZWRpYVR5cGVzLnNvbWUoKGFjY2VwdE1lZGlhVHlwZSkgPT4gaXNNaW1lVHlwZUNvbXBhdGlibGUoJyovaHRtbCcsIGFjY2VwdE1lZGlhVHlwZSkpO1xuXG4gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhodHRwRXJyb3JDb2RlIHx8IHJlc3BvbnNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7XG5cbiAgICAgICAgaWYgKGlzSHRtbCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gZXJyb3JOYW1lICsgKGFwcGxpY2F0aW9uRXJyb3JDb2RlICE9PSB1bmRlZmluZWQgPyAnWycgKyBhcHBsaWNhdGlvbkVycm9yQ29kZSArICddJyA6ICcnKSArIChlcnJvckRldGFpbHMgPyAnOiAnICsgZXJyb3JEZXRhaWxzIDogJycpO1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGh0dHBFcnJvckNvZGUgfHwgcmVzcG9uc2UuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IGFwcGxpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBlcnJvckRldGFpbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgcmVzcG9uc2UucHJpbnQoSlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VSZXNwb25zZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLlxuICAgICAqL1xuICAgIGNsb3NlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICAgIHJlc3BvbnNlLmZsdXNoKCk7XG4gICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgbWF0Y2hlZCByb3V0ZSBkZWZpbml0aW9ucywgcHJlZmVycmluZyBleGFjdCBtYXRjaGVzIG92ZXIgdGhvc2Ugd2l0aCBwbGFjZWhvbGRlcnMuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSb3V0ZURlZmluaXRpb25zU29ydGVyKHA6IGFueSwgbjogYW55KTogbnVtYmVyIHtcbiAgICBwLncgPSBjYWxjdWxhdGVNYXRjaGVkUm91dGVXZWlnaHQocCk7XG4gICAgbi53ID0gY2FsY3VsYXRlTWF0Y2hlZFJvdXRlV2VpZ2h0KG4pO1xuXG4gICAgaWYgKG4udyA9PT0gcC53KSB7XG4gICAgICAgIC8vIFRoZSBvbmUgd2l0aCBsZXNzIHBsYWNlaG9sZGVycyB3aW5zXG4gICAgICAgIGNvbnN0IG0xID0gcC5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDEgPSBtMSAhPT0gbnVsbCA/IG0xLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IG0yID0gbi5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDIgPSBtMiAhPT0gbnVsbCA/IG0yLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnNDb3VudDEgPiBwbGFjZWhvbGRlcnNDb3VudDIpIHtcbiAgICAgICAgICAgIG4udyA9IG4udyArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJzQ291bnQxIDwgcGxhY2Vob2xkZXJzQ291bnQyKSB7XG4gICAgICAgICAgICBwLncgPSBwLncgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuLncgLSBwLnc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgYSBtYXRjaGVkIHJvdXRlIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdGNoZWRSb3V0ZVdlaWdodChtYXRjaGVkUm91dGU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChtYXRjaGVkUm91dGUucGFyYW1zICYmIE9iamVjdC5rZXlzKG1hdGNoZWRSb3V0ZS5wYXJhbXMpLmxlbmd0aCA+IDApID8gMCA6IDE7IC8vIGFsd2F5cyBwcmVmZXIgZXhhY3Qgcm91dGUgZGVmaW5pdGlvbnMgLSBzZXQgd2VpZ2h0IHRvIDFcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBicmFjZXMgKGUuZy4sICcvYXBpL3twYXRoUGFyYW19JykgdG8gcGF0aC10by1yZWdleHAgZm9ybWF0IChlLmcuLCAnL2FwaS86cGF0aFBhcmFtJykuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKHBhdGhEZWZpbml0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhQYXJhbXNJbkJyYWNlc01hdGNoZXIgPSAvKHsoXFx3KlxcKj8pfSkvZzsgLy8gbWF0Y2hlcyBjYXNlcyBsaWtlICcvYXBpL3twYXRoUGFyYW19JyBvciAnL2FwaS97cGF0aFBhcmFtKn0nXG4gICAgcmV0dXJuIHBhdGhEZWZpbml0aW9uLnJlcGxhY2UocGF0aFBhcmFtc0luQnJhY2VzTWF0Y2hlciwgXCI6JDJcIik7IC8vIHRyYW5zZm9ybXMgbWF0Y2hlZCBjYXNlcyB0byAnL2FwaS86cGF0aFBhcmFtJyBvciAnL2FwaS86cGF0aFBhcmFtKidcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgcm91dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3QgcGF0aCBhbmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBtYXRjaFJlcXVlc3RVcmwocmVxdWVzdFBhdGg6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGNmZzogYW55KTogYW55W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjZmcpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBoYW5kbGVyc10pID0+IGhhbmRsZXJzICYmIChoYW5kbGVycyBhcyBhbnkpW21ldGhvZF0pXG4gICAgICAgIC5tYXAoKFtwYXRoLCBfXSkgPT4gcGF0aClcbiAgICAgICAgLnJlZHVjZSgobWF0Y2hlczogYW55W10sIHBhdGg6IHN0cmluZykgPT4gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVzLCBwYXRoLCByZXF1ZXN0UGF0aCksIFtdKVxuICAgICAgICAuc29ydChtYXRjaGVkUm91dGVEZWZpbml0aW9uc1NvcnRlcik7XG59XG5cbi8qKlxuICogUmVkdWNlciBmdW5jdGlvbiB0byBhdHRlbXB0IG1hdGNoaW5nIGEgZGVmaW5lZCBwYXRoIGFnYWluc3QgdGhlIHJlcXVlc3QgcGF0aCB1c2luZyBwYXRoLXRvLXJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVkRGVmaW5pdGlvbnM6IGFueVtdLCBkZWZpbmVkUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIC8vICdtYXRjaCcgZnJvbSBwYXRoLXRvLXJlZ2V4cCBpcyB1c2VkIGhlcmVcbiAgICBjb25zdCBwYXRoTWF0Y2hlciA9IG1hdGNoKHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKGRlZmluZWRQYXRoKSk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHBhdGhNYXRjaGVyKHJlcXVlc3RQYXRoKTtcblxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBwYXRoUGFyYW1zIGlzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnNcbiAgICAgICAgY29uc3QgcGF0aFBhcmFtcyA9IG1hdGNoZWQucGFyYW1zO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWREZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBkOiBkZWZpbmVkUGF0aCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhdGhQYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hlZERlZmluaXRpb25zLnB1c2gobWF0Y2hlZERlZmluaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlZERlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gSFRUUCBtZWRpYSB0eXBlIGhlYWRlciB2YWx1ZSAoZS5nLiwgXCJ0ZXh0L3BsYWluOyBxPTAuOSwgYXBwbGljYXRpb24vanNvblwiKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUoc01lZGlhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc01lZGlhVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNNZWRpYVR5cGUgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IG9mIGluZGl2aWR1YWwgdHlwZXNcbiAgICBsZXQgYXJyTWVkaWFUeXBlID0gc01lZGlhVHlwZS5zcGxpdCgnLCcpO1xuICAgIGFyck1lZGlhVHlwZSA9IGFyck1lZGlhVHlwZS5tYXAoKG1pbWVUeXBlRW50cnkpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGVzY2FwaW5nLCByZW1vdmUgcXVhbGl0eSBvciBvdGhlciBhdHRyaWJ1dGVzIChlLmcuLCAnOyBxPTAuOScpXG4gICAgICAgIHJldHVybiBtaW1lVHlwZUVudHJ5LnJlcGxhY2UoJ1xcXFwnLCAnJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyck1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB0eXBlLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNvdXJjZSBNSU1FIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IE1JTUUgdHlwZSwgc3VwcG9ydGluZyB3aWxkY2FyZHMgKCopLlxuICovXG5mdW5jdGlvbiBpc01pbWVUeXBlQ29tcGF0aWJsZShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoc291cmNlID09PSB0YXJnZXQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0TSA9IHRhcmdldC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHNvdXJjZU0gPSBzb3VyY2Uuc3BsaXQoJy8nKTtcblxuICAgIC8vIFRhcmdldCBpcyB3aWxkY2FyZCB0eXBlLCBTb3VyY2UgaGFzIGEgc3BlY2lmaWMgc3VidHlwZSAoZS5nLiwgdGFyZ2V0PSovanNvbiwgc291cmNlPWFwcGxpY2F0aW9uL2pzb24pXG4gICAgaWYgKHRhcmdldE1bMF0gPT09ICcqJyAmJiB0YXJnZXRNWzFdID09PSBzb3VyY2VNWzFdKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTb3VyY2UgaXMgd2lsZGNhcmQgdHlwZSwgVGFyZ2V0IGhhcyBhIHNwZWNpZmljIHN1YnR5cGUgKGUuZy4sIHNvdXJjZT0qL2pzb24sIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzBdID09PSAnKicgJiYgdGFyZ2V0TVsxXSA9PT0gc291cmNlTVsxXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUYXJnZXQgaXMgd2lsZGNhcmQgc3VidHlwZSwgU291cmNlIGhhcyBhIHNwZWNpZmljIHR5cGUgKGUuZy4sIHRhcmdldD1hcHBsaWNhdGlvbi8qLCBzb3VyY2U9YXBwbGljYXRpb24vanNvbilcbiAgICBpZiAodGFyZ2V0TVsxXSA9PT0gJyonICYmIHRhcmdldE1bMF0gPT09IHNvdXJjZU1bMF0pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNvdXJjZSBpcyB3aWxkY2FyZCBzdWJ0eXBlLCBUYXJnZXQgaGFzIGEgc3BlY2lmaWMgdHlwZSAoZS5nLiwgc291cmNlPWFwcGxpY2F0aW9uLyosIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzFdID09PSAnKicgJiYgdGFyZ2V0TVswXSA9PT0gc291cmNlTVswXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICovXG5jb25zdCBjYXRjaEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICh0aGlzOiBIdHRwQ29udHJvbGxlciwgbG9nY3R4OiBhbnksIGN0eDogUmVxdWVzdENvbnRleHQsIGVycjogYW55LCByZXF1ZXN0OiBhbnksIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY3R4LnN1cHByZXNzU3RhY2spIHtcbiAgICAgICAgY29uc3QgZGV0YWlsc01zZyA9IChjdHguZXJyb3JOYW1lIHx8IFwiXCIpICsgKGN0eC5lcnJvckNvZGUgPyBcIiBbXCIgKyBjdHguZXJyb3JDb2RlICsgXCJdXCIgOiBcIlwiKSArIChjdHguZXJyb3JNZXNzYWdlID8gXCI6IFwiICsgY3R4LmVycm9yTWVzc2FnZSA6IFwiXCIpO1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VydmluZyByZXNvdXJjZVt7fV0sIFZlcmJbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZpbmlzaGVkIGluIGVycm9yLiB7fScsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBkZXRhaWxzTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1NlcnZpbmcgcmVzb3VyY2Vbe31dLCBWZXJiW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCBpbiBlcnJvcicsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGh0dHBFcnJvckNvZGUgPSBjdHguaHR0cEVycm9yQ29kZSB8fCByZXNwb25zZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY3R4LmVycm9yTWVzc2FnZSB8fCAoZXJyICYmIGVyci5tZXNzYWdlKTtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBjdHguZXJyb3JOYW1lIHx8IChlcnIgJiYgZXJyLm5hbWUpO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGN0eC5lcnJvckNvZGU7XG5cbiAgICB0aGlzLnNlbmRFcnJvcihodHRwRXJyb3JDb2RlLCBlcnJvckNvZGUsIGVycm9yTmFtZSwgZXJyb3JNZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IG1lZGlhIHR5cGVzIG1hdGNoIHRoZSByZXNvdXJjZSBoYW5kbGVyJ3MgY29uc3VtZXMgYW5kIHByb2R1Y2VzIGNvbnN0cmFpbnRzLlxuICovXG5jb25zdCBtYXRjaE1lZGlhVHlwZSA9IGZ1bmN0aW9uIChyZXF1ZXN0OiBhbnksIHByb2R1Y2VzTWVkaWFUeXBlczogc3RyaW5nW10sIGNvbnN1bWVzTWVkaWFUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBsZXQgaXNQcm9kdWNlTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjY2VwdHNNZWRpYVR5cGVzID0gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoJ0FjY2VwdCcpKTtcblxuICAgIC8vIDEuIENoZWNrIFByb2R1Y2VzIChBY2NlcHRzIGhlYWRlcilcbiAgICBpZiAoIWFjY2VwdHNNZWRpYVR5cGVzIHx8IGFjY2VwdHNNZWRpYVR5cGVzLmxlbmd0aCA9PT0gMCB8fCBhY2NlcHRzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gT3V0cHV0IG1lZGlhIHR5cGUgaXMgbm90IHJlc3RyaWN0ZWQgYnkgY2xpZW50IG9yIGNsaWVudCBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzUHJvZHVjZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9kdWNlc01lZGlhVHlwZXMgJiYgcHJvZHVjZXNNZWRpYVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y2VzTUlNRSA9IGFjY2VwdHNNZWRpYVR5cGVzLmZpbHRlcigoYWNjZXB0c01lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWNlc01lZGlhVHlwZXMuc29tZSgocHJvZHVjZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGFjY2VwdHNNZWRpYVR5cGUsIHByb2R1Y2VzTWVkaWFUeXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IG1hdGNoZWRQcm9kdWNlc01JTUUgJiYgbWF0Y2hlZFByb2R1Y2VzTUlNRS5sZW5ndGggPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2UgZG9lc24ndCBzcGVjaWZ5IHByb2R1Y2VzLCBzbyBpdCBtYXRjaGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyBhbnl0aGluZyBvciBpZiBwcm9kdWNlcyBpcyBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBDb25zdW1lcyAoQ29udGVudC1UeXBlIGhlYWRlcilcbiAgICBsZXQgaXNDb25zdW1lTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlTWVkaWFUeXBlcyA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7XG5cbiAgICBpZiAoIWNvbnN1bWVzTWVkaWFUeXBlcyB8fCBjb25zdW1lc01lZGlhVHlwZXMubGVuZ3RoID09PSAwIHx8IGNvbnN1bWVzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gSW5wdXQgbWVkaWEgdHlwZSBpcyBub3QgcmVzdHJpY3RlZCBieSByZXNvdXJjZSBvciByZXNvdXJjZSBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50VHlwZU1lZGlhVHlwZXMgJiYgY29uc3VtZXNNZWRpYVR5cGVzICYmIGNvbnN1bWVzTWVkaWFUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb25zdW1lc01JTUUgPSBjb250ZW50VHlwZU1lZGlhVHlwZXMuZmlsdGVyKChjb250ZW50VHlwZU1lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lc01lZGlhVHlwZXMuc29tZSgoY29uc3VtZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGNvbnRlbnRUeXBlTWVkaWFUeXBlLCBjb25zdW1lc01lZGlhVHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSBtYXRjaGVkQ29uc3VtZXNNSU1FICYmIG1hdGNoZWRDb25zdW1lc01JTUUubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1Byb2R1Y2VNYXRjaGVkICYmIGlzQ29uc3VtZU1hdGNoZWQ7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBcUM7QUFDckMscUJBQW1DO0FBQ25DLCtCQUFpQztBQUNqQyxpQkFBd0I7QUFJeEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxpQkFBaUIsZ0RBQWdEO0FBRW5GLE1BQU0sU0FBYyxtQkFB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
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare function Controller(ctr: {
|
|
2
2
|
new (): any;
|
|
3
|
-
}
|
|
3
|
+
}): void;
|
|
4
4
|
export declare function Documentation(documentation: string): (value: any, context: ClassDecoratorContext | ClassFieldDecoratorContext | ClassMethodDecoratorContext) => void;
|
|
5
|
-
export declare const Get: (path: string
|
|
6
|
-
export declare const Post: (path: string
|
|
7
|
-
export declare const Put: (path: string
|
|
8
|
-
export declare const Patch: (path: string
|
|
9
|
-
export declare const Delete: (path: string
|
|
10
|
-
export declare const Head: (path: string
|
|
11
|
-
export declare const Options: (path: string
|
|
5
|
+
export declare const Get: (path: string) => (target: any, propertyKey: string) => void;
|
|
6
|
+
export declare const Post: (path: string) => (target: any, propertyKey: string) => void;
|
|
7
|
+
export declare const Put: (path: string) => (target: any, propertyKey: string) => void;
|
|
8
|
+
export declare const Patch: (path: string) => (target: any, propertyKey: string) => void;
|
|
9
|
+
export declare const Delete: (path: string) => (target: any, propertyKey: string) => void;
|
|
10
|
+
export declare const Head: (path: string) => (target: any, propertyKey: string) => void;
|
|
11
|
+
export declare const Options: (path: string) => (target: any, propertyKey: string) => void;
|
|
@@ -1,14 +1,43 @@
|
|
|
1
1
|
import * as rs from "@aerokit/sdk/http/rs";
|
|
2
|
+
const ROUTES_KEY = /* @__PURE__ */ Symbol.for("dirigible.controller.routes");
|
|
3
|
+
const GLOBAL_ROUTES = globalThis[ROUTES_KEY] ?? (globalThis[ROUTES_KEY] = []);
|
|
2
4
|
const router = rs.service();
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
function Controller(ctr) {
|
|
6
|
+
const instance = new ctr();
|
|
7
|
+
const routes = GLOBAL_ROUTES;
|
|
8
|
+
for (const route of routes) {
|
|
9
|
+
const fn = instance[route.propertyKey.name];
|
|
10
|
+
if (typeof fn === "function") {
|
|
11
|
+
((fn2, instance2) => {
|
|
12
|
+
router.resource(route.path)[route.method]((ctx, req, res) => {
|
|
13
|
+
const body = req.json ? req.json() : null;
|
|
14
|
+
const result = fn2.call(instance2, body, ctx, req, res);
|
|
15
|
+
if (result !== void 0) {
|
|
16
|
+
res.json(result);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
})(fn, instance);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
6
22
|
router.execute();
|
|
23
|
+
GLOBAL_ROUTES.length = 0;
|
|
7
24
|
}
|
|
8
25
|
function Documentation(documentation) {
|
|
9
26
|
return function(value, context) {
|
|
10
27
|
};
|
|
11
28
|
}
|
|
29
|
+
function createRequestDecorator(httpMethod) {
|
|
30
|
+
return function(path) {
|
|
31
|
+
return function(target, propertyKey) {
|
|
32
|
+
GLOBAL_ROUTES.push({
|
|
33
|
+
controller: target.constructor,
|
|
34
|
+
method: httpMethod,
|
|
35
|
+
path: path || "/",
|
|
36
|
+
propertyKey
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
}
|
|
12
41
|
const Get = createRequestDecorator("get");
|
|
13
42
|
const Post = createRequestDecorator("post");
|
|
14
43
|
const Put = createRequestDecorator("put");
|
|
@@ -16,23 +45,6 @@ const Patch = createRequestDecorator("patch");
|
|
|
16
45
|
const Delete = createRequestDecorator("delete");
|
|
17
46
|
const Head = createRequestDecorator("head");
|
|
18
47
|
const Options = createRequestDecorator("options");
|
|
19
|
-
function createRequestDecorator(httpMethod) {
|
|
20
|
-
return function(path, consumesMimeTypes = ["*/*"], producesMimeTypes = ["application/json"]) {
|
|
21
|
-
return function(target, propertyKey, descriptor) {
|
|
22
|
-
const handler = descriptor ? descriptor.value : target;
|
|
23
|
-
router.resource(path)[httpMethod]((ctx, req, res) => {
|
|
24
|
-
handleRequest(req, res, ctx, handler);
|
|
25
|
-
}).consumes(consumesMimeTypes).produces(producesMimeTypes);
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
function handleRequest(req, res, ctx, handler) {
|
|
30
|
-
const body = req.json();
|
|
31
|
-
const maybeResponseBody = handler.apply(instance || {}, [body, ctx, req, res]);
|
|
32
|
-
if (maybeResponseBody) {
|
|
33
|
-
res.json(maybeResponseBody);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
48
|
export {
|
|
37
49
|
Controller,
|
|
38
50
|
Delete,
|
|
@@ -44,4 +56,4 @@ export {
|
|
|
44
56
|
Post,
|
|
45
57
|
Put
|
|
46
58
|
};
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0dHAvZGVjb3JhdG9ycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0ICogYXMgcnMgZnJvbSBcIkBhZXJva2l0L3Nkay9odHRwL3JzXCI7XG5cbmNvbnN0IFJPVVRFU19LRVkgPSBTeW1ib2wuZm9yKFwiZGlyaWdpYmxlLmNvbnRyb2xsZXIucm91dGVzXCIpO1xuXG5jb25zdCBHTE9CQUxfUk9VVEVTOiBhbnlbXSA9XG4gICAgKGdsb2JhbFRoaXMgYXMgYW55KVtST1VURVNfS0VZXSA/P1xuICAgICgoZ2xvYmFsVGhpcyBhcyBhbnkpW1JPVVRFU19LRVldID0gW10pO1xuXG5jb25zdCByb3V0ZXIgPSBycy5zZXJ2aWNlKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb250cm9sbGVyKGN0cjogeyBuZXcoKTogYW55IH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjdHIoKTtcbiAgICBjb25zdCByb3V0ZXMgPSBHTE9CQUxfUk9VVEVTO1xuICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgICAgIGNvbnN0IGZuID0gaW5zdGFuY2Vbcm91dGUucHJvcGVydHlLZXkubmFtZV07XG4gICAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0KChmbiwgaW5zdGFuY2UpID0+IHtcblx0XHQgICAgICAgIHJvdXRlci5yZXNvdXJjZShyb3V0ZS5wYXRoKVtyb3V0ZS5tZXRob2RdKChjdHgsIHJlcSwgcmVzKSA9PiB7XG5cdFx0ICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlcS5qc29uID8gcmVxLmpzb24oKSA6IG51bGw7XG5cdFx0ICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4uY2FsbChpbnN0YW5jZSwgYm9keSwgY3R4LCByZXEsIHJlcyk7XG5cdFx0ICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ICAgICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG5cdFx0ICAgICAgICAgICAgfVxuXHRcdCAgICAgICAgfSk7XG5cdFx0ICAgIH0pKGZuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByb3V0ZXIuZXhlY3V0ZSgpO1xuXHRHTE9CQUxfUk9VVEVTLmxlbmd0aCA9IDA7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0IHwgQ2xhc3NGaWVsZERlY29yYXRvckNvbnRleHQgfCBDbGFzc01ldGhvZERlY29yYXRvckNvbnRleHRcbiAgICApIHt9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKGh0dHBNZXRob2Q6IHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIEdMT0JBTF9ST1VURVMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogdGFyZ2V0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogaHR0cE1ldGhvZCxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoIHx8IFwiL1wiLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgR2V0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcImdldFwiKTtcbmV4cG9ydCBjb25zdCBQb3N0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcInBvc3RcIik7XG5leHBvcnQgY29uc3QgUHV0ID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcInB1dFwiKTtcbmV4cG9ydCBjb25zdCBQYXRjaCA9IGNyZWF0ZVJlcXVlc3REZWNvcmF0b3IoXCJwYXRjaFwiKTtcbmV4cG9ydCBjb25zdCBEZWxldGUgPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwiZGVsZXRlXCIpO1xuZXhwb3J0IGNvbnN0IEhlYWQgPSBjcmVhdGVSZXF1ZXN0RGVjb3JhdG9yKFwiaGVhZFwiKTtcbmV4cG9ydCBjb25zdCBPcHRpb25zID0gY3JlYXRlUmVxdWVzdERlY29yYXRvcihcIm9wdGlvbnNcIik7XG4iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxZQUFZLFFBQVE7QUFFcEIsTUFBTSxhQUFhLHVCQUFPLElBQUksNkJBQTZCO0FBRTNELE1BQU0sZ0JBQ0QsV0FBbUIsVUFBVSxNQUM1QixXQUFtQixVQUFVLElBQUksQ0FBQztBQUV4QyxNQUFNLFNBQVMsR0FBRyxRQUFRO0FBRW5CLFNBQVMsV0FBVyxLQUFxQjtBQUM1QyxRQUFNLFdBQVcsSUFBSSxJQUFJO0FBQ3pCLFFBQU0sU0FBUztBQUNmLGFBQVcsU0FBUyxRQUFRO0FBQ3hCLFVBQU0sS0FBSyxTQUFTLE1BQU0sWUFBWSxJQUFJO0FBQzFDLFFBQUksT0FBTyxPQUFPLFlBQVk7QUFDbkMsT0FBQyxDQUFDQSxLQUFJQyxjQUFhO0FBQ1osZUFBTyxTQUFTLE1BQU0sSUFBSSxFQUFFLE1BQU0sTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLLFFBQVE7QUFDekQsZ0JBQU0sT0FBTyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFDckMsZ0JBQU0sU0FBU0QsSUFBRyxLQUFLQyxXQUFVLE1BQU0sS0FBSyxLQUFLLEdBQUc7QUFDcEQsY0FBSSxXQUFXLFFBQVc7QUFDdEIsZ0JBQUksS0FBSyxNQUFNO0FBQUEsVUFDbkI7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNMLEdBQUcsSUFBSSxRQUFRO0FBQUEsSUFDYjtBQUFBLEVBQ0o7QUFFQSxTQUFPLFFBQVE7QUFDbEIsZ0JBQWMsU0FBUztBQUN4QjtBQUdPLFNBQVMsY0FBYyxlQUF1QjtBQUNqRCxTQUFPLFNBQ0gsT0FDQSxTQUNGO0FBQUEsRUFBQztBQUNQO0FBRUEsU0FBUyx1QkFBdUIsWUFBb0I7QUFDaEQsU0FBTyxTQUFVLE1BQWM7QUFDM0IsV0FBTyxTQUFVLFFBQWEsYUFBcUI7QUFDL0Msb0JBQWMsS0FBSztBQUFBLFFBQ2YsWUFBWSxPQUFPO0FBQUEsUUFDbkIsUUFBUTtBQUFBLFFBQ1IsTUFBTSxRQUFRO0FBQUEsUUFDZDtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0o7QUFFTyxNQUFNLE1BQU0sdUJBQXVCLEtBQUs7QUFDeEMsTUFBTSxPQUFPLHVCQUF1QixNQUFNO0FBQzFDLE1BQU0sTUFBTSx1QkFBdUIsS0FBSztBQUN4QyxNQUFNLFFBQVEsdUJBQXVCLE9BQU87QUFDNUMsTUFBTSxTQUFTLHVCQUF1QixRQUFRO0FBQzlDLE1BQU0sT0FBTyx1QkFBdUIsTUFBTTtBQUMxQyxNQUFNLFVBQVUsdUJBQXVCLFNBQVM7IiwKICAibmFtZXMiOiBbImZuIiwgImluc3RhbmNlIl0KfQo=
|
|
@@ -132,6 +132,7 @@ class HttpController {
|
|
|
132
132
|
}
|
|
133
133
|
} else {
|
|
134
134
|
logger.error("No suitable resource handler for Resource[{}], Method[{}], Content-Type[{}], Accept[{}] found", resourcePath, method.toUpperCase(), contentTypeHeader, acceptsHeader);
|
|
135
|
+
logger.error("Registered resource handlers for Resource[{}] are [{}]", resourcePath, JSON.stringify(_oConfiguration));
|
|
135
136
|
this.sendError(response2.BAD_REQUEST, void 0, "Bad Request", "No suitable processor for this request.");
|
|
136
137
|
}
|
|
137
138
|
}
|
|
@@ -284,4 +285,4 @@ export {
|
|
|
284
285
|
HttpController,
|
|
285
286
|
service
|
|
286
287
|
};
|
|
287
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2h0dHAvcnMvcmVzb3VyY2UtaHR0cC1jb250cm9sbGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSZXNwb25zZSBhcyByZXNwb25zZSB9IGZyb20gXCIuLi9yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdCBhcyByZXF1ZXN0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZ3MgfSBmcm9tIFwiLi9yZXNvdXJjZS1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5cbi8vIERlY2xhcmF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgZGlyaWdpYmxlUmVxdWlyZSBmdW5jdGlvbiBhbmQgaXRzIGRlcGVuZGVuY3lcbmRlY2xhcmUgZnVuY3Rpb24gZGlyaWdpYmxlUmVxdWlyZShtb2R1bGU6IHN0cmluZyk6IGFueTtcbmNvbnN0IHsgbWF0Y2ggfSA9IGRpcmlnaWJsZVJlcXVpcmUoXCJtb2R1bGVzL3NyYy9odHRwL3BhdGgtdG8tcmVnZXhwLzYuMi4xL2luZGV4LmpzXCIpO1xuXG5jb25zdCBsb2dnZXI6IGFueSA9IExvZ2dpbmcuZ2V0TG9nZ2VyKCdodHRwLnJzLmNvbnRyb2xsZXInKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgKGJlZm9yZSwgc2VydmUsIGNhdGNoKS5cbiAqL1xuaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgICBwYXRoUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBxdWVyeVBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzcG9uc2U6IGFueTtcbiAgICByZXM6IGFueTtcbiAgICByZXF1ZXN0OiBhbnk7XG4gICAgcmVxOiBhbnk7XG4gICAgLy8gQ29udGV4dCBwcm9wZXJ0aWVzIGZvciBlcnJvciBoYW5kbGluZyBtaWdodCBhbHNvIGJlIGF0dGFjaGVkIGhlcmVcbiAgICBzdXBwcmVzc1N0YWNrPzogYm9vbGVhbjtcbiAgICBodHRwRXJyb3JDb2RlPzogbnVtYmVyO1xuICAgIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgICBlcnJvck5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogYW55O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZSgpOiBhbnkge1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSAoSHR0cENvbnRyb2xsZXIpIGluc3RhbmNlLCBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggb01hcHBpbmdzLlxuICpcbiAqIEBwYXJhbSBvQ29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIGNvbmZpZ3VyYXRpb24gYnVpbGRlciB3aXRoIGNvbmZpZ3VyYXRpb24oKSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIG5ldyBIdHRwQ29udHJvbGxlciBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2Uob0NvbmZpZz86IGFueSk6IEh0dHBDb250cm9sbGVyIHtcbiAgICBsZXQgY29uZmlnOiBSZXNvdXJjZU1hcHBpbmdzIHwgYW55O1xuICAgIGlmIChvQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29uZmlnID09PSAnb2JqZWN0JyB8fCBvQ29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5ncykge1xuICAgICAgICAgICAgY29uZmlnID0gb0NvbmZpZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBDb250cm9sbGVyKGNvbmZpZyk7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMgYW5kIHJvdXRpbmcgdGhlbSB0byB0aGUgY29ycmVjdCByZXNvdXJjZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDb250cm9sbGVyIHtcblxuICAgIHJlc291cmNlOiBGdW5jdGlvbjtcbiAgICByZXNvdXJjZVBhdGg6IEZ1bmN0aW9uO1xuICAgIHJlc291cmNlTWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ3M7XG5cbiAgICAvLyBJbmRleCBzaWduYXR1cmUgdG8gYWxsb3cgZHluYW1pYyBtZXRob2QgYXNzaWdubWVudCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgSHR0cENvbnRyb2xsZXIgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9NYXBwaW5ncyBUaGUgbWFwcGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9NYXBwaW5ncz86IFJlc291cmNlTWFwcGluZ3MgfCBhbnkpIHtcbiAgICAgICAgaWYgKG9NYXBwaW5ncyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNYXBwaW5ncyA9IG9NYXBwaW5ncztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb01hcHBpbmdzID09PSAnb2JqZWN0JyB8fCBvTWFwcGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Mob01hcHBpbmdzLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYgaW5wdXQgaXMgdW5leHBlY3RlZFxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Moe30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxpYXMgZm9yIHJlc291cmNlTWFwcGluZ3MucmVzb3VyY2VcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZU1hcHBpbmdzLnJlc291cmNlUGF0aC5iaW5kKHRoaXMucmVzb3VyY2VNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gd2VhdmUtaW4gSFRUUCBtZXRob2QtYmFzZWQgZmFjdG9yeSBmdW5jdGlvbnMgLSBzaG9ydGN1dCBmb3Igc2VydmljZSgpLnJlc291cmNlKHNQYXRoKS5tZXRob2RcbiAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3JlbW92ZScsICdtZXRob2QnXS5mb3JFYWNoKChzTWV0aG9kTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzW3NNZXRob2ROYW1lXSA9ICguLi5hbGxBcmd1bWVudHM6IGFueVtdKTogSHR0cENvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGxBcmd1bWVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0luc3VmZmljaWVudCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gSHR0cENvbnRyb2xsZXIgbWV0aG9kICcgKyBzTWV0aG9kTmFtZSArICcuJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzUGF0aCBpcyBhbHdheXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgbGV0IHNQYXRoID0gYWxsQXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzUGF0aCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudHMgKHNWZXJiLCBhcnJDb25zdW1lcywgYXJyUHJvZHVjZXMpIGFyZSB1c2VkIGJ5IFJlc291cmNlTWFwcGluZ3MuZmluZC9yZXNvdXJjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNWZXJiID0gYWxsQXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyckNvbnN1bWVzID0gYWxsQXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyclByb2R1Y2VzID0gYWxsQXJndW1lbnRzWzNdO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBleGlzdGluZyByZXNvdXJjZSBvciBjcmVhdGUgYSBuZXcgb25lIGJhc2VkIG9uIHRoZSBwYXRoIChhbmQgb3RoZXIgb3B0aW9uYWwgY29uc3RyYWludHMpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHRoaXMucmVzb3VyY2VNYXBwaW5ncy5maW5kKHNQYXRoLCBzVmVyYiwgYXJyQ29uc3VtZXMsIGFyclByb2R1Y2VzKSB8fCB0aGlzLnJlc291cmNlTWFwcGluZ3MucmVzb3VyY2Uoc1BhdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgYXJndW1lbnRzICpleGNlcHQqIHRoZSBzUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VNZXRob2RBcmdzID0gYWxsQXJndW1lbnRzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICByZXNvdXJjZVtzTWV0aG9kTmFtZV0uYXBwbHkocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kQXJncyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBsaXN0ZW4ocmVxdWVzdDogYW55LCByZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMsIGZpbmRpbmcgdGhlIGJlc3QgbWF0Y2hpbmcgcmVzb3VyY2UgYW5kIGhhbmRsZXIuXG4gICAgICovXG4gICAgZXhlY3V0ZShyZXF1ZXN0PzogYW55LCByZXNwb25zZT86IGFueSk6IHZvaWQge1xuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdCB8fCBnZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoOiBzdHJpbmcgPSByZXF1ZXN0LmdldFJlc291cmNlUGF0aCgpO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgX29Db25maWd1cmF0aW9uOiBhbnkgPSB0aGlzLnJlc291cmNlTWFwcGluZ3MuY29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gbWF0Y2hSZXF1ZXN0VXJsKHJlcXVlc3RQYXRoLCBtZXRob2QsIF9vQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGxldCByZXNvdXJjZUhhbmRsZXI6IGFueTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiSGFuZGxlcnM6IGFueVtdID0gX29Db25maWd1cmF0aW9uW21hdGNoZXNbMF0uZF1bbWV0aG9kXTtcbiAgICAgICAgICAgIGlmICh2ZXJiSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUhhbmRsZXIgPSB2ZXJiSGFuZGxlcnMuZmlsdGVyKChoYW5kbGVyRGVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1lZGlhVHlwZShyZXF1ZXN0LCBoYW5kbGVyRGVmLnByb2R1Y2VzLCBoYW5kbGVyRGVmLmNvbnN1bWVzKTtcbiAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwgZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSByZXF1ZXN0LmdldFF1ZXJ5UGFyYW1ldGVyc01hcCgpIHx8IHt9O1xuICAgICAgICBjb25zdCBhY2NlcHRzSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdBY2NlcHQnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IHJlc291cmNlUGF0aDogc3RyaW5nID0gcmVxdWVzdFBhdGg7XG5cbiAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4OiBSZXF1ZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBcInBhdGhQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicXVlcnlQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXNcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXF1ZXN0XCI6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgXCJyZXFcIjogcmVxdWVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzBdLnBhdGhQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjdHgucGF0aFBhcmFtZXRlcnMgPSBtYXRjaGVzWzBdLnBhdGhQYXJhbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBsZXQgX2JlZm9yZTogRnVuY3Rpb24sIF9zZXJ2ZTogRnVuY3Rpb24sIF9jYXRjaDogRnVuY3Rpb24sIF9maW5hbGx5OiBGdW5jdGlvbjtcbiAgICAgICAgICAgIF9iZWZvcmUgPSByZXNvdXJjZUhhbmRsZXIuYmVmb3JlIHx8IG5vb3A7XG4gICAgICAgICAgICBfc2VydmUgPSByZXNvdXJjZUhhbmRsZXIuaGFuZGxlciB8fCByZXNvdXJjZUhhbmRsZXIuc2VydmUgfHwgbm9vcDtcbiAgICAgICAgICAgIF9jYXRjaCA9IHJlc291cmNlSGFuZGxlci5jYXRjaCB8fCBjYXRjaEVycm9ySGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGVIZWFkZXIuam9pbignLCcpLFxuICAgICAgICAgICAgICAgIGFjY2VwdHM6IGFjY2VwdHNIZWFkZXIuam9pbignLCcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9maW5hbGx5ID0gcmVzb3VyY2VIYW5kbGVyLmZpbmFsbHkgfHwgbm9vcDtcblxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tBcmdzOiBhbnlbXSA9IFtjdHgsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNvdXJjZUhhbmRsZXIsIHRoaXNdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgnQmVmb3JlIHNlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgIF9iZWZvcmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcblxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoJ1NlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBfc2VydmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCdTZXJ2aW5nIHJlcXVlc3QgZm9yIFJlc291cmNlW3t9XSwgTWV0aG9kW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCcsIHJlc291cmNlUGF0aCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGNvbnRlbnRUeXBlSGVhZGVyLCBhY2NlcHRzSGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncy5zcGxpY2UoMSwgMCwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhdGNoLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoX2NhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gZXJyb3IgaGFuZGxlciB0aHJldyBlcnJvcicsIF9jYXRjaEVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IF9jYXRjaEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIEh0dHBDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVJlc3BvbnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpbmFsbHkuYXBwbHkodGhpcywgW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9maW5hbGx5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gcG9zdCBoYW5kbGVyIHRocmV3IGVycm9yJywgX2ZpbmFsbHlFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc3VpdGFibGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZvdW5kJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3IocmVzcG9uc2UuQkFEX1JFUVVFU1QsIHVuZGVmaW5lZCwgJ0JhZCBSZXF1ZXN0JywgJ05vIHN1aXRhYmxlIHByb2Nlc3NvciBmb3IgdGhpcyByZXF1ZXN0LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNYXBwaW5ncyBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZ3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQgbWVkaWEgdHlwZS5cbiAgICAgKi9cbiAgICBzZW5kRXJyb3IoaHR0cEVycm9yQ29kZTogbnVtYmVyLCBhcHBsaWNhdGlvbkVycm9yQ29kZTogYW55LCBlcnJvck5hbWU6IHN0cmluZywgZXJyb3JEZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWNjZXB0TWVkaWFUeXBlczogc3RyaW5nW10gPSBub3JtYWxpemVNZWRpYVR5cGVIZWFkZXJWYWx1ZShyZXF1ZXN0LmdldEhlYWRlcignQWNjZXB0JykpIHx8IFsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBjb25zdCBpc0h0bWw6IGJvb2xlYW4gPSBjbGllbnRBY2NlcHRNZWRpYVR5cGVzLnNvbWUoKGFjY2VwdE1lZGlhVHlwZSkgPT4gaXNNaW1lVHlwZUNvbXBhdGlibGUoJyovaHRtbCcsIGFjY2VwdE1lZGlhVHlwZSkpO1xuXG4gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhodHRwRXJyb3JDb2RlIHx8IHJlc3BvbnNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7XG5cbiAgICAgICAgaWYgKGlzSHRtbCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gZXJyb3JOYW1lICsgKGFwcGxpY2F0aW9uRXJyb3JDb2RlICE9PSB1bmRlZmluZWQgPyAnWycgKyBhcHBsaWNhdGlvbkVycm9yQ29kZSArICddJyA6ICcnKSArIChlcnJvckRldGFpbHMgPyAnOiAnICsgZXJyb3JEZXRhaWxzIDogJycpO1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGh0dHBFcnJvckNvZGUgfHwgcmVzcG9uc2UuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IGFwcGxpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBlcnJvckRldGFpbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgcmVzcG9uc2UucHJpbnQoSlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VSZXNwb25zZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLlxuICAgICAqL1xuICAgIGNsb3NlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICAgIHJlc3BvbnNlLmZsdXNoKCk7XG4gICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgbWF0Y2hlZCByb3V0ZSBkZWZpbml0aW9ucywgcHJlZmVycmluZyBleGFjdCBtYXRjaGVzIG92ZXIgdGhvc2Ugd2l0aCBwbGFjZWhvbGRlcnMuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSb3V0ZURlZmluaXRpb25zU29ydGVyKHA6IGFueSwgbjogYW55KTogbnVtYmVyIHtcbiAgICBwLncgPSBjYWxjdWxhdGVNYXRjaGVkUm91dGVXZWlnaHQocCk7XG4gICAgbi53ID0gY2FsY3VsYXRlTWF0Y2hlZFJvdXRlV2VpZ2h0KG4pO1xuXG4gICAgaWYgKG4udyA9PT0gcC53KSB7XG4gICAgICAgIC8vIFRoZSBvbmUgd2l0aCBsZXNzIHBsYWNlaG9sZGVycyB3aW5zXG4gICAgICAgIGNvbnN0IG0xID0gcC5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDEgPSBtMSAhPT0gbnVsbCA/IG0xLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IG0yID0gbi5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDIgPSBtMiAhPT0gbnVsbCA/IG0yLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnNDb3VudDEgPiBwbGFjZWhvbGRlcnNDb3VudDIpIHtcbiAgICAgICAgICAgIG4udyA9IG4udyArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJzQ291bnQxIDwgcGxhY2Vob2xkZXJzQ291bnQyKSB7XG4gICAgICAgICAgICBwLncgPSBwLncgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuLncgLSBwLnc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgYSBtYXRjaGVkIHJvdXRlIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdGNoZWRSb3V0ZVdlaWdodChtYXRjaGVkUm91dGU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChtYXRjaGVkUm91dGUucGFyYW1zICYmIE9iamVjdC5rZXlzKG1hdGNoZWRSb3V0ZS5wYXJhbXMpLmxlbmd0aCA+IDApID8gMCA6IDE7IC8vIGFsd2F5cyBwcmVmZXIgZXhhY3Qgcm91dGUgZGVmaW5pdGlvbnMgLSBzZXQgd2VpZ2h0IHRvIDFcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBicmFjZXMgKGUuZy4sICcvYXBpL3twYXRoUGFyYW19JykgdG8gcGF0aC10by1yZWdleHAgZm9ybWF0IChlLmcuLCAnL2FwaS86cGF0aFBhcmFtJykuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKHBhdGhEZWZpbml0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhQYXJhbXNJbkJyYWNlc01hdGNoZXIgPSAvKHsoXFx3KlxcKj8pfSkvZzsgLy8gbWF0Y2hlcyBjYXNlcyBsaWtlICcvYXBpL3twYXRoUGFyYW19JyBvciAnL2FwaS97cGF0aFBhcmFtKn0nXG4gICAgcmV0dXJuIHBhdGhEZWZpbml0aW9uLnJlcGxhY2UocGF0aFBhcmFtc0luQnJhY2VzTWF0Y2hlciwgXCI6JDJcIik7IC8vIHRyYW5zZm9ybXMgbWF0Y2hlZCBjYXNlcyB0byAnL2FwaS86cGF0aFBhcmFtJyBvciAnL2FwaS86cGF0aFBhcmFtKidcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgcm91dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3QgcGF0aCBhbmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBtYXRjaFJlcXVlc3RVcmwocmVxdWVzdFBhdGg6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGNmZzogYW55KTogYW55W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjZmcpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBoYW5kbGVyc10pID0+IGhhbmRsZXJzICYmIChoYW5kbGVycyBhcyBhbnkpW21ldGhvZF0pXG4gICAgICAgIC5tYXAoKFtwYXRoLCBfXSkgPT4gcGF0aClcbiAgICAgICAgLnJlZHVjZSgobWF0Y2hlczogYW55W10sIHBhdGg6IHN0cmluZykgPT4gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVzLCBwYXRoLCByZXF1ZXN0UGF0aCksIFtdKVxuICAgICAgICAuc29ydChtYXRjaGVkUm91dGVEZWZpbml0aW9uc1NvcnRlcik7XG59XG5cbi8qKlxuICogUmVkdWNlciBmdW5jdGlvbiB0byBhdHRlbXB0IG1hdGNoaW5nIGEgZGVmaW5lZCBwYXRoIGFnYWluc3QgdGhlIHJlcXVlc3QgcGF0aCB1c2luZyBwYXRoLXRvLXJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVkRGVmaW5pdGlvbnM6IGFueVtdLCBkZWZpbmVkUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIC8vICdtYXRjaCcgZnJvbSBwYXRoLXRvLXJlZ2V4cCBpcyB1c2VkIGhlcmVcbiAgICBjb25zdCBwYXRoTWF0Y2hlciA9IG1hdGNoKHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKGRlZmluZWRQYXRoKSk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHBhdGhNYXRjaGVyKHJlcXVlc3RQYXRoKTtcblxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBwYXRoUGFyYW1zIGlzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnNcbiAgICAgICAgY29uc3QgcGF0aFBhcmFtcyA9IG1hdGNoZWQucGFyYW1zO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWREZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBkOiBkZWZpbmVkUGF0aCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhdGhQYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hlZERlZmluaXRpb25zLnB1c2gobWF0Y2hlZERlZmluaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlZERlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gSFRUUCBtZWRpYSB0eXBlIGhlYWRlciB2YWx1ZSAoZS5nLiwgXCJ0ZXh0L3BsYWluOyBxPTAuOSwgYXBwbGljYXRpb24vanNvblwiKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUoc01lZGlhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc01lZGlhVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNNZWRpYVR5cGUgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IG9mIGluZGl2aWR1YWwgdHlwZXNcbiAgICBsZXQgYXJyTWVkaWFUeXBlID0gc01lZGlhVHlwZS5zcGxpdCgnLCcpO1xuICAgIGFyck1lZGlhVHlwZSA9IGFyck1lZGlhVHlwZS5tYXAoKG1pbWVUeXBlRW50cnkpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGVzY2FwaW5nLCByZW1vdmUgcXVhbGl0eSBvciBvdGhlciBhdHRyaWJ1dGVzIChlLmcuLCAnOyBxPTAuOScpXG4gICAgICAgIHJldHVybiBtaW1lVHlwZUVudHJ5LnJlcGxhY2UoJ1xcXFwnLCAnJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyck1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB0eXBlLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNvdXJjZSBNSU1FIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IE1JTUUgdHlwZSwgc3VwcG9ydGluZyB3aWxkY2FyZHMgKCopLlxuICovXG5mdW5jdGlvbiBpc01pbWVUeXBlQ29tcGF0aWJsZShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoc291cmNlID09PSB0YXJnZXQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0TSA9IHRhcmdldC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHNvdXJjZU0gPSBzb3VyY2Uuc3BsaXQoJy8nKTtcblxuICAgIC8vIFRhcmdldCBpcyB3aWxkY2FyZCB0eXBlLCBTb3VyY2UgaGFzIGEgc3BlY2lmaWMgc3VidHlwZSAoZS5nLiwgdGFyZ2V0PSovanNvbiwgc291cmNlPWFwcGxpY2F0aW9uL2pzb24pXG4gICAgaWYgKHRhcmdldE1bMF0gPT09ICcqJyAmJiB0YXJnZXRNWzFdID09PSBzb3VyY2VNWzFdKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTb3VyY2UgaXMgd2lsZGNhcmQgdHlwZSwgVGFyZ2V0IGhhcyBhIHNwZWNpZmljIHN1YnR5cGUgKGUuZy4sIHNvdXJjZT0qL2pzb24sIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzBdID09PSAnKicgJiYgdGFyZ2V0TVsxXSA9PT0gc291cmNlTVsxXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUYXJnZXQgaXMgd2lsZGNhcmQgc3VidHlwZSwgU291cmNlIGhhcyBhIHNwZWNpZmljIHR5cGUgKGUuZy4sIHRhcmdldD1hcHBsaWNhdGlvbi8qLCBzb3VyY2U9YXBwbGljYXRpb24vanNvbilcbiAgICBpZiAodGFyZ2V0TVsxXSA9PT0gJyonICYmIHRhcmdldE1bMF0gPT09IHNvdXJjZU1bMF0pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNvdXJjZSBpcyB3aWxkY2FyZCBzdWJ0eXBlLCBUYXJnZXQgaGFzIGEgc3BlY2lmaWMgdHlwZSAoZS5nLiwgc291cmNlPWFwcGxpY2F0aW9uLyosIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzFdID09PSAnKicgJiYgdGFyZ2V0TVswXSA9PT0gc291cmNlTVswXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICovXG5jb25zdCBjYXRjaEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICh0aGlzOiBIdHRwQ29udHJvbGxlciwgbG9nY3R4OiBhbnksIGN0eDogUmVxdWVzdENvbnRleHQsIGVycjogYW55LCByZXF1ZXN0OiBhbnksIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY3R4LnN1cHByZXNzU3RhY2spIHtcbiAgICAgICAgY29uc3QgZGV0YWlsc01zZyA9IChjdHguZXJyb3JOYW1lIHx8IFwiXCIpICsgKGN0eC5lcnJvckNvZGUgPyBcIiBbXCIgKyBjdHguZXJyb3JDb2RlICsgXCJdXCIgOiBcIlwiKSArIChjdHguZXJyb3JNZXNzYWdlID8gXCI6IFwiICsgY3R4LmVycm9yTWVzc2FnZSA6IFwiXCIpO1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VydmluZyByZXNvdXJjZVt7fV0sIFZlcmJbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZpbmlzaGVkIGluIGVycm9yLiB7fScsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBkZXRhaWxzTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1NlcnZpbmcgcmVzb3VyY2Vbe31dLCBWZXJiW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCBpbiBlcnJvcicsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGh0dHBFcnJvckNvZGUgPSBjdHguaHR0cEVycm9yQ29kZSB8fCByZXNwb25zZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY3R4LmVycm9yTWVzc2FnZSB8fCAoZXJyICYmIGVyci5tZXNzYWdlKTtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBjdHguZXJyb3JOYW1lIHx8IChlcnIgJiYgZXJyLm5hbWUpO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGN0eC5lcnJvckNvZGU7XG5cbiAgICB0aGlzLnNlbmRFcnJvcihodHRwRXJyb3JDb2RlLCBlcnJvckNvZGUsIGVycm9yTmFtZSwgZXJyb3JNZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IG1lZGlhIHR5cGVzIG1hdGNoIHRoZSByZXNvdXJjZSBoYW5kbGVyJ3MgY29uc3VtZXMgYW5kIHByb2R1Y2VzIGNvbnN0cmFpbnRzLlxuICovXG5jb25zdCBtYXRjaE1lZGlhVHlwZSA9IGZ1bmN0aW9uIChyZXF1ZXN0OiBhbnksIHByb2R1Y2VzTWVkaWFUeXBlczogc3RyaW5nW10sIGNvbnN1bWVzTWVkaWFUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBsZXQgaXNQcm9kdWNlTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjY2VwdHNNZWRpYVR5cGVzID0gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoJ0FjY2VwdCcpKTtcblxuICAgIC8vIDEuIENoZWNrIFByb2R1Y2VzIChBY2NlcHRzIGhlYWRlcilcbiAgICBpZiAoIWFjY2VwdHNNZWRpYVR5cGVzIHx8IGFjY2VwdHNNZWRpYVR5cGVzLmxlbmd0aCA9PT0gMCB8fCBhY2NlcHRzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gT3V0cHV0IG1lZGlhIHR5cGUgaXMgbm90IHJlc3RyaWN0ZWQgYnkgY2xpZW50IG9yIGNsaWVudCBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzUHJvZHVjZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9kdWNlc01lZGlhVHlwZXMgJiYgcHJvZHVjZXNNZWRpYVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y2VzTUlNRSA9IGFjY2VwdHNNZWRpYVR5cGVzLmZpbHRlcigoYWNjZXB0c01lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWNlc01lZGlhVHlwZXMuc29tZSgocHJvZHVjZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGFjY2VwdHNNZWRpYVR5cGUsIHByb2R1Y2VzTWVkaWFUeXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IG1hdGNoZWRQcm9kdWNlc01JTUUgJiYgbWF0Y2hlZFByb2R1Y2VzTUlNRS5sZW5ndGggPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2UgZG9lc24ndCBzcGVjaWZ5IHByb2R1Y2VzLCBzbyBpdCBtYXRjaGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyBhbnl0aGluZyBvciBpZiBwcm9kdWNlcyBpcyBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBDb25zdW1lcyAoQ29udGVudC1UeXBlIGhlYWRlcilcbiAgICBsZXQgaXNDb25zdW1lTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlTWVkaWFUeXBlcyA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7XG5cbiAgICBpZiAoIWNvbnN1bWVzTWVkaWFUeXBlcyB8fCBjb25zdW1lc01lZGlhVHlwZXMubGVuZ3RoID09PSAwIHx8IGNvbnN1bWVzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gSW5wdXQgbWVkaWEgdHlwZSBpcyBub3QgcmVzdHJpY3RlZCBieSByZXNvdXJjZSBvciByZXNvdXJjZSBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50VHlwZU1lZGlhVHlwZXMgJiYgY29uc3VtZXNNZWRpYVR5cGVzICYmIGNvbnN1bWVzTWVkaWFUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb25zdW1lc01JTUUgPSBjb250ZW50VHlwZU1lZGlhVHlwZXMuZmlsdGVyKChjb250ZW50VHlwZU1lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lc01lZGlhVHlwZXMuc29tZSgoY29uc3VtZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGNvbnRlbnRUeXBlTWVkaWFUeXBlLCBjb25zdW1lc01lZGlhVHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSBtYXRjaGVkQ29uc3VtZXNNSU1FICYmIG1hdGNoZWRDb25zdW1lc01JTUUubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1Byb2R1Y2VNYXRjaGVkICYmIGlzQ29uc3VtZU1hdGNoZWQ7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxZQUFZLGdCQUFnQjtBQUNyQyxTQUFTLFdBQVcsZUFBZTtBQUNuQyxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGVBQWU7QUFJeEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxpQkFBaUIsZ0RBQWdEO0FBRW5GLE1BQU0sU0FBYyxRQUFRLFVBQVUsb0JBQW9CO0FBb0IxRCxTQUFTLGFBQWtCO0FBQ3ZCLFNBQU87QUFDWDtBQUNBLFNBQVMsY0FBbUI7QUFDeEIsU0FBTztBQUNYO0FBUU8sU0FBUyxRQUFRLFNBQStCO0FBQ25ELE1BQUk7QUFDSixNQUFJLFlBQVksUUFBVztBQUN2QixRQUFJLE9BQU8s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QUNySSxNQUFJLElBQUksZUFBZTtBQUNuQixVQUFNLGNBQWMsSUFBSSxhQUFhLE9BQU8sSUFBSSxZQUFZLE9BQU8sSUFBSSxZQUFZLE1BQU0sT0FBTyxJQUFJLGVBQWUsT0FBTyxJQUFJLGVBQWU7QUFDN0ksV0FBTyxLQUFLLHNGQUFzRixPQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sYUFBYSxPQUFPLFNBQVMsVUFBVTtBQUFBLEVBQ2hMLE9BQU87QUFDSCxXQUFPLE1BQU0sa0ZBQWtGLE9BQU8sTUFBTSxPQUFPLFFBQVEsT0FBTyxhQUFhLE9BQU8sU0FBUyxHQUFHO0FBQUEsRUFDdEs7QUFFQSxRQUFNLGdCQUFnQixJQUFJLGlCQUFpQkEsVUFBUztBQUNwRCxRQUFNLGVBQWUsSUFBSSxnQkFBaUIsT0FBTyxJQUFJO0FBQ3JELFFBQU0sWUFBWSxJQUFJLGFBQWMsT0FBTyxJQUFJO0FBQy9DLFFBQU0sWUFBWSxJQUFJO0FBRXRCLE9BQUssVUFBVSxlQUFlLFdBQVcsV0FBVyxZQUFZO0FBQ3BFO0FBS0EsTUFBTSxpQkFBaUIsU0FBVUQsVUFBYyxvQkFBOEIsb0JBQXVDO0FBQ2hILE1BQUksbUJBQW1CO0FBQ3ZCLFFBQU0sb0JBQW9CLDhCQUE4QkEsU0FBUSxVQUFVLFFBQVEsQ0FBQztBQUduRixNQUFJLENBQUMscUJBQXFCLGtCQUFrQixXQUFXLEtBQUssa0JBQWtCLFNBQVMsS0FBSyxHQUFHO0FBRTNGLHVCQUFtQjtBQUFBLEVBQ3ZCLE9BQU87QUFDSCxRQUFJLHNCQUFzQixtQkFBbUIsUUFBUTtBQUNqRCxZQUFNLHNCQUFzQixrQkFBa0IsT0FBTyxDQUFDLHFCQUFxQjtBQUN2RSxlQUFPLG1CQUFtQixLQUFLLENBQUMsc0JBQXNCO0FBQ2xELGlCQUFPLHFCQUFxQixrQkFBa0IsaUJBQWlCO0FBQUEsUUFDbkUsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUNELHlCQUFtQix1QkFBdUIsb0JBQW9CLFNBQVM7QUFBQSxJQUMzRSxPQUFPO0FBRUgseUJBQW1CO0FBQUEsSUFDdkI7QUFBQSxFQUNKO0FBR0EsTUFBSSxtQkFBbUI7QUFDdkIsUUFBTSx3QkFBd0IsOEJBQThCQSxTQUFRLGVBQWUsQ0FBQztBQUVwRixNQUFJLENBQUMsc0JBQXNCLG1CQUFtQixXQUFXLEtBQUssbUJBQW1CLFNBQVMsS0FBSyxHQUFHO0FBRTlGLHVCQUFtQjtBQUFBLEVBQ3ZCLE9BQU87QUFDSCxRQUFJLHlCQUF5QixzQkFBc0IsbUJBQW1CLFFBQVE7QUFDMUUsWUFBTSxzQkFBc0Isc0JBQXNCLE9BQU8sQ0FBQyx5QkFBeUI7QUFDL0UsZUFBTyxtQkFBbUIsS0FBSyxDQUFDLHNCQUFzQjtBQUNsRCxpQkFBTyxxQkFBcUIsc0JBQXNCLGlCQUFpQjtBQUFBLFFBQ3ZFLENBQUM7QUFBQSxNQUNMLENBQUM7QUFDRCx5QkFBbUIsdUJBQXVCLG9CQUFvQixTQUFTO0FBQUEsSUFDM0U7QUFBQSxFQUNKO0FBRUEsU0FBTyxvQkFBb0I7QUFDL0I7IiwKICAibmFtZXMiOiBbInJlcXVlc3QiLCAicmVzcG9uc2UiXQp9Cg==
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2h0dHAvcnMvcmVzb3VyY2UtaHR0cC1jb250cm9sbGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSZXNwb25zZSBhcyByZXNwb25zZSB9IGZyb20gXCIuLi9yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdCBhcyByZXF1ZXN0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZ3MgfSBmcm9tIFwiLi9yZXNvdXJjZS1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5cbi8vIERlY2xhcmF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgZGlyaWdpYmxlUmVxdWlyZSBmdW5jdGlvbiBhbmQgaXRzIGRlcGVuZGVuY3lcbmRlY2xhcmUgZnVuY3Rpb24gZGlyaWdpYmxlUmVxdWlyZShtb2R1bGU6IHN0cmluZyk6IGFueTtcbmNvbnN0IHsgbWF0Y2ggfSA9IGRpcmlnaWJsZVJlcXVpcmUoXCJtb2R1bGVzL3NyYy9odHRwL3BhdGgtdG8tcmVnZXhwLzYuMi4xL2luZGV4LmpzXCIpO1xuXG5jb25zdCBsb2dnZXI6IGFueSA9IExvZ2dpbmcuZ2V0TG9nZ2VyKCdodHRwLnJzLmNvbnRyb2xsZXInKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbnMgKGJlZm9yZSwgc2VydmUsIGNhdGNoKS5cbiAqL1xuaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgICBwYXRoUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBxdWVyeVBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzcG9uc2U6IGFueTtcbiAgICByZXM6IGFueTtcbiAgICByZXF1ZXN0OiBhbnk7XG4gICAgcmVxOiBhbnk7XG4gICAgLy8gQ29udGV4dCBwcm9wZXJ0aWVzIGZvciBlcnJvciBoYW5kbGluZyBtaWdodCBhbHNvIGJlIGF0dGFjaGVkIGhlcmVcbiAgICBzdXBwcmVzc1N0YWNrPzogYm9vbGVhbjtcbiAgICBodHRwRXJyb3JDb2RlPzogbnVtYmVyO1xuICAgIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgICBlcnJvck5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogYW55O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZSgpOiBhbnkge1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSAoSHR0cENvbnRyb2xsZXIpIGluc3RhbmNlLCBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggb01hcHBpbmdzLlxuICpcbiAqIEBwYXJhbSBvQ29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIGNvbmZpZ3VyYXRpb24gYnVpbGRlciB3aXRoIGNvbmZpZ3VyYXRpb24oKSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIG5ldyBIdHRwQ29udHJvbGxlciBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2Uob0NvbmZpZz86IGFueSk6IEh0dHBDb250cm9sbGVyIHtcbiAgICBsZXQgY29uZmlnOiBSZXNvdXJjZU1hcHBpbmdzIHwgYW55O1xuICAgIGlmIChvQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvQ29uZmlnID09PSAnb2JqZWN0JyB8fCBvQ29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VNYXBwaW5ncykge1xuICAgICAgICAgICAgY29uZmlnID0gb0NvbmZpZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0dHBDb250cm9sbGVyKGNvbmZpZyk7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMgYW5kIHJvdXRpbmcgdGhlbSB0byB0aGUgY29ycmVjdCByZXNvdXJjZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDb250cm9sbGVyIHtcblxuICAgIHJlc291cmNlOiBGdW5jdGlvbjtcbiAgICByZXNvdXJjZVBhdGg6IEZ1bmN0aW9uO1xuICAgIHJlc291cmNlTWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ3M7XG5cbiAgICAvLyBJbmRleCBzaWduYXR1cmUgdG8gYWxsb3cgZHluYW1pYyBtZXRob2QgYXNzaWdubWVudCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgSHR0cENvbnRyb2xsZXIgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9NYXBwaW5ncyBUaGUgbWFwcGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9NYXBwaW5ncz86IFJlc291cmNlTWFwcGluZ3MgfCBhbnkpIHtcbiAgICAgICAgaWYgKG9NYXBwaW5ncyBpbnN0YW5jZW9mIFJlc291cmNlTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNYXBwaW5ncyA9IG9NYXBwaW5ncztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb01hcHBpbmdzID09PSAnb2JqZWN0JyB8fCBvTWFwcGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Mob01hcHBpbmdzLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaWYgaW5wdXQgaXMgdW5leHBlY3RlZFxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gbmV3IFJlc291cmNlTWFwcGluZ3Moe30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxpYXMgZm9yIHJlc291cmNlTWFwcGluZ3MucmVzb3VyY2VcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZU1hcHBpbmdzLnJlc291cmNlUGF0aC5iaW5kKHRoaXMucmVzb3VyY2VNYXBwaW5ncyk7XG5cbiAgICAgICAgLy8gd2VhdmUtaW4gSFRUUCBtZXRob2QtYmFzZWQgZmFjdG9yeSBmdW5jdGlvbnMgLSBzaG9ydGN1dCBmb3Igc2VydmljZSgpLnJlc291cmNlKHNQYXRoKS5tZXRob2RcbiAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3JlbW92ZScsICdtZXRob2QnXS5mb3JFYWNoKChzTWV0aG9kTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzW3NNZXRob2ROYW1lXSA9ICguLi5hbGxBcmd1bWVudHM6IGFueVtdKTogSHR0cENvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGxBcmd1bWVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0luc3VmZmljaWVudCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gSHR0cENvbnRyb2xsZXIgbWV0aG9kICcgKyBzTWV0aG9kTmFtZSArICcuJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzUGF0aCBpcyBhbHdheXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgICAgICAgbGV0IHNQYXRoID0gYWxsQXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzUGF0aCA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudHMgKHNWZXJiLCBhcnJDb25zdW1lcywgYXJyUHJvZHVjZXMpIGFyZSB1c2VkIGJ5IFJlc291cmNlTWFwcGluZ3MuZmluZC9yZXNvdXJjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNWZXJiID0gYWxsQXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyckNvbnN1bWVzID0gYWxsQXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyclByb2R1Y2VzID0gYWxsQXJndW1lbnRzWzNdO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBleGlzdGluZyByZXNvdXJjZSBvciBjcmVhdGUgYSBuZXcgb25lIGJhc2VkIG9uIHRoZSBwYXRoIChhbmQgb3RoZXIgb3B0aW9uYWwgY29uc3RyYWludHMpXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHRoaXMucmVzb3VyY2VNYXBwaW5ncy5maW5kKHNQYXRoLCBzVmVyYiwgYXJyQ29uc3VtZXMsIGFyclByb2R1Y2VzKSB8fCB0aGlzLnJlc291cmNlTWFwcGluZ3MucmVzb3VyY2Uoc1BhdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgYXJndW1lbnRzICpleGNlcHQqIHRoZSBzUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VNZXRob2RBcmdzID0gYWxsQXJndW1lbnRzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICByZXNvdXJjZVtzTWV0aG9kTmFtZV0uYXBwbHkocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kQXJncyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBsaXN0ZW4ocmVxdWVzdDogYW55LCByZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMsIGZpbmRpbmcgdGhlIGJlc3QgbWF0Y2hpbmcgcmVzb3VyY2UgYW5kIGhhbmRsZXIuXG4gICAgICovXG4gICAgZXhlY3V0ZShyZXF1ZXN0PzogYW55LCByZXNwb25zZT86IGFueSk6IHZvaWQge1xuICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdCB8fCBnZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoOiBzdHJpbmcgPSByZXF1ZXN0LmdldFJlc291cmNlUGF0aCgpO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgX29Db25maWd1cmF0aW9uOiBhbnkgPSB0aGlzLnJlc291cmNlTWFwcGluZ3MuY29uZmlndXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IGFueVtdID0gbWF0Y2hSZXF1ZXN0VXJsKHJlcXVlc3RQYXRoLCBtZXRob2QsIF9vQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGxldCByZXNvdXJjZUhhbmRsZXI6IGFueTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiSGFuZGxlcnM6IGFueVtdID0gX29Db25maWd1cmF0aW9uW21hdGNoZXNbMF0uZF1bbWV0aG9kXTtcbiAgICAgICAgICAgIGlmICh2ZXJiSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUhhbmRsZXIgPSB2ZXJiSGFuZGxlcnMuZmlsdGVyKChoYW5kbGVyRGVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1lZGlhVHlwZShyZXF1ZXN0LCBoYW5kbGVyRGVmLnByb2R1Y2VzLCBoYW5kbGVyRGVmLmNvbnN1bWVzKTtcbiAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwgZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSByZXF1ZXN0LmdldFF1ZXJ5UGFyYW1ldGVyc01hcCgpIHx8IHt9O1xuICAgICAgICBjb25zdCBhY2NlcHRzSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdBY2NlcHQnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmdbXSA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgfHwgW107XG4gICAgICAgIGNvbnN0IHJlc291cmNlUGF0aDogc3RyaW5nID0gcmVxdWVzdFBhdGg7XG5cbiAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4OiBSZXF1ZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBcInBhdGhQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicXVlcnlQYXJhbWV0ZXJzXCI6IHt9LFxuICAgICAgICAgICAgICAgIFwicmVzcG9uc2VcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXNcIjogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgXCJyZXF1ZXN0XCI6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgXCJyZXFcIjogcmVxdWVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzBdLnBhdGhQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBjdHgucGF0aFBhcmFtZXRlcnMgPSBtYXRjaGVzWzBdLnBhdGhQYXJhbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgICAgICBsZXQgX2JlZm9yZTogRnVuY3Rpb24sIF9zZXJ2ZTogRnVuY3Rpb24sIF9jYXRjaDogRnVuY3Rpb24sIF9maW5hbGx5OiBGdW5jdGlvbjtcbiAgICAgICAgICAgIF9iZWZvcmUgPSByZXNvdXJjZUhhbmRsZXIuYmVmb3JlIHx8IG5vb3A7XG4gICAgICAgICAgICBfc2VydmUgPSByZXNvdXJjZUhhbmRsZXIuaGFuZGxlciB8fCByZXNvdXJjZUhhbmRsZXIuc2VydmUgfHwgbm9vcDtcbiAgICAgICAgICAgIF9jYXRjaCA9IHJlc291cmNlSGFuZGxlci5jYXRjaCB8fCBjYXRjaEVycm9ySGFuZGxlci5iaW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGVIZWFkZXIuam9pbignLCcpLFxuICAgICAgICAgICAgICAgIGFjY2VwdHM6IGFjY2VwdHNIZWFkZXIuam9pbignLCcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9maW5hbGx5ID0gcmVzb3VyY2VIYW5kbGVyLmZpbmFsbHkgfHwgbm9vcDtcblxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tBcmdzOiBhbnlbXSA9IFtjdHgsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNvdXJjZUhhbmRsZXIsIHRoaXNdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgnQmVmb3JlIHNlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgIF9iZWZvcmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcblxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoJ1NlcnZpbmcgcmVxdWVzdCBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBfc2VydmUuYXBwbHkodGhpcywgY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCdTZXJ2aW5nIHJlcXVlc3QgZm9yIFJlc291cmNlW3t9XSwgTWV0aG9kW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCcsIHJlc291cmNlUGF0aCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGNvbnRlbnRUeXBlSGVhZGVyLCBhY2NlcHRzSGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncy5zcGxpY2UoMSwgMCwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhdGNoLmFwcGx5KHRoaXMsIGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoX2NhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gZXJyb3IgaGFuZGxlciB0aHJldyBlcnJvcicsIF9jYXRjaEVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IF9jYXRjaEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIEh0dHBDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVJlc3BvbnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpbmFsbHkuYXBwbHkodGhpcywgW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9maW5hbGx5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2VydmluZyByZXF1ZXN0IGZvciBSZXNvdXJjZVt7fV0sIE1ldGhvZFt7fV0sIENvbnRlbnQtVHlwZVt7fV0sIEFjY2VwdFt7fV0gcG9zdCBoYW5kbGVyIHRocmV3IGVycm9yJywgX2ZpbmFsbHlFcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc3VpdGFibGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgUmVzb3VyY2Vbe31dLCBNZXRob2Rbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZvdW5kJywgcmVzb3VyY2VQYXRoLCBtZXRob2QudG9VcHBlckNhc2UoKSwgY29udGVudFR5cGVIZWFkZXIsIGFjY2VwdHNIZWFkZXIpO1xuXHRcdFx0bG9nZ2VyLmVycm9yKCdSZWdpc3RlcmVkIHJlc291cmNlIGhhbmRsZXJzIGZvciBSZXNvdXJjZVt7fV0gYXJlIFt7fV0nLCByZXNvdXJjZVBhdGgsIEpTT04uc3RyaW5naWZ5KF9vQ29uZmlndXJhdGlvbikpO1xuICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3IocmVzcG9uc2UuQkFEX1JFUVVFU1QsIHVuZGVmaW5lZCwgJ0JhZCBSZXF1ZXN0JywgJ05vIHN1aXRhYmxlIHByb2Nlc3NvciBmb3IgdGhpcyByZXF1ZXN0LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUmVzb3VyY2VNYXBwaW5ncyBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZ3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQgbWVkaWEgdHlwZS5cbiAgICAgKi9cbiAgICBzZW5kRXJyb3IoaHR0cEVycm9yQ29kZTogbnVtYmVyLCBhcHBsaWNhdGlvbkVycm9yQ29kZTogYW55LCBlcnJvck5hbWU6IHN0cmluZywgZXJyb3JEZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWNjZXB0TWVkaWFUeXBlczogc3RyaW5nW10gPSBub3JtYWxpemVNZWRpYVR5cGVIZWFkZXJWYWx1ZShyZXF1ZXN0LmdldEhlYWRlcignQWNjZXB0JykpIHx8IFsnYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBjb25zdCBpc0h0bWw6IGJvb2xlYW4gPSBjbGllbnRBY2NlcHRNZWRpYVR5cGVzLnNvbWUoKGFjY2VwdE1lZGlhVHlwZSkgPT4gaXNNaW1lVHlwZUNvbXBhdGlibGUoJyovaHRtbCcsIGFjY2VwdE1lZGlhVHlwZSkpO1xuXG4gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhodHRwRXJyb3JDb2RlIHx8IHJlc3BvbnNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7XG5cbiAgICAgICAgaWYgKGlzSHRtbCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gZXJyb3JOYW1lICsgKGFwcGxpY2F0aW9uRXJyb3JDb2RlICE9PSB1bmRlZmluZWQgPyAnWycgKyBhcHBsaWNhdGlvbkVycm9yQ29kZSArICddJyA6ICcnKSArIChlcnJvckRldGFpbHMgPyAnOiAnICsgZXJyb3JEZXRhaWxzIDogJycpO1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGh0dHBFcnJvckNvZGUgfHwgcmVzcG9uc2UuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IGFwcGxpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBlcnJvckRldGFpbHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgcmVzcG9uc2UucHJpbnQoSlNPTi5zdHJpbmdpZnkoYm9keSwgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VSZXNwb25zZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLlxuICAgICAqL1xuICAgIGNsb3NlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICAgIHJlc3BvbnNlLmZsdXNoKCk7XG4gICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgbWF0Y2hlZCByb3V0ZSBkZWZpbml0aW9ucywgcHJlZmVycmluZyBleGFjdCBtYXRjaGVzIG92ZXIgdGhvc2Ugd2l0aCBwbGFjZWhvbGRlcnMuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSb3V0ZURlZmluaXRpb25zU29ydGVyKHA6IGFueSwgbjogYW55KTogbnVtYmVyIHtcbiAgICBwLncgPSBjYWxjdWxhdGVNYXRjaGVkUm91dGVXZWlnaHQocCk7XG4gICAgbi53ID0gY2FsY3VsYXRlTWF0Y2hlZFJvdXRlV2VpZ2h0KG4pO1xuXG4gICAgaWYgKG4udyA9PT0gcC53KSB7XG4gICAgICAgIC8vIFRoZSBvbmUgd2l0aCBsZXNzIHBsYWNlaG9sZGVycyB3aW5zXG4gICAgICAgIGNvbnN0IG0xID0gcC5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDEgPSBtMSAhPT0gbnVsbCA/IG0xLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IG0yID0gbi5kLm1hdGNoKC97KC4qPyl9L2cpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNDb3VudDIgPSBtMiAhPT0gbnVsbCA/IG0yLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnNDb3VudDEgPiBwbGFjZWhvbGRlcnNDb3VudDIpIHtcbiAgICAgICAgICAgIG4udyA9IG4udyArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJzQ291bnQxIDwgcGxhY2Vob2xkZXJzQ291bnQyKSB7XG4gICAgICAgICAgICBwLncgPSBwLncgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuLncgLSBwLnc7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgYSBtYXRjaGVkIHJvdXRlIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdGNoZWRSb3V0ZVdlaWdodChtYXRjaGVkUm91dGU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChtYXRjaGVkUm91dGUucGFyYW1zICYmIE9iamVjdC5rZXlzKG1hdGNoZWRSb3V0ZS5wYXJhbXMpLmxlbmd0aCA+IDApID8gMCA6IDE7IC8vIGFsd2F5cyBwcmVmZXIgZXhhY3Qgcm91dGUgZGVmaW5pdGlvbnMgLSBzZXQgd2VpZ2h0IHRvIDFcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHBhdGggcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBicmFjZXMgKGUuZy4sICcvYXBpL3twYXRoUGFyYW19JykgdG8gcGF0aC10by1yZWdleHAgZm9ybWF0IChlLmcuLCAnL2FwaS86cGF0aFBhcmFtJykuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKHBhdGhEZWZpbml0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhQYXJhbXNJbkJyYWNlc01hdGNoZXIgPSAvKHsoXFx3KlxcKj8pfSkvZzsgLy8gbWF0Y2hlcyBjYXNlcyBsaWtlICcvYXBpL3twYXRoUGFyYW19JyBvciAnL2FwaS97cGF0aFBhcmFtKn0nXG4gICAgcmV0dXJuIHBhdGhEZWZpbml0aW9uLnJlcGxhY2UocGF0aFBhcmFtc0luQnJhY2VzTWF0Y2hlciwgXCI6JDJcIik7IC8vIHRyYW5zZm9ybXMgbWF0Y2hlZCBjYXNlcyB0byAnL2FwaS86cGF0aFBhcmFtJyBvciAnL2FwaS86cGF0aFBhcmFtKidcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgcm91dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3QgcGF0aCBhbmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBtYXRjaFJlcXVlc3RVcmwocmVxdWVzdFBhdGg6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGNmZzogYW55KTogYW55W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjZmcpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBoYW5kbGVyc10pID0+IGhhbmRsZXJzICYmIChoYW5kbGVycyBhcyBhbnkpW21ldGhvZF0pXG4gICAgICAgIC5tYXAoKFtwYXRoLCBfXSkgPT4gcGF0aClcbiAgICAgICAgLnJlZHVjZSgobWF0Y2hlczogYW55W10sIHBhdGg6IHN0cmluZykgPT4gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVzLCBwYXRoLCByZXF1ZXN0UGF0aCksIFtdKVxuICAgICAgICAuc29ydChtYXRjaGVkUm91dGVEZWZpbml0aW9uc1NvcnRlcik7XG59XG5cbi8qKlxuICogUmVkdWNlciBmdW5jdGlvbiB0byBhdHRlbXB0IG1hdGNoaW5nIGEgZGVmaW5lZCBwYXRoIGFnYWluc3QgdGhlIHJlcXVlc3QgcGF0aCB1c2luZyBwYXRoLXRvLXJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdSb3V0ZURlZmluaXRpb25zUmVkdWNlcihtYXRjaGVkRGVmaW5pdGlvbnM6IGFueVtdLCBkZWZpbmVkUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIC8vICdtYXRjaCcgZnJvbSBwYXRoLXRvLXJlZ2V4cCBpcyB1c2VkIGhlcmVcbiAgICBjb25zdCBwYXRoTWF0Y2hlciA9IG1hdGNoKHRyYW5zZm9ybVBhdGhQYXJhbXNEZWNsYXJlZEluQnJhY2VzKGRlZmluZWRQYXRoKSk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHBhdGhNYXRjaGVyKHJlcXVlc3RQYXRoKTtcblxuICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBwYXRoUGFyYW1zIGlzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnNcbiAgICAgICAgY29uc3QgcGF0aFBhcmFtcyA9IG1hdGNoZWQucGFyYW1zO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWREZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgcDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBkOiBkZWZpbmVkUGF0aCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhdGhQYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hlZERlZmluaXRpb25zLnB1c2gobWF0Y2hlZERlZmluaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlZERlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gSFRUUCBtZWRpYSB0eXBlIGhlYWRlciB2YWx1ZSAoZS5nLiwgXCJ0ZXh0L3BsYWluOyBxPTAuOSwgYXBwbGljYXRpb24vanNvblwiKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUoc01lZGlhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc01lZGlhVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNNZWRpYVR5cGUgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IG9mIGluZGl2aWR1YWwgdHlwZXNcbiAgICBsZXQgYXJyTWVkaWFUeXBlID0gc01lZGlhVHlwZS5zcGxpdCgnLCcpO1xuICAgIGFyck1lZGlhVHlwZSA9IGFyck1lZGlhVHlwZS5tYXAoKG1pbWVUeXBlRW50cnkpID0+IHtcbiAgICAgICAgLy8gcmVtb3ZlIGVzY2FwaW5nLCByZW1vdmUgcXVhbGl0eSBvciBvdGhlciBhdHRyaWJ1dGVzIChlLmcuLCAnOyBxPTAuOScpXG4gICAgICAgIHJldHVybiBtaW1lVHlwZUVudHJ5LnJlcGxhY2UoJ1xcXFwnLCAnJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFyck1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB0eXBlLmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNvdXJjZSBNSU1FIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IE1JTUUgdHlwZSwgc3VwcG9ydGluZyB3aWxkY2FyZHMgKCopLlxuICovXG5mdW5jdGlvbiBpc01pbWVUeXBlQ29tcGF0aWJsZShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoc291cmNlID09PSB0YXJnZXQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0TSA9IHRhcmdldC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHNvdXJjZU0gPSBzb3VyY2Uuc3BsaXQoJy8nKTtcblxuICAgIC8vIFRhcmdldCBpcyB3aWxkY2FyZCB0eXBlLCBTb3VyY2UgaGFzIGEgc3BlY2lmaWMgc3VidHlwZSAoZS5nLiwgdGFyZ2V0PSovanNvbiwgc291cmNlPWFwcGxpY2F0aW9uL2pzb24pXG4gICAgaWYgKHRhcmdldE1bMF0gPT09ICcqJyAmJiB0YXJnZXRNWzFdID09PSBzb3VyY2VNWzFdKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTb3VyY2UgaXMgd2lsZGNhcmQgdHlwZSwgVGFyZ2V0IGhhcyBhIHNwZWNpZmljIHN1YnR5cGUgKGUuZy4sIHNvdXJjZT0qL2pzb24sIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzBdID09PSAnKicgJiYgdGFyZ2V0TVsxXSA9PT0gc291cmNlTVsxXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUYXJnZXQgaXMgd2lsZGNhcmQgc3VidHlwZSwgU291cmNlIGhhcyBhIHNwZWNpZmljIHR5cGUgKGUuZy4sIHRhcmdldD1hcHBsaWNhdGlvbi8qLCBzb3VyY2U9YXBwbGljYXRpb24vanNvbilcbiAgICBpZiAodGFyZ2V0TVsxXSA9PT0gJyonICYmIHRhcmdldE1bMF0gPT09IHNvdXJjZU1bMF0pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNvdXJjZSBpcyB3aWxkY2FyZCBzdWJ0eXBlLCBUYXJnZXQgaGFzIGEgc3BlY2lmaWMgdHlwZSAoZS5nLiwgc291cmNlPWFwcGxpY2F0aW9uLyosIHRhcmdldD1hcHBsaWNhdGlvbi9qc29uKVxuICAgIGlmIChzb3VyY2VNWzFdID09PSAnKicgJiYgdGFyZ2V0TVswXSA9PT0gc291cmNlTVswXSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICovXG5jb25zdCBjYXRjaEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICh0aGlzOiBIdHRwQ29udHJvbGxlciwgbG9nY3R4OiBhbnksIGN0eDogUmVxdWVzdENvbnRleHQsIGVycjogYW55LCByZXF1ZXN0OiBhbnksIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY3R4LnN1cHByZXNzU3RhY2spIHtcbiAgICAgICAgY29uc3QgZGV0YWlsc01zZyA9IChjdHguZXJyb3JOYW1lIHx8IFwiXCIpICsgKGN0eC5lcnJvckNvZGUgPyBcIiBbXCIgKyBjdHguZXJyb3JDb2RlICsgXCJdXCIgOiBcIlwiKSArIChjdHguZXJyb3JNZXNzYWdlID8gXCI6IFwiICsgY3R4LmVycm9yTWVzc2FnZSA6IFwiXCIpO1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VydmluZyByZXNvdXJjZVt7fV0sIFZlcmJbe31dLCBDb250ZW50LVR5cGVbe31dLCBBY2NlcHRbe31dIGZpbmlzaGVkIGluIGVycm9yLiB7fScsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBkZXRhaWxzTXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1NlcnZpbmcgcmVzb3VyY2Vbe31dLCBWZXJiW3t9XSwgQ29udGVudC1UeXBlW3t9XSwgQWNjZXB0W3t9XSBmaW5pc2hlZCBpbiBlcnJvcicsIGxvZ2N0eC5wYXRoLCBsb2djdHgubWV0aG9kLCBsb2djdHguY29udGVudFR5cGUsIGxvZ2N0eC5hY2NlcHRzLCBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGh0dHBFcnJvckNvZGUgPSBjdHguaHR0cEVycm9yQ29kZSB8fCByZXNwb25zZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY3R4LmVycm9yTWVzc2FnZSB8fCAoZXJyICYmIGVyci5tZXNzYWdlKTtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBjdHguZXJyb3JOYW1lIHx8IChlcnIgJiYgZXJyLm5hbWUpO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGN0eC5lcnJvckNvZGU7XG5cbiAgICB0aGlzLnNlbmRFcnJvcihodHRwRXJyb3JDb2RlLCBlcnJvckNvZGUsIGVycm9yTmFtZSwgZXJyb3JNZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSByZXF1ZXN0IG1lZGlhIHR5cGVzIG1hdGNoIHRoZSByZXNvdXJjZSBoYW5kbGVyJ3MgY29uc3VtZXMgYW5kIHByb2R1Y2VzIGNvbnN0cmFpbnRzLlxuICovXG5jb25zdCBtYXRjaE1lZGlhVHlwZSA9IGZ1bmN0aW9uIChyZXF1ZXN0OiBhbnksIHByb2R1Y2VzTWVkaWFUeXBlczogc3RyaW5nW10sIGNvbnN1bWVzTWVkaWFUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBsZXQgaXNQcm9kdWNlTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjY2VwdHNNZWRpYVR5cGVzID0gbm9ybWFsaXplTWVkaWFUeXBlSGVhZGVyVmFsdWUocmVxdWVzdC5nZXRIZWFkZXIoJ0FjY2VwdCcpKTtcblxuICAgIC8vIDEuIENoZWNrIFByb2R1Y2VzIChBY2NlcHRzIGhlYWRlcilcbiAgICBpZiAoIWFjY2VwdHNNZWRpYVR5cGVzIHx8IGFjY2VwdHNNZWRpYVR5cGVzLmxlbmd0aCA9PT0gMCB8fCBhY2NlcHRzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gT3V0cHV0IG1lZGlhIHR5cGUgaXMgbm90IHJlc3RyaWN0ZWQgYnkgY2xpZW50IG9yIGNsaWVudCBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzUHJvZHVjZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9kdWNlc01lZGlhVHlwZXMgJiYgcHJvZHVjZXNNZWRpYVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFByb2R1Y2VzTUlNRSA9IGFjY2VwdHNNZWRpYVR5cGVzLmZpbHRlcigoYWNjZXB0c01lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWNlc01lZGlhVHlwZXMuc29tZSgocHJvZHVjZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGFjY2VwdHNNZWRpYVR5cGUsIHByb2R1Y2VzTWVkaWFUeXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IG1hdGNoZWRQcm9kdWNlc01JTUUgJiYgbWF0Y2hlZFByb2R1Y2VzTUlNRS5sZW5ndGggPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2UgZG9lc24ndCBzcGVjaWZ5IHByb2R1Y2VzLCBzbyBpdCBtYXRjaGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyBhbnl0aGluZyBvciBpZiBwcm9kdWNlcyBpcyBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaXNQcm9kdWNlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBDb25zdW1lcyAoQ29udGVudC1UeXBlIGhlYWRlcilcbiAgICBsZXQgaXNDb25zdW1lTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlTWVkaWFUeXBlcyA9IG5vcm1hbGl6ZU1lZGlhVHlwZUhlYWRlclZhbHVlKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7XG5cbiAgICBpZiAoIWNvbnN1bWVzTWVkaWFUeXBlcyB8fCBjb25zdW1lc01lZGlhVHlwZXMubGVuZ3RoID09PSAwIHx8IGNvbnN1bWVzTWVkaWFUeXBlcy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgLy8gSW5wdXQgbWVkaWEgdHlwZSBpcyBub3QgcmVzdHJpY3RlZCBieSByZXNvdXJjZSBvciByZXNvdXJjZSBhY2NlcHRzIGFueXRoaW5nXG4gICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50VHlwZU1lZGlhVHlwZXMgJiYgY29uc3VtZXNNZWRpYVR5cGVzICYmIGNvbnN1bWVzTWVkaWFUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb25zdW1lc01JTUUgPSBjb250ZW50VHlwZU1lZGlhVHlwZXMuZmlsdGVyKChjb250ZW50VHlwZU1lZGlhVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lc01lZGlhVHlwZXMuc29tZSgoY29uc3VtZXNNZWRpYVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTWltZVR5cGVDb21wYXRpYmxlKGNvbnRlbnRUeXBlTWVkaWFUeXBlLCBjb25zdW1lc01lZGlhVHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ29uc3VtZU1hdGNoZWQgPSBtYXRjaGVkQ29uc3VtZXNNSU1FICYmIG1hdGNoZWRDb25zdW1lc01JTUUubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1Byb2R1Y2VNYXRjaGVkICYmIGlzQ29uc3VtZU1hdGNoZWQ7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxZQUFZLGdCQUFnQjtBQUNyQyxTQUFTLFdBQVcsZUFBZTtBQUNuQyxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGVBQWU7QUFJeEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxpQkFBaUIsZ0RBQWdEO0FBRW5GLE1BQU0sU0FBYyxRQUFRLFVBQVUsb0JBQW9CO0FBb0IxRCxT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
|